centerim-4.22.10/0000755000175000001440000000000011473011460010460 500000000000000centerim-4.22.10/INSTALL0000644000175000001440000001722711461606612011450 00000000000000Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. centerim-4.22.10/kkconsui/0000755000175000001440000000000011473011456012313 500000000000000centerim-4.22.10/kkconsui/Makefile.in0000644000175000001440000004756311473011437014316 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = kkconsui DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libkkconsui_a_AR = $(AR) $(ARFLAGS) libkkconsui_a_DEPENDENCIES = src/treeview.o src/colorschemer.o \ src/textinputline.o src/fileselector.o src/textwindow.o \ src/texteditor.o src/dialogbox.o src/screenarea.o \ src/textbrowser.o src/abstractui.o src/horizontalbar.o \ src/linkedlist.o src/cmenus.o src/conscommon.o am_libkkconsui_a_OBJECTS = libkkconsui_a_OBJECTS = $(am_libkkconsui_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libkkconsui_a_SOURCES) DIST_SOURCES = $(libkkconsui_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/kkconsui/include -I$(top_srcdir)/kkstrtext noinst_LIBRARIES = libkkconsui.a SUBDIRS = include src libkkconsui_a_SOURCES = libkkconsui_a_LIBADD = src/treeview.o src/colorschemer.o src/textinputline.o src/fileselector.o src/textwindow.o src/texteditor.o src/dialogbox.o src/screenarea.o src/textbrowser.o src/abstractui.o src/horizontalbar.o src/linkedlist.o src/cmenus.o src/conscommon.o AUTOMAKE_OPTIONS = foreign all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kkconsui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign kkconsui/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libkkconsui.a: $(libkkconsui_a_OBJECTS) $(libkkconsui_a_DEPENDENCIES) -rm -f libkkconsui.a $(libkkconsui_a_AR) libkkconsui.a $(libkkconsui_a_OBJECTS) $(libkkconsui_a_LIBADD) $(RANLIB) libkkconsui.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/kkconsui/include/0000755000175000001440000000000011473011456013736 500000000000000centerim-4.22.10/kkconsui/include/textinputline.h0000644000175000001440000000205711461606612016750 00000000000000#ifndef __TEXTINPUTLINE_H__ #define __TEXTINPUTLINE_H__ #include "fileselector.h" __KTOOL_BEGIN_NAMESPACE #define TEXTINPUT_HIST_LIMIT 100 class textinputline: public abstractuicontrol { public: int (*otherkeys)(textinputline &caller, int k); void (*idle)(textinputline &caller); private: vector history; int length, position, beginpos, lastkey; int color, histcolor, histcurcolor; string value; char passwordchar; fileselector *selector; bool firstiter; bool keymove(int key); void redraw(); void exechistory(); public: textinputline(); ~textinputline(); void historyadd(const string &buf); void setvalue(const string &buf); string getvalue() const; void setcoords(int x, int y, int len); void setcolor(int acolor, int ahistcolor = 0, int ahistcurcolor = 0); void setpasswordchar(char npc); void connectselector(fileselector &fsel); void removeselector(); int getlastkey() const; void exec(); void close(); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::textinputline; #endif #endif centerim-4.22.10/kkconsui/include/conscommon.h0000644000175000001440000000603511473007750016210 00000000000000#ifndef __KONST_UI_FUNC_H_ #define __KONST_UI_FUNC_H_ #include "config.h" #include "kkstrtext.h" #include "conf.h" #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_NCURSESW) && defined(HAVE_NCURSESW_H) #include #elif defined(HAVE_NCURSESW) && defined(HAVE_NCURSES_H) #include #elif defined(HAVE_NCURSESW) /* In order to get wide characters support we must define _XOPEN_SOURCE_EXTENDED * when using ncurses.h */ #define _XOPEN_SOURCE_EXTENDED #include #else /* No wide characters support */ #include #endif #ifdef __sun__ #include #include #endif #ifdef __CYGWIN__ #include #include #endif #undef box #undef clear #undef erase #undef move #undef refresh /* Fucking ncurses stuff */ #define boldcolor(c) COLOR_PAIR(c)|A_BOLD #define normalcolor(c) COLOR_PAIR(c) #ifdef LOCALES_HACK #define KT_DISP_FILTER(c) ( (((unsigned char) c > ' ') && (c != '\177')) ? c : ' ' ) #else #define KT_DISP_FILTER(c) (!iscntrl((unsigned char) c) ? c : ' ') #endif #define VLINE kintf_graph ? ACS_VLINE : '|' #define HLINE kintf_graph ? ACS_HLINE : '-' #define ULCORNER kintf_graph ? ACS_ULCORNER : '+' #define URCORNER kintf_graph ? ACS_URCORNER : '+' #define LLCORNER kintf_graph ? ACS_LLCORNER : '+' #define LRCORNER kintf_graph ? ACS_LRCORNER : '+' #define LTEE kintf_graph ? ACS_LTEE : '|' #define RTEE kintf_graph ? ACS_RTEE : '|' #define TTEE kintf_graph ? ACS_TTEE : '+' #define BTEE kintf_graph ? ACS_BTEE : '+' #define KEY_TAB 9 #define KEY_ESC 27 #define KEY_EMACS_C_U 800 #define KEY_EMACS_C_K 801 #define KEY_EMACS_C_T 802 #define KEY_EMACS_M_D 803 #define KEY_EMACS_BEG_OF_BUFFER 804 #define KEY_EMACS_END_OF_BUFFER 805 #define KEY_EMACS_FORWARD_WORD 806 #define KEY_EMACS_BACKWARD_WORD 807 #ifndef CTRL #define CTRL(x) ((x) & 0x1F) #endif #ifndef ALT #define ALT(x) (0x200 | (unsigned int) x) #endif #define SHIFT_PRESSED 1 #define ALTR_PRESSED 2 #define ALTL_PRESSED 8 #define CONTROL_PRESSED 4 extern bool kintf_graph, kintf_refresh, use_fribidi; extern void (*kt_resize_event)(void); void printchar(char c); void printstring(const string &s); int string2key(const string &adef); string makebidi(const string &buf, int lpad = 0); int findcolor(const string &s); __KTOOL_BEGIN_C void kinterface(); void kendinterface(); int keypressed(bool wait = false); int emacsbind(int k); int getkey(); int getctrlkeys(); void kwriteatf(int x, int y, int c, const char *fmt, ...); void kwriteat(int x, int y, const char *msg, int c); void kgotoxy(int x, int y); void hidecursor(); void showcursor(); void setbeep(int freq, int duration); int kwherex(); int kwherey(); __KTOOL_END_C #endif centerim-4.22.10/kkconsui/include/linkedlist.h0000644000175000001440000000265111461606612016176 00000000000000#ifndef KONST_LIST_H #define KONST_LIST_H #include #include "conf.h" typedef int (listcompare)(void *ptr1, void *ptr2); typedef void (listfreeitem)(void *ptr1); typedef void *(listforeachfunc)(void *elem, void *arg); __KTOOL_BEGIN_NAMESPACE class linkedlist { private: struct flinkedlist { void *data; flinkedlist *next; }; flinkedlist *flist; int i; public: int count; listfreeitem *freeitem; // user defined function to free a list item linkedlist(); ~linkedlist(); void add(void *p); // adds new element to the list void insert(int n, void *p); // inserts an element to n-th position void sort(listcompare *compare); // sorts the list void remove(int n); // removes an element number n from the list void replace(int n, void *p); // replaces n-th element value with new data void empty(); // clears the list void* at(int n); // gets n-th element pointer from the list void* find(void *p, listcompare *compare); // returns a pointer to the element found equal to p // with compare function int findnum(void *p, listcompare *compare); // the same as previous function, except for it // returs a number, not pointer void *foreach(listforeachfunc *exec, void *arg); void* operator[] (int idx) { return at(idx); } }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::linkedlist; #endif #endif centerim-4.22.10/kkconsui/include/Makefile.in0000644000175000001440000003223611473011437015730 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = kkconsui/include DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_HEADERS = cmenus.h textbrowser.h treeview.h abstractui.h conscommon.h horizontalbar.h conf.h colorschemer.h textwindow.h screenarea.h textinputline.h linkedlist.h fileselector.h texteditor.h dialogbox.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kkconsui/include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu kkconsui/include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ctags distclean distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/kkconsui/include/textbrowser.h0000644000175000001440000000143711461606612016425 00000000000000#ifndef __KONST_UI_TEXT_H_ #define __KONST_UI_TEXT_H_ #include #include "conf.h" #include "conscommon.h" #include "abstractui.h" __KTOOL_BEGIN_NAMESPACE class textbrowser: public abstractuicontrol { protected: int ncolor, line, endline; vector lines; string buf; void draw(int line); public: int (*otherkeys)(textbrowser &caller, int k); void (*idle)(textbrowser &caller); textbrowser(int nx1, int ny1, int nx2, int ny2, int clr); textbrowser(int clr = 0); virtual ~textbrowser(); void setcolor(int clr); void setcoords(int nx1, int ny1, int nx2, int ny2); void redraw(); void move(int k); int open(); bool empty(); void setbuf(const string &p); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::textbrowser; #endif #endif centerim-4.22.10/kkconsui/include/horizontalbar.h0000644000175000001440000000134511461606612016711 00000000000000#ifndef __KONST_HORBAR_H_ #define __KONST_HORBAR_H_ #include #include "conf.h" #include "conscommon.h" #include "abstractui.h" #include "kkstrtext.h" __KTOOL_BEGIN_NAMESPACE enum bamode { baleft }; class horizontalbar : public abstractuicontrol { protected: public: bool done; int item, ncolor, scolor, previtem; vector items; horizontalbar(int x, int y, int nc, int sc, ...); horizontalbar(int nc, int sc, ...); virtual ~horizontalbar(); void movebar(int k); virtual void redraw(); void update(); void align(bamode m); void setcoords(int x, int y); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::bamode; using ktool::baleft; using ktool::horizontalbar; #endif #endif centerim-4.22.10/kkconsui/include/Makefile.am0000644000175000001440000000032211461606612015710 00000000000000noinst_HEADERS = cmenus.h textbrowser.h treeview.h abstractui.h conscommon.h horizontalbar.h conf.h colorschemer.h textwindow.h screenarea.h textinputline.h linkedlist.h fileselector.h texteditor.h dialogbox.h centerim-4.22.10/kkconsui/include/textwindow.h0000644000175000001440000000227511461606612016252 00000000000000#ifndef __KONST_UI_WINDOW_H_ #define __KONST_UI_WINDOW_H_ #include "conf.h" #include "conscommon.h" #include "abstractui.h" enum textwindowtype { TW_CENTERED = 2, TW_NOBORDER = 4, TW_SPACEBORDER = 8 }; __KTOOL_BEGIN_NAMESPACE class textwindow: public abstractuicontrol { private: string title; int wc, tc, options; public: textwindow(); textwindow(const textwindow &aw); textwindow(int xx1, int yy1, int xx2, int yy2, int wcolor, int noptions = 0, int tcolor = 0, const char *tfmt = 0, ...); virtual ~textwindow(); void write(int x, int y, int c, const string &text); void write(int x, int y, const string &text); void writef(int x, int y, int c, const char *fmt, ...); void writef(int x, int y, const char *fmt, ...); void separatey(int y); void separatex(int x); void setoptions(int aoptions); void setcolor(int awc); void setcoords(int x1, int y1, int x2, int y2); void set_titlef(int color, const char *fmt, ...); void set_title(int color, const string &atitle); void gotoxy(int x, int y); void open(); void redraw(); void close(); bool isbordered(); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::textwindow; #endif #endif centerim-4.22.10/kkconsui/include/conf.h0000644000175000001440000000146311461606612014761 00000000000000#ifndef __KONST_CONF_H__ #define __KONST_CONF_H__ #ifdef HAVE_CONFIG_H #include #endif #if defined(__sgi) && !defined(__GNUC__) && (_COMPILER_VERSION >= 721) && defined(_NAMESPACES) #define __KTOOL_USE_NAMESPACES #endif #if defined(__COMO__) #define __KTOOL_USE_NAMESPACES #endif #ifdef __GNUC__ #ifdef HAVE__G_CONFIG_H #include <_G_config.h> #endif #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 9) #else #define __KTOOL_USE_NAMESPACES #endif #endif #ifdef __KTOOL_USE_NAMESPACES #define __KTOOL_BEGIN_NAMESPACE namespace ktool { #define __KTOOL_END_NAMESPACE } using namespace std; #else #define __KTOOL_BEGIN_NAMESPACE #define __KTOOL_END_NAMESPACE #endif #define __KTOOL_BEGIN_C extern "C" { #define __KTOOL_END_C } #endif centerim-4.22.10/kkconsui/include/dialogbox.h0000644000175000001440000000422711461606612016005 00000000000000#ifndef __KONST_UI_DLG_H__ #define __KONST_UI_DLG_H__ #include #include #include #include "conf.h" #include "textwindow.h" #include "cmenus.h" #include "treeview.h" #include "horizontalbar.h" #include "textbrowser.h" __KTOOL_BEGIN_NAMESPACE class dialogbox { protected: static dialogbox *it; class keybarassociation { public: int key, baritem; keybarassociation(int nkey, int nbarit); bool operator == (const int akey); bool operator != (const int akey); }; bool freemenu, freetree, freewindow, freebar, freebrowser, first; verticalmenu *menu; treeview *tree; textwindow *window; horizontalbar *bar; textbrowser *browser; list kba; static void menuidle(verticalmenu &caller); static void browseridle(textbrowser &caller); static int menukeys(verticalmenu &caller, int k); static int browserkeys(textbrowser &caller, int k); public: int (*otherkeys)(dialogbox &caller, int k); // function called on pressing of non-standard menu keys // should return a number of selected menu item or -1 to // continue browsing void (*idle)(dialogbox &caller); dialogbox(); ~dialogbox(); void setwindow(textwindow *neww, bool fw = true); void setbar(horizontalbar *newb, bool fb = true); void setmenu(verticalmenu *newm, bool fm = true); void settree(treeview *newt, bool ft = true); void setbrowser(textbrowser *newbr, bool fbr = true); verticalmenu *getmenu(); treeview *gettree(); textwindow *getwindow(); horizontalbar *getbar(); textbrowser *getbrowser(); void redraw(); bool open(int &menuitem, int &baritem, void **ref = 0); bool open(int &menuitem); bool open(); void close(); void clearkeys(); void addkey(int key, int baritem); void addautokeys(); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::dialogbox; #endif #endif centerim-4.22.10/kkconsui/include/texteditor.h0000644000175000001440000001340111461606612016222 00000000000000#ifndef __KOST_TEXTEDITOR_H #define __KOST_TEXTEDITOR_H #include #include #include #include #include #include #include #include #include "linkedlist.h" #include "conf.h" #include "kkstrtext.h" #include "conscommon.h" #include "abstractui.h" #define TEXTEDITOR_NOFILES -2 #define TEXTEDITOR_ABORTED -1 #define TEXTEDITOR_OK 0 __KTOOL_BEGIN_NAMESPACE typedef enum { h_alone, h_eol, h_symbol, h_block, h_quotes, h_comment } hl_kind; // kinds of text to highlight typedef enum { udelchar, udelblock, uinschar, uinsblock } tundoaction; // text highlight entry struct hlight { hl_kind kind; int color; string text; bool operator == (const hl_kind &kind) const; bool operator != (const hl_kind &kind) const; bool operator < (const hlight &ah) const; }; struct highline { int line, color; }; struct textblock { int x1, y1, x2, y2, color; }; struct editfile { char *id; linkedlist *lines, *blocks, *highlines, *undo; textblock *markblock; int sx, sy, x, y, ncolorscheme; bool modified, markmode, markreverse, showmarked; }; struct colorscheme { vector hl; vector difcolors; string synt_quote, synt_qescape; int ncolor, qcolor, blockcolor; bool bold; }; struct undorecord { tundoaction action; bool prevconnected; int x, y; string data; }; class texteditor: public abstractuicontrol { protected: linkedlist *files; vector colorschemes; int outx, abscol; int fn /* file number */, fcount /* files count */; bool undolog, show, prevshift; editfile *curfile; colorscheme colors; static void textblockfree(void *p); static void editfilefree(void *p); static void undorecordfree(void *p); static void highlinefree(void *p); static int findint(void *p1, void *p2); static int findhl(void *p1, void *p2); static int findhighline(void *p1, void *p2); static int sorthl(void *p1, void *p2); bool fix_x(bool tab); void sethlcolor(int n); void draw(int fromline); void draw_print(char *buf, int bcolor, int distance); int addwindow(char *id); void scancomments(bool visible); void modification(tundoaction action, const string &data, bool connected = false, int curx = -1, int cury = -1); bool endofline(); const char currentchar(); int count_clrcodes(char *cp, int pos); int hl_comment(char *cp, char *txt, int color); int hl_comment(char *cp, int st, int pend, int color); void showline(int ln, int startx, int distance, int extrax = 0); void marktext(); void edmove(int k, int options = 2); void eddel(bool usetabs = true); void edenter(bool countspaces = true); void edbackspace(); void eddelline(); void eddelbegofline(); void eddelendofline(); void edtransposechar(); void eddelword(); void eddelwordemacs(); void inschar(int k); void shiftmarkedblock(int delta); void prepend(char *text, int ln); // prepend text before specified line void wrapline(int ln, int &px, int &py); // wrap specified line void mergeline(int ln, bool force, int &px, int &py); // (try to) merge specified line with the next one public: bool active, wrap, insertmode, modified, smarttab; int (*otherkeys)(texteditor &caller, int k); void (*idle)(texteditor &caller); texteditor(); virtual ~texteditor(); int load(const string buf, const string id); int load(FILE *f, const string id); int load(ifstream &f, const string id); // loads a file from char* or FILE opening // a new editor window char *save(const char *linebreak); int save(FILE *f, const char *linebreak); int save(ofstream &f, const string linebreak); // saves a file to char* or FILE void close(); // closes current file int getfcount(); // returns the amount of windows opened int getfnum(); // returns current editor window number char *getfid(); char *getfid(int fnn); // returns id of a file void setfid(char *id); void setfid(int fnn, char *id); // sets an id of file void setfnum(int n); // sets active file void setcolorscheme(int nscheme); void setcolorscheme(int fn, int nscheme); // set color scheme for current file void startmark(); void endmark(); void switchmark(); bool ismark(); void clearmark(); void copymark(FILE *f); void copymark(char *p, int maxlen); void insert(FILE *f); void insert(const string buf); void delmark(); void undo(); void addblock(int x1, int y1, int x2, int y2, int color); // adds a block void setcoords(int nx1, int ny1, int nx2, int ny2); int addscheme(int nc, int bc, int fbold, ...); // nc = normal text color // bc = block color // fbold = use bold colors // ... = numbers of pairs in different attribute, // the last one MUST BE 0 ! void addhighlight(int nscheme, string text, int color, hl_kind kind); void addcolordif(int nscheme, int pairno); int open(); virtual void redraw(); void draw(); void updatecursor(); bool find(const char *needle, const char *options, int *col, int *line); void setpos(int col, int line); void getpos(int *col, int *line); char *getline(int ln); void putline(int ln, const char *newline); void highlight(int line, int color); void highlight(int fn, int line, int color); void unlight(int line); void unlight(int fn, int line); void clearlight(); void clearlight(int fn); // lines highlighting void shiftident(int x1, int y1, int x2, int y2, int delta); void shiftident(int delta); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::editfile; using ktool::texteditor; using ktool::hl_kind; using ktool::h_alone; using ktool::h_eol; using ktool::h_symbol; using ktool::h_block; using ktool::h_quotes; using ktool::h_comment; #endif #endif centerim-4.22.10/kkconsui/include/cmenus.h0000644000175000001440000000657311461606612015335 00000000000000#ifndef __KONST_UI_MENU_H_ #define __KONST_UI_MENU_H_ #include "conf.h" #include "conscommon.h" #include "textwindow.h" #include #include __KTOOL_BEGIN_NAMESPACE #define ITEM_NORM 0 #define ITEM_SEP 1 #define ITEM_LINE 2 class verticalmenu: public abstractuicontrol { private: struct verticalmenuitem { string text; int color, kind; void *ref; }; vector items; textwindow window; int ncolor, scolor; int curelem, firstdisp, lastkey; void initmembers(); bool shownelem(int n, int selected); void showall(); void checkclear(); void intredraw(); public: bool clearonfocuslost; bool cycled; bool exitonedges; int (*otherkeys)(verticalmenu &caller, int k); // function called on pressing of non-standard menu keys // should return a number of selected menu item or -1 to // continue browsing void (*idle)(verticalmenu &caller); verticalmenu(int px1, int py1, int px2, int py2, int pncolor, int pscolor); verticalmenu(int pncolor = 0, int pscolor = 0); virtual ~verticalmenu(); // following special characters are valid in the items text: // \001 == switch the color attribute // \002 == HLINE [ - ] // \003 == VLINE [ | ] // \004 == RTEE [ -| ] // \005 == LTEE [ |- ] // \006 == ULCORNER [ |^ ] // \007 == LLCORNER [ |_ ] // \008 == LRCORNER [ _| ] // \009 == URCORNER [ ^| ] void additemf(const char *fmt, ...); void additem(const string &text); void additem(int color, void *ref, const string &text); void additemf(int color, void *ref, const char *fmt, ...); void additem(int color, int ref, const string &text); void additemf(int color, int ref, const char *fmt, ...); void addline(); void addline(int color, const char *fmt = 0, ...); void clear(); void redraw(); bool empty(); int getcount(); int getlastkey(); void *getref(int n); int getpos(); void getpos(int &cur, int &first); void setpos(int cur, int first = -1); void setitemcolor(int pos, int color); void setwindow(textwindow nwindow); void remove(int pos); int open(); void scale(); void close(); void setcoords(int nx1, int ny1, int nx2, int ny2); void setcolor(int pncolor, int pscolor); friend class horizontalmenu; }; struct horizontalmenuitem { string text; int color; verticalmenu menu; horizontalmenuitem(); horizontalmenuitem(const horizontalmenuitem &a); ~horizontalmenuitem(); }; class horizontalmenu: public abstractuicontrol { protected: vector menus; int ncolor, scolor, fcolor, coordy, coordx, selected; static int menu_otherkeys(verticalmenu &ref, int k); void draw(); void moveelem(int old); void saveline(); void restoreline(); int getx(int n); int menulen(int n); public: bool (*otherkeys)(horizontalmenu &caller, int k); void (*idle)(horizontalmenu &caller); horizontalmenu(int x, int y, int normcolor, int selcolor, int framecolor); horizontalmenu(); virtual ~horizontalmenu(); void additemf(int color, const char *fmt, ...); void additemf(const char *fmt, ...); void additem(int color, const string &text); void additem(const string &text); verticalmenu *pulldown(int n); virtual void redraw(); bool open(int *hor, int *pulld); void close(); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::verticalmenu; using ktool::horizontalmenu; #endif #endif centerim-4.22.10/kkconsui/include/colorschemer.h0000644000175000001440000000314211461606612016515 00000000000000#ifndef __COLORSCHEMER_H__ #define __COLORSCHEMER_H__ #include #include #include #include "conscommon.h" struct colordef { string name, def; int code; }; void parsecolordef(const string sdef, int pair, colordef &d); template class colorschemer { private: map colors; public: void clear() { colors.clear(); } void push(T elem, const string &def) { parsecolordef(def, (int) elem, colors[elem]); } void load(const string &fname) { ifstream f(fname.c_str()); if(f.is_open()) { load(f); f.close(); } } void save(const string &fname) const { ofstream f(fname.c_str()); if(f.is_open()) { save(f); f.close(); } } void save(ofstream &f) const { typename map::const_iterator ic; for(ic = colors.begin(); ic != colors.end(); ic++) { f << ic->second.name << "\t" << ic->second.def << endl; } } void load(ifstream &f) { int pos; string buf, p; typename map::iterator ic; while(!f.eof()) { getstring(f, buf); if((pos = buf.find_first_of(" \t")) != -1) { p = buf.substr(0, pos); for(ic = colors.begin(); ic != colors.end(); ic++) { if(ic->second.name == p) { push(ic->first, buf); break; } } } } } int operator[] (T elem) const { typename map::const_iterator ic = colors.find(elem); return (ic != colors.end()) ? ic->second.code : normalcolor(0); } friend std::ostream& operator<< (std::ostream &o, const colorschemer &s) { s.save(o); return o; } }; #endif centerim-4.22.10/kkconsui/include/abstractui.h0000644000175000001440000000121411461606612016167 00000000000000#ifndef __KONST_UI_SKEL_H_ #define __KONST_UI_SKEL_H_ #include "conf.h" #include "conscommon.h" #include "screenarea.h" __KTOOL_BEGIN_NAMESPACE class abstractuicontrol { protected: screenarea screenbuffer; bool fisopen, finished, aborted; public: bool emacs; int x1, x2, y1, y2; abstractuicontrol(); abstractuicontrol(const abstractuicontrol &a); virtual ~abstractuicontrol(); virtual bool empty() const; bool getaborted() const; bool isopen() const; virtual void redraw(); virtual void close(); virtual void abort(); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::abstractuicontrol; #endif #endif centerim-4.22.10/kkconsui/include/fileselector.h0000644000175000001440000000311011461606612016503 00000000000000#ifndef __FILESELECTOR_H__ #define __FILESELECTOR_H__ #include "cmenus.h" #include #include #define FSEL_MULTI 2 #define FSEL_DIRSELECT 4 #define FSEL_CHROOT 8 __KTOOL_BEGIN_NAMESPACE class fileselector: public abstractuicontrol { public: int (*otherkeys)(fileselector &caller, int k); void (*idle)(fileselector &caller); private: struct dhistitem { string dirname; int pos, fpos; }; class item { private: short compare(const item &aitem) const; public: string fname; int mode; item(const string &afname, int amode) { fname = afname, mode = amode; } string getprefix() const; bool operator < (const item &aitem) const; bool operator > (const item &aitem) const; bool operator == (const string &afname) const; bool operator != (const string &afname) const; }; int options; int cnormal, cselected, cfile, ccurrent; vector dhist; vector selected; list items; string spoint, dcurrent, setdcurrent; bool finish; verticalmenu m; textwindow w; static int menukeys(verticalmenu &m, int k); static void menuidle(verticalmenu &m); void generatemenu(); public: fileselector(); virtual ~fileselector(); void setoptions(int noptions); void setstartpoint(const string &aspoint); void setwindow(textwindow awindow); void setcolor(int acnormal, int acselected, int accurrent, int acfile); vector getselected(); int getlastkey(); void exec(); void close(); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::fileselector; #endif #endif centerim-4.22.10/kkconsui/include/treeview.h0000644000175000001440000000425411461606612015667 00000000000000#ifndef __KONST_UI_TREE_H_ #define __KONST_UI_TREE_H_ #include #include #include "conf.h" #include "conscommon.h" #include "abstractui.h" #include "cmenus.h" __KTOOL_BEGIN_NAMESPACE class treeview : public abstractuicontrol { private: struct treeviewnode { int id, parentid, color; bool isnode, isopen; string text; void *ref; bool operator == (const int aid); bool operator == (const void *aref); bool operator != (const int aid); bool operator != (const void *aref); }; int bgcolor, selectcolor, nodecolor, leafcolor, idseq; vector items; vector nestlevel; vector refdeps; bool islast(int id); void drawnest(int y); void genmenu(int parent); void init(); public: int curelem; bool collapsable; verticalmenu menu; treeview(int nx1, int ny1, int nx2, int ny2, int nbgcolor, int nselectcolor, int nnodecolor, int nleafcolor); treeview(int nbgcolor, int nselectcolor, int nnodecolor, int nleafcolor); treeview(); virtual ~treeview(); bool empty(); int addnode(int parent, int color, void *ref, const string &text); int addnode(int parent, int color, int ref, const string &text); int addnode(const string &text); int addnodef(int parent, int color, void *ref, const char *fmt, ...); int addnodef(int parent, int color, int ref, const char *fmt, ...); int addnodef(const char *fmt, ...); int addleaf(int parent, int color, void *ref, const string &text); int addleaf(int parent, int color, int ref, const string &text); int addleaf(const string &text); int addleaff(int parent, int color, void *ref, const char *fmt, ...); int addleaff(int parent, int color, int ref, const char *fmt, ...); int addleaff(const char *fmt, ...); void opennode(int mpos); void closenode(int mpos); int getcount(); int getid(int mpos); int getid(void *ref); bool isnode(int id); bool isnodeopen(int id); int getparent(int id); void *getref(int id); void clear(); void redraw(); void *open(int *n); void setcur(int id); void setcoords(int nx1, int ny1, int nx2, int ny2); }; __KTOOL_END_NAMESPACE #ifdef __KTOOL_USE_NAMESPACES using ktool::treeview; #endif #endif centerim-4.22.10/kkconsui/include/screenarea.h0000644000175000001440000000102211461606612016133 00000000000000#ifndef __KKCONSUI_SCREENAREA_H__ #define __KKCONSUI_SCREENAREA_H__ #include #include "conscommon.h" class screenarea { protected: vector buffer; #ifdef HAVE_NCURSESW vector buffer2; #endif int x1, y1, x2, y2; void freebuffer(); public: screenarea(); screenarea(int fx1, int fy1, int fx2, int fy2); virtual ~screenarea(); void save(); void save(int fx1, int fy1, int fx2, int fy2); void restore(); void restore(int fx1, int fy1, int fx2, int fy2); bool empty(); }; #endif centerim-4.22.10/kkconsui/Makefile.am0000644000175000001440000000067611461606612014301 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/kkconsui/include -I$(top_srcdir)/kkstrtext noinst_LIBRARIES = libkkconsui.a SUBDIRS = include src libkkconsui_a_SOURCES = libkkconsui_a_LIBADD = src/treeview.o src/colorschemer.o src/textinputline.o src/fileselector.o src/textwindow.o src/texteditor.o src/dialogbox.o src/screenarea.o src/textbrowser.o src/abstractui.o src/horizontalbar.o src/linkedlist.o src/cmenus.o src/conscommon.o AUTOMAKE_OPTIONS = foreign centerim-4.22.10/kkconsui/src/0000755000175000001440000000000011473011456013102 500000000000000centerim-4.22.10/kkconsui/src/horizontalbar.cc0000644000175000001440000000535511461606612016220 00000000000000/* * * kkconsui horizontalbar class * $Id: horizontalbar.cc,v 1.3 2002/03/30 17:47:54 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "horizontalbar.h" horizontalbar::horizontalbar(int x, int y, int nc, int sc, ...): done(false), item(0), previtem(-1), scolor(sc), ncolor(nc) { char *p; va_list ap; setcoords(x, y); va_start(ap, sc); while(p = va_arg(ap, char *)) items.push_back((string) p); va_end(ap); } horizontalbar::horizontalbar(int nc, int sc, ...): done(false), item(0), previtem(-1), scolor(sc), ncolor(nc) { char *p; va_list ap; va_start(ap, sc); while(p = va_arg(ap, char *)) items.push_back((string) p); va_end(ap); } horizontalbar::~horizontalbar() { } void horizontalbar::movebar(int k) { previtem = item; done = false; switch(k) { case KEY_RIGHT: case KEY_UP: if(++item >= items.size()) item = 0; break; case KEY_LEFT: case KEY_DOWN: if(--item < 0) item = items.size()-1; break; case '\r': done = true; break; case 27: done = true; item = -1; break; } switch(k) { case KEY_RIGHT: case KEY_UP: case KEY_LEFT: case KEY_DOWN: update(); break; } } void horizontalbar::redraw() { int cx = x1, n; vector::iterator i; for(i = items.begin(), n = 0; i != items.end(); n++, i++) { kwriteatf(cx, y1, item == n ? scolor : ncolor, " %s ", i->c_str()); cx += i->size() + 3; } } void horizontalbar::update() { int cx = x1, n; vector::iterator i; for(i = items.begin(), n = 0; i != items.end(); i++, n++) { if((n == previtem) || (n == item)) kwriteatf(cx, y1, item == n ? scolor : ncolor, " %s ", i->c_str()); cx += i->size() + 3; } } void horizontalbar::align(bamode m) { vector::iterator i; switch(m) { case baleft: for(i = items.begin(); i != items.end(); i++) { x1 -= i->size()+2; } x1 -= items.size()-1; break; } } void horizontalbar::setcoords(int x, int y) { x1 = x, y1 = y; } centerim-4.22.10/kkconsui/src/textinputline.cc0000644000175000001440000001066311461606612016254 00000000000000#include "textinputline.h" textinputline::textinputline() { beginpos = length = position = 0; idle = 0; otherkeys = 0; passwordchar = 0; selector = 0; } textinputline::~textinputline() { } void textinputline::setcoords(int x, int y, int len) { x1 = x; y1 = y2 = y; length = len; x2 = x1+length; } bool textinputline::keymove(int key) { bool r = true; switch(key) { case KEY_LEFT: case CTRL('b'): if(--position < 0) position = 0; break; case KEY_RIGHT: case CTRL('f'): if(++position > value.size()) position = value.size(); break; case KEY_HOME: case CTRL('a'): position = 0; break; case KEY_END: case CTRL('e'): position = value.size(); break; default: r = false; } return r; } void textinputline::exechistory() { vector::iterator i; static verticalmenu m; int wy1, wx2, n; if(!history.empty()) { m.clear(); m.setcolor(histcolor, histcurcolor); for(i = history.begin(), wx2 = 0; i != history.end(); i++) { m.additem(" " + *i); if(wx2 < i->size()) wx2 = i->size(); } wy1 = y1 < LINES/2 ? y1 : y1-history.size()-2; if(wy1 < 1) wy1 = 1; wx2 += x1+3; if(wx2 > COLS-1) wx2 = COLS-1; m.setwindow(textwindow(x1, wy1, wx2, 0, histcolor)); m.scale(); n = m.open(); m.close(); if(n) { value = history[n-1]; position = 0; } } } void textinputline::redraw() { int displen; if(position > value.size()) { position = value.size(); } if(position < beginpos) { beginpos = position; } while(position > beginpos+length-1) { beginpos++; } displen = value.length()-beginpos; if(displen > length) displen = length; attrset(color); kgotoxy(x1, y1); printstring((passwordchar ? string(displen, passwordchar) : value.substr(beginpos, displen)) + string(length-displen, ' ')); kgotoxy(x1+position-beginpos, y1); refresh(); } void textinputline::exec() { bool fin, go; vector sel; vector::iterator isel; position = 0; screenbuffer.save(x1, y1, x2, y2); firstiter = true; for(fin = false; !fin; ) { redraw(); go = idle ? keypressed() : true; if(go) { lastkey = getkey(); if(!keymove(lastkey)) switch(lastkey) { case '\r': if(!passwordchar) historyadd(value); fin = true; break; case KEY_DC: if(firstiter) { value = ""; } else { value.erase(position, 1); } break; case CTRL('k'): value = ""; break; case CTRL('u'): value.erase(0, position); position = 0; break; case CTRL('t'): if(selector) { selector->exec(); selector->close(); if(strchr("\r ", selector->getlastkey())) { sel = selector->getselected(); if(!sel.empty()) { position = 0; if(sel.size() == 1) { value = sel[0]; } else { value = ""; for(isel = sel.begin(); isel != sel.end(); isel++) { if(!value.empty()) value += " "; value += "\"" + *isel + "\""; } } } } } break; case ALT('h'): if(!passwordchar) exechistory(); break; case KEY_BACKSPACE: case CTRL('h'): case 127: if(position) { value.erase(--position, 1); } break; case KEY_ESC: fin = true; break; default: if((lastkey > 31) && (lastkey < 256)) { if(firstiter) { value = string(1, (char) lastkey); position = 1; } else { value.insert(position++, string(1, (char) lastkey)); } } } firstiter = false; } else { if(idle) { (*idle)(*this); } } } } void textinputline::close() { } void textinputline::historyadd(const string &buf) { while(history.size() > TEXTINPUT_HIST_LIMIT) history.erase(history.begin()); history.insert(history.begin(), buf); } void textinputline::setvalue(const string &buf) { value = buf; } string textinputline::getvalue() const { return value; } void textinputline::setpasswordchar(char npc) { passwordchar = npc; } void textinputline::setcolor(int acolor, int ahistcolor, int ahistcurcolor) { color = acolor; if(!(histcolor = ahistcolor)) histcolor = color; if(!(histcurcolor = ahistcurcolor)) histcurcolor = 0; } void textinputline::connectselector(fileselector &fsel) { selector = &fsel; } void textinputline::removeselector() { selector = 0; } int textinputline::getlastkey() const { return lastkey; } centerim-4.22.10/kkconsui/src/treeview.cc0000644000175000001440000001741711461606612015176 00000000000000/* * * kkconsui treeview class * $Id: treeview.cc,v 1.10 2003/10/19 23:25:05 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "treeview.h" treeview::treeview(int nx1, int ny1, int nx2, int ny2, int nbgcolor, int nselectcolor, int nnodecolor, int nleafcolor) { bgcolor = nbgcolor; selectcolor = nselectcolor; nodecolor = nnodecolor; leafcolor = nleafcolor; init(); setcoords(nx1, ny1, nx2, ny2); } treeview::treeview(int nbgcolor, int nselectcolor, int nnodecolor, int nleafcolor) { bgcolor = nbgcolor; selectcolor = nselectcolor; nodecolor = nnodecolor; leafcolor = nleafcolor; init(); } treeview::treeview() { init(); } treeview::~treeview() { } void treeview::init() { curelem = 0; idseq = 0; collapsable = false; menu = verticalmenu(x1, y1, x2, y2, bgcolor, selectcolor); clear(); } int treeview::addnodef(int parent, int color, void *ref, const char *fmt, ...) { string buf; VGETSTRING(buf, fmt); return addnode(parent, color, ref, buf); } int treeview::addnodef(const char *fmt, ...) { string buf; VGETSTRING(buf, fmt); return addnode(buf); } int treeview::addleaff(int parent, int color, void *ref, const char *fmt, ...) { string buf; VGETSTRING(buf, fmt); return addleaf(parent, color, ref, buf); } int treeview::addleaff(const char *fmt, ...) { string buf; VGETSTRING(buf, fmt); return addleaf(buf); } int treeview::addnodef(int parent, int color, int ref, const char *fmt, ...) { string buf; VGETSTRING(buf, fmt); return addnode(parent, color, (void *) ref, buf); } int treeview::addleaff(int parent, int color, int ref, const char *fmt, ...) { string buf; VGETSTRING(buf, fmt); return addleaf(parent, color, (void *) ref, buf); } int treeview::addnode(const string &text) { return addnode(0, 0, 0, text); } int treeview::addnode(int parent, int color, void *ref, const string &text) { treeviewnode node; node.id = idseq++; node.text = text; node.ref = ref; node.parentid = parent; node.isnode = true; node.isopen = false; node.color = color ? color : nodecolor; items.push_back(node); return node.id; } int treeview::addleaf(const string &text) { return addleaf(0, 0, 0, text); } int treeview::addleaf(int parent, int color, void *ref, const string &text) { treeviewnode node; node.id = idseq++; node.text = text; node.ref = ref; node.parentid = parent; node.isnode = false; node.color = color ? color : leafcolor; items.push_back(node); return node.id; } int treeview::addnode(int parent, int color, int ref, const string &text) { return addnode(parent, color, (void *) ref, text); } int treeview::addleaf(int parent, int color, int ref, const string &text) { return addleaf(parent, color, (void *) ref, text); } int treeview::getid(void *ref) { int id = -1; vector::iterator i; if((i = find(items.begin(), items.end(), (void *) ref)) != items.end()) id = i->id; return id; } int treeview::getid(int mpos) { if((mpos >= 0) && (mpos < refdeps.size())) { return refdeps[mpos].id; } else { return -1; } } void treeview::opennode(int id) { vector::iterator i; i = find(items.begin(), items.end(), id); if(i != items.end()) { if(i->isnode && collapsable) i->isopen = true; genmenu(0); } } void treeview::closenode(int id) { vector::iterator i; i = find(items.begin(), items.end(), id); if(i != items.end()) { if(i->isnode && collapsable) i->isopen = false; genmenu(0); } } void treeview::clear() { treeviewnode node; items.clear(); idseq = 1; node.id = 0; node.ref = 0; node.parentid = -1; node.isnode = true; items.push_back(node); } bool treeview::islast(int id) { int lastid, nid; vector::iterator i; if((i = find(items.begin(), items.end(), id)) != items.end()) if((i = find(items.begin(), items.end(), i->parentid)) != items.end()) { nid = i->id; for(i = items.begin(); i != items.end(); i++) if(i->parentid == nid) lastid = i->id; } return lastid == id; } void treeview::genmenu(int parent) { int nproc = 0; vector::iterator i, k; if(!parent) { nestlevel.clear(); refdeps.clear(); menu.clear(); } else { if((i = find(items.begin(), items.end(), parent)) != items.end()) nestlevel.push_back(*i); } for(i = items.begin(); i != items.end(); i++) { if(i->parentid == parent) { string buf; for(k = nestlevel.begin(); k != nestlevel.end(); k++) buf += !islast(k->id) ? "\003 " : " "; buf += islast(i->id) ? "\007\002" : "\005\002"; buf.insert(0, "\001"); buf += "\001"; if(i->isnode && collapsable) { buf += (string) "[" + (i->isopen ? '-' : '+') + "]"; } buf += i->text + "\001"; nproc++; menu.additem(i->color, 0, buf); refdeps.push_back(*i); if(i->isnode) if(!collapsable || (collapsable && i->isopen)) genmenu(i->id); } } if(parent != -1) if(!nestlevel.empty()) nestlevel.pop_back(); } void treeview::redraw() { genmenu(0); menu.redraw(); } void *treeview::open(int *n) { void *p = 0; int k; screenbuffer.save(x1, y1, x2, y2); redraw(); if(k = menu.open()) { p = getref(getid(k-1)); } if(n) *n = k; return p; } bool treeview::isnodeopen(int id) { vector::iterator i; if((i = find(items.begin(), items.end(), id)) != items.end()) { return i->isopen; } else { return true; } } bool treeview::isnode(int id) { vector::iterator i; if((i = find(items.begin(), items.end(), id)) != items.end()) { return i->isnode; } else { return false; } } int treeview::getparent(int id) { int ret = -1; vector::iterator i; if((i = find(items.begin(), items.end(), id)) != items.end()) if((i = find(items.begin(), items.end(), i->parentid)) != items.end()) { ret = i->id; } return ret; } void *treeview::getref(int id) { vector::iterator i; if((i = find(items.begin(), items.end(), id)) != items.end()) { return i->ref; } else { return 0; } } void treeview::setcur(int id) { vector::iterator i; if(!menu.getcount()) genmenu(0); if((i = find(refdeps.begin(), refdeps.end(), id)) != refdeps.end()) { menu.setpos(i-refdeps.begin()); } } int treeview::getcount() { return items.size(); } bool treeview::empty() { return items.size() < 2; } void treeview::setcoords(int nx1, int ny1, int nx2, int ny2) { menu.setcoords(x1 = nx1, y1 = ny1, x2 = nx2, y2 = ny2); } // ---------------------------------------------------------------------------- bool treeview::treeviewnode::operator == (const int aid) { return id == aid; } bool treeview::treeviewnode::operator == (const void *aref) { return ref == aref; } bool treeview::treeviewnode::operator != (const int aid) { return id != aid; } bool treeview::treeviewnode::operator != (const void *aref) { return ref != aref; } centerim-4.22.10/kkconsui/src/texteditor.cc0000644000175000001440000014647411473007750015546 00000000000000/* * * A class for diplaying and operating an advanced text editor with * syntax highlighting, scrolling and other useful features. * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 * * History of changes: * * 04.01.2000 development started * 09.01.2000 the first release is ready * 11.01.2000 one-line comments hightlight feature added * 29.01.2000 text selecting and copying feature (cut-n'-paste) * 01.02.2000 setpos() method added * 03.02.2000 eddelword() method added, some minor changes made * 06.02.2000 delmark() method added, hl_comment() minor bug fixed * 18.02.2000 bool wrap variable added * 11.03.2000 full tab support added * 01.04.2000 emacs keys binding option added * 20.04.2000 getline() & putline() methods added * 23.04.2000 colorschemes added * 07.05.2000 setpos() changed * 11.05.2000 whole lines highlighing feature added * 28.06.2000 shiftident() method added * 10.07.2000 undo() implemented * 25.07.2000 tab support improved * 06.09.2000 blocks handling improved, shiftmarkedblock method added * 31.10.2008 mergeline() minor bug fixed * */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_STDINT_H #include /* for intptr_t */ #endif #include "texteditor.h" #define CURLINE (curfile ? (curfile->sy+curfile->y) : 0) #define CURCOL (curfile ? (curfile->sx+curfile->x) : 0) #define CURSTRING (char *) curfile->lines->at(CURLINE) #define CSTRLEN strlen(CURSTRING ? CURSTRING : "") #define UPDATECURRENTLINE { kgotoxy(x1, y1+curfile->y); showline(CURLINE, curfile->sx, x2-x1); } #define MAX_STRLEN 10240 #define ALONE_DELIM " ;(){}[].,:-+*/^?!=<>" #define NONCHAR_DELIM " ;(){}[].,:-+*/^?!=<>\"'_" #define WORD_DELIM " ," #define EM_TAB 2 #define EM_CTRL 4 #define EM_MANUAL 8 #define CHECKLOADED if(!getfcount()) return; texteditor::texteditor(): otherkeys(0), fn(-1), wrap(false), abscol(0), idle(0), insertmode(true), undolog(true), show(true), curfile(0), prevshift(false), smarttab(true) { files = new linkedlist; files->freeitem = &editfilefree; } texteditor::~texteditor() { delete files; } int texteditor::load(const string abuf, const string id) { int newfn = addwindow(strdup(id.c_str())); string buf = abuf; vector lst; vector::iterator i; setfnum(newfn); breakintolines(buf, lst, wrap ? x2-x1-1 : 0); curfile->lines->empty(); for(i = lst.begin(); i != lst.end(); i++) { curfile->lines->add(strdup(i->c_str())); } curfile->lines->add(strdup("")); return newfn; } int texteditor::load(FILE *f, const string id) { int i = -1; struct stat st; char *p = 0; if(f) if(!fstat(fileno(f), &st)) { p = new char[st.st_size+1]; fseek(f, 0, SEEK_SET); fread(p, st.st_size, 1, f); p[st.st_size] = 0; i = load(p, strdup(id.c_str())); delete p; } return i; } int texteditor::load(ifstream &f, const string id) { int ret, size; char *buf; f.seekg(0, ios::end); size = f.tellg(); f.seekg(0, ios::beg); buf = new char[size+1]; f.read(buf, size); buf[size] = 0; ret = load(buf, strdup(id.c_str())); delete buf; return ret; } char *texteditor::save(const char *linebreak) { int i; char *buf, *p, *prev; buf = p = 0; for(i = 0; i < curfile->lines->count; i++) { prev = p; p = (char *) curfile->lines->at(i); if(!buf) { buf = (char *) malloc(strlen(p) + strlen(linebreak) + 1); buf[0] = 0; } else { buf = (char *) realloc(buf, strlen(buf) + strlen(p) + strlen(linebreak) + 1); } if(i) { if(!wrap) { strcat(buf, linebreak); } else if(!prev[0] || (prev[strlen(prev)-1] != ' ') && (strlen(prev) < x2-x1-1)) { strcat(buf, linebreak); } } while(strspn(p, " ") >= TAB_SIZE) { p += TAB_SIZE; strcat(buf, "\t"); } if(!((i == curfile->lines->count-1) && !strcmp(p, linebreak))) strcat(buf, p); } return buf; } int texteditor::save(FILE *f, const char *linebreak) { char *buf = save(linebreak); fwrite(buf, strlen(buf), 1, f); delete buf; modified = false; return 0; } int texteditor::save(ofstream &f, const string linebreak) { char *buf = save(linebreak.c_str()); f.write(buf, strlen(buf)); delete buf; f.close(); modified = false; return 0; } int texteditor::getfnum() { return fn; } int texteditor::getfcount() { return files->count; } char *texteditor::getfid() { return getfid(fn); } char *texteditor::getfid(int fnn) { if(files->count) { editfile *ef = (editfile *) files->at(fnn); if(ef) return ef->id; else return 0; } else { return 0; } } void texteditor::setfid(char *id) { setfid(fn, id); } void texteditor::setfid(int fnn, char *id) { if(fnn < files->count) { editfile *ef = (editfile *) files->at(fnn); if(ef) ef->id = id; } } void texteditor::setfnum(int n) { if(n < files->count && n >= 0 && n != fn) { // save previous window params if(curfile && (fn >= 0)) curfile->modified = modified; // set new file number fn = n; curfile = (editfile *) files->at(fn); modified = curfile->modified; colors = colorschemes[curfile->ncolorscheme]; } } int texteditor::addwindow(char *id) { editfile *ef = new editfile; ef->lines = new linkedlist; ef->blocks = new linkedlist; ef->highlines = new linkedlist; ef->undo = new linkedlist; ef->blocks->freeitem = &textblockfree; ef->lines->freeitem = &charpointerfree; ef->highlines->freeitem = &highlinefree; ef->undo->freeitem = &undorecordfree; ef->markblock = new textblock; memset(ef->markblock, 0, sizeof(textblock)); ef->sx = ef->x = ef->sy = ef->y = 0; ef->modified = ef->markmode = ef->showmarked = false; ef->id = id; ef->ncolorscheme = 0; files->add(ef); return files->count-1; } void texteditor::modification(tundoaction action, const string &data, bool connected, int curx, int cury) { if(undolog && !data.empty()) { undorecord *ur = new undorecord; ur->x = curx < 0 ? CURCOL : curx; ur->y = cury < 0 ? CURLINE : cury; ur->action = action; ur->data = data; ur->prevconnected = connected; curfile->undo->add(ur); } abscol = CURCOL; modified = true; scancomments(true); } void texteditor::setcoords(int nx1, int ny1, int nx2, int ny2) { x1 = nx1; x2 = nx2; y1 = ny1; y2 = ny2; if(curfile) setpos(CURCOL, CURLINE); } int texteditor::addscheme(int nc, int bc, int fbold, ...) { va_list ap; int p, nscheme = colorschemes.size(); va_start(ap, fbold); colorscheme s; s.ncolor = nc; s.blockcolor = bc; s.bold = fbold; while((p = va_arg(ap, int)) != 0) s.difcolors.push_back(p); colorschemes.push_back(s); return nscheme; } void texteditor::addhighlight(int nscheme, string text, int color, hl_kind kind) { int i; hlight h; if(nscheme >= 0 && nscheme < colorschemes.size()) { colorscheme &s = colorschemes[nscheme]; if(kind == h_quotes) { s.synt_quote = text; s.qcolor = color; if((i = text.find(" ")) != -1) { s.synt_qescape = text.substr(i+1); s.synt_quote.resize(i); } } else { h.text = text; h.color = color; h.kind = kind; s.hl.push_back(h); sort(s.hl.begin(), s.hl.end()); } } } void texteditor::addcolordif(int nscheme, int pairno) { if(nscheme >= 0 && nscheme < colorschemes.size()) { colorscheme &s = colorschemes[nscheme]; s.difcolors.push_back(pairno); } } void texteditor::setcolorscheme(int nscheme) { setcolorscheme(getfnum(), nscheme); } void texteditor::setcolorscheme(int nfn, int nscheme) { editfile *f = (editfile *) files->at(nfn); if(f) { f->ncolorscheme = nscheme; if(nfn == getfnum()) { colors = colorschemes[f->ncolorscheme]; } } } void texteditor::addblock(int x1, int y1, int x2, int y2, int color) { textblock *tb = new textblock; tb->x1 = x1; tb->y1 = y1; tb->x2 = x2; tb->y2 = y2; tb->color = color; curfile->blocks->add(tb); } void texteditor::startmark() { CHECKLOADED; if(!curfile->markmode) { curfile->markmode = curfile->showmarked = true; curfile->markreverse = false; curfile->markblock->x1 = curfile->markblock->x2 = CURCOL; curfile->markblock->y1 = curfile->markblock->y2 = CURLINE; curfile->markblock->color = colors.blockcolor; draw(); } } void texteditor::endmark() { CHECKLOADED; if(curfile->markmode) { marktext(); curfile->markmode = false; } } void texteditor::marktext() { bool corrx, corry, sameline; CHECKLOADED; if(curfile->markreverse) { corrx = curfile->markblock->x2 >= CURCOL; corry = curfile->markblock->y2 >= CURLINE; sameline = curfile->markblock->y2 == CURLINE; } else { corrx = curfile->markblock->x1 <= CURCOL; corry = curfile->markblock->y1 <= CURLINE; sameline = curfile->markblock->y1 == CURLINE; } if((corry && !corrx && sameline) || !corry) { curfile->markreverse = !curfile->markreverse; } if(curfile->markreverse) { curfile->markblock->x1 = CURCOL; curfile->markblock->y1 = CURLINE; } else { curfile->markblock->x2 = CURCOL; curfile->markblock->y2 = CURLINE; } draw(); updatecursor(); } void texteditor::copymark(FILE *f) { int i; CHECKLOADED; for(i = curfile->markblock->y1; i <= curfile->markblock->y2; i++) { if(i == curfile->markblock->y1 && curfile->markblock->y1 == curfile->markblock->y2) { char *p = strdup((char *) curfile->lines->at(i) + curfile->markblock->x1); p[curfile->markblock->x2-curfile->markblock->x1] = 0; fprintf(f, "%s", p); free(p); } else if(i == curfile->markblock->y1) { fprintf(f, "%s\n", (char *) curfile->lines->at(i) + curfile->markblock->x1); } else if(i == curfile->markblock->y2) { if(curfile->markblock->x2) { char *p = strdup((char *) curfile->lines->at(i)); p[curfile->markblock->x2] = 0; fprintf(f, "%s", p); if(!CURCOL) fprintf(f, "\n"); free(p); } } else { fprintf(f, "%s\n", (char *) curfile->lines->at(i)); } } } void texteditor::copymark(char *p, int maxlen) { } void texteditor::delmark() { CHECKLOADED; int i, newcol, newrow, line = 0; char *c, *p, *sl, *el; string deltext; textblock *mb = curfile->markblock; if(!mb->x1 && !mb->x2 && !mb->y1 && !mb->y2) return; for(i = mb->y1; i <= mb->y2; i++) { c = (char *) curfile->lines->at(i-line); if((i == mb->y1) && (i == mb->y2)) { deltext = c+mb->x1; deltext.resize(mb->x2-mb->x1); p = new char[strlen(c)]; strncpy(p, c, newcol = mb->x1); strcpy(p + mb->x1, c + mb->x2); p[strlen(c) - mb->x2 + mb->x1] = 0; curfile->lines->replace(newrow = i, p); } else if(i == mb->y1) { deltext = c+mb->x1; sl = strdup(c); sl[mb->x1] = 0; } else { char *lch = (char *) curfile->lines->at(i-line); deltext += "\n"; if(i == mb->y1) deltext += lch+mb->x1; else deltext += lch; if(i == mb->y2) { deltext.resize(deltext.size()-strlen(lch)+mb->x2); el = strdup(c + mb->x2); p = new char[strlen(sl)+strlen(el)+1]; strcpy(p, sl); strcat(p, el); curfile->lines->remove(i-line); curfile->lines->replace(newrow = i-line-1, p); newcol = strlen(sl); free(sl); free(el); } else { curfile->lines->remove(i-line); line++; } } } modification(udelblock, deltext, false, mb->x1, mb->y1); memset(curfile->markblock, 0, sizeof(textblock)); setpos(newcol, newrow); draw(); } void texteditor::clearmark() { CHECKLOADED; memset(curfile->markblock, 0, sizeof(textblock)); draw(); } void texteditor::insert(FILE *f) { struct stat sb; int fsize; char *buf; if(f) { fseek(f, 0, SEEK_SET); fstat(fileno(f), &sb); buf = new char[(fsize = sb.st_size)+1]; fread(buf, fsize, 1, f); buf[fsize] = 0; insert(buf); delete buf; } } void texteditor::insert(const string abuf) { CHECKLOADED; string sbuf; vector lst; vector::iterator is; sbuf = abuf; if(sbuf.find_first_of("\n\t") != -1) { breakintolines(sbuf, lst, 0); for(sbuf = "", is = lst.begin(); is != lst.end(); is++) { sbuf += *is + "\n"; } } if(!sbuf.empty()) { char *sl = strdup(CURSTRING), *el = strdup(CURSTRING+CURCOL), buf[1024], *s; const char *curpos = sbuf.c_str(); bool firstpass = true; int line = 0; sl[CURCOL] = 0; while(1) { if(!firstpass) { if(curpos = strchr(curpos, '\n')) curpos++; else break; } strncpy(buf, curpos, 1024); if(s = strchr(buf, '\n')) *s = 0; curpos += strlen(buf); if(!line++) { strinsert(buf, 0, sl); if(!*curpos) strcat(buf, el); curfile->lines->replace(CURLINE, strdup(buf)); } else { if(!*curpos) strcat(buf, el); curfile->lines->insert(CURLINE+line, strdup(buf)); } firstpass = false; } delete el; delete sl; modification(uinsblock, sbuf); } } void texteditor::sethlcolor(int n) { int at = colors.bold; if(!n) n = colors.ncolor; if(::find(colors.difcolors.begin(), colors.difcolors.end(), n) != colors.difcolors.end()) at = !at; attrset(at ? boldcolor(n) : normalcolor(n)); } void texteditor::draw_print(char *buf, int bcolor, int distance) { if(outx + strlen(buf) > distance) buf[distance-outx] = 0; if(buf[0]) { sethlcolor(bcolor); printw("%s", buf); outx += strlen(buf); buf[0] = 0; } } int dstralone(const char *buf, const char *startword, int wordlen, const char *delim) { int leftdelim = 0, rightdelim = 0; const char *si; for(si = startword-1; si != buf && *si < 32; si--); if(si >= buf) leftdelim = (strchr(delim, *si) != 0); else leftdelim = 1; for(si = startword + wordlen; *si && *si < 32; si++); if(*si) rightdelim = (strchr(delim, *si) != 0); else rightdelim = 1; return leftdelim && rightdelim; } void texteditor::scancomments(bool visible) { int sl, el, i; const char *rsub, *lsub; curfile->blocks->empty(); if(visible) { sl = curfile->sy; el = curfile->sy+y2-y1; if(el > curfile->lines->count) el = curfile->lines->count; } else { sl = 0; el = curfile->lines->count; } vector::iterator hi = ::find(colors.hl.begin(), colors.hl.end(), h_comment); if(hi != colors.hl.end()) { string lc, rc, comment = hi->text; struct textblock *tb = 0; lc = getword(comment, " "); rc = getword(comment, " "); for(i = sl; i < el; i++) { char *p = (char *) curfile->lines->at(i); const char *sub = p; while(1) { lsub = strqstr(sub, lc.c_str(), colors.synt_quote.c_str()); if(tb) rsub = strstr(sub, rc.c_str()); else rsub = strqstr(sub, rc.c_str(), colors.synt_quote.c_str()); if(rsub && (((rsub < lsub) && lsub) || !lsub)) { sub = rsub; if(!tb) { tb = new textblock; tb->color = hi->color; tb->y1 = 0; tb->x1 = 0; } tb->y2 = i; tb->x2 = sub-p+rc.size(); curfile->blocks->add(tb); tb = 0; sub += rc.size(); } else if(lsub) { sub = lsub; if(!tb) { tb = new textblock; tb->color = hi->color; tb->y1 = i; tb->x1 = sub-p; } sub += lc.size(); } else if(lsub && rsub) { if(!tb) { tb = new textblock; tb->color = hi->color; } tb->y1 = tb->y2 = i; tb->x1 = p-lsub; tb->x2 = p-rsub; curfile->blocks->add(tb); tb = 0; } else { break; } } } if(tb) { tb->y2 = i+1; tb->x2 = 0; curfile->blocks->add(tb); } } } int texteditor::hl_comment(char *cp, char *txt, int color) { int r; const char *p; r = 0; if(p = strqstr(cp, txt, "\"'")) r = hl_comment(cp, p-cp, strlen(cp), color); return r; } int texteditor::hl_comment(char *cp, int st, int pend, int color) { int i, delcount, r; char ins[5] = "\001 "; int origclr = -1; delcount = r = 0; if(color && (st <= strlen(cp)) && (pend-st > 0)) { /// !!! for(i = 0; (i <= pend) && (i < strlen(cp)); i++) for(i = 0; (i <= pend) && (i < strlen(cp)); i++) { switch(cp[i]) { case 1: origclr = cp[i+++1]; break; case 2: origclr = -1; break; } } if(pend > strlen(cp)) pend = strlen(cp); if(cp[pend] != 2) { strinsert(cp, pend, "\002"); r++; } if(origclr != -1) { ins[1] = origclr; strinsert(cp, pend+1, ins); r += 2; } for(i = st; (i < pend) && (i < strlen(cp)); i++) { switch(cp[i]) { case 1: strcut(cp, i--, 2); delcount += 2; pend -= 2; break; case 2: strcut(cp, i--, 1); delcount++; pend--; break; } } ins[1] = color; strinsert(cp, st, ins); r += 2; } return r-delcount; } int texteditor::count_clrcodes(char *cp, int pos) { int i, j, k; j = k = 0; for(i = 0; i < strlen(cp) && j < pos; i++) { if(cp[i] == 1) { k++; if(i++ < strlen(cp)) k++; } else if(cp[i] == 2) k++; else j++; } return k; } void texteditor::showline(int ln, int startx, int distance, int extrax) { if(!show) return; int i, n, inscount, bcolor, sxinscount, printed, j, lastoccur, q, eolstart, npos, offs; char *cs, *sr, *nr, *r, ins[3] = "\001 "; vector layout; vector::iterator iq; vector::iterator hi; const char *p; if(!(cs = (char *) curfile->lines->at(ln))) return; char *cp = (char *) malloc(i = ((strlen(cs)+1)*4)*sizeof(char)); char *buf = (char *) malloc(i); eolstart = i; strcpy(cp, cs); buf[0] = 0; inscount = sxinscount = bcolor = 0; highline *hline = (highline *) curfile->highlines->find(&(i = ln+1), &findhighline); if(hline) { ins[1] = hline->color; strinsert(cp, 0, ins); strcat(cp, "\002"); } else { if(strlen(cp)) for(hi = colors.hl.begin(); hi != colors.hl.end(); hi++) { ins[1] = hi->color; p = cp; lastoccur = 0; switch(hi->kind) { case h_alone: for(sr = r = strdup(hi->text.c_str()); r && r != sr+hi->text.size(); ) { if(nr = strchr(r, ';')) { *nr = 0; nr++; } if(!strlen(r)) { r = nr; continue; } p = cp; lastoccur = 0; while(p = strqstr(p+lastoccur, r, colors.synt_quote.c_str(), colors.synt_qescape.c_str())) { if(eolstart) eolstart += lastoccur; if(p-cp > eolstart) { r = 0; break; } lastoccur = strlen(r); if(dstralone(cp, p, lastoccur, ALONE_DELIM)) { strinsert(cp, p-cp+lastoccur, "\002"); strinsert(cp, p-cp, ins); inscount++; lastoccur += 3; } } r = nr; } free(sr); break; case h_symbol: layout = getsymbolpositions(string(cp).substr(0, eolstart), hi->text, colors.synt_quote, colors.synt_qescape); for(offs = 0, iq = layout.begin(); iq != layout.end(); iq++) { offs += hl_comment(cp, *iq+offs, *iq+offs+1, hi->color); } break; case h_block: while(p = strqpbrk(cp, p-cp+lastoccur, hi->text.c_str(), colors.synt_quote.c_str(), colors.synt_qescape.c_str())) { if(eolstart) eolstart += lastoccur; if(p-cp > eolstart) break; lastoccur = strspn(p, hi->text.c_str()); if(dstralone(cp, p, lastoccur, ALONE_DELIM)) { strinsert(cp, p-cp+lastoccur, "\002"); strinsert(cp, p-cp, ins); lastoccur += 3; } } break; case h_eol: if((npos = find_quoted(p, hi->text, 0, colors.synt_quote, colors.synt_qescape)) != -1) hl_comment(cp, eolstart = npos, strlen(cp), hi->color); break; case h_quotes: case h_comment: /* TODO: should these be handled, * are they possible to get here at all ? */ break; } } // Quotes highlight ... if(!colors.synt_quote.empty()) { bool qst; layout = getquotelayout(string(cp).substr(0, eolstart), colors.synt_quote, colors.synt_qescape); for(qst = false, offs = 0, iq = layout.begin(); iq != layout.end(); iq++) { qst = !qst; if(!qst) { offs += hl_comment(cp, *(iq-1)+offs, *iq+offs+1, colors.qcolor); } } if(qst) { hl_comment(cp, *(layout.end()-1)+offs, strlen(cp), colors.qcolor); } } // Blocks ... for(i = 0; i < curfile->blocks->count + 1; i++) { textblock *tb; if(i == curfile->blocks->count) { if(curfile->showmarked) { tb = curfile->markblock; } else break; } else { tb = (textblock *) curfile->blocks->at(i); } if(ln >= tb->y1 && ln <= tb->y2) { q = strlen(cp); if(ln == tb->y1 && tb->y1 == tb->y2) { n = count_clrcodes(cp, tb->x1) + tb->x1; q = count_clrcodes(cp, tb->x2) + tb->x2; } else if(ln == tb->y1) { n = count_clrcodes(cp, tb->x1) + tb->x1; } else if(ln == tb->y2) { n = j = 0; q = count_clrcodes(cp, tb->x2) + tb->x2; } else n = j = 0; if(!(tb->x1 == tb->x2 && tb->y1 == tb->y2)) { hl_comment(cp, n, q, tb->color); } } } } // let's count the amount of color codes inserted // before start X position (startx variable) sxinscount = count_clrcodes(cp, startx); for(i = 0; i < startx+sxinscount && i < strlen(cp)+inscount*3; i++) { if(cp[i] == 1) bcolor = cp[++i]; else if(cp[i] == 2) bcolor = 0; } for(i = startx+sxinscount, n = 0, outx = 0; i < strlen(cp); i++) { if(cp[i] == 1) { draw_print(buf, bcolor, distance); bcolor = cp[++i]; n = 0; } else if(cp[i] == 2) { draw_print(buf, bcolor, distance); n = bcolor = 0; } else { buf[n++] = cp[i]; buf[n] = 0; } } draw_print(buf, bcolor, distance); if(!hline) sethlcolor(0); printed = strlen(cs)-startx; if(printed < 0) printed = 0; else if(printed > distance) printed = distance; mvhline(y1+ln-curfile->sy, x1+extrax+printed, ' ', distance-printed); free (buf); free (cp); } void texteditor::draw(int fromline) { int k; if(show) { if(curfile->lines) { for(k = curfile->sy+fromline; k < curfile->lines->count && k < y2-y1+curfile->sy; k++) { kgotoxy(x1, k-curfile->sy+y1); showline(k, curfile->sx, x2-x1); } if(k < y2-y1+curfile->sy) { sethlcolor(colors.ncolor); for(; k < y2-y1+curfile->sy; k++) mvhline(k-curfile->sy+y1, x1, ' ', x2-x1); } } refresh(); } } void texteditor::draw() { if(active && curfile) { if(curfile->lines) scancomments(true); draw(0); } } bool texteditor::endofline() { return CURCOL == CSTRLEN; } const char texteditor::currentchar() { char *p = CURSTRING; return p[CURCOL]; } void texteditor::updatecursor() { if(active && curfile) { if(curfile->y >= y2-y1) curfile->y = y2-y1-1; if(curfile->x >= x2-x1) curfile->x = x2-x1-1; kgotoxy(x1+curfile->x, y1+curfile->y); } } bool texteditor::fix_x(bool tab) { int osx = curfile->sx, clen = CSTRLEN; if(CURCOL > clen) { if(clen-curfile->sx < 0) { curfile->sx = CSTRLEN/(x2-x1-1); } curfile->x = CSTRLEN-curfile->sx; } else { if(abscol-curfile->sx > x2-x1-1) setpos(abscol, CURLINE); } if(tab) { int rm = rtabmargin(true, CURCOL, CURSTRING); char *p = CURSTRING; /* if CURCOL is 0 we'll be outside of the array => not good */ if(CURCOL > 0) if(p[CURCOL-1] == ' ') if(strspn(p+CURCOL, " ") >= rm-CURCOL) if(CURCOL != ltabmargin(true, rm, p)) { //if(rm <= curfile->sx+x2-x1) curfile->x = rm-curfile->sx; curfile->x += rm-curfile->x; } } return osx != curfile->sx; } void texteditor::eddel(bool usetabs) { char *p = CURSTRING; int nextlen, todelete = 1, rm; string deltext; if(p) { if(CURCOL < strlen(p)) { if(usetabs && ((rm = rtabmargin(true, CURCOL, CURSTRING)) != -1)) { deltext.append(todelete = rm-CURCOL, ' '); } else { deltext = *(p+CURCOL); } modification(udelchar, deltext); strcut(p, CURCOL, todelete); int px = CURCOL, py = CURLINE; mergeline(CURLINE-1, false, px, py); // can't we append this one to previous, since we've shrotened it? mergeline(py, false, px, py); // can't we append next one to this? setpos(px, py); updatecursor(); draw(); } else { int px = CURCOL, py = CURLINE; mergeline(py, true, px, py); modification(udelchar, "\n"); setpos(px, py); draw(); } updatecursor(); } } void texteditor::edbackspace() { int i, bc; if(CURCOL) { bool spacetoend = endofline() && !currentchar(); bool curspace = isspace(currentchar()); edmove(KEY_LEFT); if(spacetoend) { bc = CSTRLEN-CURCOL; for(i = 0; i < bc; i++) eddel(false); } else { if(!curspace && isspace(currentchar())) { eddelword(); } else { eddel(); } } } else if(CURLINE) { edmove(KEY_UP); edmove(KEY_END); eddel(); } } void texteditor::eddelword() { // This is the kkconsui original version: it does not skip whitespace char *p = CURSTRING, *e; string deltext, n; int count; if(!strlen(p)) { eddelline(); } else if(CURCOL == strlen(p)) { if(CURLINE < curfile->lines->count-1) { eddel(); if(currentchar() == ' ') eddelword(); } } else { n = p; deltext = n.substr(CURCOL); if(currentchar() == ' ') { count = strspn(p+CURCOL, " "); n.replace(CURCOL, count, ""); } else { n = p; if(!(e = strpbrk(&p[CURCOL], NONCHAR_DELIM))) e = p + strlen(p); if((count = e-p-curfile->sx-curfile->x)) { n.replace(CURCOL, count, ""); } else { count += strspn(n.substr(CURCOL).c_str(), NONCHAR_DELIM); n.replace(CURCOL, strspn(n.c_str()+CURCOL, NONCHAR_DELIM), ""); } } deltext.resize(count); curfile->lines->replace(CURLINE, strdup(n.c_str())); modification(udelchar, deltext); int px = CURCOL, py = CURLINE; mergeline(py-1, false, px, py); mergeline(py, false, px, py); setpos(px, py); draw(); updatecursor(); } } void texteditor::eddelwordemacs() { // This is the "emacs-compliant" version, it skips all whitespace char *p = CURSTRING, *e; string deltext, n; int count = 0; if(!strlen(p)) { if(CURLINE < curfile->lines->count-1) { eddelline(); eddelwordemacs(); } } else if(CURCOL == strlen(p)) { if(CURLINE < curfile->lines->count-1) { eddel(); if(currentchar() == ' ') eddelword(); } } else { n = p; deltext = n.substr(CURCOL); // skip whitespace if(currentchar() == ' ') { count = strspn(p+CURCOL, " "); n.replace(CURCOL, count, ""); curfile->lines->replace(CURLINE, strdup(n.c_str())); int px = CURCOL, py = CURLINE; mergeline(py-1, false, px, py); mergeline(py, false, px, py); setpos(px, py); } n = p = CURSTRING; if(!(e = strpbrk(&p[CURCOL], NONCHAR_DELIM))) e = p + strlen(p); if((count = e-p-curfile->sx-curfile->x)) { n.replace(CURCOL, count, ""); } else { count += strspn(n.substr(CURCOL).c_str(), NONCHAR_DELIM); n.replace(CURCOL, strspn(n.c_str()+CURCOL, NONCHAR_DELIM), ""); } deltext.resize(count); curfile->lines->replace(CURLINE, strdup(n.c_str())); modification(udelchar, deltext); int px = CURCOL, py = CURLINE; mergeline(py-1, false, px, py); mergeline(py, false, px, py); setpos(px, py); draw(); updatecursor(); } } void texteditor::eddelline() { char *p = (char *) curfile->lines->at(CURLINE); string deltext = (string) p + "\n"; if(CURLINE+1 < curfile->lines->count) { int px = 0, py = CURLINE; curfile->lines->remove(CURLINE); mergeline(py-1, false, px, py); if(!curfile->lines->count) { curfile->sy = curfile->sx = curfile->y = curfile->x = 0; char *p = strdup(""); curfile->lines->add(p); } else if(CURLINE >= curfile->lines->count) { edmove(KEY_UP); } } else { char *p = strdup(""); curfile->lines->replace(curfile->lines->count-1, p); } shiftmarkedblock(-1); modification(udelchar, deltext, false, 0); edmove(KEY_HOME); abscol = 0; draw(); updatecursor(); } void texteditor::eddelbegofline() { char *p = CURSTRING; string deltext, n; if(CURCOL == 0 && CURLINE) { // We're at the beginning of the line edmove(KEY_UP); edmove(KEY_END); eddel(); } else if(CURCOL == strlen(p)) { // We're at the end eddelline(); } else { n = p; deltext = (string) p; n.replace(curfile->sx, CURCOL, ""); edmove(KEY_HOME); curfile->lines->replace(CURLINE, strdup(n.c_str())); modification(udelchar, deltext); int px = 0, py = CURLINE; mergeline(py-1, false, px, py); mergeline(CURLINE, false, px, py); draw(); updatecursor(); } } void texteditor::eddelendofline() { char *p = CURSTRING; string deltext, n; int count = 0; if(CURCOL == 0) { // We're at the beginning of the line eddelline(); } else if (CURCOL == strlen(p)) { // We're at the end eddel(); } else { n = p; deltext = (string) p + "\n"; count = strlen(p) - CURCOL; n.replace(CURCOL, count, ""); curfile->lines->replace(CURLINE, strdup(n.c_str())); modification(udelchar, deltext); draw(curfile->y); updatecursor(); } } void texteditor::edtransposechar() { char *p = CURSTRING; string deltext; char tmp; if (CURCOL == 0) return; else if (CURCOL == strlen(p)) { deltext = (string) p; tmp = p[CURCOL-2]; p[CURCOL-2] = p[CURCOL-1]; p[CURCOL-1] = tmp; curfile->lines->replace(CURLINE, strdup(p)); modification(udelchar, deltext); draw(curfile->y); updatecursor(); } else { deltext = (string) p; tmp = p[CURCOL-1]; p[CURCOL-1] = p[CURCOL]; p[CURCOL] = tmp; setpos(CURCOL+1, CURLINE); curfile->lines->replace(CURLINE, strdup(p)); modification(udelchar, deltext); draw(curfile->y); updatecursor(); } } void texteditor::edenter(bool countspaces) { char *p = CURSTRING, *r; string spaceins; if(wrap) strimtrail(p); int oldsx = curfile->sx; int spacecount = strspn(p, " "); int nextlen = CSTRLEN-CURCOL+spacecount+1; char *nextstr = (char *) malloc(nextlen < 1 ? 1 : nextlen); if(CURCOL < spacecount) spacecount = 0; if(!countspaces) spacecount = 0; r = strlen(p) > CURCOL ? p+CURCOL : p+strlen(p); sprintf(nextstr, "%-*s%s", spacecount, "", r); curfile->lines->insert(CURLINE+2, nextstr); modification(uinschar, "\n"); spaceins.append(spacecount, ' '); modification(uinschar, spaceins); curfile->sx = p[CURCOL] = 0; curfile->x = spacecount; if(curfile->x > x2-x1) { curfile->sx = curfile->x-(x2-x1); curfile->x -= curfile->sx; } // Shift the marked block down if ENTER was // pressed on the line above it shiftmarkedblock(1); if(curfile->y+1 < y2-y1) { if(curfile->sx != oldsx) draw(); else draw(curfile->y); } abscol = CURCOL; edmove(KEY_DOWN); } void texteditor::edmove(int k, int options) { int i, lm; bool fdraw = false; bool ctrlpressed = (options & EM_CTRL) && (getctrlkeys() & CONTROL_PRESSED); bool shiftpressed = (getctrlkeys() & SHIFT_PRESSED); char *p = CURSTRING; if(options & EM_MANUAL) { if(shiftpressed != prevshift) { if(shiftpressed && !curfile->markmode) startmark(); if(!shiftpressed && curfile->markmode) endmark(); } prevshift = shiftpressed; } if(curfile->lines->count) { switch(k) { case KEY_UP: if(curfile->y) { curfile->y--; } else if(CURLINE) { i = CURLINE-1; // sy -= (y2-y1)/2; curfile->sy--; if(curfile->sy < 0) curfile->sy = 0; curfile->y = i-curfile->sy; fdraw = true; } setpos(abscol, CURLINE); if(fix_x(options & EM_TAB) || fdraw) draw(); updatecursor(); break; case KEY_DOWN: if(CURLINE < curfile->lines->count-1) { if(curfile->y+1 < y2-y1) { curfile->y++; } else { i = CURLINE+1; // sy += (y2-y1)/2; curfile->sy++; if(curfile->lines->count-curfile->sy < y2-y1) curfile->sy = curfile->lines->count-y2+y1; curfile->y = i-curfile->sy; fdraw = true; } setpos(abscol, CURLINE); if(fix_x(options & EM_TAB) || fdraw) draw(); updatecursor(); } break; case KEY_LEFT: if(ctrlpressed) { char *p = CURSTRING, *r, *s = p+CURCOL; if(p == s) r = 0; else { for(r = s; (r != p) && !strchr(NONCHAR_DELIM, *r); r--); for(; (r != p) && strchr(NONCHAR_DELIM, *r); r--); for(; (r != p) && !strchr(NONCHAR_DELIM, *r); r--); if(strchr(NONCHAR_DELIM, *r)) { if(r == p) r = 0; else r++; } } if(r) { if((curfile->x -= s-r) < 0) { curfile->sx += curfile->x; curfile->x = 0; draw(); updatecursor(); } } else if(CURLINE) { setpos(strlen((char *) curfile->lines->at(CURLINE-1)), CURLINE-1); } } else { /* if(CURCOL && (options & EM_TAB) && ((lm = ltabmargin(true, -1, CURSTRING)) != -1)) { setpos(lm, CURLINE); } else */ if(curfile->x) { curfile->x--; char *p = CURSTRING; if(CURCOL && (options & EM_TAB)) if((lm = ltabmargin(true, CURCOL, p)) != -1) if(CURCOL+1 != lm) if(currentchar() == ' ') setpos(lm, CURLINE); } else if(curfile->sx) { i = CURCOL; curfile->sx -= (x2-x1)/3; if(curfile->sx < 0) curfile->sx = 0; curfile->x = i-curfile->sx-1; draw(); } else if(CURLINE) { edmove(KEY_UP); edmove(KEY_END); } } break; case KEY_RIGHT: if(ctrlpressed) { char *p = CURSTRING+CURCOL+1, *r = 0; if(*(CURSTRING+CURCOL)) { if(r = strpbrk(p, NONCHAR_DELIM)) for(; *r && strchr(NONCHAR_DELIM, *r); r++); } if(r) { curfile->x += r-p+1; } else { if(endofline() && (CURLINE < curfile->lines->count-1)) { setpos(0, CURLINE+1); } else { curfile->x = CSTRLEN; } } } else { if(CSTRLEN > CURCOL) { curfile->x++; fix_x(options & EM_TAB); } else if(CURLINE < curfile->lines->count-1) { edmove(KEY_DOWN); edmove(KEY_HOME); } } break; case KEY_HOME: i = curfile->sx; if(ctrlpressed) { curfile->y = 0; curfile->sx = curfile->x = 0; } else if(curfile->x) { curfile->sx = curfile->x = 0; } if(curfile->sx < i) draw(); updatecursor(); break; case KEY_END: if(ctrlpressed) { i = curfile->sx; curfile->y = y2-y1-1; curfile->sx = curfile->x = 0; if(CURLINE >= curfile->lines->count) { curfile->y = curfile->lines->count-curfile->sy-1; } if(i) draw(); } else if(CURCOL != CSTRLEN) { setpos(CSTRLEN, CURLINE); } updatecursor(); break; case KEY_PPAGE: if(ctrlpressed) { setpos(0, 0); abscol = 0; } else if(CURLINE) { if(curfile->y-y2-y1 < 0 && !curfile->sy) curfile->y = 0; else { curfile->sy = curfile->sy-y2+y1; if(curfile->sy < 0) curfile->sy = 0; } fix_x(options & EM_TAB); draw(); updatecursor(); } break; case KEY_NPAGE: if(ctrlpressed) { setpos(0, curfile->lines->count-1); abscol = 0; } else if(CURLINE != curfile->lines->count) { if(curfile->sy + y2-y1 == curfile->lines->count) curfile->y = y2-y1-1; else { curfile->sy += y2-y1; if(curfile->sy+y2-y1 > curfile->lines->count) curfile->sy = curfile->lines->count-y2+y1; if(curfile->sy < 0) { curfile->sy = 0; curfile->y = curfile->lines->count-1; } } fix_x(options & EM_TAB); draw(); } break; case KEY_EMACS_BEG_OF_BUFFER: setpos(0, 0); break; case KEY_EMACS_END_OF_BUFFER: p = (char *) curfile->lines->at(curfile->lines->count-1); i = strlen(p); setpos(i, curfile->lines->count-1); break; case KEY_EMACS_FORWARD_WORD: if(endofline() && CURLINE < curfile->lines->count-1) { setpos(0, CURLINE+1); p = CURSTRING; if(strchr(NONCHAR_DELIM, p[CURCOL])) { i = strspn(p+CURCOL, NONCHAR_DELIM); setpos(CURCOL+i, CURLINE); } } else if(endofline() && CURLINE == curfile->lines->count-1) return; i = 0; if(strchr(NONCHAR_DELIM, p[CURCOL])) i = strspn(p+CURCOL, NONCHAR_DELIM); i += strcspn(p+CURCOL+i, NONCHAR_DELIM); setpos(CURCOL+i, CURLINE); break; case KEY_EMACS_BACKWARD_WORD: if(CURCOL == 0 && CURLINE > 0 && curfile->lines->count) { setpos(strlen((char *)curfile->lines->at(CURLINE-1)), CURLINE-1); } if(CURCOL > 0) { char *s; int len, offset = 0; p = CURSTRING; len = CURCOL; s = (char *)malloc(len+1); for(i = 0; i < len; i++) { s[i] = p[len-i-1]; } s[len] = '\0'; if(strchr(NONCHAR_DELIM, p[CURCOL]) || strchr(NONCHAR_DELIM, p[CURCOL-1])) offset = strspn(s, NONCHAR_DELIM); offset += strcspn(s+offset, NONCHAR_DELIM); if(offset == CURCOL && strchr(NONCHAR_DELIM, p[0])) { setpos(strlen((char *)curfile->lines->at(CURLINE-1)), CURLINE-1); edmove(KEY_EMACS_BACKWARD_WORD); } else setpos(CURCOL-offset, CURLINE); if(s) free(s); } break; } } if(curfile->x >= x2-x1) switch(k) { case KEY_RIGHT: case KEY_LEFT: i = CURCOL; curfile->sx += (x2-x1)/3; curfile->x = i-curfile->sx; draw(); updatecursor(); break; } if(options & EM_MANUAL) switch(k) { case KEY_LEFT: case KEY_RIGHT: case KEY_HOME: case KEY_END: abscol = CURCOL; break; default: if(abscol <= 0) abscol = CURCOL; break; } if(options & EM_MANUAL) { if(curfile->markmode) marktext(); } } void texteditor::inschar(int k) { if(k == '\t') { int rm = rtabmargin(true, CURCOL, CURSTRING)-CURCOL, i; if(rm < 0) rm = rtabmargin(true, CURCOL)-CURCOL; for(i = 0; i < rm; i++) inschar(' '); } else { char *p = CURSTRING; int len = strlen(p); char *n = (char *) malloc(len+5); char np[2]; strcpy(n, p); sprintf(np, "%c", k); strinsert(n, CURCOL, np); if(wrap && strlen(n) > x2-x1-1) { int cx = CURCOL+1; int cy = CURLINE; curfile->lines->replace(CURLINE, n); modification(uinschar, np); wrapline(CURLINE, cx, cy); // check for line wrap setpos(cx, cy); draw(); } else { curfile->lines->replace(CURLINE, n); modification(uinschar, np); UPDATECURRENTLINE; edmove(KEY_RIGHT, 0); } updatecursor(); abscol = CURCOL; } } void texteditor::setpos(int col, int line) { bool drawneeded = false; CHECKLOADED; if(line >= curfile->lines->count) line = curfile->lines->count-1; if(line < 0) line = 0; if((line >= curfile->sy) && (line < curfile->sy+y2-y1)) { curfile->y = line-curfile->sy; } else { if((curfile->sy = line-(y2-y1)/2) < 0) curfile->sy = 0; if(curfile->sy+y2-y1-1 > curfile->lines->count) { curfile->sy = curfile->lines->count-y2+y1; } if(curfile->sy < 0) curfile->sy = 0; curfile->y = line-curfile->sy; drawneeded = true; } if((col >= curfile->sx) && (col < curfile->sx+x2-x1)) { curfile->x = col-curfile->sx; } else { char *p = CURSTRING; if(col > strlen(p)) col = strlen(p); curfile->sx = 0; if((curfile->x = col) > x2-x1-1) { curfile->sx = curfile->x-(x2-x1)/2; curfile->x -= curfile->sx; } drawneeded = true; } if(drawneeded) draw(); updatecursor(); } void texteditor::getpos(int *col, int *line) { if(col) *col = CURCOL; if(line) *line = CURLINE; } int texteditor::open() { int k, l, go; if((x2-x1 < 2) || (y2-y1 < 2)) { return 0; } if(fn < 0 || fn > files->count) setfnum(0); active = true; if(curfile) if(curfile->lines) { if(!curfile->lines->count) { char *p = strdup(""); curfile->lines->add(p); } if(CURCOL > CSTRLEN) fix_x(true); draw(); updatecursor(); } abscol = CURCOL; while(active && files->count) { refresh(); if(idle) go = keypressed(); else go = 1; if(go) { k = getkey(); if(emacs) k = emacsbind(k); switch(k) { case KEY_UP: case KEY_DOWN: case KEY_LEFT: case KEY_RIGHT: case KEY_HOME: case KEY_END: case KEY_PPAGE: case KEY_NPAGE: case KEY_EMACS_BEG_OF_BUFFER: case KEY_EMACS_END_OF_BUFFER: case KEY_EMACS_FORWARD_WORD: case KEY_EMACS_BACKWARD_WORD: edmove(k, EM_TAB | EM_CTRL | EM_MANUAL); updatecursor(); break; default: if(prevshift) prevshift = curfile->markmode = false; switch(k) { case '\r': if(otherkeys) if((*otherkeys)(*this, k) == -1) return -1; if(insertmode || (curfile->lines->count == CURLINE+1)) { edenter(smarttab); } else { edmove(KEY_DOWN); edmove(KEY_HOME); } break; case KEY_BACKSPACE: case CTRL('h'): case 127: edbackspace(); break; case CTRL('y'): eddelline(); break; case KEY_EMACS_C_U: eddelbegofline(); break; case KEY_EMACS_C_K: eddelendofline(); break; case KEY_EMACS_C_T: edtransposechar(); break; case KEY_EMACS_M_D: eddelwordemacs(); break; case KEY_TAB: inschar('\t'); break; case CTRL('t'): eddelword(); break; default: if(k >= 32 && k <= 255) { if(!insertmode && !endofline()) eddel(); inschar(k); } else if(otherkeys) { if(!getctrlkeys() && ((k == KEY_IC) || (k == KEY_DC))) switch(k) { case KEY_IC: insertmode = !insertmode; break; case KEY_DC: eddel(); break; } else { l = fn; if((*otherkeys)(*this, k) == -1) return -1; if(l != fn) { draw(); updatecursor(); } } } } } } else { if(idle) (*idle)(*this); } } active = false; return !files->count ? TEXTEDITOR_NOFILES : 0; } void texteditor::close() { files->remove(fn); curfile = 0; if(files->count) { int n = fn; fn = -1; if(n >= files->count) n = files->count-1; setfnum(n); } else { active = false; fn = -1; } } bool texteditor::find(const char *needle, const char *options, int *col, int *line) { const char *f; char *p; int i, plus; enum {fromcur, fromstart, backward} fdirection; bool casesens = (bool) strchr(options, 's'); if(strchr(options, 't')) { fdirection = fromstart; i = 0; } else if(strchr(options, 'b')) { fdirection = backward; i = 0; } else if(strchr(options, 'c')) { fdirection = fromcur; i = CURLINE; } for(; i < curfile->lines->count; i++) { p = (char *) curfile->lines->at(i); if((fdirection == fromcur) && (i == CURLINE)) plus = CURCOL+1; else plus = 0; if(!casesens) f = strqcasestr(p+plus, needle, ""); else f = strstr(p+plus, needle); if(f) { *col = (int) (f-p); *line = i; return true; } } return false; } bool texteditor::ismark() { return curfile ? curfile->markmode : false; } char *texteditor::getline(int ln) { return (char *) (getfcount() ? curfile->lines->at(ln) : 0); } void texteditor::putline(int ln, const char *newline) { char *p = (char *) curfile->lines->at(ln); string deltext, instext; deltext = (string) p + "\n"; instext = (string) newline + "\n"; curfile->lines->replace(ln, (void *) newline); modification(udelchar, deltext, false, 0, ln); modification(uinschar, instext, true, 0, ln); } void texteditor::redraw() { active = (bool) curfile; draw(); } void texteditor::highlight(int line, int color) { highlight(getfnum(), line, color); } void texteditor::highlight(int fn, int line, int color) { editfile *f = (editfile *) files->at(fn); int i; if(f) { if((i = f->highlines->findnum(&line, &findhighline)) != -1) { f->highlines->remove(i); } highline *h = new highline; h->line = line; h->color = color; f->highlines->add(h); } } void texteditor::unlight(int line) { unlight(getfnum(), line); } void texteditor::unlight(int fn, int line) { int i; editfile *f = (editfile *) files->at(fn); if(f) { if((i = f->highlines->findnum(&line, &findhighline)) != -1) { f->highlines->remove(i); } } } void texteditor::clearlight() { clearlight(getfnum()); } void texteditor::clearlight(int fn) { editfile *f = (editfile *) files->at(fn); if(f) f->highlines->empty(); } void texteditor::switchmark() { CHECKLOADED; if(ismark()) endmark(); else startmark(); } void texteditor::shiftident(int x1, int y1, int x2, int y2, int delta) { int starty = y1, endy = y2, i; char *p, *newp; string origtext, repltext; CHECKLOADED; if(!delta) return; if(x1) starty++; if(!x2) endy--; for(i = starty; i <= endy; i++) { p = (char *) curfile->lines->at(i); if(delta > 0) { newp = new char[strlen(p)+delta+1]; sprintf(newp, "%*s%s", delta, "", p); } else { if(strspn(p, " ") >= -delta) { newp = strdup(p-delta); } else { newp = strdup(p); strimlead(newp); } } strimtrail(newp); if(origtext.empty() && repltext.empty()) { origtext = p; repltext = newp; } else { origtext += "\n"; repltext += "\n"; origtext += p; repltext += newp; } curfile->lines->replace(i, newp); } modification(udelblock, origtext, true, curfile->markblock->x1, curfile->markblock->y1); modification(uinsblock, repltext, false, curfile->markblock->x1, curfile->markblock->y1); } void texteditor::shiftident(int delta) { CHECKLOADED; shiftident(curfile->markblock->x1, curfile->markblock->y1, curfile->markblock->x2, curfile->markblock->y2, delta); } void texteditor::undo() { int i, aline; undorecord *ur; tundoaction a; bool firstpass = true, finished = false; undolog = show = false; CHECKLOADED; while(curfile->undo->count && !finished) { ur = (undorecord *) curfile->undo->at(curfile->undo->count-1); if(!firstpass && ((a != ur->action) || (aline != ur->y))) { if(!ur->prevconnected) break; finished = true; } else { a = ur->action; aline = ur->y; } firstpass = false; setpos(ur->x, ur->y); switch(ur->action) { case uinschar: case uinsblock: clearmark(); for(i = 0; i < ur->data.size(); i++) eddel(false); break; case udelchar: case udelblock: for(i = 0; i < ur->data.size(); i++) switch(ur->data[i]) { case '\n': edenter(false); edmove(KEY_HOME); break; default: inschar(ur->data[i]); break; } break; } curfile->undo->remove(curfile->undo->count-1); } abscol = CURCOL; scancomments(true); undolog = show = true; redraw(); } // -------------------------------------------------------------------------- void texteditor::textblockfree(void *p) { textblock *tb = (textblock *) p; if(tb) delete tb; } void texteditor::highlinefree(void *p) { highline *hl = (highline *) p; if(hl) delete hl; } void texteditor::editfilefree(void *p) { editfile *ef = (editfile *) p; if(ef) { delete ef->lines; delete ef->blocks; delete ef->highlines; delete ef->undo; delete ef->markblock; free (ef->id) ; /* this is allocated by a c-routine => must deallocated with free */ delete ef; } } void texteditor::undorecordfree(void *p) { undorecord *ur = (undorecord *) p; if(ur) delete ur; } int texteditor::findint(void *p1, void *p2) { return (intptr_t) p1 != (intptr_t) p2; } int texteditor::findhighline(void *p1, void *p2) { return (intptr_t) p1 != ((highline *) p2)->line; } void texteditor::shiftmarkedblock(int delta) { CHECKLOADED; if(CURLINE <= curfile->markblock->y1) { curfile->markblock->y1 += delta; curfile->markblock->y2 += delta; } else if((CURLINE > curfile->markblock->y1) && (CURLINE < curfile->markblock->y2)) { curfile->markblock->y2 += delta; } } void texteditor::prepend(char *text, int ln) { if (!text) return; char *p = (char *) curfile->lines->at(ln); if (p) { char *n = (char *) malloc(strlen(p)+2+strlen(text)); strcpy(n, text); strcat(n, p); curfile->lines->replace(ln, n); } else { curfile->lines->insert(ln+1, strdup(text)); } } void texteditor::wrapline(int ln, int &px, int &py) { char *p = (char *) curfile->lines->at(ln); if(wrap && p && strlen(p) > x2-x1-1) { // it's longer than window width and we want it wrapped char *n = (char *) malloc(strlen(p)+5); strcpy(n, p); char *sub = strpbrk(n, WORD_DELIM), *osub = 0, *sep; if(sub) { // there's some whitespace while((osub = strpbrk(sub+1, WORD_DELIM)) && // find last word on line (strspn(osub, WORD_DELIM) < strlen(osub)) && ((osub-n)<(x2-x1-1))) sub = osub; } else { sub = n+strlen(n)-2; } char sins[2] = " "; sins[0] = *sub; strinsert(n, sub-n, sins); // append space to the end of line sub++; // go to previous space position *sub = 0; // cut the line sep = sub+1; // first character of line remainder curfile->lines->replace(ln, n); prepend(sep, ln+1); // prepend wrapped end of line to beginning of the next one if (px>=strlen(n)) { // cursor moved to next line px -= strlen(n); py++; wrapline(ln+1, px, py); // wrap again and keep the cursor position updated } else { int dx, dy; // dummy wrapline(ln+1, dx, dy); // just wrap the rest } } } void texteditor::mergeline(int ln, bool force, int &px, int &py) { char *p = (char *) curfile->lines->at(ln); if (!p || ((!*p || (p[strlen(p)-1]!=' ')) && !force)) // the line is not mergeable return; char *next = (char *) curfile->lines->at(ln+1); int able = x2-x1-strlen(p)-1; // how much space do we have on this line if(next && (*next || force)) { if(wrap && (able < strlen(next))) { // not whole next line fits here char *anext = strdup(next), *asub, *atsub; anext[able] = 0; if(asub = strpbrk(anext, WORD_DELIM)) { int pxdeltamerge; for(; atsub = strpbrk(asub+1, WORD_DELIM); asub = atsub); char *newline = new char[strlen(p)+asub-anext+2]; strcpy(newline, p); if ((ln==(py-1)) && (px<(asub-anext+1))) { // move to previous line px += strlen(newline); pxdeltamerge = px; //accepting that change px even if the line is merged py--; } else { if (ln==(py-1)) { px -= (asub-anext+1); // move back pxdeltamerge = px; } else pxdeltamerge = px - (asub-anext+1); //px can't be changed even if the line is merged } strncat(newline, next, asub-anext+1); strcut(next, 0, asub-anext+1); curfile->lines->replace(ln, newline); //mergeline(ln+1, false, px, py); // we've merged something from the next line - try to merge it too mergeline(ln+1, false, pxdeltamerge, py); // we've merged something from the next line - try to merge it too } free(anext); } else { // whole next line fits on this one int nextlen; if(next) nextlen = strlen(next); else nextlen = 0; char *newline = new char[nextlen+strlen(p)+1]; if (ln == (py-1)) { px += strlen(p); py--; } sprintf(newline, "%s%s", p, nextlen ? next : ""); curfile->lines->replace(ln, newline); curfile->lines->remove(ln+1); shiftmarkedblock(-1); if (wrap && *newline && newline[strlen(newline)-1]==' ') // if it wasn't last one in "paragraph", try to merge with another one mergeline(ln, false, px, py); } } } // -------------------------------------------------------------------------- #ifdef __KTOOL_USE_NAMESPACES using ktool::hlight; #endif bool hlight::operator == (const hl_kind &k) const { return kind == k; } bool hlight::operator != (const hl_kind &k) const { return kind != k; } bool hlight::operator < (const hlight &ah) const { return kind == h_eol; } centerim-4.22.10/kkconsui/src/conscommon.cc0000644000175000001440000001455111461606612015513 00000000000000/* * * kkconsui common routines * $Id: conscommon.cc,v 1.27 2004/06/21 13:04:31 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "conscommon.h" #include bool kintf_graph = true, kintf_refresh = true; #ifdef KTOOL_USE_FRIBIDI bool use_fribidi = true; #endif void (*kt_resize_event)(void); void kreinit(int sn) { struct winsize size; if(ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0) { resizeterm(size.ws_row, size.ws_col); wrefresh(curscr); if(kt_resize_event) kt_resize_event(); } signal(sn, &kreinit); } void kinterface() { #ifdef KTOOL_USE_FRIBIDI // an experimental thingie std::cout << ((char) 27) << "(K" << std::flush; #endif initscr(); nonl(); cbreak(); noecho(); keypad(stdscr, 1); // raw(); start_color(); use_default_colors(); atexit(kendinterface); // nodelay(stdscr, TRUE); ESCDELAY = 0; signal(SIGWINCH, &kreinit); kt_resize_event = 0; } void kendinterface() { endwin(); } int getkey() { int k, n, fin = 0, r = 0; fd_set rd; struct timeval tv; refresh(); while(!fin) { FD_ZERO(&rd); FD_SET(STDIN_FILENO, &rd); while(!select(STDIN_FILENO+1, &rd, 0, 0, 0)); ioctl(STDIN_FILENO, FIONREAD, &r); switch(k = getch()) { case 27: tv.tv_sec = 10; tv.tv_usec = 0; if(r <= 1) r = select(STDIN_FILENO+1, &rd, 0, 0, &tv); if(r) { n = getch(); if(isdigit(n)) k = KEY_F(n-'0' ? n-'0' : 10); else if(n != 27) k = ALT(n); } else { k = 0; } fin = 1; break; case CTRL('l'): endwin(); refresh(); fin = 1; break; default: fin = 1; break; } } return k; } int getctrlkeys() { #ifdef __linux__ unsigned char modifiers = 6; if(ioctl(0, TIOCLINUX, &modifiers) < 0) return 0; return (int) modifiers; #else return 0; #endif } int emacsbind(int k) { switch(k) { case CTRL('b'): return KEY_LEFT; case CTRL('f'): return KEY_RIGHT; case CTRL('n'): return KEY_DOWN; case CTRL('p'): return KEY_UP; case CTRL('d'): return KEY_DC; case CTRL('a'): return KEY_HOME; case CTRL('e'): return KEY_END; case CTRL('v'): return KEY_NPAGE; case CTRL('u'): return KEY_EMACS_C_U; case CTRL('k'): return KEY_EMACS_C_K; case CTRL('t'): return KEY_EMACS_C_T; case ALT('d'): return KEY_EMACS_M_D; case ALT('<'): return KEY_EMACS_BEG_OF_BUFFER; case ALT('>'): return KEY_EMACS_END_OF_BUFFER; case ALT('f'): return KEY_EMACS_FORWARD_WORD; case ALT('b'): return KEY_EMACS_BACKWARD_WORD; default: return k; } } void printchar(char c) { printw("%c", KT_DISP_FILTER(c)); } void printstring(const string &s) { int i; string ds; for(i = 0; i < s.size(); i++) ds += KT_DISP_FILTER(s[i]); printw("%s", ds.c_str()); } int kwherex() { return getcurx(stdscr); } int kwherey() { return getcury(stdscr); } void kwriteatf(int x, int y, int c, const char *fmt, ...) { char buf[65535]; va_list ap; va_start(ap, fmt); attrset(c); vsprintf(buf, fmt, ap); mvprintw(y, x, ""); printstring(buf); refresh(); } void kwriteat(int x, int y, const char *msg, int c) { attrset(c); mvprintw(y, x, ""); printstring(msg); refresh(); } int keypressed(bool wait) { struct timeval tv; fd_set readfds; tv.tv_sec = tv.tv_usec = 0; FD_ZERO(&readfds); FD_SET(0, &readfds); select(1, &readfds, 0, 0, wait ? 0 : &tv); return FD_ISSET(0, &readfds); } void kgotoxy(int x, int y) { move(y, x); } void setbeep(int freq, int duration) { // freq: 21-32766 // duration: 0-2000 // freq or duration == -2 ==> set the default value if(freq >= 21) printf("\e[10;%d]", freq); else if(freq == -2) printf("\e[10]"); if(duration >= 0) printf("\e[11;%d]", duration); else if(duration == -2) printf("\e[11]"); fflush(stdout); } int string2key(const string &adef) { int r; string d, ck; string::iterator ic; r = 0; d = adef; if((ck = d).find("-") != -1) ck = getrword(d, "-"); if(!ck.empty()) { if((ck.size() > 1) && (toupper(ck[0]) == 'F')) { ck.erase(0, 1); r = atol(ck.c_str()); } else { r = ck[0]; } } if(!d.empty() && r) { for(ic = d.begin(); ic != d.end(); *ic = toupper(*ic), ic++); if(d == "CTRL") r = CTRL(r); else if(d == "ALT") r = ALT(r); else r = 0; } return r ? r : -1; } #ifdef KTOOL_USE_FRIBIDI extern "C" { #include } string makebidi(const string &buf, int lpad) { if(!use_fribidi) return buf; FriBidiChar *us, *out_us; char *outstring, *cbuf; int size; FriBidiCharType base; string r, pad; size = buf.size()+1; us = new FriBidiChar[size]; out_us = new FriBidiChar[size]; outstring = new char[size]; cbuf = strdup(buf.c_str()); // really sick thing base = FRIBIDI_TYPE_N; fribidi_charset_to_unicode(FRIBIDI_CHAR_SET_ISO8859_8,cbuf, buf.size(), us); fribidi_log2vis(us, buf.size(), &base, out_us, 0, 0, 0); fribidi_unicode_to_charset(FRIBIDI_CHAR_SET_ISO8859_8, out_us, buf.size(), outstring); r = outstring; delete us; delete out_us; delete outstring; free (cbuf); /* allocated by c-routine */ if(lpad) { pad.assign(lpad-r.size(), ' '); r.insert(0, pad); } return r; } #else string makebidi(const string &buf, int lpad) { return buf; } #endif int findcolor(const string &s) { int i; string::iterator is; string colors[] = {"TRANSPARENT", "BLACK", "RED", "GREEN", "YELLOW", "BLUE", "MAGENTA", "CYAN", "WHITE", ""}; string ls = s; for(is = ls.begin(); is != ls.end(); *is = toupper(*is), is++); for(i = 0; !colors[i].empty() && (ls != colors[i]); i++); return i-1; } centerim-4.22.10/kkconsui/src/Makefile.in0000644000175000001440000004062411473011437015074 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = kkconsui/src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libsrc_a_AR = $(AR) $(ARFLAGS) libsrc_a_LIBADD = am_libsrc_a_OBJECTS = treeview.$(OBJEXT) colorschemer.$(OBJEXT) \ textinputline.$(OBJEXT) fileselector.$(OBJEXT) \ textwindow.$(OBJEXT) texteditor.$(OBJEXT) dialogbox.$(OBJEXT) \ screenarea.$(OBJEXT) textbrowser.$(OBJEXT) \ abstractui.$(OBJEXT) horizontalbar.$(OBJEXT) \ linkedlist.$(OBJEXT) cmenus.$(OBJEXT) conscommon.$(OBJEXT) libsrc_a_OBJECTS = $(am_libsrc_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libsrc_a_SOURCES) DIST_SOURCES = $(libsrc_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CXXFLAGS = -Wno-write-strings AM_CPPFLAGS = -I$(top_srcdir)/kkconsui/include -I$(top_srcdir)/kkstrtext noinst_LIBRARIES = libsrc.a libsrc_a_SOURCES = treeview.cc colorschemer.cc textinputline.cc fileselector.cc textwindow.cc texteditor.cc dialogbox.cc screenarea.cc textbrowser.cc abstractui.cc horizontalbar.cc linkedlist.cc cmenus.cc conscommon.cc all: all-am .SUFFIXES: .SUFFIXES: .cc .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kkconsui/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu kkconsui/src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libsrc.a: $(libsrc_a_OBJECTS) $(libsrc_a_DEPENDENCIES) -rm -f libsrc.a $(libsrc_a_AR) libsrc.a $(libsrc_a_OBJECTS) $(libsrc_a_LIBADD) $(RANLIB) libsrc.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abstractui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmenus.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/colorschemer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conscommon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialogbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileselector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/horizontalbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linkedlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/screenarea.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textbrowser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texteditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textinputline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/treeview.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/kkconsui/src/fileselector.cc0000644000175000001440000001460111473007750016015 00000000000000#include "fileselector.h" #include #include #include static fileselector *instance; fileselector::fileselector(): otherkeys(0), idle(0) { } fileselector::~fileselector() { } void fileselector::setcolor(int acnormal, int acselected, int accurrent, int acfile) { cnormal = acnormal; cselected = acselected; cfile = acfile; ccurrent = accurrent; } void fileselector::generatemenu() { DIR *d; struct dirent *de; struct stat st; list::iterator i; vector mitems; string prefix, fname; m.clear(); items.clear(); if(dcurrent.substr(dcurrent.size()-1) != "/") dcurrent += "/"; if(d = opendir(dcurrent.c_str())) { while(de = readdir(d)) { fname = dcurrent + de->d_name; if(options & FSEL_DIRSELECT) if(!stat(fname.c_str(), &st)) if(!S_ISDIR(st.st_mode)) continue; if(options & FSEL_CHROOT) if(dcurrent == spoint) if((string) de->d_name == "..") continue; if((string) de->d_name != ".") if(!lstat(fname.c_str(), &st)) { items.push_back(item(de->d_name, st.st_mode)); } } closedir(d); } items.sort(); for(i = items.begin(); i != items.end(); i++) { m.additem(0, (void *) &(*i), i->getprefix() + i->fname); if(find(selected.begin(), selected.end(), dcurrent + i->fname) != selected.end()) { m.setitemcolor(m.getcount()-1, cselected); } if(i->fname == setdcurrent) { m.setpos(m.getcount()-1); } } } void fileselector::exec() { int n; item *i; char buf[512]; dhistitem di; vector::iterator is; bool fin; m = verticalmenu(cnormal, ccurrent); m.setwindow(w); m.otherkeys = &menukeys; m.idle = &menuidle; selected.clear(); if(spoint.empty()) { spoint = getcwd(buf, 512); } if(dcurrent.empty()) { dcurrent = spoint; } if(chdir(dcurrent.c_str())) { chdir((dcurrent = "/").c_str()); } if(spoint.substr(spoint.size()-1) != "/") spoint += "/"; for(fin = finish = false; !fin; ) { generatemenu(); instance = &(*this); fin = !(n = m.open()) || finish; if(!fin) { if(i = (item *) m.getref(n-1)) { setdcurrent = ""; if(!chdir(i->fname.c_str())) { di = dhistitem(); di.dirname = dcurrent; m.getpos(di.pos, di.fpos); if(i->fname != "..") { if(dcurrent.substr(dcurrent.size()-1) != "/") dcurrent += "/"; dcurrent += i->fname; } m.setpos(0); if(i->fname == "..") { if(!dhist.empty()) { di = *(dhist.end()-1); dhist.erase(dhist.end()-1); chdir((dcurrent = di.dirname).c_str()); m.setpos(di.pos, di.fpos); } else { setdcurrent = justfname(di.dirname.substr(0, di.dirname.size()-1)); dcurrent = getcwd(buf, 511); } } else { dhist.push_back(di); } } else { if(fin = (!S_ISDIR(i->mode) || (options & FSEL_DIRSELECT))) { bool multibutempty = (options & FSEL_MULTI) && selected.empty(); if(!(options & FSEL_MULTI) || multibutempty) { selected.push_back(dcurrent + i->fname); fin = true; } } } } } } if(options & FSEL_CHROOT) { for(is = selected.begin(); is != selected.end(); is++) { if(is->substr(0, spoint.size()) == spoint) is->erase(0, spoint.size()); } } } void fileselector::close() { m.close(); } void fileselector::menuidle(verticalmenu &m) { if(instance->idle) { (*(instance->idle))(*instance); } else { keypressed(true); } } int fileselector::menukeys(verticalmenu &m, int k) { string fname; struct stat st; item *i; vector::iterator si; i = (item *) m.getref(m.getpos()); switch(k) { case ' ': if((instance->options & FSEL_DIRSELECT) || (instance->options & FSEL_MULTI)) { if(i) { if(i->fname != "..") { if(!(instance->options & FSEL_MULTI) || instance->selected.empty()) instance->selected.push_back(instance->dcurrent + i->fname); instance->finish = true; } } if(instance->finish) return m.getpos()+1; } break; case KEY_IC: if(instance->options & FSEL_MULTI) { if(i) { if(i->fname != "..") if(!stat(i->fname.c_str(), &st)) { fname = instance->dcurrent + i->fname; si = find(instance->selected.begin(), instance->selected.end(), fname); if(si != instance->selected.end()) { instance->selected.erase(si); m.setitemcolor(m.getpos(), instance->cnormal); } else { instance->selected.push_back(fname); m.setitemcolor(m.getpos(), instance->cselected); } m.setpos(m.getpos()+1); m.redraw(); } } } break; default: if(instance->otherkeys) { (*(instance->otherkeys))(*instance, k); } break; } return -1; } void fileselector::setoptions(int noptions) { options = noptions; } void fileselector::setstartpoint(const string &aspoint) { spoint = aspoint; dcurrent = ""; } void fileselector::setwindow(textwindow awindow) { w = awindow; } vector fileselector::getselected() { return selected; } int fileselector::getlastkey() { return m.getlastkey(); } // ---------------------------------------------------------------------------- string fileselector::item::getprefix() const { string prefix = " "; struct stat st; if(S_ISLNK(mode)) { if(!stat(fname.c_str(), &st)) { prefix = S_ISDIR(st.st_mode) ? "~" : "@"; } } else if(S_ISDIR(mode)) { prefix = "/"; } else if(S_ISREG(mode)) { } else { prefix = "?"; } return prefix; } short fileselector::item::compare(const item &aitem) const { struct stat st[2]; short r = 0; stat(fname.c_str(), &st[0]); stat(aitem.fname.c_str(), &st[1]); if(S_ISDIR(st[0].st_mode) && !S_ISDIR(st[1].st_mode)) r = 1; else if(!S_ISDIR(st[0].st_mode) && S_ISDIR(st[1].st_mode)) r = -1; else { if(fname[0] == '.' && aitem.fname[0] != '.') r = 1; else if(fname[0] != '.' && aitem.fname[0] == '.') r = -1; else r = -strcmp(fname.c_str(), aitem.fname.c_str()); } return r; } bool fileselector::item::operator < (const item &aitem) const { return compare(aitem) > 0; } bool fileselector::item::operator > (const item &aitem) const { return compare(aitem) < 0; } bool fileselector::item::operator == (const string &afname) const { return afname == fname; } bool fileselector::item::operator != (const string &afname) const { return !(*this == afname); } centerim-4.22.10/kkconsui/src/Makefile.am0000644000175000001440000000054311461606612015061 00000000000000AM_CXXFLAGS = -Wno-write-strings AM_CPPFLAGS = -I$(top_srcdir)/kkconsui/include -I$(top_srcdir)/kkstrtext noinst_LIBRARIES = libsrc.a libsrc_a_SOURCES = treeview.cc colorschemer.cc textinputline.cc fileselector.cc textwindow.cc texteditor.cc dialogbox.cc screenarea.cc textbrowser.cc abstractui.cc horizontalbar.cc linkedlist.cc cmenus.cc conscommon.cc centerim-4.22.10/kkconsui/src/cmenus.cc0000644000175000001440000003463611473007750014641 00000000000000/* * * kkconsui various textmode menus classes * $Id: cmenus.cc,v 1.20 2004/03/28 11:38:35 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "cmenus.h" verticalmenu::verticalmenu(int px1, int py1, int px2, int py2, int pncolor, int pscolor) : abstractuicontrol() { initmembers(); setcolor(pncolor, pscolor); setcoords(px1, py1, px2, py2); } verticalmenu::verticalmenu(int pncolor, int pscolor) : abstractuicontrol() { initmembers(); setcolor(pncolor, pscolor); } void verticalmenu::initmembers() { firstdisp = curelem = 0; idle = 0; otherkeys = 0; clearonfocuslost = cycled = exitonedges = false; } void verticalmenu::setcolor(int pncolor, int pscolor) { ncolor = pncolor, scolor = pscolor; } void verticalmenu::clear() { items.clear(); } bool verticalmenu::empty() { return items.empty(); } void verticalmenu::setcoords(int nx1, int ny1, int nx2, int ny2) { x1 = nx1; x2 = nx2; y1 = ny1; y2 = ny2; } void verticalmenu::additemf(const char *fmt, ...) { string buf; VGETSTRING(buf, fmt); additem(buf); } void verticalmenu::additem(const string &text) { additem(ncolor, 0, text); } void verticalmenu::additem(int color, void *ref, const string &text) { verticalmenuitem i; i.text = text; i.color = color ? color : ncolor; i.kind = ITEM_NORM; i.ref = ref; items.push_back(i); } void verticalmenu::additemf(int color, void *ref, const char *fmt, ...) { string buf; VGETSTRING(buf, fmt); additem(color, ref, buf); } void verticalmenu::additem(int color, int ref, const string &text) { additem(color, (void *) ref, text); } void verticalmenu::additemf(int color, int ref, const char *fmt, ...) { string buf; VGETSTRING(buf, fmt); additem(color, (void *) ref, buf); } void verticalmenu::addline() { addline(ncolor, 0); } void verticalmenu::addline(int color, const char *fmt, ...) { verticalmenuitem i; char buf[10240]; va_list ap; if(fmt) { va_start(ap, fmt); vsprintf(buf, fmt, ap); va_end(ap); i.text = buf; i.kind = ITEM_SEP; } else { i.kind = ITEM_LINE; } i.color = color; items.push_back(i); } bool verticalmenu::shownelem(int n, int selected) { bool hlight = true; int extra = 0; unsigned char c; string buf; if((n < 0) || (n >= items.size())) return false; verticalmenuitem &item = items[n]; if(!(selected && item.kind != ITEM_NORM)) { attrset(selected && (item.kind == ITEM_NORM) ? scolor : item.color); if(item.kind == ITEM_LINE) { if(!selected) mvhline(y1+n-firstdisp, x1, HLINE, x2-x1); } else if(!item.text.empty()) { mvprintw(y1+n-firstdisp, x1, ""); buf = item.text; //makebidi(item.text, x2-x1); for(int i = x1; i < x2+extra; i++) { if(i-x1 < buf.size()) { switch(c = buf[i-x1]) { case 1: if(hlight = !hlight) attrset(selected && (item.kind == ITEM_NORM) ? scolor : item.color); else attrset(ncolor); extra++; break; case 2: addch(HLINE); break; case 3: addch(VLINE); break; case 4: addch(RTEE); break; case 5: addch(LTEE); break; case 6: addch(ULCORNER); break; case 7: addch(LLCORNER); break; case 8: addch(LRCORNER); break; case 9: addch(URCORNER); break; default: printchar(c); break; } } else { printw(" "); } } } } return item.kind == ITEM_NORM; } void verticalmenu::showall() { unsigned int p; if(curelem < 0) { curelem = 0; } else if(curelem > items.size()-1) { curelem = items.size()-1; } if((firstdisp+y2-y1 <= curelem) || (curelem < firstdisp)) { firstdisp = curelem-y2+y1+1; } if((firstdisp+y2-y1 > items.size()) && (y2-y1 < items.size())) { firstdisp = items.size()-y2+y1; } else if(firstdisp < 0) { firstdisp = 0; } attrset(ncolor); for(p = firstdisp; (p < firstdisp+y2-y1) && (p < items.size()); p++) { kgotoxy(x1, y1+p-firstdisp); shownelem(p, 0); } for(; p < firstdisp+y2-y1; p++) { mvhline(y1+p-firstdisp, x1, ' ', x2-x1); } } void verticalmenu::redraw() { showall(); kgotoxy(x1, y1+curelem-firstdisp); if(!clearonfocuslost) if(curelem >= 0) shownelem(curelem, 1); refresh(); } void verticalmenu::scale() { if((y2 = y1+items.size()) > LINES-2) y2 = LINES-2; if(!window.empty()) window.y2 = y2; } int verticalmenu::open() { int go, k; if(!window.empty()) window.open(); intredraw(); kgotoxy(x1, y1+curelem-firstdisp); if(clearonfocuslost && curelem >= 0) shownelem(curelem, 1); finished = aborted = false; while(!finished) { if(idle) go = keypressed(); else go = 1; if(go) { k = getkey(); if(emacs) k = emacsbind(k); lastkey = k; switch(k) { case '\r': finished = true; checkclear(); break; case 27: checkclear(); return 0; break; case KEY_UP: if(curelem > 0) { shownelem(curelem, 0); if(--curelem < firstdisp) { firstdisp = curelem - y2 + y1 + 1; intredraw(); } else { int savecurelem = curelem+1; while(curelem >= 0) if(!shownelem(curelem, 1)) { curelem--; } else { break; } if(curelem < 0) shownelem(curelem = savecurelem, 1); refresh(); } } else if(exitonedges) { finished = true; } else if(cycled) { curelem = items.size()-1; if((firstdisp = curelem-y2+y1+1) < 0) firstdisp = 0; intredraw(); } break; case KEY_DOWN: if(!items.empty()) { if(curelem < items.size()-1) { shownelem(curelem++, 0); if(curelem > firstdisp+y2-y1-1) { firstdisp += y2 - y1; intredraw(); } else { bool lastone; int savecur = curelem-1; while(curelem < items.size()) { if(!(lastone = shownelem(curelem, 1))) curelem++; else break; } if(!lastone) shownelem(curelem = savecur, 1); refresh(); } } else if(exitonedges) { finished = true; } else if(cycled) { curelem = firstdisp = 0; intredraw(); } } break; case KEY_PPAGE: if((curelem -= y2-y1) < 0) { if(finished = exitonedges) continue; curelem = 0; } firstdisp = curelem; intredraw(); break; case KEY_NPAGE: if(!items.empty()) { if((curelem += y2-y1) > items.size()-1) { if(finished = exitonedges) continue; curelem = items.size()-1; } if((firstdisp = curelem-y2+y1+1) < 0) firstdisp = 0; } intredraw(); break; case KEY_HOME: curelem = firstdisp = 0; intredraw(); finished = finished || exitonedges; break; case KEY_END: curelem = items.size()-1; if((firstdisp = curelem-y2+y1+1) < 0) firstdisp = 0; intredraw(); finished = finished || exitonedges; break; default: if(otherkeys) { if((go = (*otherkeys)(*this, k)) != -1) { checkclear(); return go; } } break; } } else { if(idle) (*idle)(*this); } } return curelem+1; } int verticalmenu::getcount() { return items.size(); } int verticalmenu::getlastkey() { return lastkey; } void *verticalmenu::getref(int n) { return (n >= 0) && (n < items.size()) ? items[n].ref : 0; } int verticalmenu::getpos() { return curelem; } void verticalmenu::getpos(int &cur, int &first) { cur = curelem; first = firstdisp; } void verticalmenu::setpos(int cur, int first) { curelem = cur; if(first != -1) firstdisp = first; } void verticalmenu::setitemcolor(int pos, int color) { if((pos >= 0) && (pos < items.size())) { items[pos].color = color; } } void verticalmenu::setwindow(textwindow nwindow) { window = nwindow; setcoords(window.x1+1, window.y1+1, window.x2, window.y2); } void verticalmenu::remove(int pos) { vector::iterator ii; int i; if((pos >= 0) && (pos < items.size())) { for(i = 0, ii = items.begin(); ii != items.end() && i < pos; i++, ii++); items.erase(ii); } } void verticalmenu::close() { window.close(); } void verticalmenu::checkclear() { if(window.isopen()) if(clearonfocuslost) shownelem(curelem, 0); } void verticalmenu::intredraw() { bool scf = clearonfocuslost; if(curelem >= 0 && curelem < items.size()) { vector::iterator ii; for(ii = items.begin()+curelem; ii != items.end(); ii++) { if(ii->kind == ITEM_NORM) { curelem = ii-items.begin(); break; } } for(ii = items.begin()+curelem; ii != items.begin(); ii--) { if(ii->kind == ITEM_NORM) { curelem = ii-items.begin(); break; } } } clearonfocuslost = false; redraw(); clearonfocuslost = scf; } verticalmenu::~verticalmenu() { } // -------------------------------------------------------------------------- horizontalmenu *currenthmenu; horizontalmenu::horizontalmenu(int x, int y, int normcolor, int selcolor, int framecolor) { ncolor = normcolor; scolor = selcolor; fcolor = framecolor; coordy = y; coordx = x; otherkeys = 0; } horizontalmenu::horizontalmenu() { coordy = coordx = 0; } horizontalmenu::~horizontalmenu() { } #define HM_RIGHT 50001 #define HM_LEFT 50002 #define HM_CLOSE 50003 int horizontalmenu::menu_otherkeys(verticalmenu &ref, int k) { switch(k) { case KEY_RIGHT : return HM_RIGHT; case KEY_LEFT : return HM_LEFT; case KEY_F(10) : return HM_CLOSE; default: if(currenthmenu->otherkeys) { currenthmenu->finished = currenthmenu->otherkeys(*currenthmenu, k); return currenthmenu->finished ? 0 : -1; } } return -1; } void horizontalmenu::additem(int color, const string &text) { horizontalmenuitem i; i.text = text; i.color = color ? color : ncolor; menus.push_back(i); } void horizontalmenu::additem(const string &text) { additem(0, text); } void horizontalmenu::additemf(int color, const char *fmt, ...) { va_list ap; char buf[1024]; va_start(ap, fmt); vsprintf(buf, fmt, ap); va_end(ap); additem(color, buf); } void horizontalmenu::additemf(const char *fmt, ...) { va_list ap; char buf[1024]; va_start(ap, fmt); vsprintf(buf, fmt, ap); va_end(ap); additem(0, buf); } int horizontalmenu::getx(int n) { int i, l = 0; for(i = 0; i < n; i++) l += menus[i].text.size(); if(n > 0) l += n*2; return l+coordx; } int horizontalmenu::menulen(int n) { verticalmenu m = menus[n].menu; vector::iterator i; int l = 0; for(i = m.items.begin(); i != m.items.end(); i++) { if(!i->text.empty() && (i->text.size() > l)) l = i->text.size(); } return l; } void horizontalmenu::redraw() { int sv = selected; selected = -1; draw(); selected = sv; } void horizontalmenu::draw() { vector::iterator i; int n; attrset(ncolor); mvhline(coordy, 0, ' ', COLS); for(n = 0, i = menus.begin(); i != menus.end(); i++, n++) { kgotoxy(getx(n), coordy); if(n == selected) attrset(scolor); else attrset(ncolor); printstring(i->text); } refresh(); } void horizontalmenu::moveelem(int old) { attrset(menus[old].color); kgotoxy(getx(old), coordy); printstring(menus[old].text); attrset(scolor); kgotoxy(getx(selected), coordy); printstring(menus[selected].text); } bool horizontalmenu::open(int *hor, int *pulld) { bool done = false; int ch, osel, oact = 0; verticalmenu *m; if((selected < 0) || (selected >= menus.size())) selected = 0; saveline(); draw(); for(finished = false; !finished; ) { if(!oact) { ch = getkey(); if(emacs) ch = emacsbind(ch); } else { ch = oact; } osel = selected; switch(ch) { case KEY_RIGHT: if(++selected >= menus.size()) selected = 0; moveelem(osel); break; case KEY_LEFT: if(--selected < 0) selected = menus.size()-1; moveelem(osel); break; case '\r': case KEY_DOWN: m = pulldown(selected); if(!m->items.empty()) { m->scale(); m->x2 = m->x1 + menulen(selected) + 1; m->window.x2 = m->x2; currenthmenu = this; int r = m->open(); switch(r) { case HM_RIGHT: oact = KEY_RIGHT; break; case HM_LEFT: oact = KEY_LEFT; break; case HM_CLOSE: oact = KEY_F(10); break; default: if(r) { if(pulld) *pulld = r; if(hor) *hor = selected+1; done = finished = true; } } m->close(); if(r == HM_RIGHT || r == HM_LEFT) continue; } else if(!oact) { if(pulld) *pulld = 0; if(hor) *hor = selected+1; done = finished = true; } break; case KEY_F(10): case 27: finished = true; break; default: if(otherkeys) { done = finished = (*otherkeys)(*this, ch); } break; } if(oact == KEY_RIGHT || oact == KEY_LEFT) oact = '\r'; else oact = 0; } restoreline(); return done; } void horizontalmenu::close() { } void horizontalmenu::saveline() { screenbuffer.save(0, coordy, COLS, coordy); } void horizontalmenu::restoreline() { screenbuffer.restore(); } verticalmenu *horizontalmenu::pulldown(int n) { if((n >= 0) && (n < menus.size())) { menus[n].menu.setcolor(ncolor, scolor); menus[n].menu.otherkeys = &menu_otherkeys; menus[n].menu.cycled = true; menus[n].menu.setwindow(textwindow(getx(n)-1, coordy+1, getx(n)+2, coordy+6, fcolor)); return &menus[n].menu; } else { return 0; } } // -------------------------------------------------------------------------- #ifdef __KTOOL_USE_NAMESPACES using ktool::horizontalmenuitem; #endif horizontalmenuitem::horizontalmenuitem() { } horizontalmenuitem::horizontalmenuitem(const horizontalmenuitem &a) { text = a.text; color = a.color; menu = a.menu; } horizontalmenuitem::~horizontalmenuitem() { } centerim-4.22.10/kkconsui/src/abstractui.cc0000644000175000001440000000320311461606612015471 00000000000000/* * * kkconsui abstract ui control class * $Id: abstractui.cc,v 1.7 2003/11/05 09:10:27 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "abstractui.h" abstractuicontrol::abstractuicontrol() : fisopen(false), finished(false), aborted(false), emacs(false), x1(0), x2(0), y1(0), y2(0) { } abstractuicontrol::abstractuicontrol(const abstractuicontrol &a) : fisopen(a.fisopen), finished(a.finished), emacs(a.emacs), aborted(a.aborted), x1(a.x1), x2(a.x2), y1(a.y1), y2(a.y2) { } abstractuicontrol::~abstractuicontrol() { } bool abstractuicontrol::empty() const { return !x1 && !x2 && !y1 && !y2; } void abstractuicontrol::redraw() { } void abstractuicontrol::close() { screenbuffer.restore(); fisopen = false; } bool abstractuicontrol::isopen() const { return fisopen; } bool abstractuicontrol::getaborted() const { return aborted; } void abstractuicontrol::abort() { finished = aborted = true; } centerim-4.22.10/kkconsui/src/colorschemer.cc0000644000175000001440000000136111461606612016020 00000000000000#include "colorschemer.h" void parsecolordef(const string sdef, int pair, colordef &d) { int pos, i, npos; string r, p; r = sdef; for(i = 0; i < 3; i++) { if((pos = r.find_first_of(" \t")) == -1) pos = r.size(); p = r.substr(0, pos); if(pos != r.size()) { npos = r.substr(pos+1).find_first_not_of(" \t"); if(npos == -1) npos = 0; r.erase(0, pos+1+npos); } if(i == 0) { d.name = p; } else if(i == 1) { if((pos = p.find("/")) != -1) { init_pair(pair, findcolor(p.substr(0, pos)), findcolor(p.substr(pos+1))); d.code = normalcolor(pair); d.def = p; } } else if(i == 2) { if(p == "bold") { d.code = boldcolor(pair); d.def += (string) "\t" + p; } } } } centerim-4.22.10/kkconsui/src/dialogbox.cc0000644000175000001440000001706511461606612015313 00000000000000/* * * kkconsui dialogbox class * $Id: dialogbox.cc,v 1.14 2003/10/19 23:25:05 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "dialogbox.h" dialogbox *dialogbox::it; dialogbox::dialogbox(): first(true), menu(0), tree(0), window(0), bar(0), browser(0), otherkeys(0), idle(0) { freemenu = freetree = freewindow = freebar = freebrowser = false; } dialogbox::~dialogbox() { if(menu && freemenu) delete menu; if(tree && freetree) delete tree; if(bar && freebar) delete bar; if(window && freewindow) delete window; if(browser && freebrowser) delete browser; } void dialogbox::setwindow(textwindow *neww, bool fw) { window = neww; freewindow = fw; } void dialogbox::setbar(horizontalbar *newb, bool fb) { bar = newb; freebar = fb; } void dialogbox::setmenu(verticalmenu *newm, bool fm) { menu = newm; freemenu = fm; } void dialogbox::settree(treeview *newt, bool ft) { tree = newt; freetree = ft; } void dialogbox::setbrowser(textbrowser *newbr, bool fbr) { browser = newbr; freebrowser = fbr; } verticalmenu *dialogbox::getmenu() { return menu; } treeview *dialogbox::gettree() { return tree; } textwindow *dialogbox::getwindow() { return window; } horizontalbar *dialogbox::getbar() { return bar; } textbrowser *dialogbox::getbrowser() { return browser; } bool dialogbox::open(int &menuitem, int &baritem, void **ref) { bool ret = false; list::iterator i; it = this; if(first) redraw(); if(menu) { menuitem = menu->open(); if(ref) *ref = menu->getref(menuitem-1); ret = menuitem || (menu->getlastkey() != KEY_ESC); } else if(tree) { void *r; r = tree->open(&menuitem); if(ref) *ref = r; ret = menuitem || (tree->menu.getlastkey() != KEY_ESC) || r; } else if(browser) { menuitem = browser->open(); ret = menuitem; } else if(bar) { bool fin, proceed; int k; menuitem = 0; for(fin = false; !fin; ) { proceed = idle ? keypressed() : true; it = this; if(proceed) switch(k = getkey()) { case KEY_LEFT: case KEY_RIGHT: bar->movebar(k); bar->redraw(); break; case '\r': fin = ret = true; break; case KEY_ESC: fin = true; ret = false; break; default: i = find(it->kba.begin(), it->kba.end(), k); if(i != it->kba.end()) { if(it->bar) { it->bar->item = i->baritem; it->bar->redraw(); fin = ret = true; } } else if(otherkeys) if((k = otherkeys(*this, k)) != -1) { menuitem = k; fin = true; } break; } else { if(idle) idle(*this); } } } if(bar) { baritem = bar->item; } else { baritem = 0; } return ret; } bool dialogbox::open(int &menuitem) { int bi; return open(menuitem, bi); } bool dialogbox::open() { int menuitem, bi; return open(menuitem, bi); } void dialogbox::redraw() { if(window) { if(window->isopen()) window->redraw(); else window->open(); if(bar) { if(window->isbordered()) { window->separatey(window->y2-window->y1-2); } bar->setcoords(window->x2 - (window->isbordered() ? 1 : 2), window->y2-1); bar->align(baleft); bar->redraw(); } int x1 = window->x1 + (window->isbordered() ? 1 : 0); if(menu) { menu->setcoords(x1, window->y1+1, window->x2, bar ? window->y2-2 : window->y2); menu->idle = &menuidle; menu->otherkeys = &menukeys; } else if(tree) { tree->setcoords(x1, window->y1+1, window->x2, bar ? window->y2-2 : window->y2); tree->redraw(); tree->menu.idle = &menuidle; tree->menu.otherkeys = &menukeys; } else if(browser) { int x2 = window->x2 - (window->isbordered() ? 1 : 0); browser->setcoords(window->x1+1, window->y1+1, x2, bar ? window->y2-2 : window->y2); browser->redraw(); browser->idle = &browseridle; browser->otherkeys = &browserkeys; } } first = false; } void dialogbox::close() { if(window) window->close(); } void dialogbox::clearkeys() { kba.clear(); } void dialogbox::addkey(int key, int baritem) { kba.push_back(keybarassociation(key, baritem)); } void dialogbox::addautokeys() { int key; vector::const_iterator i; string::const_iterator c; if(bar) { for(i = bar->items.begin(); i != bar->items.end(); i++) { for(c = i->begin(); (c != i->end()) && !isupper(*c); c++); key = (c == i->end()) ? *i->begin() : *c; addkey(tolower(key), i-bar->items.begin()); addkey(toupper(key), i-bar->items.begin()); } } } void dialogbox::menuidle(verticalmenu &caller) { if(it->idle) { it->idle(*it); } else { fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds); select(1, &fds, 0, 0, 0); } } void dialogbox::browseridle(textbrowser &caller) { if(it->idle) { it->idle(*it); } else { fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds); select(1, &fds, 0, 0, 0); } } int dialogbox::menukeys(verticalmenu &caller, int k) { list::iterator i; int ip; dialogbox *sit; switch(k) { case KEY_LEFT: case KEY_RIGHT: if(it->bar) { it->bar->movebar(k); it->bar->redraw(); } break; case '-': case '+': if(it->tree) if(it->tree->collapsable) { int nid = it->tree->getid(it->tree->menu.getpos()); if(it->tree->isnode(nid)) { if(it->tree->isnodeopen(nid)) it->tree->closenode(nid); else it->tree->opennode(nid); it->tree->menu.redraw(); } } default: i = find(it->kba.begin(), it->kba.end(), k); if(i != it->kba.end()) { if(it->bar) { it->bar->item = i->baritem; it->bar->redraw(); } if(it->menu) { return it->menu->getpos()+1; } else if(it->tree) { return it->tree->menu.getpos()+1; } } else { if(it->otherkeys) { sit = it; ip = it->otherkeys(*it, k); it = sit; return ip; } } break; } return -1; } int dialogbox::browserkeys(textbrowser &caller, int k) { list::iterator i; int ip; dialogbox *sit; switch(k) { case KEY_LEFT: case KEY_RIGHT: if(it->bar) { it->bar->movebar(k); it->bar->redraw(); } break; case '\r': return 1; default: i = find(it->kba.begin(), it->kba.end(), k); if(i != it->kba.end()) { if(it->bar) { it->bar->item = i->baritem; it->bar->redraw(); } return 1; } else { if(it->otherkeys) { sit = it; ip = it->otherkeys(*it, k); it = sit; return ip; } } break; } return -1; } // ---------------------------------------------------------------------------- dialogbox::keybarassociation::keybarassociation(int nkey, int nbarit) { key = nkey; baritem = nbarit; } bool dialogbox::keybarassociation::operator == (const int akey) { return key == akey; } bool dialogbox::keybarassociation::operator != (const int akey) { return !(*this == akey); } centerim-4.22.10/kkconsui/src/linkedlist.cc0000644000175000001440000000662211461606612015502 00000000000000/* * * kkconsui linkedlist class * $Id: linkedlist.cc,v 1.2 2001/06/03 21:12:05 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "linkedlist.h" linkedlist::linkedlist(): count(0), flist(0), freeitem(0) { } linkedlist::~linkedlist() { empty(); // if(flist) delete flist; } void linkedlist::add(void *p) { flinkedlist *l = flist, *k = new flinkedlist; k->data = p; k->next = 0; if(!count) flist = k; else { for(i = 0; i < count-1; i++, l = l->next); l->next = k; } count++; } void linkedlist::insert(int n, void *p) { if(n <= count) { flinkedlist *l = flist, *k = new flinkedlist; for(i = 0; i < n-1; i++, l = l->next); k->data = l->data; l->data = p; k->next = l->next; l->next = k; count++; } else{ add(p); } } void linkedlist::remove(int n) { flinkedlist *l = flist, *pr; if((n < count) && (n >= 0)) { if(!n) { flist = l->next; if(freeitem) freeitem(l->data); else free(l->data); delete l; } else { for(pr = 0, i = 0; i < n; i++, l = l->next) { if(i == n-1) pr = l; } if(pr) { pr->next = l->next; if(freeitem) freeitem(l->data); else free(l->data); delete l; } } count--; } } void linkedlist::empty() { flinkedlist *l, *p; for(i = 0, l = flist; i < count && l; i++) { p = l; l = l->next; if(freeitem) freeitem(p->data); else free(p->data); delete p; } count = 0; } void* linkedlist::at(int n) { flinkedlist *l = flist; if((n < count) && (n >= 0) && l) { for(i = 0; i < n; i++, l = l->next); return l->data; } else { return 0; } } void* linkedlist::find(void *p, listcompare *compare) { void *l; for(i = 0; i < count; i++) { l = at(i); if(!compare(p, l)) return l; } return 0; } int linkedlist::findnum(void *p, listcompare *compare) { void *l; for(i = 0; i < count; i++) { l = at(i); if(!compare(p, l)) return i; } return -1; } void linkedlist::sort(listcompare *compare) { int i; flinkedlist *f; void *tempdata; for(i = 0; i < count; i++) for(f = flist; f && f->next; f = f->next) { if(compare(f->next->data, f->data) > 0) { tempdata = f->data; f->data = f->next->data; f->next->data = tempdata; } } } void linkedlist::replace(int n, void *p) { flinkedlist *l = flist; if(n < count) { for(i = 0; i < n; i++, l = l->next); if(l->data != p) { if(freeitem) freeitem(l->data); else free(l->data); l->data = p; } } else add(p); } void *linkedlist::foreach(listforeachfunc *exec, void *arg) { flinkedlist *l = flist; void *ret = 0; for(; !ret && l; l = l->next) { ret = exec(l->data, arg); } return ret; } centerim-4.22.10/kkconsui/src/textwindow.cc0000644000175000001440000001063411461606612015552 00000000000000/* * * kkconsui textwindow class * $Id: textwindow.cc,v 1.9 2002/11/23 15:42:09 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "textwindow.h" textwindow::textwindow() { x1 = x2 = y1 = y2 = options = 0; } textwindow::textwindow(int xx1, int yy1, int xx2, int yy2, int wcolor, int noptions, int tcolor, const char *tfmt, ...) { char buf[10240]; setoptions(noptions); setcoords(xx1, yy1, xx2, yy2); setcolor(wcolor); if(tfmt) { va_list ap; va_start(ap, tfmt); vsprintf(buf, tfmt, ap); va_end(ap); set_title(tcolor, buf); } } textwindow::textwindow(const textwindow &aw): abstractuicontrol(aw) { title = aw.title; wc = aw.wc; tc = aw.tc; options = aw.options; } textwindow::~textwindow() { } void textwindow::setcoords(int ax1, int ay1, int ax2, int ay2) { x1 = ax1; x2 = ax2; y1 = ay1; y2 = ay2; if(options & TW_CENTERED) { int h = y2-y1, w = x2-x1; y1 = (LINES-h)/2; y2 = y1 + h; x1 = (COLS-w)/2; x2 = x1 + w; } } void textwindow::setcolor(int awc) { wc = awc; } void textwindow::setoptions(int aoptions) { options = aoptions; setcoords(x1, y1, x2, y2); } void textwindow::set_titlef(int color, const char *fmt, ...) { va_list ap; char buf[10240]; va_start(ap, fmt); vsprintf(buf, fmt, ap); va_end(ap); set_title(color, buf); } void textwindow::set_title(int color, const string &atitle) { title = atitle; tc = color; if(fisopen) { attrset(wc); mvhline(y1, x1+1, HLINE, x2-x1-1); write(((x2 - x1) - title.size())/2, 0, tc, title); } } void textwindow::writef(int x, int y, const char *fmt, ...) { char buf[10240]; va_list ap; va_start(ap, fmt); vsprintf(buf, fmt, ap); va_end(ap); write(x, y, wc, buf); } void textwindow::writef(int x, int y, int c, const char *fmt, ...) { char buf[10240]; va_list ap; va_start(ap, fmt); vsprintf(buf, fmt, ap); va_end(ap); write(x, y, c, buf); } void textwindow::write(int x, int y, const string &text) { write(x, y, wc, text); } void textwindow::write(int x, int y, int c, const string &text) { int i; string dtext; if(fisopen && (y < y2-y1)) { for(i = 0; (i < text.size()) && (i < x2-x1-x); i++) dtext += KT_DISP_FILTER(text[i]); attrset(c); mvprintw(y1 + y, x1 + x, "%s", dtext.c_str()); refresh(); } } void textwindow::gotoxy(int x, int y) { if(fisopen) kgotoxy(x1 + x, y1 + y); } void textwindow::redraw() { if(fisopen) { int i; attrset(wc); if(options & TW_NOBORDER) { for(i = y1; i < y2; i++) mvhline(i, x1, ' ', x2-x1); } else { for(i = y1; i <= y2; i++) mvhline(i, x1, ' ', x2-x1+1); if(!(options & TW_SPACEBORDER)) { mvaddch(y1, x1, ULCORNER); mvaddch(y2, x2, LRCORNER); mvaddch(y1, x2, URCORNER); mvaddch(y2, x1, LLCORNER); mvvline(y1 + 1, x1, VLINE, y2-y1-1); mvvline(y1 + 1, x2, VLINE, y2-y1-1); mvhline(y1, x1 + 1, HLINE, x2-x1-1); mvhline(y2, x1 + 1, HLINE, x2-x1-1); } } if(!title.empty()) { attrset(tc); mvprintw(y1, x1+((x2-x1)-title.size())/2, "%s", title.c_str()); } refresh(); } } void textwindow::open() { if(!fisopen) { fisopen = true; screenbuffer.save(x1, y1, x2, y2); redraw(); } } void textwindow::separatey(int y) { attrset(wc); mvhline(y1 + y, x1 + 1, HLINE, x2 - x1 - 1); mvaddch(y1 + y, x1, LTEE); mvaddch(y1 + y, x2, RTEE); refresh(); } void textwindow::separatex(int x) { attrset(wc); mvvline(y1 + 1, x1 + x, VLINE, y2 - y1 - 1); mvaddch(y1, x1 + x, TTEE); mvaddch(y2, x1 + x, BTEE); refresh(); } bool textwindow::isbordered() { return !(options & TW_NOBORDER); } void textwindow::close() { abstractuicontrol::close(); } centerim-4.22.10/kkconsui/src/screenarea.cc0000644000175000001440000000556311461606612015453 00000000000000/* * * a class for saving and restoring screen areas * $Id: screenarea.cc,v 1.1 2001/06/27 13:42:07 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "screenarea.h" screenarea::screenarea() { } screenarea::screenarea(int fx1, int fy1, int fx2, int fy2) { save(fx1, fy1, fx2, fy2); } screenarea::~screenarea() { freebuffer(); } void screenarea::save() { save(0, 0, COLS, LINES); } void screenarea::save(int fx1, int fy1, int fx2, int fy2) { int i; chtype *line; #ifdef HAVE_NCURSESW wchar_t *line2; #endif freebuffer(); for(i = 0; i <= fy2-fy1; i++) { line = new chtype[fx2-fx1+2]; #ifdef HAVE_NCURSESW line2 = new wchar_t[fx2-fx1+2]; #endif mvinchnstr(fy1+i, fx1, line, fx2-fx1+1); #ifdef HAVE_NCURSESW mvinnwstr(fy1+i, fx1, line2, fx2-fx1+1); #endif buffer.push_back(line); #ifdef HAVE_NCURSESW buffer2.push_back(line2); #endif } x1 = fx1; y1 = fy1; x2 = fx2; y2 = fy2; } void screenarea::restore() { restore(x1, y1, x2, y2); } void screenarea::restore(int fx1, int fy1, int fx2, int fy2) { vector::iterator i; #ifdef HAVE_NCURSESW vector::iterator j; #endif int k = fy1; chtype *line; #ifdef HAVE_NCURSESW wchar_t *line2; #endif int l; if(!buffer.empty()) { #ifdef HAVE_NCURSESW for(i = buffer.begin(), j = buffer2.begin(); i != buffer.end(); i++, j++) { #else for(i = buffer.begin(); i != buffer.end(); i++) { #endif line = *i; #ifdef HAVE_NCURSESW line2 = *j; const chtype *line_ptr = line; const wchar_t *line2_ptr = line2; for(l = 0; l < fx2-fx1+1; l++, line_ptr++, line2_ptr++ ) { attrset( (*line_ptr & A_COLOR) | (*line_ptr & A_ATTRIBUTES) ); mvaddnwstr(k, fx1+l, line2_ptr, 1); } k++; #else mvaddchnstr(k++, fx1, line, fx2-fx1+1); #endif } refresh(); } freebuffer(); } void screenarea::freebuffer() { while(!buffer.empty()) { delete[] buffer.front(); buffer.erase(buffer.begin()); } #ifdef HAVE_NCURSESW while(!buffer2.empty()) { delete[] buffer2.front(); buffer2.erase(buffer2.begin()); } #endif } bool screenarea::empty() { return buffer.empty(); } centerim-4.22.10/kkconsui/src/textbrowser.cc0000644000175000001440000000601311461606612015722 00000000000000/* * * kkconsui textbrowser class * $Id: textbrowser.cc,v 1.13 2002/11/23 15:42:08 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "textbrowser.h" textbrowser::textbrowser(int nx1, int ny1, int nx2, int ny2, int clr) { setcoords(nx1, ny1, nx2, ny2); setcolor(clr); idle = 0; otherkeys = 0; } textbrowser::textbrowser(int clr) { setcolor(clr); idle = 0; otherkeys = 0; } textbrowser::~textbrowser() { } void textbrowser::setcolor(int clr) { ncolor = clr; } void textbrowser::setcoords(int nx1, int ny1, int nx2, int ny2) { x1 = nx1; x2 = nx2; y1 = ny1; y2 = ny2; setbuf(buf); } void textbrowser::redraw() { draw(line); } bool textbrowser::empty() { return lines.empty(); } void textbrowser::draw(int line) { int i, k; string buf; attrset(ncolor); for(i = line; (i-line < y2-y1) && (i < lines.size()); i++) { mvprintw(y1+i-line, x1, ""); buf = makebidi(lines[i], x2-x1); printstring(buf); for(k = buf.size(); k < x2-x1; k++) printw(" "); } for(; i-line < y2-y1; i++) mvhline(y1+i-line, x1, ' ', x2-x1); refresh(); } void textbrowser::setbuf(const string &p) { line = 0; buf = p; if(x2-x1 > 1) breakintolines(buf = p, lines, x2-x1); if((endline = lines.size()-y2+y1+1) < 0) endline = 0; } int textbrowser::open() { bool go; int res, ch; finished = aborted = false; screenbuffer.save(x1, y1, x2, y2); draw(line); while(!finished) { if(idle) go = keypressed(); else go = true; if(go) switch(ch = getkey()) { case KEY_UP: case KEY_DOWN: case KEY_PPAGE: case KEY_NPAGE: case KEY_END: case KEY_HOME: move(ch); draw(line); break; case KEY_F(10): case 27: res = 0; finished = true; break; default: if(otherkeys) { res = (*otherkeys)(*this, ch); if(res >= 0) finished = true; } } else { if(idle) (*idle)(*this); } } return res; } void textbrowser::move(int k) { switch(k) { case KEY_UP: if(--line < 0) line = 0; break; case KEY_DOWN: if(++line > endline) line = endline; break; case KEY_PPAGE: if((line -= y2-y1) < 0) line = 0; break; case KEY_NPAGE: if((line += y2-y1) > endline) line = endline; break; case KEY_END: line = endline; break; case KEY_HOME: line = 0; break; } } centerim-4.22.10/share/0000755000175000001440000000000011473011460011562 500000000000000centerim-4.22.10/share/offline.wav0000644000175000001440000046036011461606612013662 00000000000000RIFFè`WAVEfmt "VˆXdata\` '%FCytÔÍse[DšuV»e© 1 f t¦LS¾©Å•Jû|MàæxGÑh÷4財è)Ú’÷.|Ã4\ü2§*^ñ™Í ‡ ZE … žÖ ­®«”š‡w†AøŸ °5 ¾Å ÉQ Ñÿß×þsàý êü²öû^û úâÿ ùÄþøÀýõöàüæõ;üÓôÖû½ó¡û¥òûŒñ\ûpðñúPïhú0î©ùíÆø ìÌ÷ ëÇöê½õ<é¨ôhè†ó çRòèæ ñMæºïÏånîpå.í0åìåñêåêSåNéÇåÎèwæ…èMç^è)èDèûè#èÏéèÈêèì„è×íeéüï¨êEòìgôqí;ö‘îÐ÷‚ïaù{ð5ûÀñxýtó‹õÕÔ÷g ú›ük ¨ý ÿ r6éú’Êi…T0 aÖ r, N( ûä †‡/‹ï¾º†sCrÓXT|¿rq,'¼Ø&‚oŸ¦¨%ŠšDÞd ^· Î 9p ©î  ›I "  ° ¨ C * ÜŽzïi mÓ§Õm“ÿ Uþ‚ýÚÓû(‹ú{?ùÙê÷=“ö:õïßó*„òLÿ$ñUþÀïJý\î-üöìûëÜù1ê·øäè—÷¥çöræiõKåLô1ä$ó&ãùñ0âÖðYáÂï£àÂî àÛí–ß íGß]ì1ßÐëUßoë¯ß:ë5àëÓàëráìêâÛêøâôê0ä^ëÛå/ìëçSí+ê—îbìÃïcî¼ð.ð’ñ÷ñsòÿó—ósöõSùýörüù‹ÿôú[¯üÌ'þïrÿò° M yÀ<¿˜`¬Ô e Äê â” Ù ½§ ”H`÷Ÿ ói vøMÀsº'oò(ëà11TÁ /D È &: K¬ O 8ˆ ø ïx ¶ gÃû…vAØæ+owæÄ b út ´Ù‰D`²!ºŽ1øÿ’^þòÃüW'ûÆù9û÷¤jöÿÿÙôDÿEóqþ®ñ‰ýðüvîŒûÙìƒúEë~ù¿é~øIè…÷ßæ‘öå˜õ/ä™ôéâ—ó¸á™ò à¨ñ¨ßÅðÍÞøïÞ@ï{ݦîÝ-îçÜÜíëܲíÝ›íQ݇í–ÝmíìÝ]íuÞuí\ßÕí´àîkâ“ïSä²ð4æ¼ñæçšòré\óë*ôéì2õ=ïöò8øõþùøµûèú<ý\ýŒþŠÿ·ÿ¥ØäiR0 ¹ -ßšcãƒô @Æ ¾` $Ø ”L Ñ œd ñ 7c ¦” °Ô Šã HÖ ý ¼ ³ ˜ m a ' Þ —ˆ ÷" -® 93 $µ û6 ˹ ™; g¼5Bûز‚YBó „Çq¤ : ‹Ô oÎ š¦u=IÐ^œéÿrþ†öüô}ûkúè‹øf÷Ùÿ›õ;ÿô‡þœòÀýñæü’ïüîû˜ì*ú0ëDùÔédø‚è‰÷;ç¯öÿåÎõÐäìô³ã ô¯â5óÊáiòá¬ñYàñØß|ð†ßðcßÈïqߥï£ß“ïèß„ï5àpï’àcïázïâÏïOãtðòäZñÀæYò€èFóêô†ë¿ôí}õ×înöñ«÷¾ó&ù—ö»ú]ùBüàû¡ýþÓþåÿ%ñQ²1< oÍ ¸Eý„'{" %è –z èè /N }Á ÎA ¾ (% öe vq °Q ´ ˜È q€ C9 ô º¯ J^ ³þ ô    ü) â·ÇI­Ú“lqC¤[¿ në ¬Ä Xr ó# ‹Ö1Šï<Äë¡•p;#Úÿ¹tþ8 ý¯¢û*;ú¬Óø3j÷¶ÿö+ÿôþóàýªñý6ðPüÅî|û^í¤úìÏù¹êùwé9ø?èr÷ç¨ö÷åÞõëäõúãUô'ã›ópâðòÓáTòWáÐñ áhñëà$ñýàñ5áñð„áæðÚá×ð>âÍðÓââðºã0ñåÆñžæ—ò]èó êZôŽëõóìºõoîlö<ðK÷sònøõÉù±÷;ûAú¢ü‘üåý¤þÿšžÇn <½ hî ô ÊlH ÜÕ $= P™ pý m ¨ß ¤= hz éˆ $j )0 ê Û¤ ©_ l Ù ®‹ 1 kÇ “T £Ý g—ú‹”~1rÌ`gF²íq² <s 3 Íó |´vÂ9sü=ºtñ'ºÔÿgzþùý|¿ûúbúù ¤÷–ÿDöÿÞôþtóõý òHýŸðŽü:ïËûÝíûŽì@úLë~ùêÂøæè øÆçP÷µæ˜öºååõÕä7õäŒôfãíóÖâ]ófâàò!â~ò â<ò(âòfâ ò¹âòãôñ|ãìñäþñýäCòEæËò×ç‰óˆé`ô+ë-õ¦ìÞõ î|öï#÷\ñô÷ŒóùöCúŒøšûòúèüýþÿ$ÿ  7r§ À '¸ 7•8UóÐhZ ­À È Åm ¶Ï ¤4 ‚‹ 7Å ¶Ö ø» ÿ„ ÜA £ù c² o È, ^ã Ø 1) k¼‹F™Ñdœ™¥—Kíƒn4Pç* «ý }Ë L™ f¿3hÏÒš£`}SÕÿ„þ¾.ýQ×û×~ú]%ùéÿÌ÷yÿpöÿõ‰þ­óþJògýæð¾ü‡ï ü2îWûçìžúªëçùxê5ùQ釸:èÛ÷2ç1÷@æögåìõ«äQõ ä¼ôã4ôãÀóââaóÖâ"óûâóBãôòžãìòäãò|äÝòåðò æ.óKç§óÑèTôuêõìÚõ‰í‚öõî÷ð·÷Oò{øqôvùÎö ú8ùâûûý•ý:þ‡ÿ:ÿt$y ˜÷½ìÑ çÁ ç’ çKØô¯ˆeüðCT U¤ @ô L Ù§ ˜û =6 ¼J 3 ÿ ø½ ¼u p/ ë ¼¨ N^ Ì 0¬vB¥ÐÄZÖëáˆç0ìÜï†í-æÑÙ |Ä 5§ † Ô_ ¤5h à̵€ˆBWñÞÿ–þEý$òû·œúCFùÑÿï÷aÿ–öòþ:õþÚóþ{ò|ýñåüÃïEüpîœû+íïúòëEúÄêù¢éøøèVø‘ç·÷¨æ÷ÖåŒö#åüõˆäsõäôô§ãƒôpã&ôiãæó“ãÄóàã¶óFä¯ó¸ä§ó;å¦óçå¸ó׿ðóè^ô‘éüô-ë¶õÅìköFî ÷¿ïœ÷Rñ3ø óëø0õÔùr÷êú¾ùüòûAýþQþòÿFÿÞ(ÛêëùÓõ ÁÍ ²‚ ¢"†³U3’ßøïE Î ‰Ü 3/ Ó~ b¸ ÙÐ )À F 2P ú ¨ J~ â; pôñ¢]G¯áîqý7ŒK'ZÌezo,vÚz{ (u Øh ™S i9 ?õÔÑŒª?‚ùXÁ&–ìÿl¨þ9^ýòü—»ú,eù¾ÿøNÿ¶öàþ\õuþÿóþ¢ò‰ýGñýïïqüŸîØû[í9û$ì˜úùêúùÜé^ùÑèÄøÕç,øñæž÷'æ÷zå’öåäökäõä2õâãÙôâã™ôäsô_äcôËä[ôEåTôÒåRô…æaôuç”ô­è÷ô!êŠõ¶ë5öQíáöàî|÷hðøò—øËóCùÉõúð÷#û(ú?üSüZýbþ_þVKÿB%3û,×$¸ ›×  a:’ÿ¶XB’¬Ÿú{> /… ÆÏ J ÂT +q xg Ÿ= —ÿ d¹ q «, :êäFUºüšf.Ÿ»ÇHäßù€ +ß(“5A? éE “C H: ) à·ò‹ÒP° ‹Àc}5GÁþïxý¸)üoÕúù­ÿ&ø?ÿÌöÔþpõjþôÿý·òý\ñýð’ü²îüoítû8ìáúëJúòéµùéè"ùòç“øç øJæŠ÷ å÷å™öžä,öKäÈõ"ärõ&ä1õWä õ¯äøô&åïô¬åêôFæêôçøôñç#õ é|õ‰êöì£ö½íE÷\ïÙ÷óðaø”òêøTô‹ù>öVúPøKû{úYü¥ügý¼þdþ¸Iÿ¢ƒîcÁCš sÝ N… $ó·Öe÷AcH´#öÖ6 d{ Ù¾ ;ù ’ Ö ýõ ýº Ót …+ 夣'^§¹‡YÞñ#€Y€¢ >ºçÑ™åPú  ² [& '  ‹bú<ݾԜuFIÑÞþ¤™ýwLü>úúõÿ¡ù›ÿHø5ÿíöËþõbþ2ôûýÖò’ýzñ"ý"ð­üÑî0üŒí«ûUì"û-ë˜úê ú é€ùè÷ø<çuøxæü÷Ñåˆ÷Få÷Øä¶öŠäXöeäöjäÆõžäõûä‰õzå~õæzõ³æyõtç„õcè«õ‹éüõïêvöƒì ÷.î¦÷Ùï6ø|ñ¸øó8ùÐôÏù§öŒú¨øqûÇúnüñüpýÿdþBÿõÄØŒ¥Vw JÚ ‚ ç ¬ni²Û©íçoÁ²ví* si Æ£ É ?Ï _³ c~ C; þò›ª#h¢#Ø”„&cÁ³Sóâ&tO s®‘\­È Êâ ~ú + × ˆ EêðÅÔ˜´_gÔ6–ÿa¾ý2rü ûËÿÆù‚ÿlø)ÿ÷Äþ°õ^þQôøýóò’ý—ñ+ý?ðÀüìîQü¦íÙûnì]ûFëÞú.ê\ú)éÙù7èVùZçÚø˜æeøôåö÷lå‘÷å3÷¹äÜö˜äŽö äOöÕä&ö6åö¼åöWæûõçúõÇçö±è#öÕéjö7ëÙöÍìf÷„îù÷=ð„øçñù‡ó}ù0õú÷ö·úêøŒûû{ü2ýrýVÿ_þZ6ÿ9þÿú¿­†bQ Ò èz «hd›È°^­Õ”/dt®­å lX ¡ ÅŽ Û{ ØO ¼ ‚Æ)}¶96ö±¬(\˜þV2¡ÃßTê>ˆf-Šß« —Ì Né  ° ]! $ÏŸ zõV×)´îŒ«\e'ÿ'çýõÿüÈÿKû˜ÿòù_ÿ”øÿ6÷¼þÔõ[þtôøýó”ý¶ñ1ý[ðÎüïiüÀíÿû‡ìû^ëûFê¥úCé*úQè¯ùuç9ù´æÉøæ_ø‹åø%å¦÷ßäU÷Àä ÷ËäÐöå¨öhåöõå‚ö˜æzöKçwöè}öøè—öêÓöuë7÷í¸÷ÌîCøŽðËø>òFùÛóºù{õ<ú5÷Ýú ù¡û:ûƒükýný’ÿSþ–%ÿoçÿ%¤Écm( íÆ ²j nô#SÓƒyŠrEî8µqM¥ÃÙ E; \P aG S# 5꡵XNÓÏPˆÅ94㜂üP«™=×ÒjB n·– k½ #ß Úü  :, è6ž7a.4ìÞ¾¶ƒ‰?Sÿûÿþ¿ÿËüŒÿyû_ÿ!ú0ÿÃøöþb÷­þÿõWþ›ôùý8ó˜ýÙñ7ý{ðÚü%ï{üÜíü¡ì¸ûuëPû]êåúZéuúhèúŒç“ùÊæ'ù'æÁø£ådø@åøüäÅ÷Þä€÷éäG÷!å!÷‹å ÷æúöËæòö„çîöJèòö2é÷Nê8÷«ë‘÷JíøïŒøÖðù‰ò‡ù$ô÷ùºõoúl÷ûQù³ûiû‡ü˜ýhýÁÿDþÄÿ˜ÐÿE„Ý=vü »½ zY 3Üâ;Ši,iÂED­³üV8ëjg›ÁÎôú ý âüºÉ†‡A>ç÷y±ûkq àÍHo«œU/ŸÂâY öU›‡ H´ üÜ µ k 8 ËJ{S3QùEÎ/«‡êX»‡ÿÙÿGþ•ÿÿüXÿ®û'ÿVúûþùøÌþ—÷”þ2öMþËôøýfóœýò>ý£ðâüJïŠüÿí1üÁìØû•ë}û{êûvé¸ú…èPú§çèùäæ„ùAæ"ù¾åÈøZåxøå0øùäí÷å¸÷>å’÷©å{÷<æm÷ëæd÷¦ç_÷nè^÷Uél÷qê”÷Îëá÷oíMø8ïËøñKù»òÁùTô,úèõœú•÷ ûvùÅûŠûˆüºý]ýâÿ1þáúþ±´ÿXcë|Ë †® @A ô½ž@DÞCrøÎgl¾ÿŠ2_g£º·Û©åÖK­pÏ)✪V( —¼þcaÿ¿•(j»·QêAŠ{ 1¯ àÜ ” L) I ²aapvÍq•akFI##öõÿÁÿ¹ÿƒþtÿ9ý0ÿéûöþ’úÆþ5ù›þÓ÷nþoö7þõñýóŸý7òFýÓðíüyï—ü*îCüéìòû¸ëŸûœêKû“éñúœè’ú¼ç4úöæÖùOæyùÉå#ùcåÖøåøåQøåøIåú÷´åã÷LæÖ÷üæÏ÷ºçÊ÷…èÈ÷néÐ÷‡êî÷ãë/ø€íøIïùñ}ùÒòñùpô[úöÄú±÷>ûŽùÒûû†üËýNýñÿþðàþÀ•ÿf?õé‚™ M¥ . µ£]öû"“#%ù«ª ;€¿È<ÿ°-XVƒs¥g·:³ú•´al ØÈ’cJê_¶È_*ˆ˜ã,>¿•Sçê3†v (³ Ïè ~ 3> èa œO”ý ¯¡k—5‚ bìÿ6Æÿ”ÿÃþWÿyýÿ)üÐþÑú˜þtùiþø?þªöþAõÞýÖóšýlòKýñ÷ü¦ï£üTîQüíüÞë¹û¿êoûµé!û¿èÏúÜçzúç&úmæÏùåå~ù~å5ù8åòøå´ø!傸Zå^øÂåGøYæ=ø ç7øÌç3øè3ø‰é7ø¤êMøüëø–íÔø[ï>ù*ñ³ùæò%ú‡ôŒú!öñúÍ÷_û£ùåû©ûˆüÎýAýïÿþíÃþÀsÿgö½€e • Æ t̳ôEõÔÌZ~Ó ;‡ŒôÈ[öµ"ûJ!n†ö‹²yaP¾Ñk‹B¥ü$±“_÷U ³6Êo\Éð Šm (³ Ëñ s& !T Ô| ˆ;¶ìÉÑQÎÀÚÿ¤³ÿ|ÿIgÿ ÿ5ÿÃýöþqü³þûsþ¼ù<þ[øþôöèý‰õ¾ýô‰ý°òIýFñþüäï®üŽî_üFíüìÎûíêŒûßéGûæèûè¶ú8çkúæúæÓùœåŽùVåNù4åù=åâøqå¿øÕåªøgæžøç›øØçšøªèšø˜éœø±êªøìÓø“íùPïxùñåùÚòSú„ôºú%öûÒ÷û£ùùûžû‹ü·ý6ýÑÿîýϦþ¥SÿRõÿäm0õ ×y „ò .XУhÉøÌ‚ªaôìnFÙŠ;¾‘é×2 Nè\«W\8 ·Èdƒ =¥õ+­Ÿ_i©ÇC&Ø„jáþ8•‡ /Ð Î rF t Ç› y½,ÕßæîAëøÿÛ·ÿ¿‚ÿ—Yÿc5ÿ%ÿ ÿÛýØþ‰ü›þ/ûZþÐùþløæý÷¼ý—õ—ý*ôný½ò;ýRñÿüîï¹ü•înüIí%ü ìâûåê£ûÑéeûÑè(ûèçèúç§úiæbú×åúhåàùå¥ù÷ämùûä<ù)åù„åù æøø´æöøuçøøJèûø;éüøRêùë&ùí^ùÏî°ù”ðúXò~úôãú¼õAûq÷ ûCù ü:ûüLý,ýeÿ×ýkˆþO1ÿ Îÿ¯eCýÐ šX @Ø çF‡œÑ«ß0Ȳ‰+&œ«þ"JŽ…ì³7ÚbþkN13Ñ!…ú6Äâ„…@ú—² gpѹ.X‰ðäƒ:‰ªÐ A ÝL {| ¦ ÇÉ rç"üÕ ‡ 9ëÿï¢ÿÏ`ÿ¤,ÿnÿ/ÿÜþåý²þ‘üþ7ûCþÖùþqøÇý÷“ý˜õlý*ôHý»ò!ýPñòüêïºüîxüBí3üìñûÙê¶ûÃé~ûÃèHûØçûçÚúQæ ú»åfúEå.úóäúùÈäÅùÃä–ùéäsù:å[ù¸åOù[æMùçTùðçYùåè]ùüéfù=ë}ù±ìªùQîïùðIúÓñ¬ú”ó ûOõiû ÷ÃûÝø%üÊúšüÓü&ýèþÅýòlþäÿ¶¨ÿg9Éš ^' û­ $:„ÐÃ]ßßÔ\ ÓIFܬ_ÕD:y‡£µÅÀä©þz ?ûç°»[‚øB…þÿ¸ooÖ7É•líAŸ1ØÅZU ò‰ Ž´ .Ú Ñú w "$Ï.€-3!åÿ ™ÿæNÿ¸ÿ‚ÙþAÿ®þùý†þ¦ü[þLû*þêùïý‚ø±ý÷xý©õHý:ô ýÌòþüañÛüüï¯üŸî{üPí@üìüàêÈûÆé’ûÂè`ûÔç2ûýæûDæÔú©å£ú/åtúØäFú¨äúžäíùºäËùÿä³ùmå¤ùæ£ù¼æ©ù’ç±ù‡è¹ùéÁùÖêÓù8ìøùÈí0úzïú>ñÚú ó8ûÑôû™öæûiø@üMú©üKü&ýYþ¶ýfSþdîþGƒÿ ´–Q #ã ¸m Që êV¢ ʋˤy]êÿRޝ úx6ÊeúŠ ©ûÅ××¥ÛjÌ!«Ë{cAìd¾Ñx8,šÚö‚L#›¼ãQ%æ`y– Ä ¨í E å* …@ *OÔV‚Q2Cäÿ(—ÿIÿÕÿÀþ`ÿ‰þþ\þÄü4þlû þ ú×ý¥øŸý9÷fýÊõ.ý\ôýîòÚü…ñºüðšüÃîsüqíEü-ìüøêÙû×é¥ûÌèuûØçKûûæ$û:æúú—åÒúå¬ú¶ä†úä`úmä;ú€äú¸äúåóù¤åðùVæ÷ù*çú!è ú1éú^ê'ú¯ëCú+írúÐî´ú”ðûeò_û;ô³ûöüß÷[ü¾ù¹ü±û(ý¹ý©ýËÿ:þÔÎþÈ^ÿžçÿXhüë• v& ® œ#-|¸±:À¯ª!r%úÃ[M®¾ò'FP]rW?§²å® ›GuÜB`ÖÈB†«= ðgœ¸AÞEx´¢ã 7 Ì1 eN g  z @„䇋€7mèÿP™ÿ+Jÿûýþôþ…ÿsþ>þ;þíü þ•ûáý6ú¶ýÏø‡ýe÷Oý÷õýŠôáüó³ü´ñüRðpüöîQü£í.ü^ìü)ëÔûê£ûúèuûèKû&ç%û`æûµåâú.åÁúÉä úˆä‚úkäcúsäFúŸä.úòä úpåúæ!úïæ,úáç;úìèIúêYúQërú·ìœúJî×úð#ûÖñvû±óËûˆõüX÷mü.ùÄüû+ý ý¦ýÿ.þ$½þ#JÿÓÿÌSyÓ X© ã3 u­•Mh’^9rúÝ£B5ž¬ê&>XZbX·;ÊÏÏÄy¨ ŽI wËá†D< êò91y̲aäô†7 [ ªx @ Ø¡ s®¯®©Q˜øÿ}¢ÿYOÿ-þþú®þÁÿaþþþ4ýÛýáû¦ýˆúwý&ùFýÃ÷ý[öÛüòô üóiü*ò7üÍðüvïîû&îÏûäì«û¯ëƒûŒêVûé)û‡èýú§çÖúàæµú3æ˜ú§å{ú<åbúòäJúÌä3úÉäúæä ú&åýù’åúù-æÿùóæ úÙç"úÜè7úòéNúëiúlì”úçíÎúïûYñmû1óÆûõüÖöoüžøÆüpú*ýXüŸýVþ$þ^³þ`CÿKÎÿRËÓk Vÿ Þ‹ mo¶Û—â ÌyâSJï«nÿÍD |3¨IÈLã>ùáï%ͪž&d›$ áo—ÎG"ïj¨+àÁS;áa p„ þ¡ ¹ Ì ³ØHÛàÔyÆ­¹ÿ^ÿfÿ5±þ\þÆþ þý¿ý5ü{ýáú@ý†ù ý(øÖüÇö¡üeõfüô)ü©òîûRñ¹ûþïû²îlûtíKûAì)ûëûêÚúé±ú4è†úgçdú¶æFú"æ+ú±åú`åú/åõù ååù/åØù`åÑù¼åÑùHæÙùçéùÛçúÏèúÖé8úïêXú%ìƒú…í½úïûÖðZû§ò·ûzôüCöjüøÃüÈù$ýŸû”ýýþ‘ÿ£þ‘7ÿƒÅÿZMÏ·QM ÕÙ bW ô„E”YR}4çøNŸ±% ‹XÓ˜Ê)ï;9% 5í9 /;ÅîF¸¾|0;›óû¥QN™òØ&>¸hG Ò° \Í ææ qú    ²÷FâßÿÄ{ÿŸÿuÀþEeþÿ þÑýµýŠüdý=ûýèù×ü‘øœü6÷düÛõ)ü€ôîû)ó¯û×ñpûˆð:ûAï ûîåúÒìÃú¯ë¢úžêú¢éYú»è0úêç ú2çîù˜æÓùæ¿ùÄå²ù‰å§ùmåŸùpå™ù–å™ùäåžùbæªùç¿ùàçÜùÌèþùÉé"ú×êHúüëxúJí´úËîýúxðUûCò·ûôüÝõyü›÷ÕüWù7ý!û¤ýý þùþ¬þùAÿîÕÿÎaç7hÎ êW rÕ @‘“̧ê$ï•Úþ§eRÅÜ Dr‘¹Êñô 8PbÕi‹e*S¸3<ºË/ŠC÷Y£¦Içç ~R}œ¤ &É ¯ê 5 º C( Ì-U*áo ýÿïÿÍ$ÿ¥¾þv]þBÿþýþ¡ýÂüDývûìü$úšüÍøQüt÷üöÓûÃô˜ûnóXûòûÐðØú‹ïžúOînúíEúüë$úìêúðéçù éÆù<è¥ù†ç†ùïælùuæYùæMùÝåIùÀåIù¿åLùßåSù'æ^ùŸæpùDçŠùè®ùúèØùõéúÿê0úìeúaí£úÒîñúrðLû4ò³ûôüËõ„üˆ÷èü<ùNýùú¹ýÉü2þ°þ»þ£Pÿ”çÿsy6ÝŠp ò d È §6NÀo@x¶f6‚ââm<Ö%Ùa’D²d¿{³Œ“I’l A‘  Ì€†ë:Jçä/!ÇXZ‡ç³ qÛ ÷þ { ÿ2 ‚C KJAœ/&±ÿõ?ÿÎÐþ£hþpÿþ6þ ýôü@ý«ûáü[ú…üù/ü²÷àû[ö›ûõ[ûµóûgòÝúñšúÜïZú¢îúsíéùSìÂùCë ùHêƒùbéfù’èIùÞç+ùEçùÍæûøqæïø2æëøæíøæõø.æùræùäæ+ù‚çJùFèsù(é¡ùêÒù"ëú:ì@úríúÔîÐúcð,ûò™ûÜó ü£õzü`÷çüùPýÄú¾ý„ü5þ[þºþ@Nÿ+éÿÍwž !‡ §ó -Q ·œEÖÐûV Ïÿ<Ô¡„ÿW‚«Öù;Pox“Œ­‡½hÅ,Æ×¾s©†ŒS „ÔòˆU8ªàôƒ4m¯Ÿ>Ê Èò M Ï6 QM Ñ^ RfÒeT\×K[4âÿiÿïñþÅ}þ•ÿþ]þ¨ýýBý×ûÝüŒúzü<ùüê÷¿û˜ökûFõ!ûùóÞú±òúkñ\ú.ðúùî×ùÐíšù´ìfù¦ë=ù®êùÉéùûèêøEèÒø­ç¹ø1ç¢øÎæ”øŠæŽøcæø\æ™øtæ«ø²æÂøçÞø®çùgè/ù>écù,êœù,ëÖù<ìúiíZú»î§ú8ðûÙñsû”óêûUõcü÷ØüÂøKýoú»ý%ü0þíý´þÇÿDÿ§àÿ…|P§˜/ ´ƒ 9Þ Á+LhØ”a«ÞªS†»>ÔqJÅ¥ïY-“]¿uÝvð]ú'úÛõ{æÉ›žg–(ÝjÁ8 ÝOzˆ¸žå ) ­1 /O ®f ,w ©%£v!gŸR6 ÿ!ÿê¦þ¾ÿ.þŠþ»ýOýNýüäüÇú{ü|ùü/ø®ûâöMû–õöúNô¦ú ó_úÈñúðÙù]ï–ù7îSùíùìáøë·ø6ê—øg逸³èmøèZø›çGø5ç9øêæ1ø½æ0ø­æ:ø¾æMøóæhøOç‰øÓç¯ø}èàøGéù+êXù$ëšù/ìàùRí)ú–îyúðÕúŽñCû7ó½ûðô<ü©ö½ü[ø7ýú®ý¶û%þqý¥þ;ÿ2ÿËÿëi¹p¡0‘ ·ý <Y ç KçÖ`9á>[%Éå)ƒƒÕg#¹lþ«4ÞT [ H' * Ó( {  ¥ã)´£y4zåÔ“ ;dÚŸsÑý ‘$ I ˜g ~ “ š…›þ–wŠðvk^çÿ@cÿßþóÿ_þÃþáýŽýiýRüöüûˆüÎùüˆø¯û?÷Eûúõáú·ôƒúxó.ú<òäùñùØïXù´îùšíӿ•ë^ø­ê2øÜéø"éøƒèï÷èá÷•çÖ÷BçÍ÷çÌ÷öæÔ÷ýææ÷(çøyç$øñçPøŠè…øBéÂøêùëOùìœù#íéù\î=ú´ïšú-ñûÄò€ûoôü$öüÖ÷ýƒù’ý/ûþáüþ þÿk­ÿ>LîÍt$þ²n :Ì Á GbÑ›[ÄàÓ]ÃÑ97”Âç27€ÜÃü?+ KJ ?Z a Ü` ‹X +F ¿* G ÃÑ5›Gö÷F ‹CÆßùs$L ‹p Ž Œ¦ · ÁôÅiÀÞ¶R§Ç’<w³ÿV+ÿ1 þÿþÖý—ý üýfû ü(ú,üçø¹û¦÷IûföÛú'õpúíó ú¶òµù…ñeù[ðù<ïÕø&î”øíRø#ìø:ëÝ÷eê²÷©é–÷é‚÷{èt÷èn÷ªçi÷kçg÷Hçm÷Eç}÷eç—÷ªçº÷èç÷™èø@é^øê§øçêöøÞëJùðì ùî÷ùbïUúÆð¿úGò8ûâó¾ûõKü;÷Úüêøeý•úéýAülþôýõþ´ÿ‡ÿ}$LÈlÀ TŸÍ -1 µ† <Ò ÄOD×_X[Ó4Bí£ƒúKl—ÄÜ  8P Ny M“ /ž ù¡ ±œ Y òy |[ ù1 nøÖ´0hǹX6ñcƒ‹ ¬ “È ß Œñ ûtýæúWóÆå5Ó¤¹„ÿzôþSÿdþ'þ×ýôüMý¿ûÇü‡úGüKùËû øTûÑöÞú–õjú^ôùù(óùøñ0ùÏðÚø°ïŒøšîEøŽíøì½÷¤ë÷ËêJ÷ ê!÷_é÷ËèñöPèëöëçéö çéöqçðö`çÿösç÷ªç6÷èb÷xè›÷ éÝ÷Àé(ø’ê}øëØø‰ì6ù¬í•ùæî÷ù9ðcú§ñÛú/óaûÏôòû{ö‰ü+øýÛù­ý†û9þ5ýÄþîþWÿ°óÿ|—F@þå ƒ& • §ó 0F ºŽDÉÌïQ÷ÑÝG£°J ÖbK®¯õþ7 4r R£ VÅ CÚ â Øá ˆ× &Å µ­ 5‹ ª\  nÚÀŒ3EÖxs¥Ì —ì  ž / : =q<Þ6J+´‡ìñÿÍYÿ«ÿÄþ„þ-þWý™ý'ü ýôú|üÀùôûŠøsûR÷ôúöyúìôú¼óŒùòùkñ·øMð\ø6ï ø,îÁ÷/í{÷?ì8÷aëûö™êÆöæéœöNé€öÉèqö[ènöèpöÊçyö­çˆö±çžöÙç½ö!èäö„è÷é\÷£é§÷`êþ÷<ë_ø7ìÅøNí)ù|î’ù½ïúñxú‰òüúôŽû¶õ)üb÷Çüù`ý½úöýgü‡þþÿÐÿ·ÿ’YZ®ÅTWñÑ †8 ’ Ÿá )%³U;h¾]:3ªë‡j º} ×E „ >¼ Né D $ î § N âö gÛ ßµ J‚ ©F ûþE«ƒR¹óç 0 «K 0` ®q '| ™‚s~ÛuCh§W Cq*Õÿ 8ÿéþšþÃýþýšücýmûËü@ú8üùªûá÷ û²ö›ú…õúYôù3ó"ùò¯øùðDøæïã÷ÞîŽ÷áíA÷ðìúöì¸ö@ë}ö‰êGöæéöVéöÝèôõzèòõ2èùõè öüç!öè?öJèdöšè—öéÓöŽé÷7ês÷ëÕ÷êë?øòì¬øîù>ïù‚ð úßñŒúVóûæô¸ûˆö[ü5øþüßùýˆû7þ2ýÐþáþmÿš[ºiÑo»öWi ëÍ |$ r”®Ï¦Ó(ºŸ„ 4oÌÆN µX › 6Ø Q U4 ?P ^ Ú^ ‰U %F ±2 - šê û· Ox ›. ÜÙ~Ai´‰ C¤ ͸ PÈ ËÓ @Ø®Ú×€ÐäÄF¶¦£Žbt¿ÿVÿÿ5þvþýÓýéû0ý¿úü–ùôûkø]ûA÷Ìúö>úïô¶ùËó2ù«ò±ø’ñ7øðÄ÷wï]÷xî÷…í¯öŸìföÊë%ö ëêõ`ê³õÅé‹õ@éqõÒècõ{ècõ?èpõ$è…õ)è£õMèÈõ‰èöõâè0öUéuöééÈöžê*÷të—÷lì ø|íøžîýøÒï|ùñú~òúüó-û“õÕû:÷üæø*ýúÐý8ürþäýÿ™ÿºÿSfÐÍ{|"• À Wi éÁ w7LD•! åw×#( œr ø· 8÷ `0 pb h‰ K¡ « Ö© {Ÿ  u þU a+ ¸õ ² Fg } «¶ÔPõ ä r ù. x7 ð< a<Ì934”*óO ¨øáWÆÿ¬ÿ¨þÿˆýUþeü¨ýBûþüúVüöø°ûÐ÷û¬öuú‡õàùdôQùGóÅø/ò>øñ¼÷ðC÷ïÕöîqö4íö[ìÏõ”ëŒõàêPõ<êõ¬éõô3éÙôÑèÌô‡èÐô\èáôPèüôbè õ‹èOõÏè†õ.éÇõ«éöIêtö ëàöñëV÷ñìÒ÷îVø*ïÜøbðfù±ñøùó˜ú¡ôBû?öóûè÷¦ü‘ùWý:ûþäü­þ’þYÿH ÀÂyv1⬊, (œ Áþ UPæ‹u­·…¦}v9ÞÞ8 h‡ ÒÏ  VN q„ t³ dÕ @é ï ³ë NÞ ÖÊ N° ´ b ])  æ Ûš C 4ãU|n € ›Ž — ›š ›€˜æ’H‹¦qW`«Lþ5Mÿÿþéþãü5þÅû„ý¦úÑü‡ù ühøtûI÷Ëú+ö)úõŒùøóõøäòbø×ñÖ÷ÑðP÷ÒïÑöÝî\öóíôõí™õJìIõëõâêÈôIê—ôÄénôUéRôÿèHôÆèMôªè`ô«èôÃè®ôôèåô>é$õ¦élõ.êÆõØê-ö¨ë¢ö”ì!÷•í¨÷¨î3øÍïÃøñXù\òùùÍó¥úZõZûööü›øÏüAú†ýçû9þýéþ<ÿŸÿðX©`× ‘¨D5 í°  &x ¼½Oíßiíîh¾Øu; ‘ Žß ê% /c Y jÑ fü N "* Ü/ (  ‘ þæ \à ¯“ õY 1 dÅ m ³ Ì ¤Þ 7ë Àó B÷ ½ø1õ›ñê^ß·Ô Æ_µ®¡ûÿEvþÿ]ýÔþEüþ,û_ýú¦üùøíûá÷:ûÉö‰ú³õÞù¡ô9ù’óšøˆòø…ñp÷‰ðãö–ï^ö­îäõÐíxõíõDìÅô’ëôñêEôcêôêééó‡éÐó@éÇóéËóéâóé ô&é;ô^éxô²é¿ô%êõ¹êtõpëåõGìaö4íëö6î{÷Jïøqð¨ø®ñKù óùù‚ô°úöqû©÷4üJùöüëú±ýŽükþ3þ&ÿàÿåÿ‘§Eo÷4›ñ3¥º N0 ð• Œæ #"ºJJ[ÔUX9Ð< ´œ Cò ³=  B¼ dö o( fO Fi u ¿v Zl áZ TC ¸% þ YÎ ™‘ ÍL úù Ÿ 7> H ÕV c\ ë^ k] ã[SV»OEx9Í-k ´úÿûçþ?Óý€ÿ½ü¿þ¨ûýý”ú:ý€ùxülø¸ûX÷ûúDöBú5õù*ôßø"ó8øò—÷#ñüö0ðhöFïÜõhîZõ•íæôÑìôì)ôpëáóÙê¤óWêróëéKó—é3ó]é)ó<é/ó1éLó<éuóaé®ó¢éñóýéBô}ê ôë õáë„õ»ì ö«ížö¯î7÷ÆïÖ÷òð}ø:ò.ùŸóêùõ°ú­ö}ûGøJüçùý‡ûÖý(ý™þÐþ_ÿ|(.÷âÈ‘“4TÉ L ¶½ [ üa˜—/¸ÁÆK»Í™B Z¬ ü [ 㣠-ä ] wV |‚ j¥ >» ûÄ ¢À 1³ ®¡ ‡ sg Á=  :Ì iƒ / §Ó º o Å  Ê ‘Ë É ”Ä ¾wµÝ«: ‘”â…0uwd»TÿûCþ82ýtÿ ü«þûâýúýôøNüæ÷‡ûÙöÂúÐõúÉôCùÆóøÉòß÷Òñ7÷âð–öûïþõïlõLîåô†íkôËìôì¨óë\óøêó‚êíò%êÉòáé°ò²é¦ò˜é²ò’éÐò§éýòÖé:ó ê‡óŠêßóëDôÀë¸ôƒì=õ_íÍõOîeöQï÷jð®÷›ñaøèòùRôçùÏõ¹ú]÷ûôøcüŒú1ý&üýýÃýÉþhÿ™ÿmÀDq鸭D f¼ " ½u `µþå˜* ´ù3 Ϧ ƒ j ‘· ìü .< Xu l§ iÒ Lñ  Ë gÿ îñ `Ü Ã¿ œ ]q ™< Ëü ñ¯ [ !þ - ˜ 3 + 2 ¶/ :) µ")”÷R÷¥êôÛ<Ì€¿ÿ¿²þü¥ý3˜üiÿû›þ‚úÊýyùùürø*ük÷[ûgöŽúgõÄùhôùpóCø}òŒ÷‘ñÞö­ð7öÑï—õïÿô9îsô{íôóÊì…ó)ì&ó˜ë×òë˜òµêfòdêAò)ê(òÿé#òêé.òîéLò ê~òCêÁòšêóësó¢ëàóOì^ôíêôòí€õãî öèïÊöñ}÷<ò<øóùùôÞùxö»úø˜û”ùsü'ûIý½üþXþöþûÿÑÿ£°R‘m¤@9» Â) u… "Ñ È j8O˜Q 8 ÿ ¨u 3Ë ¢ ö\ 3™ XÏ d W& /A ñL ™L +C ¨1  oú ºÖ ú¨ 0n Z+ xÞ ‡ š ( Ÿ À Ÿ R › Ý“ ^Œ×‚Iu²j^jQ»B5K(ŠÿÆþý ý/ü`ÿûúŠþøù´ýõøÜüò÷üòö.ûöõYúüô‰ùô¼øóõ÷-ò6÷KñöpðÏõžï(õÖîŠôî÷ó_íqóºìúò#ì–òžëDò.ëòÑêÌñ‰ê£ñQêñ-ê†ñ ê’ñ,ê²ñQêæñ”ê.ò÷ê†òuëìò ìeó½ìëó‡í}ôfîõXïÆõdð{öˆñ9÷ÇòøôàøŽõÅù÷­ú—ø”û#úxü³ûYýHý9þäþÿ‰7òèÝ”À2˜¿d9 &¡ áú “D?媄¾ ¹  ” R ñò tH Û“ )Ö ` }E €s i• :ª ñ³ ޝ ¢ ŠŒ ìp >Q ‚( »ö ç¸ q ! 'Ç + e ) ü ! ‹   ‘ÿïváÛÑ6Á‹±×¡“_ˆÿš}þÏtýÿnü,jûUÿgúzþfùœýhø¼üm÷Ýûtöþúõ"úŽôIù¢ótø½ò¦÷Þñßöñ ö7ðhõoï»ô¯îôøí~óOíòò¶ìuò,ìò·ë¸ñTërñë:ñ¾êñŽêýðuê÷ðsêñ‰ê&ñ¼ê^ñ ë¨ñsëòôëuòìôòEí‚óîôðîÂôçïtõøð0ö òûöbóÖ÷¾ô¾ø/ö­ù«÷žú.ùû´ú{ü@üeýÓýRþpÿDÿ9Æ/s" ªç, ºœ ‚ÿ AU úŸ¬×VüõŠ ô Ä“ x ` ‰µ èÿ 1> `w tª nÓ Nð  À Tü Õë AÒ ›µ ç’ %d U. yî ¤ ŸP ¥ ó ¢ ™ $ ± ƒ 6 r³b(Q“@õ.O¡ ëÿ/óÿmêþ¤ãýÕÞüÜû(ÜúMÿàùmþåø‰ýï÷£üüö¾û öÙúõöù7ôùVó9ø{òe÷§ñ–öÚðÏõðõUï\ôŸî³óõíóYí‚òÍìòRì”ñçë9ñŒëïð>ë¶ðëðÞêvðÍêoðÖê~ðøê¢ð5ëÚðŠë'ñõë‹ñ{ìòí†òÓíó¡îºó„ïeôðõ‘ñæõ¿ò¿öô¦÷`õ™øÏö‘ùEø‹úÁù„ûAûyüÊümý^þiþþÿhÿ§hQi÷bŽQ4 ÷ ÚY ¡¬ `ñ#Ä?f >ü !ˆ é “q #Ñ —# ók 5« Zä c U7 ,N çY ‹X K 6 ó Gü Ô Ä£ íh % Ö "~ !  º K ÿ × íY ÛÔÉE´¯ Œf{¶mþ_?WÿyPþ­KýÚJüLû&QúFÿZù_þgøuýv÷‰ü‰öžûŸõ²ú¼ôÈùßóáøóý÷6ò ÷lñHö¦ðyõçï³ô0ï÷ó„îEóæížòWíòÕìñcì ñì©ð¨ëZðbëð0ëñïëÖï ëÏïëÜïKëðŽë:ðæëðXìõðãìoñŠíúñDî”òï;óþïðóýð²ôò†õFólö’ô`÷ïõ_øY÷dùÊøgúCúhûÃûiüNýpýèþzþŒ‡ÿ4•ÛŸw£š‡…ü gh >È ×_”ŒF œî ’ˆ o / Õý ^_ ΰ #÷ ^9 {o š h¼ 3Ï åÕ €Î ¼ s¥ χ ` Z3 …ÿ ¤À ¹t Á" ¿ Æ ¶ d ª ú ˜ ˆ ‚  l T ;s#Ù 5õ‰âÕÑÅÿU¼þŠ´ý¹²üâ³û·ú"Áù;ÿÍøNþß÷^ýôökü öwû*õ„úOô’ùyó¢ø©ò·÷àñÏöñïõ]ðõ¨ïIôüî„ó]îÉòËíòGíñÐìððfìtð ì ð¹ëºï~ëyïXëIïFë.ïJë&ïgë2ï™ëVïßë“ï=ìéï¶ìSðIíÔðóífñ³îòˆï³òuðmóxñ=ô–òõÏóöõ÷vöøÝ÷)ùLù6úÄúDûFüUü×ýjýuÿ…þ¢ÿ¾½]ÓñÝzßøÕo ÀÛ ¥< ‹OÆ éË òx â ¶¡ q!  •ï ý@ JŠ |É ’ý &kC-RØQlFè1O¤ñ èÇ – >[ V _Ä _l W H ¦ 4 6  Á  E æÀ É2 «›ŽýtU\¦Gí7.+ÿf"þ˜ýÃüæ û(ú6ù0ÿHø>þ^÷GýyöOü›õUûÄô\úñódù%ómø^ò{÷ñöãð¦õ0ðÇô‡ïòóêî'óYîgòÔí´ñ[íñíì|ð‰ìüï5ì‘ïôë7ïÅëóî«ëÃî¦ë¥î´ëœî×ë§î ìÍîYì ïÁìbïAíÑïØíUðˆîèðKï‹ñ"ð?òñóòÚó<óÈôsôÇõ½õÐö÷â÷sø÷øÝù úUû&ûÚüCükþhý‘þ¢ºÿ;ÞÎûYÚT Æ . ÷„ Úɱùz 6 ä ÷‚ Å w þ ‡_ é± -÷ T5`gQ‰&Ÿà§£ ‘ƒwãW11o›É ¹ˆ È= Íè É Š ¼ % ¨ » ’ I w Ï YP :È 7 þŸáüÇT±¡žè’ÿ&‡þ^ƒý‚ü¶‡ûØ‘úó ù ¶øÿÐ÷&þïö,ýö2üAõ5ûuô8ú¯ó=ùíòBø2òL÷}ñZöÏðoõ+ðŒô’ï³óïäò‚î!òîkñ™íÅð5í.ðàì©ïšì:ïfìáîFìšî9ìhî=ìLîSìCî~ìPî¾ìvîíºîƒíïîï±îðlï½ð@ðvñ2ñHòOò?ó›óhô"õÇõ÷öv÷0ùˆù¿ûðû—þšþ]`õ,zì ï“ M 2¢ ÁÛ? Õëâ’¸N9¨9Ï Â!ˆ"$#p¡#¨ø#Æ&$Í0$¼$“â#]…#" #æq"¬»!‡ë x wpøPÐ —àRŽþ3œÏ/`»Ý=H¶ž*Üœ { ë ý_ÚÕ¬LsÆ+CÖ Ãu Hÿ Óý“ aüùú’–ù7øvÜö܃õ<-ô“þÛòâüñ+ûGðtù ï»÷Ñíö¡ìOôuë›òRêçð=é5ï6èŠíHçåëzæIêÛå½èiåGçåååïä™äÃäjãžä]â‰ärávä²àsä%à‚äÒߣä·ßÖä×ßåà€åqàôåíàqæáúæ,â–çðâJèÐãéØäêæ:ëKç|ì£èËíÿéïKëqð‚ìÐñ³íJóõîùô`ðíöòùèóqûïõÈýò÷ÏùnûÕÓü‹þOgÿ> æh ¬Å ±2Õ…è—¼ N; ªe ÂU¿0Á%ÛJ £@S}' µ© ¡Ü ;È —ƒ Ó& ¿aSÖÛ_LáŸ;Ç[À>‘íGyèz R ½ŠT÷»\ ì¸ ð Ûa¿½¨Ÿ†¡ö o‰îþV qý üû” “ú 7ùˆç÷¤öŠpõIô§/ó6%ò¾þ.ñ?ýGð»ûuï9ú®î¿øîíP÷6íðõƒìôáëYóUë&òêêñ êóïxêöî`êîJê>í3êyìêÁëóéëäé‹êùéê;êÕé«ê¼é?ëÈéæëëéŽìê*íEêºínêJîŸêçîãêžïJë}ðßë…ñ˜ì²òpí÷ó[îUõDïÐö!ðcøððú¶ñ¸û|òcýIóÿ%ôªõJöí#÷‰-ø+ù–úú çú> ¨ûc `üo ýhåýU¾þ2¢ÿü©N.ùˆ€¾ëáOÃ:]… ß-áT£B,îylÚ´^ì] ÷ î Ô ô™ › þO -H E' l ½ . >  á ü …- ñ£ %æ  Ê SÖ j % Tê ‡¿ ³„ Ï Òƒ ¿³ šÿ¿ jþ¿6ýÇüèÞú"¸ùi–ø­o÷ÚBöèõÖæó¯½ò‡ÿŸñpþ‘ðwý•ï¢ü¨îìûËíEûÿì£úDìýùœëQù ë¥ø•êø:ê‡÷þé&÷áéæöäéÄöê¹öCê¼ö¨êËö/ëèö×ë÷žìU÷~í¥÷tîø{ïsø—ðëøÌñqù óú’ôŸú!öGûÇ÷õûxù¡ü(ûJýÎüéýbþ|þçÿÿb…ÿÞb‰î}£ )o ´ óÈ #¬ 3e.þ"…*r@ÕYcGPEÀºR>ݨtVÙ£ £é o% 0Q àÿi {ÿq ÿp™þn6þvìý»ý²ŸýÙ…ýüYýý!¶ü0NüWÿñû¢þ¶ûþªûÇýÊû‰ýýûMý"üúüüƒüáûïûtûYûòúßú€ú˜úBú”úFúÊú…úûÝúhû)ûûEûƒûûHû¹úöú7ú«ú¿ù…útùúkùÉú¢ùûúqûgú¬ûµúÁûØú±ûÓúˆû´úZû™ú8ûžú-ûÖú:ûEû]ûáû‰û–ü¯ûKýÎûëýßûoþæûÝþêûEÿõûÁÿ üb5ü2nü+²ü8üüAJý2˜ýçýº?þdŸþ ÿÕƒÿ¬ “ Š} \  " )É ¶TBÆÏ*^‰îã}9 ˆ“Æì™ù îtÍΙ YS  ¾¨ \Ê ìê n á  I  © û  Ä Y s Ÿ Ø • !²6JTåwµõñY&JÉTçG-ÿ(þ[ýœÿüäþ3û)þbúgý’ù•ü´ø¶û¹÷Ïú¤öäùzõýøMô"ø*óU÷ò˜ö(ñäõLð8õyïŽô¡îäó¾í9óÌì•òÖëòãêñ êñSéÄð¼èð>èAðÈçÿïSçºï׿~ïVæVïêåTï­å†ï±åíïöå|ðsæñç±ñ£ç2òèœò‚èóäè…ógé?ô-êBõKë‰öÇìþ÷€î„ùQðùúòIü´óvý'õþ€ö¬ÿá÷èiùU2ûð>ý¬}ÿqÏ% µ * ] ³ ‡B ¦Ñ Åsé0 Ù’ì™Zbs;­ùʯÈi®%|Ò+aºÂ'ëyÙ©š¾B¾Ý«t‡Q¥,¿ “c ×þ û’&õºâPÒîÆ—¹K© ÿ‘Øýn°ü9‘ûú {ú´ rùk vø" Ž÷Ù½ööBmõñèô™rô<ôàšó…ÿ-ó(þÄòÇüaòaû òñùÏñxøªñ÷ö›ñvõ˜ñô–ñ˜ò‹ñCñoñøïAñ²îñdíÎð ì ð¢êð<ésðàçuðžæ|ð„å~ð”äwðÊãlðãXðnâBðÊá3ð%á2ð„àCð÷ßdð”ß™ðaßÞðdß3ñ˜ß‹ñõßëñjàXòíàÕòáhó.âôãòôúãçõåìöoæü÷ÖçùFé úºê5û3ì]ü¼í§ýcïÿ5ñ¸9ót_õ;‘÷ò²ù†­ûózýF #ÿ‘ Àî toS`Ëyµ üµ ?n:Ûú’ ±/NmëÂrÎCñ2ÒÝvJëŽDÁŠøÆBô›ð,û>»_ÆçJZÀÁ 6# ¶‚ @ÜÍ3H‹ ßÐ1Ö„ÀÝþ˜<ýl¦ûLú3¡ø6÷÷ÙõÁ Šôp Kó ò… þðûöïmïã,î`líäÁìh(ìêþ¡ëfý,ëÝûÉêQúuêÈø6êF÷ êÏõùéfôê ó$ê¿ñaêð²êLïë*îsëíßë"ìOìDëËì‚êXí×éþíAé¿î¹è™ïCè…ðàç{ñ–çwòmçmóoç_ô›çQõèçEöLè@÷ºèHø*é`ù™éˆúê·û›êêüEëþìBÿ íYîg>ïoYðsdñs_òrKóq4ôk$õ\+ö? D÷ jøÙ ”ùˆ ³ú( ¾û¾ ²üJ ™ýÒ ~þUeÿÍP49©Þ¸‰´$¬½­eÀ(Ýøãü°ØU „Ç  €@ û  “ ä P x ) 6 Û ¶ … ;ÿ €P ‹ Ê o |–°' Åo^ÆÝö=î°®LÔÜür1qÙ ·ž ýÿU <ÿì lþU ‹ý– ü¶ §ûÆ ®úÛ¶ùÁø5Õ÷rîö¨ öÎ(õØHôÉló©”òˆÅñwÿñ{þOð›ý­ïÑüïü¡î_û7î¨úãíðù¢í<ùwí”øcíÿ÷hí…÷Ží-÷Ñíñö6îÒöºîÇöTïÊöð×ö¿ðïöñ÷wòH÷zó”÷ôõ÷àõiø<÷ìøªøyù!ú ú–û›úý/ûqþÅûØÿbü?ýªªýMþ–êþ xÿxõÿË b à ý yË Ô-!{´µ6Ñ Ìî¬yA÷±òMÛÔÀF—¨Qø í7 rf ëÿ„ iÿ” ÷þ— ˜þŽJþ€þn¹ý\kýQýRÃübvü{3ü›ùû¾ÿÁûÝþ„ûùýAûýüúZüÂú¹û úAû úòúÀú¾úñúúûXú*ûúûµùÖú]ùŠúùJúù0úùIúbù‘ú¾ùðúúIûgú|ûŽú}û–úMû‹úû„ú¸ú’ú‘ú¿úœú ûØúfû3ûÂû“ûüÞû=ü üQüüQü üHü üCü&üKüjüaü×ü~ücýžüøýºüŠþÍü ÿÜüÿçüòÿðümúü ý±ý6ýaZýM‰ý4ÂýþÛHþ‘þ[Þþ# /ÿù ˆÿÛ êÿÅ U¬ lj AR¿AšÆ%L£Õc„ïè|<|‰§»m¹ÑŸ/oˆ.ßÚ3 s€ üÀ xí â ; ‚é ¹ ¾ æ ‹  S   . Û7 ˜7C(× Qç±»þ@n~V¿Hÿ:þK#ýÿûËÌúþÿù$ÿJøAþ÷Yýôõsüêô”ûôó½úóìùò#ùñ`øð¤÷õîëöÝí7öÒìŒõÛëèôýêIô9ê¸ó„é6ó×èÇò2èlò—ç%ò çòñ†æÍñæªñ®åŒñQårñúäbñ²äfñˆäŽñ‰äáñ½äaò*åýòÄå§ósæQôçëô¹çuõHèþõÙèœö†éc÷rê]ø°ëù:íáúúî?üÐðŒýœòºþCôÉÿÊõÅ@÷ÇÃøàtú`üq…þÚÍ@’ XÅ lÔ V Ç  ¤ Û uEoSÐ;€Ã”B鑲2±+£ ŽÔq‹A -ï ´r!"½!zÍ!¸µ!߀!ò 8!ù â ò ß  Ç ¨çU7&6úÒø±Î˜›ŽÿdŠþ&ýÝšüаû)Ðú¿úODùÚ  øb øé Ÿ÷p<÷öäöx‘öù@öwòõó­õmÿvõåýSõ]üEõ×úKõUù^õÕ÷tõXö‡õ×ôõUóŒõÎñƒõFðyõÁîoõFímõÚëwõ€ê†õ7é–õüç õÈæ¥õ“åõ\äŠõ,ãsõ â]õáMõàBõeßBõÕÞJõdÞVõ ÞcõÀÝtõ~ÝŒõJݬõ1Ý×õ?Ýö~Ý^öëݸö…Þ÷Hß÷-àø-á½øJâqù‡ã9úÜäûFæîûÃçËüOé¯ýëê£þ¡ì®ÿyîÕð±òþôçR÷B”ù„·û¬±ýÀ •ÿÏ uê i ƒb½± òK dý?´Õ>5¨v´[ý³Uµ8L$1 â´b*Áy»4ÿWDq‚|ªn³I‘ ?º ÌQ Dܳbä†fëê>tu‹’þ…%ýhÁû<dú ùàÍ÷³ö„õLtôyó­ ”ò@ ÁñÇ ñD Xð¾Æï8Lï´çî4—î±Yî-*î§þ îýî‘ûî ú(îˆø_î ÷­î—õ ï.ô{ïÎòñïwñjð-ðæðóîiñÈí÷ñ¯ì“ò¨ë@óµêÿóÓéÍôé£õSè{ö»çP÷<çøØæåø‹æ¤ùQægú*æ2ûæüææüDæÍýæ´þýæ•ÿ„çh è.Äèílé¥êZÛê°ëʞ샨í4ËîÜüï{/ñ ]ò‘‚ó ô€ ±õë ÆöM ã÷¥ ù÷ 3úA gû‚ ü¾ Ïýò öþ : C õ9 È û PÚ  ý³ ð« éœ Ùz ¬ ; Q Þ Ç j  ñ k € È & E åæ ´ž ‚T@íâTbˆÈ’&ˆ‰‡þ ‡×!ÁgU™Ö¡D| 4íÙ8}‹ÿ(ãþß@þ›¡ýLýä \ü\ ­û· öúù 9ú0 wùf ·ø¢ û÷ãG÷#˜öXðõ~Nõ°ôô†…ó{üò{ò‰ò«ÿ®ñØþ^ñ þñBýïðvüÓð­ûËðéúÚð3úÿð”ù=ñ ù‘ñžøùñFøqòý÷ýòÁ÷ó”÷Qôx÷õn÷öw÷ÿö•÷øÆ÷:ùølúWø¦û±øáüùþ…ùWÿüù“{úÔû‹ûnüÀ¥ü 3ýI½ýo Bþ| Ãþm =ÿE ®ÿ » j]²ïìnÓ>];v;……Úo‚C˜² ]i ³ ¸ÿë kÿ ÿ Êþ' kþ#þý„ýý‚üøüîûêFûîÿúÈúÿ›úGþnú}ý:ú·üùùóû¯ù:ûbù‘ú ùúøø’ùöøGùùùWùùùêø×ùÍøòù«øêù†øÌùjø­ùiø¦ùŠøÆùÏøú0ù‡úùûúlûVú¯û’úÇû·ú¾û×ú§ûþú¡û3û¼ûûþûÙû_ü7üËüŽü1ýÓü~ýý±ýýÒý#ýðý'ýþ/ý`þ=ýÀþRý7ÿkýºÿ‚ý<“ýºý0žý¢™ý”ý¨”ýMšý©ýÒÁý¢àýnþ2+þíUþ¦‡þa ½þ* ûþÿ CÿÝ •ÿ¾ ïÿš Oj¶,&Ûz •—Ÿ"ü¢Z! šÏçƒéùÒo¨ÞoG"¤ÀïI$ ¼E Y _a ’c ¶_ Ê V Î F Å $ ¯ í ž_8'»ê/§œ_n¶ÔYÿ5÷ý–üÖ;ûëù@¦øgg÷Žÿ*ö·þìôåý«óýhòVü'ñ–ûñïÕúÌîú½íZùÁì¢øÖëñ÷÷êK÷ê±ö>é&öaè¤õ‹ç.õÀæÅôæjôjåôóäãó›ä¿ó^ä«ó0ä¡ó ä¡óáã¨óµãºóã×óƒã ôœãbôéãØôoägõ'å öüå³öÖæV÷¥çò÷ièŠø+é,ùþéæùþê½ú>ì·û¾íÍürïîýEñ ÿóæô˜öõ8øÒÙù²‘û¡qý~ÿ¨«³ë²#œ Ej F  , ¸ B Üà ·: —§ t?Vêr¦Ó¤Œ7[HJ ¼ 4!V ÿ!à ¨"Y %#À x# #a  #™ ˆ#ÅY#è#·"<"+¦!>í S h£ïÌÿ¿ùþ„,þ?iýì®üŽþû#\û«Ëú%Nú—ãù‹ùn CùÔ ù: ÑøŸ£ø{ø`]ø»JøEønQøÊþmø&ý•ø…ûÃøåùðøGøù«ö7ùõNùvóbùäñvùXðùÔî¯ùVíÐùÛëóùeêúòè%ú…ç-ú(æ)úÞäú©ã úŠâöùƒáãùŒàÖù¢ßÊùÄÞÁù÷ݶù=Ý«ù›ÜŸùÜ‘ùÈÛ†ùžÛ†ù—Ûù²Û¢ùêÛÀù9Üìù›Ü$úÝbú²Ý¯ú{Þûsßû¡àüþá“ü{ã1ý åÕý æ}þ=è+ÿàéåÿ˜ë¯oíuï…«ñôŸoö¨×ø¤#ûŒLýb\ÿ2 _ nà —È ßµ 7 ˜ ‹ b¿ Á‹ˆæ!‰JënLбššfŽD…ÝFSجD î š  ã > !Y D!g R!d >!S!3© 0 ʧ‡DoÃÄÿŠþ6WýG,ü@û&êùüÚøÊÖ÷–àöbøõ($õædô™¸ó>!óÖ ¡òa 3òç Ùñh ”ñê_ñn:ñó&ñx%ñû7ñ|]ñûþ—ñvýèñóûIòsúºòûø8ó‰÷¼ó öCôÂôÐôlócõòþõÚð¤ö ïU÷sîøRíÙøBì¡ùHëiúcê*ûéæûÐè—ü%èCýŒçïýçŸþæOÿOææ¸ýåjøåæ¯&æBYæÉ£æG çÀç6,è¬âè¬éŠêñ\ëQ=ì¢&íêî( ï]:ðŒhñµ£òÚâóùõ Nö s÷' ‹ø( §ù# Êú úû 5ý pþê¢ÿɾœ¾d¤'{êR´5ˆ+b.;0  Éç t‡  ¨n EÜ ó_ ±û }© IZôÃg`®ëÏoÜõç†ÿ%+Ïb~—&»ÂÿÁPÿ¥ÒþoIþ'¾ýÙ7ýŒ´ü?4üñ·û•9û%ºú  4ú ªùf ùº “ø ø] ‡÷ª ÷î”ö&#öP¸õnUõ„ùôš¦ô´]ôÖ!ôòó0Ïóe½óžÿ½óÚþÏóþóó_ý*ô°ürôüÊô}û0õûú¥õú*ö/úÃöáùp÷¤ù2øuùùSùïù>ùåú9ùæûCùîü_ùùý‹ùÿÆù ú+\úD¶úeû‡uû¬ÝûËGüß³üâ"ýÐ ýª ùýo ^þ% ¼þÊ ÿ` aÿé ©ÿ]çÿ»ÿB$[+cZäA?õÿÐ ÈÿP ”ÿ¼ Zÿ ÿ` ½þ˜ Wþ¿ ßýØ]ýåÚüêZüëäûëzûëûì°úñDú÷ÎùUùÿÞø5þtøcýøŸüá÷ìû¶÷Fû“÷ªúq÷úH÷Œù÷ùíö°øÐöhøÒö?øôö/ø4÷0ø…÷:øÔ÷CøøHø;øQøRøaøføøŒø½øÔøù?ùxùÈùæù]úQúåú°úSûüú¢û8û×ûmûü¥û8üäû…ü/üîüülýÖüñý#ýpþ`ýÞþ‹ý:ÿ¤ýŠÿ³ýÚÿ¼ý4ÆýžÒýãýšòý ýý¢þ"þ¥þ/ÿýÅüýjýýþÑ þ‹þB2þöNþ§ oþ\ •þ ÁþÙ ôþ£ -ÿq oÿ@¹ÿ  ÇezÉ!2¾ŸPÝ`ñÕd?ؘLÝÄ >!¸$.žë®^^¬ùî~$íRF|‰ ´»ËÍÐÍÄ ¼¦ —z _@ ø¿¢a>ùÓ`é pöþ‡zýçûû=wú‹ðøÔi÷äõ`jô©ÿýòôþŸñ?þSðýïÞüØí/ü ì€ûkëÔú<ê0úé•ùèù çxø1æý÷qå÷Ää%÷&äÈöãwöã4ö|âÿõâÛõÀáÈõáÅõáËõ‹áÝõ¦áùõËáöúáRö?â–öŸâôö"ãj÷×ãò÷¹äŠøºå)ùÉæÈùÚç_úçèõúöé’ûë=üRìüüÆíÔýoï¼þDñ«ÿ3ó’$õj ÷2Üøê¡ú™küIHþþA¸[vŠ/¾Ùêo î U ëª Êï £) uX A{ ‘ §˜ 2Œ žh ï2 $ê ? ’ E!) /"´ý"5¡#«$p$w¢$Ò°$%¡$n|$³>$øâ#=j#…Ö"Ð$"#Q!}ÿb Úþ]<þC§ýýÕ“üŠü1®ûÉSûTûÒÍúD£ú¬…ú núe_ú» Yú Zú_ dú®{úü¡úFÒúûØRû!ÿ–ûjýÙû´ûüúQüRø‡ü¦öºüþôïüYó%ý¶ñZýðý„îÀýôìèýoëþõéþ†èþ!çþÄåþtä þ/ãûýöáëýÍà×ý¾ß¾ýÈÞ¢ýíÝ…ý/ÝbýÜ@ý Ü"ý—Ûý7ÛêüîÚÔüÂÚÅü¶Ú¾üÕÚ½ü%ÛÄüÛØü8ÜöüïÜýÁÝNý¬ÞŽý²ßÝýÜà9þ/â þ¨ãÿ@å‰ÿðæ³è‚†ê jì¤eîI€ðü¸òº õzh÷3Ãùßü}Fþlœ*¶ºïN 9 á † f Ç Ö è' Ü\  t 9v ¶j #U …: â 2Ù g‹ s$ T   › U!—[!Ìš!úÁ!%Ë!Fº!_!nA!xØ |X }ÿÇþ%…ýmü¤ŸûĸúÏÜùÅ ùªAø‡…÷\Øö);öñ«õ³.õkÄôlô¼(ôWõóë Óóz Áó ¾ó”Ëó#êó¯ô>^ô˲ôXõæÿŒõtþ öýŽö—û÷0ú®÷ÐøGøw÷æø%öŒùÝô;úšóòú`ò­û0ñlü ð,ýúîéýõí þÿìLÿìòÿ@ë’wê2ÀéÐémè 衯ç.`ç°'ç(ç“ôæôüæLçŸFçé‡ç/Ùçm>褷èÓEéöëé¨ê%uë.Pì/4í(îï ôïôíð×ôñµó'ô_Qõ+zöó ÷¹Áø~ÝùC÷úüÉ)ý†>þ>KÿðKœCK6þ(º~H ×ꑬBR ìä ™o N ¡ ßN ·ÿ ¦ ^4"¡Úÿìˆÿ2ÿCàþh—þ–XþËþâý+¢ýBZýBý*©üIüÊçûЇûF)ûùÏú¡xú>úÌ ÂùO fùÉ ù: ©ø¦ Mø ô÷g ¡÷º W÷ ÷B×ö{¤ö²uöëNö%2öc#ö¦ öî.ö9Kö‰vöܱö3öö’ÿH÷÷þ§÷iþøêý•øzý#ùýÅùÈüwú‚ü8ûHüüüÝüôû¼ýÜûŸþÔû‰ÿ×ûuêûfü^0üYaüX›üXØüTýH^ý0§ý òýÖ >þ‘ ˆþ= ÏþÛ ÿk Mÿì ‚ÿ] ¯ÿ¹ Òÿþ íÿ,ýÿ?9þÿïÿå Õÿ› ®ÿ? {ÿÏ 7ÿM æþ¹ ‡þ þ] ¯ý˜ :ýÆÇüéRü×ûXû$Íú-9ú6¡ù@ùKsø[é÷tÿj÷‘þùö¶ý’öçü0ö$üÖõoû„õÊú9õ7úöô³ù¾ô:ù’ôÎølôoøOôø@ôÛ÷Bô°÷[ô÷Šô¢÷Ðô¸÷&õØ÷€õøÕõ&øöLøböwø¦ö­øôöòøZ÷Gùß÷ªù~øú'ù†úÑùëúmúCûóú‘ûeûÕûÏûü;üSü³ü—ü>ýáü×ý)ýxþnýÿ«ý´ÿÛýDÿýÎþT&þÚ2þd<þñGþ‚Tþ`þ²mþNwþï~þ—ƒþB‡þð‹þ¢’þU  þ ´þ³ Îþb íþ ÿÈ :ÿ iÿ:žÿöØÿ°ec´¶ RgâÆi%ä‡YíÀVÁf/¡¡ÉÝßæËF£ië2¼vGµÄì2“Eêa;nŒkÙX7N _ ÒV ’. Kì ü•£,>µÌ0MžÅ2bÿ˜ºýúüYhú´Êø5÷e§õ»ÿ$ôÿ¢ò`þ'ñ´ýµï ýNîaü÷ìÀû­ë#ûpêŒú=éûùèqùöæôøáå~øÝäøñã¬÷ãU÷câ ÷ÃáËöAáöÙà€ö†àröIàpö$à|öà“öà²ö*àÛö\à÷¯àX÷)á³÷Ñá$ø¬â§ø®ã7ùÇäÐùêåhúçþú3è•ûUé0ü‰êÔüÚëˆýRíMþòîÿ±ðïÿƒò¾Zô„'ö<é÷ã¤ù‚_û)ý³ÿMøåÿxþ#r* Ò  SÙz¥•o¢9¤ûœª…=]µ%àS‰…$ª´» :­!¼x"1#£‘#ä#z$ß<$BI$§<$${Ä#ìÿU#dÿ¼"âþ"dþ(!íý8 ‚ý6"ý&Ìü …üÛMü•"ü:üÈòûDéû²éûñûwüÑü%Cüt tü½ ¯ü óüC;ý…ý»Îýôþ-Uþiþ”þªüÒþîú ÿ:ùGÿŒ÷ÿÝõ³ÿ/ôàÿ„òÚð6ï,ží0ì,œê ,é ÇçôÿjæÔÿå®ÿÐãƒÿ˜âPÿqáÿ^ààþ]ߥþrÞhþ¡Ý*þèÜðýHÜ·ýÄÛý\ÛMýÛ#ýÙÚý¿ÚçüÅÚÕüïÚÏü8ÛÑü¤ÛÝü7ÜòüîÜýÈÝIýÈÞˆýëßÔý,á.þ…â‘þõã÷þ{ådÿçÖÿËèNžêÐ’ì^¥îúÐðóA]õá°÷wýùÿCüzþî³^åÏ!Bg°µ  hF£cÃT˾»£B€ºP*ÙÙ…œï  h!¸}!¼!Gá!‰ï!Ææ!Ã!:‚!rÿ$!¢þ­ Òý ýmBü«„ûÔÍúè"úê‚ùÜìøÂbøŸç÷rz÷>÷Êö¼Œöj\ö=ö²,öP)öï 5ö Qö1 |öÓ¶öq÷ Z÷¤Á÷>2øÞªøƒ*ù/ÿ¯ùÞý;úŽüÎú?ûhûòùü§ø°üd÷\ý)ö þùô·þÑó_ÿ²òœñ›ð2‡ïÅŒîTžíâºìmçëó$ëpqêæÏéO<鬼èÿMèHî牣çÁkçòHç:ç<AçS^ç_‘çbÙç\6èL£è4é¥éô>êÊíê™·ëc™ì(íæ’î¢”ïZ“ð‘ñ•òq¨ó!ÍôÏö}K÷.’øãÖù™ûP@ücý½zþsŠÿ'™ß«¡Ælä@ýÿÜÿý³ÿÌ„ÿ† Sÿ. #ÿÓ üþw áþ ÑþÈ Èþl ¿þ²þ…™þíuþ8Hþoþ–ëýºÀýÝýþ}ý\ý03ý8ý+Êü †üÝ=ü ôûXªû `û¶ûYÔúó Žú‚ Hú ú„ ¸ùû qùp -ùß íøF ´ø¢ „øóZø<:ø#øÃø øZ ø¯9ø]øXŽø­ÌøùUpù²×ùNú‡ÿÕúÿkû‰þüþÀü¹ý}ý_ýAþýÿÉüãÿü¹^ü–:üx"ü^üIü4'ü?üaüáˆü´±üy Üü/ ýÙ :ýt sý ¹ý þî GþI ‚þ °þÀ ÒþÙ íþÚ ÿÄ $ÿ– ?ÿU Tÿÿ Yÿ• Lÿ -ÿ‹ ÿþì Çþ: ‰þy Dþ©úýÍ«ýçRýùìüzü üûvûíú fú'çù5ÿlùIþòødývøˆüö÷¸ûo÷ôúëö>úlö•ùýõýø õvøWõø"õœ÷øôJ÷Ðô÷«ôÌö„ô öaôƒöKôxöGôö`ô›ö˜ôÍöåô ÷CõR÷¨õœ÷ öå÷cö.ø¹öxø÷Èøn÷%ùà÷Žùiøúùvú´ùìúfúWûûµû­ûü7üMü´üü,ýÑüªýý3þ]ýËþ£ýlÿäý þ©Jþ;jþÆ‚þF•þÁ¦þ<·þ¶Ìþ3âþµ÷þ<ÿÇ!ÿU5ÿæGÿz\ÿ uÿ’ÿ+ ³ÿ¹ ÛÿI Ü ;x t ³Å ùp E“¶éQAçž}þ`²ÇE1ÌB ª{êXS¥·æn3½8!Nó²Ê_ýù' ‚B öO UM œ; È ÚöÓĶ ‰‰ DO ô —·-S¸á5[©Ê,rÿÏêý%Eüx¢úÅþø[÷Tºõ—ÿô×þ‰òþüðZýzïžüîçû ì6ûCë‹úõéãù¸èCùç®ø~æø…å›÷©ä"÷àã·ö(ãXö}âöãá½õ`á‡õ÷à`õ¯àGõŒà>õ‰àJõ¢àcõÐà‰õá½õ_áüõ½áIö/â¡öºâ÷dã„÷1äø$å­ø:æVùjçú¥è¹úåéfû(ëüoìÁüÃíuý.ï3þºðûþgòÊÿ.ô›öeé÷#ÆùÑšûngýÿ1ÿ‡ މɼu¯×š (z fL£Ðª¥ •¨yRw"Ãæš3CSâWx: ù Ž!"›W"˜"£Á"+Ò"¶Î"A±"Ðw"h"!ªÿ!VÿI ÿxÍþ™—þªmþ©Sþ—Bþp;þ4=þæIþ…Zþqþ ‘þ!¸þ™èþ ÿy ]ÿß ¡ÿ? åÿš&ñfD –Õé<4þ^âü„7û¥ŽùÁë÷ÑOöØ·ôÓ!óÃŽñ¦ÿï€wîT÷ì"„ëè ê¤Éè_{ç7æ¼ÿýäaÿÔãÿ¹â§þ³áGþÄàæýíß‹ý*ß3ý~ÞßüëÝ‘üpÝKü Ý üÃÜÖû™Ü¦ûÜ‚û§ÜjûÞÜ]û6Ý[ûªÝiû6Þ‚ûßÞ¦û¥ß×û‹àü•áeüÈâ¾üä!ý–åý$çÿýÇètþuêíþ-ìkÿñíðÿÊï{ÁñØó© ö@NøÐ’úUÅüÌãþ5î•óñýIž6 îY 4l fg„<‰êzuWç(BòŽ´Éoó ÃùZÇÞnTíÁH&…‡«è¹J¬°ÿˆÿMvþöÜýƒCýú¬ü]ü¨”ûÞû£ú;úâù“ù Qù÷ùÙôø´ÙøˆÊøWÇøÑøÞêø™ ùT Fù ‰ùË Ùù‹2úN—úûÍuûŒíûKküïüØÿxý§þþzýšþQü2ÿ+ûÊÿ údêøûÑ÷Áö¸õµô»óšÉòãñˆñ÷/ð`fï¿§îõí]Níš·ìË.ìô²ëFë*êê9žê?_ê;2ê,ê êòêÆ,êVêTê×êÊ.ë{–ë(ìÒŸìw>íèí´šîORïèð€Þð½ñµ«òQ¥óî¢ôŽõ2”öÛÿ‹÷‰ÿ†ø;ÿŠùóþ–ú³þ¨ûsþ¹ü8þÄýÿýÄþÉý¸ÿšý£týŒXýtGý]?ýI:ý57ý0ýç$ý¦ýN ýêý~ ý ý¤ (ý< :ýÌ GýQ Jýà Cý 2ýa ý– ý¾ ôüâ ãüÔü#Ãü>¬üQüWfüM7ü/üÏûÆ šû hû3 6ûå û‘ Úú8 ®úÙ ƒúq Zú 4úˆ ú ùù æùòÞù`áùËîù9 ú¦-ú]úˆ—úüÛúq-ûèŠûaöûßoüb÷üìý.þÚþ½ÿhKßÿÕ¨ÿ¢zÿqUÿD6ÿ ÿóÿËÿ ÿn'ÿ4 =ÿí Vÿ™ qÿ8 ‹ÿÈ ¨ÿL ÊÿÁ òÿ' } C¿ fí ~”ð ˜Ä šƒ ™/ ‘Ç }M YÁ '# éÿu  ÿ· Lÿèïþ Šþ&þ6§ý>*ýB¥üDüB…ûAçúAEúEÿ¡ùMþúø[ýWøpü¸÷Žû÷¸ú„öîùñõ0ùeõøÝôá÷[ôO÷âóÍöqó]öóö¸òµõsòzõAòPõ!ò6õ ò&õò"õÿñ*õòBõòhõ>ò õ{òéõÍò>ö0óœö¢óøöôT÷•ô¯÷õ øŽõeøöÉø¥ö7ùC÷¬ùñ÷&ú­øœúpù û3únûðúÆû¥ûüRü_üùü©ü ýóüKþ?ýýþ‰ý·ÿÒýsþ2PþëƒþŸ¯þLÚþîÿ‹)ÿ%RÿÁÿ_¯ÿÜÿ¬ X; l¬ Q Ðî ˆ G ˆ¼ Ð[ ý nŸÂ@ÚspÏ+•Š%í®R,ºž$]ö°YþµD|d¢±¶ú³A ›‚ r½ 8ï í 7 G ›K C V- ” ¹å Dz Àv § /  ÚJ z ·V äybßÖ=A•ªÿæ þ1nüvÍú´,ùí‹÷#êõXÿLô‹þ²ò½ýñðü˜ï'üîaû®ì úRëåùê3ùÆè†ø•çß÷uæB÷få±öhä,ö…ã²õ¿âGõâìô~ážôá]ôšà+ôKà ôàþóúßôýßôà?ô[àvô´àºô'áõ°ádõLâËõþâ@öÈãÅö¯ä^÷³åøÓæºøètùcé0úÃêëú0ì û¤íVü$ïý²ðÎýUò“þô]ÿàõ%¾÷é§ù¡‘ûJwýâXÿj3é_çÎÄ9 ˜| íW 00aüµ‘UÝ„Ln£Qì(,÷_À€Š4wâCŒí3u Ôä y8!!s!Ì—!w¦!( !Ý~!”>!Pà b ÞÊ´’X|†q¥oµu²ž”u­<Ëõï¥KNé…› B ~— · êðC_iÏ‹>¨°ÿ¾"þËüÎÿúÇoùµâ÷™ZöpØô>^óèñÀuðuï ¡íÆ@ìdîêü¨éqèFç¨ÿ)æ0ÿå·þä?þãÈý=âTýqáäü¾à}ü"àüŸßÀû7ßlûäÞ"û§ÞáúƒÞ§úzÞ{úŽÞ]úÃÞKúßDúŽßIú'àZúÙàxú§áŸú‘âÒú“ãû¯ä^ûçå²û<çü«èsü/êØüÄë@ýlíªý'ïþóðþÔòÿÄô†ÿÁöÃø}ÅúïÆüTÃþ®»ü±E§Š—Ì€ c E: s’³œK—ȃ(aq8¦ ÄÜϤÇg£!_Ðûty×§>>ÔÿJjÿ=ÿ¢þÝ>þ‘ßý0ƒý¹+ý-×ü‰üÛFü ü9ÚûT³ûe—ûn…ûo{ûizû\„ûH—û-µû àûé ü¿ Wü” £üj øüB UýµýüþÝ…þ¿öþ lÿ€èÿdiKð<ÿz3þ0ýŒ4ü<ûFú Tùgøõƒ÷f¨öÒ×õ:õ›Pôò—ó>æò€?ò¶¡ñá ñ€ðð'ï*%ï#Èîvîò0îÉ÷í•ÊíVªí —í¹Ží]íúœí޵íÚí¤î'Sî ï˜fï Ðï€Aðôºðj>ñâÿÍñZÿiò×þóXþºóÝýiôgýõöüÖõŽü“ö-üT÷ÖûøˆûáøDûªùûvúÐúFûŸúütúãüQú®ý6úvþ)ú?ÿ&ú0úÏAúœWúenú'‚úÜ•ú†¨ú&¿ú¾ÞúWûó1ûaû+û¾¸ûD Öû¹ ëû úûr ü» üþ ü= *üz 7üµ Büê Dü Aü2 8ü? (ü8 ü$ ü ñûÜ áû³ Õûˆ ÊûZ Âû% »ûç ¸ûž ·ûJ ½ûî Ëû‹ àû& þûÁ'üYZüò“üŒØü#'ý½ýVâýòOþÉþ1PÿÖàÿz1èÊ¥zk.7æ ¢äbÅ#­è®“o‘, •á Ÿ «, »À ËI ÝÆ ñ6 — "ê ;-Q[auf|bmXGI7Ä g üõ Ís ß E: í… ŠÀ ï§%(›ÿ5ÿ9dþ:»ý6 ý.Oü&ûÂúÿöùþ'ùý[ø'ü”÷9ûÍöSúöwùAõ¨ø{ôæ÷¹ó1÷ÿò‰öQòñõ²ñhõ!ñîôŸðƒô,ð)ôÅïáókï«óï„óÞîló°îcóŽîcóînóƒî…ó›îªóÆîÞóï"ôZïrô¿ïÏô0ð3õªð˜õ/ñüõ½ñaöSòÆööò/÷¨óŸ÷iôø5õšøöùðö¢ùÖ÷!ú¿ø™ú¦ùû‹únûmûÒûMü7ü0ýŸüþ ýÿuýúÿßýîDþå£þÕûþ¼NÿœÿtëÿE9‰çÚ»,Ž }b Í3 ý i¿ ¶z /Vܨ†ü.RѨoþR¨.ý¶U5­¨ah»µÿfB¶{ ªF ʉ ÕË Í µE Ž{ X¬ Ô ¾ð Y á W ½ ï Q× ~¶ –Š Q ” { ½ U _ $ öä ‚“2}ÄìJRƯ<¯ÿMþ‡üÊíúQù1²÷]öˆÿyô±þàò×ýNñýüÅï"üEîKûÏìyúgë«ù êãøÂè#ø†çl÷Yæ¼ö?åö:äõHãôônâsô¬áôá ónàNóòß óߨòLߺò#ß­òß°ò0ßÅòaßïòªß'ó àpóŒàÆó%á)ôÕá™ô£âõ’ã¢õ¡äAöËåìöç¡÷jè\øÖéùLëÙùÐì“úbîLûðü´ñÈü|ó‹ýWõPþB÷ÿ8ùÔÿ5û†.ý+"ÿÀGôÅÓ9²¦’ v jU ¼-÷5¨Z=rº{$||tÄhùQ 4-íô½®‹KXÈ$' în ¸š ‰­ [« .” d ã ų¬4›ž”ó•7šm¦‘¸¤Ï¦è™}+RV…ß¹œðO(ü^¤’E Âß îv  :œ\,x»I¡Ø©g¨ùþœ‹ý‡üg¯ú<Dù Ü÷Ðyö‹õ?ÇóêuòŽ(ñ)âAîKgíÔ9ìWëÖêTøèÑÿûçKÿ çÆþ(æDþRåÂýŽäDýßãÊüBãUü»âçûIâûíáûªáÇúyáwúaá0úcáòùzáÀù«á—ùóáxùWâcùÖâYùmãYù#äcù÷äwùæå—ùêæÂùèòù4é*úsêhúÄëªú'íîúŸî6û)ð‚ûÃñÓûmó+ü$õ‰üåöêü¬øGýxú ýEüòýþ;þÓÿ~þ¿þIÿAÿºƒÿpÁÿ ûÿ 'P JÆ`"lfp—p¸pÇoÄi¯`„Q>;ÝaûÿÉÔÿ¬ÿCÿ]Xÿa2ÿQÿ.êþúÇþ²¦þTˆþàlþWUþºDþ 8þR1þŒ1þ¾5þæBþUþnþ*‘þ/½þ.ðþ)+ÿ! mÿ µÿ þ Qò¦ëåhâÑäAæ¶í.ö¥‘7ÿ\þuˆýå¼üTóûÁ2û+vúÁùîùCpøÕ÷ÑB÷ ¶ö7 3ö[ µõu ?õ… Ïô‹ gô‚ ôn ®óL \ó óäÒòœ˜òJfòë:ò‚òóñ×ñ Âñy´ñà±ñA·ñ›ÂññÒñBåñ‘üñàò-=ò{ÿlòÈþ¤òþâòký%óÃükó!ü³ó„ûÿóñúPôcú©ôÞù õcùpõòøáõøXö5øÕöç÷V÷¦÷Ú÷m÷_ø<÷ãø÷hùøöïùåö|úÝöûæö¶ûûöaü÷ý>÷¾ýg÷cþ’÷ÿ¼÷—ÿê÷)ø½RøZ’øýÙø§$ùQrù÷ºù”ûù$6ú§kúúÐúüûh7ûÕlû@¡û¦Ñû üûU #ü– CüÊ `üð ~ü ü# ¿ü6 âüG ýV 1ý^ ]ý^ ŒýP ½ý9 õý 1þí rþà ¹þ— ÿk ^ÿ> »ÿ ≮ýwz@ÿ ‹Ù©³}MUë/‹.òÔÙ}Ä(²Ñ¥y  š¹ šM žØ ¤Z ªÔ ­B ³§ ºÃOÌÔºÕÖÐâÁÙ­À’—q]M¶ èJ £Í P? ñ¡ …ô 9 p žmÀÊÚé`óžÿöÑþóúýîýå2üàÿCûÚþOúÖýYùÖübøÚûl÷äúvööùõù‰ô1ø˜ó[÷«ò“öÄñÖõçð%õðôMïìóîfóáíëò@í€ò°ì'ò3ìßñÊë¦ñuë{ñ1ë_ñúêNñÓêJñ¾êPñ¼êgñÎêŒñúêÀñAëò¡ëWòìµò™ìó+í}óÇíèójîWôïËôáïHõ¹ðÓõ¤ñgö£ò÷¯ó¡÷Æô@øáõÚøÿöpù øú@ù•úbú(ûˆû¿û¶üZüêýõü%ÿŽýb&þŸ¸þØCÿ Éÿ2JPÉiD¿“ 8£ °¯ #¶ “µ ©jÐl2<’ï¹IkŸõ·IO›Þí^=Ì*Øz ¼f ô¨ #ä I aZ g“ ]Ë Eþ 0 å^ ¡ƒ R¡ ô» …Ì Ö zÛ ÞÝ 4Ö |É µ´ ß” ùl 6 ÷ ö ­ Ý Y ¹ ü Š ” M # §¯ Q’éö{P¡ÿéþ(ü`û“~ù¾ó÷æjöâô)ÿ\óGþÛñbý`ð}üìîšûíºúìÝùÉêù‚é7øEèo÷ç­öúåõõîäJõóã©ôãôBâóáóñà±òkàYòýßò¦ßÚñeßµñDß ñDßñd߯ñ¡ßÒñüßòoà?òúà‹ò—áäòNâIó#ã¼óäCô+å×ôaæwõ²çöéÎö’ê~÷ì,ø¨íÛøEïŒùíð@ú©òùúyô·ûZövüLø1ýFúèýBü’þ7þ2ÿ%Çÿ PîÓÏR±Í Ai ®6 õe¡°8ï¸#&NrÁ‘ï« ¿ ÐøÜËâ…æ!åœåûßAÙoÖ†Ó…ÐmÐ9Ôê܃æósÍ*P@yX’uš•–¹…ái B3Zà€¤£`ÃàÎ ü~ , .Ø@…P0VÝX‹P9Aë-¡ÿWþìý¿Ëû‹úSMùøÅãös¸õ”ôºvóQ_òâLñp?ð÷;ïzAîùRívoìð—ëgÊêßÿ êTÿOéÉþ£è?þè¶ýwç1ýùæ¯ü‹æ1ü/æ·ûååAû©åÒúåhúkåúgå§ùwåQù›åùÔ廸!æ~øƒæHø÷æø€çô÷èØ÷ÇèÆ÷‹é»÷eê¹÷UëÁ÷XìÍ÷jíÞ÷†îô÷®ïøÞð5øòbøló—øÍôÕø>öùº÷\ù=ù¡ù¿úãù9ü#ú°ýeú%ÿ©ú™òúAû’”ûèû‹8üý„üa Êü³ ýò Cý" |ýC¶ýVðý^*þXbþD˜þÊþäôþ“ÿ(;ÿ¤XÿsÿVŽÿ”ªÿ¿ÅÿÛßÿæøÿÛº'„>9UÛml‡î¢eÁÏã/ „5Îd ˜BÐo—E¹ ‡Ø Ìõ  e- »G cu„Ú§?Í£÷#lVÓŒ8Êž^j·ÿÍÿ) zþ äýÑ Tý Ëü\ Kü– ÒûÇ aûï ÷ú ”ú" 6ú, Ýù( ‰ù 8ùû íøÑ ¦ø˜ døS $ø é÷¤ ±÷9 {÷ÁE÷>÷¯Ýö«öp~öÁSö 'öJýõ„Ðõ¹¢õèvõMõB'õmÿõ–þçô¿ýÆôêü¦ôü‡ôMûlô†úVôÆùDôù9ô]ø2ôµ÷/ô÷-ô…ö1ôýõ<ôƒõPôõmô¶ô“ôbôÂôôöôØó-õ¥óhõ{óªõaóõõTóHöVóªöfó÷€ó‘÷¥óøÐóøþóù2ô—ùiôú©ô«úòôBûEõàû¢õˆüö7ýhöèýÌö™þ-÷DÿŒ÷ëÿë÷ŒJø-«øÎùsxùãùÁPúd¹úû˜ƒû$äû¥Fü¨ü ýsýlÝýÖIþ< ·þš 'ÿî —ÿ6 t xª ìØ e ß- _R ât k ö¥ „µ ¼ ¦À 7Ä ÈÈ ZÇ îÆ Æ  Ä « ½ @ · Ð ° \ § ä Ÿ d ˜ Ý M ˆ ¸ { m v_ ÉO > P, € ¢þ ¹Þ Á· »‹ ¦Z …# Wç ¦ Ì[ q ¢ 6 Áx A× ¸* 'p ˆ« ßÞ(f%›:ÄIæRÿÿTÿSþNýGü@ÿóú7þàù/ýÊø+ü²÷(û–ö)ú{õ0ù`ô=øEóQ÷.òmöñõð¿ôïùóî<ó/í‹òNìêñxëUñ¯êÎð÷éTðRéíï¼è–ï<èKïÑçï~çäî=çÈîçºîüæÀîýæÞîçïOç]ï§çÇï!èSð½èñ}éëñrê$ó°ë¸ô;íªöïàø4ñû_óNýœõqÿà÷núQLüzþÏ«€á* Ä \D “ §´ Þ¼ ⬻}r9{‹MöMÊf¾Ú Ù+"Þ_#Öy$É{%¹k&¤Q'Œ!(sÓ(Yi)6ã)6*èb*Ám*¢^*˜;*¦*ʽ)ñf)ù(2w(Bß'I)'A_&/†%ž$ø©#Õ¦"¦œ!mƒ ']Ò,lðùª{Vñù]‘Á¢o·õ ü* cW Á }  Ÿ h ½ ®Ùîî'øZöˆê³þÚÙüËüú¿ù·=÷¬ÿZõ“þvóhý’ñ0ü¬ïöúÅíÁùâë”øêp÷*èPöTæ)õˆäøóÈâÂòá‘ñkßhðÒÝIïIÜ<îÑÚ>íhÙGìØVëÎÖhê£Õ†éŠÔ¬èŠÓàç«Ò%ççцæ<Ñæ²Ð“åMÐCåÐ åëÏíäçÏßä ÐæäSÐåÂÐ6å`Ñå1Òàå0ÓSæ^ÔÐæ¾ÕJçK×ÃçúØ9èÂÚ°èÜ6éÞÚéÅà©êã¥ëžåÆìSèýí#ë4ï÷íSð¼ðKñbóòæõÑòNøƒó²úLô%ýBõ¹ÿoöuÍ÷TGù?Áú üÔ >ýO(þŠÞþuÿv T¶<ˆ8}D‹L ž4"é#z\%.&Á'<h(°9)) *± ×*E œ+Û I,n È,ø -w -ì Ü,c ‚,è ,ƒ‹+: +ˆ*øö)×N) ‡(U˜'ó}&ˆB%!ñ#Í“"‘1!cÏ0på rÓ"—6þ\Zг½ ñjÌ23 +ž  Ïs„Ü,E̲d%ñŸt#ÿé°ýMEü£áúç‚ù*øHØöeŒõ{Iô…ó‡âñ€½ðt¡ï] î? ‡í ‰ìÿ –ëá­êÁÓéžév<èEç ÑæË/懙åAÿåûý›ä´ü3äpû×ã.úˆãíøHã®÷ãröóâ<õáâ ôåâàòûâ¿ñ ã¤ðQã‘ï‹ãˆîÏã†íäìlä¦ëÔäÆêQåøéæå8é—æƒèaç×ç=è6ç éšæêæåêwå¿ëøä“ì†äkí'äRîØãOïšãcðgãñ;ãËòãôøâKõçâ|öæâ£÷üâÀø.ãØùyãõúÔãü7ä=ý›ä_þúäxÿUå‚¶å~%æq²æcfç]FèeSét€ê‡¹ëëìw î= öîÛ ÑïV ©ðÀ  ñ, Ìòª =ôC êõô ¹÷³Šùk?ûÄüyþ¾[ÿß–ëëõfCÄŒ„Þ1 ,¿ e, |ÂeEV-®&2KK}fŒtvnCMý°Ì^†J·PÉî×E±Ky3,Ëæ^¾î‚U³ J óÜ 2d UÝ fI mª v ƒP œ“æ‡0gv/µãî‰)DÌ ds  ™Ñ¶ÿ„Óþ4òýáýŠ.ü3Lûáiú˜ÿ‡ùZþ©ø(ýÏ÷üúöéú+öØùcõÎø¡ôÍ÷æóÒö2óâõ‰òþôéñ+ôSñmóÇðÀòFð'òÎïžñ^ïñùî ðŸî(ðOî½ï îdïÓí ï§íðî‹íÐîví¸înížîríˆî~ízî”íwîµí…îßíŸîîÃîQîéî”î ïÞî)ï)ïIïvïrïÈï¥ï#ðäï‰ð+ðýðuð€ñ¿ðòñ§ò@ñ<óyñÉó®ñLôèñÅô,ò9õxò®õÍò-ö$ó¹öxóT÷Èóøô·ø]ôpù®ô'ú õÙúvõ„ûòõ&üvöÄüûöaýw÷ÿýå÷þGø<ÿ øßÿýø…jù7õùõ¤úÂoûžMü‚-ýdþý8°þøBÿž»ÿ0&ºœI ,ì ߪ ¶ ¤g ™L ~#DÞæveðÌT'±ˆ÷|p õð qo ãß A: €€ Ÿ² žÖ Œð r W ? # ÿï ÅÅ j ìU M •â Щ m D* „ Ù Â { ÷   –'  «üIÒü¢¾u‡OG1óˆðþ×ý>½üþ¥ûÜ”úÌùÁ•ø°ª÷‘Ñöiö@Hõ™ôöóøcóÿàòrò/òNÍñi–ñzrñ…bñfñ }ñ»¨ñáçñ6òA’òlþòŽuó¦ùó¶‰ôÁ(õËÓõ׈öâJ÷íø÷ãøûµùöˆúèYûÒ)ü²øüŒÅý_’þ/_ÿú(¿ì}¨4Xáýˆ•'!½¦N%Ù›_àÿdXÿ±Ëþì9þ£ý( ý2oü.Õû%;û úúö`ùÝ»ø·øn÷2ÍöÐ0ö\œõÝõ\ˆôÞôjóóŸòB)òäÔñ~ñ]ñ•1ñ ñƒÿàððþ²ð^þ„ðÎýZðGý>ðÑü:ðmüXðü¡ðßûñ«û–ñxû!ò;û›òëúõòˆú*óúLóùvó+ùÀóÎø:ôøãônø³õfø’öiøm÷iø7ø]øéø9ø…ùø ú¿÷‰ú{÷ûF÷Šû&÷ ü÷Çü*÷ý?÷BþQ÷ÿ\÷¼ÿY÷hO÷ I÷£M÷7f÷Ô÷GÔ÷Æ øBnøÀ¸øBúøÎ6ù`vùô¾ù‚ú‡úuû׫û. Vü ýÚ ºý> kþ® ÿ' Èÿ  { =l ¶ ìî Ù Ñ= Íi È› ÅÖ ¿¶ Uª ‰œ ® Á„ Âx¹i§Y‘@€oâ\ŸDM%ìû à ‚ 9 üì [ §O Þ ü³ ` ü Þ­ ­K gä { £ §‰=àÙ#ySr¾^~÷hŽC# ¿Ò c‰ 7 ´ÞV|ð‚¢+³²U6ÿû¾ýšGü-×ú¶ÿkù6ÿøµþŸö7þ:õ¼ýÙóBý}òÆü'ñBüáï·û®î&û“íúìõùšëRù¸ê©øÞéþ÷éR÷4è§öiçö©æ`õ÷åºô^åôàä^ó‚ä¬òAäþñäXñäÁðä:ð"ä»ï2ä>ïAä¹îOä,î`ä–í|äüì®äkìÿäòëpå›ëæhë½æYëçeëhè}ëBéŒëê‹ëÓêvë‡ëPë6ì&ëñì ëÃíë´îJëËï°ëñBìKòôì—ó®íÚô_îöþî1÷‚ïHøòï^ùZðúËð°ûVñôüòHþ×ò¦ÿÌóØôWëõøöÕö÷áø7¾ùo’ú² jûû LüI Eý QþÄnÿá“ê¹ÞØÅç¨å×}Èj¸O¯&® ä· …à Í z× ××)Ès¡·cñ¾.l.(òéÀª„\2Æ›B'ª¨`~·Ñ UNž{Ü À/ÚBí@ù.íÇÿ œú oô 5î íé‘ã#ߥÛÚŠÞñæTó®þ B=ÿx^þŸ‚ý¹«üÇØûÇ û½?úª |ù ¾øg ø6 S÷ú¢ö³ôõ_Gõô•öó Ró¢´òÿòý„ñ÷ûïð[ú]ð¸øËï÷5ïlõŸîÂóîòpíoðÚìÄîJìíÃëoëGëËéÔê+èhê“æê å˜éã)é âµèÁà=èqßÄç2ÞQçÝïæáÛ¥æÙÚuæòÙ]æ*ÙZæ‚Øgæø×wæ‹×æ4×…æëÖƒæµÖ‚æ™ÖæÖ°æ¤ÖõæèÖdçf×ùç!Ø´èÙ‡é(ÚeêSÛ=ëzÜ ì‘ÝËìšÞ‰í§ßOîÊà.ïâ3ð—ã_ñRå¯ò>çôLé“õië ÷‡í{ø”ïÞù„ñ9ûZó’üõóýÖöbÿøß}úküÿŸþ“Òž& '}  á ¹ EW ªè |m½³üT#ï.y%ã-îTÅ\—Lb/ÉòXΠУ!0d"v #©Š#Îæ#æ!$òC$ïN$ÜP$¹S$N$6A$Ý$$tò#ý¦#z;#ï¶"W"°t!À E ?¯sÔœó¶ Á¼¤‚W&ïñ×¹¹ ~• @k ø; « X Îÿ ¢ OD ä¿„q'ÍÊþvpý#üÑÿ¹ú~þ[ù'ýü÷Ïûšö|ú5õ/ùÎóé÷gò­öñxõžïGô=îóáìãñ‹ë·ð7ê”ïèèzî çhí^æbì#å`ëðã_êÍâeéºátèµàŽçÁß´æßÞçå Þ)åAÝtä…ÜÆãØÛ"ã?Û‹â¼ÚâUÚƒáÚáîÙ·àéÙhàÚ'à3ÚüßxÚáßÈÚ×ß(ÛÛßœÛñß*ÜàÙÜUà¯Ý¢à´Þáßßá)áââ·âäiã‚å#äÿæáä}è£åêiæ—ë@çBí/è ï=éùðoêóÅë.õ0ía÷§î“ùðµûxñÄýÀò½ÿðó¢õ„>öj~÷\âø` núm ü{ Úý}”ÿe3.ªÖô_Ð(.2ƒOˈ Ý *B 9§ + üý .°!2L"Ð"Ñ>#„˜#6á#ô$À#$–$hð#'«#ÌI#LÒ"©P"îÁ!)$!ey ¥Âì÷5w#¥½¿ç¥¾v7`ð*¥íWª_Är·^  « mQ ¸úú£<M|ø¾¤üS1[¾þxzý‰<ü’û” Òù” §ø‘ ‚÷ döˆ Nõ‚>ô|9ót<òlKñdaðWïI­î:äí/!í(ÿjì'þÁë,ý%ë8ü•êIûê\ú éqù9éŠøßè¤÷ŽèÀöLèãõèõîçAôÕç|óÍç¾òÖç òëçWñ è¦ð<èùïtèPï¶è«îé îeéqíÓéàìNêXìÖêÔëkëVë ìÝê´ìjêfíûé î‘éâî0é©ïÙèuðˆèFñ>èòÿçøòÄçÜó‘çÊôiçÃõJçÁö8çÂ÷2çÁø8ç¸ùLç¥úhç…ûç_üÃç5ýèþ[èôþÃèãÿ@éÚÐéÓnêÃëŸÁëcpì !íÚí# î¦ï1ƒðɬñnöò Uô½ ¶õQ ÷Ê <ø$ Vù` aú‰ mû¨ ‘üÈ Õýô Dÿ- Ôo v² î ¦ 0 Q2 l # n f ñ j Û € Ê ¯¾ ò² 9¢ nŒ ‚o jK %& ¼ÿ @Û Á· K“ ßn xB  ƒÕ Ú˜ Y  á á« ¾y ŸE ƒ cÓ7÷D™óŸ|KÊø ¥ES‚þäG<åh~‡­ˆEu Ü\ qB + ” # °ý@ðÒÿÞeÿÌùþ·Žþ¢!þ”¸ýŽÿPý”þíü¤ýŽüÀü5üéûàûûûQúDûùûúÔø³ú$øqú€÷2úìöúùhöÊùñõ¡ù‹õ|ù0õ]ùáôCùŸô+ùiôù:ôùô÷øóóðøÜóîøÐóïøÒóôøáóùøûóÿøôù=ô ù\ôùyôù—ô*ù»ô6ùçôBùõKùOõPùƒõTù¯õVùÕõVùöõTùöUù5öWùWöXùyöXùöVù½öNùØö@ùíö-ùþöù ÷ÿø÷ëø"÷Ýø0÷Øø=÷ÛøM÷ãø^÷êøn÷ïø÷íø’÷âø¥÷Õø»÷Éø×÷Éøú÷Ùø%øýø[ø6ù›ø}ùÝøÉùùúXùSú‹ùŠú¹ùºúëùíú)ú,û}úûìúîûvûvüüý°ü½ýFýdþÃýÿ#þÿjþ £þƒÞþû0ÿƒ¢ÿ7Ë쌩S]ñÏZuš¹ŽË äƒüfu Íë A^ ®Æ " 3q A² 5ç  / A F 8< ]# zù † x~ R2 !à ð† Í& ¿À ÄO ÕÕåRëÅá1Ê”«öŠWn¹\RƒTí^Xqĉ4Ÿ§¯·žÿ·&ÿµµþ¹PþÆöýà¤ýYý1ý\âü…³ü§üÆzüäpüqü-~ü[“ü“²üËÙü ý>Aýpý¢ÊýÐþ oþ0 Éþd %ÿ– †ÿÄ èÿñ I ¬; X qp Ò‚ / Š‘ à 0 }j ÁJ ü /ç Z¤ |W –ý¦˜¬'ª¦œ„}cÓ7XÁ‰w®$ÊËÚjåÿæþŸßý2Ðü¿ºûA ú»ÿ€ù+ÿ]ø•þ8÷þönýõôâüÚó`üÆòåû¹ñlû±ðòú®ïsú³îëùÁí[ùÝìÍøìEøFëË÷œêc÷ê ÷ƒéÉöéö§èQöDèöâçÂõ‡çoõ@çõçÎôç—ôJçuô§çjôèsô™è…ôé–ôaéô©é—ôìé†ôAêpô»ê[ô`ëUô2ìcô(íˆô6î½ôGïýôKðBõ9ñ€õò¶õÐòáõ‰óöNô)ö+õPö(ö‚öA÷Áöpø ÷£ùb÷Ëú¾÷ÞûøÛüƒøÈýéø¬þUù”ÿÄùŠ<ú’·ú«8ûʾûäGüïØüåoýÉþ ¼þu tÿT 5? ÿ6 Ð3 ¦+€[ê:¨Ròõ‹æ#Ý ÁÖ bÎ Ç •¿ ²Š é4vrY§8× ÿÚ!š;JIïGŠ7•õÄkмLû&¹@dH ;§:íÇ«NRÐèNlÈÜ=9­»ãäûG¦üèV Ä¢ ’ä V !  \ À ™ f Õ š:(Y²i6p¶t7ÿxµý{1ü}¯úvÿ1ù^þ³÷:ý6ö ü¼ôÓúJóšùÝñdøwð-÷ïôõÐíºôŽì~óXë>ò-êúð é²ïóçmîàæ+íÙåíëâäºêüã•é,ãzèrâgçÓáZæKáYåÒà]äfàmãàŒâ¯ßÃá`ßá%ßsàßïßß‚ßß(ßOßÛޢߙÞàbÞsà8Þçà Þfá#ÞñáMÞâŸÞEãßä®ß å\àæá3çÃá_ènâéã¿êÈãðëŒä%íoåeî|æ·ï²çñ éžòvê5ôçëØõNí÷£î)ùçïÊú#ñcübòõý±óƒÿõ—ö¤.ø<ÐùÚqûyý Žþµ I tÒ ãNY¿Û!ftñ»{ ô÷ c :½J NSA›$çø7·„aÅôîsÞ0 óo Ô› ¨² o² ( Òu m 9 ü ç!ð! M"„“"ëÀ"BÑ"ŠÒ"ÄÅ"î¬" ˆ"T"" ½!÷U!ÜÜ ºR ‘¹b2bý©à è‰ L M pÔ‰š–e™3•ŒÜ€·p—]}ÿCjþ"\ýúUüÌ Vû™ ^úa nù% „øçŸ÷¤Äö^íõõ¼Vôb–óÛòÿ(ò2þ{ñÂüÕðOû1ðÕù•ïVøþîÓökîLõÞíÀóTí0òÒìœðUìïÚëuídëßëðêLê‚ê¾èê4ç¸é¯åbé0äé¼âÊèPá†èíßEè”ÞèNÝÇçÜçîÚeçÜÙGçàØ8çü×9ç-×KçuÖkçØÕçUÕ»çêÔëç›Ô èoÔ^èfÔ¬è€Ôé¾Ô‹é%Õê£ÕÁê4Ösë×Ö.ì×ëìbØ®íWÙzîyÚQïÍÛ9ðJÝ8ñæÞLò’àsóEâ¥ôõãÝõ¦å÷\çHø!éxùýê¦úóìØûïý0ñ\þkó³ÿ°õñ÷x&úÝHü6XþƒYÀWíY c* v@ ‡ V j‰yk€5èn‹J!­Î0v© “b˜}± Þ¯!1"}^#º$éÕ$ }%&"œ&'L'àr'³{'}h':;'ðÿ&œ¸&=e&Öþ%i„%ôó$vL$òŠ#j²"ßÈ!NÏ ¸Ê!·ƒÝw1DƒÏºe` § ¡í 8- Ìj ^¢ ðÖ  3  ^3 †Ç¬]Ïöï•9(â?“ÿSÿIþdþýrýÊû~ü–ú‡ûjùúCø˜ù!÷žøö¢÷îô§öáó«õÜò²ôåñ¸óõðÂò ðÎñ$ïÛð<îëïXíþîzìî¥ë3íÞêTì#ê~ëné´ê¼èðéè5é_ç‚è¶æÚçæ<çx卿ëä!æhäªåðãEå†ãíä'ãªäÏâxäâTä<â;äâ/äÑá5ä±áKä¥ásä¬á²äÂá åéá|å"âægâ›æ·âFçãüç‹ãºèä„é¬ä_ê]åLë%æMìçfíðçšîêèßïîé.ñøê†òìÝóí4õBîŒöxïæ÷ÄðMù)òÁú¡óEü&õÖý­önÿ/ø£ù– ûfü‹½ýëÿC}– ïç n< ð– mîÝ:6 vu œ  ©¹ šÈ sÑ=Üöä¡åCÚÜ»gˆã>Kß¡tሃóÝPª–jÆåÄõ[ùèûgúÖõ8èÏÚªrO'ͦdÆðÝnîäøYû Èù 4ó ™ê ôÞ @Ï{À©°Ížë‰s%^@ GZ 2p !ÿ€ þ‰ ýÿû‘üú”ýùšù§øº%÷Ñ>öí_õ ‡ô(¹óKÿóòqþ9ò ýŒñÛüèðüPðjûÅï½úGïúÒîwùkîÛøîGøÃí¼÷ƒí9÷Rí¾ö0íKöíâõí~õ"íõ:í¾ô_ídôí ôÍí·óîgólîóÌî×ò8ï”ò°ïQò2ðò»ðÍñNñŠñêñFñ‹òñ3óÀðßó~ðŽô@ðBõðøõÈï²öïp÷Yï0ø#ïñøîî¯ù¾îiúîûhîËûEîsü(îýî¿ýîeþî ÿî®ÿîI"îÝ<îd`îÞîKÌî¯ïsïnßïÏZð3àð–pñôòDò†7ó¶ÚóÙˆôòHõö!÷Aøiù• ú¿ ûãüøôüþâýöÍþâ»ÿË®´­§³¤À©Ï³Ø¼Ó¿½·–£` „ ]Ö 2‹ @ äõ Æ£ ­F™Û„]mÍP+-€ÑÖ£gr¨@Üÿã ¶‹ò`Ô3¬‚ÙXª){õMµ!jõ Ëž¤"œ\: ï ü\ ÞÇ Â. ª •ë …? yrÜm)lulÃlmhpÁx…—ç®SÈÆã?ÃÿNÿ=áþ\þ|*þ àýÄŸýëiý;ý>ýhþüíüµæüØçüùòüý5 ýPDýhjý}”ýÀý™ìý þ£JþŸ{þ”¬þ‚ÛþjÿK$ÿ$>ÿõSÿÀcÿƒoÿ?rÿómÿŸ[ÿC;ÿßÿrÜþÿÿŸþ†ÿZþÿþ…þ½ýÿýaýtýûüäüŒüPüü´ûšûûûqú•úÎùú.ùˆù‘øýøý÷røq÷è÷éö`÷eöÚöãõXödõÜõäôeõiôòôõó‡ôó&ô7óÓóõòóÇòTó®ò(óžòó˜òáò˜òÃòœò©ò£ò”ò²ò‹òÐò‘òó¬òKóÝò­ó"ó%ôvó°ôÒóEõ0ôßõ†ôwöÕô ÷õ÷cõ1ø¯õÎøöyùrö4úîöþúz÷Õû ø³ü øý*ùcþ¦ù.ÿúìÿuúœÔúG3ûï›û“ ü8‡üÜý‚ˆý#þ½wþNáþÑEÿE¦ÿ«qQä—`Õà `F Ûw O¡ ½Ä %ß ñ ù yú ùù ‚ó ì ¢ã 1Ú ¹Ï : À ± °  › ‰ … ú m r V ó A y / þ  }  ñ  Xó·ãÒlÂű ŸzÏ}ng^ªNæ>*Qû©ßÍÂí¡}W-/8;Õ3¢"k 0ëñÄ­”f]ËÏyv&Ϥs&š¸R_ê­ ~í ! £E 3\ Äÿf RÿaÞþOhþ/ñýwýÈþü„„ü4 üÚÿ’ûyþûý£úžû,ú)ú·ù°øBù5÷ÌøºõVø@ôÞ÷Äòh÷KñóöØï‚öiîöí²õ¤ëTõSêúôé¢ôØçIô¯æîó—å‘óŽä3ó•ãÛò±âŠòäáCò/á ò•àÞñà¾ñ°ß¡ñg߉ñ/ßqñßSñðÞ2ñåÞñéÞøð ßêðGßéðªßûð/à!ñÒàTñáñ\âÍñ/ã òäDòàävò¿å¨ò¤æâò˜ç%ó¡èuóÂéÙóüêPôNìÔô²íbõïòõ‚ðöÛñ ÷&ó÷hôø¦õ—øíö#ùAø»ù§ù`úûû™üÐûþ•ü†ÿ^ýê%þCëþ’¯ÿÛq&5sýÅË žn x½ Wÿ 91Tÿhßr¾ s rx pS h/ Z Dáµà…O*´Ë,‚—0ûÔTr¡á˜3ž=1’ é}®îhQšÁÓ\úìq éøUÒ·–Ae×±Tú¼@ €Iºwï”!žOœxœs¿KÞü â  ¤ 6 d R # f ãs ¤|e€!ƒØ…„=íÿq›þZIý;ùûÿ§úôýVùËüø¡û´öpúbõ<ùôý÷Âò¶öxñkõ4ðôôîÒò»í„ñŒì8ðaëíî;ê¢íéZìèëöæÖéñåè÷ägç ä:æ2ãåfâüã¨áíâüàðá[àáÃß*à8ß]ß¼Þ¡ÞMÞõÝïÝ\Ý¥ÝÔÜwÝfÜeÝÜnÝêÛÝÓÛÌÝØÛÞõÛwÞ%ÜãÞbÜ`ß­Üðß Ý–à|ÝYáÞAâ±ÞMã€ß{äsàÊå‚á/ç«â¥èßã'êå°ëRæ?íŠçÕîÆèwð ê(òbëìóÒìÄõ^î«÷ðžù¶ñ•ûuóŠý1õ{ÿáöe„øLú1£û,ýú¹þÔ Q£ õd¡SÂýb™þ# ›  ˆ[â±6\-®ûÜ=š lN!†ô!އ"…ü"iQ#>…#”#É„#]#'!#ÅÚ"X ‚"Ô "3!¡!w! !¥!\ ¾!’È!´É!ÅÄ!ʳ!É!Ã\!´!—¶ mE 5Âì4˜™<ñÞ=%½Ê ìp  +²9N>é:…3#(Èu*ÿñåýÕ¦üµmû 7úf ù: à÷ ÁöÜ«õªŸôxœóD¢ò²ñØÌðžñïbï&ÿXîåýší¡üæì]û8ìú“ëÎøùê…÷kê<öíéñô{é¦óé\ò¼èñgèÆïè}îÍç4íŠçîëRç«ê(çléç2èççç×åç¶ä#çŸã6ç•âNç”ákç¡à“ç½ßÈçêÞ è(ÞaèvÝÇèÙÜ:éQܵéáÛ4ê…Û¶ê@Û=ëÛÅëÿÚWìÛöìÛ§íSÛjî¦Û>ïÜ#ð¢ÜñNÝûñÞéòßÙóüßÊô áÁõ%âÂöJãÒ÷~äîøÇåú+ç6û­è^üLê…ýìªþÍíÏÿœïùjñ)4ó[õôŒ±öµkøÑ'úßêûߺýÙ —ÿÑ xÎ ]Î 9Í Ç¶²K †Ë =: ÚžcûÞYR³Ç>I°|•g’£tÃ@Éù½¡¥=ˆÓf]BÙC癦ØUýõ ˆ ù•ج¢u'3©â(€ Œyõá NJ ›´ Ú  ; `q }à ‘M º &—…üngQÑ0< §ê Ç |¤ ç€N]³;qûÍÿá'ÿÍþ¿Úý»ÿ6ý½þ’üÇýîû×üEûïû˜ú ûçù0ú1ùZù{øøÇ÷Î÷÷÷pönöÐõÌõ0õ1õ–ô˜ôúóô[ózó¾òøò"òòŽñòñ¥ñð@ñ ðÛð¡ïzð=ïðáîÉïˆîwï5î-ïéíèî¥í¦îoíbîGí"î/íäí"í©íísí&íBí.íí:íóìMíÓìmí¹ìí§ìÞí™ì0îŽì“î‰ìüî‰ìgï“ìÔï¦ì@ðÃì®ðîì#ñ!í¦ñ]í<ò£íáòðí’óEîHô¢îõ ïµõ‚ïhöð÷šðØ÷<ñžøèñnù òGúYó&ûôüÐôàüŒõ´ýOö‡þ÷Zÿô÷0ÞøØùüÝúðçûéíüßèýËÕþ«³ÿ|ƒCQ $Á ÿ‰ æY ×- Ë ¸Ô •–^D ݬ d: Ý¿ MC ¹Ê $T ‹ß ìg Cã QÈ­ìùÿ4eõ’Ûº¶à‰Q& @¿Qb[ø[Rú?i#Î(Öy¨Ä y IE z Ü© šÎ Oìø — 1 'É 9^ Nð d‚ { ‘— ¤ ¶ÿ˜ Åþ Ôý‹éüüy/ûò`úl›ùçÜø`!øÚk÷U·öÑ öQgõÕÐô`GôñÍó†cóó¼°ò]eò"ò²ÿêñaÿ¾ñÿ ñÐþ”ñþ˜ñRþ¨ñþÄñäýêñ°ýòýMòRýŽò#ýßòøü@óËü°óü/ôpü´ô>ü;õ üÀõØûEö¡ûËögûX÷)ûñ÷æú—øŸúIùTúúúºú®ùlûSùüóø®üŽøAý'øÐý¼÷`þN÷ðþßö…ÿnöþõ¦Œõ-õ§¬ô?ôrÒóÆióó\©òžRòÜòÃñ8‰ñSXñc0ñiñiñdüð^ñW ñKNñ8‹ñ ×ñþ-òщò›çòbJó&¶óì/ô³»ô„^õYö1ßö ¯÷䀸¼Kù‘ ú`Æú-xûû,üÈæüšªýrxþRQÿ<-,#ØšHÿÿâéÿoÈÿò¥ÿqƒÿðcÿpLÿñ<ÿo3ÿä,ÿO$ÿªÿôÿ/ äþ^ Àþ† šþ¨ wþÉ [þç Dþÿ 3þ %þ" þ) þ' ìý Óý ¼ý «ýî ¢ý× ¤ý» ¯ýœ Áý{ ×ýV îý2 þ þæ@þÁiþ›þtÞþK-ÿ„ÿñáÿÂB’©f>†ó„Óµž—/zÂ]TDè-€ Áfþ û£ ý2 ² ( ˜  2t Eâ [M s® Œý ¦4½VÕbí^Q?#)/ 5à 2¤ ,R ç h òÙ Ï=  œ fô E ÌqÊ øŸ(%§,+y)Ð$!]ÿ›ÿ þÒþùüþàû1ýÃúZü§ù~ûŽø›ú÷´ùyöÍøyõå÷ôÿöŠóö•òBõ¡ñlô²ðœóÌïÑòôîò*îSñrí ðÎì÷ï9ì]ï±ëÒî5ëUîÆêêícêí êCíÅéíéÈìlé˜ìYépìWéPìgé?ì„éBì²éZìòéˆìEêÍì­ê"í)ëí¶ëÞíRì;îöì”îžíëîLîDïÿî¨ï½ïð‰ð¤ðhñ=ñ\òåñcó–òvôFóõíó¦öŠô·÷õÂø­õÇù=öÌúÔöÖût÷èü!øþØø%ÿ–ùHUúlûˆËû™ü 5ýžêý—¥þ‹cÿ|&j îU º7 ‡ Uæ &³ úvÑ0«â‡‡f C ® 7ó ¸È 5š ¯k %<“ïÝ;¦uh #¿×Û‚ø$¾.O>Ó@N/À'Ë…ƒØ4#âb<²ãÇ{ÐË{»á¢7}†OÓÍezª ç ² ?= ÂV :i ©vƒh’·¢û´7ÂhÍÓ®× ØÿÍ ÛþÐ áýÇ îüµ ü›ûv9úHZù~øÕ£÷ÍöEýõòÿ3õšþrô8ý¼óÔûójújòúøÊñ‰÷.ñö–ð¤ôð1óuïÁñîîVðsîíîîŠíí.ì>íÚêçìŽé–ìMèGìçøëðå¬ëÔähëÊã)ëÔâóêðáÇêá¦ê^àê´ßyê"ßkê¦ÞfêDÞeêÞjêÖÝxêÄÝ’êËÝ´êëÝÝê!Þ ëgÞFëÁÞƒë3߯ë»ßì[àpìáÜìøáWíôâãíä~î(å#ïUæËï‡çyðºè.ñóéæñ6ë¥ò‰ìqóëíKô`ï3õäð)ötò0÷ôDøœõbù,÷†úµø¬û6úÐü®ûïý#ýÿ•þ <vaè’YÑÅ*_‚ Ë Ñ î ; ü b þ €ü ˜û¨¬¤ oç@¶l¿p¤4®Ä>L½Ï*FˆªØ÷.NTvm—{®ƒ¸†µ¤n„LQÚˆh-É™_&ì¬s$ñ•dýÊZ$®tú¼Aû„6Ámûž2Çeè”Á ì    9  ] ‚ þ¤ îÈ×ë½0yORo&Œøþ©ÆýÆ’üá\ûúÿ%úÿïø'þ·÷<ý~öOüFõ_ûônúÚòyù§ñøyð‚÷Pï…ö*î‡õ í‰ôðë‹óÚêòÉéñ¾èˆð¾ç„ïÇæ‚îÙå…íøäŠì&ä•ë_ã©ê¤âÂéöáÞèWáèÆà3çCàlæÒß®åußþä(ß^äêÞÍã¾ÞGã¤ÞÓâžÞsâ­Þ%âÐÞèáßÃáfß¶áÑß½áRàØáèà âáVâLâµâã)ã ä±ã åKä æøäGç²å~èæÂédçë[èvìgéòíŠê‡ï¿ë0ñíïòMî»ôœï‰öïðUø@òú•óÝûïô£ýOörÿº÷O.ù?¨ú:&ü9¡ý1 ÿ }ñ ׳&ci¦¢Ü8ÈA Nm Å (¤ s¬ Ÿ¥²¬hŽ :V! "¾§"r+#”#¾â#O$Õ3$P3$¿$#ñ#­#ÖO#'Ù"lG"¥¢!Õæ õ ;MPFú.äÈÓ¤”tK:úö¢¨FMæè‚yÿ¬ ~> õÏ i_Õï9ƒ’á°&Lcíÿ›’þÍ:ýü æû$ ™úI Qùh ø‚ ×ö– ¥õ¦}ô³]ó¼FòÄ6ñÊ0ðÍ3ïÐ>îÒTíÔwìÖÿ§ëÕþäêÕý.êÕü…éÔûçèÔúSè×ùÌçÜøNçâ÷àæëö‚æ÷õ6æõûåôÒå#ó·å9ò¨åRñ¨åoð´å‘ïÍå¹îöåèí.æíxæRìÒæ‘ë:ç×ê®ç#ê1èxéÁèØè]éDè êºçÄê;ç‹ëÊæZìfæ/í æ îÀåîî„åÙïTåÎð5åÎñ'åØò-åèóCåúôjå ö¢å÷íå)øJæ5ù¸æDú:çWûÐçnü{è‡ý6éŸþê±ÿâê¹Îë¶ÈìªÎí—âî}ð`/ñBiò­óùõÍ^ö˜ Â÷Y .ù ™ú» ü[ aýñ ¼þ} ý jrÄàEy¦Í[U ¬„ ô£ -° V­ pšz{xPoaÕS†C(.·3î¸õv<(uΤmÇÛ¥ã=ßÑ Éb ¦ë vn ;æ øY ¬Ç Y5     7wÃáFH¾¬-–tûÖ\9»žv rÏ ß" Po Ä· =û ¸ÿ< 5ÿzµþ¹7þü¿ý>LýƒàüÉ{üüYÂû nûêû8Ìú‰€úáÿ;ú=ÿúùžþÂùþ‘ùtýgùèüBùdü!ùäûùjûæøûúÎø“ú¸ø4ú¨øÝùøù–øCù–øùšøÅø¡ø‘ø­ødø¼ø?øÊø"øÚøøéøó÷÷øá÷ùÒ÷ùÈ÷/ùÀ÷Lù¾÷mù¿÷’ùÀ÷·ùÀ÷ÚùÀ÷õù¿÷ ú½÷úº÷)ú¸÷;úµ÷Rú®÷oú¤÷Žú˜÷¬ú‰÷Äúw÷Öúd÷ßúP÷äú:÷åú"÷èú÷îúìö÷úÏöû³öû˜ö û}öûeöûúLöñú6öèú%öäúöäúöèú öìúöìúöëú(öèú>öäú]öäú„öéú²öùúèöû'÷/ûj÷Qûµ÷rûø”ûbø´ûÃø×û-ùü¡ù<üú€ü¡úÓü*û1ýµû–ýBüûýÎü^þYýÂþãý!ÿlþ„ÿ÷þñÿ„ÿgì¥~6Æ·NRÍçBt¯û~mÄh޳úœ8 n‹ šî ¼F Ù îÐ þ 8 a ‚ %š '¨ &¦ — z P ù ðÚ é• çH èõ æ› â8 ÞÍÚXÖÜÓYÖÖÜQæÌôJÈG)Å?CUÂjC}ÇR£ã·|ÍåÊÿÿÿ6ÿ/ôþD´þVwþfCþuþ€óý‰Þý‘Ôý—Õý›Ûýäýšìý“ñý‰÷ý{þgþN1þ1Xþ‡þè¸þ¼äþ‹ ÿS(ÿ?ÿÑUÿ…lÿ1ŠÿÖªÿtÌÿ ïÿ˜ Ÿ"$‡$ð!PªþÿIÿŽþóÿËý×ÿý²ÿ9üŠÿkû`ÿ™ú6ÿÄùÿîøåþøºþ@÷‰þjöQþ˜õþÇôÉýûó~ý3ó0ýqòæü·ñ üñ^üaðüÄïÛû4ï—û°îNû;îûÓí²ú{í`ú2íúüìÇùÓì‚ù»ìDù¶ì ùÀìÒøÛìœø ícøFí)ø”íî÷îí¶÷Wî‚÷ÏîU÷Uï0÷éï÷ð÷@ñùöòîöÇòèö’óÞö`ôÒö.õÇöýõÀöÎöÀö¦÷Êö„øáöeù÷Kú3÷1ûe÷üš÷êüÏ÷»ýø‚þ.ø?ÿ\øòÿøœÍøEùêhù‹Çù&-ú»–úGýúÅcû9Æû¤*ü’ü`ý·xý ùý]€þ« ÿô˜ÿ9"u¯­:áÉ [C õv –« >â ê —R >‡ äº ˆé + ÓD p 6   ñ Ó « a =  s ¶ § T× ì …( $L Ãl b‰ ÿ£ ‘¼ Ô ˆç íõ Jë5÷ {è ±Ô Û» ôœ ù| íU Ð( ©ö wÀ 9ƒ ïA •ø )¬ ª[  z§ ÍF â Lw z ›—¬ ° ¦  ‹i ù=c ÉÏ,‰Lß.­vUÿ·õýõÿ‘ü-ÿ*ûaþÃù’ý`ø½üýöäû õûGô%úóò@ù¡ñYøSðo÷ ï†öÃíŸõìµôHëÎóêéòúèòåç*ñÜæNðãåyïùä«îäèíEã,íâ|ìÌáØë%á@ëà±ê à.êߺé@ßVéüÞþèÐÞ¹è·Þ‰è®Þgè·ÞQèÓÞLèýÞUè8ßmèŠß“èúßÍè†àé,á~éîáñéÇâuê³ã ë¬ä§ë²åKìÇæ÷ìèç«íéhîdê,ïÇëÿïCíàðÔîËñxðÀò'ò½óÜó¹ô—õ·õU÷±öù¨÷ßúŸø±ü–ùþúqû[ŽüGý/þÿê ‡¿ z hWQ7Ï{þß™¿ žkw ¸K ÷ &Û Ež J Y 6!"Ȱ"A#3¶#á$‰d$+š$¼$PÇ$Ù¶$\ˆ$ÚA$Oá#½i#'Ü"†<"Ü‹!*É oòª ×÷ êŘ cø#ÚÛ°Œ|3<Òñk—0š ¿- Bà º\ (ôŒë$>À‡^Åþú¥ÿ&RþJýf ¹û{ wú‰ :ù ø‘ ÕöЬõ~‹ôjqóQ`ò1Xñ Xðä`ï·sîˆÿŽíUþ±ìýÞëåûë©úSêkùšé,øêèìöDè«õ¨çlôç.óæññæ·ð¨åïEåQîïä%í¥äìdäæê-äÒéþãÈèÙãÆçÀãÑæ²ãêåµã åÈã?äêãƒãäÙâVä@âžä¹áîäIáDåìà¥å£àæoà“æSàçNà½ç_àmèŠà*éÏàòé.áÂê¤áë2â|ìÖâbíãSî[äRï;å^ð0ævñ;ç›òZèËóéõÛê<ö;ì{÷§íÀøï úžðXû"ò«ü§óþ/õVÿ¾ö«UøÿñùV”û®<ýàþc}¾ ™] › Ê àí9 ‡ Ï ' 083S*\Râ2 ÿJ¼âkl ëš_Å’ôcD•…¯¶¸Õ´çží{ëMÛÄ˦q~ J” Æ€wçI¼¢Xôî> ½–ñFkŒü«eÉ Ëç . Ž é 2 C K › `ò sD ‹“ ¢ß ·( Înç°ñ22qPÿ°lþîˆý,¥üiÄû¥äúáú&ù\ÿJø™þo÷Øý–öýÁõ_üíô¦ûôîúNó:ú‚òˆù¸ñÚøïð)ø.ð|÷nïÕö·î1öî‘õ`í÷ô¾ìbô!ìÓó‰ëEó÷ê¸òiê0òáé¬ñeé-ñõè³ð“èAð?èÖï÷çoï»ç ï‡ç±îZçZî5çîç¼íçzíç?í$ç íJçßì~ç¼ì½ç¢ìèì]è†ì½è‰ì)é•ì¥éªì1êËìÎêõìwë+í*ìiíçì³í«í îxînîNïÝî4ð[ï)ñæï)ò{ð6óñIô¼ñ`õhòvöó÷Õó©ø™ôËùjõ÷úGö.ü/÷oýø¶þùýÿ ú?ÿúzðû®ÞüàÌý»þD«ÿ|ž¶ ”ó ‹( ~V jxJŽ ˜ê˜©‘^ƒ m· PY *õ ÷ˆ µ bŒ ø [ ± xú Ø<(yg®–Ú·ÿÅ¿3¥>yA=?ì5Š%—ýä`È­ªéˆc38D GÜ >ª +v ? è ¹ Î ‚ ‘ D T   ¶Ô i‘ K Æ t³ !` Ð „ÿ« <þN ÷üð¶û|ú.HùÇø]ööíÝõzÏôÌóˆÙò óñŽñQðŽ“ï áîˆ=î§íy"íð°ìdQìÛÿìSÿÅëÊþ—ëBþwë»ýcë6ý\ë±üfë*ü€ë¥û«ë"ûåë ú.ì ú„ì¡ùãì&ùKí­ø½í6ø9îÁ÷ÂîM÷WïÛööïlö ðÿõMñ“õþñ*õ°òÂôeó^ôôýóÖôŸó™õEóaöíò,÷šò÷÷Kò¿øþñù¶ñ;útñðú6ñ¤ûýðWüËð ý ð»ý}ðhþbðÿOð®ÿCðA@ðÌDðQRðÏjðHð¾»ð/÷ðœ?ñ–ñ\÷ñ²dòÿÛòEYóÞóºnôï õ³õLjöw0÷ŸøÂÜøá¾ùû£ú‹ûtü*[ý0Cþ5.ÿ8=DMTùYëZÑUªJx;9)ñ£ N ùñ ë‰ Ü Ë“ ´ÿ —\ w§ Pã &ú5ÌKŸVpV<I/Î× Nš Q ¾ t© (K Ýç “~ H ü¡ °- c¸ A ÅÊzP1Öîÿ^®ÿètÿrAÿÿ’åþ(¼þĘþeyþ _þ²Mþ^FþIþÄTþ{iþ9ƒþû£þÃÆþðþa!ÿ7]ÿÿòäÿÔ1¹‚¡×,{ˆké`NX·PL…HåD??”;å:59†8Õ6!5d1ž-É&åõüúóÿòàÿâÊÿɲÿ¦—ÿrxÿ1Uÿä+ÿ‰üþ$Éþ·’þAWþÄþ;Ùý¨•ý Kýcýü´ªüUüJÿþûŽþ£ûÏýGûýéúIü‹ú‚û+ú¸úÌùìùnù ùùWøµø÷ZøÎöøöª÷YõX÷§ô ÷ÿóÄö]ó„öÁòMö/òö¨ñöõ+ñÕõ·ð»õNð¦õñï•õï‹õUï‰õï’õîî¥õÒîÇõÆîöõÉî.öÝînöþîµö*ïÿö`ïI÷ ï•÷ëïä÷@ð8ø£ð‘øñóøšñ^ù*òÐùÉòEútóºú%ô-ûÜôû™õüZökü!÷Îüï÷0ýÅø‘ý¢ùóý‰úTþuû´þgüÿYýhÿJþºÿ9ÿ%JŒ÷Ëá ÍG¸„¡À‰ùi0>e šÑ Î I ;ÿ v° ²[ òý 4–x#À¦ ]Œ°óQf£Çí,.“dý’h·Ó×@ î± ù# ø˜ ì Ó„ ¯ö ƒd TÌ #/ íŽ ±æ n<!ŒÅÖ]îQy‚ÿ¨… ҋ Ø Ô| Äê ¬T ‡µ X q ÖÍ…%&{½ ÏJ !Í pH ¼¹  W{ £Ñ ï :_„šÎÿÏÿþ]þ'¦ýIïüi:ü‚‡û—Õú©(ú¸ÿ{ùÂþÐøÊý'øÒü}÷ÖûÖöÛú.öàù‰õåøèôí÷Jôõö¯óöó õ†òôùñ1ónñKòæðjñ`ððÞï¾ï`ïóîäî0înîuíüíÄìíì*í‚ëÊìôêrìsêìêÐëé‹ëJéKëéëÖèâê±èºêšèšê”èê›èmê°èbêÖèdêéoêfé†êÎé¬êKêßêØê"ëuënëìÃëÔììí…ìWîôì.ïoíðøíñ”îýñAï óþï ôÈð>õžñbö|ò‰÷`ó±øKôÕùAõúúAöüL÷CýdøiþˆùŽÿ¶ú°ìûÐ)ýêkþý®ÿñ6ø|ãÁÅ ž Sn Ÿ3 ì í 6 ›  > » Ó ì^Ü*Q8»>@n=º/û0î[´€cÿ±‹¿ ÈxÊÜÃ5µ~¡´†×cê;êÙæ¸³ŠOI ­ÌI†Ú=\ðÓž@H¢ñ ö˜ @9 ƒÙ ¼w é ¦ 47 OÇ cS sÛ ~a ƒæ€ gy æo b` ÚM Q7Å7§âÁœèuQL·#ÿõý~Çüáÿ—ûBÿfú¡þ3ùþøeýÐöÍü¢õ=üwô¸ûQóBû2òÖúñuúðúðî§ùÞí9ùÌìÆø¹ëQø¨êÙ÷›é`÷”èäö—çdö¡æáõ²åYõÌäÌôîã9ôã¤óNâóáxòààãñAàRñ²ßÇð2ß>ðÇÞ½ïnÞIï*ÞÝî÷Ý{îÙÝ&îÑÝßíÛݧíûÝwí/ÞTíxÞAíÔÞ8íDß9íÌßIíhàjíáœíãáÞíÅâ2îÁã˜îÑäïøå‘ï7ç ð†èºðäé^ñPëòËì¼òUî|óîïFô˜ñõXó÷õ(õÞö÷Ì÷òø½øßú±ùÌü¥úµþ—û˜†ü|sýb^þJGÿ5-"  ïê ǽ™~c1"ÕÖjƒó'oÁÞT?á‹j Ãï åp ë í Ø!a ®"È p#$ $y ­$Á #% |%8 »%j Þ%” ì%¶ â%Ñ À%ç †%÷ 2%ÿ Æ$A$ Ÿ#ë"%"L!^ _Q1ö þé ºã hç õ £2 » ?ü ºà 0º   — { v h Þ\ IO µ8 " “Ö † „ÿ* þÅ †ü` ûþ £ù @ø: åöÎ ’õT JôÈ ó)Ûñ·ðÉ›ïîQ‰í““ìÏ©ëÏê7ê`Fé~•è—ÿóçªþ]ç»ýÔæÉüXæØûíåçúåøùBå ùåøÔä-÷²äCöžä\õ–äxôœä™ó¯äÃòÍäòñøä*ñ3åjð}å´ïÓåï7æcî©æÊí'ç=í¯ç¼ì@èFìÝèÝë„é€ë4ê0ëìêìê¯ë·êzì’êKí|ê%îrêïuêóï‡êäð¨êÜñÖêÛòëáóeëéôÇëñõ6ìýö±ìø6í ùÃíúXîûöî,ü¤ïAýcðVþ4ñmÿò}ó…ôóˆêô‚ÝõwÒöfÈ÷SÄø>Æù&Óú ëûè ý¿ .þ TÿQ z Ÿ½ Ãeàô+ ² 3 ¬ü å ‚Á ß 1M wú ±˜ã) ®-)E•Wò`@_|Q§:ÆÞìñ¹ý};îô˜Î:–ÒQ`ç±fdàOÕµ‰1p Ê S Ì V @ ™ µ Õ .  ­ C0 t´  4 Ê« ô DâmB–¦Á îÿuÿßOþI„ý³¾üýû}BûáŽúCáù¨<ùžø|ÿøèþz÷WþööÈýxö<ýö²üšõ*ü:õ§ûçô'û ô¬úbô7ú-ôÇùþó\ù×óöø¸ó•ø£ó:ø—óæ÷˜ó™÷¡óQ÷³ó÷ÊóÖöçó¡öôuö-ôNöUô0öôöµôöêôùõ$õóõcõíõ¤õìõæõðõ'ö÷õföö£öößö2ö÷PöP÷nö‰÷öÃ÷¬öü÷Éö5øâömøýöŸø÷Íø=÷öøa÷ù‡÷=ù®÷^ùÖ÷|ù÷÷ùø¿ù/øàùGøÿùaøú|ø<úøYúÃøwúëø•úù¶ú=ùÙúfùýú‹ù#û±ùKûÚùuûú¢û:úÕûtúü¸úQüû˜üOûäüŸû3ýðû‚ýDüÔý˜ü)þóüƒþUýãþÀýJÿ1þ»ÿ§þ0"ÿ¬ÿ,°4 ¹‹>Æ N/Ú¸i9ø°‰ˆ§ñ0]µÍ5 =± ª' ™ Z ˜n ÅÐ ç(  w  ¼ 2 ÷ J ' [ P c q ` † L ‘ ) û Çe ? T Ú Û— ›K Uô “ ¾' m° 5 Ë´ }* 0œçŸq[Ô2׎œéfC7Ÿþê_ÌÁ³&Ž‹úÿ}lÿsáþn`þoéýt{ý}ýЏüšbü¬üÀÊûÓˆûéQûû$ûûñú+éú9èúCîúMûúV ûZû[9ûVZûJ‚û3±ûéûð$üÅaü–ŸüeÚü/ýôHý´~ýj³ýëý´"þJVþÛÿ‰þgÿ²þñþÕþxþóþþý ÿ€ýÿý*ÿzü2ÿñû6ÿbû6ÿÏú.ÿ=ú ÿ«ù ÿùñþøÑþø¬þ÷€þÿöOþöþöâýŽõ§ýõhý·ô'ýYôäüôžüÁóVüƒó üLó¿ûóvûòò-ûÒòåú¿ò ú¼òYúÌòúðòÇù!óù]ó;ù¡óþøêóÉø6ôšø‹ôoøîôEøcõøêõø÷öÑ÷'÷°÷Ñ÷’÷|ø{÷#ùl÷Éùd÷rúd÷ûk÷Õûv÷˜ü„÷bý”÷0þ©÷üþÁ÷ÁÿÞ÷|ø--øÖ^øz–øÓø¹ùU^ùí«ù}ûùQúz¬úæ ûDpû—ÛûàKü ÂüW<ý…»ý¬@þÈÇþÙQÿâÝÿâl×Çœ²8˜Ùx{T-¾^Ô¢¢qDAéŽÞ1 ´Ð Œm f D• $! ¨ é- Í® ¶-£©“ ŠŽ‰ðŒH”–›Ý£©W«Ž«¿­ç°µ½ ÇÒ ÕôÓ×̳¹ˆ UƒeÐF~$&ÄÙ[«çtj7å ôV ª \% „ »Ü g+ q ½¯cä¥;B^áÿ}}ÿ•ÿ§Àþµdþ¼þ¾ÿ«ý»þKý±ýèü§ü…ü›û&üŽúÎû€ù|ûqø2û_÷ðúJö­ú3õgúôú óÆùøñpùëðùãïÏøàîøáí^øèì2øöë ø ëÝ÷$ê©÷Hék÷wè'÷´ççöùæ¬öMæzö­åUöå9ö’ä#öä ö®ãðõRãÒõã´õËâ—õ¨âƒõšâwõâuõµâyõàâ‡õã˜õkã­õÇãÂõ6äÛõ·äúõKåöôåJöµæöŒçÃövè ÷qéY÷€ê¯÷œë øÄìføùíÇø=ï,ù‘ð˜ùóñ údóƒúæôûrö‡ûøü¤ù›üFû(ýíüµý–þDþBÕþögÿ­úÿgŽ"&Ù¼Š P2 áÓ olúþ€Šˆ‡ ð†F‡|²ïÊYÓºÍ ³l †» C ç U m!Ÿ Ù!æ -"' g"c †"“ ‹"º |"Û W"ö " Ç! ]!/ Ú ? @ N X Ð^ þ_ \ (O (= ) û Óô ¡× f¸ "– ×n ‡C 3 Ûß € ¥ & h Í ( u æ ¡ ÌZ } 1»é`§ýl–9ÿ- þÅåü]Åûõ­úŠšùø™Ž÷•ö{¦õã¾ôIÞó´ó$3ò–gñ¢ðqÿäïÎþ,ï þ{îiýÒí«ü1íîû˜ì7ûì„úyëÖùòê+ùsêøøéÏ÷é÷é^ö«è¡õJèæôðç1ô çóXçÚòç;òÜæ¢ñ®æñ…æ€ðeæ÷ïNæsïEæöîFæƒîOæîdæ¾í…æníµæ-íïæùì6çÑì‰ç¶ìæç¨ìJè¨ì¸è´ì7éÏìÅéýìbê=íë‹íÎëëí—ì^îhíÞî@îkï"ïðð¬ðñcñò(òóûò/ôßóTõÏôöËõµ÷ÐöïøÚ÷+úíøkûú±üûûý?üGÿfý•þæ½ÿ7è†Ô6"Ukkµ {ú „7 ‡o € q ÁW Û/ ì÷ ô­ óSåéÎm«ã{M<©í÷4"a¤~‰}„ÒsVL*sóˆ´‹j~d¹9Wûï¯~Sç l ã’ N ®“ ÿ E” € °‘ Ö òŽž1Éeö ™â -Ê ¿° S“êvŠX4;æ™KçõÌ—¶ÿ4¢þË’ýc‡ü€û£ÿ~úJÿùðþ‚ø•þŠ÷4þ–öÍý©õ_ýÅôìüéóxüóüCò“ûyñ#û·ð¶úûïHúFïÛù–îjùïíúøPíŠø¸ìø)ì®÷¥ëC÷+ëÝö·êzöMêöíéÃõ”érõCé%õüèÜôÀè™ôŽèZôbè"ôBèîó0èÂó'è¡ó)è‡ó6èuóNèlóqèkóœèróÒèóé”ódé²ó½é×ó#êô”ê7ôëtô–ë¹ô&ìõÁìRõgí©õîöÍîjöïÓöYðC÷*ñ¹÷ò/øäò«øÏó)ùÀôªù¹õ-ú»ö³úÁ÷<ûÉøÈûÓùUüàúäüîûtýþüþþþ*ÿÿE¨ÿb0‚¸Ÿ@¹ÇÏJßËíGôÀû 5ÿ ¥þ û {ñ àâAʨôEL‘×ÇxQ!ˆ¿¹QãÚ U) ÀG ^ sr º ò‰ ‰ ;ƒ Hy Ek 2] O ãC £4 V ù ‹à ´~ƒâQ7%~ÿ·Ý⽚o9û»ç zÄ ;š i Ó3¤øt»>z5Âï|«5jÿí,þ§ñüc¼û!úÞeù›FøU0÷ "ö½!õn,ôCóÊjòx¡ñ'æðÙÿ:ðˆÿŸï7ÿïæþ“î•þ'îAþÉíîý}í›ýFíJýíüüí­üíaü íü#íÏûHíˆûzíCû¹íûîÃú^î†úÃîMú4ïú¯ïâù1ð¯ù¼ðùNñSùäñ*ù€òù#óâøËóÅøsô«øõ“øÅõ}ønögø÷Qø½÷=øeø+ø ùø¯ùøQú øðú ø‡û øü ø¢ü ø'ýø¦ýø þø•þ øÿøqÿøØÿ.ø7@øUøãmø,†øn ø«½øãàøùQ7ù†mù·¨ùáéù-ú"sú;¿úNûbhûxÉûŒ2ü£¡ü½ýÕ“ýëþÿ˜þ!ÿ®ÿ)=6ÒGh[ÿs—1¨ÏÂoÛñ³ Qç8sRõooŠã§T Äà ß. ø• ñ #< 6v H  Y¸ gÄ tÈ }Æ ¼ ƒª ‚Ž {d q+ câ SŒ <+ "à R âß½g•ëij:ãXÎÈ“4XŸ Ùw›æZYÓÝPžÒ^Zèÿàyÿ¦ÿn®þ;Rþ þâ·ý¼wý™>ýzý`åüKÄü:«ü.™ü(Žü)ˆü-‰ü6üD™üW§ün»üˆÔü§ñüÅýæ5ýXý,|ýPýu¼ýšÚý¾øýáþ0þNþ6iþJþX”þa¢þbªþ^¬þV¨þF¢þ1šþþï„þÂwþŒeþNNþ 2þ»þgìý Ãý«ÿ›ýBÿtýÓþMýbþ'ýêýÿünýÕüìü«ühüüßûRüUû'üÉúÿû=úÚû´ù·û,ùšû¥øû øhûž÷Tû÷Bû¡ö5û)ö)ûµõ!ûIõûâôû…ô û4ô*ûêó>û©óZûpó{û>ó£ûóÎûëòøûÎò ü¼òHü¶òsü¼ò£üÏòÜüïòýójýGó¼ýó þ¿óZþô¡þUôâþ¬ôÿõ]ÿzõžÿïõäÿlö-òöy~÷Åø ¦øJAùƒâùµ†úá1û ßû3“ü[Ký€þ£ÅþÂ…ÿÛDìûÁ?À?üùõ­í\â Ö­ ÈO ¼ë °„ ¦ žž ™" –ž ”š{ Ú«2º€ÍÄåþ5_8€\•„¢±¦ä¡•U_Ì5=Åtƒ«8àê˜LA‚ã ´} á ¡ #+ :° G4 N¶ O6 Kµ B4 1±*û¢Ð™Š[þrÆèr_Õ¹KTÁè5w©‚’{ÿóùþjpþáÿæýXÿ[ýÌþÑüAþFü¹ý»û1ý1ûªü§ú%üú¢û‘ùû ùžúø"úó÷ªùg÷9ùÞöÏøUöpøÌõøCõÀ÷¼ôl÷6ô÷±óÅö0ótö±ò*ö3òíõ·ñ»õ>ñ“õÉðtõVð\õçïDõzï(õï õ±îóôRîßôùíÒô§íÑô\íÝôíôôÞìõ­ì0õƒìQõ^ìsõ<ì”õ%ì¹õìçõìöì\ö)ì¦öJìúövìT÷¯ì±÷óìø@ívø—íßøöíKùbî¿ùÚî;ú_ï¿úôïJû—ðÛûKñqü ò ýÕò¦ý¬óDþŠôåþrõŠÿcö/`÷×jø„ù2 úÞÊûŒýü75þárÿ‡±*õÊ>dˆúÖŠ# t” Ä   † Z ó ž V Ù´  7N Xˆ n¹ yÞ y÷ m T * ò ªú NÝ ß¶ [ ÇC þ a° ’[ µ Å¥ ÂD «Ý ƒo Gþõˆ’ Œ–‘_³”û4›cˆ¥£,´´½AÁÑ¿d¸ù­‘ž .Ž Ñÿ{ wÿg ÿR Íþ<€þ#3þ éý÷ ýãZýÑýÂØü³ ü§ÿnü›þ?ü‘ýü‹üêû…û»û‡úˆû‰ùXûø&û•÷øúŸöÑú«õ²úºô–úËóyúáò\úúñ7úñú5ðäùZï¶ù‚î‹ù¯íeùáìBùì#ùTëù•êèøÛéÅø)éø~èvøÚçKø?ç ø®æû÷'æÛ÷«å¿÷9å¤÷Òä÷zäx÷*äc÷çãL÷²ã7÷Šã(÷nã÷aã÷fã÷}ã÷¤ã)÷Üã=÷'äV÷…äv÷òä›÷måÂ÷úåñ÷–æ(ø?çgøúç­øÈèüø¨éTùšêµùœëú°ìŠúÔíþúïwû7ðôûyñwüÅòÿüôŒýyõþåö²þ]øNÿßùíÿhûŒ÷ü/ŠþÐo¬ =¥Í=[Ñëcy ó  …üýi`˵$ üs 7¹ fø ‰/ ] ¢ •› u« >¯ ñ¨ ˜ ~ ^ ð6 ?  x Ö › œ ¦ \ ž  € ÎF ~ó,ŽÚ†‡2çÞ7‰v5¢ã¾’ËCÊû¸µrw3IöºÏ‰K;ç î Ç6 ¥Ý ‡‚i'HÐ%y&ÜÖ¸Š˜Dÿ~þeÊüI–û*lúKùÔ1øŸ ÷fö)õíÿ#ô°ÿ7órÿUò1ÿ}ñêþ²ðœþñïHþ<ïíý’îýóí*ý\íÆüÑìaüQìüûÛë–ûpë0ûëÆú¹ê[úmêñù*ê…ùñéùÅé³ø¢éPøˆéñ÷yé—÷uéA÷zéñö‡é¥öé\ö¿éöèéàõê¬õTêõšêZõèê@õ>ë/õžë(õ ì)õ}ì3õ÷ìGõyí_õî€õ•î©õ)ïÚõÅïöhðRöñöÀñòövòL÷5ó°÷úóøÂôŠøŽõýø^örù/÷ìùÿ÷gúÏøèú¡ùmûtú÷ûKû‡ü&üýý­ýçýBþÈþ×þ§ÿiÿ€ùÿT„$ò½)‡¶PAËàP¢ÑaM ÁË 2v Ÿ º lU Ìì (€ }Íš Z ˜• Ê wù Ü! :D ”` åw 0† v ² æŒ  3q M\ \A c að X¾ Bˆ $L þ ÎÍ’‹KBûó¡ :DËãT~ÓGµ´Qíq Š " ´M ?‰ ʾ SìÜi=ú]Žz"—·ÿ°KÿÉÚþákþùüý‘ý2ÿ*ýPþÇürýeü—ü üÁû°ûðúYû$úû_ù³ú¡øeúì÷úA÷Öùžö–ùö\ùoõ(ùäô÷øbôÌøìó§øó†ø!ójøÊòTø~òEø<ò=øò:øØñ>ø³ñGø™ñWø‡ñmøñˆøñ©øŠñÎøœñùø·ñ&ùÙñYùò‘ù0òÏùcòúœòWúÚò£úóðúhó>û·óû ôÛû`ô+üµôxü õÆübõý¸õgýö·ýnöþÍöWþ-÷¢þŽ÷êþð÷+ÿPøhÿ¬øŸÿùÒÿ]ù²ù0ú\Zú‡²ú¬ ûÏcûí»ûüeü(µü5ý>LýE•ýKàýP,þU{þYÌþ]ÿapÿdÂÿeian²syTƒ¨ýœV¬°À ÖnïÎ .,MòmT޶°Òùä#KO°}«xÔÚù8 ” 2ë K> cŽ zÛ ’" ©e º¢ ÄØ Æ ¿) ­E –Y }c `g Ad U û= Ð œë bµ #r à& šÒ Su  ÈŸ ‚) ;«ó%­™dqÜÿÓžÿ4bÿ’*ÿðùþKÍþ§¥þ‚þadþÁJþ#7þŠÿ(þõþ þeþþÝý#þ[ý.þàü>þmüSþümþ ûŠþFû«þøúÎþµúõþ{úÿJúIÿ#úwÿú¦ÿòù×ÿçùæù7ïùeúú·BúÚlúûúÑú5 ûMFûcˆûsÎû|ü~cüy®ümûüYFýAý$ÔýþÞTþµþ†ÇþRüþ-ÿÛÿWÿ—ÿzÿNÿ˜ÿÿ®ÿµþ»ÿgþÂÿþÂÿÉý½ÿ|ý±ÿ-ýŸÿàüˆÿ“ülÿFüJÿüû!ÿ³ûóþmû¾þ,ûƒþïúDþ·úþ„ú¹ýWúrý.ú)ý úàüôù–üßùJüÔùýûÑù®ûÒùaûØùûæùÈúùù|úú2ú2úìù]ú«ùúmùÌú6ùûù\ûÙø«û±øûûøLülø üNøøü7øTý'ø¸ýø#þø”þ øÿ/øwÿCøåÿ^øNø´¥øÒø|ùá<ùE}ùªÃù úkaúÀºúûY{ûšáûÖNü½üA1ýo©ý˜#þ»¢þØ$ÿì¨ÿû*¯7¿øHíÑÛZÇã®g’írqOñ)oëÙe¯Ý†N]»4% ‹ äë ¾H –¡ p÷ LH )’ × ê ÒL ¹~ ¢¯ ŽÚ {ÿ f" SA AX /i q u s øk ê` ÚR ÆB ±* › ë eÁ J ,X  ìÞ Çš  P t D­ S Þÿó ¨ÿŽ pÿ# 9ÿ³ÿ;Äþ¾‰þ=Lþ¶þ+Òý™•ýXýjýÉâü$«ü|wüÏEü ümíû¹ÿÄûÿžûBþ~û„ý`ûÂüFûü2û>û"û{úû·ùûõøû3øûo÷û®ö ûñõû6õ*û€ôAûÌóWûónûrò…ûÊñ›û'ñ¯û‰ðÅûòïßû_ïþûÓîüRîBüÚígüiíˆüí¥ü¥ì½üQìÓüìçü¾ëùüƒë ýOë#ý'ë<ýëRýøêfýõê|ýýêŽýë›ý4ë©ý^ë·ý‘ëÅýÐëÕýìæýqìùýÒì þAí"þÀí9þIîRþàînþ‚ï‹þ/ð¬þçðÏþ©ñõþvòÿMóKÿ0ô|ÿõ°ÿöæÿ÷ø\(ùœAúÞ`û&ˆüo´ýºäþWN¦‰õÄE•?å~6»…ó Õ' "R ky ²—õ®3ÀmʤÉÕ»¡*vP:pš4§½¬9©¥¢þ—D…wn—S¦4 Šãf±.{åBŒ$Ä®‚%=õéª:`ºÃíu%:ÕS…g5uè}™ Kƒ ÿƒ µ j} !zÚÿw—ÿtSÿtÿvÓþz–þ‚YþŽþœáý¯ÿ¦ýÆþmýßý6ýýüý üÕüGû¦ütúyü¦ùIüÜøüøåûX÷³ûö‚ûçõSû7õ(û‹ôÿúãóÙú@ó²ú¢ò‡úòZúrñ)úáðùùVðÉùÎï™ùLïnùÏîGùTîùÞíúøoíÕøí®øì†ø=ì_øäë9øëø?ë÷÷õêÜ÷±êÃ÷rê°÷9ê¡÷ê”÷áé÷Äé‹÷®éŽ÷¡é•÷žé£÷¤é¹÷°éÕ÷Æéö÷èéøêOøEê‰ø…êÇøÑê ù+ë_ùëºùìú€ì„ú íöúŸíoû>îìûèîoüïûü]ðý*ñ$þòÁþîòeÿâóàôºêõhûöøË1ùzXú)‡ûؽü†úý1?ÿÙ‡Ñ »kO ¶Ø Y NÐ — < Ý   # ø a H ˜Ž ÆÇ ëô  ( , % ù ×ó ¦È g“ T ´ >¶ ¸W ð s‚ ² አ ~ñæ`·Ïv<#¦ÃSyÒäAN¤»ù,=£v¥šÉå§ÿ÷0ÿ¾þQþéýü‡ýð -ýà ÜüÎ üº Fü¦ ü’¿û~}ûh?ûTûCÐú0¢ú#yúTú2úÿúþëùýÇù!ü£ù0û€ùEú`ù_ùCù}ø)ù ÷ùÉöüøõõåø)õÎøcô·ø¤ó øëòŒø7òvø‹ñeøäðYøDðNø©ïGøïAø‰î@øî?ø„í@ø íEøìNø3ì\øÑënøyë…ø(ë£øàêÄøžêêøgêù9êCùêvùòé¯ùáéíùÙé1úÛézúæéÇúüéûêmûDêÅûuêü±ê|üøêàüKëGý©ë¯ýìþ‹ìŠþ íùþ•ígÿ)îÔÿÄî?hï©ðÌð}‘ñçbòQ=ó¸(ô!õ€-öÞL÷5|ø‡·ùÕôú6ücxý¥·þáöÿ2Qp‚­¬éÏ#ëU  "· -Å 2Ê 3Í /Ì(Ê ³õ˜ÝpÁ:¡ô€¢]A6Ö _áÝ´N†°U#Hñy¾˜Š§W¨%šò¾XŠ#VÝ!‹ê)¶¶…5U¨'ûmο¡rEBy¤åŹÞòiû D  ôÿú Êÿï žÿãpÿÒBÿ¾ÿ¨íþ’Åþ{œþasþJIþ6þ$ÿîýþ¾ýýýüûcýõú5ýóù ýøøÞüø³ü÷Šü'ö`üEõ7üjôü—óçûÎòÂû ò ûVñ€û§ðcûðGûjï0ûÛîûVîûÛíøúníìú íãú±ìàúdìàú"ìåúìëíúÁëúú¢ë ûŽëû…ë3û†ëMû”ëlû­ëûÏë³ûûëÜû2ìüuì7üÄìgüí™ü„íÊüöíþütî3ýýîhýïžý+ðÕýÈð þlñBþòvþÉò§þ†ó×þJôÿõ.ÿèõTÿ¶özÿ}÷Ÿÿ9øÁÿíøàÿœùþÿGúõú,­û@lüP.ý]òýh­þr^ÿyÿÿ‡œ” ›ª¢9©Í°_¹èÄgÎØÝ=ïšôS5´Tt€˜ã¿= êŒ Ñ I }C µy î² 'ï b. œm ש Ü O Ž, ËH a >w q Ÿ£ Æ· èÈ Ô !Ù ;Ö NÌ \½ `§ ^Œ No 7L # òô ÈÀ — b< 'ð äœ ™B Fâ ð} ‘ .¥Ë/d³ü2“­(!½OüãÿhwÿÎ ÿ2¤þ•?þ÷àýW„ý·-ýÜü}ÿüßþIüBþü«ýËûý–ûüiûôûCûkû#ûèú ûjúùúñùîú~ùéúùëú«øóúLøû÷÷ûª÷2ûg÷Rû*÷uûóöûÄöÈûšööûwö'üXöZüCöü8öÈü7öý@ö<ýSöwýmö±ýŒöéý­ö þÏöTþòö…þ÷¸þ:÷èþf÷ÿ›÷?ÿÖ÷fÿø‰ÿ\ø¨ÿ¤øÄÿéøÜÿ*ùñÿjù¦ùâùú$Yú&–ú'Ïú%û!8ûeû‘û»ûûÿçûìÿüÜÿEüÍÿsüºÿžü§ÿÀü”ÿ×ü‚ÿåürÿìübÿðüSÿ÷üEÿý:ÿý/ÿ7ý$ÿWýÿtýÿŠýÿ—ýÿœýÿ›ýÿ™ý%ÿžý/ÿ«ý<ÿÂýKÿáý^ÿþvÿ+þÿMþ«ÿjþÅÿ†þßÿ þûÿ¿þçþ2ÿQSÿu–ÿ™Ûÿ¿ åc£'àB\cs­Š¡[¹¸ÏâsóÊÿn ¼   YªûüHö“ìÚàÔVʱ¸ âŽ ~,mJ\eMxB„5‹*Š#s`K0'ð3ÉAUlk8ƒŸÆ½‰ÜMüÎEŒjJ·Åß‚A+QÁrDªÀÌÓ’áYë$òðô½ðŒæ^Ö2Á£Ý´WŒ(dó<¹|îÿ8Ãÿï˜ÿ oÿNGÿø"ÿŸýþEÚþêÿ¶þŒÿþ.ÿaþÎþ/þmþúý þÀý­ý„ýOýKýòüý˜üÛüAü¦üîûsü û>üTûüûÊûËúŒûúJûUúû!ú½úòùvúÈù/ú¢ùèùù¢ùeù]ùNùù?ùàø5ù¨ø2ùsø3ùAø5ùø<ùÜ÷Cù¤÷Lùi÷Xù+÷jùðö€ù»ö›ù‘öºùsöÝù^öÿùOö úFöAú<öbú0ö„úö¦úöÎúöùúüõ)ûÿõ[ûöŒû)ö¾ûJöðûoö!ü˜öSüÁöŠüèöÁü÷üüB÷<ý|÷ý¿÷Æý øþeøYþÃø¦þ#ùöþƒùHÿâùœÿBúõÿ¤úP û°ûùûyüá ýK›ý·,þ%»þ’HÿÕÿsdåöUŽÄ+3É¢l u¯ÜM=éš„òF ´‘ K× á u Q  ƒ ‘ ­  Ò š î  ÿ   j ù Ï ã 1à ‰ž Úp $8 iù ¥± Øa  &¢?9NÈTORÒGQ2Ë@ò²Æ"P÷ `ºÈ`/ý —” # nÿª Üþ- Lþ¨ Àý 8ý‹ µüñ 5üS »û°Gû Øú]pú® úü³ùG_ùùÐÍøŽøKVø†%øÁû÷ÿÿÖ÷>ÿ¸÷€þ¢÷Ãý”÷ ý÷Pü÷–û–÷Úú¢÷ú°÷aùÀ÷¨øÓ÷ò÷è÷B÷ø›ö#øüõKødõwøÔô¢øHôÏø¾óúø7ó$ù²òKù/òrù±ñ›ù6ñÅùÀððùSðúîïJú“ïtúCïœúýîÂúÂîåúîû_î$û3îCûîfûÛí‡û²í¨ûíÊûwííûlíüoí/üíPüœítüÀí—üëí½üîåüFîývîDý¬îxýìî°ý8ïëýï*þ÷ïkþkð°þæðøþgñEÿëñ—ÿuòìÿóEó¤Côõôn³õÙ|öGM÷³#ø"ýø”Ùù¹úvŸûçŒüZýÍþ=…ÿª‘¡|µÜÇ9ØçÜó& ÿi ¥  Ú  ' , + F (W _ _ îS È@ ˜% [ × Ã£ hh ÿ% ‰Ú‰o4ÈÙwKv«A›Ó™e‡öd‡1ï¨;:ÐÇdHûº˜6xÖÆ| '?×ÿnŠÿ”?ÿ³úþɵþØ tþâ 7þå ýýã ÉýÝ ˜ýÕkýÌBýÂý¶ïü«Åü šü•rüJü…%ü‚ÿü‚þâû…ýÂûüžûœûxû°úOûÇù"ûäøõúøÈú*÷›úVöpúŠõFúÈôúôðùbóÄù¼ò•ùòfùˆñ7ùõð ùfðÝøÝï³ø[ïŽøàîløpîLø î.ø±íødíü÷!íç÷çìÖ÷¶ìÉ÷‰ìÃ÷^ìÃ÷8ìÊ÷ìÔ÷ùëè÷ãëø×ëøØëCøçëløì›ø'ìÎøXì ùìKùÊì“ùíáùDí5ú…íúÊíðúîSûsî¹ûÜî%üSï“üÖïýcðtýöðëýŠñdþòÞþ¹ò\ÿVóÝÿúó\¦ôÙ^õVöÓêöMº÷Ãø9gù­?ú"û’øûÿÜüjÇýѸþ0¯ÿŒ©ã¤5ž’Ë„rM_‡K¹;è+   1  L í b Ê t € e… %‡ ݃ z 7l ÛX t@ # ‡ þÛh±Ä„TUŽä¸©Öjé(îäæŸÎU¦u·7eì–º7dËS·Ò]G³¤CpÞÄyS±‘ OÉ íÿý ‹ÿ* 'ÿU ¿þ~ Uþ£ëýÈ€ýéý ¯ü)IüGçûe…û†"û¦ÂúÇbúìÿúÿ¥ù?þMùký÷ø›ü§øÎûZøûø=úÑ÷|ù“÷¿ø[÷ ø(÷X÷ûö«öÔöö³ögõšöËôˆö7ôö§ó€öó‡ö™ò˜öò®ö§ñÌö;ññöØð÷ðS÷.ð‘÷äïÖ÷¡ï#øbïxø'ïÔøñî5ùÄîœùžî ú‚îxúsîëúqî`û{îÚûîWü«îÕüÍîTýòî×ýïYþ@ïÙþoïWÿ¤ïÓÿãïI0ð¼Šð,òð˜dñÿÞña]ò½ÚòXógÔó±QôôÔô.]õdóõ“ö´<÷Ôë÷ëžøþPù ÿù«úVû üÿ¯üðaýÞþÆÑþ«ŠÿŽAoõN¨+V è­ÅY£ƒ°cYFý)œ3öÄáO ÎÕ ¾Y ²Ú ¨Z ¡× œO ™Á ˜) –‰ —â ™3|¤Á­ÿµ8¼jĔŹÄÔÂæ¾ð·ó²î­á¥Í™²ˆŽsbX/:ó±òeÍ¥¹ |Y Pñ "‚ ï ¹” ƒ K  Ûÿq ¤ÿÛnÿ@8ÿ ÿÿÑþW þ®oþ@þTþ¥íýòÊý?¨ýŒýÙvý%býuÿTýÄþGýþ?ýdý;ý·ü9ý ü=ýfûEýÃúQý$úbýŠùxýöø‘ýgø¬ýÛ÷ÈýU÷çýÖöþ[ö)þéõKþ}õpþõ—þÂô½þoôçþ'ôÿäó5ÿ§óZÿró}ÿCóžÿó¼ÿóÖÿíòïÿæòëòùò+ó9+óDLóJoóM—óKÆóDùó87ô+ôÑô.õíÿõÑÿöõ³ÿ_ö‘ÿÇökÿ,÷CÿŽ÷ÿð÷ïþTøÀþ¼ø“þ+ùdþ ù3þúþœúÔýû¦ý—ûzý üNý{ü%ýàüþü?ýÛüýºüüýœü]þ‚üÂþlü*ÿZü‘ÿLüóÿDüMAü¡CüïMü6]üzrü¼Šüþ§ü?Êüîü¼ýùLý0„ýbÁý’þÃKþñ“þÜþM&ÿzrÿ¨¿ÿÑ÷_¶=]c~µ ÂSç› á1%Sgs¨åªÂRØïªÍê-=L+W7^@aFaF`BZ8Q,C4  õàèÆÇ¬£’zvMW8ê´ùxÙ;¹ü›·~qb*Fâ+—Jôý×°¼a£ˆÃnwV*<ß$– Oï ÑÇÿ²†ÿGÿo ÿMÒþ'þnþÙAþ¯þƒòýRÏý!®ýïÿý¸ÿuý€ÿ`ýFÿNý ÿ@ýÍþ6ýþ0ýQþ+ýþ'ýÒý'ý’ý)ýSý,ýý0ýÔü4ý–ü8ýYü>ýüEýçûNý³ûXý‚ûcýSûqý(û}ýû†ýßúý¾úŽý£úŠýŒú…ýzú|ýmúwýdúrýaúqýbúqýfúqýpúkýú_ý’úKý©ú/ýÄúýâúéüûÄü#û¢üFû†ünûmü—ûXüÃûCüòû)ü"ü üSüáûƒü³û°ü‚ûÞüRûý&û1ýÿú[ýáú†ýÉú±ýµúÛý¡úþŒú*þvúKþ`újþIú†þ3ú¢þ#ú»þúÕþúïþúÿ$úÿ1ú6ÿCúMÿVú`ÿmúuÿ‹úˆÿ®úœÿ×ú²ÿûÉÿ:ûàÿtûüÿ¯ûíû2/üQuür¾ü• ý»aýâºý þ;yþlÜþŸAÿÕ¥ÿ Fm‚ÔÀ:ÿ¢A …vÊßGX­žãr)Òl/®Šïâ.7l‰©Öá!fIªwçœ#¿[ÝŒöº ä "+ &H "c y ‹ ñ™ Ô¡ ±¦ ‰§ Z¡ $œ ê” ª† cv b ÅJ o,  ¶æT¿ñ•ˆe7¯@ÊÏ]Oê xÅ{–ÿ/&ÿÞ¶þ‹Hþ5ÜýÛsý~ ýªü¹JüTîûî—û„Dûöú¬ªú=dúÊ!úUáùÞÿ¦ùdÿoùêþ=ùoþù÷ýìø€ýÉø ý¬øšü‘ø%üxø°ûaø9ûKøÀú7øEú'øÍùøYùøìøø†øø'øøÍ÷øw÷ø÷ øÅö økö øöø¹õøiõø"õ%øçô0øµô;øŒôFøkôRøJôbø*ôrø ô„øèóšøËóµø²óÒø¡óðøžóù¥ó<ùµófùÍó—ùìóËù ôú+ôHúMôŽúrôÛúžô-ûÍô†ûõäûDõGü‹õ²üÖõ!ý(ö—ý~öþØö˜þ7÷"ÿš÷¯ÿø?pøÖáøqWù Ðù¬LúNËúñLû—Ñû<\üâéü‡|ý(þÈ«þcEÿúâÿ‰ | š ¸ T óÿ ’e 1 Ð o[ — ªÇ Eí ÛmþŒ  ý š Ý  ± š {  : ‚ í í – Q 8 ­ Ï ] Uä Ÿd áÞ O O¼y&›‹³êÅIΤÎÿÈY¸±Ÿ ~hUÄ%!ë©åÿ_Jÿ´þµ #þT –ýí ý€ †ü ü” ‡û û ›ú .ús ÇùÞgùE ù§¶øbøaøºÆ÷~÷d=÷¶÷ËöUö£töïNö>+öŽÿ öÞþíõ/þÒõ‚ý½õÖü¬õ+ü¢õûõÕúžõ-ú£õ‰ù¬õéø¹õQøÈõ¼÷Úõ/÷ðõ§ö ö ö,ö›õQöõ{ö—ô«öôÝö£ó÷6óP÷Ðò÷uòÔ÷"òøÖñgøñºøDñùýðeùºðÁù|ð!úCð„úðçúóïNûÝï»ûÏï)üÈïšüÉï ýÊï„ýÊïûýÏïrþÚïéþêïbÿðÙÿ(ðNYðÇ•ð@Øð·$ñ/tñ¦ÆñòŒwòúØòd@ó̱ó1+ô‘¯ôï<õIÍõ föñ÷=¬÷ƒWøÅù¿ù7zúh:û”þû¸ÅüÙ’ýôaþ 5ÿ ç# Æ § ˆ höHÞ&ÁŸÜy´Pˆ "Z ð& ºï ‚± Gm "ÉχrDÿ¢¸,p­*"㌚ëS> ƒÆ¾€î<ø(´2q2.%í­ào®2nù#À̇jOþˆÜÿ ÿgÿì0ÿPúþ®ÄþþT Zþ› $þÞ ëý ¯ýV sýŠ 8ý¼üüìÂü‰üCQülü“ßûº¦ûßmû3û,ùúTÂúÿŒú­þZúÛý*ú ýûù@üÑùwû©ù°úƒùíùaù/ùCùvø)ùÃ÷ù÷ùmöõøËõíø.õëø–ôíøôöøvóùîòùkò.ùññLù€ñoùñ—ùºðÃùdðôùð)úËïaúˆïúJïÝúï!ûáîiû»î²ûŸîþûŽîLü‰îšüîèü˜î6ý¨î†ý½îÖýØî"þùîoþ$ï»þWïÿ—ïLÿâï‘ÿ9ðÕÿ—ðüðPgñŠÕñÂDòõ¸ò$5óP¹óyGô¡ßô€õá)öÿ×ö†÷37øJèø_ùrQú‚û’Äû ƒü¯Fý½ þËØþÙ¢ÿéjù3 üÀ.ƒCBXo»‡q¡%½×Ù„÷+ Ï 7m Y {—  Á¢ ã  $ú C\^·y “S«”ÁËÔúåð9òLòTëTàKÓ:À«ú’Ìr˜LYìűor/² éI  Ù Sd é ®g Vâ úZ ›Ë ;; Ù¨uz³ÿßPÿDîþ¦þ0þhÒýÉvý*ýŒËüïzüR+ü·âûžûˆÿ_ûòþ$û`þñúÐýÂúBý™ú·üuú0üWú¬û@ú*û.ú­ú!ú2úú¾ùúKùúÝø+úvø=úøTú¯÷púR÷‘úúöµú¥öÜúWö û ö7ûÊõhûŽõŸûUõØû!õüñôQüÅôü›ôÎüvô ýWôKýAô‰ý1ôÆý)ôþ(ô>þ,ôwþ3ô°þ?ôæþNôÿ^ôHÿtôuÿôŸÿ¶ôÅÿâôæÿõNõ!Œõ9ÌõNö`Qön—öxáö~1÷€†÷‚ã÷Gø|®øxùr{ùiâù_EúT¨úHû;vû,ãû!TüÉü @ý·ýúÿ,þôÿþðÿ ÿîÿqÿíÿÙÿïÿ=óÿ¡øÿþÿoÖ=£0Ee\Àv‘m¬¾Ç àZú¥í36P{p¿ÿ®=Ëwæ®ýá$>4jF’V·eÚsù| „* ˆ> ŠN ‰Z ˆb …h €j zg sa nW eH \4 T KþAÝ8¹0(d!2ýŇF·j#È*t19ÃDhO ^©lFz㉗¢´®O·ê¿„Æ!ËÀÿÏ_ÿÒþþÓžþÏAþÉæý¿Œý¯5ýœàü†ül@üOõû/®û iûä)û¸ëú‡°úTyúDúáú£ìùaÅù£ùÛÿ†ù”ÿmùKÿWùÿBù´þ2ùfþ#ùþùÉýù|ýù.ýùàüù”ü&ùJü5ùüGù»ûYùwûjù4û}ùõú‘ù¸úªù~úÇùIúèùú úèù9ú¾ùdú˜ùúwù¶úYùÜú?ùû+ù'ûùNû ùzûù«ûúøàûúøüýøOüù…üù¶ü)ùâü?ù ýXù4ýsùZý‘ù†ý°ù¶ýÓùêýûù!þ*úVþ]úŒþ“ú¿þÍúëþûÿEû<ÿûaÿÁû‡ÿü®ÿEüÖÿüØü.&ý[wý‰Éý´þßqþÆþ,ÿQtÿvÎÿš'¿‚çâ @1 Wÿ|a¡ÃÅ"èƒ â+AIŸhýˆX¤´¿ÛióÀ f1´BþQD^‰iÉr {> ~r €£ €Ì }ñ x p& f6 ZB MI =H -A 4  ñ Ùã ù ¨ˆ ŽO t YÊ@}&+ ÐôqÜ Ã¢«0•º€@lÀY<I³:)-  | êXþÄÿù2ÿõŸþðþí~ýìòüëjüéãûèaûæãúåjúâöù߈ùÚùÒ½øËcøÁ ø¶¾÷ªy÷›9÷Š÷wÓö_¬öCŠö#oöÿ[öÙMö²Eö‰Fö_Mö3\öqöÒÿ‹ö˜ÿ«öZÿÌöÿðöÓþ÷ŽþB÷Hþq÷þ¥÷ÃýÛ÷€ýø>ýSøøüø¯üÍøaü ùüCù¿û~ùpûºù$û÷ùßú3ú úsúeú³ú-úðúôù.û»ùjûù§ûEùáû ùüÒøTüŸøüsøÊüRøý6øBý"ø‚ýøÂýøþø÷Dþî÷ˆþä÷ËþÛ÷ÿØ÷XÿÛ÷¡ÿæ÷ìÿö÷7øˆ/øÞTø3|ø‹¨øä×ø?ù›=ùøuùX²ù¸ôù:ú|ˆúàÚúD.û§‡û ãûhBüƤü!ýynýÐØý#Cþt²þÁ#ÿ •ÿM Š ~Á òó i ßB U` Ëx Aˆ ¶’ +• Ÿ ƒ „p óU _2 Å +× Œ¢ êd G  Öö†G 2’ ØÛ x Y ° EÄ ×ó g ô= \ v ’ˆ • ¢ )ž ³— <Œ Å| Qf àÿJ oÿ( ÿ ”þÕ +þ¢ Æýj bý- ýé ¥üŸ KüQ òûþû¦NûGûæ»úwú9ú£ýù/Âù·‰ù:Rùºù5ïø¯Äø%žøš{ø [ø|>øë"øVøÂÿî÷*ÿÖ÷þÀ÷øý¯÷_ý¡÷Éü–÷5üŽ÷£ûˆ÷û„÷…ú÷øù÷lù÷áøƒ÷Wø‰÷Ð÷÷P÷›÷×ö«÷dö½÷úõÑ÷—õé÷:õøßô#øŠôCø7ôhøçóøóºøYóéø óùòòUùÎòù¶òÐù¦òúŸò_ú›ò¬ú›òýúžòQû§ò©û³òüÇòcüæòÇüó1ýCóžýóþÈó€þô÷þbôpÿ²ôèÿõa^õ߸õ^öß}ö^ëöà]÷dÖ÷äVøcÚøâ^ù^åù×núOõúÃ~û4 ü¡˜ü)ýl¾ýÌSþ% ëþy „ÿÆ  ´L L† ä¸ {ä  ¤% 9: ÍH ^N ïM |D 3 ‹ þ ‹×  « { y í A [  Ä ¾ ( t … % Ú Ð, xt ¶ ½ñ W% ñT ‡y ™ ­² < ÌÊ ZÊ äÄ n¶ ÷  €ƒ _ ’5  ªË 5 ÄÿI Sÿþ Þþ® kþY ùýÿ ‰ý  ý< ²üÕ Küj çûû…ûˆ"ûÂúœdú"ú¤­ù&Wù¦ù$ºø¢qø-ø›í÷°÷‘v÷ @÷†÷ãö{½öøÿœötÿ‚öñþnönþaöîýYökýVöíüXöoücöñûqötûˆö÷ú£ö}úÅöúïöù÷ùS÷«ø÷>øÐ÷Õ÷øl÷`ø÷°ø¢öù<ö]ùÜõºù~õú#õ‚úÐôéúƒôUû=ôÂûüó1üÀó¢üˆóýTó„ý óõýïòfþÃòÖþòGÿ}ò¶ÿfò!\òŠ[òòcòYqò¹„òòtµòÊÓòöòk!óµQóúŒó9Óóu%ô¬ôÞßô Fõ3±õXöwö’÷¨x÷¸õ÷ÅzøÎùÒšùÔ4úÒÑúÍsûÅüººü­_ýžþŒ¬þxTÿcÿÿK«2Z ÿ¹ãhÇ«ÁhqT±8Rñÿ‹ä! ȳ ¬? ‘Å vF Z ?7 $¤  ùm æÈ ÚÒfϯÛñü02i|žÑÎ#ðrµîA`í{Ê’›¢bª¨Ð™xzO« 8 ß½  < ]¶ ) Ó— ˆ ;f êÉ–*?‰éé’H?§î¢cZ¿Òÿt’ÿÎWÿ)"ÿ„ôþáÿÑþ=ÿºþšþ­þùý¤þVýžþ¶ü›þü—þxû•þÝú‘þDúþ¯ù‘þù“þŒø˜þøœþw÷žþñö þnö þïõþtõ—þþô‘þŽôŠþ$ôƒþÁóyþdónþ ócþ¸òUþhòDþ ò2þÜñþœñþdññý5ñÙýñÀýòð¥ýÞð‡ýÔðdýÔð?ýÛðýçðóüøðÍüñ¥ü3ñzü]ñKü“ñüÕñãû&ò¬ûƒòvûìòAû]óûÔóÜúQô¦úÒônúVõ8úÝõúlöÎù÷ŸùŸ÷sùCøLùîø&ùžùùQúãøûÇø»û®øpüšø'ýŽøßý‰ø˜þøRÿ•ø¨ø»ÁøláøùË2ùziù)¦ùØêùƒ6ú(‰úÃÝúU1û݃û[ÖûÖ*üK ü½ åü. Wýš Õýÿ ^þZ ëþª tÿî óÿ' aW € ¥ pÆ Îà 8ô ³ : Æø Kä ÁÊ "¨ l ¢X Î) ÷õ %» ]x œ/ ßÜ ƒ T& xÆ c •ý’•‰*»|GvÏnUcØSY<Ü!_âðcáæÙhÛëßmÝñÕwÅÿÿ¯‹ÿ—ÿ¨þu<þmÑýjkýeýV¨ü>Müôûéžû·Mû„ÿúW·ú,vú:úÞú²ÍùœùHkù ?ùÊù‡òøBÔøÿ½ø¼ªøy›ø6øñ…ø©}ø^tømøÀlønmøtøËÿ€øxÿ’ø%ÿ¤øÒþºø}þÏø&þãøÐýøø|ý ù(ý$ùÓü@ùü`ù-ü…ùÖû¯ù‚ûÜù+û ú×ú5úúaú*úŒúØù¶ú‡ùäú7ùûèøLûšø…ûPø¿ûøùûÀ÷3ü~÷lü?÷¨ü÷åüÈö&ý”öjýbö®ý5öõý ö8þèõvþÊõ¯þ±õçþœõ"ÿŒõ]ÿ€õžÿuõäÿoõ+mõrqõ¶zõóŠõ(¡õV¾õƒßõ­öÛ(ö UöBƒöx¹ö­ùöÝC÷•÷)ì÷FEø_›øxòø“Eù¯›ùÌ÷ùê]úÓúVû/èû=üHýS®ý]3þh¬þuÿ‚ÿŽ—•8¡ê¡££V£ý¡‘¢¡Œ ˜’–Š+¼sD gÀ V/ E 4ê !E ž ö÷ ÝM Ü §à † e> BZ o ÷€ ÔŽ ®œ †¦ ^¦ 4š  ÙZ ©$ zå J£ _ ò ÉÔ ¡‰ v6 LÖ !i öÿð Ëÿn ¢ÿæ}ÿ^Yÿ×:ÿSÿÎÿþGãþ¼Äþ*¨þ‘þðtþM\þ§Hþ9þf(þÉþ1 þšÿùýÿåýiþÒýÏýÂý5ýµý ü«ý ü¤ýûžýöú–ýtúŒýôù}ýxùkýùYý‹øHýø9ý«÷.ýA÷%ýßöýƒöý/ö ýáõûü™õéüTõØüõÊüÓô½üšôµühô°ü<ô«üô¤üùó›üßó’üÆóˆü³ó~ü¥ózüšó{ü—ó‚ü™óŒüŸó›ü§ó«ü²ó¹üÂóÄü×óÌüñóÖüôáü8ôîüdôý’ô!ýÂôDýøôký/õ‘ýjõ·ý©õÚýïõùý:öþö6þäöUþA÷wþ ÷þøÇþdøòþÏøÿ@ùJÿ·ùtÿ9úšÿÃú¿ÿQûáÿáûoü!úü@…ýbþƒþ£4ÿÂØÿß„û>þ*»@qTf·yJŠØœiª¸£ÅMÏýר ÞG å× êU òÁ û x Ì  q ¾ >j‰›$ +œ27{;Z>/Aø E¶ Jj S ]¾ ha tÿ • Ž$ ™« ¤& ²— Á Ónæ×úE¶!*1›CUjjÇ€!š|µàËMßÃî@ùÂÿCÿ¿þ<þ*½ý8@ýEÈüNZüQõûM–ûC?û5ìú"šúKúúþùä´ùÍpù°4ùùcÕø3«øþ…øÄaø‡?øGøøÁæ÷wÐ÷(¿÷Ô±÷|§÷" ÷Åÿš÷hÿ•÷ ÿ’÷®þ÷Pþ÷ñý‘÷‘ý”÷,ý›÷Æü¢÷_ü«÷ùû·÷•ûÃ÷3ûÏ÷×úÜ÷úì÷+úý÷ÚùøŽù"øEù8øþøOø¹øhøyøƒø:ø øÿ÷¿øÈ÷áø™÷ùo÷-ùL÷Xù2÷ƒù÷°ù÷àù ÷ú÷Gú÷~ú ÷»ú ÷üú÷@û#÷†û7÷ÐûQ÷üu÷hüŸ÷¹üÏ÷ýøný7øÑýnø7þ§ø¡þáøÿ!ùmÿdùÏÿ®ù,ýù‰QúìªúUûÈ^ûFºûÍüTwüÖÜüNDý´±ý "þ[•þ¨ ÿý|ÿ[ðÿÂb0Ø›PÉYF¤ÄàB ¿3 <Q ·n 1‹ ª¨ !Ä šÝ ð ú ïû Xò ¿â ! É § ß € : T ! á í* ·i  JÍ ÷ Ð Š? ;\ åu Œ… 3Š Ø… ƒt 2Y ã8 “ Aé è¼ ‹‰ )P Ä c¿ h ­ Y¥ = ¿Ñqa!ðÐÿx}ÿú'ÿwÖþî‡þ^=þÍøý9¶ý£wý 8ýuúüÜ»ü?}üŸ@üýÿüZÿÒû¶þŸûþpûtýEû×üû<üõú¢ûÏúû«únúˆúÔùgú:ùHú§ø-úøúŠ÷ú÷ðùˆöâùö×ùšõÌù*õÂùÀô½ùXô¸ùøó¶ùžó¸ùMó¾ùóÅù¿òËù„òÒùRòÝù&òêùòùùèñ úØñúÑñ4úÓñHúáñZúöñoúò†ú3ò úZò¼úˆòÚú½òûúþòûIó8û óXûôxûjô˜ûÚô¹ûOõÜûÅõÿû=ö$üºöKü<÷uüÃ÷ üRøËüçøõüƒùý"úIýÄúuýgû¨ý üßý¬üþPýVþôý‘þ˜þÉþ>ÿüþâÿ+ÿ†Xÿ*ˆÿνÿoýÿE¬˜FîÜDm“ùÖ€@‡k—‚Îûm [× ¯8  [á ¦, âu » 3ü N: fq ƒž ¦À ÑÖ å .ì [ï ~î •é  á ¢Ñ œº “› ‰p ƒ> ~ {Ç w‡ mC ^ú D­ #\ ý Ò¤ §? {ØTl.þ‘â"¹°;]Ã$JçͧNgÐ.SýÖÐZ¨ß}eQë oë÷ÿµ~ÿÿNþ þõªýÐ<ý­ÐüdümúûMû,(û Âúëÿ_úÌÿÿù°ÿ¢ù™ÿJù…ÿôøsÿ øaÿNøQÿü÷?ÿ¬÷+ÿ^÷ÿ÷ÿÊöíþ†öÚþFöÈþ ö¹þÒõ©þõ—þjõƒþ=õnþõWþêô>þÉô"þ¬ôþ”ôéýôÈýpô§ýgô†ý_ôaý^ô:ýdôýqôäü†ô´ü¡ô‚üÅôNüñôü õàûVõ¨ûõmûÏõ2ûöøú\ö»ú­öú÷Búd÷úË÷Èù8ø‹ù¯øOù*ùù©ùÜø.ú¦ø²úuø5ûHø¹ûø@ü÷÷ÉüÖ÷Wý¸÷ìýž÷†þ‰÷&ÿ{÷Åÿv÷`{÷÷‰÷ˆž÷»÷žÛ÷(þ÷´!øBHøÒuø^«øãðøcFùÙ­ùF!ú®žúûu’ûÕü2 hüŒ Íüà 8ý+ ®ýl 3þ¦ ÇþÙ jÿ / ¼U aw ý” ‰ª º | í b½ Û³ ^¥ é‘ xy ] < ï Pç ¢´ è{ * > k ü ¬ ¸ î q 2 & q Õ¨ €Ò (ð Ê h   3 Æÿ Wü åø qï ûÝ „¾ – Œe - ‘ó º “‚ N –ÿ ÿà–þ¦þdšýýÉ üu&ü ¯ûÊ8ûvÅú#UúÐåù}wù&ùΨøqFøè÷¯Ž÷L8÷éæö‡šö%Qöà öbÎõþ•õ˜bõ15õÉÿ õ`ÿçôôþÊô‰þ°ôþô³ý’ôIýôßü‘ôvüšô üªô ûÀô2ûÜôÄúþôWú&õëùUõùŒõùÊõ³øöNøWöç÷¦öƒ÷øö!÷Q÷Àö®÷`öøö„ø¯õûøYõyùõüù´ô}újôÿú%ôûåóüªó†üvóýFó¢ýó;þõòÖþÖòtÿ¼òªò¦¢ò9¢òÇ©òQ¶òÛÍòdìòìóu@óúvó{¶ó÷ýónOôܬôCõ¥ƒõûõVzö¦üöî~÷/ øi øš ùÅ ¸ùè `ú û Ôû* ü2 gý1 ,þ( éþ ›ÿ Cã çÀ ˜ ;j ö8 ¼ ŒÃ_~*7èꑚ'G¬ð& ™› > áš ! ­ ¼3 W« ò Œc '£ ÁÖ [ý ÷"’J.tË›j½ Õ¬ÿÝPÿÕöþ¾žþœIþröýH§ýZýó ýÉ Çü— „ü^ Dü üË Ðûq û nû¥ Cû9 ûÍ øúc ×úú »ú’ £ú% ’ú³†ú:~úº|ú3~ú¨‚ú‹ú‘•ú ¤ú‚¹úýÑúuîúìû_0ûÑVûB~û²¨û%Öû™ÿüÿ:ü…þnüýý¢üyýÖüöü ýrü?ýòûtýrû«ýòúãýuúþüùRþ†ù‡þùºþ¦øéþ<øÿÔ÷Aÿp÷lÿ÷—ÿ±öÀÿTöéÿúõ¥õ2TõO õhÂô‚ô’Fô¤ ô¶ÔóÆ¢ó×sóåFóñóûþòãòÌò ºò ®ò §ò ¥ò¥ò¬òý¹ò÷Ëòóâòïÿòí"óìKóêyóç®óàéóÖ+ôÌsô¿Âô±õ§oõ¡Îõ›4ö—¡ö•÷‘’÷Šø€¥øt7ùhËù[`úQöúHŠû@"ü9¿ü2hý*þ!Üþ§ÿ t>ûÿÿñÿ´éÿ]ãÿþÝÿ×ÿCÑÿöËÿ³ÆÿyÂÿC¿ÿ ¼ÿÀ »ÿe ¼ÿö ¾ÿu Ãÿç ÇÿT Ìÿ¿ Ôÿ2 Ýÿ« æÿ&ðÿœýÿ ^ ,ÍAéWün …œ)´6Î:é2%ìD°eh…¥ÆÄráÆ g =ÿ \‡ { ™s ¶Û Ó> í   h0ÍB0R_èm;z‰‡Õ‘"˜m›¾™‘j…Äÿxÿk|þ[ÙýK8ý9™ü"þûjûåÛú¿Qú•ÏùhRù<Ûø iøÝù÷ªŽ÷t)÷:Ëöûuöº%öwÜõ3šõñÿ]õ¯ÿ&õmÿõô'ÿÉôàþ¡ô˜þ~ôOþ_ôþFô»ý3ôuý&ô2ýôòüô³üôxü"ô<ü)ôÿû2ôÄû?ôŠûPôWûfô(û€ôÿúôÞú¼ôÂúÞô©úõ‘ú&õ}úNõjú|õXú®õKúãõDúöDúTöLú’öYúÐömú÷†úW÷ úŸ÷»úë÷Øú=øöú“øûíø8ûIù`ûªùŒûú¼ûuúïûßú%üLû\ü¿û‘ü9üÇü·üüü;ý0ýÅýdýPþ™ýÙþÍý`ÿþåÿ;þgoþí¥þyÙþ  ÿª8ÿNfÿõ“ÿœ¾ÿ<êÿÎR=Êg;ެµ#Ø¢û) ¶ >@ a¾ „* § Ëà ìó  1A Pl q˜ “È ´õ Ö ú( % G mê “» ¸‡ ÝU ÿ$ !ò E¹ jw ) ¸Ë àa î )z H e’#–´¯BËÉäHýÁ3$¤05‹76ƒ41+&œ$ ªÿõ1ÿÚºþ»Jþ™âývýO&ý&Ðüú~üÉ.ü”áûZ—ûSûÜû˜ÜúTªú€úÆZú}9ú.úÜÿù†éù-ÕùÑÅùt»ùµù½ÿ²ùaÿ²ùÿ¶ù§þ¼ùHþÃùæýËùƒýÕù!ýâù¼üïùXüýùøû ú˜ûú;û,úâú:úŠúJú3úYúÜùgú†ùuú3ù‚úâøú”ø›úJø¥úø­úÊ÷µú‘÷¼ú]÷Àú,÷Äú÷ÉúÖöÍú¯öÑúŽöÕúpöÙúYöÞúIöãúBöæúAöëúHöñúUöøúgöû}ö û–öû²ö'ûÓö8ûúöPû(÷iû]÷ƒûš÷ŸûÞ÷¾û&øáûtø üÄø4üùhünù¡üÇùÞü$úý†úaýìú¦ýXûæýÇû%þ9üdþ­ü¨þ!ýôþ—ýJÿ þ­ÿ†þÿ‚ÿêýÿH{œüå|)ùnw¹ñknåÓ`:ÝžWõÏ>Dy³§Ðƒ÷æ!HT©‹ Ãd ÷»  >U O˜ VÔ X Y= [l `˜ g½ mÜ kõ b P 5  óý Ôí ºÕ ¡¹ ‰– oj P6 )ü û» És “& ^Ö + ü ѽ¥TyäJnôãvªöpq9é^ÎЛ=i¨7vÑÚœ=i¡ÿ6ÿiþÓÎý£3ýv˜üHþûdûñÿÌúÆÿ6úšÿ¢ùoÿùFÿƒøÿû÷õþu÷Îþöö§þzö€þöYþõ3þ#õþ¹ôéýVôÅý÷óžý¡óvýQóMý ó$ýÊòûü”òÓüdò¬ü<ò„üòYüò-üîñþûãñÌûâñûêñnûþñ@ûòûEòàúyò¬ú³òwúôòCú<ó úŒóÙùâó¨ù@ôvùªôGùõù›õëø"ö¿ø°ö’øF÷gøß÷@ø{øøùú÷ÁùÞ÷iúÈ÷ûµ÷Ìû¥÷„üš÷=ý“÷øý÷¶þŽ÷qÿ•÷+¤÷å¹÷ ×÷Yý÷)øÅYøv‹ø ÀøÃøøc3ùûrùºùú«mú2 ×ú­ Hû! ¾û‹ 2üé ¡ü> ýŒ qýÓ ×ý BþJ µþy 3ÿ¡ ¼ÿ¿ KÑ ÝÜ kÜ òÕ nÈ ß³ J˜ ´v L ‘ ã ~¤ õ_ g ÏÉ .x …" ÓÊ k h ´¡ý8B ̃ _» ñé € - H +a ¶x @ Ë¢ V¯ á² l® ÷¤ „’ z ¢_ 2A Åÿ Xÿú ìþÔ ‚þª þ~ ³ýK Oý íü×ü”1üMÕû}û»(ûrÕú(„úÜ5úêù?¢ùë\ù•ù>Üøè¢ø‘kø88øáø‹Ü÷4±÷݉÷‡e÷0E÷Ö)÷}÷%÷Îôövëö!æöÍÿåöwÿæöÿéöÇþðönþüöþ ÷¾ý"÷cý>÷ ý_÷°ü„÷Uü­÷ùûÙ÷›ûø<û:øÝúnø}ú§øúæø¸ù(ùWùpùóø»ùŽø ú*ø]úÃ÷±ú^÷ ûøödû”öÁû0ö üÍõƒümõçüõKý³ô±ý[ôþôþ´óêþfóWÿóÆÿÚò6ò£fò6òy òÞìñ@Õñ¡Åñ¾ñc¿ñÃËñ#àñ€þñØ(ò*]òtžò¼êòýCó=¦óyô²ôçôôpõCõõg†ö†%÷ŸÔ÷´ŽøÆPùÒúÛÛúàŸûà_üÚýÐâýÀªþ¬yÿ“Oy,]<ïËòŸÊhž'nß<’ DÔø›© dW + 🠶0 {¶ >1 ÿ£ Á‚sBÓ.‚ÅDÿ,ÃKƒ`DoxÄ}†{Gs aÌÿDÿOÿäÿ¥Öþ]›þ`þ¼&þhíý´ý° |ýL Dýá ým Øüò ¥ür uüí Füd üÙ ìûL Áû¾–û-lû™EûûiþúÎáú1Æú’®úó™úV…ú¹pú_ú‚OúåDúI<ú¯ÿ6úÿ7ú}þ:úåý?úOýEúºüOú)üYúšûhú ûzúúúöù«úpùÆúëøäúiøûè÷$ûj÷Eûîökûtö•ûöÃûõôû õ)üµô^üLô’üåóÇü€óûü ó1ýÆòjýpò¥ýòæýÒñ+þŒñpþGñ¶þñúþËð>ÿ–ð~ÿgð¿ÿ?ððFðŽøï×ïï íïkóï³ð÷ð:2ð|[ð»ŒðùÉð9 ñv[ñ±²ñëò"zòUéò†có³æóÛsô õ"¬õ@Vö\÷q¾÷„xø’3ùœóù¡µú }û›Kü’!ý„þqåþ\ÌÿA¯"‘ÿk×>¬ {ÖG lÖ:™ZÔš ÕV Ž F© ý@ ²Ì hR Ò ÑN†Ä;2ôÿ—­ÿñgÿ<!ÿ{àþ® þ×cþù(þðý)ºý7‰ý:]ý16ýýûôüÏÙü˜Ãü[°üŸüÔ”üˆü4üÛ‘üy›ü ¨ü— ºü Ïü˜ çü ý} ýì BýY gýÄ ’ý- ¾ý‘íýñþMMþ¥þø±þJåþœÿïSÿCÿ˜ÄÿìüÿC0™bñÿ”Iÿáþóýý"^ýQÃü~,ü§›ûÍ ûîú øù#uù:öøM}ø` øp ÷|8÷…Öö‡zö†!öÏõuõh9õZöôG¹ô3ƒôRô%ôäüóÅ×ó ¶óy™óRó(nóý`óÒUó¥NóxMóINóQóðÿWóÂÿbó“ÿpócÿ€ó3ÿ—óÿ±óØþÑóªþòóþôYþDô3þqôþ¢ôïý×ôÍýõ¬ýRõ‹ý•õnýßõQý.ö7ý‚ö ýÛö ý8÷üüš÷ìüøàükøÓüÚøÈüQù¿üÌù·üMú°üÔú«üaûªüõûªü‰ü«ü!ý®ü¹ý³üQþ¹üìþÁü†ÿÈü!ÐüÃÜükèü÷üÇýxý$.ýÍCýpZý qý¢‹ý4¥ýÃÁýQàýàþn &þù Lþ€ vþ  þv Íþß úþ= *ÿ‘ [ÿÝ Žÿ! Äÿa ýÿœ 8Ñ vÿ ·#ù=:J|LÁC4M•Þã (¼ p‹ ·P þ E¹ Œa Ó œ [5 šË Ô^ ì ?v pûžwÊìó]Ë77Q¢clzræsRn¾e*X–D)o àÿáTÿ´ÊþCþEÁý CýÆÉüSü1ãûßyû‡û+±úËUúgú°ù˜gù,$ù¾çøO°øÜøgSøóÿ,ø}ÿ øÿî÷þ×÷þÆ÷£ý¸÷0ý¯÷¾üª÷Nüª÷àû­÷tû±÷ û¸÷§úÂ÷DúÎ÷åùÜ÷‹ùì÷5ùÿ÷âøø”ø#øLø7ø øKøÌ÷_ø”÷tøf÷‡ø=÷Ÿø÷³øùöÇøáöÛøÍöîø¾öù¶öù´ö,ùºöCùÆöYùÛöpùõö‡ù÷¡ù<÷¼ùf÷×ù•÷öùÈ÷úø;ú>ø`úøˆúÊø³úùâúgùû¿ùGûú€ûsú¼ûÐúûû0û>ü‘û…üóûÑüZü"ýÄüwý.ýÐýšý.þþŒþrþëþÝþJÿFÿ¨ÿ®ÿf}Ëæ4M¡³†yøØd4ÊŒ*ã‚7Öˆ'Öy!Ìh ­tïÅ.jP£‡Ø³×2óW z š5¶GÓTì\]V F'0('õ"Õ³ jýAìÖܼ¢ e$^ä9§ié/»õŒ¹Z}%=îúµµzn<)ü纨um/6æ›ËO“\°'`ð¼»gc9¸`ïÿÌÿ®ÿªÿRÿ‹ÿ÷þlÿœþPÿ?þ7ÿäýÿˆý ÿ-ýöþÒüåþvüÖþüÆþÁû¹þhû¬þû þ·ú“þcú‡þú{þ»ùpþlùeþùZþÓøNþ‰øAþCø4þø$þÀ÷þ„÷þK÷ëý÷Õýäö½ý¶ö¢ýö…ýhögýHöFý-ö#ýöþü öÖüö¬üöüöRü ö"üöòû)öÀûAöŒû_öXû†ö$ûµöïúêöºú%÷†úf÷Tú«÷"úõ÷ñùCøÃù˜ø˜ùñøoùQùHù¶ù$ù"úù’úëøûÔø}ûÀø÷û³øsü©øòü£øsý¤øôý«øwþ¸øüþËø„ÿåø ù•-ù[ù¨Šù.¾ù°ôù0,ú­gú%©úŸòúCûŒœûüûm`üÖÅü8*ý“‹ýéêý9Gþ†¢þÌÿ `ÿO Èÿ‡ 4º ¥ç  ˆ- óF VZ ±k u Yz «y t Yi ±Y E `, ­ ÷ì 9Å uš ­l ã9  NÈƒŠ¶Kä Á0wL)cÙs‡ƒ1“Ù ­#¸ÄÀcÁ¼›³6¤ÍŽcuø\ŠA#¬<äËÿ¿Yÿ˜èþlwþ;þšýÐ.ý˜Àü_Tü$çûéyû­ ûoú00úîÆùª]ùe÷ø “øÚ1ø”Ó÷Mv÷÷ÁÉözxö1.öéèõŸ¨õUnõ 9õ½ õqàô%¿ôÚÿ¤ôÿŽô>ÿôïþyôœþyôHþôôýŒôŸý¡ôJý¾ôòüáô›ü õBüBõäû~õ…ûÂõ'ûöÈúaöhú»ö ú÷ªù€÷Hùê÷æø[ø„øÓø"øOùÄ÷Õùe÷bú÷õú®öŠûUö üö¸ü­õNý_õæýõ~þÑôÿô·ÿTôTôõïó”Åó0¤óÊŠó_xóïmó|kóoóŠ}óó°ó Úó‚ôñLôY•ôºåô ;õe –õ² öõø ]ö6 Êöl >÷› ¿÷ Jøà áø÷ ~ù $ú Êú oû üù ²üâ RýÁ óýš ˜þn Cÿ; öÿ «Å e 6 Òå%5¿ÖTtåu¨=”Ñ%a²ñ7 }µ ' – "î ¯F <š Êé X6 ê} |Á þ ¨ÿ0 @ÿX Ûþy yþ þž ¿ý¦ gý© ýª Àü¦ tü *ü ãû|  û^ bû6 (û óúÐ Áú“ “úQ jú CúÈ ú ú0 æùÝ Ðùƒ ¼ù$ ­ùÁ £ùZ šùð—ù‚–ù˜ù¡›ù.¤ùº®ùB»ùÉÎùNàùÑøùRúÒ0úRNúÒoúS’úÓ¹úSÞúÔûS1ûÒÿ\ûTÿ‰ûÑþ¸ûOþèûÑýüQýOüÑü„üSü¹üÖûòüXû)ýÛú_ý_ú–ýãùËýgùÿýíø5þuøkþý÷¢þ†÷Ûþ÷ÿöNÿ+ö„ÿºõ¹ÿMõéÿâôzôFôu°ó¢RóÐøòÿ ò+NòVò€¼ñ¨|ñÍAñðñâð1½ðO¡ðlŒðˆð£}ð½†ðÕ–ðë®ðÒðñ"9ñ/{ñ;ÆñFòN|òVæò^ZódÚógdôiùôh–õe;ö`äöY‘÷QAøIöø>±ù1uú$AûüòüïÑýÙ±þÂÿ«e‘6uZÎ<–`ü,ÛûºÉ—”tXP ,¼ \ ãñ ¾{ šþ w€ Tý 2u é óÿSÕÿ´·ÿ›ÿKÿ†iÿµTÿØBÿõ/ÿ !ÿÿ) ÿ+ÿ%þþüþùúþÒþþ¡ÿi ÿ*ÿã%ÿ˜4ÿHCÿó Tÿ— fÿ4 {ÿË ’ÿZ «ÿâ Åÿf ßÿâ ùÿ\ Ñ +C Cµ[$rŽŠø¡]¶ÁË#Þðàþ@  bÄ)ÿöþ^þ Êý6ýô¨üâüÏ”û¶ûœ’úúcŸùE)ù&·øJøãÿá÷¿ÿ~÷™ÿ!÷sÿÅöMÿqö$ÿöüþÒõÖþˆõ®þCõ†þõ`þÅô:þŽôþZôóý*ôÓýþóµýÕó›ý²ó€ý‘ógýuóPý_ó9ýMó%ý?óý4óý-óýü+óöü,óôü4óõü?ó÷üQóûühóý„ó ý¦óýÏó"ýûó2ý-ôEýfô[ý¤ôsýèôŽý1õªý‚õÈýÙõåý7öþ›ö%þ÷Eþs÷eþæ÷ˆþ_ø¬þÞøÐþdùôþïùÿ‚ú<ÿû\ÿ·û}ÿWüÿ÷ü¾ÿ˜ýÝÿ9þúÿÙþ}ÿ1 JÉawx*ŒÝ¡´>ÄåÓ…ßê©ô4ü½F ÐY ß ^ Ñ #8 '’ *Þ -! 1^ 5” ;È Aù G$ MH Uc _t iy ur „a •J ¨, ¼ ÐÞ å° û~ D + F¾ ep ƒ ¥Á Æa æý ” '' FºdKØ¡cÀêÞnüîk.êAeRáa^lÛuY|Õ€S‚ÓSv×ÿi\ÿXãþClþ)úý ‹ýëýƵüŸPüsîûDû8ûÖäú›–ú[LúúÔÅùŒŠùBQùöù§ïøWÄøžø¶ÿ{øbÿ]ø ÿCø¶þ,øaþø þ ø¹ýý÷fýñ÷ýè÷¾üå÷küâ÷üà÷Ëûà÷ûã÷6ûæ÷ðúê÷®úò÷múù÷.úøðù ø·ùøù!øLù.øù<øôøJøÏø[ø®ølø’ø}øzøøeø§øSø¾øFø×ø=øôø9øù8ø5ù>øYùJø€ùYøªùløØù„ø ú ø<úÂøtúæø²úùòú=ù6ûnù€û¤ùÊûßùüúmüaúÅü§ú$ýðú‡ý>ûíýŽûVþàûÂþ5ü,ÿü—ÿéüHýh¨ýÕ þFoþºÓþ39ÿ°žÿ)ŸkÓ{=ܧ8vçÜ=?•¢ìA`¾ÖtFËn ‹r¢¿µÇKÕ‹àÉçç=àtÐ¥¸Ñ˜÷q F4 L é_ µp ~} E… ˆ ƈ ƒ‚ ;v òe §Q Z9  ½÷mУËs{?+ÝˉDCø÷­¨bUþУŠEGä~Êÿÿ©Zÿ:$ÿÆòþPÁþÙ’þ_gþå?þiþìÿøýnÿÛýíþ¿ýhþ¨ýæý’ýcý~ýßüný^üaýÞûVý_ûMýáúHýeúDýéù@ýqù?ýûø?ýˆø@ýøAý¯÷EýG÷IýæöKýˆöNý0öQýÜõSýŒõUýCõTýõUýÄôTýŽôRý_ôNý8ôHýô>ýô3ýïó&ýåóýâóýåóöüïóãüôÎüô¸ü?ô ükôƒü ôgüÝôJü õ.ükõü¼õóûö×ûpö»ûÔö¡û?÷†û±÷mû)øUû¨ø@û-ù,ûµùûAúûÑúûdûüúùûùú“üúú/ýýúÍýûoþûÿ!û³ÿ6ûSQûòoû‘•û.¾ûÌêûhüGü˜xü*«ü¶âü<ý¼_ý7§ý°óý"Aþþ÷ÝþV &ÿ® kÿþ ®ÿC íÿ‚ .º rè ¼ 4 TP  b él *p ej š\ ÊH ÷. $ Qæ º ­† ÚO  )Ð J‰ h? ñ™ž¯IÄñ×—ê:üÝ ~%»1[=÷F•P2YÏ_nc h«iKkíkj1lÓlxj gÈÿdsÿ^ÿWÉþMvþB"þ6Ïý)~ý/ý àüû”üéHüÕÿû¶û¬oû“(ûyãú^Ÿú@\ú!úÚùáù¾bùš)ùuòøM½ø#Œøø[øË.øžøoÜ÷=¸÷ ˜÷Ö{÷Ÿ`÷eL÷)<÷ì0÷­(÷k"÷'"÷äÿ&÷œÿ.÷Sÿ:÷ÿM÷·þf÷gþ„÷þ¨÷ÀýÐ÷iýü÷ý*ø¸ü^ø^ü•øüÑø§ûùIûZùìú¥ùŽúõù/úHúÒùŸúuùúúùVûÀø´ûiøüø|üÃ÷âüu÷Lý,÷¶ýæö!þ¤öŽþföûþ.öjÿüõÙÿÏõG©õµ‹õ$rõaõüWõfUõËZõ1hõ•~õöœõUÅõ±ôõ ,ö`kö±°öþúöFK÷‹ ÷Ëý÷bø?ÏøqEùŸÂùÈDúíÊú Rû&Øû;]üKãüViý\óý\€þXÿP¤ÿB81Ì_ìàu½ù•vjñ=h ÝÖQŸÃe2'Ÿé§cd¼ØZ¢Håþ% ³a i— È Òô ‡ ;8 ðU ¥m Z  Ë™ ‚  <¡ öÿš °ÿ kÿ‚ (ÿm æþU §þ< hþ +þý ïýÙ ´ý± zý„ AýS ý Ôüã ü¥müd<ü! üÜàû”´ûK‹ûÿdû±>û`û øú¶Öú]¹úœú¨úLkúîVúCú04úÑ&úoú ú« úGúãú~ úú¹ÿúUÿ"úïþ0úŠþ@ú%þTú¿ýlúYý…úôü úŽü¿ú(üàúÃûû]û(ûøúQû“ú}û/úªûËùÜûiùüùEü¢ø{üAø²üá÷éü„÷"ý(÷^ýÎö™ývöØý!öþÎõ\þ|õŸþ0õâþæô%ÿ ôgÿbô¨ÿ(ôéÿôó)Äókšó®vóï[ó2Cóu4ó¶.óô-ó24ómEó§_óàó¬óLßóô³aôã®ôõ=eõcÍõˆ=öª³öÊ0÷æ³÷ÿ;øËø(`ù6üù@žúHGûLõûL¥üHXýA þ4¹þ$hÿù¿ßl¿žÉxxP$$ÎóqÁ ŸT,±à/£«e! &“ åÿ £d bà  Þf žª `ç  çÿL ¬ÿu tÿ™ =ÿ¶ ÿÌ ÙþÙ ¬þá €þâ XþÛ 6þÎ þ¾ üý© åýŽ Ñýp ÂýK ¶ý" ­ýð ¨ý¹ ©ý~ ®ý> ¶ýú Âý³ Òýi åý øýÌ þx +þ HþÄeþd‡þ©þšÌþ0ñþÄÿU<ÿæaÿw‡ÿ­ÿ’Ñÿõÿ¥,5±T7o»‰@¡Ä¹JÌÑÿßXÿîÝþùcþëýrýüü‡üüý¡ûó1ûçÂúÚVúÊëù¶ƒù ù‡¶øjUøKõ÷+š÷ @÷ëÿêöÉÿ—ö¥ÿEö„ÿ÷õ^ÿ¬õ7ÿeõÿ#õçþãô¿þ¨ô˜þrôqþ?ôMþô,þçó þÂóêý¡óËý…ó­ýoóý`órýVóWýQó?ýUó*ý`óýpó ý†óþü¤óôüÈóëüóóåü%ôáü_ôÞü£ôÞüìôâü=õéü–õòüõõüü\ö ýÉöý?÷-ý¼÷@ý?øWýÈønýXù†ýîù ýˆú½ý&ûÛýÈûúýmüþý;þÀý[þnþþ ÿ¡þÔÿÃþˆçþ? ÿõ.ÿ©QÿWuÿšÿ¨¼ÿIàÿé†%!G·hIŠÔ«W ÍÑ íB ª / Q] r¬ ”ò ´1 Ôj ôœ  4à Vö x œ ¿ý áï Û 'Á Kž mv ‘H µ ØÑ ü D Bö e£ ‡N ¨÷ Ç› æ8 Ôk5ÿKŽas¨ƒ4ÀšK Ø¡a ë›sû‚o Z’? ¦þ5ÖÆÿ©XÿvëþAþþȱý†Lý?ìüõü§3üWÜû‰û¬:ûRìú÷¤ú™^ú:úÙÿàùwÿ¦ùÿrù±þ@ùOþùìýçø‰ýÂø)ýøÉü}øiüdø üKø¯û6øUû$øûø®ú ø^úÿ÷úø÷Íùô÷ˆùñ÷Hùó÷ ù÷÷Òøü÷œøøkø øAøøø"øþ÷1øå÷AøÐ÷QøÀ÷dø´÷yø¬÷ø©÷¨ø«÷Ãø²÷áøÀ÷ÿøÓ÷ ùë÷Dùøjù*ø‘ùPøºùzøéù©øúÜøJúù€úMù¹úŒùöúÏù4ûúwû`ú½û®úüÿúRüRû ü¨ûôüÿûIýXü¢ý´üþýý[þrý½þÒýÿ5þ€ÿ™þåÿýþI`ÿ°Ãÿ%‚ˆìêWLÀ¬( jðÅM ©yÎS!¦qö¿B ŒQÏ– ÖBrN›…½¸Øèï<`›³ ÇýØèæÌò­úˆÿaÿ8û ô×é¤ÛlË/¹ò£²Šrq1Sð3°oé.¿ì”¨fc7!ÞÒœ_c!(æê¬ªti>& àÖ™¢PrB¸ièÿ¿ÿÇ™ÿssÿPÿÈ/ÿqÿïþÀÿÑþgÿ´þ ÿ™þ¯þþSþgþ÷ýQþ›ý<þ?ý'þãüþ‡üþ+üñýÐûÞýwûÎýû¿ýÈú¯ýqúžýúýÌù€ý{ùqý-ùbýâøRý™øCýSø3ýø!ýÑ÷ý–÷ýü_÷éü,÷Ôüüö¿üÏöªü¦ö”üö|üböeüGöMü2ö3ü#öüöÿûöãûöÈûö¬û,öû<övûQö\ûmöBûŽö*û¶öûåöÿú÷ëúW÷Øú™÷Èúß÷»ú+ø°ú{ø§úÐø¢ú*ù¡ú‰ù£úíù©úXúµúÈúÃú;ûÕú²ûíú,üûªü'û)ýLû«ýuû/þ¢û¶þÔû=ÿ üÆÿFüOƒüÙÆüe ýîQýyœýéý„9þ‹þ‡áþ9ÿ|‘ÿóêÿfAÕ–>é£;‹[Û®+ûxA Å€ » Uí — ÓB c <} h ‘œ µ¡ ÙŸ ø– Š +w >_ LB T X÷ YË Wš Qd J* @í6¬(g ÕðˆÙ9Áè©”‘?{ècŽM57Ù} îÂÕa¼¤¢Ž@yÞe{SA·/Uôÿ ’ÿ÷.ÿäËþÒhþ¾þ«£ýš@ý‰ßüv}üeüR¿û?aû+û¨úþMúçôùÏù·Hùžöø„¦øjZøMø0É÷†÷óE÷Ñ ÷°ÓöŸöhpöBEööóÿþõËÿãõ ÿÍõuÿ¿õGÿ¶õÿ²õåþµõ³þ¼õ€þÊõKþÞõþøõàýö¨ý<öqýiö7ýœöüü×öÁü÷…ü]÷Iü©÷ üù÷ÐûOø”û§øXûùûiùãúÐù©ú<úqú®ú;ú$ûúûÔùü¤ù™üwùýKù›ý#ùþùŸþÞø$ÿÁø©ÿ©ø.–ø¶‡ø<|øÂwøEwøÇ{øF…øÁ”ø8©ø­Åøæø ùú9ùajùÄŸù ÙùwúÈYúŸúWìú•>ûÏ”û ïû/ KüU ªüt ý iýŸ Èýª (þ­ ‹þ« ïþ¢ Uÿ“ ¼ÿ #e ˆE î Pô®Ã ŽaT· Ò]®Eý÷K¨“VÖ¬TTŒüÀ£ñI#ïP”z:£ßȆé,Ó!|8&MÓ`‚r2‚åÿ˜ÿœLÿ¥ÿ¬½þ°yþ°6þ­öý©¹ý£~ýšFýý†Úüx¨ühxüVKüAü)óû Íûî§ûÍ…û©bûEûY)û/ ûöúÐàúÌúh¸ú/©úò›ú³úq†ú,}úåxú›vúOuúuú´yúa€úˆú¶“ú^ ú®ú§¾úIÏúìÿäúÿúú+ÿûÉþ-ûeþJûþiû›ýŠû6ý­ûÏüÐûhüõûüü›û>ü6ûdüÐúŒülú¶ü úãü§ùýEùAýæøqýˆø¡ý-øÏýÔ÷þý|÷.þ(÷ZþÙö‰þŒöºþDöêþöÿÁõNÿ†õ€ÿOõ³ÿõäÿõôÏôA°ôn—ôœˆôË~ôúzô)€ôVŽô…¢ô²¾ôßâô  õ3Bõ[}õ„Áõ«öÐdööÂö'÷>’÷_ø~zøœõø¸wùÒÿùëŒú!û»û)Xü8ùüG›ýS=þ\ßþaÿdf¼e\`ý[žR<EÙ8p'ŒþåË®yéoQM´+ f ß³ ·÷ 3 fh =– ¼ ëÝ Á÷ — m E! " õ Î ¨ý †ä bÉ B§ #‚ [ êÿ. Ïÿÿ ¶ÿÊ Ÿÿ’ ‰ÿX uÿ dÿ×Tÿ‘FÿK8ÿ-ÿµ$ÿjÿÿÏ ÿ}ÿ+ÿ×ÿ€ÿþ'ýþÍüþsúþùþ¼øþ_÷þöþ¦õþIöþêõþ‹óþ*ïþÊìþjçþ àþ©ÿÙþJÿÒþëþÌþŒþÄþ-þ»þÏý³þrý©þý›þ¸üŽþ]ü~þünþ«û^þTûMþÿú<þ¬ú,þ[úþ ú þ¾ùùýrùçý'ùÔýÞøÁý™ø¬ýWø™ýø‡ýÜ÷vý£÷fým÷Yý:÷Mý÷@ýÜö4ý²ö*ý‹ö!ýhöýKöý0ö ýö ý ö ýüõ ýôõýðõýðõ"ýõõ,ýÿõ;ýöKý#ö[ý=öoý[ö…ýöžý«ö¸ýÚöÖý÷ôýI÷þ‰÷9þÏ÷^þø„þhø«þ¼øÔþùþþwù(ÿÛùRÿFú}ÿµú©ÿ)ûÕÿŸûü+üWýŒýªþÓ”þúÿ!¨ÿF2i½ŠG¨ÐÆUáÕûUÒ&N9ÈI@X¶c'o’xø}Uƒª…ú†C‡ˆ†Ç„ ƒ6 e {Œ w¬ tÅ nÖ jà hâ eâ bÜ _Ð `À `« `‘ aq eM j$ põvÅ~ˆX‘œâ¦¤³dÀ"ÍÞÜ—êPö»o#%Ö.‰7;=îB¢ETFD»>l7-Î1ûãå–ËJ¯Ž·ÿjlÿC ÿ×þêþ¸Cþ…üýNµýoýÚ+ýœèü]§ügüØÿ&ü’ÿèûIÿ«ûÿþoû¶þ7ûkþû!þÉúÖý—úýfúEý6úúüú²üÜùjü²ù$üŠùßûdù›ûAùZû!ùûùßúçø¥úÎøoú·ø=ú£øúøâùø¹ùrø“ùgørù_øSùZø8ùXø"ùYøù]øùdøûønø÷øzøøøŠøýøœøù³øùÍø#ùêø9ù ùRù/ùoùXù’ù…ù¸ù´ùâùéùú"úAú[úwú™ú°úÜúëú#û)ûmûlû½û°ûüøûgüAüÂüüýÛüý+ýàý}ýBþÐý¦þ%þÿ{þwÿÒþãÿ*ÿQÿÃÚÿ6/¨†Þ„5ñŒXâ¾8"Œ†Üè.H~¦ÊT_ ¨æî'/_p’­Âèì V0ˆH¹Zçfi:e^Z|J˜4²ÈúÜÖí¬úL  Ù ˜WûïÌÞƒÊ8³î˜¢zUV1»mØ ¨Ór‡:<ýò¿«{e6!îߢ¡Rc(¬ðÿUºÿû…ÿ PÿB ÿãñþ€Åþœþ¹tþTPþïÿ.þ‰ÿ þ"ÿîýºþÑýRþ¶ýëý›ýƒýƒýýmý·üXýSüEýïû3ýŽû"ý0ûýÑúýuúöüúèüÃùÜüpùÑüùÇüÏø½ü…ø´ü?ø¬üû÷¤ü½÷›üƒ÷“üJ÷‹ü÷ƒüçö|ü¼ötü•ölüsögüXöaüBöZü0öTü$öNüöFüö>üö8ü%ö1ü1ö,üCö'ü[ö#üxöüœöüÆöüôöü(÷üa÷üŸ÷üá÷ü)øüwøüÈø"üù+üzù5üÙùAü<úNü¦ú^üûpü€û„üòûšügü³üáüÑü[ýñüÖýýUþ:ýÕþcýUÿýÙÿ¶ýZäýÞþ_Aþâsþbªþáâþ_ÿÙ[ÿT™ÿÌØÿ@°OŠƒÄæüE6žoôªDåÕS ‡L · â« Ð -ð O o * ¨3 À4 Ö/ ç% ô ýþ ã   s E ü óÚë ßaÑ ÁÚ°’ GŽú|«kXYG°6Z$ªPöøèœÜBÐçÆ‹¼/³Óªy£œ×j“¹ÿŒ_ÿ‹ÿбþ†[þƒþ±ýz]ýt ýn¹üiiücü[ÌûQûG4û:ëú+¢ú[úúóÔùÛ’ùÃSù©ùŒÜøo¤øMnø):ø øÛÛ÷³±÷‡‰÷Yf÷+E÷ûÿ*÷Éÿ÷”ÿûö_ÿéö'ÿÛöïþÒöµþÍö|þËöAþÐöþÙöÉýæöŒýùöOý÷ý/÷ÖüP÷˜üw÷\ü¡÷!üÑ÷æûø­û>øtû~ø=ûÂø û ùÕúYù£ú¬ùsúúFú]úúºúóùûÏùû¬ùêûŽùWütùÆü]ù9ýIù®ý9ù$þ,ùœþ%ùÿ"ùÿ$ù*ù5ùüFùw\ùðxùi—ùá»ùUâùÈ ú8=ú¥qú«úuëúÙ1û8{û’Èûèü:mü„ÂüËý oýFÊý{%þªƒþ×åþúHÿ «ÿ0 B rM ÔT 4T ’O íE E5  ó HèšÄé›3p{?¾ ûÕ6šk^žÌØö”L>]¹vm‹Ñª‚µ2»á¿‘¾?»î´ªKžúª~[k V½@o(! Õÿð‰ÿÒ=ÿ³óþ‘¨þmaþJþ&ÓýŽýÜIýµýÄüeƒü:DüüâÉûµû†WûYû*éúø¶úÇ…ú—Uúd(ú/ýùúÔùîù‹ùVkùMùã2ùªùpù4ôøùÿäø½ÿÙøÿÑø@ÿÊøÿÉøÂþÌøƒþÓøDþÞøþìøÃýýø„ýùDý(ùýCùÅüaù…ü„ùIü­ù ü×ùÒû úœû>úhûzú:û¾úûûåúXû¼úªû“úÿûmúVüEú­ü úýþù^ýÛù¸ý¹ùþšùnþ|ùÊþ_ù&ÿCùÿ(ùÚÿù0ýø‡êøÛÚø.Îø‚ÆøØÁø-ÀøÅøÔÎø$Ûøqîøºùÿ'ùCHùƒpùÁùüÎù5úl<úžzú;ú÷ûUû=¨ûZüs[üˆ¸ü›ýªyýµÛý½@þ¿¥þ¿ ÿºvÿ±ßÿ¤I•µ‚lŠSð7SµõÑn©Ç~Qm"¼ð¼L‡ŽPÉÝ2¢_e‡'«ę́êi(ç-§:fB&FæG¦Cf;(1ìÿ#°ÿtÿü:ÿåÿÊÈþ®‘þŽ\þm)þKøý)Èýšýáoý½Dý•ýj÷ü?Óü±üè’ü¿uüšZütAüM*ü%üùüËõû™çûfÜû5ÓûÌûØÊû¬Èû~ÊûOÐûÚûâäû¥ñûfÿû'üéü¬1üoFü1_üôÿzü±ÿ–üjÿ´ü"ÿÏüØþçüŠþüü>þýóý!ý§ý3ýZýHýý`ýÃüzýuü–ý(ü±ýÛûËýûàýAûòýöúþ­ú þfúþ"ú(þÞù:þœùOþ\ùeþ!ù|þæøþ¯ø¢þ}ø²þNø¿þ"øËþû÷Úþ×÷ëþ¸÷þþž÷ÿ‡÷-ÿv÷Eÿk÷[ÿc÷nÿa÷€ÿe÷‘ÿn÷¤ÿ|÷¹ÿŽ÷Ðÿ§÷êÿÅ÷è÷#ø@>ø\røw©ø‘çø«*ùÆsùâÁùþúgú=¾ú\û{vûšØû¶>üÒ§üíýˆý!üý;pþUäþlVÿƒÇÿ˜6«§½ÌÚåuñèúYÉ6   b ¾ÿiø¸ïåI؉ÌÁ½ó®œC‹dye“R£>¬)¯ªÿ ê’×€Âl­S™8…qó_ÈN•<`-(î¶ÿ~ðCáÒÆÅ‚·9­î¤¡šU’ ŠÀ€xt/gäY˜JJ=û/­$]Åzôÿ/ãÿæÿÏÿžÿ»ÿTÿ¦ÿ ÿÿÄþxÿ|þaÿ8þGÿóý-ÿ¯ýÿoýòþ.ýÓþðü³þ´ü•þyüwþ@üZþü;þÔûþ ûøýpûÑýBû©ýû€ýìúYýÄú1ý úý~úîü_úÑüCúµü)ú™üú{üýù\üíù:üÞùüÓùüûÊùâûÄùÍûÂùºûÀù­ûÂù£ûÆù™ûÌùûÖù‡ûâù‚ûòù~ûú~ûú‚û/ú‹ûEúšû_ú«ûzúÁû–ú×û´úïûÕúüøú"üû?üFûaüpû†ü™û°üÃûßüîûýüAýHüsýxü§ý«üÜýàüþýGþNýþˆý¸þÁýõþûý1ÿ5þoÿpþ¬ÿ­þéÿìþ%,ÿ`oÿš´ÿÕùÿ<H‚Ǹ ïO$“W׈·cä§é:,al†ª¬åÏ ïZ “)ÆC÷[$rJ‡n™Œª©¹ÆÆßÒôÛäêïòòóõòåîÒé¼å£Ý†ÓeÇ>»­æ¶‹…zReOé7³{BäÃÏ ”}\W#2ë ´á~¸J‹\ä*³ö„¿Y†/LäÿØÀÿÿc}ÿ']ÿìÿAÿ¯ÿ&ÿoÿ ÿ/ÿöþíþáþªþÍþgþ»þ$þ©þáýšþŸý‹þ_ý|þýoþßüaþ£üTþhüHþ/ü;þ÷û0þÁû%þŠûþRûþûþåúöý²úéýƒúÚýWúÊý1ú»ýúªýðù™ýÔùŠý¹ùzýžùiý…ùXýmùEýYù0ýHùý=ùý7ùîü6ùØü9ùÂü>ù­üFùšüPù†ü[ùsüiù`ü|ùLü“ù;ü¯ù)üÐùüöù üúþûIúóûvúêû£úãûÒúàûûÝû<ûÛûwûÝû¶ûâûùûêû?üõû†üüÐüüý+üdýCü±ý[üþwüOþ–ü¡þ¸üõþßüKÿ ý¢ÿ9ýùÿkýNžý¤Ôýü þQAþ¨zþý·þR÷þ¨8ÿû~ÿNÄÿ ïJ<Œ‡ÏÐQ[’ÕÜYQ—†Ñºè:i<•`À蛳1ÇP×kâê“ï¡îªé°á´Ó´Â¯¬¨’ u“Sƒ/p[ÚC«*xBóÖ˶—KvSÀ1v+ìÞÊ«;‹èj”L@-ì–òBÓ츗@‚éÿj‘ÿT7ÿ>ßþ)‰þ4þÿâýêýÖBý¿õü©¨ü–^ü‚üoÊû]‚ûJ;û7öú"´ú súõÿ7úÜÿþùÂÿÉùªÿ™ù‘ÿhùwÿ=ù^ÿùCÿìø(ÿÅø ÿøíþ{øÎþ[ø¯þ>øþ&øpþøQþø2þÿ÷þú÷öýö÷×ýö÷¹ý÷÷šýù÷|ýÿ÷_ý øBýø&ý-ø ýGøõüføÝü‡øÆü«ø°üÓø™üþø…ü+ùsü]ùbü”ùVüÏùLüúCüTú<üžú5üèú-ü4û%üƒû!üÔûü(üüü üÚü'ü9ý/üœý<üþFügþQüÏþ[ü7ÿeü ÿsü‚üp•üÚ«üCÄü¯àüúü„ýî0ýVMý¼jý‹ý‚­ýàÒý;øý• þéJþ;sþ‰œþÕÅþñþ]ÿ›JÿÑzÿªÿ3ÝÿZ =œo·¡ËÒÙâ2åbã’ÜÂÎò½!¦O‹{k¥EÏ÷í¼@‡dM…¥ÐÁÝFõü °c0@ÂMpZcÈlpqsÂsioi¸cc[ R´G_; -¶ÿbÿÿù½þänþÍ þµÖýœŽýƒGýiýO¼ü4wü6üüõûßµûÀzû Bû€ û`Ýú=®úúûWúÙ.ú¸ú•àùr»ùN—ù)wùZùÞBù¸-ù’ùmùF ùùöÿúøÍÿöø£ÿñøyÿðøOÿðø&ÿòøýþûøÔþ ù©þù}þ2ùNþLùþhùðý„ùÀý¤ù”ýÃùjýåù@ý úý6úêüeú½ü•úüÌú`üû1ü>ûü{ûÛû·û³û÷ûû8üiû|üEûÅü!ûýþú\ýÜú¬ý»úûý›úKþú›þfúêþRú;ÿ?úŒÿ0úßÿ#ú1ú†úÜ ú1 ú„ú×ú'út.úÁAú WúVsúž‘úå´ú)Ûúkûª4ûåhû ûRÛû„ü²aüܧüñü(=ýHŒýeÝý}1þ’ˆþ¢ãþ°?ÿ¸œÿ¾ûÿÀX¾¶¹®q£Î“*€†jáQ75âó0Ï|¨Ä} RJ%‡öÁÆõ“%^N*rô’º«‚ÀHÐ ÜÑã•äZâÛáϤ½g¨*ís°Rt-9þÿÝÄÿ±Œÿ‚RÿSÿ"áþíªþ¸tþ‚=þJ þ×ýÙ¥ý výgIý-ýóòüºÈü üFxüPüØ*ü£ünæû:Èû®ûΗû™ûdnû.[ûûÿIûÊÿ8û›ÿ'ûnÿû@ÿ ûÿÿúáþûú¯þúú}þüúKþûþûëýû½ýû‘ýûeý(û9ý0û ý:ûßüJû±ü]ûƒüsûWüŒû,ü¨ûüÅûÛûâûµûþûûüjû9üFûWü%ûyüûœüåúÂüÈúéü­úý•ú;ý€údýnúý^ú·ýQúáýHúþ?ú;þ;újþ9ú™þ:úÉþ?úúþHú*ÿSúYÿaú‡ÿtú·ÿŠúåÿ¥ú¿úCßútû¥'ûØOû{û7©ûfÚû’ ü¾Düë{ü·üAôük2ý“rý½´ýäøý ;þ.þOÇþpÿVÿ®ÿÊäÿå)ýp·)ü<AL„[Çh rIzˆ~Ä‚ÿ…8„m‚¡|Òuk-`XRB¤/ÆåîÕ-¹?›O}[^d=lnõnÐmªh‚`ZU2I8Þ$´ˆø^Þ3Ĩ݊²k‡I]%3þ Õæÿª¿ÿ™ÿUsÿ.Nÿ*ÿÙÿ¯åþÃþR¦þ ‰þîoþ¼UþŒ>þ^'þ0þùýÖãý§ÍýyºýI¨ýšýëÿŽý¼ÿ„ýŽÿ{ýbÿsý6ÿký ÿbýáþXý¶þMýþDýcþ:ý;þ3ýþ/ýëý+ýÅý*ý ý+ý~ý*ý\ý*ý;ý)ýý%ýûüýÝüýÀüý¤üýŠüýrüý[üýFüý3üý!üýüýüýôûýéûýßû ý×û#ýÐû(ýËû-ýÈû5ýÇû<ýÈûCýÈûLýÌûVýÑû`ýÙûnýâû|ýëûŒý÷ûŸýü±ýüÅýüÚý/üîýBüþUüþjü8þ‚üTþ™ürþ±ü“þÊüµþäüØþÿüýþý!ÿ8ýFÿXýlÿyý‘ÿ›ý¹ÿ¾ýâÿáý þ4,þ^Qþ‰xþ´¢þßÌþ øþ3&ÿ]Uÿ†„ÿ®³ÿÖãÿý#BHvlªŽ߯ÎL삹"ñ<$S[i|ÃŽøž)¬Y¹‰Ä¸ÌæÔÙ=Ýd߇ߦÞÂÜÛØðÓÍÄ%»1±6¤8˜5Š.{!l]þLê:Ñ&¶˜þvéOÓ%»ø¤ÇŒ”ta\-A÷'À ˆïOÓ´Ú–ŸvdU'4îµñ|ÏF­‰àÿd¯ÿ>ÿPÿîÿ#ÿÄÿùþšÿÐþnÿªþEÿ‡þÿeþôþGþËþ*þ¡þþtþ÷ýFþáýþÍýåý»ýµýªý†ýšýYýý-ý‚ýývýÛüoý³ügý‹üaý`ü]ý6üXý üTýáûRý¹ûOý•ûLýsûKýUûIý9ûHý ûIýûHýñúHýÜúIýÈúHýµúHý¥úFý˜úEý‘úDýŒúEý‹úEýúDýúEý˜úGý¡úIý¯úJý¿úKýÓúMýëúNýûQý#ûUýDû[ýgûcýŒûiýµûrýßû}ýü†ý?ü‘ýsüžý©ü«ýãüºýýÊý\ýÝý™ýóýÙý þþ þ[þ8þŸþRþäþmþ*ÿˆþqÿ¦þ¸ÿÄþÿÿãþDÿ‹'ÿÒLÿrÿ^™ÿ£Àÿççÿ+ l3­Wí|*¤fË öØ IBqt–¥¹ÑÚüø$J4nRŽn¬‹Ç¥à¼ôÐâð$ý.6;==#8%0$&! ú åÍõ³è–ÛwËU»0ª •àƒ´o…[VD#.ðFÛ ÆÍ³ŸOŒzÌh‡VBDü3µ#o)äÿø ÿìZÿßÿÓÎþLjþ¼Bþ¯úý¡µý“sý‡1ý{ñüp¶üdzüWAüJü;Ïû+—ûaû+û÷ÿùúåÿÍúÒÿ£ú½ÿ}ú¨ÿZú“ÿ9ú{ÿúcÿýùJÿàù/ÿÆùÿ­ùúþ˜ùÝþˆùÂþ|ù¦þtùŠþnùnþnùPþpù5þsùþyùúý~ùÞýˆùÃý•ù¨ý¦ùŽý¹ùtýÐù]ýëùGýú2ý)úýLú ýqúúü˜úêüÃúÚüñúËü ûÀüTû·üˆû¯ü¿û«ü÷û¨ü3ü§üoü¨ü®ü§üïü©ü1ý¬üwý°ü½ý¶üþÀüOþÍü™þÛüãþíü.ÿÿü{ÿýÈÿ"ý5ýaHý®\ýýsýKŽý™ªýåÈý0çý|þÇ&þEþWeþœ†þà¨þ#Íþdòþ£ÿÞCÿmÿO˜ÿƒÂÿµëÿå?7l]˜€Æžõ¹$ÐSå‚ö±Þ  8e‘ ¼çøè9Ô_½ƒ£§…ÇdåAñ4ÄH”\bl.yö„¼Œ‘E“Ä‹‚„=xøj±ZjF"1ÙüFÞü¾³šitL×ÿ"Žÿ÷CÿÊúþž²þolþ?'þãýÝ¢ý«aýw!ýCãü¤üÝfü«*üyñûG»û‡ûçÿVû¸ÿ(û‰ÿüú[ÿÑú-ÿ¦úÿ}úÙþVú¯þ1ú‰þúaþñù=þÕùþ¿ùùý«ùÚý˜ù¼ý‰ùžýzùƒýlùhýbùOýWù7ýQù ýOù ýRùûüWùëü`ùÜümùÍü|ù¿üù°ü ù£üµù˜üËùüæù†üúü$ú}üIúyüqúvü›úrüÉúnüùúlü-ûjücûiü›ûkü×ûnüürüSüzü•ü€üÙü†üýüfý”ü°ýœüûý¥üJþ±ü™þ¿üêþÎü<ÿÞüÿðüâÿý3ý‡+ýÛBý.Yý‚qýÖŒý)©ýzÉýÌêý þh0þ´Uþý|þE¤þŠÌþÍõþ"ÿJOÿ„~ÿ»±ÿíãÿJFr{–°·äÔíM¶ë&*S,†'¸æAñjÙ‘¿¶¡Û€ý\47OÛeªvx„C —Ñ›–Yœ—Ú˜„UvcÌN†6@ú²ámÁ&ŸÝz–SQ, ÅÿÙÿ¯<ÿ„úþY·þ.wþ8þÖøý«ºý~ýTBý*ýÐüÙšü²gü‹6üfüAÚû­ûûÿƒûÛÿYûºÿ3û›ÿû}ÿíúaÿÎúFÿ³ú)ÿ›ú ÿ„úñþpú×þ]ú¼þLú¥þ>úŽþ2úxþ'úaþ!úKþ ú4þ!úþ%úþ,úìý5úÔý?ú½ýKú¨ýXú’ýhú|ý{úfý‘úQý«ú:ýÉú$ýêú ý û÷ü/ûãüWûÎü~û¼ü¦û©üÐû—üýûˆü*üxüZüjüü\üÁüPüùüEü0ý=üiý7ü£ý1üÝý/üþ0üVþ0ü“þ4üÐþ:üÿAüKÿKü‰ÿWüÇÿgüwüB‹ü¢ü¾¼üü×ü7õüsý­4ýæWý{ýS¡ý‰Éý¼ôýí þNþM}þx®þ¡ßþÊÿðCÿsÿ5¦ÿSÙÿo Š?¡sµ¨ÈÛ×ä@îrö¢ýÐÿþ)ÿUû€ôªëÒáøÓÄ?´_ }Œ™uµ]ÍCä'ù  ìÌ*«6ŠAfGCLO÷OÑMªI‚CZ91/ #Þ´Šï`Ù5 ¨á‹µn‹Na.6  êäÿƺÿž‘ÿwiÿL@ÿÿóòþÇÌþ™¦þmþ?\þ8þáþ°ðý~ÐýK°ý‘ýëÿtý»ÿXýŒÿ=ý]ÿ#ý.ÿ ýþþñüÑþØü£þÂüuþ­üJþšü þŠü÷ý|üÎýoü©ýbü„ýWü`ýLü?ýBüý:üý4üäü/üÊü,ü±ü,üœü.ü‡ü1üvü4üfü:üXü>üMüDüDüIü=üSü:ü]ü6üiü8üxü;üˆü?üšüFü«üPü¿ü\üÑüiüäüzüùü‹ü ýžü#ý³ü;ýÉüTýãünýüü‰ýý¦ý5ýÄýTýäýsýþ”ý"þ´ýBþÕýaþ÷ýƒþþ¥þ:þÆþ\þêþþÿ£þ3ÿÆþYÿéþÿ ÿ§ÿ-ÿÎÿNÿöÿmÿŒÿCªÿkÉÿ“æÿ»ã 84R\lƒ„ªÑ´÷ÉÞ@ód‡¨.ÈAèTg"y>‹Wœo¬†½šÎ¬ß¾ïÎÛæï0ö@ýO_mzþ†ù‘ôí¨â³Ö»ÉĹ̨ѕÔÕkÕSÐ;Î"ÊÄê½Ì³¯§˜o†Or,\ Fç.àú|ÞXÀ2 è[Â8xîTÊ.¦ ‚èÿ]Åÿ8¡ÿ~ÿñÿZÿÎÿ8ÿ«ÿÿ‰ÿòþjÿÒþLÿ³þ.ÿ”þÿvþùþXþáþ;þÊþþµþþ¢þæýþÉýþ¯ýsþ–ýhþý]þiýVþUýPþBýJþ-ýHþýFþýEþóüFþáüHþÐüKþÂüNþ¶üUþ«ü[þ¢üaþ™ühþ‘üoþ‰üvþü~þ{ü…þsüŒþnü’þlüšþmü¡þoü§þsü­þyü²þü·þ…ü¹þ‹ü»þ”ü½þœü¾þ¥ü¿þ±ü¾þ¿ü¾þÏü¿þáü¾þôü¼þ ý¹þ ý·þ8ý´þPý°þjý«þƒý§þžý£þ¼ý þÚýžþûý›þþšþ>þ˜þaþ—þ†þ–þ«þ–þÒþ™þúþ™þ!ÿœþJÿ þsÿ¦þÿ¬þÇÿ´þðÿ½þÉþBÖþmãþ˜òþÂÿìÿ'ÿ<;ÿeQÿeÿ³}ÿÚ–ÿþ±ÿ"ÍÿCêÿe…%£CÀ_Ý}÷›»(Ú=úQd;tZ…w”“Ÿ®©Ç²àºùÂÆ'Ê=ÌQÍbÍqÊ~ȊÓ¾œ¸¢¯§§««“«ˆ¨z¤mž^•OŒ=,ugXñIÛ7Ä$­”ýzç^ÒC¼%¥èxÈa§J…2a=êïÒɺž£tŒKv `÷ÿJËÿ4 ÿrÿ CÿõÿÿáÿäþËÿ´þ·ÿ…þ¢ÿVþÿ(þ{ÿûýfÿÏýSÿ¢ý=ÿvý*ÿIýÿýÿïüïþÄüÜþšüÉþsü¶þOü¢þ+üþ ü~þìûkþÍûXþ°ûGþ“û6þxû&þ_ûþHûþ4ûùý"ûëýûÝý ûÒýûÇýþú¼ýûú´ýùú«ýøú¥ýûú ýÿúœýûšýû™ýûšý,û›ý@ûŸýWû£ýoû©ýŠû°ý¨û¹ýÆûÄýçûÐý üÝý/üéýXüøý‚ü þ­üþÛü-þ ýAþ=ýUþqýjþ¦ýþÝý–þþ«þLþÁþ‡þ×þÁþîþþþÿ:ÿÿxÿ5ÿ¶ÿNÿõÿfÿ2|ÿq”ÿ°¨ÿí½ÿ+Òÿiçÿ¦üÿâ#Z6”JÍ]n9€m’Ÿ£Ï³þÄ+ÕVæö¥Êì) 9'I@XXinz€‰™œª¦»­Ê²Ú´ê³ù¯ §Ÿ&“4ƒ@rM_YHc.lvô~Õ…²ŠŽe‘;“’ã´‹‚‡NwänªcqU7Eû4¾" B÷àÂÇ‚®@’ÿÿw¿ÿZ}ÿ;;ÿûþü»þÚ{þº<þšÿýwÁýV…ý4Iý ýñÿÔüÑÿü°ÿhüÿ5ünÿüOÿØû2ÿ¬ûÿ‚û÷þYûÛþ1ûÁþ û§þêúþËúxþ®úaþ•úMþ€ú8þoú&þ`úþTúþJú÷ýBúéý;úÝý8úÒý8úÈý9ú¿ý?ú·ýJú±ýVú«ýgú¨ýzú¤ýú¡ý§ú ýÀúžýÛúœýøú›ýûœý:ûœý]ûŸý…û£ý®û¦ýÚû©ý ü­ý7ü°ýiü³ýü·ýÏüºýý¿ý:ýÅýqýËýªýÒýäýÙýþàý\þçý™þîý×þöýÿþýUÿþ“ÿþÒÿþ(þN5þŽAþÍOþ _þJoþˆþÄ“þ§þ;¼þtÔþ­ëþäÿÿN:ÿ€Xÿ±vÿà—ÿ ¹ÿ7Ýÿ_„&¦LÇsæœÆð1DEUrblÊuõy!|L{vxŸsÇkî_R6AX.x–²éËÎà°ôoL'"&Ù&±%‡Z. ùÒç¢Ðr¹A€Ý_«;xDîÄÞ™ªlv=B ÝÜÿ¬©ÿ{uÿHAÿ ÿâÛþ°©þ}vþKDþþêÿåý¼ÿ¶ýÿ‰ý`ÿ[ý4ÿ-ý ÿýÞþÕü¶þ«üþ‚üjþZüFþ6ü%þüþñûæýÒûËý²û¯ý•û–ýxû}ý]ûfýDûPý,û<ýû+ýûýöú ýëúÿüâúóüÚúçüÕúÛüÓúÒüÑúÉüÐúÃüÒú¾üÖú¹üÞú¶üéúµüøúµü û´üû¶ü5û·üNûºühû¿ü…ûÅü¢ûÍüÂûÕüäûàü üëü0üùüZüý‡üýµü#ýæü5ýýIýKý\ýýtý´ýŒýëý¤ý#þ¿ý\þÛý–þøýÑþþÿ4þKÿUþ‰ÿwþÆÿ›þ¾þ@äþ} ÿ»/ÿøVÿ5}ÿq¥ÿ­Îÿç÷ÿ![H’qÈšüÂ.ê_Ž6»\ç¦9É`ë„ ¦+ÈIèd˜5®IÄYÖfépúwz{w(q.g2Z6J877!5 2í-Ñ%±lFû ìùÝÏÌ¥»z©O”"€ôjÅS–<e#3 ñÏØ›½i¢3‡ÿkËN•2`*÷÷ÿÛÁÿ¾Œÿ¢Wÿ…#ÿgðþJ»þ-ˆþUþôÿ#þ×ÿñýºÿÁýžÿ’ýƒÿeýgÿ7ýLÿ ý0ÿåüÿºüúþ’üßþküÆþEü¬þ"ü”þü}þàûeþÃûOþ¨û9þû#þ{ûþgûúýUûçýFûÔý6ûÃý+û´ý#û¦ýû˜ýû‹ýû€ýûuý'ûmý3ûdý@û^ýQû[ýaûWýuûUýŠûUý¢ûVýºûYýØû^ýøûcýüiý>ürýdü}ý‹ü‡ý´ü”ýÞü¤ý ý³ý5ýÅýcýØý’ýëýÂýÿýòýþ#þ+þSþBþ…þZþ¸þsþìþŒþ ÿ¦þUÿÁþŠÿÚþ½ÿõþïÿÿ)ÿODÿ~_ÿ«yÿÙ’ÿ«ÿ5ÃÿcÚÿŽñÿ¹à.(@JTjeŠw©‡Ç–ã¥ý³¿(Ê:ÕKáZëhõvÿ ‰’–$™.š6˜?•I‘QŒ[…f}pt{h†\’Mž=©,¶ÃÏóÜßêÈ÷±™h'M24<GþPãXÇ^­c‘guiYh=g!d_éYÍR²G–:|)cH/î×üÿ¿ãÿ¥Èÿˆ±ÿi˜ÿIÿ(jÿTÿà>ÿº'ÿ”ÿoúþGãþÍþúÿ·þÓÿ¤þ«ÿ’þƒÿþ]ÿmþ7ÿZþÿIþîþ6þËþ$þ©þþ‹þþlþñýOþâý5þÔýþÈýþ¾ýïý²ýÚý§ýÊýœý¼ý‘ý¯ýˆý¥ýýýxý•ýrý‘ýmýýiýýgý‘ýeý”ýcý™ýbý ýcý©ýfý²ýjý½ýoýÉýtý×ý{ýæý€ýõý†ýþýþ•ý'þ ý9þ­ýKþºý]þÊýpþÛýþêý”þúý¦þ þ·þþÊþ'þÛþ7þëþJþüþ^þ ÿtþÿ‹þ+ÿ¢þ:ÿºþGÿÐþUÿæþbÿüþnÿÿ{ÿ)ÿ‡ÿBÿ“ÿ[ÿÿuÿ¨ÿÿ³ÿ«ÿ¼ÿÅÿÇÿßÿÐÿøÿÙÿãÿ+ëÿEõÿaÿÿ}™´Ð&ë0;F9QQ]ji„u‚¶Ì›ã©ù· Å"Ô5ãGñXhw…(’6D¦P¯\¶i¼uÁċŔǜƣĨÁ®¾´··¯º§»œ¼‘º†¸y´m¯_ªP¢@œ/“‰ ÷tãgÏZ»M§>‘0|!fO8ó ãÓñÄÚ´Â¥ª–’‡yy_jD]*QDùÿ9àÿ.Çÿ#®ÿ”ÿzÿ^ÿCÿùÿ'ÿòÿ ÿëÿñþäÿØþÞÿ¿þØÿ¦þÒÿþÌÿtþÇÿ[þÁÿAþºÿ)þ´ÿþ®ÿùý§ÿäýŸÿÐý˜ÿ½ý‘ÿ©ý‰ÿ–ý€ÿƒýxÿqýnÿbýdÿRýYÿGýMÿ<ýBÿ4ý6ÿ-ý*ÿ&ýÿ ýÿýÿýôþýåþý×þýÉþý»þý­þ$ýŸþ-ý“þ8ý†þCýzþOýmþZýaþhýWþwýMþ‡ýDþ™ý<þ¬ý4þÁý.þØý*þïý&þþ#þþ!þ8þ!þRþ!þjþ$þ…þ&þ þ+þ»þ/þÖþ5þóþ=þÿEþ.ÿPþKÿ[þhÿfþ„ÿtþ ÿ€þ¾ÿŽþÛÿœþ÷ÿªþºþ/ÉþKÛþgíþƒÿžÿ¸%ÿÒ7ÿëIÿ\ÿmÿ3ÿM”ÿc¨ÿ{½ÿÑÿ¤åÿ·ùÿÊ Ûí4ÿG\q.†<I³UÊ`àj÷t|$…:R•iœ‚ š¦²©É¬á®ø°±&²=±S±g¯|«©¢¥´ŸÅ›Ô•âîˆù€ui \OC6)  ù÷ìãÞÍ͵¹ž¤„krSW99øàÔ¿¯ˆ{^Y55 Þíÿ±Çÿ„¡ÿWyÿ)Qÿûÿ(ÿÌÿÿÿÙþpÿ±þAÿ‰þÿcþçþ=þ¼þþ“þïýjþÈýAþ£ýþ}ýõýYýÓý7ý±ýý’ýùütýÛüXýÀü?ý§ü(ýüýwüýcüðüOüâü=üÖü.üÍüüÅüü¿ü ü½üü¼üü½üÿûÁüüÆüüÍü ü×üüâüüîü üûü,üý8üýHü*ý[ü;ýpüOý‡üdý ü{ýºü‘ýÔü¨ýòü¾ýýÔý.ýëýNýþpýþ•ý2þ»ýKþáýeþ þ}þ1þ”þZþ¬þ„þÄþ®þÛþÙþòþÿ ÿ3ÿ ÿaÿ8ÿ‘ÿOÿÀÿgÿïÿ€ÿ—ÿM®ÿ|Åÿ«ÝÿÚóÿ  : j9™RÈlõ†" NºzÕ¥ïÏ ÷&BC^gzˆ—©´ÉÐæì &5AK\]wm‘z«…ÂÙ—ð¢¤)¡9œF“R‡\yckhZkHm4lhbçYÇM¥?‚/^8ñê×À¼“žf€7`=Õ¢ôpÍ=¥ ~ÔUž*h1Öüÿ­ÅÿƒŽÿYZÿ0$ÿ ïþáÿ»þºÿ†þ•ÿRþoÿþJÿêý'ÿ¸ýÿ‡ýåþXýÆþ+ý©þþüŒþÓüqþ«üVþƒü>þ]ü(þ9üþüÿýöûíýØûÜý»ûÌý¢û½ý‹û¯ýwû¢ýdû–ýUû‹ýHû‚ý>ûyý7ûsý2ûlý0ûeý1û`ý3û[ý8ûVýAûRýJûNýVûLýeûKýxûJýûKý§ûKýÃûKýáûMýÿûNýüPýBüSýdüWý‰ü]ý²ücýÜüjýýtý4ý|ýdý„ý”ýýÅý›ýöý¨ý'þµýYþÄýþÕýÁþçýöþûý+ÿþ_ÿ$þ•ÿ;þËÿQþÿÿkþ2…þg þš»þÍØþÿ÷þ/ÿa7ÿXÿ½zÿëÿÀÿFãÿp˜(½Máq–#»Cßb(›LµpË’Þ³ïÓþó 0M'h-ƒ1œ3³2Ê.Þ'ð ý,ï7Þ?ÍG¸M£PŒQrRWP<M IAå:Æ/¥$…a>ùæõÔÒ¿­©ˆ’cz>`Fñ+Ê¥ñ~ÓW´2“sëÿQÅÿ.Ÿÿ zÿèVÿÅ1ÿ¡ ÿ|éþXÆþ2¥þ ƒþéÿbþÃÿ@þÿþxÿþýRÿßý.ÿ¿ý ÿ¡ýäþƒýÀþfýšþKýwþ0ýTþý1þþüþåüïýÎüÏý¹ü±ý¥ü“ý’üvýüYýqü@ýaü&ýTüýGüùü>üäü6üÓü0üÂü,ü³ü,ü¦ü,ü›ü.ü“ü3ü‹ü9ü†ü@ü„üIüƒüVü†ücü‹üsü“ü…üü™ü¨ü°ü·üÉüÆüäüÙüýìü ýýAýýbý6ý„ýSý¥ýrýÉý“ýïýµýþÙý>þýýjþ#þ–þIþÃþqþïþ™þÿÂþEÿëþpÿÿ›ÿ@ÿÆÿjÿóÿ”ÿ»ÿKåÿy ¤1ÎX÷} EÃkä¶#Ú?þ[ s?‹^¡z³”ƯÖÈåÞñöý />L X#b%k&s%z$~"‚ ‚{v of]ýSøFò7ì'çâÝð×ÚÑÄˬŔ¾{·_±C©&¢›é“Ê‹©ˆvfjE^"QþCÚ6·'’mIõ$ãÍÝÿ¸¸ÿ£”ÿoÿvKÿ_(ÿHÿ/áþÀþþÿŸþæÿ~þËÿ^þ±ÿ>þ—ÿ þ}ÿþeÿçýKÿËý4ÿ±ýÿ™ýÿýîþiýÙþSýÅþ?ý°þ-ýþýŒþ ý|þÿünþóüaþèüVþßüLþ×üBþÒü<þÌü5þËü0þËü-þÍü,þÑü-þÖü.þÝü1þäü5þîü;þúüBþýIþýQþ+ý\þAýfþWýqþmý~þ„ýŠþ›ý—þµý¦þÎý´þëýÂþ þÐþ+þÞþMþíþoþùþ“þÿµþÿ×þ#ÿøþ1ÿÿ?ÿ=ÿJÿ`ÿVÿ„ÿaÿ¨ÿkÿÌÿtÿðÿ|ÿ…ÿ2ŒÿS“ÿt™ÿ”Ÿÿ³£ÿѨÿí¬ÿ ¯ÿ$±ÿ=´ÿUµÿl·ÿ·ÿ–¸ÿ©¹ÿ»ºÿ˹ÿÙ»ÿç¼ÿò½ÿüÁÿÂÿ ÄÿÇÿËÿÏÿÓÿ"Ùÿ"ßÿ!åÿíÿ÷ÿ  þ,ö:íHãWÙhÎyÊ·›ª­¿ÑâsódVG+7=(N_où~é‹Ú™Ë¥»°«»œÄÍ~ÓpØbÝUàGá9à-ß!Ü× ÒÿÿÍöÿÄìÿ»äÿ²Ûÿ¦Ôÿ™ÌÿÃÿ€½ÿqµÿa°ÿQ«ÿA¦ÿ/¡ÿ›ÿ ˜ÿù”ÿæ’ÿÓŽÿÁ‹ÿ­Šÿ›…ÿˆƒÿu€ÿc}ÿQzÿ>wÿ+tÿrÿoÿ÷ÿlÿåÿhÿÕÿcÿÄÿ^ÿ³ÿXÿ¢ÿUÿ’ÿPÿÿKÿqÿEÿbÿBÿQÿ;ÿAÿ4ÿ3ÿ-ÿ#ÿ&ÿÿÿÿÿ÷þÿèþ ÿÚþÿËþýþ½þ÷þ¯þðþ¡þéþ”þãþ†þÞþzþØþnþÒþcþÎþXþÉþNþÅþDþÀþ:þ½þ1þ¼þ*þºþ#þ»þþ»þþ½þþ½þþ¾þþÀþþÂþþÆþþÉþþÌþþÓþþÚþ þâþ'þêþ0þòþ9þûþDþÿPþÿ\þÿiþÿxþ+ÿ‡þ5ÿ—þBÿ©þOÿºþ[ÿÍþhÿßþuÿòþƒÿÿÿÿžÿ/ÿ¬ÿDÿºÿXÿÈÿmÿ×ÿ‚ÿæÿ–ÿõÿ©ÿ½ÿÑÿåÿ.øÿ= M\.k>zOŠ_™n¨}·ŒÇšÕ©ãµòÁÎÚæ,ñ9üFT`m%w/ƒ9CšL¥U¯`¸hÀqÈ{ЄÖÝ–ãŸç§ë¯ï¸òÀôÈöÐõÖõÞòäîéêïæôâ÷ÜùÔüÍüÅþºý¯û¡ù’õƒðtêdãTÛBÑ/ƺ­ïž×¿}§lŽXtDY/>#çêÿÎÍÿ´¯ÿ™’ÿ~tÿaWÿD:ÿ&ÿ ÿþîÿâþÑÿÅþ²ÿ¨þ”ÿŒþwÿrþXÿXþ:ÿ@þÿ(þÿþåþùýÊþäý¯þÏý•þ¼ý}þ«ýdþ›ýMþý6þ‚ý!þyýþoýûýfýëý`ýÛýZýÌýVýÀýTý´ýUýªýWý¡ý\ý™ýcý‘ýjýýtý‰ý}ý†ý‰ý…ý–ý…ý¢ý‰ý°ý‹ýÁýŽýÓý‘ýæý•ýûýœýþ¢ý%þªý<þ²ýSþ¼ýjþÆýþÐý˜þÜý±þçýÉþóýâþþýýþ þÿþ0ÿ%þHÿ4þbÿBþ{ÿQþ”ÿ`þ¬ÿoþÃÿ~þÝÿþõÿ þ ±þ"Âþ9ÓþPçþfùþ| ÿ"ÿ¦7ÿ½LÿÒcÿæzÿù”ÿ ­ÿ!Æÿ3âÿEýÿWj6zS‹rœ’®±¿ÓÍõÝì:ú]€£Æ+è8 C-NPYqa‘h°nÏsìw|"€9ƒO…d†w…ˆƒ•¢z¬s²mµf¸\¶T²J¬<¢/– ‡uÿ`ìJÚ2Ʊø›Ù„¶k’Rm7EòåÆÊš¬lŽ>oOà/°€ðÿPÎÿ ®ÿóÿŽÿÄÿkÿ•ÿLÿhÿ+ÿ:ÿ ÿÿèþäþÆþºþ¥þ’þ„þjþdþDþEþþ'þüý þÚýíý¹ýÑýšýµý}ýšýbýýIýfý2ýOýý8ýý$ýôüýáüýÑüñüÄüãü¹üÖü®üÉü§üÀü¡ü¶ü›ü¯ü˜ü«ü•ü¨ü”ü§ü•ü©ü–ü¬ü›ü±ü¡ü·ü¨ü¿ü²üÊü¼üÕüÈüâüÕüïüãüýóüýý(ýý?ý*ýWý?ýqýWýŒýný§ý†ýÄý ýâý¼ýþØý!þôýCþþgþ2þ‹þQþ°þsþÕþ“þûþ¶þ!ÿØþGÿûþoÿÿ—ÿCÿ¿ÿhÿèÿÿ³ÿ9Øÿaþÿ‰"±FØk‘'µNÙuýœ ÁDåf‡*¨JÈi执 Å;áUün…*œ?°SÃdÔså‚òÿœ ¥­²!¶%¸'·'³'°$ª £™þnð]ãIÓ4°ì‰Ïs±\“Dr,P-ù Ýä¾¥—‰omEP2ñÇöšØn»Bœ~ëÿa¿ÿD’ÿ%fÿ9ÿîÿ ÿÑÿáþ¶ÿµþ›ÿŠþÿ`þdÿ7þIÿþ.ÿèýÿÁýüþœýãþxýËþTý´þ2ýžþýˆþóürþÕü[þ¹üGþŸü2þ†üþoü þ]üûýKüëý:üÛý,üËýü½ýü¯ý ü¢ýü–ýü‹ýü‚ýüyý üqýüjýügý'ücý4ü_ýBü_ýUü`ýiü`ýücýšühý¶ümýÕüuý÷ü|ýý†ý=ý’ýbýŸý‡ý®ý°ý¼ýÙýÎýþáý2þóý_þþþþ¾þ3þîþJþÿbþNÿ{þÿ•þ±ÿ°þâÿËþæþ@ÿpÿŸ:ÿÌVÿørÿ#ÿN©ÿxÆÿ¡áÿÈûÿí,2FQ_nw‰Ž£¤»ºÑÎæá÷ô&*51D6R:^<j<w;7Š2”*!¥­ µ¼óÂäÊÕÐÂÕ¯Úœà‡åqé\íEò/öúþüåÿ̲˜~dH.÷ÜýÁù¦ô‹ïqçUß:Ö ÌÀîÿ³Ôÿ¥ºÿ–¡ÿ†ˆÿuoÿcWÿO@ÿ:'ÿ%ÿ úþôäþÛÎþÁºþ¦¦þ‹“þn€þRmþ5[þJþùÿ8þÜÿ)þ¼ÿþžÿ þÿþ`ÿôýBÿéý%ÿÞýÿÕýëþÌýÏþÃý´þ½ý™þ¶ý€þ¯ýhþ­ýQþ«ý;þ©ý&þ¨ýþªýþ¬ýòý®ýãý±ý×ý¶ýËý¼ýÂýÂý»ýËý³ýÔý®ýßý«ýëý«ýøýªýþ­ýþ°ý$þ¶ý5þ½ýFþÅýYþÏýmþÛý€þçý–þôý«þþÁþþÙþ#þðþ5þ ÿHþ#ÿ[þ<ÿpþUÿƒþnÿ˜þ‡ÿ®þ¡ÿÄþ¹ÿÙþÒÿîþìÿÿÿ1ÿ7FÿPZÿhpÿ„ÿ•™ÿ«¬ÿÁ¾ÿÕÑÿêâÿþòÿ#3!C/R<`HmUy`…kvš€£ˆ©‘¯š¶¡¹©½¯Á¶Ã¼ÆÂÆÈÇÎÆÔÃÚÁß¾å»ê¸ï³ô­ù©þ¢œ• †|t"k'`+W/M1B578+; ?@BúDíCàCÒBÅ@µ>§;˜7‰4z/k*\$L<+  ûüÿñíÿçÝÿÝÎÿÒ¾ÿÇ­ÿ»žÿ°Žÿ¤}ÿ˜oÿŒ`ÿRÿtDÿh6ÿ])ÿQÿFÿ<ÿ1÷þ'ëþàþ×þ ÎþÆþùÿ½þñÿµþéÿ®þâÿ¦þÜÿ¡þÖÿœþÐÿ˜þÊÿ”þÅÿ‘þ¿ÿŽþºÿŒþ´ÿŠþ±ÿ‰þ¬ÿˆþ¦ÿŠþ¢ÿŒþžÿþšÿ“þ–ÿ˜þ’ÿœþÿ þˆÿ¤þƒÿªþ~ÿ±þxÿ¸þsÿÁþnÿÍþhÿ×þbÿáþ[ÿìþUÿöþMÿÿFÿÿ?ÿÿ7ÿ(ÿ/ÿ6ÿ)ÿFÿ ÿUÿÿgÿÿvÿ ÿ…ÿÿ–ÿùþ¥ÿòþ¶ÿêþÇÿâþØÿÜþéÿÔþùÿÎþÈþÃþ)½þ:¹þI´þX±þg®þvªþ„©þ‘§þž§þª¨þ·¨þÀªþʬþÔ°þÛ³þá·þé¼þîÁþòÈþöÏþù×þûàþýêþüôþüÿþú ÿöÿó!ÿï.ÿë:ÿæGÿßVÿÙfÿÒuÿˆÿ×ÿº§ÿ²¸ÿ¨ÉÿŸÚÿ–ëÿþÿƒ{"r5hH`\XoOƒG—?ª9½3Ñ-æ(ù$  !4GYl~Ÿ±ÁÑà î#ü'+17)<1B9IAOETJZNaQgRmQtPyL~GƒAˆ:Š0'’”–ñ—à–Í”º’¥Ž‹v†]€Cz(t mðdÒZ³O“Dt8T+3ñÿÐÿ÷ÿ¯ÿèÿÿØÿlÿÉÿJÿ¸ÿ)ÿ©ÿÿ˜ÿéþ‡ÿÉþwÿªþgÿŒþXÿpþGÿTþ9ÿ9þ)ÿ þÿþ ÿñýþþÜýïþÇýâþµý×þ¤ýËþ•ýÁþ‡ý·þ{ý¯þqý§þhýŸþbýšþ]ý“þYýŽþWýŠþVý†þXýƒþ\ýƒþ`ý‚þfýƒþmý…þwýˆþý‹þŒýŽþšý‘þ¦ý˜þ´ýþÃý£þÓý«þåý´þøý¼þ þÄþþÏþ1þÙþFþäþZþïþnþûþ„þÿ˜þÿ­þ!ÿÂþ.ÿÙþ;ÿïþKÿÿYÿÿhÿ1ÿwÿGÿ‡ÿ]ÿ–ÿrÿ¥ÿ‡ÿ¶ÿžÿÇÿ²ÿÙÿÉÿëÿßÿüÿôÿ 26DKWajw}’£¥¹ºÏÏæâýö )@3VFl[n–­”Â¥×·ëÉþÛé%ù6 GW"f,t7@G—O¡UªZ°]µ]¹^º[¼WºS·M³C­;¦1#‘„vôfáUÌB¸-¡‰oçUÎ9´˜ý{Þ^¾>Ÿ ~\à;ÀŸ÷ÿ~Õÿ\²ÿ;ŽÿlÿûÿIÿÛÿ'ÿºÿÿ›ÿäþ{ÿÂþ\ÿ£þ>ÿƒþ!ÿdþÿGþçþ+þÌþþ²þõýšþÛýþÄýiþ­ýSþ˜ý>þ…ý)þsýþdýþTýôýIýåý=ýÖý4ýÈý-ý¼ý%ý°ý!ý¦ýýœýý•ýýý!ý‰ý&ý„ý.ý€ý7ý}ý@ý|ýLýzýYýzýgý{ýwý|ýˆýý›ýƒý°ýˆýÆýŽýÝý”ýõý›ýþ¢ý)þªýDþ´ý_þ¿ý|þÉý™þÔý·þáýÕþîýõþýýÿ þ6ÿþUÿ,þuÿ=þ•ÿOþµÿaþÔÿtþóÿˆþþ1´þQÉþpàþŽùþ«ÿÈ+ÿäDÿÿ^ÿyÿ4•ÿN±ÿfÍÿ~êÿ”ª$¿CÓaåøŸ¾Ý%û2>8IWSu]“e°mËrçuy{5|M{d{zyv¢t´nÄhÔaáXìPöG<0 # ú ê ÚÉú¸ò¦æ’Ù~Êk¹U¨?•(€iûRã9˳›æÉgªMŠ3jJþÿ*åÿÉÿå®ÿ“ÿŸxÿ|^ÿXBÿ5'ÿ ÿñÿòþÎÿÖþ¬ÿ¼þ‰ÿ£þgÿˆþFÿpþ#ÿWþÿ@þãþ(þÃþþ¤þûý†þæýiþÑýNþ½ý2þ«ýþ™ýÿý‰ýæýxýÎýiý¸ý\ý£ýOýýEý~ý<ýný4ý^ý/ýPý*ýCý'ý8ý%ý.ý$ý%ý%ýý(ýý,ýý3ýý;ýýEýýSýý_ý ýoý&ýý.ý‘ý8ý¥ýCýºýQýÐý^ýèýnýþ€ýþ“ý;þ§ýYþ½ýwþÔý—þíý·þþØþ þúþ:þÿWþ?ÿsþcÿ’þ‡ÿ±þ«ÿÏþÐÿïþöÿÿ.ÿ<Oÿaoÿ„ÿ¦°ÿÉÐÿêðÿ -,NKmi‹‡¨£Ã¿ÛÚôô  "%7=KS_ho{Ž ™±¤À­ÍµÚ»æÁñÅúÇÉÈÇÄÀº³¬£˜Ž‚ug WHþ7÷$ïçÿÝêÓÕÉ¿¿©´’¨z›aH‚/ufúXÞKÃ;¦-ŠnP3öìúÿåÝÿàÀÿÝ£ÿÜ…ÿÚhÿÖKÿÑ-ÿËÿÂóþ¹Õþ®¸þ£›þ˜~þ‹cþHþp-þ_þMûý9âý$ÊýµýûÿŸýæÿýÒÿzý½ÿiý¨ÿZý“ÿKý~ÿ?ýkÿ4ýWÿ*ýBÿ!ý/ÿýÿý ÿýüþýîþýàþýÔþýÈþ!ý¾þ)ýµþ4ý¯þ?ýªþNý§þ^ý¨þpý§þƒý©þ—ý«þ­ý¯þÆý³þÞýµþúý¹þþÀþ6þÅþVþÍþwþÓþ˜þÚþ¼þãþÝþéþÿþñþ#ÿøþFÿÿlÿÿ‘ÿÿ·ÿÿÝÿÿ'ÿ%.ÿI5ÿl=ÿDÿ²JÿÓQÿôXÿ^ÿ6dÿTjÿroÿŽsÿ¨wÿÀ|ÿÙ‚ÿð…ÿ‡ÿ‹ÿ)Œÿ:ÿFŽÿSÿ_‘ÿh’ÿp“ÿv’ÿx’ÿ{‘ÿ|ÿy‘ÿvÿr‘ÿlÿe‘ÿ\’ÿR“ÿF”ÿ8–ÿ*—ÿšÿ ÿø¢ÿæ©ÿÓ®ÿ¾¶ÿ«½ÿ•Æÿ~ÏÿiÙÿQäÿ:ïÿ#ýÿ ôÜ"Å-­9–FShaRs<„&—ªþÿºëÿÊØÿÖÄÿá³ÿê¡ÿôÿþ€ÿ qÿaÿ)Sÿ8GÿF;ÿO.ÿV"ÿZÿZÿYÿXüþYõþZîþ\çþ]ãþ^Þþ]ÙþWÕþQÑþHÏþ>Íþ3Ëþ)ÊþÉþÊþ ÌþþÌþòÎþäÑþÖÒþÊÕþ¾Øþ²Ýþ©âþ¡åþ˜éþîþ„õþyúþnÿbÿZÿRÿJÿC$ÿ;+ÿ31ÿ)9ÿ@ÿHÿQÿÿÿYÿõÿaÿíÿjÿåÿrÿÝÿzÿ×ÿ‚ÿÌÿ‰ÿÃÿ‘ÿºÿ™ÿ°ÿŸÿ¨ÿ©ÿžÿ±ÿ–ÿ¹ÿÿÁÿ†ÿÊÿ€ÿÐÿxÿØÿpÿáÿjÿçÿaÿïÿYÿöÿSÿüÿKÿDÿ <ÿ7ÿ/ÿ)ÿ&#ÿ,ÿ4ÿ:ÿ? ÿFÿLÿRûþXöþ_ðþdëþiæþmâþsÞþwØþ{ÒþÐþƒÍþˆÉþ‹ÅþÃþ‘¿þ’¾þ”¼þ–¼þ—»þ˜ºþ˜»þ™¼þ˜¾þ—¿þ˜Ãþ–Çþ•Êþ“Îþ‘Òþ×þŒÝþ‰ãþ†êþ‚òþ~ûþ|ÿxÿtÿp!ÿm,ÿi6ÿeBÿbPÿ_^ÿ[nÿY}ÿUÿTœÿR«ÿP¹ÿNÇÿMØÿLéÿKûÿJK%K;LQNeOwQ‡R–T¥V·XË[â_úbe'g;jLlYngqsst‘u¡w°w¿vËwÖvßtåqëmñi÷eüa[UOH>ü6÷-ñ#ëå ßÖ÷ÿËêÿ¿Þÿ±Ñÿ¡Äÿ‘¶ÿ¨ÿo›ÿ^ŒÿMÿ<rÿ*dÿVÿÿIÿè=ÿÏ0ÿ·#ÿ ÿ‡ÿpÿYûþCòþ+êþâþúÿÜþáÿÔþÇÿÐþ®ÿËþ”ÿÈþ|ÿÇþdÿÅþMÿÆþ6ÿÆþÿÇþ ÿÉþóþËþÝþÎþÈþÒþ³þØþŸþßþþæþ{þîþjþ÷þ[þÿþKþ ÿ=þÿ.þÿ!þ)ÿþ4ÿ þ@ÿþMÿ÷ýYÿïýfÿèýsÿâý€ÿÛýŽÿØýšÿÔý§ÿÑý´ÿÑýÂÿÐýÏÿÑýÛÿÒýèÿÔýôÿ×ýþÿÛýßýäýëý)òý3úý=þE þNþV!þ^-þf:þlIþtVþzeþ€uþ†„þŒ•þ‘¦þ•·þ›Ëþžßþ¤ôþ© ÿ­ ÿ±6ÿ¶Lÿºdÿ¾|ÿ—ÿƲÿËÍÿÑêÿÖÛà;æUëpïŒõ¨úÇç (He‚#›)³-Ë1â6û:?0BIFaIwIŠJ™I¦J±HºFÄDËAÒ<Ø5Ü0Ý'ÜØÓ ËÿÂò¶å©ךȉ¹u¨a–K„3q\Gæ2Ë®óÿoÝÿMÇÿ+°ÿ ˜ÿæ€ÿÅiÿ¦Rÿ„<ÿd%ÿBÿùþýÿâþÛÿÌþ¹ÿ¸þ˜ÿ£þyÿþ\ÿ}þAÿlþ%ÿZþ ÿJþíþ;þÓþ+þ¹þþ¡þþŠþþtþùýaþðýOþçý?þáý.þÚýþÖýþÒýþÏýøýÎýíýÍýãýÎýÝýÑý×ýÓýÒýØýÎýßýËýæýÉýðýÇýùýÆýþÇýþÉýþÊý,þÏý:þÔýKþÙý]þßýpþåýƒþíý˜þõý­þþýÅþþÜþþóþþ ÿ%þ%ÿ1þ?ÿ<þZÿIþvÿVþÿdþ­ÿrþÉÿþäÿŽþœþ¬þ7»þUËþqÜþìþªþþÅÿá ÿû3ÿEÿ.WÿGiÿ`|ÿxÿ£ÿ¦¶ÿ¼ÌÿÐàÿåôÿ÷0'E7ZEqQ‡]fµpÊwà|õ‚ …‡.ŠB‰U‰jˆ€„–€«y¾sÏkÜaèVòLü?0!)4í=ÛCÇF°FšEƒBk>R:84-'å Ȫ ŒÿnñOá/нñÿ«Ñÿ–±ÿÿkmÿULÿ@,ÿ* ÿëþûÌþâ¬þÈþ¯oþ•Qþz2þaþGûý1àýÇý®ýìÿ˜ýÔÿý»ÿmý£ÿYý‹ÿFýsÿ5ý_ÿ'ýKÿý8ÿ ý%ÿýÿüüÿõüñþðüáþîüÒþìüÁþíü³þðü¦þóü™þùüŽþý„þ ý{þýrþ(ýjþ8ýbþIý\þ\ýVþqýQþˆýMþ ýIþºýHþ×ýFþôýEþþFþ2þFþSþHþuþIþ™þLþ¼þPþâþUþÿYþ-ÿ^þUÿeþ|ÿmþ¤ÿtþÌÿ{þôÿƒþŽþ@–þh þ«þµ·þÜÂþÏþ&ÚþHæþjóþ‹ÿ«ÿÊÿç+ÿ8ÿFÿ6TÿMbÿbqÿu€ÿ†ÿ•žÿ£­ÿ¯»ÿ¸ÊÿÁÙÿÈçÿËõÿÎÏÍË+Æ:ÁH¹U°c¦pš|‰~—o¥^²MÀ:Ì'ØâÿëéõÓý½§y+b6JB3KRXì[Õ_¾a§ejwq`wJ}4ƒ„„õÿ‚àÿ}Éÿxµÿr ÿl‹ÿhvÿdbÿ`Oÿ\:ÿV(ÿOÿEÿ9ðþ-ÝþÊþºþ§þö–þè‡þÛvþÍhþ¾Xþ¯Iþ<þ.þ{"þgþV þDþ3÷ý#îýæýßýõÿÙýæÿÔýÔÿÐýÄÿÎý³ÿÌý¢ÿÊý’ÿÉýƒÿÌýwÿÏýkÿÓý_ÿØýUÿßýJÿçý?ÿïý5ÿùý+ÿþ"ÿþÿþÿ*þÿ9þÿJþÿ[þÿnþþþþýþ•þûþ«þúþÀþùþØþúþïþûþÿýþÿÿ8ÿÿQÿ ÿjÿ ÿ„ÿÿžÿÿ¹ÿÿÔÿ!ÿîÿ'ÿ-ÿ"4ÿ<<ÿVBÿpIÿˆPÿ¢Xÿ»^ÿÒeÿêlÿrÿxÿ+ÿ@„ÿTŠÿfÿx•ÿ‰™ÿ™ÿ§¡ÿ´¤ÿÁ¦ÿÍ©ÿ׫ÿ߬ÿè®ÿï¯ÿô°ÿø¯ÿü¯ÿþ°ÿÿ¯ÿÿ®ÿý­ÿû¬ÿ÷ªÿòªÿî©ÿç¨ÿà§ÿÖ§ÿΤÿŤÿ¹¥ÿ®¤ÿ¢¦ÿ•¨ÿ†ªÿx¬ÿj°ÿ[µÿKºÿ<¿ÿ,ÄÿÉÿ ÍÿúÓÿéÛÿ×ãÿÅîÿµûÿ£!o,^8K@<J+S_ múÿ}êÿŽÙÿžÊÿ®ºÿ½«ÿÊœÿÕÿÞÿåpÿìbÿõTÿýGÿ;ÿ.ÿ!ÿ%ÿ- ÿ4þþ5óþ7éþ7àþ6Öþ7Ìþ6Äþ7¼þ8µþ8¯þ5§þ2¢þ-žþ(˜þ!”þþþ þ‹þü‹þõŠþî‹þæþÜþÑ‘þÆ•þºšþ¯žþ¤£þš©þ’°þˆ¸þ¿þvÉþkÒþaÜþVæþKñþ@üþ5ÿ,ÿ"ÿ,ÿ;ÿHÿÿÿXÿ÷ÿfÿíÿtÿãÿƒÿÚÿ’ÿÐÿ¢ÿÇÿ°ÿ¿ÿÀÿ¶ÿÏÿ¬ÿßÿ¤ÿïÿ›ÿÿÿ’ÿˆÿ€ÿ-uÿ=kÿLcÿ[ZÿiPÿxGÿ†=ÿ•4ÿ£*ÿ± ÿ¾ÿÉ ÿÖÿáøþìïþ÷æþÝþ ÓþÊþÁþ ·þ'¯þ,§þ/Ÿþ3˜þ6þ7‰þ9ƒþ8}þ7yþ5uþ3qþ0nþ,kþ%iþhþiþiþlþÿpþõtþêyþßþÓˆþÈþ¼™þ¯¤þ¢°þ•½þ‡ÊþyÚþlìþ_ÿþRÿD%ÿ89ÿ+Mÿ aÿvÿ ÿ¤ÿ÷ÿ¾ÿíÿÙÿäÿõÿÞÿ×ÿ,ÐÿHÊÿaÆÿzÂÿ‘¾ÿ¨¼ÿ¿ºÿعÿò¹ÿ ¹ÿ)»ÿD¼ÿ_ÀÿuÂÿŠÅÿ›ÉÿªÍÿ¸ÑÿÆÖÿÔÜÿãáÿóåÿëÿðÿöÿ$ûÿ)ÿÿ+-. - .--+'"øëßÔ Ç º¬›ûÿŠõÿwïÿcçÿOÞÿ;Öÿ'ÍÿÅÿ¼ÿí±ÿÙ«ÿÅ¡ÿ¯—ÿ™Žÿ‚„ÿkzÿUpÿ?fÿ*^ÿSÿÿÿMÿëÿEÿÖÿ>ÿÁÿ7ÿ¬ÿ0ÿ•ÿ*ÿ€ÿ%ÿlÿÿYÿÿDÿÿ1ÿÿÿÿ ÿÿúþÿèþÿ×þÿÇþÿ¶þÿ¥þÿ•þÿ‡þÿyþÿkþ#ÿ_þ)ÿSþ/ÿHþ5ÿ=þ=ÿ3þFÿ)þNÿ þWÿþ_ÿþiÿ þtÿþ~ÿÿý‰ÿùý”ÿ÷ýŸÿôýªÿñýµÿðýÀÿîýÌÿîýØÿïýãÿñýïÿóýûÿöýûýþþ& þ1þ<þF&þP0þZ:þdFþnSþw`þoþŠ~þ”þœŸþ¦±þ®Ãþ¶×þ¾êþÄþþÍÿÖ,ÿÝDÿå^ÿìwÿõÿüªÿÄÿ Ýÿ÷ÿ*%F,d2ƒ8£=ÃCáHýLP0UGY_[w]‘_®_Éaä`ý^])Z:VHQUKaEk>y5†,“"¦ ¬ý®î­ß«ϧ¾¢¬š˜†“q‹]Gu2eUAïÿ.ØÿÁÿ¨ÿó‘ÿÞyÿÈaÿ°Jÿ˜3ÿ|ÿaÿCïþ&Ùþ Äþë¯þΛþ±‰þ“wþvfþYVþ:Hþ:þýÿ,þàÿ þÁÿþ£ÿ þ†ÿþkÿûýOÿõý5ÿîýÿìýÿêýçþèýÎþèý¶þéýŸþìý‰þîýuþôýaþúýOþþ?þ þ.þþþþþ*þþ7þöýFþëýTþáýdþØýtþÑý‡þËýšþÄý­þÁýÂþ¾ý×þ¼ýìþºýÿ¹ýÿºý0ÿ»ýGÿ¾ý_ÿÂýyÿÆý’ÿËý«ÿÑýÄÿ×ýÝÿÝýöÿæý ïý%÷ý=þW þoþ‡$þŸ0þ·=þÍIþãXþùgþwþ#†þ6—þI¨þ[¹þlÊþ}Ýþðþœÿ©ÿ¶-ÿÂAÿÌXÿ×oÿß…ÿèœÿî³ÿôËÿøãÿüüÿ/Kešÿ³üËùåòþíç4àPÙkІǟ½¶³Ê¨Ý›ï‚v&g9YLK^;m,x †øˆæŠÕ‹ÂŒ°ŽŽ‰t‹a…K{7o"a Qùÿ@ãÿ2Íÿ!·ÿ¡ÿü‹ÿèuÿÑ_ÿ¸Jÿ4ÿÿg ÿJòþ/ÝþÉþùµþÝ¡þÁþ¤zþ„fþfUþGCþ(2þ "þðÿþÔÿþ¹ÿöýŸÿêý…ÿÝýkÿÒýQÿÈý9ÿ¾ý ÿ¶ý ÿ¯ýôþ¨ýÞþ¤ýËþ ýºþžý©þžý™þŸýŠþŸý|þ¢ýnþ¦ýbþ«ýXþ±ýNþ¸ýGþÃýAþÍý;þÙý5þèý3þ÷ý1þþ/þþ.þ,þ/þ@þ0þUþ3þjþ6þ‚þ9þ›þ?þµþEþÐþKþìþRþ ÿYþ'ÿaþEÿhþdÿsþƒÿ{þ¢ÿ„þÃÿþãÿ™þ¤þ#®þE¹þfÃþ…Îþ§ÚþÇåþæðþúþ#ÿAÿ^ÿx'ÿ•3ÿ­>ÿÆIÿÞUÿô`ÿ lÿwÿ.‚ÿ>ÿM˜ÿY£ÿf¯ÿq»ÿzÆÿÓÿ†ßÿŠìÿøÿŒ‰‡)‚5{CtQk`aoU}IŒ<š/¦³¿ÿÌìØÛçÈö´¡Œ"v.b6L>6F K Só\ÜdÅn­w•}~‚f…O„7ƒ|ñÿzÚÿxÂÿvªÿt“ÿp{ÿkcÿcLÿ[5ÿPÿEÿ;ñþ/Ûþ%Åþ¯þšþ†þ÷qþè_þÚKþÉ9þº'þ«þžþöýƒèýuÛýfÎýWÂýH¸ý8®ý(¥ý ý ˜ýÿÿ•ýóÿ’ýèÿýÜÿýÏÿ‘ýÃÿ”ý¸ÿ–ý¬ÿ›ý ÿ¢ý—ÿªýŒÿ²ýƒÿ½ýzÿÊýrÿ×ýkÿæýcÿöý[ÿ þVÿþPÿ/þJÿEþFÿYþBÿpþ>ÿ‰þ:ÿ¡þ7ÿ½þ4ÿØþ1ÿôþ1ÿÿ/ÿ.ÿ.ÿKÿ-ÿiÿ-ÿˆÿ.ÿ¦ÿ.ÿÅÿ0ÿäÿ0ÿ2ÿ 3ÿ@5ÿ_7ÿ}9ÿ›;ÿº=ÿÕ?ÿñ@ÿBÿ(EÿBGÿ\IÿsKÿ‹Mÿ¡OÿµPÿÉQÿÚSÿëTÿúUÿVÿVÿ Xÿ)Xÿ0Wÿ9Xÿ>Wÿ@XÿBZÿCZÿBYÿ@Zÿ<[ÿ7\ÿ0[ÿ(]ÿ_ÿ`ÿ cÿüeÿïiÿálÿÑoÿÀsÿ¯wÿŸ|ÿÿy‡ÿfÿS˜ÿ> ÿ)¨ÿ±ÿ¹ÿíÁÿ×ÊÿÃÓÿ®Þÿ™êÿ„öÿo[H 4-"9FýÿQíÿ\ÚÿhÉÿt·ÿƒ¨ÿ’™ÿ¡ˆÿ°{ÿ¾lÿÉ_ÿÖQÿÞEÿæ8ÿï,ÿ÷!ÿÿ  ÿÿøþ$ðþ-çþ1ßþ5Øþ7Ñþ:Ëþ=Åþ@¿þA»þC¶þD´þC±þA­þ>«þ:¨þ6¨þ2§þ.¨þ*¨þ&©þ «þ¬þ°þ ³þ¶þù¹þð¾þæÄþÝÉþÓÐþÉÖþ¿Ýþ¶åþ¬ìþ¡ôþ•ýþŠÿ}ÿrÿg ÿ\*ÿR4ÿF@ÿ<Jÿ1Uÿ'`ÿjÿuÿ€ÿþÿŒÿôÿ—ÿëÿ£ÿâÿ¯ÿÙÿºÿÏÿÆÿÇÿÓÿ¿ÿßÿ¶ÿêÿ®ÿöÿ¦ÿžÿ —ÿÿ"‡ÿ/ÿ:zÿErÿRkÿ\eÿh]ÿsVÿ~Oÿ‰Hÿ”@ÿž9ÿ©1ÿ³(ÿ¼"ÿÅÿÍÿÖ ÿÞÿæøþîðþôæþüÝþÔþÌþ Âþ¹þ±þ©þ¡þ›þ’þ‹þ…þþzþtþqþmþ lþkþjþþkþ÷nþðpþétþâxþÚ~þчþÈþ½šþ¶¥þ«³þ¢Âþ˜Ñþáþƒñþyÿoÿd)ÿ[?ÿQUÿHnÿ?ˆÿ5£ÿ,½ÿ#×ÿðÿ 9ÿÿSøÿnòÿ‰íÿ¥çÿÁáÿÜÝÿ÷ÙÿÕÿ&Ðÿ<ÌÿQÈÿfÅÿyÃÿÀÿ¡½ÿ³ºÿƸÿÕ¶ÿä´ÿð²ÿû°ÿ®ÿ ¬ÿ«ÿ©ÿ%¦ÿ)¤ÿ-¡ÿ.žÿ.œÿ-šÿ+—ÿ'”ÿ#‘ÿŽÿ‹ÿ‡ÿ „ÿÿù}ÿíxÿàtÿÓpÿÃlÿ¶hÿ¦dÿ—_ÿˆ[ÿwYÿfTÿSOÿ@Kÿ,HÿDÿ@ÿð>ÿÜ<ÿÆ:ÿ²8ÿ6ÿˆ5ÿs3ÿ]3ÿG1ÿ22ÿ4ÿ4ÿôÿ7ÿßÿ:ÿÊÿ=ÿµÿAÿ ÿEÿ‹ÿIÿvÿOÿbÿUÿOÿ[ÿ:ÿbÿ'ÿjÿÿrÿÿzÿðþƒÿÞþÿÌþ—ÿºþ¢ÿ©þ¬ÿ™þ·ÿˆþÂÿyþÎÿjþÙÿZþåÿMþñÿ>þüÿ1þ$þþ þ*ÿý6õýAëýLâýVÙý`ÑýkËýtÃý}½ý†¹ýµý”±ýœ°ý¢°ý¨°ý¬²ý²µý¶ºýº¾ý¼Äý¾ÌýÀÔýÁßýÂëýÃøýÄþÃþÂ(þÁ;þÁMþ¿bþ¾xþ¼þº¨þ¹Âþ·Þþ¶úþ³ÿ±5ÿ°Tÿ®qÿ­‘ÿ¬°ÿ«Ðÿªñÿª©3¨W©z¨©¾©Þ©ý««:ªX¬v­’¬°­Í­é¬¬ª/ªB¨T§d¥u¢…ž’™ž•©³йƒ¼}ÁvÃmÂdÂ[ÁO½E¸:°-¨!ƒùÿuìÿeÜÿUÎÿD¾ÿ3®ÿ Ÿÿ ÿö}ÿÞnÿÆ^ÿ¬Mÿ“>ÿy.ÿ^ÿCÿ'ÿ òþïäþÒÖþµÉþ—½þz°þ[¤þ=šþ ’þ‰þèÿþËÿyþ¯ÿsþ’ÿmþvÿhþ[ÿdþ?ÿaþ%ÿ`þ ÿ_þòþ`þÛþbþÃþcþ®þgþ˜þlþƒþpþnþvþ[þ~þJþ…þ8þŽþ)þ˜þþ£þ þ®þþºþõýÉþêý×þàýåþ×ýõþÐýÿÉýÿÃý'ÿ¿ý9ÿ¼ýKÿºý^ÿ¸ýqÿ¶ý„ÿµý™ÿ¶ý¬ÿ¸ýÁÿ»ýÖÿ¾ýêÿÂýÿÿÆýÌý&Óý;ØýOàýdèýxòýŒüý þ³þÆþÙ*þë8þýFþTþdþ.tþ=…þL˜þ[ªþh¾þvÑþåþŒûþ—ÿ¡'ÿ«>ÿ´Vÿ¼nÿ‡ÿÈ¢ÿμÿÒ×ÿÕóÿØ Û(ÝDÝ`Ü{Ü–Ù²ÖÍÓêÎÈ#Ã>ºZ´s«Œ¡¤—¹‹Ï€ãtøe WH18B(Q_kôtá|Í‚¸†¥Š‘zŽdŽO8‰!„ |õÿsÞÿjÇÿ^°ÿQ™ÿEÿ7iÿ'Rÿ;ÿ$ÿìÿÖùþÀãþ©Ïþ‘ºþy¦þa“þHþ-mþ[þøLþÛ;þ¾,þ¢þ…þgþLøý0íýäýúÿÛýßÿÓýÄÿÍý©ÿÇýŽÿÃýuÿÀý\ÿ¾ýCÿ½ý+ÿ¾ýÿ¿ýÿþÂýéþÆýÖþËýÃþÑý²þØý¡þàý‘þêýþöýtþþgþþ\þþSþ/þIþ@þBþQþ;þcþ4þxþ1þ‹þ-þ£þ+þºþ)þÑþ)þêþ)þÿ+þÿ,þ9ÿ/þUÿ3þqÿ7þÿ<þ©ÿBþÆÿHþäÿNþUþ]þ<dþ[lþyuþ–}þ³‡þÏþë™þ£þ"¬þ=·þXÀþqÊþˆÕþŸßþ´êþÈõþÝÿï ÿÿ!ÿ-ÿ+9ÿ6Dÿ@QÿJ^ÿPlÿWyÿZ†ÿ]•ÿ_£ÿ_³ÿ^Âÿ[ÑÿWáÿRñÿLC:!04%FX ký}ïŽÞ¡Î²½ªÓ™ä„ör^I+4:I XõdànËx´‚ŸŒ‰”rœ^¥G¬2²µ·ôÿ¶Þÿ¶Êÿ´·ÿ°¢ÿ¬ÿ§{ÿ£gÿSÿ–@ÿ-ÿƒÿx ÿmøþaåþSÖþEÅþ8´þ)¥þ–þ ‡þüxþëjþÚ]þÈPþ¶Dþ¦8þ“.þ‚#þrþcþSþAþ1úý ôýîýëýñÿçýâÿäýÔÿãýÆÿãý¹ÿäý¬ÿäý¢ÿæý”ÿêýˆÿîý}ÿôýsÿûýiÿþ_ÿ þVÿþPÿ"þIÿ.þBÿ;þ>ÿIþ8ÿZþ3ÿiþ/ÿ|þ+ÿþ(ÿ¢þ'ÿ·þ%ÿÍþ%ÿãþ$ÿúþ$ÿÿ&ÿ+ÿ&ÿDÿ'ÿ^ÿ)ÿxÿ*ÿ”ÿ-ÿ¯ÿ0ÿÊÿ3ÿæÿ6ÿ:ÿ=ÿ7AÿSDÿpGÿŒLÿ§OÿÂRÿÝUÿöXÿ[ÿ']ÿ?`ÿWcÿmeÿ€gÿ–iÿ©jÿ»kÿÌmÿÛmÿémÿõoÿoÿ nÿoÿnÿ#oÿ&nÿ*oÿ,nÿ,nÿ-oÿ*pÿ'qÿ#qÿsÿuÿvÿyÿü}ÿò€ÿåƒÿÚ†ÿÌ‹ÿ¾‘ÿ¯–ÿŸœÿ£ÿªÿm³ÿ[»ÿKÄÿ7Ìÿ%ÔÿÝÿÿåÿìðÿÙúÿƲŸŒ'x3e>QH>R,\enõÿxãÿ‚ÑÿŒ¿ÿ˜­ÿ¢œÿ¬‹ÿ´zÿ¼jÿÃZÿÇHÿÍ8ÿÒ)ÿØÿÝ ÿãýþéïþìâþðÕþóÇþô¼þõ±þö¥þõœþö‘þö‡þøþøvþöoþõhþóaþð]þíXþéTþåPþãMþÞKþÚJþ×IþÔJþÏLþÈNþÄRþ½Wþ¶[þ¯`þ©fþ£nþœuþ•~þ‰þ‰“þ‚Ÿþz¬þs»þkÌþcÞþ]ñþSÿMÿF,ÿ?Aÿ8Uÿ1iÿ*ÿ"”ÿªÿ¿ÿ Ôÿéÿýÿûÿõÿ$îÿ7çÿKáÿ`ÛÿsÔÿ‡Íÿ›Çÿ®ÁÿÁ¹ÿÒ³ÿä­ÿó¦ÿžÿ—ÿ!ÿ/ˆÿ=ÿIwÿUoÿ`gÿi_ÿsVÿzNÿCÿˆ:ÿ1ÿ‘&ÿ•ÿ™ÿš ÿœÿþœöþ›ìþ™âþ–Ùþ’ÐþŽÈþнþ„¶þ~°þw§þo¢þgþ]˜þT“þJþ>þ3‹þ&Œþ‹þ Žþþò“þä˜þÖþƤþ·­þ©¶þ™ÁþŠÍþzÚþjçþ[öþLÿ<ÿ,#ÿ5ÿ Hÿÿÿ]ÿñÿrÿâÿ‡ÿÓÿŸÿÅÿµÿ·ÿÊÿ©ÿáÿœÿöÿ‘ÿ„ÿwÿ3kÿI`ÿ`UÿxKÿAÿ¦8ÿ¼.ÿÑ&ÿã ÿõÿÿ ÿ(ÿ7ÿHýþYùþhõþvóþ‚ðþïþ—îþžîþ§ïþ­ñþµóþ»öþÀùþÆüþÊÿËÿÌ ÿËÿËÿÉÿÆ"ÿÂ'ÿ¾,ÿº0ÿ¶5ÿ°;ÿ©?ÿ¡Cÿ™JÿŽRÿ„Xÿy^ÿmeÿbkÿVoÿJsÿ=vÿ0yÿ!€ÿ…ÿ‹ÿó’ÿä—ÿÔÿÄ¡ÿ²¥ÿ¢ªÿ‘¯ÿ€´ÿp¹ÿ^¿ÿLÇÿ;Íÿ)ÓÿÚÿàÿöÿåÿåÿëÿÕÿñÿÄÿ÷ÿ²ÿþÿ ÿÿ ÿnÿ^ÿ$Mÿ+<ÿ3+ÿ:ÿA ÿIûþRëþZÜþcÌþk½þr¯þy þ‚‘þ‰ƒþuþ—hþZþ¤NþªBþ°6þ¶,þ¼!þÀþÄþÈþËþýÎ÷ýÑðýÒìýÔèýÕåýÖãý×ãýÕäýÔäýÓèýÐìýÏñýÌ÷ýÇþÅ þÁþ¼"þ¸/þ²=þ­Nþ¨_þ¢qþœ†þ–›þ‘³þŠËþ„äþ}ÿþwÿp4ÿiOÿckÿ]ˆÿW¦ÿPÄÿKäÿF@":C5b/€)ž$»Öò* F b}–®úÿÂöÿÖòÿéîÿùéÿåÿáÿ'Ýÿ4Ùÿ@ÕÿLÐÿUÌÿ\ÇÿcÁÿg¼ÿh¶ÿi²ÿh¬ÿh¦ÿgŸÿd™ÿ_’ÿY‹ÿR…ÿIÿ?yÿ5rÿ(lÿeÿ ^ÿüWÿíNÿÝEÿÌ>ÿ¹7ÿ§0ÿ’+ÿ}'ÿh"ÿRÿ:ÿ#ÿ  ÿóÿÛÿÃþþ«üþ’úþyùþ_úþFùþ.úþùþýÿúþäÿúþÌÿüþµÿÿœÿÿ†ÿ ÿoÿÿXÿÿBÿÿ,ÿ$ÿÿ-ÿÿ4ÿðþ=ÿÝþGÿËþPÿºþ\ÿ©þhÿ™þuÿ‰þÿzþŽÿmþ›ÿ_þ¨ÿSþ¶ÿHþÂÿ=þÑÿ3þßÿ*þîÿ!þüÿþ þ þ&þ4þBþýPûý]ùýköýxôý…ôý‘ôýžöýªøýµûý¿ýýÊþÓþÜ þäþíþõ!þý*þ3þ >þIþVþcþpþ €þ$þ( þ)²þ+Äþ-Øþ-ìþ/ÿ.ÿ,-ÿ,Eÿ+\ÿ)uÿ(ÿ$©ÿ!Ãÿßÿùÿ-Fb}ý˜ö´ðÐêìãÛ!Ó9ËPÂf¹{¯¥£›¶Ê†Ý{îpÿe YM#?+21$7< ?ýÿCïÿEâÿDÔÿDÇÿB¸ÿ=ªÿ7œÿ.Žÿ&~ÿpÿbÿSÿúEÿë7ÿÜ*ÿÍÿ¼ÿ«ÿ™úþ…ïþqãþ^ØþHÍþ1Ãþ¹þ¯þð¦þÙŸþÙþ«“þ”þ|Šþc†þL‚þ4}þzþxþñÿwþÛÿxþÃÿxþ®ÿyþšÿ|þ…ÿ€þpÿƒþ[ÿ‡þHÿŒþ6ÿ‘þ%ÿ˜þÿŸþÿ§þóþ±þäþ¼þÖþÆþÉþÑþ½þÜþ²þèþ§þõþžþÿ–þÿþÿ†þ.ÿ€þ?ÿzþPÿwþ`ÿsþrÿoþ„ÿnþ•ÿlþ¨ÿkþºÿlþÍÿlþàÿmþóÿoþpþsþ-vþ@zþTþgƒþz‡þŽŒþ ’þ³—þÆžþÙ¤þëªþý±þ¸þ¿þ.Èþ<ÐþLÖþYàþgêþsòþ€üþŒÿ–ÿ ÿ©&ÿ±2ÿ¹>ÿ¾KÿÄWÿÈdÿËqÿÍÿÏÿÐÿϬÿμÿÌÍÿÉÝÿÅîÿ¿¹²"«4¡F—YŽk}vŽi¡\²NÃ?Ö0èú þí+Û8ÉE¶P¢[e{ogzT‚?Œ,’˜œóÿžßÿžÊÿ·ÿœ£ÿšÿ—|ÿ’iÿŽWÿŠEÿ„3ÿ{#ÿsÿiÿ^óþRâþFÔþ9Äþ+¶þ©þ›þþò„þâzþÒpþÂhþ²_þ¢Wþ‘OþHþpBþ_<þN6þ=2þ-/þ-þ,þ,þóÿ-þäÿ-þÖÿ/þÈÿ0þ»ÿ2þ­ÿ5þ¡ÿ9þ•ÿ?þŠÿGþÿOþuÿWþlÿ`þcÿiþZÿtþSÿþLÿŠþEÿ—þ?ÿ¦þ;ÿµþ5ÿÅþ2ÿÖþ/ÿçþ-ÿøþ+ÿ ÿ)ÿÿ(ÿ1ÿ'ÿFÿ(ÿ[ÿ*ÿoÿ*ÿ…ÿ,ÿœÿ/ÿ³ÿ0ÿËÿ3ÿãÿ6ÿûÿ:ÿ=ÿ(AÿAEÿXIÿpNÿˆRÿ Vÿ¸ZÿÐ^ÿçbÿýfÿiÿ'mÿ<pÿQrÿdvÿvxÿ‡{ÿ˜~ÿ¨€ÿ·‚ÿÅ„ÿÑ…ÿ܆ÿæ‡ÿðˆÿø‰ÿþŠÿŠÿŒÿ Œÿ ÿ ÿ ÿ ’ÿ“ÿ•ÿý–ÿö™ÿîœÿåÿÜ¡ÿЦÿŪÿ¸®ÿª²ÿœ·ÿ½ÿ}ÄÿmÊÿ[ÑÿIÚÿ7àÿ$éÿðÿü÷ÿéÖÁ«—#‚,m8ZAEK0TZböÿjáÿpÎÿy»ÿ§ÿˆ•ÿ‘ƒÿ—qÿ_ÿ£Oÿ§@ÿª0ÿ­ ÿ¯ÿ±ÿ³ôþ¶æþ¸ØþºÌþ»Âþ¼¶þ»­þº¤þ¹šþ·’þµ‰þ³þ¯zþ®sþ¬mþ©gþ¦bþ£`þ ^þœ[þ™[þ–Zþ’[þZþ‹[þ‡[þ„\þ€^þ|aþyfþvmþrsþnyþkþgŠþe‘þa™þ^¤þ[¬þV¸þSÃþPÏþLÞþJëþGùþDÿ@ÿ=&ÿ:6ÿ6Gÿ4Xÿ/jÿ,}ÿ(ÿ$¢ÿ"µÿÇÿÙÿìÿÿÿ %8L_ûÿsöÿ†ñÿ˜íÿ©æÿ»âÿÍÛÿÝÕÿíÎÿýÈÿ Âÿºÿ)³ÿ7«ÿC¤ÿN›ÿY’ÿcˆÿl€ÿuxÿ|mÿ„eÿ‰ZÿQÿ‘Hÿ•=ÿ˜5ÿ™*ÿš ÿ™ÿ˜ ÿ–ÿ’üþôþ‹ìþ…åþ€ßþxÙþrÓþjÏþaËþXÇþNÆþCÄþ8Âþ-Ãþ"ÇþÉþ ÌþüÐþîÕþáÛþÓäþÄìþ·õþ¨ÿ™ ÿ‹ÿ|#ÿm0ÿ^=ÿOMÿ@\ÿ2mÿ#ÿ‘ÿ£ÿøÿ¶ÿëÿÇÿÜÿÙÿÎÿëÿÀÿûÿ²ÿ ¥ÿ˜ÿ1ŠÿC}ÿVqÿheÿyZÿŒOÿ›Dÿª:ÿ¹0ÿÆ%ÿÓÿáÿí ÿúÿùþôþëþ#çþ,áþ4Þþ:ÙþAÕþFÑþJÍþNÊþRÈþVÅþYÃþZÂþ[ÄþZÆþ[ÈþZÊþYÌþWÎþVÑþRÔþO×þKÚþFàþAæþ;ëþ5óþ/úþ)ÿ" ÿÿÿ  ÿ)ÿù1ÿï;ÿåEÿÛOÿÑZÿÇdÿ¼oÿ²yÿ¦ƒÿ›Žÿ™ÿƒ¥ÿv±ÿj½ÿ]ÈÿQÕÿDáÿ8ìÿ+øÿ úÿ$ìÿ1ßÿ>ÔÿIÆÿU¹ÿ`«ÿlŸÿv’ÿ„ÿ‹wÿ–kÿ ^ÿ«Qÿ´Cÿ¾6ÿÇ*ÿÏÿØÿàÿèøþïìþõáþüÔþÈþ¾þ ²þ¨þþ“þŠþþxþpþ hþbþ]þWþTþOþLþKþJþ IþKþMþüPþöUþï[þèaþàjþ×sþÐ}þƈþ¾•þ¶¢þ«²þ¢Áþ—ÒþŒäþ‚øþw ÿl ÿ`5ÿVJÿK`ÿ?xÿ4ÿ)¨ÿÂÿÛÿôÿþÿ ôÿ$éÿ=ßÿUÖÿlÌÿ…Âÿ¹ÿ´°ÿ̧ÿãÿù–ÿÿ"‡ÿ5ÿF{ÿXtÿgoÿviÿ…cÿ“^ÿ Yÿ«Uÿ¶Qÿ¾NÿÆKÿÍHÿÒGÿÖEÿÚDÿßBÿàAÿá?ÿà=ÿß<ÿÝ;ÿÙ:ÿÕ;ÿÐ=ÿË=ÿÅ>ÿ¾?ÿµ>ÿ­?ÿ¤?ÿ™?ÿŽ@ÿƒAÿwBÿkDÿ\EÿOGÿCIÿ4Lÿ&NÿOÿQÿõSÿäUÿÔXÿÃ[ÿ²^ÿ aÿdÿ}iÿjkÿZoÿGtÿ4xÿ"ÿƒÿþÿ‰ÿíÿÿÛÿ•ÿÉÿ›ÿ·ÿ¡ÿ¤ÿ©ÿ”ÿ¯ÿ‚ÿ¶ÿpÿÀÿ_ÿÈÿOÿÐÿ>ÿØÿ.ÿâÿÿëÿÿôÿÿýÿòþäþÖþÈþ"ºþ,®þ6¢þ@—þJŒþUþ]wþhnþpfþz]þƒUþMþ•FþœAþ¦;þ¬6þ³2þ»/þÁ-þÇ+þÎ*þÓ+þ×*þÛ+þß.þã1þç5þé;þëAþìHþîQþîZþïcþïnþí{þíˆþì–þé¥þèµþåÆþâÚþßìþÜÿØÿÔ*ÿÐAÿËYÿÆqÿÀ‰ÿ¼£ÿ¶»ÿ±Ôÿªîÿ¥Ÿ!˜<’X‹r„~¨wÁpÚhòb [!S7LMEb=u4‰.›&­»É Õàþÿê÷ÿòðÿùåÿÿÜÿÔÿÊÿ Áÿ ¸ÿ ®ÿ¦ÿÿÿ•ÿúÿòƒÿêzÿápÿØgÿÌ]ÿÁTÿ³Jÿ¥Aÿ—:ÿ‡3ÿx*ÿf$ÿVÿEÿ4 ÿ!ÿüþü÷þçðþÔêþÀæþ¬âþ˜ßþ…ÜþqØþ^ÕþJÓþ7Ñþ#ÐþÏþþÿÐþìÿÑþÙÿÓþÆÿÕþµÿØþ¥ÿÝþ”ÿáþƒÿåþrÿëþbÿñþTÿøþEÿÿ7ÿ ÿ)ÿÿÿÿÿ%ÿÿ0ÿùþ:ÿïþFÿåþSÿÝþ`ÿÔþmÿÌþ{ÿÅþ‰ÿ¾þ—ÿ¸þ¦ÿ´þµÿ°þÄÿ«þÓÿ§þãÿ¤þòÿ¢þ¡þŸþ!Ÿþ0 þ?ŸþO þ_¢þn£þ|¦þŒ©þš«þ©¯þ·³þÄ·þмþÜÁþéÇþöÌþÒþ Øþßþåþ'ìþ0ôþ8ýþ?ÿFÿLÿP ÿU+ÿY4ÿ]?ÿ`JÿaUÿcaÿdlÿeyÿc‡ÿb•ÿa¢ÿ^°ÿ[¾ÿXÍÿSÜÿNìÿIüÿC <5*.9%K[k{þ‹óœç«Ü»ÐËÄÚµè¨ö›Œp$b.S8CA4J$PV\öÿ_çÿbØÿcÈÿd¹ÿdªÿb›ÿaŒÿ^|ÿ[mÿW^ÿPPÿJBÿC4ÿ<'ÿ2ÿ(ÿ ÿøþ íþþâþóØþçÎþÛÄþ̼þÀ´þ³®þ¦¨þ˜£þ‹žþ™þr”þdþVŒþK‹þ>‰þ1ˆþ%‰þ‰þ ‹þþùÿþðÿ“þåÿ–þÛÿšþÒÿ þÈÿ¥þ¿ÿ«þ¶ÿ²þ¯ÿ¹þ§ÿÂþ ÿËþ™ÿÔþ“ÿÞþÿèþ‡ÿóþƒÿÿþ}ÿ ÿxÿÿtÿ%ÿpÿ2ÿmÿ@ÿkÿNÿgÿ\ÿeÿkÿbÿzÿ`ÿŠÿ_ÿ›ÿ]ÿ¬ÿ\ÿ¼ÿ[ÿÍÿZÿÞÿYÿïÿZÿÿÿZÿYÿZÿ0YÿBZÿSYÿdZÿuYÿ…Zÿ–[ÿ§\ÿ·[ÿÇ\ÿÖ\ÿå[ÿó\ÿ\ÿ^ÿ^ÿ*]ÿ6^ÿA]ÿL^ÿV]ÿ_^ÿh^ÿp^ÿx`ÿ}`ÿ„`ÿ‰bÿdÿfÿ“gÿ”iÿ•kÿ”mÿ•qÿ”tÿ‘wÿŽ|ÿŠÿ…†ÿ€Œÿy’ÿs™ÿkŸÿc¨ÿY¯ÿP·ÿFÂÿ;Êÿ/Óÿ"ßÿéÿ óÿûþÿíÞÏÁ*±5¡A’L€Xpc_nNy=‚-Œ• üÿ¨ìÿ°Ûÿ·Ìÿ¾¼ÿÄ«ÿÊšÿÏ‹ÿÒ|ÿÕmÿ×^ÿÙPÿÛCÿÛ5ÿÜ'ÿÜÿÚÿÙÿÖöþÓêþÐáþÌÖþÆÎþÁÆþ½½þ¸µþ±­þ«¥þ¥ŸþŸ™þ—”þ‘þ‹Œþƒ‰þ}‡þw…þqƒþj‚þdþ^€þWþQ‚þL…þF‡þA‹þ;þ7“þ3™þ/Ÿþ*¥þ&¬þ"³þ¼þÄþÎþÙþãþïþ ûþ ÿÿ$ÿ1ÿ@ÿýÿOÿüÿ_ÿùÿoÿöÿ€ÿõÿÿóÿ¡ÿðÿ³ÿíÿÅÿëÿÖÿèÿéÿåÿüÿãÿ àÿÝÿ3ÚÿE×ÿWÓÿjÐÿ|ÌÿÈÿ¡Æÿ³ÂÿĽÿÕ¹ÿæ³ÿö¯ÿ«ÿ¦ÿ# ÿ2›ÿ?–ÿK‘ÿW‹ÿb…ÿm€ÿvyÿ~tÿ†mÿhÿ“aÿ—\ÿWÿžQÿ Lÿ¢Fÿ¢Bÿ¡>ÿ 8ÿ3ÿ›0ÿ—-ÿ)ÿ‹(ÿ…&ÿ}$ÿt#ÿl$ÿb$ÿW$ÿM&ÿA(ÿ5*ÿ(.ÿ2ÿ 7ÿÿ=ÿðCÿáJÿÒSÿÃ[ÿ³cÿ¢lÿ“uÿƒÿqŠÿa•ÿP¡ÿ?¬ÿ/ºÿÆÿÔÿâÿðÿîÿßÿúÿÐÿÀÿ°ÿ¢ÿ+“ÿ7„ÿDvÿPhÿ][ÿhMÿs@ÿ}2ÿ†'ÿ‘ÿ™ÿ¡ÿªüþ²óþ»éþÁáþÇÙþÎÐþÓÉþ×ÂþÛ¼þ߸þã´þæ°þé«þì§þí¦þï¤þï¢þð¡þñ¢þò¢þñ¤þò¦þñ©þï¬þï°þî³þì·þë¾þêÂþçÉþäÑþâÙþßâþÜêþÚôþÖþþÓÿÐÿÌÿÆ(ÿÂ3ÿ¼?ÿ¸Kÿ²Yÿ«fÿ§sÿ ‚ÿ™ÿ’ÿ‹¬ÿƒ»ÿ{Éÿs×ÿjåÿaôÿWND:-0:&IWerúÿïÿâÿšÖÿ¥Ëÿ°¾ÿ½²ÿÇ¥ÿÑ™ÿÜŒÿå~ÿïpÿ÷eÿÿXÿKÿ ?ÿ2ÿ&ÿÿ"ÿ&ÿ+÷þ-ìþ/áþ0Öþ1Ìþ1Âþ0¹þ0±þ.©þ-¡þ*›þ&•þ#þ‹þ‡þ…þþ €þþýþõ‚þí…þç‰þÝþÕ’þÍ™þÄ¡þº©þ±²þ¨½þžÉþ”ÖþŠãþ€óþuÿkÿ`$ÿV6ÿKHÿA[ÿ6oÿ,„ÿ"™ÿ¯ÿ ÅÿÛÿúÿñÿïÿåÿÚÿ1ÑÿEÇÿ\¾ÿq´ÿ†«ÿ›¡ÿ°™ÿÄ‘ÿׇÿê~ÿûvÿ oÿhÿ(_ÿ7XÿDRÿQLÿ\Fÿg@ÿp;ÿy5ÿ~1ÿ„,ÿŠ'ÿŒ$ÿ!ÿ‘ÿ“ÿ“ÿ’ÿ‘ÿŽÿŒÿˆÿ‚ÿ|ÿvÿpÿhÿ`ÿZÿOÿEÿ="ÿ1%ÿ'(ÿ,ÿ0ÿ4ÿø:ÿì?ÿáDÿÕIÿÈPÿ¼Vÿ®[ÿ aÿ”hÿ†nÿxuÿj}ÿ\„ÿOÿ@”ÿ3›ÿ&¤ÿ­ÿ µÿýÿ½ÿðÿÆÿáÿÎÿÔÿÖÿÆÿàÿ¹ÿéÿ«ÿòÿžÿüÿÿ„ÿ wÿjÿ^ÿ)Qÿ1Eÿ;8ÿC-ÿN#ÿWÿ` ÿiÿpøþ{îþ„åþÝþ“Ôþ›Ìþ¤Äþ«¼þ²¶þ¹°þÀªþÆ¥þË¡þÑþÖ™þÛ•þà’þã‘þæþéþìþî‘þï‘þð“þò–þòšþñŸþð¢þî©þí¯þë¶þè¾þæÆþãÐþÞÚþÚåþÖðþÐýþË ÿÅÿ¿&ÿ¹5ÿ±EÿªVÿ£gÿ›xÿ“Šÿÿƒ¯ÿ{ÃÿsÕÿjèÿaüÿWO#G6<K4a,s!†™«½ÿÿÏ÷ÿßîÿðäÿÜÿÔÿËÿ,Ãÿ9¼ÿEµÿP¬ÿZ¤ÿbœÿi–ÿqÿw‰ÿ|‚ÿ€}ÿ„wÿ…pÿ†jÿ†eÿ„_ÿ‚Zÿ~Vÿ{QÿwOÿqJÿlFÿeDÿ]@ÿU<ÿL:ÿC8ÿ95ÿ.3ÿ$2ÿ1ÿ 1ÿ0ÿö/ÿê0ÿÝ/ÿÑ0ÿÄ/ÿ·0ÿ«1ÿž4ÿ6ÿ‚9ÿw;ÿj>ÿ]AÿQDÿDGÿ8Kÿ+OÿRÿXÿ\ÿûÿaÿîÿhÿâÿnÿ×ÿtÿÌÿzÿÀÿ‚ÿµÿ‰ÿªÿÿ ÿ—ÿ”ÿžÿŠÿ¦ÿÿ¯ÿuÿ·ÿkÿ¿ÿbÿÈÿXÿÑÿOÿÛÿGÿãÿ<ÿíÿ6ÿ÷ÿ,ÿÿÿ&ÿÿÿÿ# ÿ,ÿ6ýþ?øþHóþRíþZêþbæþkâþsßþ|Ýþ„ÚþŒØþ“×þ™Öþ¡Õþ§Öþ­Õþ²Öþ¸×þ¼ÙþÀÚþÄÞþÈáþÍäþÐçþÒìþÕòþÖ÷þ×ýþØÿÙ ÿÙÿÛÿÙ"ÿØ+ÿÙ4ÿ×?ÿÕIÿÔTÿÒ`ÿÏlÿÍyÿÉ…ÿÆ’ÿàÿ¿¯ÿ»¾ÿ¹ÍÿµÜÿ°ëÿ«ûÿ¥ ¢)—8‘HŒZ†j€{z‹tšm©g¹aÇYÔRáKíCú;5,#'06 =CúÿHñÿLéÿNßÿQÖÿRÍÿQÄÿQºÿP°ÿM§ÿIœÿE“ÿ?‰ÿ8€ÿ1xÿ+nÿ#eÿ\ÿTÿLÿúCÿï;ÿã3ÿ×+ÿÊ%ÿ¾ÿ±ÿ¥ÿ— ÿ‰ÿ|ÿpÿþcúþU÷þHóþ<ïþ/îþ#íþìþ íþíþ÷ÿîþíÿðþâÿñþÙÿóþÏÿöþÆÿùþ½ÿüþ´ÿÿ¬ÿÿ¥ÿ ÿžÿÿ—ÿÿ‘ÿ!ÿŠÿ)ÿ†ÿ1ÿ€ÿ9ÿ{ÿBÿuÿKÿrÿUÿnÿ_ÿjÿiÿhÿuÿdÿÿaÿŒÿ^ÿ˜ÿ]ÿ£ÿ[ÿ¯ÿZÿ¼ÿXÿÈÿWÿ×ÿVÿäÿUÿðÿVÿþÿUÿ UÿVÿ%Uÿ1Vÿ?UÿMVÿYWÿgXÿuXÿ€ZÿZÿš[ÿ¥]ÿ°^ÿ½`ÿÇbÿÑdÿÜfÿågÿïiÿ÷kÿmÿpÿrÿuÿwÿ"zÿ'}ÿ,€ÿ0ƒÿ3†ÿ6Šÿ9Žÿ:’ÿ;•ÿ:›ÿ;Ÿÿ:£ÿ9©ÿ7®ÿ5³ÿ2¸ÿ.¿ÿ*Åÿ%ÌÿÒÿÚÿâÿ èÿñÿýøÿõÿÿëâ ØÎÃ(¹0­9¡A–J‰R|YpaahUoGv9},„‹‘•õÿ›çÿžÙÿ¢Êÿ¤½ÿ§¯ÿ©¡ÿ«“ÿ¬…ÿ­yÿ¬mÿ¬`ÿ¬SÿªGÿ©;ÿ¦.ÿ£$ÿ ÿÿ™ÿ•ýþ‘ôþíþ‰æþƒÞþ}×þzÑþtÌþnÇþiÂþdÀþ`¾þZ¼þV»þQºþL»þHºþD»þ@¼þ=¾þ9Áþ6Æþ4Ëþ0Îþ.Õþ+Ûþ)âþ'èþ%ïþ#øþ"ÿþ ÿÿÿ&ÿ0ÿ<ÿGÿSÿ`ÿkÿvÿ„ÿ‘ÿ Ÿÿ «ÿ ¹ÿÇÿÔÿãÿðÿþÿþÿûÿ øÿôÿ&ðÿ4ìÿBçÿPâÿ]ÝÿjØÿxÓÿ…Íÿ‘ÉÿžÃÿª½ÿµ¶ÿÀ°ÿÌ«ÿÖ¤ÿážÿê˜ÿó’ÿû‹ÿ…ÿ ÿyÿsÿmÿ$gÿ)bÿ-\ÿ1Xÿ4Sÿ6Oÿ8Jÿ8Fÿ9Bÿ8>ÿ7;ÿ59ÿ47ÿ15ÿ.3ÿ*3ÿ%2ÿ 2ÿ4ÿ4ÿ7ÿ:ÿ<ÿø?ÿñCÿèIÿÞOÿÕUÿÍ[ÿÂaÿ¸iÿ®qÿ£xÿ™ƒÿŒÿƒ–ÿw¡ÿl¬ÿ`¸ÿUÃÿIÏÿ>Úÿ2çÿ&ñÿÿÿ úÿ#îÿ/ãÿ<×ÿGÌÿSÀÿ^µÿiªÿs ÿ~”ÿˆŠÿ’ÿ›uÿ¤kÿ¬aÿ´Wÿ»NÿÁEÿÇ;ÿÌ3ÿÒ*ÿÕ"ÿØÿÛÿÝ ÿßÿáÿãúþäöþãðþáëþàæþßãþÝàþÛÞþØÛþÕÙþÒÙþÎØþÌØþÇÚþÂÚþ¿Ûþ¹Þþµàþ°ãþªçþ¥ëþ ðþš÷þ”ýþÿŠ ÿ„ÿ~ÿx#ÿs+ÿl4ÿf>ÿ`HÿZRÿS^ÿMiÿGvÿ@ÿ:Žÿ3›ÿ-¦ÿ&´ÿÁÿÏÿÛÿ êÿøÿüÿõÿîÿåÿ-Þÿ:ÖÿHÍÿVÆÿc¿ÿp·ÿ|®ÿ‰¦ÿ•ÿ¢–ÿ®ÿ¹†ÿÄ~ÿÎvÿÙoÿâhÿë`ÿõYÿýSÿMÿ GÿBÿ>ÿ :ÿ'6ÿ+1ÿ/-ÿ3*ÿ7'ÿ8$ÿ:"ÿ;ÿ:ÿ;ÿ:ÿ8ÿ5ÿ2ÿ.ÿ(ÿ"ÿÿÿÿÿÿÿö ÿí$ÿã)ÿÚ.ÿÐ4ÿÇ;ÿ¼Cÿ²Iÿ§Sÿ[ÿ‘eÿ†oÿ{xÿo…ÿdÿWœÿLªÿA·ÿ3Äÿ'Ñÿßÿìÿùÿùÿíÿàÿ"Öÿ0Éÿ>½ÿK²ÿY¦ÿgšÿtÿ€„ÿŒyÿ—oÿ¢dÿ­Zÿ·PÿÀGÿÉ=ÿÒ5ÿÚ-ÿà$ÿçÿìÿðÿôÿøÿüûþÿ÷þóþîþêþçþåþãþâþàþýàþûáþ÷ãþóåþïèþëëþçïþâôþÜúþÖÿþÐÿÊ ÿÄÿ¾ÿ¸"ÿ±+ÿª3ÿ£>ÿGÿ•QÿŽ\ÿˆfÿqÿ{|ÿuˆÿn“ÿgŸÿ`ªÿX¶ÿOÁÿIÎÿBÙÿ:åÿ4òÿ-þÿ%  *4ûÿ?óÿIëÿTáÿ_ØÿhÐÿrÆÿ|½ÿ„³ÿŒ¨ÿ”žÿ›”ÿ£Šÿªÿ°vÿ·lÿ¼cÿÁYÿÆOÿÊEÿÌ;ÿÑ3ÿÓ*ÿÕ!ÿ×ÿÙÿÛ ÿÛÿÜûþÛôþÚíþÚèþØäþÖàþÕÜþÒ×þÏÕþÌÓþÇÒþÅÑþÁÑþºÒþ·Óþ²Öþ«Øþ¦Ýþ¡áþ›åþ•ëþñþˆùþÿ{ ÿtÿmÿf'ÿ_2ÿX>ÿQKÿJXÿCeÿ;sÿ4€ÿ.ÿ&žÿ ®ÿ½ÿÍÿ Þÿïÿÿÿúÿôÿîÿ-çÿ=àÿMÛÿ]ÕÿmÏÿ|ÊÿÄÿœ¿ÿ«ºÿº´ÿȰÿÕ«ÿà¦ÿí¡ÿù›ÿ˜ÿ”ÿÿ!ÿ(‰ÿ/…ÿ5ÿ9~ÿ>{ÿBvÿCtÿErÿFoÿEnÿEkÿCjÿ@hÿ=gÿ8fÿ4dÿ/bÿ)aÿ$bÿaÿaÿbÿcÿûeÿñeÿègÿÞhÿÕjÿÌmÿÀoÿ¶rÿ«sÿžuÿ“xÿˆ|ÿ{€ÿp„ÿdˆÿXŒÿN‘ÿB•ÿ6™ÿ*žÿ£ÿ¨ÿ¬ÿýÿ±ÿòÿ¶ÿçÿ¼ÿÜÿÃÿÒÿÈÿÆÿÍÿ¼ÿÔÿ²ÿÙÿ§ÿÞÿÿäÿ“ÿêÿŠÿðÿ€ÿöÿwÿüÿnÿeÿ]ÿ UÿNÿFÿ>ÿ%9ÿ*2ÿ1,ÿ7'ÿ=!ÿCÿHÿNÿSÿY ÿ_ ÿcÿiÿmÿsÿwÿ{ÿÿƒÿˆÿŒ ÿ ÿ‘ÿ•ÿ–ÿ˜ÿšÿœ"ÿŸ'ÿ ,ÿ¡1ÿ 7ÿ >ÿ¡Dÿ KÿŸSÿžZÿaÿšiÿ™rÿ—zÿ•ƒÿ‘‹ÿŽ”ÿŒžÿ‡¦ÿ„°ÿ€ºÿ|ÄÿxÏÿtØÿoãÿjìÿeöÿ`\ UQK*G5A?;I6T1^+h$q{…˜ ¡ªÿÿ±ùÿºóÿÁîÿÈèÿÏâÿÕÝÿÛØÿßÒÿäÌÿèÇÿëÂÿí¼ÿïµÿñ°ÿò¬ÿó¦ÿô¢ÿóœÿñ˜ÿî“ÿëÿç‰ÿã…ÿÞ€ÿÚ|ÿÕyÿÏsÿÉqÿÀnÿºkÿ²hÿ©eÿ¡bÿ—`ÿŽ^ÿ†^ÿ|]ÿr]ÿi[ÿ_[ÿW\ÿL\ÿC]ÿ9^ÿ0_ÿ(bÿdÿhÿ kÿnÿþÿqÿ÷ÿuÿðÿyÿèÿ}ÿâÿ€ÿÛÿ†ÿÖÿ‹ÿÏÿÿÉÿ–ÿÅÿ›ÿ¿ÿ¡ÿ»ÿ¨ÿ·ÿ­ÿ³ÿ³ÿ¯ÿ¹ÿ«ÿ¿ÿ¨ÿÆÿ¤ÿÌÿ¡ÿÒÿŸÿÚÿÿàÿšÿæÿ˜ÿíÿ–ÿôÿ”ÿúÿ“ÿ‘ÿÿ ÿŒÿ‹ÿ‰ÿ$ˆÿ*‡ÿ1…ÿ6„ÿ;‚ÿ@ÿE€ÿKÿO~ÿT}ÿZ|ÿ^zÿbxÿfwÿjvÿnuÿqtÿusÿxrÿzsÿ~rÿ€qÿ‚pÿ„qÿ‡qÿŠqÿ‹sÿŒsÿsÿŽuÿvÿxÿ{ÿ’}ÿ’€ÿ‘ƒÿ’†ÿ‘Šÿÿ“ÿ˜ÿÿ£ÿ©ÿ‹¯ÿеÿ‰»ÿ‡Ãÿ„ËÿƒÑÿÛÿãÿ}ëÿ{ôÿxüÿur mjh)c2a<]EXNTUO_JgEo?x94†.Ž)”"™Ÿ£ §«¯ùÿ³òÿµëÿ¹ãÿºÚÿ¹ÓÿºËÿ¹Äÿ¹ºÿ¸²ÿµªÿ³¢ÿ°šÿ­“ÿª‹ÿ¦‚ÿ¢|ÿsÿ˜lÿ’gÿŽ_ÿ‡XÿSÿ{MÿvGÿoCÿi>ÿc:ÿ\7ÿU4ÿO/ÿJ-ÿD+ÿ=)ÿ8(ÿ3'ÿ-(ÿ''ÿ"(ÿ*ÿ+ÿ-ÿ/ÿ 2ÿ6ÿ9ÿ=ÿüÿAÿùÿFÿöÿLÿòÿRÿïÿXÿìÿ^ÿçÿeÿäÿmÿâÿsÿßÿzÿÝÿ‚ÿÚÿŠÿ×ÿ‘ÿÓÿœÿÏÿ¤ÿÍÿ­ÿÉÿ¶ÿÇÿ¿ÿÃÿÈÿÀÿÑÿ½ÿÜÿ¹ÿäÿ¶ÿïÿ´ÿùÿ°ÿ­ÿ ©ÿ¦ÿ £ÿ)Ÿÿ3ÿ>šÿF—ÿQ”ÿZ’ÿeÿnŒÿx‰ÿˆÿ‹†ÿ“„ÿ›ƒÿ¤ÿ¬€ÿ´ÿ½}ÿÃ}ÿÉ~ÿÑ}ÿÖ~ÿÛ}ÿâ~ÿç€ÿì€ÿðÿó‚ÿõƒÿø…ÿú‡ÿüŠÿüÿý‘ÿþ•ÿý˜ÿüšÿûžÿø¡ÿõ¦ÿñªÿí®ÿé²ÿå¶ÿà»ÿÚÁÿÕÆÿÎÊÿÆÐÿ¿Ôÿ¸Ûÿ°àÿ¦åÿëÿ”ñÿŒ÷ÿýÿwmb WK@5%**17<ýÿBñÿHåÿMÚÿRÎÿXÃÿ]·ÿc«ÿf¡ÿk•ÿqŠÿuÿyuÿ|jÿ`ÿƒWÿ…Nÿ‰Eÿ‹<ÿ4ÿŽ-ÿ$ÿ’ÿ’ÿ“ÿ” ÿ“ÿ”ÿ“ýþ’úþ‘÷þ‘õþóþòþŒðþˆñþ†ñþƒôþ€õþ÷þ{úþxüþtÿrÿm ÿhÿeÿaÿ]%ÿX-ÿT5ÿP>ÿLFÿHOÿDXÿ?bÿ;lÿ6wÿ0‚ÿ-ÿ(˜ÿ"£ÿ¯ÿ»ÿÆÿÒÿ Ýÿéÿõÿýÿúÿ ôÿïÿ"êÿ.äÿ8áÿDÚÿNÕÿYÐÿcÊÿmÆÿwÀÿ»ÿжÿ”±ÿ«ÿ¦¦ÿ¬ ÿ³šÿ»–ÿÁ‘ÿÇ‹ÿ͆ÿÔƒÿØ}ÿÝxÿásÿånÿçjÿéfÿëaÿí]ÿîZÿïWÿðTÿïQÿïNÿíJÿìHÿêFÿçDÿäBÿàBÿÜAÿØ@ÿÔBÿÐCÿÊCÿÄEÿ¿Fÿ¸Hÿ²Kÿ«Pÿ¤TÿWÿ•]ÿŽaÿ†hÿ}nÿutÿm{ÿd‚ÿ\‹ÿS“ÿKÿC¦ÿ:°ÿ2ºÿ*Äÿ ÏÿÚÿæÿðÿÿÿüÿ÷ÿïÿçÿÞÿ+Öÿ7ÍÿCÅÿN½ÿZµÿf¯ÿq¦ÿ|Ÿÿ‡˜ÿ‘‘ÿœ‰ÿ¦‚ÿ®|ÿ¶uÿ¿oÿÆhÿÎbÿÔ\ÿÚVÿßRÿäLÿèHÿëCÿí>ÿï:ÿð8ÿñ3ÿñ0ÿï.ÿï+ÿí)ÿê'ÿè&ÿã%ÿà&ÿÚ&ÿÕ&ÿÑ'ÿÉ(ÿÃ*ÿ½,ÿ¶.ÿ®2ÿ§5ÿ 9ÿ—>ÿ‘BÿˆHÿNÿwTÿo[ÿfbÿ^jÿVrÿMzÿEƒÿ<Šÿ4“ÿ,œÿ#¤ÿ¯ÿ¹ÿ ÃÿÍÿ×ÿ÷ÿâÿïÿêÿèÿõÿáÿþÿÚÿÓÿÌÿÆÿ%¿ÿ.¸ÿ8±ÿA©ÿJ£ÿRœÿZ–ÿcÿk‰ÿsƒÿ|~ÿ‚xÿ‰qÿ‘mÿ–fÿœ`ÿ¢[ÿ§Vÿ¬Rÿ±Lÿ¶HÿºDÿ½@ÿ¿=ÿÃ:ÿÄ6ÿÆ4ÿÈ2ÿÊ0ÿË.ÿÌ-ÿÍ.ÿÌ-ÿÌ.ÿÉ.ÿÉ.ÿÇ0ÿÄ1ÿÃ4ÿÀ8ÿ¾;ÿº?ÿ·Cÿ²Gÿ®MÿªSÿ¥Yÿ _ÿšfÿ”nÿuÿ‰|ÿ‚…ÿ{ÿu—ÿn ÿf©ÿ_³ÿW¼ÿPÇÿGÑÿ?Ûÿ7åÿ1ïÿ(úÿ !ÿÿ*÷ÿ5ïÿ>çÿHÞÿRÖÿZÍÿdÅÿm½ÿuµÿ~®ÿ…¦ÿžÿ”˜ÿ›‘ÿ¢Šÿ§„ÿ­~ÿ²wÿ¶qÿ½mÿÀhÿÂcÿÅ]ÿÈXÿËUÿÍQÿÎOÿÏKÿÎHÿÎGÿÏEÿÎDÿÍBÿËBÿÉCÿÆBÿÄCÿÁDÿ½Fÿ¹GÿµIÿ°Lÿ¬Pÿ§Sÿ¡Vÿœ\ÿ–aÿ‘eÿ‹lÿƒqÿ}vÿv|ÿoƒÿh‰ÿa‘ÿ[™ÿTŸÿM©ÿE±ÿ=¹ÿ6Áÿ.Êÿ%ÑÿØÿáÿéÿ òÿúÿýÿöÿ ïÿçÿßÿ!Ùÿ(Ñÿ0Ëÿ7Äÿ=½ÿC·ÿJ±ÿP«ÿU¤ÿ[Ÿÿa™ÿd“ÿhŽÿmˆÿp…ÿu€ÿyzÿzvÿ}rÿnÿ€jÿ‚hÿƒdÿ„`ÿ…^ÿ„[ÿ…Zÿ„Xÿ„Wÿ‚Vÿ‚UÿTÿSÿ~Tÿ|SÿzTÿwUÿtVÿrWÿnYÿk[ÿh]ÿe`ÿbbÿ_fÿ[iÿVmÿToÿPsÿLxÿH{ÿDÿ?…ÿ;‹ÿ7ÿ3•ÿ/šÿ*Ÿÿ&¥ÿ$«ÿ ±ÿ·ÿ½ÿÄÿÊÿ Ðÿ ØÿÞÿäÿìÿüÿóÿúÿúÿ÷ÿôÿòÿïÿîÿêÿ%çÿ+æÿ4äÿ:ãÿBáÿJßÿQÞÿYÝÿ`ÛÿiÛÿnÚÿvÙÿ}Øÿƒ×ÿŠØÿ‘Öÿ–ÕÿœÕÿ¢Ôÿ§Òÿ¬Óÿ±Òÿ¶ÒÿºÐÿ½Ðÿ¿ÑÿÂÐÿÃÏÿÄÎÿÅÎÿÆÌÿÇÌÿÇÌÿÅËÿÄÊÿÂÊÿ¿Èÿ¼Èÿ¹ÇÿµÅÿ¯ÅÿªÄÿ¥Äÿ Âÿ™Âÿ’Àÿ‹Àÿ„Àÿ{¾ÿs¾ÿj¿ÿb¾ÿZ½ÿQ»ÿI¼ÿ?»ÿ6¼ÿ.¼ÿ#¿ÿ¿ÿ¿ÿÁÿÁÿùÿÂÿñÿÃÿéÿÄÿáÿÆÿÛÿÆÿÒÿÈÿËÿÊÿÅÿÌÿ¿ÿÎÿ¸ÿÐÿ²ÿÓÿ­ÿ×ÿ¨ÿØÿ£ÿÚÿÿÝÿšÿßÿ–ÿâÿ”ÿäÿÿçÿŒÿêÿŠÿîÿ‡ÿñÿ†ÿóÿ„ÿ÷ÿ‚ÿúÿÿüÿ€ÿÿÿÿ~ÿ}ÿ~ÿ ~ÿ }ÿ~ÿ}ÿ~ÿ}ÿ~ÿ €ÿ#€ÿ&€ÿ(‚ÿ+‚ÿ/ƒÿ1„ÿ4…ÿ7‡ÿ9ˆÿ<Šÿ>‹ÿAŽÿDÿG’ÿI“ÿK•ÿM—ÿOšÿQÿSŸÿU¢ÿW¥ÿYªÿ[®ÿ]°ÿ^´ÿ_¸ÿ`¼ÿaÁÿcÅÿcÉÿdÍÿcÓÿdÙÿeÝÿfãÿeçÿeîÿcôÿcøÿcþÿaa_^\Z!X'U,S2P8N=JCFIDN?S;X8^5c0f*j&m!ptwz }üÿ‚öÿƒðÿƒéÿ…ãÿ…Þÿ„ØÿƒÑÿ‚Ëÿ‚Æÿ€Àÿ¹ÿ}³ÿ{®ÿy©ÿv£ÿsÿo™ÿl”ÿiÿe‹ÿa‡ÿ^ƒÿ[ÿV|ÿRxÿNuÿJtÿFrÿAqÿ;pÿ7nÿ4nÿ1mÿ-lÿ(nÿ$oÿ pÿrÿtÿvÿyÿ}ÿ €ÿƒÿ†ÿŠÿŽÿÿÿ“ÿýÿ—ÿúÿœÿøÿ¢ÿõÿ§ÿóÿ­ÿðÿ±ÿîÿ·ÿëÿ¼ÿéÿÂÿæÿÇÿäÿÍÿáÿÓÿßÿÙÿÜÿÞÿÚÿäÿ×ÿéÿÔÿïÿÑÿõÿÎÿúÿÌÿÿÿÉÿÆÿÃÿ Àÿ¼ÿ¹ÿ¶ÿ!³ÿ%±ÿ)­ÿ.ªÿ2¨ÿ6¤ÿ:¡ÿ>ŸÿBÿG›ÿK˜ÿO–ÿR”ÿU“ÿY‘ÿ\ÿ`ÿcÿeÿi‹ÿk‹ÿnŒÿq‹ÿsŒÿuŽÿwÿy‘ÿ{’ÿ}“ÿ•ÿ—ÿ‚™ÿƒ›ÿ„žÿ…¡ÿ„¤ÿ…¨ÿ‡¬ÿˆ°ÿ‡´ÿ‡·ÿ†ºÿ„¿ÿ„Ãÿ‚Çÿ€ËÿÏÿ}Õÿ{ÛÿxÞÿuäÿsèÿpíÿkóÿh÷ÿeûÿa]X RNIC =%8*20,5&: @EL PUZúÿ`óÿeìÿhåÿoßÿsØÿwÑÿ{ÉÿÃÿƒ¼ÿ‡´ÿŠ®ÿ§ÿ ÿ’šÿ””ÿ–ÿ˜‡ÿ™‚ÿš}ÿšwÿ›qÿšmÿ™gÿšdÿ˜_ÿ–[ÿ”Xÿ’UÿSÿ‹Pÿ‡Nÿ„Lÿ€JÿzHÿvIÿqHÿkHÿeIÿ_IÿXLÿRNÿLPÿERÿ>Uÿ7Xÿ0[ÿ(^ÿ!cÿhÿnÿ rÿxÿþÿÿ÷ÿ…ÿñÿ‹ÿéÿ’ÿâÿ™ÿÜÿ ÿÖÿ¨ÿÏÿ°ÿÉÿ¶ÿÃÿÀÿ½ÿÈÿ¸ÿÐÿ²ÿØÿ®ÿáÿ¨ÿéÿ¤ÿòÿ ÿúÿœÿ˜ÿ ”ÿ‘ÿÿ%Šÿ/‡ÿ7…ÿ?‚ÿGÿPÿX~ÿa}ÿh|ÿn{ÿwzÿ}xÿ„yÿŒyÿ’xÿ˜yÿžyÿ¤|ÿ©|ÿ¯}ÿ´~ÿ¸~ÿ¼€ÿ¿ÿ‚ÿÅ„ÿdžÿʉÿÌ‹ÿÎÿÎÿÏ”ÿΕÿϘÿΛÿÌŸÿÊ¢ÿÈ¥ÿƪÿîÿ¿²ÿ½¶ÿ¹ºÿ´¿ÿ®Ãÿ©Çÿ¤ÌÿžÑÿ—×ÿ‘Üÿ‹âÿ‚çÿ{íÿsôÿjùÿbÿÿZQ IA7.$$+39?ÿÿFõÿMëÿSáÿYØÿ`ÎÿfÄÿl¼ÿq±ÿw¨ÿ}Ÿÿ–ÿ…ŒÿŠ„ÿ|ÿ’sÿ–mÿšfÿœ]ÿ Wÿ¡Pÿ£Iÿ£Dÿ¤>ÿ¥9ÿ¤4ÿ£/ÿ¢,ÿ¡)ÿž%ÿœ$ÿ™"ÿ– ÿ“ÿÿ‹ÿ‡ ÿ‚ ÿ}"ÿw%ÿr'ÿk*ÿf.ÿ`2ÿY7ÿS<ÿMAÿGGÿ@Oÿ9Vÿ3]ÿ-eÿ&nÿ wÿÿ‰ÿ ’ÿÿ¦ÿþÿ²ÿùÿ¼ÿôÿÇÿîÿÒÿéÿÜÿäÿèÿßÿòÿÛÿýÿ×ÿÒÿÎÿÊÿ'Æÿ0Âÿ;¾ÿD»ÿN·ÿW´ÿ`²ÿi®ÿp¬ÿz¨ÿ€¥ÿ‡ ÿŽžÿ”œÿš™ÿŸ–ÿ¤“ÿª‘ÿ­Žÿ°Œÿ³‰ÿ·†ÿ¸…ÿºƒÿ»ÿ¼ÿ¼}ÿ»|ÿ¼zÿ»xÿ¹wÿ¸vÿ¶wÿ³wÿ°vÿ­wÿªvÿ¦wÿ¤xÿ zÿ›|ÿ–ÿ€ÿƒÿ‡…ÿˆÿ}Œÿwÿq“ÿk˜ÿeÿ`¢ÿZ§ÿS­ÿM±ÿG¸ÿ@½ÿ:Äÿ4Êÿ.Ñÿ'Øÿ!ßÿæÿíÿõÿûÿþÿøÿòÿíÿæÿ$àÿ,Üÿ3Öÿ9Ðÿ@ÊÿGÆÿMÁÿS»ÿY·ÿ_²ÿd¬ÿj©ÿo¤ÿu ÿyœÿ}˜ÿ•ÿ…’ÿŠŽÿŠÿˆÿ“…ÿ•ƒÿ˜ÿ™ÿš}ÿœ{ÿžyÿŸwÿžwÿŸvÿŸvÿžuÿvÿ›wÿšvÿ—wÿ–yÿ”zÿ‘|ÿŽ}ÿ‹ÿˆ‚ÿ…„ÿ€‡ÿ|Šÿwÿqÿm•ÿh™ÿbÿ]¡ÿV¥ÿQªÿK¯ÿDµÿ=¹ÿ7¿ÿ0Åÿ)Êÿ"Ðÿ×ÿÝÿ âÿèÿîÿøÿóÿòÿùÿêÿÿÿãÿÜÿ ÖÿÎÿÇÿÁÿ ºÿ%³ÿ*­ÿ/§ÿ5¡ÿ8œÿ=–ÿC‘ÿGÿK‡ÿMƒÿQÿT{ÿVwÿZtÿ]qÿ`oÿamÿckÿejÿfiÿhhÿhiÿihÿjiÿjiÿliÿlkÿklÿknÿiqÿitÿivÿgyÿg~ÿe‚ÿd†ÿcŠÿaŽÿ`“ÿ^™ÿ\žÿY¢ÿV©ÿU®ÿS´ÿQ¹ÿN¿ÿKÅÿIËÿFÐÿCÖÿ@Ýÿ=âÿ:èÿ7îÿ4óÿ1ùÿ-ýÿ)&" ! % ).2þÿ3ûÿ6úÿ9öÿ<ñÿ?îÿAëÿEçÿHãÿJßÿMÛÿOÙÿQÕÿSÑÿUÏÿWËÿ[Éÿ]Æÿ^ÃÿaÁÿb¾ÿd»ÿf¹ÿg·ÿhµÿj³ÿj±ÿk°ÿl¯ÿm­ÿn¬ÿm«ÿn«ÿo©ÿn©ÿmªÿn©ÿlªÿj©ÿiªÿhªÿg«ÿe¬ÿb­ÿ`¯ÿ]°ÿY±ÿT²ÿR´ÿNµÿI¸ÿD»ÿ>½ÿ;Àÿ6Ãÿ0Åÿ+Èÿ%Ëÿ ÎÿÑÿÕÿÚÿ Üÿàÿäÿýÿèÿøÿíÿòÿñÿíÿôÿæÿ÷ÿáÿûÿÝÿÿÿÙÿÔÿÎÿÊÿ ÈÿÄÿÀÿ½ÿºÿ·ÿ µÿ#µÿ&´ÿ(²ÿ,±ÿ.°ÿ1¯ÿ4°ÿ5¯ÿ7¯ÿ8°ÿ:¯ÿ;°ÿ<°ÿ<±ÿ>²ÿ>³ÿ=´ÿ=µÿ;·ÿ;¸ÿ;¸ÿ9ºÿ9»ÿ9¾ÿ7Àÿ6Àÿ5Âÿ3Ãÿ1Åÿ/Åÿ,Æÿ*Çÿ(Èÿ&Êÿ#Ëÿ!ÌÿÍÿÎÿÏÿÏÿÐÿÑÿÐÿÑÿ Òÿ Óÿ Ôÿ Öÿ×ÿØÿÚÿÛÿÜÿÞÿßÿáÿãÿäÿçÿéÿìÿïÿòÿôÿ÷ÿúÿýÿ    !$%).26:>ADGILOQTVX Y \ ^ ^``_`^]ýÿ^úÿ]øÿ\õÿ[òÿYïÿVìÿUçÿSäÿQãÿNàÿKÝÿHÚÿEØÿBÕÿ=Ñÿ:Ïÿ8Ìÿ5Êÿ1Èÿ,Çÿ)Åÿ&Ãÿ"ÁÿÀÿ¾ÿ¼ÿ»ÿºÿ ¹ÿ¹ÿ¸ÿ·ÿ¸ÿÿÿ¸ÿúÿ¹ÿöÿºÿóÿ¹ÿðÿ»ÿìÿ¼ÿèÿ½ÿçÿÀÿäÿÁÿáÿÂÿÞÿÃÿÛÿÅÿØÿÇÿÔÿÉÿÑÿÌÿÏÿÎÿÎÿÐÿÊÿÑÿÈÿÓÿÆÿ×ÿÄÿÙÿÁÿÜÿ¾ÿßÿ¼ÿâÿ¹ÿåÿ¹ÿçÿ·ÿêÿµÿìÿ´ÿðÿ²ÿóÿ±ÿöÿ¯ÿùÿ®ÿýÿ­ÿ¬ÿ«ÿ«ÿ©ÿ ©ÿªÿ©ÿªÿ«ÿ¬ÿ¬ÿ#®ÿ'¯ÿ*°ÿ-²ÿ2´ÿ6¶ÿ:¸ÿ<»ÿ?¿ÿBÂÿGÃÿKÅÿOÉÿQÌÿRÏÿWÔÿZØÿ]ÛÿaÞÿcâÿeåÿfèÿiíÿjðÿlóÿn÷ÿoûÿpÿÿqsrrr o omkjfea ]"\#X$S'N(J*F-A/;15204+4$578: ;=?üÿ@õÿAïÿBèÿBàÿCÛÿEÓÿFÎÿHÈÿHÀÿIºÿJµÿK®ÿKªÿM¤ÿMžÿL›ÿM•ÿL‘ÿMÿL‰ÿL…ÿL‚ÿJ€ÿJ~ÿHzÿGxÿFvÿCtÿAsÿ?sÿ=uÿ;uÿ8tÿ5uÿ2vÿ/wÿ,xÿ({ÿ$~ÿ ÿ„ÿ‡ÿ‰ÿŒÿ ”ÿ —ÿšÿŸÿÿÿ¥ÿüÿªÿõÿ¯ÿóÿµÿðÿºÿêÿ¿ÿåÿÇÿãÿÌÿßÿÒÿÛÿÙÿØÿÞÿÔÿåÿÐÿêÿÌÿñÿÉÿ÷ÿÇÿüÿÅÿÁÿ¿ÿ ¼ÿºÿ¹ÿ·ÿ"¶ÿ(´ÿ-³ÿ3²ÿ7±ÿ<°ÿA¯ÿE°ÿJ°ÿO±ÿQ²ÿU±ÿY²ÿ]±ÿ`²ÿd²ÿg³ÿh´ÿjµÿl·ÿo¸ÿr¹ÿtºÿt¼ÿu¾ÿuÀÿwÁÿwÂÿvÃÿwÄÿvÆÿwÇÿvÊÿuËÿtÍÿsÏÿqÏÿoÐÿnÓÿmÕÿkØÿhÙÿfÜÿcÞÿaÞÿ_áÿ\äÿXåÿTéÿQêÿOîÿJñÿGôÿD÷ÿ?ùÿ:ýÿ73.*%  #(-þÿ1ùÿ5óÿ:ðÿ=êÿCåÿGàÿLÛÿPÖÿSÑÿWÌÿ[Çÿ`Ãÿd½ÿd¹ÿhµÿl±ÿn¬ÿo¨ÿr¥ÿtŸÿuœÿw˜ÿw”ÿv’ÿwŽÿv‹ÿtŠÿt†ÿt„ÿq‚ÿnÿkÿi~ÿf}ÿc{ÿ_{ÿ[|ÿV{ÿR|ÿM|ÿH}ÿCÿ=€ÿ7ƒÿ2…ÿ,‡ÿ&‰ÿ ÿ’ÿ•ÿ™ÿÿ ÿÿÿ¦ÿûÿ«ÿõÿ°ÿðÿµÿëÿ»ÿäÿÁÿßÿÇÿÛÿÍÿÖÿÔÿÐÿÚÿÌÿàÿÈÿçÿÄÿíÿÀÿóÿ½ÿúÿ¹ÿµÿ²ÿ °ÿ­ÿ«ÿ©ÿ%¦ÿ*£ÿ1¢ÿ7¢ÿ< ÿCŸÿHžÿLœÿQ›ÿUšÿ[›ÿ_šÿbšÿg›ÿjšÿm›ÿpœÿsÿvœÿwžÿyŸÿ{ ÿ}£ÿ~¤ÿ§ÿ~¨ÿ~©ÿ¬ÿ~¯ÿ±ÿ~³ÿ|µÿ|¹ÿ|ºÿz¿ÿxÃÿvÆÿtÉÿrÍÿpÑÿkÕÿiÙÿgÞÿcâÿ`åÿ]ëÿYïÿTôÿRøÿMýÿIFA< 73.*$# '+04 8;>ÿÿCúÿGôÿIðÿKêÿOåÿQáÿRÛÿUÖÿWÐÿYËÿYÇÿ\Âÿ^½ÿ_·ÿ`³ÿ_¯ÿ`ªÿ`¦ÿ_ ÿ`œÿ_™ÿ_–ÿ]“ÿ]ÿ[‹ÿXˆÿWˆÿU„ÿTƒÿR‚ÿO€ÿMÿK~ÿI}ÿF~ÿC~ÿ@}ÿ=~ÿ:€ÿ7ÿ3„ÿ1‡ÿ.ˆÿ*Šÿ'Žÿ#’ÿ!•ÿ™ÿÿ¡ÿ§ÿ¬ÿ ±ÿ¶ÿ¼ÿÂÿÈÿþÿÍÿûÿÓÿ÷ÿÚÿôÿáÿïÿçÿíÿîÿéÿôÿåÿûÿâÿàÿÜÿ Úÿ×ÿÕÿÐÿ#Íÿ'Ëÿ.Èÿ4Çÿ8Äÿ>ÂÿCÀÿG¼ÿL¹ÿO¹ÿS·ÿWµÿ[´ÿ^³ÿa²ÿd±ÿe°ÿh¯ÿh®ÿj­ÿl®ÿm®ÿn®ÿm°ÿn°ÿm°ÿk±ÿk²ÿi´ÿh¶ÿf¶ÿd¸ÿc»ÿ_½ÿ]Àÿ[ÁÿWÅÿTÇÿQÊÿMÌÿKÏÿEÒÿBÖÿ>Ùÿ:Üÿ6àÿ3ãÿ/åÿ+éÿ%ìÿ"ðÿòÿöÿùÿüÿÿÿ ÿÿ ýÿ ùÿöÿóÿñÿíÿêÿæÿåÿâÿàÿÞÿ Ûÿ"Ûÿ#Ùÿ$Öÿ%Õÿ&Ôÿ(Ñÿ(Ðÿ*Ïÿ*Ïÿ*Ïÿ,Íÿ.Ìÿ/Ìÿ0Êÿ0Êÿ0Ëÿ2Êÿ3Ëÿ4Êÿ6Ëÿ6Êÿ6Ëÿ7Ëÿ8Íÿ:Íÿ;Íÿ<Ïÿ;Ïÿ<Ðÿ>Ñÿ>Ðÿ?Ñÿ@Óÿ?Õÿ@×ÿ?Øÿ@Ùÿ?Úÿ@Ûÿ@Ýÿ?Þÿ?ßÿ>àÿ<áÿ;ãÿ9äÿ9åÿ7èÿ4éÿ2êÿ0ëÿ,îÿ)ïÿ%ñÿ#ñÿóÿöÿöÿ÷ÿùÿ üÿüÿýÿþÿþÿûÿöÿñÿîÿéÿåÿáÿÝÿÚÿ×ÿ Òÿ Ïÿ Ìÿ Éÿ ÆÿÄÿÃÿÀÿ¾ÿ»ÿ¹ÿºÿ¸ÿ·ÿ·ÿµÿµÿ¶ÿ·ÿ¸ÿ¸ÿºÿ»ÿ¼ÿ¼ÿ¿ÿÂÿÃÿÅÿÇÿÈÿËÿÍÿÎÿÒÿÔÿÖÿÙÿÚÿÝÿßÿáÿåÿåÿèÿéÿìÿðÿðÿ óÿóÿ öÿ ùÿ ùÿ ûÿ ýÿ þÿ                ! " $ % % ' ) ))+-../0/121ÿÿ2ýÿ2ûÿ1ùÿ1÷ÿ1öÿ/ôÿ/óÿ.ðÿ,ðÿ,íÿ*êÿ'éÿ'çÿ'åÿ%ãÿ#áÿ!àÿ ÞÿÞÿÜÿÚÿÚÿÙÿ×ÿÖÿ×ÿÖÿ Óÿ ÓÿÔÿÓÿÔÿÓÿÔÿÔÿ×ÿ×ÿÖÿþÿ×ÿýÿÙÿûÿÚÿúÿÛÿùÿÜÿøÿÞÿöÿàÿõÿáÿöÿâÿôÿåÿóÿåÿòÿèÿñÿêÿòÿëÿðÿïÿïÿðÿîÿòÿíÿôÿîÿöÿìÿøÿêÿúÿêÿüÿéÿþÿèÿÿÿéÿèÿçÿæÿåÿäÿåÿãÿâÿ âÿ áÿ áÿ àÿßÿÞÿÝÿÞÿÝÿÛÿÛÿÚÿÙÿÛÿÛÿÙÿÚÿÙÿÙÿÚÿÙÿÚÿÙÿÚÿÜÿÜÿÛÿÜÿÞÿßÿàÿàÿâÿ äÿ!äÿ æÿ!èÿ"èÿ#ëÿ$ìÿ%íÿ$ðÿ$ðÿ%óÿ%õÿ&öÿ%ùÿ&úÿ&üÿ'ýÿ('((''%%&% % # "!  "#%&()ÿÿ+üÿ,ùÿ-öÿ0óÿ0ñÿ1îÿ2êÿ3çÿ5åÿ5âÿ6ßÿ8Ýÿ8Úÿ9×ÿ8Óÿ9Òÿ9Ïÿ:Îÿ:Ìÿ8Éÿ9Éÿ8Çÿ7Åÿ6Ãÿ6Àÿ4Áÿ2¿ÿ2¾ÿ0¼ÿ.¼ÿ,½ÿ)¼ÿ'½ÿ$¼ÿ!½ÿ¼ÿ½ÿ½ÿ½ÿ¿ÿ¿ÿ ÀÿÁÿÃÿÅÿÆÿÿÿÉÿûÿËÿ÷ÿÍÿôÿÏÿðÿÑÿìÿÔÿéÿÖÿæÿÚÿãÿÝÿßÿßÿÜÿâÿÙÿåÿÖÿèÿÓÿëÿÑÿïÿÎÿóÿÌÿöÿÊÿùÿÉÿüÿÇÿÿÿÅÿÃÿÁÿÁÿÀÿ ¾ÿ¿ÿ¿ÿ½ÿ½ÿ¾ÿ ¿ÿ"Àÿ&¿ÿ*Àÿ,Âÿ/Ãÿ1Äÿ3Åÿ6Èÿ8Éÿ:Êÿ=Ìÿ>Îÿ@ÐÿAÑÿCÔÿEÖÿFØÿGÙÿGÜÿHßÿIáÿIãÿHåÿJèÿKéÿJëÿIíÿIñÿHòÿIôÿHöÿG÷ÿEúÿDûÿCýÿBÿÿA?=:8631 / - *'%   !#%'ýÿ)ùÿ*õÿ,òÿ.îÿ/éÿ1æÿ2ãÿ3ßÿ4Üÿ6Øÿ7Õÿ8Òÿ8Îÿ;Ìÿ;Èÿ:Æÿ;Ãÿ;Àÿ<¾ÿ;»ÿ;¹ÿ:¸ÿ9µÿ9³ÿ8²ÿ6°ÿ5¯ÿ3®ÿ2­ÿ1¬ÿ.«ÿ-¬ÿ*¬ÿ)­ÿ&¬ÿ$­ÿ ­ÿ®ÿ°ÿ±ÿ³ÿµÿ·ÿ ¸ÿ ¼ÿ½ÿÀÿÃÿÅÿÿÿÊÿüÿÍÿúÿÐÿ÷ÿÔÿõÿØÿòÿÛÿïÿßÿíÿäÿêÿèÿéÿëÿæÿïÿåÿôÿãÿøÿáÿûÿßÿÞÿÝÿÛÿÙÿ Øÿ×ÿÖÿÕÿÕÿ Õÿ#Ôÿ'Ôÿ+Òÿ-Òÿ0Òÿ3Ñÿ6Òÿ:Ñÿ;Òÿ>Óÿ?ÒÿAÓÿBÒÿCÓÿEÓÿEÒÿGÓÿGÓÿHÔÿIÕÿHÔÿHÕÿGÖÿGØÿFØÿEÙÿDÙÿCÚÿBÚÿAÜÿ?Ýÿ>ßÿ<àÿ:áÿ8âÿ6ãÿ4åÿ1çÿ0èÿ.éÿ+ëÿ)îÿ(ïÿ$òÿ"ôÿöÿ÷ÿùÿúÿýÿÿÿ     ÿÿüÿûÿùÿ÷ÿõÿóÿñÿ îÿ#íÿ&ëÿ&éÿ'èÿ)æÿ*äÿ+ãÿ-âÿ.àÿ.Ýÿ/Ûÿ0Úÿ1Ùÿ1×ÿ2×ÿ1Öÿ2Ôÿ2Ôÿ1Óÿ2Ñÿ1Ñÿ2Ðÿ1Îÿ0Îÿ/Îÿ/Íÿ.Îÿ.Íÿ,Îÿ+Îÿ*Íÿ)Îÿ'Îÿ&Îÿ%Ðÿ#Ðÿ"Ðÿ ÑÿÑÿÓÿÔÿÕÿ×ÿØÿÙÿÛÿÜÿ Þÿ áÿãÿäÿæÿèÿëÿíÿÿÿïÿüÿòÿûÿôÿùÿöÿöÿùÿôÿûÿòÿýÿðÿÿÿîÿëÿêÿèÿæÿäÿ áÿ àÿÞÿÜÿÛÿÙÿØÿ×ÿÖÿÔÿÔÿÓÿ!Ñÿ"Ñÿ$Ñÿ$Ðÿ&Ðÿ'Ïÿ'Ðÿ(Ïÿ)Ïÿ*Ðÿ*Ïÿ+Ðÿ+Ðÿ*Ñÿ+Ñÿ*Óÿ+Óÿ*Ôÿ*Öÿ*×ÿ(Ùÿ(Ûÿ(Üÿ'Þÿ&ßÿ%âÿ%äÿ$åÿ#èÿ!êÿ!íÿïÿòÿôÿöÿùÿûÿýÿÿÿ   ÿÿþÿüÿûÿùÿøÿ÷ÿöÿöÿôÿòÿòÿðÿïÿîÿíÿìÿìÿìÿêÿêÿéÿéÿèÿçÿçÿæÿæÿæÿäÿåÿæÿåÿæÿåÿæÿæÿåÿæÿåÿæÿåÿæÿæÿçÿçÿçÿéÿéÿ éÿ êÿ ëÿ ìÿ ìÿíÿîÿïÿðÿñÿòÿóÿõÿöÿ÷ÿùÿþÿùÿýÿúÿûÿüÿûÿüÿúÿþÿøÿ÷ÿõÿôÿôÿñÿïÿïÿïÿîÿíÿìÿìÿ ëÿ êÿ êÿ èÿ èÿ éÿèÿèÿçÿèÿçÿèÿèÿéÿéÿéÿêÿëÿëÿëÿìÿíÿîÿîÿïÿïÿðÿòÿòÿôÿôÿõÿöÿ÷ÿ÷ÿøÿøÿ ùÿ úÿ ûÿ ûÿ üÿüÿüÿýÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿþÿýÿþÿþÿýÿþÿýÿþÿýÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿ ÿÿÿÿÿÿþÿþÿþÿýÿýÿüÿûÿûÿúÿúÿúÿ ùÿ ùÿ øÿ ùÿ ÷ÿ öÿöÿõÿõÿöÿõÿôÿõÿõÿôÿõÿôÿõÿôÿõÿôÿÿÿõÿÿÿõÿþÿõÿýÿõÿýÿöÿýÿöÿüÿõÿúÿöÿúÿöÿùÿøÿùÿøÿùÿøÿøÿùÿøÿùÿ÷ÿúÿ÷ÿúÿõÿûÿõÿûÿõÿýÿôÿýÿóÿýÿòÿþÿóÿþÿòÿÿÿñÿñÿñÿðÿðÿñÿðÿðÿðÿïÿðÿïÿïÿðÿïÿðÿïÿðÿïÿðÿïÿðÿðÿñÿ ðÿ ñÿ òÿ òÿ òÿ óÿ ôÿ õÿ öÿ öÿ ÷ÿ ÷ÿ øÿ ùÿùÿ úÿüÿüÿýÿýÿþÿÿÿÿÿ             ÿÿ þÿ ýÿ üÿ ûÿ úÿ øÿ÷ÿ÷ÿ õÿôÿ óÿòÿ ñÿðÿðÿ ïÿîÿ îÿíÿ íÿëÿ êÿ ëÿ éÿ éÿ éÿ èÿ éÿ èÿ éÿ èÿ éÿ éÿ éÿéÿêÿêÿëÿëÿëÿìÿìÿíÿíÿîÿïÿïÿðÿòÿòÿóÿÿÿôÿþÿõÿýÿ÷ÿýÿøÿüÿùÿüÿúÿûÿúÿúÿûÿúÿüÿùÿýÿøÿþÿ÷ÿÿÿ÷ÿöÿõÿôÿôÿóÿóÿòÿòÿñÿòÿñÿ ðÿ ðÿ ñÿ ðÿ ñÿðÿñÿñÿðÿñÿðÿñÿðÿñÿñÿñÿòÿòÿòÿóÿóÿóÿóÿôÿôÿôÿõÿöÿ÷ÿ÷ÿøÿøÿøÿùÿùÿúÿúÿûÿûÿûÿüÿüÿýÿ ýÿ þÿ þÿ ÿÿ ÿÿ  ÿÿ þÿ þÿ ýÿ üÿ ûÿ úÿúÿùÿøÿ÷ÿöÿöÿõÿôÿôÿóÿòÿòÿñÿðÿðÿïÿïÿîÿîÿíÿíÿìÿìÿíÿìÿëÿìÿìÿëÿìÿëÿìÿ ìÿ ìÿ íÿ íÿîÿîÿîÿïÿïÿðÿðÿñÿñÿòÿóÿôÿôÿÿÿõÿþÿõÿýÿ÷ÿüÿùÿûÿùÿúÿúÿùÿûÿøÿüÿøÿýÿ÷ÿÿÿöÿõÿôÿôÿóÿòÿòÿòÿñÿñÿðÿñÿðÿ ïÿ ðÿ ïÿ îÿ îÿ ïÿîÿïÿîÿïÿïÿðÿïÿðÿðÿðÿñÿñÿñÿòÿòÿòÿóÿóÿôÿôÿõÿöÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿ üÿ ýÿ þÿ þÿ ÿÿ  ÿÿ ÿÿ þÿ ýÿ üÿ üÿ ûÿ úÿ úÿ úÿ ùÿ ùÿ÷ÿ ÷ÿ÷ÿ öÿöÿ õÿ ôÿôÿ óÿóÿ òÿ òÿ ñÿ òÿ òÿ ñÿ òÿ ñÿ ñÿ ñÿ ðÿ ñÿ ðÿñÿðÿñÿñÿòÿñÿòÿòÿóÿóÿôÿôÿôÿõÿôÿõÿöÿ÷ÿ÷ÿøÿùÿúÿûÿÿÿûÿÿÿüÿþÿýÿþÿýÿþÿþÿýÿÿÿüÿüÿüÿüÿûÿûÿúÿúÿúÿùÿùÿøÿøÿùÿøÿ÷ÿøÿ÷ÿ ÷ÿ öÿ öÿ ÷ÿ ÷ÿ øÿ ÷ÿ øÿ ÷ÿ öÿ ÷ÿ öÿ ÷ÿ øÿ øÿ ÷ÿ øÿ ÷ÿ øÿ ÷ÿ øÿ øÿ ùÿ ùÿ úÿ úÿ úÿ úÿ ûÿ úÿûÿüÿüÿýÿýÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿþÿýÿýÿýÿüÿüÿýÿüÿûÿüÿüÿûÿüÿûÿüÿûÿüÿûÿûÿûÿúÿûÿûÿûÿúÿûÿúÿûÿûÿüÿûÿûÿüÿûÿüÿûÿüÿüÿüÿýÿüÿýÿýÿüÿýÿüÿýÿýÿþÿþÿýÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿýÿýÿüÿýÿýÿüÿüÿûÿûÿüÿûÿüÿûÿüÿûÿûÿûÿûÿûÿüÿûÿûÿüÿûÿüÿûÿüÿûÿüÿûÿüÿüÿüÿýÿüÿýÿþÿýÿþÿýÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿLIST`INFOISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comIENG ICRD 2004-08-23centerim-4.22.10/share/sms.wav0000644000175000001440000001077511461606612013043 00000000000000RIFFõWAVEfmt ++dataÑ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~|xy{||„‘ŽŒŽ‹}wŠo_\apqo•”œ±¤hpˆŸkADq~|__ƒ™œ•‰‰ƒ˜•’¡©Ÿˆq_SF;4;Ok‹“£»ÐÖȰ™…v\@5@Zu{uwˆƒwox‘¬¼½µ­¦›‡kQB@CFHOay’¡©¯·¾½­”{nnqoifkv~ziWPYjz…ž²ÁÇ¿ª•‡|o^MCDNX`huˆ›§©£™—‘ˆ€…އxi`[UNJPc~–¥«¯³·µ¨•‚unh`UPS^lv|€†’‹‡Š’› Ÿœ˜’‡vaOGIPYbm~‘¡ªª¦¤£ ˜Š{qlkjgegmuxvrqv~†”¨¯¯¦—†xk`UNOWcox‡‘š Ÿ›—•“އ~xwxyvpjgfffflw‡—£©««§Ÿ’‚sidb`_afnw}…Š”•“‹†}xpe\XZ`is~‹˜£¨¦ ™“Œ„{snlllkklpvz}‚‡Œ’”–˜™—†{qha\Y\do{…Œ’—šš˜“Ž‹ˆ…€{vsrqomlnqtw{†Ž–œžž›—…ynfcbdglsz†‰‹‘‘ŽŒŠˆ…€zvspmjhilry€ˆ—Ÿ—‰zsnklnprsvy}€ƒ…ˆŒ‘’‘І€zsnjhfgkqy‚Š”——–’Œ‡‚|yvtsrrrrsuy}…‰‘“”“Œˆ‚{tnihhkot{‡ŒŽŽŽŽŒŠ‡…ƒ~zvsqpopqty~ƒˆŒ“•”’‡{vqnmnptwz~ƒ†‡‰Š‹‹ˆ…}xtqonopsw|‚‡Œ’’’‹†}ywutttuvwyz|ƒ†‰ŒŽ‹‡ƒ~zvrpnoqtw|€…ŠŒŽŽ‹‰‡„}{zxvtttuvy|€„ˆ‹Ž‹ˆ„€{xtrqqrux|‚…‡‰‰‰‰‰ˆˆ†„‚|yvtrrsux{ƒ‡ŠŒŒ‹ˆ…}zwuutuvxz|~€‚„†ˆ‰ŠŠŠ‰‡„}zwusssux{~„‡Š‹‹‹‰‡…‚€}{zxxwwwxy{|„‡‰‹‹‹Šˆ…‚~{xvutuvxz}€‚…‡ˆ‰‰ˆ‡†„ƒ}{zxwvvwxz}€ƒ†ˆŠ‹Š‰‡…‚€}zxwvvwxz|~€‚ƒ…†‡‡‡‡†…„‚€}{ywvvvxz}‚…‡ˆ‰‰ˆ‡…ƒ}{zyxxyyz|}‚„†‡ˆˆˆ‡…ƒ~{yxwwwxz|~ƒ„†‡‡‡†…„ƒ~|{zyyyyz{}ƒ…‡ˆˆˆ‡…ƒ}{yxxxyz|””“Œˆ„{xvuuvwyz|}~€€€~~~€‚€|~ƒ„›—’ˆ{vq’sXC>M`v§§¡ŒŒ°½“Ÿ¥§”U ?Tl`d‚–§¹ÀÀ©˜z}‚}yvvxzxqeWKGN`z—¯»»­—j\UTWZ]cnœ¼ØðùñÙ¸gF2$"*6DZsŒ£³½¿¼´ª¡™”‘Ž‹†}sg\USV`lz‡‘—š››™•‹|hR@32>Tt–´ÈÔØÖÏŧ‘vY@/&)7Jbxˆ‘”“‘ŽŒŒŠ‰‡‡ˆŠŽ‡vnhfglv‚Ÿ¬³´­ž‰r[H=526>I[s¬ÄØâàÓÀ¨zja[XVVX^gr~ˆŒ‡~vqqt{‚‡Š‰‡ƒ|{zz|€†Ž˜¢¬²´°¦˜†q\I;.(*4CZtޤ´¿ÀÀ¿¸¯¢”„ujdchpy€‚€|vqnnpsvxz|ƒ‡‹Œ‰ƒzqkhkt€Žœ©²¸¹¶® ŽycO@737@N`tˆš©´¸·°¤–‡{snmnqtx|†ŠŽ‰„~{z{~zrkd`_`dipxƒž¬¸¿À»¯ Ž|l^TNLNU^jx„Ž”–”‰‚|wtrruy†’••“‹‰‡ˆ‰ŠŠˆ…|wqjc[SMKNVdv‰œ¬¸¿ÀÀº±£”‚qaVPPU^it~†ŒŽ‰ƒ|uolknsy€†‹Ž’’’’Œ‹‹‹Šˆ„|si`XTSUZblw„‘ž¨¯²¯¨ƒxpjggimszˆŽ‘‘Šƒ}wspoopqrtvy|~€‚„†Š”šŸ¡¡ž™‘ˆ}rh^VQPT\gt–œž™“Œ„|uollpw€Š’˜›œ™•‰‚{tniedegjmprtvx|‡Ž”šŸ¢¤¥£ž—Žƒwlc]ZZ]cjrz‚‰’’‰ƒ|wtstw|†‹”—˜—”‰ƒ}xusqpomljjjlnrv{ˆ–¢¤£Ÿ˜†}unheeglrz‚‰Ž‘‘މƒ|vpljikot|ƒŠ”––•’Šˆ…‚}{ywurpmjiikpv|ƒŠ“––•’Žˆ‚|wtsux}ƒˆŒ‰„}unhdbcfjpv|‚‡Œ‘”–——–”’Ž‹ˆ„ztojgffhkotz€†‹‘ŽŠ…€|zxy{~‚‡‹“•”‘†xqlhfffedhmsx…•˜šžœ•“‘««˜‚m]\[_|zwlo™‘Ÿ­ªƒZIWX[JJbv‰©³©ª¯­§¡ž™Žshbbfnv~‚|sh]URSYco|ˆ“œ£§¨§£œ“‰umfbadjt‚‘¡°»À¾´£u_L@;;@FQ\gr}ˆ” «´¸¸²¦—…uibafoxˆ‹‹‰‡……†‡‡…zrjeceku€Œ•›žœ–Œuj`YUUX_huƒ’ ­¸¿ÀÀ»±¤“o^OFBCJVdq}†Š‹ˆ…~€‚‚‚€„ˆŽ•›žžš’‰€wrprv|‚‡‰ˆ†‚}yurokgb]XVV[cn|‹›¨³¼ÀÀ¿¹¯£•‡xlaZVUVZ`hpx…‰‹Š…vngcbfoz‡”Ÿ§««¨£›”Œ„}vojfdfkt~‰’˜š—…ymc\XWX\bir{†›¥¬±³°ª¢—‹tkea_`chnu|ƒ‰ŽŒˆ„{xurqpqtx|…ˆˆ‡ƒ~zvuw{‚‰‘—œŸ žœ—‘Š‚yod[SONRYdq~‰’—š™–’ˆ„€}zyxy|€…‹‘•—˜–’‡{upljhijmquy|~}{ywvvvx{~ƒˆ–ž¦¬±²¯¨seZRMJKNS[dnz…˜Ÿž™’Š‚|xvwz~ƒˆŒ“””“‘މƒ}wrmkjknqtwyz{{{{zzyyyz|€„Š”˜›œ›˜•‘Œ†{uojfddfjqx†‹ŽŽŒ‰…~zwusqqsw{‡’’Œ‡ƒ}||}‚„‡‰‹‹‹ˆ…yrjd_]]`elt~‡—œ ¢¡ž˜’Š‚ztpnoquy~ƒ‡Š‰ƒ}unhcaacfkqw}‚‡Œ“•––•’Šˆˆˆ‰Š‹Š‰†‚|vpjea_]^`cipyŠ‘—›œœ™•‘Œ‡ƒ€}|{|~„†ˆ‰‰‡„€|wspnmmnoqsvy|‚…‡‡‡‡…„„„…‡‰ŒŽ‘‹ˆ„€{vpkgdcdglry€†Œ“””’Š…ztqnnpsy…‹“••”’މ„yuqonorux{~€~}|zyyyz{}‚†‰“““‘މ…€|ywvuuvwy{}€‚„…„ƒ€}yvrponorux}‚‡Œ”—™™˜•’‰…‚|zxwvutsrqponmmnoruz€†Œ’–™šš˜•’ˆƒzwtstux|‚…††„‚{xtqommmoruz…ŠŽ’”••“‘Ž‹ˆ…‚€~|{zz{||}||zxvtsrrrtvy|€„ˆŒ‘’‘Œˆƒ{xvuvxz}€ƒ†‰‹Œ‹Šˆ„€|wtqooprtwz|ƒ„††‡††…„„„„……†‡‡‡†…ƒ‚€~|zyxwwwwyz|~€‚‚~|zyxwxyz}€„ˆŒ”–——”‘ˆ‚}xtpnlklmorux{}€€‚„†ˆ‹Ž‹ˆ„€{xtrqqrtvx{}~€€€~|{yxwxy{~…‰Œ‘’““‘Œˆ„€{wtqpppqsuvxz{}~€€‚‚ƒ„…‡ˆ‰ŠŠŠˆ†„‚}|zzyz{|~€ƒ„…„ƒ‚}zwutttuwy|‚…‡‰‹‹‹Š‰‡…ƒ€€€€€€€~}{zxwwwwxz|~‚ƒ„„„„ƒƒ‚€€€‚„†ˆŠ‹ŒŒŠˆ†‚{wsomkkkmptx|€„‡‰‹ŒŒŒ‹Š‰‡†…„ƒƒƒƒƒƒƒ‚~|zywvvvvvwxy{|~€‚‚‚‚ƒ„…‡ˆ‰Š‹‹‹Š‰ˆ…ƒ|xusqpopqsuxz}€‚„†‡‡‡‡†…„„„„„„…………„ƒ‚~|{yyxxyz|}€‚‚‚€~}|zzyz{|~€‚…‡Š‹ŒŒ‹Šˆ†ƒ~|zyxwwxyz|~€€~}}||||}~€‚„…†‡‡‡‡†…„ƒ‚‚€€€€€~}|{yxvutttuwy|‚…‡‰‹ŒŒ‹‰‡…ƒ€~}}}}}}|||{zzyyxxxyz{|~ƒ„…††††††††………„„„„ƒƒ‚€}zxvtsrrrsuwz}€ƒ†ˆŠŒŒŒ‹Šˆ†„‚€~~}}~~€€€~}|{zzzz{|}~€€‚‚‚‚‚‚‚ƒƒ„……………„ƒ‚€~}{zyxwwxyz|}€‚‚ƒƒ‚‚€€€‚ƒ„…………„ƒ‚€~}||{{{{{{{{{{zzz{|}~€ƒ…‡ˆŠŠ‹‹Š‰‡…ƒ}{zyyyyyz{||}}~~}}}|||}}~‚„…†ˆˆ‰‰‰ˆ‡†„‚~}|{{zzzzzzyyyzzz{{|~ƒ…‡ˆ‰ŠŠŠ‰ˆ‡…ƒ}|{zzzz{|}}~~~~}}}}}~~€‚ƒƒ„„„„„„ƒƒ‚‚‚€€€~}}|{{zzzzz{|}€‚ƒ„„…„„ƒƒ‚€€‚ƒƒƒƒ‚‚€~}|{zyyyzz{|}~€€‚‚‚ƒƒƒ„„……††††…„ƒ‚€~}{zyxxxxxyz{}~€‚‚‚‚‚‚‚‚ƒƒ„„……†………„‚€~|{zyxxxxxyz{|}~€‚ƒƒ„……††††††…„ƒ‚~}{zzyyzz{|}}~€€€€€€€‚ƒ„„………„„ƒ‚€~}|||||||}}}}}}}~~~€€‚ƒƒ„„„„„ƒƒ‚€~~~~~~€€€€€~}|{{{{{||}€‚ƒ„………………„ƒƒ‚‚€€~}}||{{{zz{{{|}~€‚‚ƒƒ„„„„ƒƒƒƒ‚‚‚‚‚‚‚‚€€~}|{zyyyyyz{|}~€‚ƒ„„………………„„ƒƒƒ‚‚€€~}||{zzzzz{||}~€‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚‚€€~}|{{zz{{{|}~€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€centerim-4.22.10/share/Makefile.in0000644000175000001440000003226011473011440013550 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = share DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(pkgdatadir)" DATA = $(pkgdata_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = online.wav email.wav sms.wav offline.wav msg.wav url.wav pkgdata_DATA = $(EXTRA_DIST) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu share/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu share/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgdataDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgdataDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-pkgdataDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/share/Makefile.am0000644000175000001440000000014311461606612013542 00000000000000EXTRA_DIST = online.wav email.wav sms.wav offline.wav msg.wav url.wav pkgdata_DATA = $(EXTRA_DIST) centerim-4.22.10/share/msg.wav0000644000175000001440000015334011461606612013023 00000000000000RIFFØÖWAVEfmt "VˆXdataLÖ ||µµ¢¢··æ æ ££¼»JJ$$ ( ('+&+:-:->.>.N.M.g-f-’+‘+Ø(×(X%X%E!D!ÝÝhh00sra `   ¤ ¤ úùÿÿŽ Ž { { — — · · µ µ uwæíÿÀö4×h éo <Y Á; ]$ ˜ïÌœjõGãPaÿ€ rüá-ù¶õÊþ9òÔùáîõÚë¢ðIéüìIç9êíåtè9å§ç&å½ç§åè¢æíéüç¤ë˜éƒíTë`ïíñóî­òòðô ókõTõ±öø"øûÏùXþ·ûØý Þ ÚR89lxÓWpÏKñzÚ£AZ­Øþ' ªý¤ ‘ü.ûãžúÉÌùè&ùG¸øåþ…øºýøÂü‘øäûŽøóú9øËùc÷GøæõböÄó(ôñ­ñîïÉêì¤çVêÏäièrâêæ«ààåußJåÌÞå›Þ0å½Þ~åßáåŽßDæþ߉æFà¤æEà’æèßGæ!ß»åñÝêädÜÖã’Ú€â™Øòà˜Ö>ß²ÔsÝÓ©Û¡Ñ÷Ù¡ÐoØ Ð*×åÏ1Ö$ЇշÐ3Õ”Ñ3Õ¢ÒÕÓÓÖÕìÖ]Öòל×!ÙÌØiÚèÙÆÛðÚ*ÝçÛ‘ÞÔÜ÷ßÇÝ\áÏÞÇâòß>ä5áÉå˜âjçä é³åëê_çãì1é<ïYë.òîÞõ{ñWú§õ…ÿ‡ú8òÿ3 ¦'e ÆãËØü1#dZ%Áy&&!ž&¥!ï%^!–$| Ã"6© ÊvmPFTnŽíŶì T¼é–j>Ï·Òp¾€ ; - Ö mø ÔDé Éÿ` “þA £ýŒ ðü6 oü, üY Ïû  ”ûä Vû û ¾ú¶ ]ú, îùjwù|ýøq…ø_øU«÷a>÷µöšòõ›ÜôgÿgóêýŽñüYïúßì«÷:ê)õŒçœòúä!ð¦âÛí­àåë'ß[ê$ÞJé«ÝÁè¼ÝÌèMÞpéT߬êÇàhìžâ…îÏäßðHçIóóéõ¹ì¹÷ï†ù@òûøôIü¨÷iýJútþÏüvÿ%ÿm4Xè+1ÙW]œD¦Çvû÷†ÖÞ²(¢ÿt¹þÔÿþQÿ’ýíþiý¤þ‡ýqþâýGþjþ þÿîý»ÿ¬ýeTý÷ÛüY.üh1û Òù6 øðþãõCýnóOûÍð:ù%î÷šë)õPéjóaçùñÝåâðËäð(ä®ïèãïøãï@ä£ï§äÐïåüïYåðfåð#åð…äÐïŠãsï>âóî¸àOîß‹í_ݯìÈÛÂëfÚÎêJÙÙé}Øñè Øèò×mç-Øáæ³Ø„æsÙXædÚ^æqÛ–æÜüæ­Ý‹çÇÞ>èÓßéÎàùé»áñêžâòë€ãôìkäúíeåïoæð‹ç-ñ¶è\òðéŸó4ëýô†ìöî„øâïýú>ò þ6õ¨ÌøÆðü= ~ÙH_ ™¦RÌaY¦ .";®"€"  !î5 L^PG"êãËÕÞ÷2OÐ⸭á­@Ý Â) H~ ©Á Âá xÙ ¾¦™SñT•pRŠ=à k3 çë ´ó ÌM #ñ£Ó6ãÇ ?7 ŽP ­E “ B£Á QZ~¡ÃÿÆûþò.þ Mý=Eü:ûù›þÕ÷óüäõûÉóù•ñðö]ïÒô0íËò!ëôð@éaïžç&îJæVíPåí¸ä2í‡äîíºä'ïTåÈðUæ³ò¸çÃôséÓöwëÅø¯í}úð÷û‘ò7ý+õNþÑ÷Iÿqú1òü;ÿà4ŸÉAëÀ‘½7x&ÏçÙ~®ôjT#ÿªîýÝücýû×ÿTû^ÿãúúþ¤ú«þ‹úlþ‡ú7þ†ú þ{úÙýYú ýúMýˆùÈü°øûû€÷ÕúöõRù$ôy÷ò^õðóûíÍðì–î“ê‘ì|éÕêìèqéìèkèyéÅçêsçæëjç‰í–çDïáçõð/è}òbèÃó`è¸ôèRõ„çŽõ¦æpõ‡åþô<äCôØâNóqá2ò!àñùÞÐï Þ°îcݱíÝßìöÜDì-Ýãë¤Ý¿ëQÞÓë$ßìà|ìáûìâƒí"ã îä“î åïòå”ïØæðÁç˜ð®è#ñ£é½ñœêsòœëGóžì?ô£í^õ¬î¯öÈïQøñ^úÌòêüùô÷ÿ¯÷xíúX¡þn ªŽà‰ 4i± ÏRH .× `¶ ïúî¹s.$kS\RœºZä6ìH+„ Ö ò# 6Z >m ô[ P&Wß“ WDh Ôº ˆ¤ „Ï ¼9 ໽•Õìîùêê¶‹\Þ^A¥åÔ$aÿS‘þ„§ý›—üWûWåùòþBø]ýwö¢ûôÎùòñ÷‹ðöîdô­ìÚòõêñyéœðFèðhçøïææ[ðÄæ3ñÿæpò‘çùózè²õ´é}÷7ë=ùùìÛúñîGüñ…ýtóœþðõ–ÿø}ûWý%ØÿãÓ‹s£{^¶¡Âv¡ëTãýVÉ´‹YÿSBþ£Rý“üsÿüúþ­û›þ}ûTþiû þaûýýZûâýCûÂýûˆýŽúýÊùjü´øfûP÷ú­õiøàó‰öò…ô@ðuò´îvðí¡î½ìíuì¹ë§ì¹êIí êHî©é‰ï‰éñð™é`òÃéºóìéêôýéßõâé‹ö‘éíöé÷:èÓöAçaö%æ¸õ÷äãôËãïó³âíò¿áèñüàñðuàð-àUï&àÂî\à\îËà&îmáî5â&îãLîä…î÷äÌîëåïÞæ~ïÏçêïÀècð²éëð¤êƒñ–ë*ò„ìâòoí±óTî™ô5ï›õðÃöôð%øùñÙù@ó÷ûèô…þ÷‚ ùá²ü…$M Ù®¨x îÄO¾eÄ#8çÄ!Íêc_ŸŸ¥Ã’ë‚,’•Ñ2L þ?) pä ´+ ÜV Î[ z? ÝúÄÞˆ™iAzè Å£ T‚ & 2Ó oL Ëø9Ð¥ÈÔ?âZåKÓ¤²T/æ“_èÅ4zo¸ÿ³àþáêýòÎü݇û¢ú@ÿ|ø¸ý¾öüãôdúõò±øñ ÷ï†õOí2ô±ë&óOêrò9é$òuèCò èËòùç´ó=èéôÑèUö°éÞ÷Òêmù4ìéúÎíCüŸïvý§ñˆþãó€ÿHödÇø=MûÁýÓ‡ $¸¤ÿÿ×0=68Ò¿L(º ÜP­ˆÿ‘þ¹ýdÿýÙþ•ünþDü!þüñýûû×ýéûÈýÈû´ýƒû‚ýûý@úsü6ù~ûé÷=úiö¸øÏô÷:ó,õÊñNó›ð~ñÃïÐïOïWîBïí™ï)ìCð}ë/ñëFòßêpóÒê–ôØê¤õÝêˆöÌê6÷˜ê¨÷9êÝ÷­é×÷õè›÷è.÷)ç˜ö/æáõ9åõVä:ô”ã`óûâò–âÐñjâ,ñvâ¤ð´â7ð"ãåïµãªïiä…ï3åtïæzïòæ”ïßçÅïÔè ðËénðÅêçð¿ëwñµìò¤í×ò‹î£ófï‚ô7ðuõþðƒöÂñ¼÷šò7ù¡ó ûôôFý«öçÿÐøéeû:_þ¾ ¦U !Ý®1* /p¹e¸ñêà òÁ™JݧîòëBîª 7S÷Õé ƒMŸ¡ Íð ô+ ûH ÒD o! Îïõ¼ï›Ê˜Îj 7N ÙQ ³{ ¾Ô îZ 9 åÞÙ#ÞPå]ãHÏ£¹^Dü¹„ûva¿¸õÿ÷ÿþÒüøxû²õùKÿLøÈý‚ö4üŸô›ú²ò ùÊð÷öîBöIí2õÐëpô˜êô­éüóéOôÍèøôÙèêõ1é÷Ðé[ø­ê²ùÄëûí<üîZýIð^þ:òMÿ_ô-±öùדû¢úýb77§ç9q#›¤š½nzæœý?ômÑ’µº°ÿôÿÊþDÿ þ´þuýFþýýý½üÑý‹ü¿ýcü·ý/ü¥ýÙûsýRûýúlüù‚ûaøUú÷ìø»õW÷xô¥õ`óìó…ò?òõñ°ð¶ñLïÅñ!îò2í´òìuóìRô²ë7õëö_ëÚö<ë|÷ ëô÷Äê=ø^êWøØéCø5éø}è¤÷µç"÷êæ‰ö&æÝõxå(õåäqôtä¾ó/äóäyò(äêñeäjñËäùðRåšðöåOð±æð€çðbèðQé$ðJêdðMëÆðOìDñLíÝñBîŽò*ïUóð,ôÏðõŒñö?ò*÷öòuøËóúÙôòû6ö<þô÷äúâ¤ü$†ÿ ©ÿ ÷XO t’ 6¢…fNɈ¹3*Röˆ.‚³g/†œ”§˜ÔD)¯ iJPŠSÏ ] \0 >9 õ) | ÓâÆÀßõ (ë ¢õ M %e %Ö Bn u+ ° ëüû9ý?ö*àù´­pIЩF*¨—ôî"(/ÿBþ9Ïü^ûÂÃù\ÿøáý)ö]ü>ôÛúSòlùwð"øºî ÷*í<öÓë·õÂê…õûé¦õƒéöYéÄöyé«÷ßé·øƒêØù[ëýúdìüœíý ïþ®ðöþŒòÑÿŸô¦Ýöz7ùKšûòýÔ'&݈?Ö@üàôÁ`•Óæ PlïÛŸÒÑÿáÿÿÿþ_þ"þÔýÛýjý´ýý£ýÍü—ýtü}ýÿû?ý`ûÑü”ú'ü¡ù?û“øú|÷ÊønöQ÷{õÁõ±ô.ôô¦òÂó8ñ¦óñïÄó×îôîí‘ô3í(õ£ìÐõ6ì{öâë÷›ëª÷Vëø ëkø¯ê—øAêŸøÀéƒø.éJø‘èô÷ðç†÷Nç÷¶æuö1æÜõÄå>õuåœôIåúóAåYó_å¼ò å'òæŸñ…æ'ñ#çÆðÜçð°è[ð˜éUðêsðë´ðìñŽí˜ñ‡î7òrïîòMð¹óñ•ôÓñ‚õò†ö)ó²÷çóùÏôÏú÷õÜüs÷DÿMù…û þEì™ ùç  G íS q*ƒ´Þ&š°Ý½¤Z÷šâ{MØëz= p´»x)bÁo‚˜bÏSA* > Þ? x1 ê 6 atzD ˜Ž ¯ ·ì €K iÌ nq …9 § Ë ê ý  ðôÉÌŒ‘;@ÖÜZcÄÑ#2R.ÿ_ùýG”üûºGùRÿn÷Üý‚õfü“óû®ñÂùãï¯ø>î×÷ÏìC÷žë÷ö³êñöê1÷¹é®÷«é]øßé1ùSêúüêûÓëüØìïü îÌýsï þñpÿéò=òô #÷ßnù¯Áûy þ72â(rÝâE,TJ9`øc†èŠ%ÈGáZâlۉ׼ÿâ ÿ€þFÿþ¤þÔý þ­ý®ý—ý@ýýÇüUý8ü ýûŽüÎúàûùùûúùãù@ø ør÷>÷¼öËõ'öSô¹õçòxõ‘ñ`õYðqõDï¦õTîøõ‹í]öäìÍö[ìA÷èë­÷…ë ø(ëYøÊêŽøiê©øêªøé’øébø“èøèÆ÷—ç]÷%ççöÃæcöxæÒõFæ7õ0æ”ô9æìó_æG󦿧òçò–ç•ñ;è-ñûèâðÒé¸ð»ê°ð°ëÍð«ì ñ¦ípñœîòñ†ïòbðDó-ñ ôçñèô‘òÖõ3óäöàó$ø©ô¤ù§õuûêöšýølúØ­üÚ8ÿ 1 ðPóAí íÉ ?n'ǜ˜Sv6)èuFf^C„Ý»*l|+âdñûÑ3dN/a çf „c W ]J œEÆJßeó ™ í0 bj øÁ ¯5 ‚É o} nN {6 Ž/ ¡. ¯. ²' § ía¶"lÎ_˜ÐS3|ÿƒÒýeSü*©úÖÛøuÿööþõºüó~û>ñiúƒï†ùôíÜøœìoø„ëAø¯êMø!ê‘øÙéùÕé¡ùêVúƒêû*ëåûüë­üûìoý*î.þïíþ(ñ°ÿ÷òxöôF÷Zùê¡û·ßýw$ô´°##hG~b޵”ì*‹<ÃMÜ`æ€ê¸ÿõ ÿƒþ>þ†ÿÔýâþ¤ýJþ|ý³ýNýý ýsü¥üÄûü ûZûQúqú—ù_ùæø,øCøàöµ÷‰õB÷2ôìöâòµö£ñ›ö|ð öqï¾öƒîðö²í0÷ÿìz÷fìÆ÷âëønëNøëø˜ê¤ø0ê´øÆé±ø[雸îèsøè;øèó÷·ç›÷bç0÷ç´öìæ(öÑæõÐæíôëæDô"çžóvçýòêçkòzèìñ'é†ñëé=ñÄêñ«ëñ›ì+ñŽíiñ|îÈñcïDò=ðÚò ñˆóÄñJôpòõóöµó+÷nôøOõúiöÿûÊ÷8þzù¼yûÁýrI~ Š Ø·Jˆ Ï5§ÑÌ9™3Ãí«»ó:îv­€@g¹9(˜Ð­¬™T” –Æ™}›&˜ ¹ 4€ •q Üe a5jS‡r ½› Õ z$  ¯ t¸ Pz @U ?C H? T? _@ d7 `% Q 2ѵ1H¹±!ëfñÿ†¿þƒXý_Ãû"ú×/øˆÿHöBþ]ôýòüºðûï^ú¦íØùlìˆùnëlù²êù9êÁùê'úê©úHê>û¼êÞû`ë‚ü0ì'ý/íÏý`î~þÅï3ÿ`ñóÿ-óº%õ@÷dpù9¨ûÕýÈéÿpÓù‰\þ’+— h™ Ü~×Ë“üm3¤PÄ{Ù¿ÿíÿ›þ37þkìý³ÿ°ýÿuýXþ0ý°ýÔü ýYü`ü»û¹ûõúû úpúÿø×ùÙ÷Iù¡öËøaõ_øô øâòÉ÷²ñŸ÷”ðŒ÷ŒïŒ÷œî÷Èí»÷ íá÷iì øÚë:øYëbøåê„øyêœøê©ø¯é¨øN陸òè}øšèQøIèøèÁ÷Èç\÷žçäö„ç[ö~çÅõŽç%õ¹çƒôþçãóaèJóàèÁòyéKò+êîñðê¬ñÅëˆñ¤ì„ñ‡í¢ñjîßñIï9òð­òäð:óœñÝóGò•ôçòhõ†óbö5ôŽ÷õùøö«ú@÷¨üÁøíþ‹úo›ü(êþmì Ñ Îœ… 9% —š¨Óbý^µ¢M‹‹ufmr?Ÿí§„˜~¤b>Jä:’.D(ñ"“# Ÿü è OÓ Š ´¶Ö·ö É ðK /Ž ‰ç \ ”ë B— ` é= Ø- Õ) Ü+ æ- ð( ô ð ÞÕ¶–o=Ä`)Œj„ÿˆDþ…Óüg9û;~ù­÷ÚÿÒõºþûó²ý3òÉü†ðüþîjû¤íüú€ì¸ú–ëžúéê¬úyêÛúEê'ûKêˆû‡êøûôêqü’ëñü^ìyý\í þîªþóïWÿ‹ñSóÚBõ¬R÷„sùZšû'¹ýãÀÿ… Q[É„ý~ëGãíV¨ä≠3T_Ž—¶æÿÙNÿüÏþ'iþ\þœÅýêÿsý?ÿýšþ ü÷ýüVý_û·üŽúü¡ùû™øëú}÷\úRöÙùõcùçóüø¶ò¥øŽñ`øuð-øpï ø€îú÷©íö÷êìþ÷Aìø­ë#ø)ë;ø³êQøHêdøæépø‹étø7énøìèYø©è4ønèý÷>è²÷èT÷èåöúçeöèÚõ*èIõgè¶ô¾è&ô.éžó·é#óWêºò ëhòÎë/òìòpíòEî)òï^òáï­ò£ðóWñ“óò'ôžòÖô:óªõàó©öŸôá÷…õXùŸöûö÷ýŽùPÿiûÄýeÐÿ"Eê ת oSý Òo µÀψ/60çD¢Ró ¥ûýÈ,A1BÝ;Œ/<!ë“/ï»Ô2³“ àh @ F iýˆí© íÔ  .X u» Ú9 \Ò ú… ³S „6 j' a$ e& n( |& ‡ Š ~ÝV  F’Íê3 vþþš½ý¤NüºúŒ ùzL÷o†õuÿÅóþòÃý}ðý ïŒüÂí#ü«ìÜûÈë·ûë²û­êÆûrêñûnê/üêyüüêÏüë0ýSì¡ýLí"þyîµþÙï[ÿlñ+óØõª÷ƒ+ùWFû!Zý×Zÿp7æì5lW¯L³sµñ0.Ž/Öù•I …`Í¢%דÿ ÿ?£þz<þ½ÖýgýXèü¯ÿVüÿ«û]þçúµý úýùgü øÆûñö*ûËõ•ú ô úróùKò#ù.ñÇøð{ø!ïAø9îøhíþ÷­ìñ÷ìï÷vë÷÷óêøêøê&øÃé1øré4ø*é-øëèø³èò÷…è¼÷bèv÷Lè÷Dè»öOèJöpèÑõ¥èTõóèÖôYé\ôÖéëójê…óë/óÀëëò~ì¼òAí¢òî òÌîµòŒïâòFð%óõð~óšñëó7òrôÏòõoóéõ ôêöñô#øîõ›ù!÷RûøGý:úvÿ!üÕ=þ[ƒûç£ ^H Ò×9 B }žz†51£—ù“•1M”BÆùÒ|ÀÕš f.+=é>Ÿ2Hàÿi×ݦ=n‰/Âí îª l *6 Gj ø— ø× + I—  ¾ ¢x OH - õ è è ò   þúØÉ™r?ñÇA0aÿ|Qþ¯ýвûæ0úõ–øïöEõ@Ÿóvÿ òÀþð!þ/ïýøí3ýíìäüì¯ühë’üòêŒü¯ê˜üžê³ü¿êÝüëýšë`ýVìÀýHí5þnî¿þÇïaÿQñóÚàôªÔö}ÛøJèú ïü´åþB¼®póõE[Ò3yÎ.oRÊBfœµ zqÑæÿ#dÿqéþ¿pþñý`iý¯Ñüþ$üKcû•ÿŒúÝþ ù!þ øeýŽ÷«üpöõûKõFûô¡ú÷ò úÕñù½ð ùµï¤øÀîPøàíøíá÷aìÃ÷Ãë´÷8ë°÷¾êµ÷Tê½÷öéÇ÷¤éÌ÷]éÉ÷ é½÷ëè¦÷Àè‚÷ŸèP÷‹è÷…èÊöèwö®èöâèºõ+éWõ‰éóôúé”ô~ê;ôëëó´ë¦ó_ìqóíJóÆí6ó|î4ó/ïEóÞïió…ðŸó%ñéó½ñJôQòÆôéògõ’ó6öVô5÷?õnøWöàù£÷û(ùwýäú“ÿÔüÚîþF'ÉvV ÎÞ !Ua ®„ Ý~ØH–Ú1GJ3(ØÍ7BVŒ9²è½m²Í–l:5NîO”?'¤ê ©_\Ì« îN õ ¤ :`] 0Œ Ì " 5 r е Lm è; ¡ s Z RþUþ[ü_ôVÞ6¶üwœ­gÿ"‹þ€…ýÍZü û@¦ùq,ø¢¥ö×õ˜ó^ ò¸ÿ¾ð"ÿwïŸþRî/þTíÔýìýÕëYýZë8ýë'ýðê$ýë3ýKëUýÈëŽýzìÝýbíHþ~îËþÍïeÿIñïòѸô—šö^Žø‡úÑ}ünfþð5Tä•k³Ã¬æ‚Ó8ˆÑSLÄa*I ð´WGÇÌ?F½ÿ·;ÿ!³þ„$þá†ý6Ùü‚üÆHûbú7iùgÿ^ø“þD÷½ý!öéü÷ôüÌóXû¤ò ú…ñ÷ùrð^ùpïÛø‚îløªíøèìÊ÷<ì•÷¤ër÷ ë]÷­êQ÷KêK÷öéG÷­éB÷qé9÷?é)÷é÷úèööéèÑöêè£öùèoöé4öKéôõé°õåéiõKê$õÂêàôEë ôÔëgômì5ô í ô­íñóQîâóôîàó”ïíó0ðôÆð4ôVñpôãñÅôtò8õóÐõÄó”ö˜ô‹÷–õ·øÀöúø·û°ù‡ýpû‰ÿ\ý³iÿþŽaÄÏý; -š L áO -ýàÀaH­‘Ù¥_WåÜ.:?w›Õ§e ÑˆZK^½UM3Äû%¯pT¨êÑxï  & 5ÉX ~ˆ JÊ 1 6Œ [ ¡® a * 4 õìËß²Ú¥ÖœÒÇy¯Oˆ M¬ÿþ(ÿœ€þ&´ýŸÄü ´ûh‡ú¾Bùì÷]‹ö­'õÿÆóYnòº'ñ'öï¢ÿáî+ÿìíÁþígþoìþëëàý’ë²ýfë”ýjë‰ý ë•ý ì¸ý¬ì÷ýíQþ‰îÅþÂïPÿ'ñïÿµòšeôN.ö ø²îùVÒûç¬ýdtÿÅ©- 3@Då—µ3$¿f@€»{2[¬$'Ú¢ÿ–úþ Wþl¦ýÀåüü=(ûg/ú…$ùš ø«ÿéö¸þ¾õÇý‘ôÛügóøûAò"û'ñ[úð§ù ïù:î}øiíø®ìª÷ì^÷vë$÷ùêøöŒê×ö/ê¾öáéªö é—öké†öDévö*éböéKöé2ö.éöMéöõ}éÔõ½é®õ ê‡õjê_õÖê7õMëõÏëêôXìÈôçì¬ô{í”ôî…ô¨î~ô<ï€ôÍïŒô[ð¢ôãðÄôjñ÷ôññ@õƒò¦õ&ó2öäóéöÅôÏ÷Îõèø÷6úiø¸ûúùlýµûOÿ’ýWÿ‚šÄµÑe æ¯ ë ç× ¤ ûJÇÄ`Á/éÖ㊀ùOTg’S¸Åª¹”^T€û€‡^øOÅ‘WÂÛäTýÉ @ (¾ AI e æ— šÚ j0 Vœ d “º ãj T. â ‰åGÒÆóÿ½Õÿ³³ÿ¥Œÿ‹Tÿg ÿ4¦þò(þ¡‹ýAÐüÓøûZûÕùùFÙø±ª÷oöy0õÜòó?ºò§ñuðŠqï †î–ÿ¹í+ÿ íËþƒìyþì5þçëþÜëäýìÞý^ìòýíì"þ®ílþ¡îÐþÂïIÿñÔÿ€òjô Áõ«÷HLùÝûbáü×›þ5?{ȧ0¹q¯‰uU8 ѱEK˜ÞÍkèõé{Ñû sWâÿöCÿ|”þëÓýBýƒü± ûËú×ýø×Ø÷ΫöÃÿyõ¶þGô®ýó®üõñºûÛðÖúÒïúÛîHùùí¢ø,íøtì”÷Óë*÷EëÓöÌê‹ödêPö ê"öÇéûõéÛõeéÁõIéªõ;é˜õ=éˆõLézõlénõ™écõÖéXõ êNõwêBõÛê7õHë-õ¿ë"õ>ìõÂìõHí õÑíõZîõãîõjïõíïõnð0õìðMõkñxõòñºõ‡òö4óöýóI÷êô#øö,ù=÷hú¥øÔû2únýåû5ÿ¶ý Ÿÿ+—M›~ µ œè Œ f $ ¿Ý5ƒó¨5¤Dy!+Ì»G-“„°¿žÞ^áïÇOŽ…6’Ãz6?èÔyõ+eFÍ[4 q  ‹ ® Þ : îo ÀÖ ±R Áä ñ‰ ?A ª /áÌÿÃ{ÿ­7ÿûþ‹Âþx…þ_>þ?êýƒýâý£uüXÌû ûœ5ú/JùµNø5D÷¬1öõÿóùëòfÝñÕÝðGïïÁïAQîÌÿ©í^ÿ!íüþ»ì¨þ}ìfþkì9þ‡ì&þÔì+þRíKþî„þÜîÕþãï:ÿñ°ÿhò2Ýó»kõJ ÷Ö»ø]oúÙ üGÈý¤bÿîã"K?•F½8Īân Rú š\ 5‘ Ũ KŸ Äx 11 ŒÿËÔþFþ¥*ýè7ü3û(ú)ýøÒ÷¡öçnõÉÿ;ô¬þ ó•ýéñŠüÒðŒûÌï úØîÈùúíù0íQø|ì´÷ßë+÷Wë³öâêLöêöõ-ê­õìéqõ»éAõšéõˆéþô†éêô”éÞô°éØôÚéØôêÝôXêæôªêòôëÿôkë õØëõJì)õÂì7õ<íEõ¸íSõ5î_õ²îmõ-ï{õ¦ï‰õð™õ’ð«õñÅõñíõò*öòƒöMóûöô›÷ õføö]ùW÷‚úµøÔû6úQý×û÷þ“ýÁfÿ©Fª1ºÔí ãþ ¯ a éø ¶mb¿çîBørßw¥MLöÔp?¸‹Î·±Æbµá„/5QÉJA Îêd"åMTmº‰¤ Ãë è c  ïY ‘© M %„  )« VZ ž å{ÿ½ ÿž¥þ…Nþrüý_ªýJUý2øüüîü¾‘û…ùúAPúò•ù˜Éø3ð÷à ÷LöË*õD3ô¹?ó,PòœiñðƒÄïû ï{kîåí”ÿ}í4ÿ;íäþ!í©þ0í†þmíyþ×í…þmî¨þ/ïáþð-ÿ*ñŠÿ\òôÿ®óeõÝ•öW!øÎ·ù?Mû¦ÞüfþMßÿˆC°•ÆÎÊï½÷ åv¹?tþ ²” \ö ù7 ˆU M r" ËÿÒ ÿ` >þËXý^üHTû^<ú_ùNå÷0±ö |õÞIô´ÿóŽþüñoýèð]üäïWûóîcúîùOí­øìî÷þëA÷uë©öþê"öšê­õIêIõ êöôÝé²ôÀé~ôµéWôºé<ôÎé0ôòé.ô%ê5ôcêFô®ê\ôëyô]ë™ôÁë»ô*ìßô—ìõí'õ{íJõïímõbîŒõÕî©õGïÃõ¶ïÚõ%ððõ”ðöñ&öñQöòö£òéöVóa÷'ôû÷õ¾ø(ö¨ù\÷»ú±øøû%ú]ý¶ûçþ`ýÿWè6½&–j 6 ó œ Þ- ¦¡Tøä.RF›=¾¸Ò‡p(ð˜Qדᳶ³W“ÇSõ{çÉ=n€ú²pØÚù< 9 _q îË ~ !r Üß °^ ï ¤ ÆA  UÿÏ»þ¨3þ‰¹ýpGý\ÜüHrü4ü’ûüûוú©úqjù.Ãøàø‡R÷#‹öµ½õ>êô¿ô;?ó±mò%¡ñ—ßð (ð€‚ïúîîzrîîŸÿÑíGÿ¶íÿÀíÒþôí·þPî±þÕîÂþïçþSðÿHñfÿ]ò»ÿóÙô€6öë£÷Uù½•úüw‰ýÆùþ]8µ[þn5qZgiQc.Eÿ Å´ {; "ž ·Û 8ñ ¥ß ýÿ¥ ?ÿF kþà €ý ƒü[uûzXú/ùsþ÷VÉö-”õüaôÊ7óšÿòmþñHýÿï,üïû/îúeí-ù¯ìOøì÷ëÈöë!ö£êŽõQêõê¢ôèéJôÑéôÌéÐó×é¬óñé—óê‘óOê—óê©óÙêÅó-ëéó‡ëôçëAôLìsô´ì¥ôíØô‰í õöí;õbîhõÍî‘õ8ïµõ¡ïÓõ ððõtðöäð4ö^ñföæñªöƒò÷6ó~÷ôøòôÓøüõµù&÷¼úoøèûÖù9ýWû¬þîü=›þêS­ß`¥D d(   º ÝI ¢À Tî^l‚ÊŠwE öÍŠ]ü»N䀨—~#L~û§‹¥€b9®Öì^ÕJAqªš Æ ù ô 7 w Ù ­@ g¸ 6@ ×  14 aÿø¤þÈùý£]ý†ÎüoIü[ÉûHKû3ÏúPúüÌù×Cùª³ørø1}÷ä×ö+ö+zõ¿ÆôKôÐXóN£òÈôñ?Kñµªð,ð¥’ï$#ï¬Íî?“îáÿxî’ÿîUÿªî*ÿùîÿmïÿðÿ¹ð<ÿñkÿƒò¨ÿ‘óðÿµô>íõ•3÷î†øGâùBûî¥ü8þxfÿ®¼Ø õRŠ ´ËöÌÚ´¯~ u) +° Í \N ×h Ah ¥ÿT ÿA yþ Pþ› ÿƒ°Ïp Bå º £V Ö[Oû"8 žÿt üóíøê9öwôšþšòBý¢ñUüñµûÙð?ûÍðÛúÙðsúûðéù7ñùiñÑ÷`ñöûðÕóðBñŒîƒî£ìÊëdêOé è=çÊå¹åÚãÓädâä‡áàäKá®å¨á׿‡â>èËãËé]åë5çkíXéƒï¹ë·ñ9îåó²ðâõòòŒ÷ÇôÆø ö†ù¯öÒù¶öÂù?öwù|õù¢ôÒøíó¿ø§óöøôù*õ`úñöû-ù¿ü|ûÞý’ý«þÿÿÕÿ ÿÝÿ¾þWÿRþˆþöý´ýÓýýþÏü”þðü|ÿpý¦5þôÿE xÒrh#½ÊŽ“Uâ^EuÿcþÌ1ýêûB™úˆPùÖ#ø-&÷ŽÿgöõþòõeþËõçýõõ‚ýiöQý$÷‘ý0øþÁùdüV`ÿ*€Å FÜV ìJŽ»GXÄ îø!jÖ!Ù‰ aS;€¡bÒAþWMÅÒ“ œ -´ ¨´Ý…× !È —çþk‰ûv:ù$÷0Mõ°·óe\ò ;ñµKð Šïýúîì`î÷9î¿î:°íc1í@ˆìÞýÇëOûë³øiê6öêôê9ò~êþðQëbð„ìgð îñÌï!ò·ñ¢óºórõÔõ•÷øúˆúùüý¤ÿEó<Ô´i ­- {ê Ž­ šçÆþÕxü¦þCúŽûEø¸øö@öõ*ôÓóaòŒò­ð ñÒî,ï§ìÞì'ê4êkçPç äcäýá á°ß2ßÕÝ9Ý{ÜÅÛ ÛÔÚ+ÛTÚûÚ.ÚöÚIÚûÚˆÚøÚÚÚàÚ0Û­Ú„Û]ÚØÛñÙ<ÜqÙËÜãØ¢ÝVØÖÞÔ×pàd×{â×ñäÛÖ¾çÊÖÆêíÖâíH×èðä׳óÂØ%ößÙ1ø9ÛÖùÈÜ"ûÞKü«à£ýTãyÿ¶æûÙê-£ïãÔôØ ú½&ÿ@¢"]77 x- óT ÐÒ DÙ … ÇK 3 ä ã' c _Ž  •` f ì ÿ z “j,Îߌ¬~v…HÍçtˆ\¯0e߬HUÜúÅ9I zÌ u b ^ ÿ]¾±AáhÿPÿþûýeýÜü;ýíûý%ûVþˆú‹ÿ&ú4úTFúÒ¶ú…;û5 ¥û¤ Æû•uû×—úJ'ùì6÷Íéôkòö ìï¦ –íY‰ë9Øée‡èéŠç»¾æ»ÿðå´þïä{ý¡ãýûâ=úàWøÞqöܲôNÚ9óÐØò·×Kñ ×ÎðÏÖððÖsð]×fðØRðÉØ+ð§Ùëï”ÚŽï‹Ûï†Üxî•ÝÍíÌÞ íEà~ìâñë]ä~ëç+ëEêþêÆíûêwñ)ë.õˆëÀøì üèìúþàíƒï®Wð–äñzÐó¥ IöM `ù‰ ýGUTil 0 `"Á$J7&‘À&óu&†}%o$ØA"î[ Þ sÆ Ÿ¹ßµ¦5~ 6Øáýd ûÑ  ù3 ø˜õökö¬_ör»ökÿY÷šýøÿû½øšúAùhù…ùdø‚ùŒ÷6ùÔö§ø%öÑ÷cõ«öuô5õWótóòuñºðMïfïí.îèê#íìèOì?ç·ëüå[ë5å9ëõäJë9åˆëúåìë1çrìÚè(íöêîíNïcðÀðƒóVò®öíó±ùXõWüjörþ÷âÿ÷™œö¤Àõ¦ô)ÿxóûýdòÃüŽñ®ûñÛú÷ð]úBñ7úÝñXú ò›ú[óÚúìóúú>ôíúQô¿ú7ô…úô[úäó\úèó–ú'ôû®ôÀû|õšüˆöŠýÀ÷vþ ùLÿ]úúÿ™ûp±ü¨ýœXþMåþÇÿOÿÿ®ÿFþ mýÊ”üÁÂûÿú“SúFÃùýXù” ùæ ýøà ùr Tù  Êùz zú/ }û üüD ÿ Èzi£«_ ÷ú6™â‹ÞÌb£g…ýáNÛ}˜¯5úÈgYè ág QÍ   Õ 2 >^<ú8ý?þvYüd–ú·ýøT˜÷jöásõ޵ô +ô7 Óó ¤ó»ó xó Có¸äò]ò%¾ññÁý‰ðyûðJù×ïV÷Êï·õöï…ôZðÐóòðžó½ñíó³òÁôÓóö õÜ÷«öú|øºüúŸÿÎü˜ÿsFøô h< ¸ c ]J *—UÑÿÐþ.Fü›þ»ú.ükùøùNøú÷P÷%öGö]ôõˆò™ó™ðØñ–îÛï’ì¶í¥ê‹ëëèxéuçšçNææxåÁäèäÖãä9ã]äàâ;ä»âä¹âèãÎâœãñâ1ãã¤âDãöávã9áºãyà/äÇß÷ä/ß*æ¹ÞÕçfÞîé;Þ^ì=ÞïmÞ³ñËÞIôXߤöà¬øáVú#â¤ûwã²ü åºýþæüþré©sìÝûï•éó®øî 6ü!å£2™çíþš †­ ™= [g îL v ± ÈX ¡ ‡¦ e: ,¿ Ø> lÕî fÁÙH Q9 Ù u. ,ÿÿÙë›í&cA7»DÏ-rÖ -X0¥ì •r =Ø ¸ . % ‡¤ïUkV»º–ÿñþ„ÿÕþ™þBÿÑý2?ý¢òü†óüÆ8ý>°ý¿ 7þ  þ¿þ›rþy§ý¨]ü*¤ú›øweöŠ (ôo òNðEqîfí»öë@÷êâÿõé‰þØè&ý“ç³û%æ;úšäÍøã€÷‡ábö/à~õßÚôFÞoôÈÝ2ô˜Ýô®ÝôýÝìóxÞÃóß{ó¿ß óuàqò2á´ñöáßðÌâðÇã0ïÿävîæÜí†èkíâê$í–í íˆðí™óXí«öÁíœùVîTüïÂþðáñ¿cò‚öóaïõŠ^ø DûŒþnëžY { $•. {Š!²7":F"!Ï!}ñ iÍþT „ ±ž 4£œ”ÝsõLã5ÿ´Jým­û túÓ ­ùšYù~lùˆÐùÁjú)ûÅþÅûýQü‚ü­üœûÎüÔú­üúAüQù€ûmøgúd÷øø<ö@÷üôNõµó7óxòñSñïQðízï}ëÒî9êZîdéîé÷íAéîê:îCëžîí@ï-ï'ð·ñQñ€ô¯ò`÷&ô-ú“õ½üÑöçþ¿÷ŒKø›føøñz÷X¡öd­õ;ÿ¿ôýýôóÈü`ó¶ûó×úó4ú*óÂùeópù›ó-ùºóîø½ó¶ø¦ó‰ø€óvø^óŠøPóÎøhóFù±óìù0ô¹úäôžûÆõ‰üÊöhýä÷(þù·þú ÿûÿüõþÎü–þ„ýþ4þpýðþÊüÇÿ)üÇ”ûùûY§úÚSúhúìþùP ú &úg tú êúX Šû~ eü¥ •ý 4ÿ´ KÑÕN¼× ôü Èû_©“åL—|²):d=BËàùVܽŠ'“Žø íO 6Ž q µ­ Ç Ð“Ùrñµ$ÿ`yýmúûЫúp‘ù2ªøúõ÷®m÷8 ÷‹ ÍöŸ ¡öh uöÝ7öõÜõ±_õÄô;ô*aóüþ¸òËü'ò±ú¼ñÌøñ5÷vñö£ñMõò õ—ò…õ[ótöQôæ÷…õÏùþöüºø¹þ¬úwµü0·þ·‹áˆ 1’ Ôï ôŸ ›® ×5 ÁSw(ÿÔ³ýrcüþ0ûéûú×ùùøâ÷Ð÷ÿõ†ö&ôõWòó™ðÎñøîðƒí_îEìÆìDëWëƒê êüé%é£écèkéÚçDé€çéKçÙè0ç{è'çõç)çJç7çæYç£åšçÀäèêã¦è*ã‚éâ¡êâìÑá¢í±ánï»áWñïáGóOâ+õÞâðöžã‰øŒäîù¥å*ûîæ]ü}èµýjêSÿÄìIŽïš»ò4,öú½ùÉ Dý{˜æ–î$…3¢¼ LÆ ‘Z ‡ˆ Hg ë …Š ö ¸T C£»ê3cŽÓâl‹àtzµ:< ñ (´ LmƒÈYjK#nxfZ%Ç¢ÀØ OÎ …Œ y & B ¬ý/ƾºeù+½%e[•¹ÿEHÿoÿÿû]ÿ.Åÿy 9¸  Áàqà©SÞÿgÏþèhýã»ûpÞù¨ ê÷¦ öõ‡ ôgaò\Ððs]ï«÷íÿÿìfþ ëÞü¥égû&è ú¬æÙøFåÕ÷ä÷ëâoö â öjáÒõá·õÜà¨õçà–õámõvá#õéá°ôsâôãWóËã~ò¨ä™ñ¬å·ðÞææï;è2ïÇé î‚ë7îmí÷íïßíµñóíô3îPö¢î—øAïÊúðÞüñÔþ&ò½}ó¿"õø%÷uù8 Nü7 UÿZ€‚«®Zc Ä« ¶s!¬ V[ r> ¾5ðëŽ ¾ë l# ò>MD|?€?f\:²þTýñ Süò ¹û€ûoŸûðüŸšüvFýqñý‰‡þ»ÿ÷þýþ4ÿBþ.ÿýÖþ¦ü$þ®ûýú¯ûKùÿùæ÷ønö öóôïóˆóâñ<òþïñbî5ð(í‰ïiìï.ìäîyìèîEí%ïˆî§ï9ðhðHòfñŸôò÷Ñó¦ùõüDö=þJ÷ømšøKÐø¨¹ø‡]øúÌ÷÷êÿSö›þ˜õAýóôõûqôÌú ôÊù»óðøsó6ø*ó™÷Þò÷ò¶öEòzö òmöèñ”öèññöò÷lò9øóòù¤óôùyôÒúgõ˜ûgö8ük÷¨üoøãütùêü}úÂüûwü¤üüÃý¦ûåþ8ûÔú'~úI:ún ú’òùµóùÐúÛ\úÑÅú© Oûa ÷û Åü« Ðýw ,ÿv ãµû1iݦá pª !O›¬Âª„6ÖE¶Ñ+áC~¹¨©boî¦Y¿ª¹ ê ˜ % e n 0Ý ‰‚#Ö}ÿˆþ‘âüæëûs(û%’úä"ú˜Îù2 ’ù¢ fù× :ùÁ ÿøS «ø‡1ø^Ž÷áÃöØõ'ÝôãóøýóôûDò&ú¼ñ®øsñ¥÷lñ÷¨ñ ÷%ò€÷äòmøæóÊù-õû°ö¡ý`øíÿ-úQÿû«¿ýÖWÿ³³& Ä ~~ ÚW Ö§ y{ ÑæîãÿåÁþ³—ýƒÿhü^ý0ûLûéùMùøc÷$÷õ«õÖó+ôDò¯òßðCñ°ïòï½îÆîîÃíˆíîì5íEìíÇëÜìnë²ì0ëyì ë$ìûê®ëëë,ëcêqë™éÕëÅèWìñçòì*çŸíxæ[îâå%ïlåýïåèðëäçñéäøòåôqåGõüåzö³æ¬÷“çáø˜è+úÔéœûYëGý7í3ÿqï`òÆÜôTå÷ôýúŒ þà>r(©´tØÊ”ª ñ þ6 Ì kš è D_}•Ê‘ôy'ZxDúG Át ÛÕ On ? 4D t  Æ ³ - O ¢ Õ  5Ž Xí /&¥+²í Oe ‚• U Ø 4  Á; =P¿~Vâ—ÿ° 6v*ŠÈÿQÄÿ}öÿþRÂб ]­ ç˜ \R©ÀÂÌ™c&}fZ: ÿð†ýPÙûo úk Qø\öUÑô_ózWñ¬™ïõþÞíVý,ìÙûŽêƒú é^ù°çoø„æ¹÷‹å8÷ÊäåöAä²öîãöÉãoöÎãDö÷ãöFä£õºä%õUåŠôæÖóùæóúçIòé…ñ?êÏðuë1ð³ì¯ïöíMïCï ïžð÷î òïóRï$õÅïÌöaðø ñBúòüóþ_ôBúõ®ë÷Y1ú<ÀüH …ÿie„BþCy ´œ ¾QQ‰h?w+8ì–W¤xp O án 7µVåK '>ýŽÞÜ åþ þk ýRýÚoýáÌýUþdøþСÿN<×»_ Ö+ÓR5Eÿ>ÿýýòý€ü_üØú’úù¡øF÷¦ö†õÁôçóó|ò¦ñPñžðmðþïÓïËï„ïðï¦ðÄï®ñNðóñÉôòºö3óÎødôéú–õïü·öÇþµ÷U‡øˆùSxù¬ù•fùù;vøË÷Öþ÷{ýQö"üõÖúÐôžùô}øNóv÷’òöâñÉõFñ1õÇðÍômð£ô>ð¶ôAðõtðƒõØð(öiñãöò¨÷ôòdøãó ùëô™ù öú<÷Dú~øcúËùcúûHúgüú¥ýëùÐþ·ùâÿ‰ù×dù´NùPù>kùù¤ù¶ûùwoú;üú¡ûÙgüÈ\ýß ’þ* ± çq\gfñy‹ |Z€ú¦Ir3ѯº½0`7¡Ü/5@˜¾Å¬Jk°” W ! » ÂD Љ ËdU )ÿ@þ<“ý©ý<Æüá–ü‡~ü pü [üÊ ,ü½ Õû[ Lû£‹ú•–ù9rø+÷ÓÔõô€ôÿGójý;òñûkñÇúåðøù¬ð‹ùÂðù%ñ×ùÕñ‘úÏò¨ûôý‡õÄþ+÷£êø˜¯úŠfü[þýôeÿ9 ‹ j… ùx 4ò þ»­GHOÿc5þpÿü{þ®û‡üGúšúÏø»øO÷óöÏõJõ\ôÉóÿò{òÂñdñ¬ð‡ðÁïÞïïcïoî ïîÉîÀíî¡íWî§íîÐíÀíîXí€îÚìýîKì‡ï­ëðë©ðdê3ñÆé±ñ5é#ò·è†òRèàò è<óèç óëçôè¢ô_èHõÍèöYéæöêî÷äê-ùì°úkí}ü(ï•þ:ñì•ów+ö#åø×«û{ `þú ê<10"ȱúØÇš2ÿE í²ÿ¨Jjx’ˆ§ Èœ Q w9 )c (ÑyŠˆÁ-+ „¼ ÷j t ' é ä B Œ i JP ÖK ö ÌP 8\ P & " »Ç 0U ›é™£ye˜_—ÿ· ÿ¾Áþ»þÎôþÒiÿ ¤ÓO ª ³ ?<Úˆ@‚iK?áõ+@,)îÄ}ÿ$ âý] &ü€ Qú”cø¤döµ\ôÍTò÷ÿWð:þqî ü¬ì4ûëþù±éþø„è4ø“çš÷Üæ(÷]æÒöæŽöæQö'æö|æÈõÿæoõ¨çõpèŠôLéô5êjó!ëÑò ì:òììªñÁí)ñŒî¾ðNïmð ð<ðÏð-ð£ñCðò{ð™óÓðÀôIñ ößñƒ÷¡ò7ùó3ûãôýxö`øú”úýV £ÿ£ På÷zÞ¾ k® ‘: GZ… JWšA{Ùó(5 À %ª H# <ƒ×à5¾±» \è GT ~ÿ ÿþõÌþ(ßþ“+ÿ1£ÿô7Ñغs›ô_EõVMaŽ,±±Šÿýþ%þý–üûñúùPù÷Å÷AõeöŸó>õ>ò[ô&ñÁóXðuóÜï~ó¶ïÝóãï’ôbðšõ*ñèö,òkøZóúŸôÆûèõrý$÷úþAøG0ùIéùðeú6ú”ú«NúìÓùõÿ-ùÕþfø›ý‚÷Rü†öûwõµù\ômø?ó5÷*òö)ñõFðEôŒï¦óïAó¯îó•îó³îQó ï­ó˜ï$ô\ð®ôSñ>õuòËõºóPöõÄö‡ö&÷ù÷r÷cù«÷»úÔ÷ûûï÷ýøþøóþ)ø¬ÿHøEpøÊ©øEòø¾Lù=¶ùÇ0ú`»úaûù3ü?ý{þ) , T =·›3 °Ÿ NZB^áaæO=Ø “Ûšf:ªv«\p v}ÏÜ$9 Š ¦  6 Ùúáþ5JÛàӼ؟ÿ(`ÿŸNÿ.YÿÅlÿP tÿº ]ÿð ÿæ Žþ Çýë¾üÿzûÒúwrøþÐö{3õ°ó¢ÿ[òlþ@ñkýið¦üÜï&ü¢ïïûÀï ü9ðyü ñ:ý5òFþ¤óÿHõ÷›êø4ºú¶pü ùýJÿßT@ > ƒÛ¤!wÖYbuÿÉ\þýGÿ¦ûlýúŒûƒø³ùêöê÷[õ>öåó¹ô’òaóiñ<òqðIñ¬ï…ðïíïÉîwï¬îïÅîÖîïšî~ïaî ð%î²ðâí]ñ”íò=í§òÜì5óuì­ó ì ô¥ëKôHëvôøê‹ô¸ê’ôŠê”ôtê›ôrê¯ô†êÕô¯êõðê‚õOë&öÛë÷£ìVø²íôùïìû¼ð7þ¶òÆîô†T÷`Óù; Rüþ ¸þ”ðêëûÖ«À/[¶Göùáu…Äòï=z Á % M· «‰A¢ DijÎgU®uj·D % \ø — ¤ ¨  } B  I £ ; Ø å Ä T t” ùµ dÈÈÚ9ûÅ6zÿ•bþ#‡ýäöüå´ü,Åü¼(ý’Óý§ºþñÌÿ\ ó× L :£1Æõ¤z0·c§;HºìªÛv‘  eÿ‚ ’ýÈ•ûö}ùS÷2%õRó…ÿþðÔýïGükíäúðë°ù¶êªøÀéÒ÷é#÷°è–ö’è&öµèËõé|õ–é4õ>êïôûê¥ôÂëWô‡ìôCí¥óðíJó‹îòòï ò…ïYòêïòCðññ–ðÕñìðÉñMñÎñÁñåñOòòóPòðó¹ò'õWó¸ö9ôªøgõýúçö®ýµø®ÉúîýS~ÿÄ ó)]g¤g´€ cú ?  è †^ïƒÜ[Ræ T* ñ, =ø I— -Ž× È¢ä c7 ]Ð ˜µåÞÿ`áÿ ‚" IŸn2y­VþõJîS†ß„½üÿÍþÔþ¾ü™ý¥úXü”øûœöøùÊôñø.óøÕñ]÷ÊðèöðµöÍïÏöâï2÷Tðà÷ñÍø$òíù`ó1ûºôƒüöÐýz÷ÿ¸øÍùЬúUNû‘°û„Íû2ªû£Lûãÿ´úöþåùäýæø±ü¼÷fûqö úõ¨ø«óI÷LòùõñÂôÚï¯óáîÇòîòœí‹ñbí;ñtíñÑí)ñsî]ñWï®ñrðò¶ñ‘òóóƒô’óóõôX÷…ô§øòôÙùXõêú¹õÖûöžüpöDýÊöËý#÷7þ~÷þÛ÷Öþ9øÿ›ø_ÿù·ÿsù2ûùæ«úã’û6¸üä&þéÛÿ? ÒÕ —Uq¼F ÿk †Åv©$j, k» Ï }i ‘‹X9Õ qÆ“`ñàNY¾ Þ S } H 4K —ŒP]ϺÊ\ø4M2¼@2 Hž 6í ø € ɾ ÐÿD —þ—%ý¾ˆûÂÎù­øˆ9öaô@èò2}ñ?PðqÿpïÒþêînþÉîNþïvþ¸ïåþ¿ð—ÿò€¯ó“qõÁI÷ó!ùæú†üîðýƒÿÖâ ¥ñ'÷kµy+T]ÿPþ† ýêÿ™û5þúnügø úÃöÚø,õ$÷¯ó‰õYòô7ñÁòRðžñ±ïªðTïãï<ïEïdïËî¿ïrîGð0îïðî©ñÛíiò¼í"ó íÍó…íbôiíÚôOí4õ6ípõíõ í”õøì‚õèì^õÚì-õÐìùôÈìÊôÅì­ôÌì·ôèìúô'íŠõ›íuöNîÂ÷Hïuùðˆûòïýëó—îõoø`JúQ ü(  þÓ;kQVTi6:§È«ArãJnÙÅ0òfÁ  , pLèU›¯[ÆW=›ìÎÃÖƒòD ï #r ¼ à x ~ Ý í    ã µ A ²ù~\øþÆ”ý>cüÐvûŠÚúw—úŸ°ú!û¥âû~æüƒþ§ pÿÙ Î #% ]lçCuÙÄ(Ï,˜å"Rqtˆ Mg Þ 1” QþïEü.!úYó÷|Ìõ£»óÛþÏñ+ýðû¦î8úzíþøœìò÷ ì÷Åë`öÁëÐõöëbõXì õÛìËôrí˜ôînô¯îJôDï*ôÇïô4ðöóŒðâóÎðÎóûðºóñ¦ó"ñ‘ó#ñ}ó ñió"ñWó6ñMólñRóÚñuó”òÇóªóTô&õ&õ ÷Bö]ù¨÷ üQù ÿ2ûC=ý£bÿ Œr ¯¯¸°™bF ´· œæ Ð r “Ê šÖ *• J A x: ¨ ²®©I£æµ—ñ ki n# ¨' sнÔßÑ+í–-‡)íö8‰`Ø_â4¦Þ+]y·œÿïýŒûÿwùþp÷!ý‡õ+üÏóIûZò‰ú8ñøùuð ùð…ùð©ù‚ð ú>ñ¡úAòbûxó?üÓô,ý<öþ ÷õþñø·ÿúQû½äûøoüþ½üÑÈüs’üæÿü(ÿ]û<þeú'ý8ùïûà÷™úkö.ùæô¹÷aóDöîñÛôžðˆóïWò îPñ îwð¾íÑïÁí^ïîïŸî ïjï$ïdð`ï€ñ¸ï²ò)ðìóªð#õ7ñNöÍñc÷iò_ø ó<ù©óùùFô–úÜôûkõoûïõ±ûiößû×öþû>÷ü÷Cüý÷Œülø ý÷øÐý®ùêþžú`Êû59ýdãþãÄ¡ ÒŠ ÿ‹<Šx p§ %¸ –Ÿ±QiÉ·’ ó÷ œá úQ HÃÓ3aôS­GÂÛ_|ÿ ?´ 4 ‹ f Ž ßÅ ¡3 ¬Úù¶ƒÁ:ó = é’ ¼æ u* X gh V  9à Ãþ? ý˜XûÒùôœ÷Âõþó bòñ6ìï{1ïîØî˜æî~Wï%ðóFñw¨ò!;ôãìõ±§÷|Yù8óúÚgüV©ý¦±þÇzÿ´ÿÿo;ô-EÔÿ^/ÿCCþøý‚Àûçþ?ú0ý©øgû÷™ù…õÒ÷ôöØò†ôÑñóñÈñ~ð¬ð9ðÀï0ðï^ðoîºðî9ñ»íÏñíròzíóyí·ó‡íFô¢íÁôÄí#õëíhõîõ8î›õWî‰õnî_õzî"õ}îÖôxîˆôlîCô^îô\î!ôrîlô±î õ"ïöÏïc÷¼ð"ùèñ:ûNó¢ýèôF¬öøüúârü° ]þP/µàÎj’Ä÷èùÓ‘¼è Þïå’ þ ={\Äius û ȸ &³¸ñ€t:¼=,rÌÊ4gŸLø01 = Ò ~³ s6µ!ÎÛÂo“çFQá¼þk6ýîÓûv£ú¹ùÈù©Ýø¸óøø_ùhúûÁKüš¡ý„ ÿs q\ É1 ë  íè ‹#é*þ Ì› Kþ {) _ þÖ ac•þÇ¥ü ¨ú;®øcÉö’ÿõÐýxó'ü"ò¢ú ñEù7ðø£ï÷Lï=ö)ï“õ5ïõfï²ô°ïqô ðMôkð@ôËðCô#ñUôoñpô¨ñ‘ôÌñ°ôÚñËôÔñßôºñèô’ñæôañØô+ñÁôÿð¤ôëð‹ôñ„ôYñžôÿñäôóbõlôö:ö÷køNøöú½ùÌý_ûÚ&ýÿPõŠ å¤ ÈŒ‘18†³ ý  BÙ üb BŸ  €7 ‹› G Å¹  VM’ ÞÖH¹Þ ¦ ö§ ^á úR ÉôȽï4†Žhò1TÙ¬Rò—£,t Úrw¯ÿïÊýFÏû€Ðù¤Ø÷¼ÿùõÐþHôïýÕò&ý¯ñüáðüpð»û\ð¡û¡ð·û8ñùûòbü*óåüfô~ýºõ þ÷ÀþføTÿ¢ùÓÿºú5©ûwgü”ëü‰3ýO7ýèÿôüMÿjü~þœû~ý‘úOüTùùúó÷‚ù}ö÷÷õböœóÏôQòNó2ñæñGð¡ðšïŠï,ï îïëíïií\ïíÚïùìðíDñ;íò–íóîîó£îÐôJï¥õÿïgöºð÷xñœ÷/ò øßòaø‚óøôÅøšôÞøõðøuõù×õ7ù@ö’ù½ö*ú\÷ û&øGü#ùÚýVúÉÿÂû cý™3ÿe*Y @c jn™c 1Ú ÅÔ ©P¢¿×ðž Ýñ ~Ô ÑF ÕQÿþa3‹7|èg±`„yp »| . ± Ö  µ ¥ É d M rY ð€ v¹ ùü j= ¿t ðœ ô« Éœ nj æÿ 7þ• iüô †ú3 šøX´öháôn3ów½ñð°ï,ïšïH@ï&Ðï0¯ðdÑñ»&ó-¡ô±1ö<Å÷ÃOù?Âú§üô8ý*þ$áþUÿ¬ÿ#aÿcöþmCþ?Qýß,üVÿàú¨ýùãûøú¼öEøuõƒöPô×ôTóKó‰òåñññªðŒñïWñ¾îOñ îmñ‡íªñ+íýñöì_òãìÈòìì0óíóAíáóí ôÄíGôîTôEîJôxî+ôîùóµî¹ó¾îróºî,ó­î÷ò¢îåò¦îóÅîló ï"ô}ï0õ$ð—öñWøòkú_óÅü×ôWÿwö4øßú±áûr »ý ˆÿƒ?·Ø¤LA’… gpåÿÿH¸N0ž ü¶6G]Í~Z¦÷ â´ ;˜ ½¨ ië E^ R ŽÊô°¨'¤à˜¤wj8&ÑÐ=cyÖ…&dQVµ88û³þ¢-ý4¹ûÀeúNCùê`øœÄ÷ow÷e|÷‚Ï÷Ælø/Iù»\úb˜ûíüâNþ© ®ÿi ü 0´ @2 " ÏÀ >à h” G+ ؆ ¦ Œ å={¿ïþPýh«û¤úáÿ†ø(þ÷‚üØõùúÀô“ùÖóSøó>÷òUö(ò˜õèñõÆñœô½ñXôÇñ6ôÚñ/ôññ>ôò_ôòˆô òµôûñßôÛñõ¬ñõqñ#õ/ñõéð õ§ððôtðÑôað»ô|ðºôÖðØô}ñõzò—õÒóCö†õ'÷’÷AøíùùŒü û_ÿ¬üUjþ]:f\ é1²Õe=÷^a ,˜ ž“ ­M T¿ •è sÉ ùg 0È 'ú í Žý é£Ù4Ù×ò•,v Œ{ § Ëö ¬b ±á ×j ñdl¹Ï T+ˆ¢Ü›rpâ2ÿªgýŒûY­ù‡×÷¥ö¿†ôàÿ'óÿ òYþ:ñÂý¸ðPý‰ðý©ðâüñçü¿ñý¢òSý¯ó®ýÛôþö‰þY÷ùþ’ø_ÿ¸ù¶ÿÂúøÿ§û_ü!àüþÿ#ý«ÿ&ý%ÿåüjþfü{ý°û[üÉúû¿ù£ùøør÷ŽöHöûô+õró$ôüñ=ó¢ð}òmïæñbîzñ„í:ñÖì%ñYì5ñìhñóë·ñìò?ìòžì óíˆó­íÿóPîlôýîÍô«ïõWð_õûð‘õ“ñ¸õòÖõ˜òîõó ömó7öÔóöEô÷öÍô§÷rõ›ø>öÛù6÷jû^øGý·ùkÿ@ûÍõügÐþ'Éÿ Ùß ÷·w1 9 {' §óŒ‘ùR %‘œ™çF뜫©1wˆ»×ðçLú©E‘ ,û å‰ ½ = ³  Á à ! I 1 | N´ Xæ I  Í ]æ Θ (ÿ( ký–  ûä Ðù ø5 NöF·ôVNómò—2ñØ‘ð8=ð½6ðf}ð6 ñ+Ôñ?Ñòpøóµ<õ öbé÷¹<ù ~úJ¥ûw©ü‡ýt þ7„þȪþ%þL;þ?°ý÷üšÿüþ ûmüú¼ú ùùþ÷Y÷ÿö»õö5ôBõÌòôˆñ÷ólð‚ó{ï*ó¶îðòîÏò²íÂòmíÆòLíÒòJíãòbíóòíýòÆíóî÷òAîäò{îÅò©î›òÍîlòäî8òîîòîîàñéîÑñëîäñúî(ò!ï¨òiïkóØïxôrðÎõ;ñm÷4òOù[ómû­ô¼ý$ö.¼÷¹jùO'ûãëüf ªþÍ ^ þéÝq«ý”µ&.hhZd+pĦ9³• ä|/Pƒ&ç bü ý ½/ ¥q ´Ì ê; B· ¶7 ?³Õ%p„Ê“ô iï«ÁÌ|Í#­ÀþpXýõû²¥ú?qùÌhøa‘÷ôöÀ—ö˜}ö¦ö§÷à²÷9‰ø­‹ù8­úÑåûv(ýjþ¿¢ÿV ÇÜ ÑK ³š gÁ ä¸ '{ . ÷X ‡tã]¶6Ûþ¦§ýpü}þ@ûöüú‚û ù'ú øíø*÷Ø÷böêö´õ&ö õŠõ£ôõ:ôÈôàóšô‘ó‰ôIóôó¤ô¿òÄôzòèô1ò õæñ'õ™ñ:õJñBõþð>õ¸ð/õ~ðõYðõVð÷ô€ðüôáðõ„ñ`õmòÍõ¡ógöõ2÷æö.øïøXù2û«ú¥ý$ü;¾ýélÿ£(\ê ¨” Zûõ1q )Á Ûß ? Pe Æ zç •Ê gu öñ KI p‡ qµ VÝ + ø@ÇŒó‚{v'z öŽ å¬ óÏ ï G ºëà  GÕØK‡¯þý…Qû× ùû÷;mö]õ€Áó«µòêÿçñ@ÿXñ²þ ñDþñøý7ñÎý§ñÄýJòÖýóþ ô;þõƒþ/öÐþN÷ÿjøeÿxùŸÿpúÅÿHûÏÿúûµÿ€üpÿÕüûþøüWþëü‚ý­ü~üEüSû·ûú ûŸøEú'÷pùªõ“ø-ôµ÷¼òÞö^ñöðWõùî²ôýí$ô,í¯ó‰ìRóì óÊëÛò¬ë½òµë­òãë§ò.ì©ò“ì±òíºò‰íÄòîÏò—îÙòïåò™ïñò ðÿòwðóÚð<ó9ñyó›ñ×ó ò_ôòõ-óöïóA÷Øô³øíõcú-÷Rüšøvþ2úÈîûBÌýÙÃÿ€Ë. àÖ öné <í ^¯ CEä¦;ÉC¬ûMc­zÏIºÖu$ :%ßñ6¦ŒNéñV–ÚAyö4µ }ÿ J ã A¦ e] ‡œ¡!“^öJ¥ –þ Üüp #û­ tùÕ Ø÷ï Zö õÙó>äòr*ò¾¯ñ%uñ«xñQ¸ñ0òûØò÷ªó žô0«õ`Èö–ë÷Ë ùû$ú&û( üÐüámýÞýò!þ47þGþ/ßýòÿwý“þîüýKü•û’ûúÊútøùùíö'ùvõWøô÷ÒòÒö°ñ#ö´ð„õßïóô2ïsô«îÿóIî–ó î8óèíâòàí‘òéíEòîüñ î¶ñDîsñgî1ñ„îóðšî¹ð¨î‡ð¬îað«îNð©îWð­î„ð¾îÛðæîdñ+ï$ò‘ïó ðTô×ðÅõºñm÷ÇòIùüóSûWõ‚ýÑöÎÿeø+ ú“ÀûûwýY +ÿ¢ ÒÍ eÎÙŸ&8E“.¬àZZ®f’7QÒñ>}…ü­v¿ö¿"»Ü¹³¼©Å ¼Ñ êß .ì „õ äõHìªÕ±M}„=£ï¨—’:ÿaÙý{ü·(ûEéùÉÄøJÄ÷Ïíö`EöÓõ»—õŽ’õ}ÅõŠ+ö´Áöø‚÷TføÂeù@yúÆ›ûPÀüØâýWøþÅúÿÞN¤[B<¸ím¿ åÏãjÀá„83uÙÿ ÿ|þ»þ#ýÍýÖûÚü›úéûzùýúvøú‘÷<ùÎöiø.ö¡÷±õãöRõ/öõ„õéôãôÖôIôÓô¶óÙô+óæô§òôô,òõ¸ñõNñõïðõžðïôaðÜôAðÊôCðÂômðËôÈðìôVñ+õòõ!óö_ôÐöÙõ²÷‹÷½øqùðù„ûHû¾ý¿üPþóÿ÷¢rUå G §3®Ÿ  â ]õ àÓ y ç ÖJ#|û p« '< ª¶  4‚ Hè GW 5× m ø Ñâ¤Àu³> µ ĺ Øi ê õ õ(⣹vxØþŸ2ý ŽûZñù•bø¾ìöà’õÿ]ô#TóT{ò–Ôññÿfñfÿ.ñ÷þ-ñ¤þ_ñoþÁñTþNòQþóbþÑóƒþ»ô°þ´õâþ·öÿ¼÷?ÿ»ø[ÿ­ùaÿ‹úJÿPûÿ÷û®þ|ü#þÜüoýý’ü)ý’ûýqúáü7ùŠüì÷ü”öû8õïúáóCú”òùZñ×ø9ðø5ïh÷Rî¸ö“íöùìnõ…ìÖô5ìHôìÄóúëKóìÜò,ìvòbìò¦ìËñóì„ñFíIñ™íñëíôð9îÝðƒîØðÊîéðïñ`ïiñ½ïâñ/ðˆò»ð]óhñgô8ò¦õ2ó÷UôÃø õú÷¤ü¬øÓþhú?ü‡-þ+…2 <ƒ @í4; cÈ `W )¶·àÒàee¨‹­‰vf*kÝ£…¹,³Ù•‘bT )Òy©3"³ 2( <“ ;ó)KšÈãr(lx³þÓ þü XûC Äùc Kø| óö” Àõ³ºôÞãó@ómÏòÚ•òaŽò·ò¾ó“ó}5ô{ùô‡ÖõÃö·½÷мøß¸ùá¬úÍû›]üGýΦý.þghþ|’þn—þEÿyþþ8þ¬üÚýKû_ýçùÏü„ø*ü*÷xûàõºúªôöùó,ùŒò`øªñ”÷çðÊöDðö¿ïDõVïŠôïÖóÏî+ó©î‰ò‘îññ„îbñ}îßðyîgðuîüïpîïdîOïTîïCîôî5îñî0îï:îZïZîÍï”îpðíîEñkïJòðƒóÛðíôÍñ…öæòJø#ô4ú€õ@üùöfþ‰øž*úåÕû1„ýz.ÿ¸ Éâ Qð ¼Ù— ${Κ_}Ã$ý‘ Ä Àየ)d õ×.šQk^LY?FC%W÷w¼ ¢x Ò( Ï .mQgnaœ?¡ÿ´)þM¸üÑVûH ú´ÖøÅ÷‹Ööö†tõõÊËô¼ôpÞôi+õ|¢õ¦?öåüö4Õ÷‘ÄøöÅù^ÒúÃäûôüiûýôþ³Ùÿ¦¢vO Û£B„?Ÿ_–egZBÿ©"þý}æûÉÿ×úÿØù,þìøLýøcü[÷vû¸ö†ú0ö–ùÁõ¨øiõ½÷&õØöôôüõÑô)õ¸ô`ô¨ô£óœôòòôPò„ô½ñsô;ñ^ôÍðDôvð+ô=ðô&ð ô5ðôoð4ôÖðnônñÉô8òHõ6óíõgôºöÊõ®÷]÷Çøùúû_û ýÖü0ÿcþj¶¦ Q_ø« ç v ¶ ÞÍ …¶ øq 4þ 4^ù”¦Ð–ålÆ-vâ ù‘ U@ ô £¯ œt }F E" ú ö .è ² Ø & Å ª ê >I ‹ý Òœ # Z“  þéëü)@ûU§ùu%øŠ¿öžzõµYôÕbó—òEúññ Nñ˜ÿ=ñ:ÿZñôþ ñÆþ ò­þò¥þJóªþô¹þòôËþáõÛþÚöäþÖ÷ÞþÐøÃþÀùŽþ ú=þmûËý ü9ý¸üˆü0ý·û‡ýÌú¼ýÈùÏý²øÂý÷”ýföIý:õäüôhüøò×ûêñ4ûððú ðÃùAïüøî/øûí^÷ƒíö%íÀõßìöô°ì3ô–ìzó‹ìÊòì'òžì’ñ²ì ñËì”ðèì.ðíÛïížï<í{ï^íwï‹í•ïÇíÛïîHð…îãðï«ñ½ï¤òðÌó‡ñ#õ¦òªöìó\øXõ8úåö8ü’øXþXú“5üã þF°  ü| ßέ] é M ц b’»rÛ&À±hÓ\†›Î¢iŸØ™“B‘C”'ší§šµ1ijРÖ}ÐÎ À žP i…¶¾çD±MŒÿBÙýo 9ü °ú§ Fù¾ ü÷Û Öö Ùõ5õyaôÒçóA›óÇ|ód‡ó»óßô¹ô¢,õ–ãõ’³ö‘”÷ø€tùefú6Pûî.ü‹úü °ýlKþ°ÉþÙ'ÿéÿfÿãþ‚ÿËý}ÿ¦üYÿzûÿLú´þ!ù9þü÷¤ýäöúüÚõ<üãônûÿó’ú1ó­ùzòÁøÙñÑ÷NñßöÕðïõoðõðôÐïCó’ïqò[ï­ñ(ïöðøîNðÉî·ï˜î3ïhîÅî:îrîî=îöí+îëí?îõí}îîäîZîxï»î:ðBï+ñìïIò¼ð•ó±ñ õÈòªöôoøWõSúÆöUüIøqþÞù}û×ý½þOM~ Ì› 3œ z| 7 Å{$0QÀI/  š¶ ô× é ð Ýñ |ð òñ Cõ rþ  s L4 I ¶] Nl × r Q m Á Z (7 ˆ äµ >V ›àþÿVjþ»ãüoû`ú¬Õøø·÷K¼öªçõ;õ›¸ô0`ôÝ4ô¡/ô}Tôo ôtõŒ£õ³Vöæ%÷ ø[ù– úÇûì üü%ý÷þØÿžÖÿHŒÖ)J¥¦îÿ<%ÿUOþLqý!ü×®ûnÐúêûùK2ù˜ÿvøÐþÊ÷õý.÷ý¤öü+ö#ûÃõ(úlõ+ù õ1øâô<÷¬ôOöôkõVô”ô/ôÈó ô óáóaò¹óÊñóIñlóäðNóžð=ó{ð<óðPó«ðóñÈó‚ñ1ô1ò½ô ókõô>öMõ3÷¯öJø8ø€ùèùÑú»û<ü«ýºý·ÿHÿÖÞx9 l—— ° p²³ •Ö UÖ ì³ Vk ˜viÌ q2©I­TW(T¥OùI&B/;3à(œß°a s­ $ï *K _½ “ Ç] Dþ¬ •ü¾ùúÇtùÌ øÓÁöà™õù—ô»óV ó¢~òòxéñÚñ¨ÿôñ\ÿ3ò"ÿ—ò÷þó×þÄóÀþ„ô¬þYõ—þ>ö|þ,÷Tþøþ ùÕýõùwýÑúý›ûwüQüÔûîüûqýTúØýzù þ•øIþ¨÷Tþ¶ö@þÄõ þÔô½ýìóSýóÏü<ò5üzñ†ûÇðÇú'ðûù™ï$ùïFø²îd÷Wîƒö î¢õÍíÆôšíòóoí)óKíjò-í¹ñíñ÷ì„ðàìðÎì ïÅìVïÆì+ïØì#ïþìAï=íˆï—íùïî•ð­î]ñlïOòPðpóWñºôò-öÎóÉ÷9õ‰ùÁölû`ømýú‰ÿÙû¸¨ýöyÿ=Fƒ À ¿ï ^âJ ä’ ˜¸ %½ „¢ ±i­u§ %k™î•@^‡ùÈi°9ÐjÍ”¨¶dÏÝÝÍd«¸ uþ (; ÄsI§´Ü KW{ªÿ þ· ‡üÎ ûä Ïù £ø( ›÷\¸öžûõòeõZöôÔ¯ôcô–ô¶ÃôwõEˆõöüÉöÞŒ÷¾_ø—>ùd ú$ûÒÝûn­üônýfþĵþ5ÿJÿ›ÿuþãÿ”ý ­ü¿ûÑúÑÿãù€ÿúøÿø‹þ>÷ëýqö6ý°õnüûô–ûUô²ú¾óÃù2óÐø³òØ÷?òàöÕñëõpñûôñôºð1óbð\òð“ñ¹ïÚðhï4ðï¤ïÕî/ïœî×îqî¢î[î‘î]î¨îyîçî´îPïïäïŠï¢ð)ðŒñêðžòËñÛóÎò?õîóÊö*õxøöFúè÷0ü`ù0þãú@küZðýxnÿ’Ý¡;Ÿ …† ´QÊü¡àd   ñ šŒ ê [< t… bÇ " ¹9 (i o” “¹ ”Ö uè <ð èê Ô  ® y t á ' @Å ˜M ìÁ A ™n ýÿ°mþèîü†ûM6ú‚ù¾ñ÷÷[2öÁ‰õ:õŨôdqôaôÚwô±³ô–õˆ—õ†8öŒôö”Æ÷œ¨øŸ–ù™‰ú‡{ûfiü5Nýóÿ%þ ÿêþ8ÿœÿÁþ3<þ²©ý ýZjüÀû‡ûnhú7Àùãùt}øìÿé÷Lÿ\÷—þÚöÑýböüüõõü’õ4û8õFúäôWù˜ôgøQô{÷ ô”öËó´õŠóÜôJóô óSóÍò§ò•òòdò”ñ@ò5ñ+òøð)òÞð?òêðoòñ»ò{ñ&óò±ó±ò]ôŠó*õŽôöºõ÷ ÷Fø‡ø†ù%úßúäûJü¿ýÅý±ÿIÿ³ÐÁWÔØåKí ¯æ þÌ 6 —U CZ ÏG 5 pÔ ‚ye ‰ž÷óW« óÕ3rhã•-¸QÐPÜ/ÚïÈ“¦ p—&ü ÆR Oš ¿Û\OŠ Œ¦ Ï´ !ÿ· €ýµ ôû°€ú­(ù±í÷¾Òöרõõ9Pô„Äóà_óO"óÏ ó_óQó­ÿªódÿ%ô"ÿºôåþhõ©þ(öiþõö"þË÷Òý£øvýzù ýJú—üûüÉû~ûpüßúý4ú~ý~ùßýÂø&þøOþ;÷[þwöJþ³õþòôÒý7ôný„óñüÚò]ü9ò·û£ñÿúñ:ú˜ðkù"ð’ø·ï´÷TïÕöùîõõ¤îõUî?ô îmóÄí£ò€íæñAí7ñí˜ðÖìð²ì£ïœìSï˜ì$ïªìïÖì2ïísï‚íÜïîoð¬î+ñsïòZð#óbñ]ôˆòÁõÌóK÷*õùø öÉú*øµüÃù¹þgûÎýï¹þ\<öY ƒk ÿh eMµï¾ B œ Ìð μ  uC·¸ûEÅ÷:²¤A¦Sã˜ùËëï¿vòœÊt :Ë Ð N`¸¤ êR7ˆ´ ôÿÛ mþÿ üü# £ûL hú| Jù¶Nøüt÷O¾ö±.ö"Äõ¢ƒõ0iõÍuõv§õ+úõéoö¬þös¥÷:^øû#ù¶ñùiÂú‘û«[ü7ýµÎý'nþŽÿúþçþnÿ5þÈÿ}ý¼ü%øû*2ûkúÚÿ¦ùˆÿäøÿ(ø”þq÷øýÂöGýö…ü}õ´ûçôØúZôòùÔóùUóøÞò&÷kò7öýñJõ“ñcô+ñ‚óÆð«òfðâñ ð+ñºïˆðrïýï9ïïï@ïïïï ï"ï'ï\ïmï´ïÛï)ðsð¼ð6ñnñ#ò?ò:ó-ó{ô5ôåõVõr÷ö"ùÙ÷ïú3ùÕü˜úÎþüÑmýÝÔþê3ð†ìÌ× ­ !j/' ÔÜÿ˜ þC ÐÞ tj êè 2X L¾ : ýi •­ ç Pw4|GbK,>Ýxð ÿ ¬ v T ß ê =k •Ú ê9 A‰ Ï  zþEý~œû¸Qú÷!ù?øŽ÷ëOöT¤õÌõSÁôçŒô‹~ô<–ôùÔôÂ5õ”µõmQöI÷%Ë÷žøÖÿzù¤ÿ[úiÿ:û!ÿüÏþåüpþ¨ýþYþýöþ ý{ÿ‚üæÿïû3Vûd·úxúntùHÓø4øªÿ™÷2ÿ÷¥þröþéõOýgõ‹üìô»ûxôáú ôÿù¦óùFó0øëòH÷–ò`öDò}õöñ ô«ñÌógñó(ñPòóð®ñÊð$ñ¯ð¸ð¦ðjð°ð<ðÒð4ð ñQðcñ—ðÖññeò£ñójòÜó]óÂô}ôÆõÇõãö:÷øÓøcùŽúÁúhü-ü[þ£ýaÿtš¬†ÃíÐ FÍ ³Æ€é ,ø µò × N¨ Yg6ã°a=°»Ñ,Èå-ŽgÑì¨å°½§x^ŸÈp ]Á ß L@¥xí¯&ëT 1x …ÿ— èý´ ^üÐ íúï—ù^ø@H÷vUö¶†õàô\aôà ô6ßóµÙó@úóÖ@ôs¥ô'õ½Áõeoö ,÷­ÿò÷Hÿ½øÚþ‰ùbþQúáýûUýÃû½üfüüôüqûlý½úËýúþCù7þøCþº÷2þôöþ0ö¿ýoõ_ý²ôçüüóYüKó¸û¢òûòFújñzùÚð¤øQðÈ÷ÒïæöZïöêî õî?ôîaóÂíŠòkí¾ñíÿðØìOðžì·ïtì5ïZìÐîTì‰îcìcî‹ìbîÍìˆî*í×î¤íOï;îóïïîÄðÂïÀñ±ðéò»ñ<ôáò¸õôZ÷qõù×öûLøýüÍù ÿUû)ÞüNhþuëÿ˜d² Ô¼ 7² ‰ŽÊJøä X ¡ Àö ±È tŠ =oá¦u±þŽv@áÈ=(‰aÆxòm Cþ Ÿë(¸p Z ¦© &ò”;ö‡KÛ˜ :Þ «ÿ" -þf Æü« yûô IúC :ùšKøû‚÷eßöÙcöYöããõxÝõüõ½=öjžö÷Э÷…Tø6 ùãÇù‹‹ú)Oû¾üJÆüÊpý? þ­ÿ’þÿÿgþ[ÿ¹ý™ÿý»ÿIüÃÿŒû¯ÿÍúÿ ú5ÿOùÒþ“øWþÛ÷Çý(÷$ýzöoüÑõ«û/õÜú“ôúþóùpó7øéòL÷gò_öëñsõuñŠôñ¦óœðËò:ðýñáï>ñ“ï”ðTïð$ï‡ïï+ïÿîðîïØî5ïçîuïïÐï~ïFð ðØðÁð‡ñ¥ñOò´ò2óíó-ôOõ@õ×öfö€ø ÷Húçø(ü9úþ’ûîü*Jþ9¢ÿFòK;A v& ¥ñ Ä Ó/Ñ™½Û˜ õb ä §È =e §ó ås öæ ÜJ—¡'çÔFö]õdÖZ›?GÜÓ] Í 0 © ˆ% Û’ +ò €I Ú˜ ?ä ´þ- :ýuÕûÀŒú]ùcPø¿f÷$Ÿö’ÿõ †õ5õ õµõW'õjõµÌõmIö'Ýöá…÷š;øQûøÁù®ÿˆúQÿKûëþü|þ´üþTýýßý÷üVþdü¶þËûûþ+û(ÿ†ú:ÿßù1ÿ6ù ÿ‹øÐþâ÷{þ;÷þ–öý÷õøü\õSüÅôžû5ôÜúªóú&ó<ù©òaø2ò‚÷Âñ¡öXñÀõõðáô˜ðôBð5óôïpò±ï»ñ{ïñSïð;ïð7ïÅïGï’ïmïï­ï•ïðÒïuð8ðñÊð¦ñ†ñgònòBóó5ô¾ô@õ#öbö®÷˜÷[ùàø&û5ú ý•ûÿüüfþÑÿ*8;™D ó@ B( ƒø·­ÙAë °ì ùÜ º ˆ ÚExóé.Gž4 øl’»úQ(zD€NgF1,Þþs¼òi` À ‹ bl®ÊúLi ©® ð þ1 ýs Æû¸ Œú pùOuø¤Ÿ÷ìöf`öÓûõJ»õÊ¡õPªõÞÔõrö ö¤ùö>†÷Ö!økÇøürù†ú Èúˆÿkûúþüeþ‹üÈýý"ýgýuüµýÂûíýû þKúþ‹ùþÉøÕýø“ýE÷:ý…öÌüÉõJüõµû\ôû­ó^úó ùbò×øÆñø1ñ.÷£ðQöðtõžï—ô'ï»ó¸îäòQîòõíUñ¥í£ðcíð/íyïí ïí·îí„î'íuî]í‹î®íÈîî0ïšîÁï9ï}ðñïcñÃðtò®ñ®ó°òõÈó“öôô8ø0öûù{÷ÕûÐøÄý-úÀÿûÅòüÎUþÖ³ÿÖÊ W¬ ›x Ò)ú»,!y Ÿ žä s° o Ÿ õ¾ "O#ÑüB«¢4ó˜3ÙbùúŒÞ‡¨oYGõ  Âú hj þÒ‡7œy æ xN ÷² ‡ÿ ,þy çüÞ ¾ûF ³ú³Çù%ÿøŸZø×÷¦z÷6A÷Í*÷j5÷`÷¶¦÷bø|ø»ùf™ù7ú±ÚúN~ûäüs¸üúFýxÇýïÿ6þ^ÿ“þÄþÛþ#þ ÿ|ý(ÿÐü,ÿ üÿmûìþ¹ú©þúQþOùäý›ødýë÷Òü=÷1ü’ö€ûìõÄúKõýù¯ô-ùôVøˆó{÷þòö{ò¾õÿñáô‰ñ ôñ9ó¹ðtòað½ñðñÛï‰ð°ïð˜ï¹ï”ï~ï¥ïeïÌïpï ð¢ïbðüïÒð~ðYñ*ñúñÿñ²òûò€óôdôiõ\õÖöhöaøƒ÷ ú«øÈûÞùšýûyÿVü`—ýM×þ8Hõy¼ žo ¹ ȇÈå»! :u ,; øô ž 9 mÆ šC Ÿ² }5bÇ¢6уñ°¾þ®ë…ÇE”ð Pˆ ý  › - ³ z- î  e åv qÜ ÿ@ ¿ý¦†ügûxdúèù]¾ø×øXŸ÷áC÷r ÷ òö§ûöK!÷ób÷Ÿ¼÷M)øú§ø§2ùPÆùö_ú˜ùú3ûÊÿ üXÿ§üÞþ ý]þŠýÔýäýDý)þ®üZþüvþqû|þÌúlþ%úEþ|ù þÒø¹ý(øUý÷Þü×öVü2ö¾ûõûòôfúXô¨ùÃóãø4óøªòD÷&òpö«ñ™õ5ñÄôÈðõócð-ó ðoò»ïÀñ{ï"ñJïšð*ï*ðï×ï$ï£ïAïïtï¡ï¿ïÙï"ð9ððÂð1ñtñÝñNò¡òPó{óyôkôÆõoõ5÷…öÅø«÷núÞø0üúþbûåÿ¬üÎùý¼Gÿ§ŽÕh 1 Kè x…˜¬k²¬¨ Ì‘ Çi ›4 Jð Ï› /9eÅs@Y¬´O+‡®³ÃÇǾ¹›š`l+« Ü8 ~¹ 1 ›¥ þ i ˜Ï 34 ãþ™ ¦ýÿ „üg }ûÒ”úBÌù·#ù1œø±7ø8ó÷ÅÐ÷WÌ÷îã÷Šø'_øÆ½ød*ù£ùœ%ú2¬úÅ3ûQ¶ûØ4üW¨üÐÿýBÿjý¬þ³ýþëýkýþÁüþüþaûþý«úÏýôùŒý;ù5ýøËüÉ÷Oü÷Äû\ö)û©õúùôÌùNô ù§óFøóy÷jò¦öÖñÑõHñûôÂð&ôEðXóÐïòhïÔñ ï'ñ¾î‹ð‚îðVî˜ï<îFï8îïIîïqîï¯îNïï­ïtï3ðûïàð™ðµñNñ±òòÑóúòõîó|öõôÿ÷ öù/÷Pû^øý”ùêþÒúÄü¢Sý€”þWÑÿ$â 8 a" œû•:YzUX .( ãé r Û@ Õ ;Y 2Ï 4³‡@˪þó /*/úþÀÍr Ž @® ç = ‚ Ç QŸ Þ# r¢  ¿™ ÿ WþŽ Dý KüŠoû±ú•ú#’ùµ2ùMñøêÐøËø4áøÜù‰Sù6ªùâú€ú6øúÜtû}ñûkü­ßü<KýìýDÿý¾ÿCþ0ÿuþœþ–þþ¤þbýþ½ü„þüVþhûþ¹úÁý úZýYùâü©øZüù÷ÃûL÷û ömúöõ±ùQõëø°ôøôO÷}ózöìò¤õbòÏôàñÿógñ6óúðwò™ðÈñFð)ñðŸðÐï.ð¯ïÙï£ï¢ï­ïŒïÊï™ïðËïLð"ð¯ð¡ð*ñEñ»ñòdòó"óôôóRõÛô¬öÓõ#øÚö³ùî÷Zûùý7úÙþeû¥˜üvÌýGÿ1Ô]ˆ …+ ¤¸ º,Ä„ÃÁ¶Ý›Ùs ²> gù ù¥ dC «Ñ ÊM ƺ PbáœPÄŸÝÑäåÛÝÃÀ™ŒaE î Ç ‹ g ý ®‹ > Ð i … Àý …ÿt _þëOýfYüâ~ûbÁúè!úrŸù=ù•ùø0ÓøÎÇøq×øþøÀ:ùiˆùäù¼Kúbºú,û¥Ÿû@üÕ{üeßüïÿ8ýsÿ„ýîþÃýcþñýÓýþ;ýþžüþýûøýXûËý¯ú‹ýú9ýXùÕüªø`üû÷ÛûN÷Gû ö¦úôõùùLõAù¦ô€øô·÷hóëöÑòö@òHõ¶ñwô4ñ«ó¼ðæòOð-òðïñžïèð^ïdð-ïùïïªïïyïïhï4ïzïmï°ï¼ï ð"ðŒð ð3ñ5ñòßñôò¡ò ôwóDõ_ôöZõøeö¢ù}÷Gû¡øüüÏù¿þûˆ:üWvý%²þïìÿ¯!a R }‘ ž¶f§ÃÉ¶Ì ¯v n@ ü ‚¨ ÖE Ð Lö¶¸XVÕ‹1®o¿À”°ŽW_!Í Õs } §¯ =; Ö uC Á Õ< œ· xÿ3 jþ¯ rý- –ü®Õû20ûº©úG?úÙóùoÃù ­ù§°ùGÉùéöù3ú0úÒÔúr0û‘û§óû;SüÊ®üSýÖLýSŠýÉÿ¼ý9ÿßý¢þòýþôýbýäýºüÃýüý^ûKýªúõüôùü=ùü„øûÌ÷÷ú÷Uú\ö¦ù§õìøõô*øGôa÷œó“ööòÀõWòíô¿ñô0ñNóªð‰ò0ðÏñÃï$ñeï‹ðïðÚî›ï¯îKï™îï™îï®îïÚîLïï¥ïwï#ðéïÇðqðññ}òÅñóòÀômóö[ô~÷[õùhöŸú‚÷Kü¥øþÐùÄÿûˆ6üMký¢þÈÕÿu ,ž O hpw²zØsà_Ç=  2Î ³€ " J´ `5 Q¥ !ÎPZ‹ÆµÏDÖZÎW¶=YÒ ‡ È 4 n Ú €¤ '4 ÔÀ ‹I NÐ "V Û ÿa þê@ýu…üäû–_û-÷úǪúgxú _ú°]úXqú—ú®ÍúXû\ûª®ûPüò^ü´ü'ý»RýH–ýÏÎýNúýÊÿþ>ÿ'þªþ'þþþuýõýÒüÂý+ü~ýû)ýÓúÄü#úNüqùÈû½ø6û ø–úW÷ëù¥ö4ùôõvøGõ¯÷ôâöøóöXóBõ¿òsô-ò©ó¥ñæò)ñ.ò¸ð…ñVðîððkðÃïð”ï²ïxï€ïrïmïï{ï¤ï«ïÞïð/ðxð—ðññÖñªñºòSòÀóóèôäó.öÇôŽ÷ºõù¼ö“úÉ÷1üáøÛýúÿ(ûBTüù€ý­®þZÚÿü $ A VÚ bd=[DE." øò  ³ (e  Ï™ î ë‹ Åê ~7r‹œã³ »A±I˜;p:ç ÷ © © b Q  î Ć v .£ ï, º³ ”8 ½ ÿC –þÊÂýTýâgüràûsûž!û:èúÚÇú|»ú"ÃúÉÝúrû:ûÁxûg½û ü«PüG™üßßüsýVý‰†ý ©ýˆÿ¿ýýþÉýmþÃýÖý®ý;ý‰ý›üUýõûýLû»ü úWüñùâû?ù`ûøÏúÙ÷2ú&÷‹ùsöØøÁõøõ[÷gô“öÀóÉõóýôò2ôíñnócñ±òãðÿñpð\ñ ðËð·ïOðsïêïBïŸï#ïqïïaï$ïrïEï¥ï|ïùïÊïqð.ð ñ©ðËñ9ñ¬òßñ®ó™òÐôfóöEôf÷4õÕø2öXú=÷ìûRø‹ýpù4ÿ–úßÀûŽîü9þÞKÿ{v ‰ Áö ÜN ðŽùµøÁí±Ó­ 2x Â6 2â ~ « ¶„ î eE ‹”ÀþâJô}õ–æ™Ç‰šf `7 ÿ Ë Á q  A© = ÒË ©X ã €l †÷  ÿ‚ Ðþ þžsý0êüÆyü_ üûÞû›³û=œûá—û†¢û+»ûÑàûv ü@ü»yüY±üóëüŠ ýQý¨{ý.œý¯´ý*¿ý ÿ¾ýÿ°ýyþ”ýÝýjý<ý/ý–üæüìûü=û&üŒú±ûØù.û!ùújøú²÷Yùùö¨øCöî÷Žõ.÷Üôhö-ô õƒó×ôàòôDòOó²ñ–ò*ñèñ®ðIñBð¼ðãïCð–ïàï[ï˜ï2ïkïï\ïïlï4ïœï_ïïï¡ïbðùïøðgð¯ñëðˆòƒñó1ò˜ôòòËõÃó÷§ôyø˜õîù–örû¡÷ý´øžþÐù<òúÛüz>ýgþ¥ÿ+°¢ Ï è[ û™ ¿Ìû½ä’ÁI áP Y °£ æ4 ýµ ò# Ç |Ë Œ.èF+MVEk.l ] × B ™  Q ó  Ũ —I mæ I~ / !¥ 5 2È T[ ÿîÙþ„:þ´ý·CýVèü÷¤üšsüAUüéGü“Hü=Wüèpü’‘ü9¸üàãüƒý#=ýÀgýXýê¬ýxÄýÓý‚×ýÐýxÿ¼ýéþœýTþný»ý1ýýæüxüŽüÑû'ü&û²ûwú1ûÇù£úù ú_øeù«÷¸ø÷öøDöG÷“õ†öåôÃõ<ôõ˜ó?ôüòƒóiòÑòßñ)òbññòðñð”ð?ð6ðÿïðïÑïÆï¶ï¸ï¯ïÇï½ïõïáïEððµðhðEñÌðõñFñÅòÓñ³óuò¾ô)óäõïó ÷Çôtø¬õØùžöLûœ÷Íü¥øVþ¶ùäÿÍúséûý(þIÿfúY –¥ ¥Ý ­¬  üŠÑg‹7 (û ¥­ Q Då dh eÚ F; ‹ ®Ê 7÷ ¤÷!4Y lê q ½ g „ T B ; ö  ¢ H çç Óƒ Æ Ä± ÎF èÚ m O  ÿ›ÿ4|þÏ þmªý^ý°&ýVýüýäü¥ÙüNÚüöäüžöüDýê*ýGý,dýÈ€ý`—ýó©ý‚µý ¹ý޳ý ¢ý‡ÿ‡ýúþ_ýgþ*ýÐýèü3ý›ü’ü?üìûÖûBûbû•úàúæùSú4ù»ù€øùÌ÷oø÷¾÷eö÷²õJöõŒõYôÐô³óôóbóò¶òóñòsñ„ñññ›ð–ðEð>ððýïÍï×ï®ïÌï¡ïÞï©ï ðÇï\ðøïÉð?ðVñ›ðò ñËò‘ñ±ó+ò²ô×òÎõ”óÿöbôEø?õœù)öû÷tü!øïý+ùpÿ=úòSûtmüóŠýl§þÝÃÿBÜš òà  6 @2õ ØÊ®lw ñ1 YÜ ¤x Ð Ý~ Íè Ÿ@ Tˆ î¿ lå Òü "]ú †ä   Á ¬ “ ¯ Z «  £ Î š} ’& Ê ’k ž ¶£ Ú= × Qq ¦ ©ˆÿFÿç°þ‰`þ.þÓíýzÉý#±ýË£ýsžý¡ýÁªýfµýÁý§ÏýCÛýÛãýnçýýäý‡Ûý ÈýŒ­ý‡ý|ÿVýëþýUþÒüºý~üýüvü²ûÌû:û û·úqú*ú¾ù’ù ùòøVøIø¡÷š÷ìöæö8ö.ö†õvõÙô¿ô1ô ôó^óöòºòfò òáñ•ñjññþð³ð£ð`ðXð#ðððöï÷ïàï ðàï8ðòï„ððîðUðvñ¦ðò ñÛò„ñ·óò­ô¯òºõ_óÝöôøîô[ùËõ°ú¶öü©÷{ý¨øêþ­ù[¹úÍÊû>Ýü¨òý ÿe±)ð 4 ;8 ;? 2/ÇØm¢ø_ f ¸¬ í< » * ≠¦Ö P áB Z_ ½n n Ka z F " · ò É ¹ × x ã/ ïá Ž 6 3Û Z~ Œ ÌÀ a v ã¥_Hîÿí‹ÿ”7ÿ;òþå¸þþ;kþåSþ‘Cþ;9þä4þ‹3þ12þÒ2þr0þ,þ¦$þ8þÇþQäýÕ¿ýU’ýÐÿZýEÿý´þÊüþrüƒýüäü ûAü'û™û¤úîúúAúù‘ùãøàø>ø-ø’÷|÷ãöÊö2öö€õpõÐôÉô$ô(ô~óóâòÿòQòyòÎñò[ñ“ñùð5ñ¬ðæðvð¨ðVð{ðPðaðcðYð’ðdðÝð„ðCñ·ðÆñÿðcòYñóÈñîóIòØôÜòØõ€óíö4ôø÷ôKùÈõú¦ößûŽ÷7ýø–þzùöÿ|úW‚û·ü™ýi¦þµ²ÿöº* ÁP Ãd ¾d ³Q ž'€æUÜŒŒ ä, !¾ CA I´ 5 i À¬ aÞ ì b Å  [  “ ç  ¿ ê T .  OË r ™- ÇÙ ý =( ˆÎ ßs C µ½6dÄ _´ ^Àÿÿ³Mÿ_"ÿ ÿþµãþ_Ìþºþ¯ªþUœþ÷Žþ—~þ3lþËVþ`;þðþ{óýÄýƒŒýKýxÿýëþ¬üVþOü¾ýçû!ýtûüùúÜûtú3ûæùˆúQùÛù´ø+ùø{øj÷Ê÷¿ö÷ömögõÃõ¾ôõô|ô|óãóèòRó^òÌòäñQòxñãññ‚ñØð1ñ¦ðïðŒð¾ð‰ðŸðžð‘ðÍð–ðñ¯ð|ñÚðúññ’òkñDóÏñ ôFòëôÏòàõhóçöôøÊô(ùõ]úböœû@÷ãü(ø1þù‚ÿúÓ û# üqý¹þùÿ/!Y"u ƒ ~ f õ; Õø ¬ w/6¦èŒ H" t© †! ~Š ^ä '- Ùh v” ÿ³ wÁ ß Å : ½ ‰ © Ï ‹  d H 3  ü µ¿ í| (4 hè ®™ þH Võ ¹¡ &M Ÿø%¤¶PRýúª¬Xh-²üÿ`Ïÿ ©ÿ¸†ÿbhÿ Lÿ±0ÿUÿ÷øþ”×þ-´þÄþU_þâ,þkñýî°ýldýèÿý\ÿ¶üÊþQü5þãû›ýlûüüíúZüeú³ûÖù û@ù_ú¤ø±ùøù_÷Tø·ö¥÷öøöjõNöÇô©õ)ô õ’óoôóÞó„òWóòÚò«ñiòXñòñ¯ñêðiñÓð1ñÒð ñêðøðñõð`ññÀñ'ñ:ò\ñÊò¢ñróüñ1ôfòõâòëõoóãö ôì÷´ôùmõ&ú1öTû÷‰üÛ÷Åý¾øÿ¨ùC™ú‚ŽûÀ‡üù‚ý+þTzÿrr„h‡ [{ G] ,, è Þ ¦d˜û»FS yÝ ”X ™Æ †$ ^s !µ Ñè n û & z 3 ê 3 Q ) ®   ÷ V Ò ¤ ¥ ðq >8 Žú ⸠;r š* à q“ êG lùø¬Ž^-Õ‡t?&×Lj“9dè9•AêÿéÄÿœÿ4sÿÔGÿrÿ åþŸ­þ0oþ¼*þCÞýÅ‹ýA/ý»ÿÍü/ÿaüþîûþtûlýñúÍügú+ü×ù†ûAùÞú¦ø4úøˆùf÷ÜøÂö0ø ö†÷õßöãô;öLôõ½óõ7óuô½òîóQòqóòñÿò¥ñšòiñBòAñøñ-ñ¾ñ/ñ“ñGñzñuñqñºñyñò“ñŠò¿ñóýñ´óLòhô¬ò/õóöœóóö,ôí÷Éôôøtõú,ö"ûïöEü¼÷oý’øþoùËÿSúù=û%*üNýq þŒÿþðÿ¤ÜžÇˆ ­d Œ. då 3‰ ú µ” eú J¡ƒ, ¨« · ±} –Ñ i )Q Ù | z œ ° ” ¹  · „ ¬ ò ˜ Y { ¾ W ! . „ý çÈ N ¹R ) žÏ ‹ žE *þ½·Yoû&¤ÝV” IÉþ‹²QdæÆµsƒRÇ míÿ·ÿ®}ÿH>ÿßûþr±þcþŠþ±ýŽOý åüÿsüòþûû^þ{ûÇýôú+ýhúŒüÖùëû@ùEû¦øžúøöùi÷LùËö£ø-öý÷’õX÷ûô·ökôöãó„õeóõôòòoôŒòóó3ò€óìñó¶ñÁò‘ñuòñ7ò…ñòœñêñËñÜñòÞñgòññÕòòWóJòîóò˜ôåòTõKó!öÀóýöCôè÷ÕôÞøsõáùöìúÓöÿû“÷ý\ø3þ.ùQÿúmãú‰Åû¢ªü¶‘ýÃyþÇ`ÿÂD±'’e ß) ±Ü |} = ÷ˆ ¥ï HC à„ l° ëÉ ^ Î Ä Á  ¤ g u § 7 Ú ë  “  / / Á 6 K 5 Ï * M  È þ A Þ ¹¸ 2 ¬] )* ªó .º ¹~ HA Þ yÂÂ>oû ¶×q“+Qâ™ÖOœb²)aï ³´vZ5ýóÿš«ÿ4]ÿÉ ÿZ´þçVþoòýñˆýoýêÿŸü_ÿ!üÏþžû:þû£ý…úýòùhü[ùÆûÂø#û'ø}úŠ÷Øùîö2ùUöø¿õì÷.õM÷¤ô³ö"ôöªó‘õ<ó õÝòô‹òôHò·óò\óôñ óæñÍòêñ›òòwò.òcònò_òÂòjò)ó†ò¤ó²ò2ôîòÑô9óõ“óAöüó÷sôé÷÷ôÐøˆõÁù$ö»úÍö»û€÷Áü:øËýýø×þÇùãÿ˜úìmûõDüú ý÷üýîØþܳÿ¿‹–_`1 ûÊ Àg |ó /n Ú× {/ t ›§ Ê ŽÚ öÚ Q Ê ¡ « å ~  E K ÿ n ¯ ˆ W — ÷ ž œ % “ µ ƒ C m ÐP \. é xà ² ž‚ 7P Ò rä¬Àrm7ûÓ¼‹}G<ùµƒoD&ÛÅŽ…=Bêü“³9gÙxÄÿjÿ¦ ÿ6¦þÁ:þHËýÊTýHØüÂÿVü6ÿÏû¦þCûþ³ú{ýúàü‰ùCüñø£ûVøû¾÷`ú&÷¾ùöùö€øtõå÷ðôN÷tô½öô2öšó¯õ?ó4õòòÃô³ò\ô„òôfò±óYòoó^ò9óuòóžòúòÛòðò)óõò‹ó óþó-óô`óõ¡ó¹õñóköOô+÷ºôö÷3õÍø·õ®ùGö–úâö…û†÷yü4ørýêølþ¥ùgÿhú`0ûWûûKÊü:™ý"jþ;ÿÙ¦Òg™[ÁX Íá {[ Å ¼ Og ס UË Èå 0ï Žì ßÛ ' ¿ d – — b À & ß à ÷ ”  B ë  2 ö Óã rË ® ² Ri ÷B œ Dëð½ŒNZ%¸ðq¸+~çC¥cÇ!…ÞA›ûW²fÈ|Ã.lÛ„´(QÊÿéeÿ}ùþ ˆþ—þ˜ýŸý”ü–ÿ ü ÿ}ûzþìúçýXúQýÃù¸ü,ùü”øûþ÷âúj÷EúÚö©ùMöùÇõxøGõå÷ÑôW÷dôÏöôNö¬óÖõbóeõ(óõýò¤ôßòTôÓòôØòØóíò®óó’óKóƒó•ó‚óïóóYô¬óÓôÖó\õôôõTô™ö§ôJ÷õøsõÎøëõœùoötúüöRû“÷3ü3øýÚøþ‰ùìþ>úÔÿ÷úº¶ûwü|:ýVþý)Âþó…ÿ´Cj¸µlGÌÀD `­ ø †U “ †à ùæ aü ¿  ]ó žÚ Ö¸  * [ H " ] â l   t X u q Ág sX $E Ö. ‡ 9õíÕ¢°Y‹cÊ9… BÞÿ­½z|F:ù×¶›s].çØPFø­¥UOùõ˜—34ÊÿÌ\ÿ`çþïmþzïýÿlýæüÿÿZüyÿÌûîþ;û^þ¨úÍýú8ý~ù¢üéø üVøqûÆ÷Øú:÷@ú²öªù0öùµõ‡øCõü÷Úôw÷|ôùö*ô‚öäóö«ó®õ€óRõdóõXó»ô[óômóTôó3ôÃó ôôôWô ô¸ô4ô'õUô¥õ„ô/öÀôÆö õh÷]õø½õÌø)ö‹ùŸöQú÷û¨÷íû9øÁüÔø˜ýuùpþúHÿÇúwûð+ü¿áü‹˜ýOOþ ÿºÿnk¨Ä6j·,¡•2ð¼@ >„ ·º &å Ž ì A! Ž Ò  @ê lÉ ¢ ¬v ÂD Ñ Û×ßœÝ`Ø#ÏäÀ¥®gš(ƒéh«Jm,1 óå·¿z•<kÿ>À€Û?¦ûm¶2nô"²Ón€%)ØÏ‡p1 Ø£z6Åÿ°NÿDÒþÒQþ]ÍýäEýeºüåÿ+ü`ÿ›ûÕþ ûHþwú¹ýäù'ýRù”üÂøü5ømû¬÷Ùú)÷Gú«ö¹ù5ö-ùÇõ¦øbõ%øõ©÷¸ô5÷tôÈö=ôcöôööó¶õéóoõéó4õøóõôàôCôÆôô»ôÇô½ôõÉô„õâôõõ õsö<õüöyõ÷Ãõ.øöÔøwöƒùáö8úT÷òúÐ÷°ûTøtüàø9ýsùÿý úÅþ©ú‹ÿLûMñû ™üÉCý€íý0—þÚ@ÿ|æÿ‰¦*,Å©\íƒvßú0xwì³Zå¿ * q= ¿I L CH z> ©, Ò õúÙ&¶7ŽCeJ9L KÜE¬=z1H"ãü°å|ËH®Ûo¤Kj%/ûòг pn+:â—ÅG†òB›û>°Ý`w  ³U)ó²ÿŒ6ÿ!µþ°0þ<©ýÃýF’üÇÿüCÿsû¼þäú2þUú¥ýÆùý:ùŠü²øüû-ønû®÷âú5÷YúÄöÒùZöPùùõÒø¢õ[øUõé÷õ~÷Þô÷µôÂö˜ôqö‰ô+ö†ôîõ“ô¼õ«ô•õÒôzõõiõGõeõ–õlõðõõUöõÆöÇõB÷üõÇ÷:öVø…öíøÙöŠù7÷.úž÷Øú ø†û„ø7üùëüˆù ýúUþ£ú ÿ7û½ÿÐûmjüýãýf@þÜþ›wÿ+³£34ªÂJ~ÌÙI,Àt0³˜êúV>ª[÷q=€|ˆµŠç†~:pZ_vJŒ1ž¬ùµÙ»·½”»o·I¯"¥ú˜Ðˆ¤vyaJJ0è³ô|ÑB¬ƒÇXƒ)<÷ñÁ¢‡NKö šÃ9zÓ+hØú†$Ä•ÿ]ÿó’þ† þ…ýœûü"pü¥ÿäû$ÿXû þÍúþDú”ý½ù ý:ù„üºøýû@øwûÌ÷óú`÷súúöõùžö}ùJö ùö›øÀõ5øŒõÖ÷cõ}÷Eõ.÷5õèö0õ¬ö8õyöLõPölõ2ö™õöÓõööögö#öÂö;ö&÷]ö•÷Šö øÀöŒø÷ùJ÷¡ùœ÷5ú÷÷Îú[økûÅø ü7ù­ü¯ùRý,ú÷ý¯úšþ6û=ÿÀûßÿLü|Ûüjý¬ûý>ŠþÊÿP¤ÿÏ-H³¹6"´ƒ/Ý¥/x}»áõ>'–Sèx3–y¯¸ÁðÍ%ÕTÙ}Ø¡ÓÀËÜÀ󲡎!y)b/I1.0.ó(Ó °Œe÷<ãÍᵯ™z{BZ5Å â9²ì›HEê΋‹'B¿öR¥áNlóôÿ•yÿ2úþÊwþ^óýînýzçü`ü‹ÿÙûÿTûþÐúþNúýÑù ýXùŒüâø üsøû øûª÷úP÷*ú÷»ù¹öQùzöïøGö‘øö<øöî÷ìõ©÷äõl÷èõ8÷öõ÷öîö6ö×ögöÊö¢öÆöçöÍö6÷ÞöŽ÷øöï÷÷XøJ÷Éø€÷@ùÀ÷¾ùøBúVøÉú­øVû ùåûpùvüÛù ýKúžýÀú1þ9ûÄþµûVÿ4üåÿµüp7ýø¹ý<þÿ¾þ{>ÿñ½ÿa6ͯ1$–æ7jÎÄ,…8Ùi'”p»µÛóõ- b“-¿8æ? C)CEA^<r4„+“ž§®î±Ù³Â±¨­‹¦lœJ%üpÏ[ Dl)4 øé¸Ãs›)nÜ=‰ 1ÐÕ“uP ¦Á8qÇRÄÛÿhbÿäþ¡eþ9åýÌcý\áüêÿaüuÿáûþþcû…þèú þpú‘ýüùýŒùŸü#ù(ü¿ø³ûcøAû øÔú¿÷júz÷ú>÷¦ù ÷MùáöúøÂö¯ø¬ökø¡ö/ø¡öû÷«öÐ÷¾ö®÷Ûö•÷÷„÷6÷}÷p÷÷³÷‰÷ø÷Tøº÷¯øß÷ù ø{ùCøêù€ø^úÅøÕúùQûdùÐû½ùQüúÔüúXýçúÛýSû_þÂûãþ4üdÿ¨üãÿý]’ýÖþM}þ¿òþ,dÿ•ÕÿùBX­±xTØ5â àZ/{¾Àé?2wQ¬kÝ‚ ”3¥X±y¼™ÃµÈÍËãËöÈü ²*¥0–3ƒ6n4V09+"÷ѦõwáEÉ ®Ð‘lKE²í_¹ƒ«HK åÅ}|/¢Þ/ˆ½ÿ.FÿÑÍþoSþ Øý¡^ý7äüÊÿkü[ÿôûëþûyþûþ¡ú•ý8ú#ýÔùµüvùGüùÜûËøvûøû?ø²úøXúÓ÷úª÷´ùŠ÷lùr÷+ùe÷ñø`÷½øe÷“øt÷pø‹÷Uø«÷BøÔ÷7øø6ø>ø;øøJøÇø`øù~økù£øÆùÐø&úùŠú@ùóú‚ù_ûÊùÎûú@üjú³üÁú'ýû›ý|ûþÞû…þCüøþªüjÿýÚÿ{ýFãý°Mþµþ|ÿÝ‚ÿ9äÿ’Dç¢6ý‚Vʪ ûKH†’¼ØïXH“pÊ”ýµ.Ò[ì„«Î,ð; H)RCZY`oc€dbž\ªS³H¹:¾(À¿ù»Ü¶»¬–¡m’?€ kÖRš5ZñÌÈœ,lÖ7{þ»€U:ìð€¢O¥ÿù4ÿŸÀþBNþâÛýiýøü´ÿˆüKÿüáþ±ûwþIûþçú¥ý‰ú<ý0úÖüÝùsüùüJù´û ùZûÒøû¡øµúxøjúWø%ú>øçù.ø®ù&ø}ù&øSù.ø.ù?øùXøýøxøðø øëøÏøíøùöø@ùùƒùùËù<ùúaùjúŒùÁú¿ùûöùxû4úØûvú:ü¾úŸü ûýZûjý­ûÐýü6þ\üœþµüÿýdÿnýÇÿËý%(þ‚…þÝáþ5;ÿ‹”ÿÝëÿ,>w¿à,Ew„½¾õB*€[»ˆò³&ÜW‡$´DÝa|)”K«j¿‰Ð¤ß¾ëÖôëüþÿþ,ù7ñ@äFÕJÁKªJŽGn?K6")õÃîSÔ´Ñ’‰l<Bì™â@«åp‡1&ï¨\\õÿŒÿ¼"ÿg·þLþ³âýVyýùÿý™ÿ­ü8ÿKü×þëûuþûþ8û´ýåúVý—úúüNú ü úJüÐù÷ûšù¨ûkù]ûDùû#ù×ú ùœú÷øgúìø7úèøúìøëùøøÎù ùºù"ùªùBù£ùhù¡ù“ù¦ùÅù²ùýùÄù:úÝùzúûù¿úú ûJúUûzú¥û®úöûçúKü%û¢üeûùü«ûRýóû«ý>üþŠü^þÙü¶þ)ýÿ{ýeÿÌýºÿþ pþ^Àþ®ÿü_ÿG«ÿ‘öÿ×>…\Ê› ×M‹FÆ{þ­4Ûhš3ÈZõ€ ¤GÅnå“´Ô4óJ]+nD}[Šq’…˜—œ§›µ—ÁË…ÒwØeÛNÚ3ØÓñËÊ¿°mŸ8‰ÿqÂS€3<óæ¥ºUŠV«Qâö¢˜_9ÚÿÍzÿ€ÿ0µþÝSþˆóý2•ýÛÿ7ý„ÿÝü*ÿ…üÐþ0üxþßû þ’ûÊýJûuýû"ýÈúÓüú†ü\ú<ü/úøûú¶ûèùzûÎùBûºùû¬ùäú¥ù»ú¥ùšú¬ù}ú¸ùhúÊùXúâùNúÿùJú#úKúJúSúwúaú©útúÞúŒúûªúUûÍú•ûôú×û ûüRûeü†û¯ü½ûùüùûEý7ü‘ýwüßýºü,þýüzþCýÇþ‰ýÿÏý_ÿþªÿ^þòÿ¥þ8êþ~/ÿÃsÿ¶ÿGöÿ†4Ãrý­7æn¤Tׇ ¹8èe‘Bºm╼+áMm&‹F§eÀ‚מì¹þÒéþ&,%051C.O(ZbhýkçmÍk¯f_fT<G 6Ú!£ hî*Ðç­£‡Z].ÀýoÈÇSqÐÃÿ‹iÿBÿø¹þ¬aþ^ þ·ýÁÿdýpÿýÿÇüÏþ}ü€þ7ü2þõûåý·ûšý}ûQýHû ýûÊüîú‹üÉúOüªúüúåû{ú·ûmúûcúhû_úHûaú-ûiúûvúûˆúüúžú÷ú¹ú÷úÙúüúýúû%ûûPû(û€û@û±û]ûçû~ûü£ûYüÌû•üøûÒü'üýYüRýü“ýÄüÕýþüþ6ýZþrýþ®ýßþìý"ÿ)þcÿfþ¤ÿ¢þãÿßþ ÿ^UÿšÿÖÇÿþÿH2gµ™éÊúM(|Vª€ÖªÒ+ùSyCeÁ†â§Çä:Si7P‘h ~­“·¦¾¸ÁÈÁÖ¾ã¸í­õ üŽÿx_ÿBû ôüêÒݦÍuºA£ ˆÏk‘JQ% ýÇÒ~¢4qç;šLÇýÿ‰¯ÿH_ÿÿÁÀþ{sþ5'þîÿÜý¦ÿ”ý^ÿNýÿ ýÎþËü‡þüAþVüþý!ü½ýñû}ýÄûAýœûýyûÑüZûžüAûqü,ûFüûüûýû ûßû ûÅû û±ûû û û•û1ûŽûEûŒû]ûŽûzû•û™û¡û¼û°ûâûÃû üÛû5üöûdüü“ü7üÅü\üùü„ü.ý®üdýÛü›ý ýÓý9ý þkýFþžý~þÑý¸þþòþ9þ*ÿnþcÿ¢þ›ÿÖþÓÿ ÿ<ÿ?nÿuŸÿ©ÐÿÝþÿ*AWrƒ¢­ÐÖýþ*%UKp¨“϶õ×ø<^7~Tœq¹Ó©ëÂÛó&4A2JDPURdRrOH‡=/•˜šï˜Ò“³ƒhv=fTß>«$u<éÿÅÁŸv>Jû¶èp´*}åÿDŸÿ WÿÌÿŽÌþOˆþFþÑÿþÿÇýPÿ‹ýÿQýÑþý”þèüWþ¸üþŒüäýdü¯ý>ü|ýüKýüýéûõüÔûÎüÄû«ü¸ûŒü°ûqü¬ûZü¬ûFü°û8ü¸û-üÄû%üÓû"üåû#üûû'üü0ü.ü<üMüLünü`ü‘üvü¶üüÞü«üýÊü1ýìü^ýýŠý5ý¸ý\ýèý…ýþ®ýHþÙýyþþªþ0þÜþ]þ ÿˆþ?ÿ´þpÿáþ ÿ ÿÑÿ7ÿaÿ/Œÿ^µÿŽÝÿ»é*OAtl—–»¿Þèÿ7?\^€}£›Å·æÕð# ?&X>qW‡o›…­›½°ÉÄÓÖÚçà÷áßÛÓ%È,¹0¨4“4{2_-A&úÓ©î{ÙL¦刯gwC=óÆÇˆ™Jh 6Ïÿ‘ÿÌSÿ–ÿ^Ûþ&¡þïÿgþ¶ÿ/þ}ÿúýEÿÇý ÿ–ýÖþiý¡þ>ýmþý;þñü þÐüÞý±ü³ý—ü‹ýüeýküCý[ü#ýOüýFüïü@üÙü>üÇü>ü¹üBü¯üJü§üTü£übü£üqü¦ü„ü¬üšü¶ü±üÂüËüÓüçüåüýùü$ýýEý+ýiýGýýcý²ýƒýØý£ýþÅý(þéýQþ þ{þ1þ¥þVþÏþ{þùþ þ$ÿÆþOÿìþyÿÿ¥ÿ5ÿÏÿYÿøÿ}ÿ! ÿKÃÿuåÿÆ$îEe=ƒd¢ˆÀ¯ÜÓúõ1:LZgy—›´´ÏÍèåü*(;<KQXdcvk†q–t¤t°q¼lÅcÌXÓJÖ8Ø$× ÕôÐ×É·¾–±q¢I {õdÈJ˜.g5ìÈÍ¢—yaO+$õÿõÀÿÇŠÿ—Tÿf ÿ4ìþºþÒÿ‰þ ÿZþoÿ-þ>ÿþÿÙýàþ´ý²þý†þný]þQý4þ5ýþýëýýËýôü­ýåü‘ýØüxýÏübýÈüOýÃü@ýÂü2ýÃü(ýÈü!ýÎüýØüýãüýñü$ýý+ýý4ý(ýBý>ýQýVýbýoývýŠýŠý§ý¡ýÅýºýäýÔýþïý$þ þFþ)þiþFþŒþeþ¯þƒþÔþ£þøþÂþÿáþBÿÿgÿ ÿŒÿ>ÿ±ÿ]ÿ×ÿzÿüÿ™ÿ¶ÿCÓÿgðÿ‹ °%ÒAö\u;]©~ÞÛ½ôÝ ù%<3SMif€~–”¬¨Á»ÕÌèÛúè òú.<JWakútñzå~ׯ€³œ|…vjnMc.W Hé6Ã" tóJØ »óœÅz—Wi3:  åßÿ»°ÿ‘‚ÿgUÿ<(ÿþþæÿÓþ»ÿ«þÿ…þfÿ_þ<ÿ<þÿþìþüýÅþßý¡þÆý~þ®ý]þ˜ý>þ…ý!þuýþgýîý[ýØýRýÅýKý´ýGý¦ýFý›ýFý’ýHýŒýLýˆýSý†ý\ý‡ýgý‹ýtý‘ý‚ý™ý’ý£ý¤ý¯ý¶ý¾ýËýÍýàýßýøýòýþþ)þþBþ2þ]þJþyþbþ•þzþ±þ”þÏþ®þìþÇþ ÿâþ)ÿüþGÿÿfÿ/ÿ…ÿIÿ¤ÿbÿÄÿ|ÿâÿ•ÿ®ÿÆÿ=Þÿ]öÿ{ š#¹:×Qôg}/”LªhÀƒÕë·Ðè)þ>R(e;xL‹\j®v¿Ï‰Þë“ø–•“!ˆ'~+s.e.U.C-/)"æË­óâmÏJº&£‰Ün¶Q3h@òÏñÿ¬Ëÿˆ¤ÿc~ÿ=Xÿ3ÿôÿÿÏÿíþ©ÿÌþ…ÿ­þ`ÿþ>ÿsþÿXþúþ@þÛþ*þ½þþ þþ…þóýmþåýUþØýAþÎý-þÅýþ¿ýþ¼ýþ¹ýøýºýðý»ýëý½ýçýÂýåýÈýæýÑýéýÚýíýæýóýóýüýþþþþþþ1þ-þBþ=þVþMþkþ_þþrþ•þ…þªþ™þÂþ­þÙþÃþñþØþ ÿíþ"ÿÿ;ÿÿTÿ-ÿmÿCÿ‡ÿYÿ¡ÿnÿ»ÿƒÿÖÿ˜ÿïÿ­ÿ Âÿ"Öÿ=êÿWÿÿqŒ%¥8¿LÙ_òr …#™;¬R¿iÒ€ä•÷© ¼Ï-à?ïOý_ o~'›-§1³3¾4È3Ñ/Ù+Þ#ãçèèóçâãÐ޻צÏÃu¶Z¨?—"…qå[ÅD¤,„bõ@Ø»þÿœÝÿ}½ÿ\œÿ<}ÿ^ÿýÿ@ÿÜÿ#ÿ½ÿÿÿìþ~ÿÔþ_ÿ¼þBÿ¦þ&ÿ‘þ ÿ~þñþlþØþ\þÁþOþ«þBþ—þ7þ†þ.þuþ'þgþ"þZþþOþþFþþ@þþ;þþ7þ!þ6þ&þ6þ,þ8þ3þ<þ<þAþEþHþPþPþ\þZþiþdþwþpþ…þ}þ•þ‹þ¥þšþµþ©þÇþ¹þÙþÊþëþÛþþþìþÿýþ%ÿÿ9ÿ!ÿNÿ2ÿbÿDÿwÿWÿÿhÿ¢ÿzÿ¸ÿŒÿÍÿžÿäÿ¯ÿúÿÀÿÑÿ$âÿ;ôÿQg~$”5ªFÀVÕgêxÿˆ™(ª;ºNË_Ûpë€û ª(µ5¿CÇQÏ]ÕhÙsÛ}܇ێٕ՛ϟɣ¿¤´¥¨¤š¢Šz˜gT†?|)obùRß@Æ-«tíXÖ<½ ¤ŠêÿoÏÿT³ÿ8™ÿÿfÿçÿNÿËÿ7ÿ°ÿ!ÿ—ÿ ÿ|ÿøþcÿæþLÿÕþ4ÿÅþÿ¶þ ÿ©þõþþãþ’þÒþ‰þÃþ‚þ¶þ|þ©þwþžþtþ•þrþþpþ‡þqþƒþrþþuþþxþþ}þþƒþ„þ‰þ‰þ’þŽþ™þ•þ¢þœþ­þ¥þ·þ¯þÃþ¹þÐþÅþÜþÑþéþÝþøþêþÿøþÿÿ#ÿÿ3ÿ#ÿCÿ1ÿTÿ@ÿdÿNÿuÿ]ÿ†ÿkÿ˜ÿzÿªÿ‰ÿ»ÿ—ÿÍÿ¦ÿàÿµÿòÿÃÿÒÿàÿ(îÿ<ýÿN at%‡4™C«Q¾`Ðná}󋚨#·1Å?ÓMàYícúnw…*Š5Ž?‘G’P’W]Œbˆg‚jzkrlhk\iPfBa2[!SIý?ê2Õ%À«”õ}âfÏO»7¦yóÿbÛÿJÅÿ3®ÿ™ÿ…ÿìÿpÿÖÿ]ÿ¾ÿJÿ§ÿ9ÿ‘ÿ)ÿ{ÿÿgÿ ÿTÿýþAÿñþ/ÿæþÿÛþÿÓþÿÌþôþÅþèþÀþÞþ¼þÔþ¸þÌþ¶þÇþµþÁþ´þ¾þ¶þ»þ¸þºþºþ¹þ¾þ»þÂþ¾þÈþÁþÎþÆþÔþËþÚþÑþãþØþìþáþõþéþÿþóþ ÿýþÿÿÿÿ*ÿÿ7ÿ)ÿCÿ4ÿPÿ@ÿ]ÿLÿjÿYÿwÿeÿ…ÿpÿ”ÿ}ÿ¢ÿ‰ÿ°ÿ•ÿ¿ÿ¡ÿÏÿ®ÿÞÿºÿìÿÆÿýÿÒÿ Þÿêÿ*öÿ:J Zj&y2‰?™K©X¸dÆqÕ~â‹ï—ý¤°¼Ç(Ó1Þ9è?óDýIMOPQ%O+L0I3D6>879.8%62/)ó#åÕÅ´û£ïá}ÒkÂW²D¡0| h÷ÿUåÿAÑÿ,¿ÿ®ÿÿòÿŒÿÞÿ|ÿÊÿlÿ·ÿ^ÿ¤ÿQÿ’ÿDÿ€ÿ8ÿpÿ.ÿ`ÿ#ÿRÿÿDÿÿ7ÿ ÿ+ÿÿ ÿÿÿûþ ÿøþÿõþÿóþúþñþöþñþóþòþñþóþñþöþðþùþñþüþóþÿöþÿúþ ÿÿþÿÿÿ ÿÿÿ$ÿÿ-ÿ ÿ5ÿ(ÿ=ÿ0ÿEÿ9ÿOÿBÿYÿLÿcÿVÿlÿ_ÿwÿhÿ‚ÿsÿÿ|ÿ™ÿ†ÿ£ÿ‘ÿ°ÿšÿ»ÿ¥ÿÈÿ®ÿÔÿ¸ÿàÿÃÿíÿÌÿùÿ×ÿàÿëÿöÿ,ÿÿ:GUc&p2}=ŠH–R¢]¯hºsÆ~Јۓãží¨ö²ý»Å Í×ßæíóùþ  ü ô ëá×þËø¿ñ²é¤à–Ö‡ËxÀi³Y¥I˜9ˆ)xiYúÿHëÿ7Ûÿ%Ìÿ¾ÿ¯ÿôÿ¡ÿäÿ”ÿÓÿˆÿÂÿ|ÿ²ÿqÿ¤ÿgÿ•ÿ\ÿ†ÿSÿyÿKÿmÿCÿaÿ=ÿUÿ7ÿLÿ2ÿCÿ.ÿ:ÿ*ÿ3ÿ'ÿ-ÿ%ÿ'ÿ#ÿ"ÿ#ÿ ÿ"ÿÿ#ÿÿ#ÿÿ$ÿÿ'ÿÿ)ÿÿ-ÿ ÿ1ÿ#ÿ5ÿ&ÿ9ÿ+ÿ>ÿ0ÿDÿ6ÿJÿ;ÿPÿAÿVÿHÿ]ÿOÿdÿVÿkÿ_ÿsÿfÿ{ÿnÿ„ÿvÿŒÿ}ÿ•ÿ†ÿžÿÿ¦ÿ–ÿ°ÿžÿºÿ§ÿÃÿ¯ÿÎÿ·ÿØÿÁÿáÿÉÿìÿÑÿ÷ÿÚÿâÿ ëÿóÿ"üÿ-8 COZ(e1p:{C†MV™`£j¬rµ|½…Ä̗Ҡبݰà¸å¿çÅèËêÑéÖéÚèÞåáâãÝäÙåÓäÌãÅá½Þ´ÚªÕ Ï•ÈŠÀ~¸r®e¥XšKŽ>‚0u#hZLüÿ>ðÿ/ãÿ!×ÿÊÿ¿ÿ÷ÿ´ÿéÿ©ÿÛÿžÿÍÿ•ÿÀÿŒÿ³ÿƒÿ¦ÿzÿ›ÿtÿÿnÿ…ÿgÿ|ÿbÿrÿ]ÿiÿXÿaÿUÿ[ÿQÿUÿOÿPÿNÿKÿLÿHÿLÿEÿKÿCÿLÿAÿLÿ@ÿNÿAÿOÿAÿQÿCÿSÿEÿWÿGÿZÿKÿ]ÿOÿbÿSÿfÿXÿkÿ]ÿpÿaÿuÿgÿuÿgÿzÿmÿ€ÿrÿ‡ÿyÿŒÿÿ“ÿ†ÿ™ÿŒÿ ÿ“ÿ¨ÿ™ÿ¯ÿ ÿ¶ÿ§ÿ¾ÿ­ÿÆÿµÿÎÿ»ÿÖÿÂÿÞÿÉÿçÿÏÿïÿ×ÿøÿÞÿLIST`INFOISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comIENG ICRD 2004-08-19centerim-4.22.10/share/online.wav0000644000175000001440000056763411461606612013540 00000000000000RIFF”ïWAVEfmt "VˆXdataï &%>;c^š“êÞiU?WW›% c d • ¾Ë íÑü°ær¸)ŽÕd~1%ß»j"¹ H¹!2g"Ù×"7 #f 4#z 3#€ )#o #N Ü" ƒ"Í "Zt!Ĺ äY /ÆRvV¢¶Î/õÛÑ'5[>³CM<\PmJƒ4ž¾äÝ®ù h 8 ‚W ßv › =ÅKõQ+SiP°NýNSM´KK O >_ Œ "Ò n8 õ¾“Q%Þ´j9ñ°pì†dïÛXS¿Ì Ar¯°ÑqѾµüÿw+ÿJþ¯\ý,aü˜^ûóTú@Dù.ø²÷ÕýõïÞô»ó•òÿnñþEðýï üëíûÎìþùÆëùËêøÛéI÷ûèö&èÇõ_çõœæyôâåÜó4åKó—äÖòä~ò­ãMòsãCò_ãZòhã‚ò€ã§òšã¾ò¨ãÄò¥ã½òžã¹ò¢ãÚòÌã>ó5äõóñäýôþåIö?ç´÷’èùàé6úëûçë û•ìü,íküØíýÁîùýð\ÿ²ñ®óÑõòí÷¨Ôùmûü¹ü Ïý Ýþ‚ " r &2 Ž ÷ò>¡ D ü$ hœÿ¸ýÜf]ij5.+¤óù$Dqw×ÄD&³ìs ³ ÔèÖ ‡¿ ž |w öP |. œú&Þ¢ÀžUz‘RÃ.ÿô þ,ñünÜûÀÓúÛùòøá ø@ W÷ ¤öÔ ûõ RõE ©ô„ ÿóÕVóB¶òÐ+ò|Ãñ;‚ñÿjñ¸rñYñß­ñJ½ñ­´ñ‘ñš^ñC(ñññ 'ñvñããñŸ\ò2Íò¦*ó nóy“óûÿ©ó›ÿ½óRÿ×óÿÿóØþ4ô‡þrôþ¬ô‰ý×ôÞüïô"üõô\ûìôœúßôæùÙô:ùàôøöôÜ÷õ!÷8õVöTõzõ^õ•ôPõ®ó+õÊòûôéñ¿ôñƒô;ðUôfï8ôî.ô·í4ôÞìFô ìdô9ë€ôtê–ô¼é¢ôé¬ôgè·ôËçÉôBçñôÌæ=õmæ©õ-æ5öæÓöæx÷æøæŒøþåðøïåHùÚå¨ùÚå(úæèúgæóûçCýèÃþ+éJ`꺅ëîìÕHí€èí}îž-ïhðˆiñ óÎ åôµ ÝöŒÀø'lúeÐûGòüàîýXîþÚx~¨çó¼8qTé * · é '¶ :¡U°…ÞÇ D=BQü7rè°rÑçëQ¸X$¯“ úQMx‡p©5²Ó§\’Ýcnó_”Q4FÎ6 Y Îÿ /ß }½ÅjnÏbBZ [@ gº $ £ÿ€ ÑþÑ þ Gýt …üß¾ûgõú 0úËqù˜Åøc3ø½÷Äc÷P÷ÊÖö?ˆöÁ'ö^­õõ…ôüòóûtóîóÆÝò{½ò©òò^ò‰ ò šñÍ ñjðTÉï<ï¼ÿÆîJÿeî½þîþÊíjýví·üí ü–ìbûì¾úmëúÑênùCê³øÉéê÷gé÷é:öäè]õ±è‚ôuè°ó,èáòÖçòwçFñçuðÅæ¢ï˜æÊî•æøí¾æ1í çuìqçÃëÚçë3è€êwèïé­èbéàèæè'é~è™é0èNêüçCëâçiìÝç¨íãçæîäçðÜçøðÒçÇñËçŽò×çmóè„ôƒèïõ7é­÷ê¨ù*ë´û?ì¦ý=í]ÿîÀÀîÞTïØëïÛ¤ðžñžçò‚uô¥ /öÝ ò÷÷˜ùÈû83üJ/ýþÐ ÿ•(‹» ´~XÐØí  Gñ ‘« ºh Ù> ÿ:5Rwj´mÕGÍá•=2j¨„ žgÄÄ!R{¡ÍÛ ó,ä5©,KÜñoжª¢VŒu¯]D? Ä 5ò œÎ þ­i’ã ~k qü k k s¢ … ¤} Ðÿå ÿU @þ×€ýu¾ü/ûûý6ûÓtú£¼ùcù ˆøŸø'³÷±]÷K ÷ªö×6öÈ«õÆõÀtô«àózcó)ó¼òMŠòÙ`òq+òàñØyñž÷ðbcðÉïÀ:ïJ¾îÂÿWî(ÿîˆþÀíæýxíGý$í¯ü½ìüGìvûÂëÌú;ëúÁêSù[ê…ø ê´÷Òéäö¦éö|éMõHé‰ôéÅó·èÿògè3ò#èdñùç”ðòçÉïèïgèIîÆèží(éÿìéeìÅéÔëòéJëêÊê_êWêËê÷énë´éSìŠélívé¢îqéÓïtéçðvéÓñné—òdéHóféô„éýôÊé=öGêÎ÷ýê¢ùßë˜ûÓìƒýÇí=ÿ¥î©]ïÑöïÉðµñÃáñâò¼*ô¨ §õ¸ @÷Ã ÓøšAú!|ûP€ü6`ýó9þ¬'ÿƒ?н ŒRtT]jI e ž¨ ÂZ é%  RŒ·ó¨ &Qrâ–Xª¿Å"ð‡-írH¸•èÏõïÜ÷¢ìMÙëʼn°5¡ë–¥Œ\} j ¬Q 93 ¹ 6ô¶ Ü@ ËÕ Àu ¼ À¶ ËI ØÑ íP Î 7ÿU jþð¨ý¢îüj5ü@{ûÁúï ú¯Vù[¬øöø‘÷+#÷ÛÅö§löö…ªõƒ2õxªôXô…óÌóiò8òœøñFÄñ’ñÅSñŽþðP’ððŸ…ï&úî ~îîyÿ¼íæþsíTþ0íÂýæì,ý‘ìü/ìèûÅë2û[ëqúöêªù êáø^êø+êQ÷þé‘öÏéÔõ éõiéPô/é‡óýè¼òâèîñäè#ñédðDé­ï™éïòébîBêÌí‚ê>í·ê²ììê,ì0ëµë›ëLë<ìùêíÀêî ê<ï“ê`ðêlñêQòŒêó†ê¿ó€êyôêXõºêzöëì÷žëŸùTìvû.íQýîÿëïµLð´Ùð dñžòÌÙòCæó ,õé ›öÝ ø³ùJÁú”Ðû“µüc„ýUþåDÿÒ^æ¥ OsrÅhêÛžî? "Ú J‡ vM ¬+ ä ü $Ã[ÞÂÿ y6éPQ¹¼üy5¿Zî_A¹ôfæÛÏÑËTż Ǩ o u Ÿ Y 3 >Î (o   l # 1¦ C8 XÏ wÿp Ÿþ Ñýâ ý¶Pü“ûmíú>9úý‡ù­×øR.øø÷ªþöoƒöMö?¹õ<^õ7þô#“ôûôº‘óeó ò¬òV ñQñÕñ¡Ûði ð$VðÏüïgïíïf•îÛîP°íÇÿQí<ÿí°þ½ìþ|ì€ý8ìÕüíë üëcûLëžúþêØù¶êùtêXø?ê›÷êÞößé!ö¶é_õ•é˜ô€éÍówéó„é<òªé{ñáéÄð$êðiê~ï®êçîìêVî&ëËíeëEíºëÆì3ìUìÔìúë£í´ë›î†ë¨ïmëµðeë¯ñdë’ò`ëVóZëôTëÃôZë¢õtë·ö°ë øìù±ìWûlíý:îËþ ïGÍïŠtðñ‘‹ñˆò¦Ëòü­óÅôU ö. f÷ú Ãøœúúû üûÛüÀžý†nþaaÿ]}x½ž¹]¶‹‚‹Yz¼˜í- Ó K” ~j ­D É Ãº ›<QèÀhÞÜùM¼G$ƒ…¿Øî<MåP­Ii=$1ä,©)r#? Á ÿ s å É Ë ¯t —! …Ò {ƒ {3 ƒÞ Œ† š/ ­Û Åÿ’ àþW þ+ 1ý küå¯û¾ûúNúL¢ùÿõø±Iøg÷-ùöaöóÚõíbõêûôßžôÁAôÝóLoóùôò¢pòQêñ lñÒûðžŸðkSð0ðæÚïPï ôîŒî—î¦í7í Õìƒÿ„ìðþ>ìRþì¨ýÐëñüžë4üeëtû'ë´úèêöù§ê:ùeê‚ø(êÈ÷ùé÷×éDöÅé~õÄé¶ôÔéìóõé&óêjòPê·ñ‡ê ñ¾êjðñêÔï&ëDïfëµîµë+îì¬í ì:íLíÓìîƒìÿîLìõï+ìïðìÛñì³ò ìxóì7ôÿëþôÿëÞõìëö;ì.øŠì¥ùíAû¢íìü]îþï ÜïX‡ð{ñ€Ÿñ&ò’ÀòЀóCpôç Žõ¥ Íöb øUùqsú¥hû¡9üxöü@µý‰þü‚ÿÿŸÕ*)?J©)"Üvq¯üÞ5 @ï mº Š‚ ‘6 yÈ <4 ãz q¤ ðÀ dà ÖC7¬m£LË€Û Ò©´ª†£Mœ•Þ ¯ Œ€ ‰S ~ # m î Z ¯ A l % ( á õ– èM á ภæo ñ* í ½ (ÿ• Cþt cýX Žü6 Æû ûÕTú•¨ùPþøTø×©÷±ÿö›Xö”¹õ“*õ©ôy9ôR×ó{óÒóƒ·ò8FòóËñºIñ‰ÇðYPð%éïä“ï“Oï/ï¾ÝîDŸîÄSîFùíÉ“íK$íÉ·ì?Tì®ÿì ÿÅë_þ—ë«ýqëðüNë5ü&ëxûõê¾ú¼êú{êLù?êø êÓ÷éé÷áéJöíéõ ê»ô9êûónê>ó¡êŠòÐêâñøêAñ%ë§ðXëð˜ë…ïïëþîfìyîúìî«í™ítîFíPïí6ðÖìñ¼ìôñ®ìÈò¥ì“óžìZô—ì*õ•ìöœì÷¹ìRøöì°ùZí1ûàíÃüîSþ6ïÌÿêï$‘ðW&ñm¬ñu-ò…¸ò³aó 2ô‘ -õ4 Nöà ÷}±ø÷Ìù=ÆúMœû5Xü ýÓÌý°§þ¢£ÿ¨¼³ç± •M×À9\äµhãú¡?W b pÉ bh 6ä ë= „z   ‰¿ á o Ú> =s Ž¡ ÉÄ ñÐ Æ ¨ ‚ U $ ú üÔ ö³ í ‘ á k Ì C ´  œ ß ‚¢ ha U IÙ B˜ B^ F- P ^ç nÿÑ ‚þ» ›ý  ½ü} çûQ û [úÛ§ù úømPøI¨÷3þö-Tö.¬õ+ õuôïóÔxó–óQ´ò XòÇøññañ5žððΣï†6ï.ÛîÆ’îSXîÛ%îbííè®íp`íõítžìé:ìRßë²ÿ”ëÿ^ëRþ9ëšýëâüþê+üÝêtû²ê¼úêúIêHùêˆøêÅ÷ûé÷ ê=ö3êxõfê¹ôœêôÏêNóûê¤ò$ëòMëgñ€ëÓðÊëCð,ì¸ïªì6ïDí¿îùíQî¿î÷íŽï®íbð|í7ñYí òBíØò5í§ó,í|ô#íYõíFö"íL÷8ítøeí¿ù³í#û%îœüµîþVï”ÿÿïñ¡ð04ñV¸ñj4òz¶òžMóàôJ âôÕ åõp ÷ ø‡3ùÜ,úÿûöÁûÐnüœ ýqäýWÆþOÇÿRØQð9ùþ暬 N\ܘ\Ëáút&KËax ^ >¥ ÿ ¦X 8Œ ¹³ 2Õ ¨ü ) }^ Ó’ ½ OØ lã zÛ €Á ~Ÿ z{ uW p: l a S ù B à * Á  š ôi Û. Åñ ²· ¦‚ ŸW 7 Ÿ" § ´ÿ Ãþü Õýå îüÀ ü 7ûY jú# ©ùõñøÓBø¾–÷ºîö½Fö¾õ¹õô¥Sô€ºóK/ó µòËJòêñXñ*4ñÏðÖ_ð¥æïeiïñîN%îßÜíj íôní€<í í‘¿ì mììçÁëCsë—ÿ2ëéþë5þÝêý¿êÌü¢êü„ê`ûbê§ú?êêù#ê*ùêiøê¤÷+êáöNê!ö{êgõ¯ê¯ôÞêýó ëUó3ë²òeëò¤ë}ñöëîðbìeðêìáï‡ígï4îûîíîî±ïNîzðîCñéíòÏíçò»í¾ó­í›ô¢í€õœísöœíw÷¨íøÎíÂùîûlî}üèîïýzïaÿðůð<ñAÀñ\9òn²òŠ;ó¾ßó §ô‰ õ ‘ö¨ ž÷*¥øˆ™ù¹pú½-ûŸØûnü>6ýþ èþæÿìïì¿Öe¢ãM@Ü„Z¸Ùèaõ?–X?]áIp æ É@ b‚ î° mÕ äþ V, À\ ‘ jÅ £í Í ä í ïó îÙ ì¿ æª Ýœ Õ’ Ç Š ³ ‚ œ p ‚ T g - Kþ 2Ë › s ýX òJ ðE ïE öÿB ÿ6 þ !ýù 9üÌ Xû› ún ´ùN îø; 4ø7 ƒ÷= ÖöC /öD ‡õ8 ßô :ôï—ó¹ÿò~qòDôñ…ñä#ñ½Çð–jðj ð4 ïí-î7BîÌ×í^zíî.íñì Áì—ì^ì—&ìãëiëÇVëëqÿ×êÂþ¥êþ~ê_ý_êªüEêóû1ê9û"ê}úê¼ù!êúø.ê;øEê|÷fê¾öŒêö²êQõÙê¡ôë÷ó6ëRósëµòÀë ò$ìŽñžìñ'í‚ð¿í ðeî›ïï9ïÅïçî€ð©îHñvîòSîòò=îÕó,î¾ôî«õîöî˜÷î¤ø5îÈùhîû¹îZü&ïÆý¦ï8ÿ3ðŸÁðóIñ-ÆñN<òa±òv0óžÄóäwôK IõË 3öW .÷Ú&ø?ùzåù†ŸúoGûBêû’üèNýÑ þÈÿÃýÿ±ñ†Ö8¢ÁP&åqf«àà^é9€Xf¹WL/Êì. z !µ ¥å # š; n f§ ¹Ý ü )4 EJ WP _J ^? [2 X' Q" F% 7) # '  ð  Ó ò µÎ ›¥ ‚† ko Zb Ib >j 8q 6r <ÿg DþP Qý, eü }ûÝ ú¾ Ãù¬ ôø© -ø¯ q÷¸ ½öÀ ö» iõ§ Áô… ôV xó ÙòëAò»³ñ’4ñkÃðH]ð ÿïî¤ï°Fïcáî uî¨î@—í×0íkÕìüˆìKìì—ïë Çë{šëàië<1ë–óêîÿµêCÿzê”þFêãýê/ýêwüøé»ûûéýú ê@úêƒù<êÄø[êøxêO÷‘êšö®êæõÎê6õöêŽô.ëéózëKóÛë´òNì$òÐìžñ_íñôí¡ð‹î3ð&ïÐïÎïzï‚ð4ïEñïòØîþò¹îíó£îÞô“îÏõ‡îÀöîµ÷„î²ø™îÅùÆîöú ïCüfï¦ýØïÿXðÚðÚZñÑñ=AòP±òa'ó¯ó»Rô õ åõ Ëö—´÷þ“ø>aùRú@¼úZûæûû½§ü¤iý—?þ!ÿYã­¡^ócx£óÛl î<y]m¨l7M¶'¼€TÂàùa+ Ù\ K ³È  N< „j ©Š »¡ Ç« ̬ Ë« Ç­ ¿¶ µ¿ ¥Ê ‘ Ó x Ô [ Ê = ·    þŠ ây Éq ²u ‚  €š w› vÿ‘ yþy €ý[ ü= Ÿû$ ¸ú ×ù þø -ø% f÷/ ¨ö1 óõ# Eõ žôã ÷óµ Uó… µòX ò1 ñ óðîtðÉð›˜ïc:ïàîÍ„îr%îÃí¬ZíFñìÞìr4ìÿé놯ëƒëwaëâCëG!ë§÷êÇê]êµÿOê ÿêZþêé¤ýÍéëüÃé1üÏévûíé¹úêýù9êBù\êŒøyêÕ÷ê÷¥ênö¿êÂõëêõ+ërôƒë×óðëBópì²òüì*ò‰íªñî3ñ¤îÃð6ï]ðÒïð~ð¾ïCñƒïòUï ó3ïôïúôïîõöîÛöîîÆ÷ïî»øýîÄù ïèú[ï,ü¬ïýðüþ€ðfùðÂoñÝñ)Hò<±òI"óežó›3ôð àôa £õâ vö_N÷Æ ø äø —ù9úïÑúÃiûš ü~Àüq„ýjVþX/ÿ3ðÈsý V“ž Ü„Bˆi€¤€3h·4)鉈נP…‘¿ûýX: £t ܬ Ù ù . 1" 21 0> *N c s ú € à ˆ  ‰ Ÿ „  z ^t <w € Ž í¡ ×³ Ž ¸½ °ÿ² «þ¡ ¬ýŒ ²üz Àûq Òúq ëùz ùˆ 1ø” `÷™ ˜ö’ Ûõ€ %õ` xô; Ñó -óë òÇ ïñ¦ Uñˆ Àðe 5ð< ´ï @ïÉÙî}{î+#îÑÌírríí®²ìFOìÙðëdëæYë_%ëÑë>äê¥Êê®êfˆêÄWê!êqÿíéÀþÁé þ¤éTýŸé™ü®éßûÎé&û÷énú%êµùKêùgêNø}ê÷•êìö´ê>öäê—õ*ëöôŒëYôìÅó‰ì8óí³ò¢í2ò*î¹ñ°îKñ9ïçðÓïð‚ðBðHñð(òÔïó¬ïôŽïõvïþõdïéöXïÐ÷Tï¾ø`ï¿ù}ïàú¬ï"üñï~ýKðéþ¯ðQñ«‡ñìïñSò%µò3óL‘ó€ôÑ ·ô> iõ¹ ,ö2óö•¸÷×søòùê¹ùËNú¡àú}zûe üW×üK›ý<dþ+ÿ×èÿr”í-N³œ0ߪ!Q {(”³›=ˆ¿Z7¹ôR>Ü^¾×úG9¤|ó½1ø\- x[ ‰ ’¡ ˜½ •Ø ô ƒ t! ^4 B E # N U Ü ` ¶l “} s’ S© 7À Ñ Ø ôÙ äÿÔ ÜþË ×ýà ÖüÁ ÜûÇ éúÒ ûùá ùï 6ø÷ ]÷ö Žöé ÆõÑ õ² Tô‘ ¨óp óR aò4 Åñ )ñø ‘ðÑ ð¡ wïe ùî ˆîÒ#îÈí%ríÉíjÊìqìœì*¼ë±hë0 ë¥çê¼êœêèƒêLlêªNê+ê^ê°ÿÞéýþ½éHþ©éý¨éÔüºéüØébûê«ú,êôùUê>ùvêø–êÚ÷¸ê(÷ãê{ö!ëÓõtë1õÜë”ôXìÿóÜìróeíëòîílòtîóñ÷î„ñ„ïñ"ðÁðÕðrð ñ3ðòÿïuóÕïoô²ïcõ™ïOö†ï4÷uïøoïùwïúï!û»ï]üùï°ýLðÿªðrñÄsñþÖñ7ò.˜ò;ýòRnóñóË ‡ô- 1õ› êõ©ö_g÷—ø­Æø¢cù‚øùY‹ú3#ûÆûvüñ4ýÙ÷ý®ºþfuÿ"z¾ÝL-ÐoM­ÉãJ Ð$[,ãgíäªSV³ò€S›‚Ýò"Ti¦®çî+ 7d M– [Á cè e `- ZG L_ 8v  Œ  á ° ¼ È ˜á vü U 7. A K êP ÖP ÇÿM ¼þL ´ýN ²üW ·ûc Âúr Ôù} ëø„ ø‚ 1÷t _ö] •õ@ Ôô" ô oóä ÉòÇ )ò© ñˆ ÷ð_ eð, Öïï Nïª Îî] Zî ñí°“íT>íôñì‘¥ì%Yì±ì7Ãë³{ë':ë˜ÿêÒêh°êÊ•ê*ê„lêØ\ê(Iêuÿ7ê¾þ.êþ-êBý4ê‡üGêÉûdê û‰êSú°êšùÙêãøë-ø2ëv÷gëÅö¦ëöôëlõTìÈôÀì-ô8í™ó¸í ó;î„ò½îò>ïŽñÆïñZð·ðûð^ð³ñð‚òÑïbóœïKôuï8õVï#ö<ï÷(ïâ÷ïÁøïªù%ï§ú=ï¼ûlïîü¬ï6þýïˆÿ[ðÔÀð(ñ?ŒñWïñ_Ròfºòx.óž²óÛ Jô- ôô‰ ªõâ iö(&÷RÞ÷]‰øK*ù'ÂùûYúÐõú¬›ûLütýQÈýŒþÍFÿaõÿØ—8,ˆ¶Î8 ¼>>hÄN…ÙtaKÞ Q¼¼Zðl{¸ûoNו.Ür# ¦h Ϧ ëà ý D j ‹ ¨ Å ø Þ ã ÷ Ç  ¨ 4 † T fs D’ $® À íÌ ÔÓ ¾Õ ­× ÿÚ ’þâ ‰ýí …üû ˆû ‘ú £ù ¹ø Ù÷ ÷ð -öÔ aõ· Ÿô— åó{ 3ó_ Œò? ìñ Sñð ¿ð½ 0ð€ ¦ï8 "ïé ¦î• 0î> Ãíãbíƒ í¾ì°yì<9ì¿ûë9Àë­…ëLë…ëéêêKÂꩤêêSƒê£~êìÿ€ê1ÿ‡êqþ“ê±ý êñü³ê/üÊêoûâê±úëõù&ë8ùRë}ø…ëÄ÷Âë ÷ ìYö_ì¨õ»ìþô#í[ô“í¾óî(óîœòøîòwï—ñýïñ‡ð±ð#ñLðÐñóïŽò¦ïZóiï4ô8ïõïøõðîÕöÚî¯÷Êî‡ø½îeù½îLúÊîGûçîYüïƒýVï¹þªïùÿ ð6oðfÖð„<ñ’¢ñ•ò—rò¤ëòÃróö ô: µô… lõÊ *öèöŸ÷MøñøÝù®)úÊúVsû3%ü âüà¢ý¡dþJ!ÿ×ÔÿKx«ü¤>,|³°9ÖÄìOñÙàa¶ãx_+ÌÍ0dòáu/ízUȬ õ^ ,§ Wî u0 h ™ §à «ç ¬ §$ ™ D † h n Œ T ² 4 Û  õ Ö4 »@ ¡I ‹N wP dY Uÿd Jþs Dý‚ @ü“ BûŸ Lú¢ ]ùœ tøŽ ”÷w »ö[ éõ> õ" [ô Ÿóé ìòÊ Aò¥ Ÿñy ñC tð éï» cïj äî iî¾ ôí_ †íþ í˜Åì)vì²1ì1õë«Áë‘ë†bëì1ëNë­Ñê¨ê[†ê«nê÷fê;lê|ÿ|êºþ“êöý°ê0ýÍêjüçê¥ûþêâúëú7ë]ù[ë øŒëâ÷Îë&÷ìlöyì·õßìõMí]ôÀíºó2î ó¥îŽòïò™ïñðñ«ð’ðHñ'ðôñÆï­òtïuó.ïJôöî&õÈîö¨îâöî¾÷îšøtîvùqîZúyîJûŒîKü¯î_ýéî…þ1ï¹ÿŠïîïïYðEÇð^2ñgœñh òj|òtúò ‡ó· &ôí Ôô' Žõ\Nö€ ÷Ã÷sø]ù,ºùôZú¼þú†©ûS\üýßÖý—þ'Pÿ¦ §_D¥Öáaì9tUübƒZ =• Éuk§É0 ®r!‡ Ý^ !® Xü „E ¦‰ ¼Ä Ìù Ü$ äI åo á • × ¼ É ç ³  š D l e I¬ /À Ë Ò ñÚ ßå Ôÿó Éþ Àý »ü. ½û9 Åú> Óù8 çø) ø %÷õ PöØ „õ¼ ¼ôž üó‚ Dó` ’ò8 êñ JñÏ ³ð &ð? ¡ïë #ï“ ªî8 6îÖ Æío \í ùì‘ ìRì‘ìÝëo¯ëÕˆë8eë”?ëíëBïê’ÉêÞ­ê"›êc™ê¡ÿ¨êÛþÄêþêêGýë~ü:ë´û]ëëú}ë"ú™ë_ù»ë›øéëÙ÷&ì÷qì^öÍì¦õ7íòô«íDôîžó”îÿò ïhòïØñ÷ïSñtðÖðþð^ð˜ñïï<òŽïðò6ï±óèî~ôªîPõzî%öUîÿö;îÙ÷(î¯ø îˆùîfú îMû/î=üLî=ý{îOþºînÿ ï”jï¼ÕïãCðþ³ð $ñ ”ñò~ò ó —ó: ;ôc íô ¨õ°höÃ&÷ÀÞ÷§Žøz5ù@Ùùÿ~ú¾$û€Òû@‡üüAý°þP½þÚvÿM&«Íøj4f’’³¦Å0ǺºB—É`LÉÀ=\¨ê qjîÁ_ ¿h ½ X ] ¹« Úó ô/ e –  #ï !   L ù ² ãá Ë ³+ œB †R q` _k Ox AŠ 9ÿŸ 2þ¶ -ýÈ .üÖ 4ûÚ ?úÔ Oùà hø¬ ˆ÷ °ös ßõU õ7 Uô ™óõ åòË 8ò˜ “ñ[ öð eðÄ Úïn \ï æî² tîM îã ís ;íûÞì{ŠìóBìaìÈÔë+­ëˆëàqë5Rë…5ëÑëüêXéê•áêÏÿéêÿë6þ!ëhýJëšüxëÌû¥ëþúÍë4úôëjùì¡øLìÚ÷„ì÷ËìYö#íœõ‰íäôöí3ôjîŠóáîäòYïHòÎï·ñFð,ñÅðªðLñ.ðÜñ¾ïyòWï(óùîßó¦î ôbîiõ,î:öî÷ãíá÷Ðí¶øÄíùÀífúÃíCûÏí(üçíý îþ@î!ÿˆî8ßîUDïu³ï&ðž›ð£ñž€ñ’øñ‰xòˆ ó“ ›ó¨ DôÄ úôâ ¹õõyöù6÷çî÷Ážø‹JùGïù–ú·Cûoôû'ªüÙgý~%þâþ›ÿùJLó•Ç.öÀQ0Þ?k:õ$€ú¿Œr ƒ¯õ>\þ< ©w Ï [( ž~ ÒÑ ÿ #d <¦ Qá b kJ p € n · h í ] $ M X 9… %¨ Å üÛ èí ×ý È ¹!°ÿ:ªþP¤ýd¤üq¨ûu³únÂù_ÖøHõ÷-÷Cöð xõÑ ²ô° ôóŠ =ó\ ò' äñç Eñ› ¬ðJ ðñ šï’ ï0 ­îÇ @îY Ûíæ {íj íæËìZìÅ;ì)ì†Ôëß°ë4”ë„{ëÒgëTëZCë—6ëÏ0ë4ë7ÿAëfþ[ë•ý~ëÂü¨ëðûÕëûìNú6ìùhì°ø ìè÷Þì ÷&í\öyíõÖíáô;î,ô¨î|óïÓòï4òð›ñ…ð ññ‚ðŒñðò‘ï²ò#ïWó¿îôiîºôîzõàíAö­í÷ŠíÞ÷tí±ødí†ù\í[ú_í1ûhí üzíðü—íÛýÄíÖþîÝÿQîì®îïŠï(ð.vð(íðdñ àñûeòò ÷òõ ˜ó Fô õ&¾õ,€ö"=÷õ÷Ѧø‘RùGþùøªú¨Zû[ü Ìü®‹ýHIþÐÿD¿ÿ¢pð.¾^[…õ¥ˆ¹¾«²:–ÆhP(××ZzÕI ¹!$ ˜† ç aF ¯¢ óù )L Tœ wæ ”* ¬j »© Ä ç Ë " Ì ] Å š » Ñ ¯ÿ Ÿ(IydhzXI¦;½1Õ)ÿí$þÿ#ý &ü/û<úùOùäiøÈ‰÷«±ößõmõIUô ›óð éò¶ =òr šñ& þðÓ lðw âï bï² êîE {îÕ î] ·íÝ _íU íÅÁì-|ì?ìé ì?Þë‘»ëÞŸë&‹ëh}ë¦tëßsëwëD}ëtÿŒë¡þ ëÊýºëôüÚëüìJû.ìsúbìŸùœìÎøÜìÿ÷%í2÷síjöÈí§õ îçô€î,ôæîwóMïÌò½ï%ò2ð†ñ¯ððð0ñdð¹ñáïKòeïäòòîóŒî#ô.îÏôÜíƒõ•í=ö^í÷4íË÷íøíoùøìBúöìûúìëûíÃü!í¡ýFíŠþyí€ÿ½í€îŠxî›æî©Yï®ÑïªJð›Âð…>ñmÀñW LòL äòJ ‹óP ?ôY ûô]¼õV~ö>;÷ó÷צøVù<úè·ú”nû>*üæéüƒ«ýlþŽ+ÿùãÿP••CÌìù*6ÆD^Dñ5„Þ£œ,I²ê3~¯ # ‹’ ÿÿ gg ÃÇ $ S} ‰Ô ¶# Üq ù¾  !K - 3 Ó 3 0 J' {¨Íÿìðá#Ñ?ÆZ»r´ÿŠ®þž«ý¨­ü©´û¢¾ú”ÐùçøeøI)÷,Tö ˆõãÁô·ô„MóGžòøñ³ Zñ] Ãð 6ð °ï6 4ïÉ ¿îT TîÙ ôíU ›íÊ Jí7 휾ìúìSIì§ìôíë=Ê낯ëÁ ëû›ë0 ëa«ë»ë¼ÿÎëäþãë þùë2ýìXü1ì}ûWì£ú†ìËùÀìöøí!øVíP÷«íƒöîºõaîöôÀî7ôï~ó~ïÊòæïòSðyñÉðÞðIñMðÖñÁïjò?ïÿòÈîœó\î;ôöíßôœí†õPí5öíïöÞì²÷¶ì{øžìIùŽìú‡ìïúˆìÀû’ìü¥ìdýÂì@þíì%ÿ(íuíÏí7î"ªî% ï"™ïðüŽðß ñÁ•ñ¨ (ò— Éò’ wó‘ /ô îôвõutöO0÷é÷ÔŸø„Tù- úÔÃú}û"AüÀýSËýÙþLLÿ­û¾;op˜Å·jÍ ×¦Ð@ºÙ”l]ü‹Àaö ~œ û q‚ ×ì 1R ~± À ÷d "º G ga ° ’ þ H§ Š© Ä¥ úŸ)–Q‹t}—p¹eØY÷NE+Aÿ<?þC>ýEBü>Lû/\úoù‹øê­÷ËÔö©ö9õRxô½óÜ ó”`òC¾ñë $ñŽ ’ð* ðÁ ‡ïQ ïØ žîZ 9îÔ ÜíF Ší¯ @í þìnÁìÄŠìUìa'ì¦ÿëçßë$ÊëYÂë‹ÄëºÒëãçë ì3ÿìWþ2ìzýKìœüeì½û…ìßú­ìúâì'ù&íMøsíx÷Ëí¦ö,îÙõîõîîKôJïŒó©ïÔò ð òoðvñàðÕð[ñ9ðäñ§ïuò!ï ó£î¨ó.îFôÂíâôcí‚õí*öÄìÚöˆì‘÷ZìPø:ìù"ìëùì¹úì‡ûìUü#ì$ý:ìóý_ìËþ‘ì®ÿÑìž"í—…í–ñí˜dî“Üî„VïlÑïMPð(Öð dñì þñÙ ¥òÏ YóÈ ô¼ Ùô©õŠ`öX÷Ú÷É”øsMùú¿ÈúbûWü˜ý#èýž®þqÿa-ªèä S:W­hUkøa—H3Ìàb™öB†ß rŸ ü" z› ê O~ ©â öE 5¥ l š^ » áú k ¹ % A' y' «#×*Oýsò–éµàÌÝÿÜÙþãÙýäÜüÝåûÎñú¼ú¦ùŒ;øn^÷KŠö"¼õðöô´7ôtó)Òò×-ò~ñùð» kðN äïÝ gïc óîá ˆîW (îÆ Ñí. ƒíŽ ?íèí=Æì‹”ìÕdì9ìVìýëÂðëñïëùëB ìf&ìŒÿAì¬þ\ìËýyìéü”ìü³ì&ûÙìDú ídùEí‡øŽí­÷æíÔöCîö¤î3õïiôgï¥óÇïåò%ð-ò‰ð}ñôðÐðkñ0ðêñ˜ïwò ï óƒî¢óî;ô•íÖô-ívõÏìö|ì¼ö8ìl÷ì%øÕëèø¶ë¯ù£ëwú™ëDû˜ëüžëÕü¯ë ýËëpþóëHÿ+ì)tìÌì 0ííüîìîÖï´„ïðf“ðB (ñ% Êñ yò 2óñ õóÜ ¹ô½õCöT÷ Á÷·€ø^@ùú£ÌúA—ûÚfüj5ýìþ_ÍþÁ“ÿUVÒ»‹ÞCö÷¦NõòÖ•¨2lÎkÈ g– ú& ¯ û- n£ Ò )} tæ ¶J ï¯ DxfÓ‚ )– x¥ ¾° úµ .µ_²®¼§èž—9YŠp„‚ÿ‡‚þ††ý~‹ür–ûc§úN¼ù5Øøù÷õ"÷ÇQö“ˆõXÄô ôÆXós¬ò òºpñTÞðè Sðs Óïø Zïr ëîç …îT )î¹ ×í ír LíÃíÚìX©ì™ìÕ\ì @ì</ìh)ì.ìµ:ìÖMìøÿhìÿ…ì2þ¢ìNýÁìhüâì€û í›ú7í·ùpíÕøµíõ÷î÷Xî?ö´îjõïšôvïÏóÖï ó6ðLò›ð’ññßðvñ8ððñ™ïtòÿîópîóîí$ôrí¼ôíVõ˜ìòõ>ì”öðë=÷¬ëï÷uë¥øMëcù1ë&úëìúë¯ûësüë8ý0ëþOëÏþ{ë§ÿºë‡ìq_ì_ÇìO8í>®í#'î¤îÙ$ﯪï…:ð^ ×ð@ ñ& 4ò òòø ·óÛ ô±Fõy ö5Ñöå“÷ŽXø1ùÒìùr½ú ûžfü)8ý¥ þÚþl¦ÿ»nû50û[¾~{–5¡ìœœ‹Fkî9•ù;¯ÜY| ö ˆ­ 6 ¸ þ5 a« » ˆ Iö ƒd¶Îà3‘! è7 3J uV ±[ è_`O^Y¯UÙPûJF(F/Gÿ0Iþ+Ný Xühûÿyúé‘ṵ̀ø¨Ô÷|þöG1ö jõÄ«ôwóó#CóËœòküñdñ˜Ôð!Oð¤ Ðï \ï’ òîý Žîb 6î¿ æí œíi [í¶íüëì;Àìtšì§}ì×jì_ì&\ìGbìgnì…€ìŸÿ–ì¹þ²ìÐýÒìåüöìúû íûQí'ú‡í=ùÇíUø ît÷Xî”ö­î¹õïßô`ï ô¾ïAó"ðxòŠð¶ñóðûðdñIðÚñœïVòûî×òbî^óÓíëóLí|ôÏìõ^ì©õ÷ëIöšëíöJë—÷ ëGøÔêýøªêºùêuúzê4ûqêôûpêµüyêxýê>þ¯ê ÿàêäÿëÂnë§Ìë5ìx¥ì]í;—íîè–îº"ï¸ïj YðI ñ+ Äñ ‡òò PóË ô™æô\°õxö¾C÷eø àøªµùEŽúÝjûoEüó!ýhûýÑÐþ*¤ÿuuµEìà9§NlZ)UâA˜Jïø²¦fR û °› F4 ÍÆ IP ¼Ñ "N yÉ ÅA ¶I({—§þÏ Zî ® û ?' }0 º5ó6+5]3Š1±-Ï+â+ì*ï-ÿî2þå:ýÙFüËTû³jú—„ùt¢øHÉ÷ööÖ*öeõC§ôñòó–Dó7œòÐýñbgñíÛðmWðè ÜïY kïÄ ï( £î„ KîÜ ùí, °íx oí¼4íúí3Üìe¼ì‘§ì¹˜ìÝìþì’ì3›ìL©ìcÿ¿ìvþÝìˆýí™ü*í©û]íºú•íÊùÑíÞøîô÷Wî ÷¡î)öîîKõAïqô›ï™óüïÈòbðþñÌð9ñ=ñ{ð²ñÄï)òï¤òtî#ó×í§óEí,ô½ìºô>ìOõËëèõ`ë†öë*÷²ê×÷nê‡ø6ê9ù êíùîé¥ú×é`ûËéüËéÕüÔé™ýçé_þ ê,ÿ:ê|êÚÌê½(ë“ë}ì[yì3òìrí×÷í§†î| ïS Çï/ |ð :ñî òÉ Ïòœ óclô!9õÒö€Øö&­÷džøgeùFúš*û$ü§ïüÐý€¯þ×ÿ#fg?œÇîêÀ VöÙÔ“£Mg !· Ïf p ° ’H Ú …f ìî HpšïálãXR‰¹° Ò pî ½  K Œ(È-/4-`.0˜.¨/°3±9ÿ­?þ¤Gý—Tüƒgûh|úE—ù¹øèá÷ª÷gEö‚õÉÄôpôbó«½ò<òÇŠñIþðÃ|ð4🠕ï -ïb Ëî¸ sî !îU ×í˜ •í×\í /í> íjñìÞì´ÑìÔÉìíÆìÄìËì.Øì?ÿììNþ íZý4ígüeísûšíúÕíùîøTî¯÷–îÄöÙîÞõ$ïûôvïôÌï@ó.ðlò˜ðññÔðxñðìñ[ïdò©îÝòÿíXóbíÕóÌìZôAìæô½ëuõFë öÙê­öwêR÷"êú÷Ü餸¤éTùuéúQé·ú9élû+é$ü%éÞü+éœý>é`þ^é-ÿŽéþÿÎéÒê¬}ê‰âêcPë8Åë >ìÚ½ì¨CíwÕíIsî ïù ×ïÔ ™ð­ cñƒ 3òP óÕóË©ô}|õ'SöÌ/÷oøøø¨ãù<ÎúǹûE¥ü¶ŽýtþtXÿÁ<!<kãŽÁ¦™²j±9žÊT‹J Ù Š¾ 1n Ì [º ÝW Uì À|!uŽÂ‡Aúve¥ ÆÌ ì v Æ + T6”=ÍDüH#KCNXRfVl[ndÿjoþ_zýM‰ü6›ûµúíÓù¼ôø‚øAN÷ö†ö¦ÃõOõòSôŽ¥ó!ó¬eò/Ññ©GñÇðŠNðï ÝïN tï§ ïú ¸îE eî‰ îÈ Úí £í2wí^Tí†:í¨'íÆíáíúí í í.í:ÿ*íDþLíMýuíVü¥í_ûÝíhúîpùTîøîŽ÷ÏîŸöï²õZïÍô©ïêóð óbð2òÉð_ñ4ñ“ð¦ñÍïòïŽò[îó¯í|ó íúóoìxôÞëõXëõÛê%öhê¿öê_÷­éø`é­ø éWùîèúÆè±ú¨ècû“èüŠèÈüŽè„ý›èEþ¸è ÿæèØÿ%é©qéÉéT-ê&šê÷ ëÅëìZ‡ì&íõ¸íÈfî !ïv åïJ °ð ‚ñà Vò  *óVôÚô¯·õRšöõƒ÷”pø.bùÁVúIIûÉ<ü:,ýŸþù ÿI÷ÿâÉÏù¼"¢>†KfL?@&áÿ­Ìv 8 Eø ñ³ ‘i ' °½ +^œù‹^°›ú>Žxý« gÖ Êý % {7 ÊK \Qk‰u¹|Þ„ú•ž'¦(±ÿ#¾þÌýßüèõûÁû”.ú^Rù~øÛ¯÷Žåö:$öàiõ}´ôô¡dó&Éò¢6òªñˆ*ñð®ðR<ð¬ Òïÿ mïN ï” ¾îÓ uî 3î@ ýínÑí—¬íºíÚxíófí ZíPí0Lí=OíH]íRÿríYþ‘í_ýºídüèíiûîoúPîvùŠîøÆî‰÷ï—öCï¨õŒï¼ôÙïÔó-ðóòŠðòïð=ñWñkðÃñ£ï3òâî¥ò&îótíóËì ô+ìˆô“ë õë“õƒê#ö êºö¡éW÷Aéö÷ñè˜ø¬è@ùqèéùAè‘úè=ûèëûõçüðçRýûç þèÑþ=èšÿvèc½è2éqéÑ×éœEêcºê*4ëòºë¹Mì†íìVší( Sîú ïÊ èï– ¸ðZ Žñ dòÉ >ówô ýôÅæõgÕöÊ÷ŸÃø1¾ù»¸ú9²û«¬ü¢ýq˜þÑÿ ˆK~q¬gÊVÞ@ä#ÛÇܨ¯| DQ  ³â [¢ õ\ „¹‚[ïöQˆ¬ÿ•GˆŠÄ ú÷ e# ÉH %i w„ Á›­<¿iÎÛ®çÇô×à ãÞ+ÿÏ>þ¸Sý˜jüp†û@¨úÏùÆûø-ø/e÷Ø£öxçõ3õ¤‰ô,åó­Ió'¶ò˜)ò¥ñh(ñƳðDðl ßïµ ƒïø /ï4 äîi ¢î˜ kîÂ<îçîñí%Öí<¿íP¯íb¥ío¢íx¦í€²í‰ÿÆíþâíýî’ü,î“û[î—úîšùÁî øúî©÷7ï±öyï¾õ¾ïÑô ðæó\ðþòµðòñAñtñkðÚñ›ïFòÔî´òî%ó^í™ó¯ìôìôkë õÙêõPêöÑé¨ö_é;÷ûèØ÷£èxøUèùèºùÞçaú²çûç¯ûzçYüoç ýrçÁý„ç}þ§ç=ÿÚçèÍgè•Àè\!é#ˆéæöé¦nêiòê/ë÷ìÁÊìƒí^ Gî* ïð äï° ¹ði ñ kòÇ Jón0ôõ´öP÷êø}ùú„ûùübýÁþÿc©æCi…¢Å%ýW V² æY ÖjÖœ‹*XräG¤Š{ §@!³!í!œ#"o%è"$'$#¬(.#ô)ù"ú*~"Á+Ê!J,è Ž,Û¤,ª—,]i,,—·+C+й*ô*Rd)§±(úù'OE'ª §& /&e Ø%Ñ—%B\%¸ %4§$½5$O²#êÿ+#‘þ›"Bý"ûûf!½úÄ ‰ù `øA÷ö-öv$õ÷&ô]0óžDòÈ^ñ×€ðÒ¬ï»ßî”î]_í«ì±ýë1T땬êÞ ê ké Ñè# <è¯ç(çö§æÚ(æ¾þªå›ü0åoúºä?øCäöÒãÝójã±ñ ãŒï°âvídâpë&âtéôáˆçÈá¬å¦áÙãáâƒáTàá­ÞáÝ·á£ÛóáHÚ>â Ù›âæ× ãÔÖ’ãÙÕ1äÕùäJÔõå¿Ó-ç]Ó¤è#ÓOêÿÒìÞÒííÀÒ¤ï¦ÒYñ¡Ò/óÊÒ5õ<Óx÷ÔòùÕ†üYÖÿ’×D©Ø<‹ÙõCÚ”úÚLâÛL #Ý´ ÉÞzÇàoðâZåõñæ ‰èôÝéŽëaìÊ ìí¢"ÇïŸ$ëñœ&5ôq(xöý)ø,+]ú,ïû”,Wýÿ,µþX-.«-Öü-®H.¢z.˜‚.w \.' .œ Š-æ ç,+,E_+€…*Õ¦);¶(­°'”&zd%¬$¶¿"œS!eádÎÜN[¹3  !oÙ!»‹"#Jo#Ž«#Î Ë# Þ#M ô#…$¿;$ù\$5l$s`$¹ÿ2$þÞ#Süi#¤úà"÷øI"M÷§!¤õ!ôR eò˜ÒðËKïåÎíéXìÔéê©~élè ÄæÊ{åiHäÿ&ã‹â á‚ àë ßH Þ™ ÝãGÜ'›ÛgÛ¥²ÚèhÚ0%Ú|þßÙÉü‘ÙûDÙoùÙÀ÷Ùö-Ùtô“ÙÝò+ÚSñÝÚÜïŒÛwî)Üí²ÜÌë7݆êÐÝSé£Þ7èÅß5ç1áPæÏâˆå{äÏäæäpçPãèŒâµéÑáèê6áaìÏà3î¬à[ðÃà·òûà õ4á!÷Nááø<áQúá–ûÈàäü²àpþâàSfá‰8âä5ã.0ä8 ýäã Œå1 èåE *æM~æpçÅßçJúèæ?êvŠëÛ¹ì¸íã‰î”=ï'òï´ÄðEÃñàôòCô¡õ”ôö÷)ø:;ù^3úh ûbüTý<Jþ—ÿõô¿Tz¥$ܾñKæÎÎH¸º³ (Ç Žó è1 8o˜Á¢úˆ-J\ö…™§DÁüÕ¾ã„çBå ìã vÜ àÐ /Á i¬“³gÎ8áåÍÚ•¾\Œ&ÿCèýæ¤üy]ûùúhÌøËˆ÷Köjõ§ßóצòûiñ*ðïîÄí­ì±ëç ÎêÊ ùéª +éŒ YèoçRªæ5àå1å÷«äÖWä·-ä#ä‘ÿ(äþ*ä–ýä¦ü ä¼ûøãÙúäþùEä1ùÅä|ø‡åÜ÷~æN÷ˆçÊö‚èEö[é³õ êõ«êvôTëíó6ì‹óhí`óëîfó©ð‹ósò­óô°ó…õ‚ó¡ö(óŽ÷¼òxøcò‹ù?òçúcòŒüÌòdþYó;áóæ=ôHZôW:ô*÷óè¹ó´¥ó¨ÍóÆ3ô ½ô5 JõH ¸õ& ôõÆ ýõ9åõÇõÛ¿õ-àõˆ-öëœöF÷…÷ÁÔ÷Ôþ÷Í ø± ø‰øX8ø&†øò÷ø¸‚ùxú1‹úßéú‚&û Mû» qûS ¦ûî þû‰ ~ü# !ý» ÑýR þå ÿv Žÿ èÿ¡ 0< |ÝØP%ãɆj+ ŪKK·î”\=¦äö‰K)¤Èü`KöŽÀ!ã³ü@ Ë PÓÿûTÿç×þÉVþ¡ÑýrCý;¬üù ü²gûcÆú4ú²±ùO:ùåÇøvOøÉ÷5÷!—ö´ýõGrõÝõr¯ôxô›Tô27ôÒÿôyÿîó(ÿºóßþ‚ó›þTó\þ;ó%þEóúý}óáýàóÞýgôìýþôþõþöþ]öþ¢öþèöýýR÷þô÷sþÚøöþúù˜ÿ3û:[üÁTýþ6—þ; ÿGšÿ]ùdµ¢šð~&8!¯ÖáOã¨Ýòƒ=' ¿æ e­ ^ ’á ã1 øP ÝS ±J A Š> ®D êG + < X  [ Ú + Ï _‘ ò ›ƒ iøVmTÞHF¢ºó/<„~Õ½:þÃCu‹B×&ØwÿvÅþêþ?iý…Àü×ÿü>ÿ‚ûÃþíúaþ_úþÙù»ýUùSýØøÔübøAüò÷¢ûŠ÷þú+÷dúÒöÙùö\ù3öéøìõvø©õømõ†÷5õüöõlöÓôÙõ¦ôFõ‚ô¶ôdô-ôPô¬óFô0óEô¹òIôBòIôÍñCôWñ9ôáð.ôkð*ôûï8ôï_ô(ï™ôËîàôuî+õ)îjõçíšõ®í¾õ‚íâõbíöLídö?íÒö<íZ÷Cíö÷Qí”ølí*ù–í¶ùÐí9úî»úsîEûÚîßûJïüÇïRýUð+þûðÿ¼ñ“òxó\ô 5õèÿõ³ÂövŽ÷B}ø+Ÿù;ôúq püº ôýú `ÿ ˜ý —°qAGÎ@zwOòJ›RK IØ  ‘ÔáïŠþE.ELŒŽÕ× ôú£«7y­×M‘áŽw=àÏ41p[”T¦0¨ ž û ƒ 2t ]a qIS,ø hܺ¬~dQä(…ÿ0ìýÎÔüGÀû¯ú¤ ù—“ø{Œ÷fŒöd”õw¤ô–Àó´ãò½ òª Dñx ð, ÆïÑïqcîºí¹íd{ìäë³ZëJÿÙêÔý^êSüëéÊúé:ùé«÷½èöièô"èóäçzñ­çõï|çnîKçêìçgëîæìéËæuè½æçÆæ›åçæ>äçïâdçªáªçuàåçVßèGÞXèJÝ£èaÜéŒÛ•éÇÚIêÚëqÙöëîØÕì‚Ø±í1Ø‹îØhïó×Zðÿ×jñØ™òTØàóŸØ;õÙ¥ö‡Ùø.Ú“ùÛûñÛ¥üóÜ:þûÝÐÿßeàþ*ášfâAØãýˆåÍ içª cé„ XëK+íñÐîsRðØÌñ1dó’9õS÷‰¥ùüˆeþÕ„ï^Îÿ‚ ! °!¸F"– Ý"Ÿ l#¶ç#¶7$†T$B$x$°¬#ß;#!¿"|<"ç«!Q!¢E Äm© w`!cû!9“"þ5#·ð#d»$}%§&>†&Ê·&Lµ&Ç”&:p&¨ `& i&„ &ô—&i”&àc&]û%Þf%`²$êþô#yý:#üŽ"±úî![ùK!øš ÑöÍœõÝqôÐOó§6òm&ñ/ðí ï©-î`Eí g쪕ë5Ëê­ êSén ¡èÀ ùç [çNÈæŒ?æÄ¼åõBåÊä?ÿQä]ýÛãuûlã‹ù ã¡÷Ââ¹õŽâÑópâêñ^âðLâ$î7âJìâuêúá«èâáóæãáGåâ¨ãRââ¹â—à4ã!ß¶ã¸Ý3äcܦä%ÛåÚŸåôØ?æØþæ(×äçcÖíè³Õ êÕ2ëªÔ\ìWÔí*ÔÊî!Ôð3ÔiñUÔ×ò}ÔXô¬ÔåõíÔ÷PÕ+ùäÕåú³Ö©ü¾×wþòØJ4ÚjÛ܉ܕ’ÝG˜Þûºß¸ á ¼âXŸä/ªæ÷¸è¤«ê.pì–îäŠï"ñ\Èò–±ôÒÉöýø 0û Hýð 2ÿ›!ð""˜Œ">æ"ó2#Ål#° •#¡ ­#{ ¨#3…#ÃB#.å"„n"ÜÞ!F:!Ç Fžï @3ÿú¸Òt  ?!c"#ÍØ#|Š$$%Åd%a’%û ¤%‘ ¯%# Á%´ Ø%Ií%Ý÷%té%»%¯g%Tõ$ýÿk$¨þÑ#Yý-#ü"ÈúÏ!ˆù!QøA ÷[÷õ`ÕôOºó+¥òø˜ñ¹“ðo˜ï¨î½ÄíRçìÙìW9ëÇfê.™éŽ ×èç %è= ŠçŽçÚ„æ%æjžå«(åíþ­ä1ý:äxûÙãÃù’ãøjãqö`ãÓôpã9óŠã¦ñ¢ãðµã˜îÇã íáã·ë äbêQäéºäâçFå¶æéåšåæŽä]ç“ã!è´âèèõá¶éMáê·à{ë,àtì¤ß‚íß§îœÞÝï0Þ"ñîÝyòâÝÞóÞIõPÞ±ö°ÞøßuùEßÌúiß%ü‡ß‰ý´ßÿþ à…¥à€á¬‹â7£ã«®ä–å@ Væm ÿæ– ¯çà ~è÷ ‚é2ºêiì~íœØîŒð\.ñ8ò¹FóUlôë´õ{÷ø~úå\û7šünÂýŽäþ›™\Œ¾r2N£"þç6ŸM IN ãH sR ôw l°ßïJ'°E >e¶Íý~>4zð²¶ä|8D Ür dœ Ï "è a ”(ÄAí\ tŠŸ´×È’Ù:çÿÑøþY þØýG0üªEûüYú<gùloø‹u÷›~öŸõ›¬ôØóuóUKò+„ñø ·ð¼ áïz ï3 9îê~í¢Üì\Wìéë׆ë–(ëXÈêÿbêßýýé«ü¥é€ûeé_úDéIùAé?ø\é=÷ŒéDöÍéSõêpôdê¤ó¿êêò&ëGò›ë·ñì-ñ¶ì¢ð_íðîƒïëîïÓï•îÔðVîåñEîþòZîô‚î,õ¤î1ö°î1÷žî5øsîEùIîkú>îªûcîþüÄîXþTï¦ÿûïÛ˜ðññî]ñ׆ñº¤ñ£Ññ—$ò•¦ò“Mó… ô` ¯ô ?õ¹ ¯õ; ö¬ Wö ´öu )÷Ô ¶÷.Pø|äøºgùäÒùù+úü€úëàúÎWûªäû€|üQý•ýß ýý™ NþJ ‘þñ Ùþ 4ÿ) ¦ÿ¾ /T Âê R€ Ñ 6° ŠH Óàvu Ý¥S?ÎÞE²%Ñ`§/ìá2•|JÉÿµ`n (Óáý™ R0 = ¿G wN 1P çJ ˜; C$ äÿ }ÿÏÿ–¢þW:þÚýÃ~ýr$ýÁü»OüTÌûç;ûr£ú÷úyŽùúù{Àøükø~øÿ±÷€C÷ÿÉö~MöÚõ„ÿzõÿ4õŸþõ7þäôÓýÏôsýÀôýµôÇü±ô‚ü·ôNüÉô+üìôüõüPõõûõÛûÚõºû7ö›û«öŒû<÷žûç÷Øû¥ø9ühù±ü#ú+ýÎúýiûÎýüîý¡üþ[ý!þ7þiþ4ÿèþC—ÿPbK+%ÕÛPwœ Ï£PPÅØ` O ®â 8P œŸ áØ  C0 €Y É€  ]« § §Š «U § ¤¸ «W ¼î Ê Ë ®‹sm¼Í['wÄÆ‹Rc ´«0W ¨þÿnSÿâ©þbþìfýtÎüö@ümºûØÿ>û7ÿÊú’þ^úïýøùOý™ù¸üDù'üöø—û¯øûqøqú;ø×ù ø9ùà÷˜ø¾÷ø÷¦÷^÷—÷Êö’÷;ö”÷±õ›÷*õ¡÷£ô¤÷ô£÷‘ó¢÷ó¢÷‚ò­÷òÈ÷ˆñð÷ñ!ø¯ðSøMð~øïï›ø—ï¨øCï¬øòî°ø©îÀøgîâø0îùîaùæí­ùÔíòùÌí(úÐíMúÜíhúïíúî¥ú;îÞúrî*û¹î†ûïìûoïQüÚï²üPðýÕðnýhñÖýòKþËòÌþšóWÿvôáÿUõg-öèýöjÊ÷÷¢ø›–ù[®ú2ïûOýì´þ® O9×DT5Ú$~ ,F b+ Ê R ü ß ¹ T D˜ §¢í„*Vt1Õ)H?Àj)‘xœ ‚œA{âIqÿÓ˜\  »aKžÅÊ'ïx ¾ 2 E; @q ¢ ØÌwì ´GÏ#?,7¾DÿÚPþç`ýðpüü‚û šú¹ùàøøùK÷Ì ‹ö ÓõE "õ÷ yô§×óX>ó­ò±&òV¨ñò1ñ…ÁðÿYð“ý÷ïü¡ï‘úWïùï÷àîö®î“ô~îóKîñî ðåí‹î½í í¥íŒëíê¨í²èÀíQçÚíùåíí®äõíiãöí)â÷íõàþíÌßî²ÞOî¥Ýî¬ÜûîÌÛbïÛÈïJÚ'ð¨Ù|ðÙÐð¥Ø0ñ<Ø ñë×'ò±×Çò’×}óŒ×@ôŸ×õÒ×Îõ#Ø™ö‰Øj÷ ÙHø±Ù;ùvÚEúYÛ`û[ÜüqÝýÞ´þ¶ßÄÿãàÖ âú|ã:å˜½æ ¤è‰¦êö«ìC Ÿîj wðv 7òw òó…¾õ¯¶÷ùâùY9ü·¦þú Iê[™C+ ´Ø E· å±’À7Ò¿×¼TxY9ÂfzÄ(!ÍM"ak#Ýs$9g%yK&¤'ºá'¿(º)°ˆ)Ð)þ)W*& *è *¡ *T * Ù)ºŽ)n%)%(àû'J'[&Ð%ãÿ%±þ6$…ýS#dü]"PûP!Eú. DùýLø¾^÷vyö%õÍÌôoôNó“žòùñŠ]ñòÉðP=𦠻ïö CïA Õî‡pîÈî±í;Qíjòì”ÿ™ì¹ýGìÛûìüùÎëø¥ë<ö€ë`ôZë„ò-ë¨ðöêÏî·êûìzê+ëJê]é*ê—çêÜå ê+ä/ê†âCêïàRêkßZêôÝaê‹Ülê1Û€êëÙ©ê¸Øèê”×>ëˆÖ¡ë–ÕìºÔŒìøÓ íLÓŠí¾ÒîJÒµîòÑmï»Ñ<ðªÑ#ñ¸ÑòÞÑóÒ ôpÒõÎÒö=Ó*÷ÌÓPø‰ÔœùyÕ û Ö˜üó×)þ^Ù®ÿÎÚ1Ük†Ý©ÛÞé@à?ÏḗãS ™å Æç· êN<ì¾YîþWðBò,ô!'ö2CøPúwÔü•+ÿ›v{¯.лÚ'× ~Ò ÆÈ ·B j€|RtLÊsŸ (‹œñþ= Sn!œ†"Ö#ýŒ$~%a&/'æ'ã(À÷(˜P)i“)5Ã)þ Þ)Å í)† ì)H Û)¯)Ök)¢)rž(H($y'Ï&êÿ&ØþN%Ìýv$Éü#Îû–"Ýú‹!öùn ù@<øn÷º¨ödíõ;õ”‘ôëó›Ió§òy òØvñ.ìð| oðà ð œïC=ï~Úî´qîéî‘íLÿ)í{ýÌìªûìÛùFì øìDöðë„ôÄëËò–ëñeëpï/ëÒíë;ìãê®êÖê)éÖê²çæêKæëòä,ëªãUëwâ‚ëTáµë?àñë<ß8ìOÞ•ì{Ý í¿Ü–íÜ1î›Û×î'Û‚ï¿Ú+ð_ÚÏð ÚzñËÙ7ò¤Ùó§ÙôÝÙõ>ÚRö¾Ú‰÷LÛ´øÚÛËù\ÜÌúÓÜÅûPÝÂüêÝØý³Þÿ°ßmààÝ2âMŠãªÖäæ æû.çôIèåpéÛ ²êá ìù  í =ï6äð@ƒò,ô÷™õ£÷8ŒøÁúB…ûÀ ý=’þ¯§]0–´¶/À ¸ ¤\ …§ Yì $-ãj—¥;ÚÒ_ß%UÄ.Ý”¯ñzI>Ÿõð ž: 9„ ÀÍ 5 —Y í 5ãn(šlº±ÌûËD¹Ž˜Ùf% sÊÄdîkhÆÿÒ ÿ/tþ{Èý·ýähü¼ûûyúáùçNùøø“øYt÷ÈöÈ ös rõ Öô° GôEÃóÕJócÏòïRò{Îñ IñÿÆð3þLðÊüßïgûƒïú9ï¨øûîT÷Çî ö™îÍôtîšóTîtò9î\ñ*îOð+îOï>î_îcî‡íŸîÄìðîìRï{ë»ïíê)ðeê™ðàé ñdé‡ñüèò±è¼ò‹èƒóŽèdôµèYõîèRö(éB÷Wé!øyéðø–é¹ù½é‹úêrûoêvü ë•ýÍëÁþììÿkí%îûÃî×SïœàïWyð-ñáþñ·æò“ÙóiÊô, ®õÖ ~öa A÷Ô ø÷1 ­øƒ dùÎ ú áúX ¤û” hüà )ýâ äýí •þé <ÿÔ Øÿ± j„ øP  Ô ’ B  ð • ˜7 Ö oo Ñ 2ž’6ðÐMi©¦RIŸðç™, Go ø± ­ï f- $f æœ ­Î xû H$ H îf Æ~   ž ^¥ >¥ ž ÷’ Ë ›d k? ; Û ßœ µS … Kª J ±ÿâPÿrëþû†þ|$þõÇýeoýÏý3«ü’8üîºûH3û¡©úø#úO¦ù¤3ùøÿÇøKÿ_øžþù÷ñý•÷Lý.÷®üÉöülöûöòúÌõkúŽõîùbõ{ùGõù;õÅø@õ€øOõFøiõø‡õÙ÷ªõ£÷Ôõt÷ öU÷SöT÷·öv÷9÷¹÷Ò÷ø|øwø-ùÑøÙùù|úTùû‹ù¯ûÐùWü4úýÁúçýtûÔþBüÌÿýÁØýª€þ}ÿ6Œÿß‚”)8Øó½DˆöF“î €‡ ÿÛ o ÜL Iu ·˜ %¯ ½ ì» 8 § t    E » û Ê ¢ Î ; Í Ì T¯ Ô“ Lk ¼5 &ð‡ãA;Þ‘vç <—’í J­ÿ‰ÿôƒþ[øýÀuý'ùü…üòüV¸ûºÿaûÿûvþÍúÖý”ú6ýeú™ü?úü%újûúÖúúCúú³ùú"ù,ú•ø<úøNú÷búúö}úxö úúõÏúõû õAû—ôzû'ô¬û»óÔûRóñûîò üò ü3ò<üÝñ`üŠñ‹ü=ñ·ü÷ðÝü³ðøüuðý@ðýðúüîïïüÒïçü¾ïäü´ïèü±ïðü´ïøü¿ïùüÓïóüòïêüðÞüUðÐü—ðÈüæðÈü>ñÏü¡ñÞüòõü“òý&ó=ýËójýôý:õÔýöõ þ¯öBþl÷€þ/øÊþùÿýù‰ÿûGüއý ÆþµóÿAÄ B ÀHGÝ™‚9 õð ªF Ty ìŠo ‰å ˆQ ‘¿ ¬1 Ó¢ ÿ | #Ö  ÑH a i ²` DM Î5 K ¸á ¤ OX tû „ „ u„ Xð +O ð¦¡ú:E¿‡0Âøß+$W`’¬·ØÐÙ7ÿÔiþÀ¡ýŸÝütüEbû®úÓ ú“ ^ùL Âøþ1ø¨§÷M(÷ë°öˆ>ö!Úõ¶~õOÿ/õåýêôyü°ô û|ô™ùKô)øô¸öõóFõÒó×ó´ókò¤óñ¡óï©ó;î·óßìÆó†ëÓó2ê×óâèÕó›çÓóYæ×óååóìãÿóÆâ$ô­áOôœàzô—ßô¤Þ¸ô½ÝÌôåÜàôÜóôgÛõÄÚ=õ3Úuõ¸Ù²õRÙôõþØ9ö¿Ø}ö˜Ø½ö‹Ø÷–ØM÷¹Øž÷õØý÷HÙcø³ÙÖø5ÚUùÕÚÝù’ÛoúrÜ ûrÝ«û‰ÞTü³ßýèà²ý+âhþzã(ÿàäòÿiæÆèªñé™êë‘óí‹üï‚ûñsèó]ÎõC»÷* Áù êû 8þõ œê Ú fÀ¨”Å VÈ ¾ ¤µ8µÄÀEÕ¾à,Õ‹ªÓ]ñ$j ,Ð!+#øx$DZ%†Ò&1Ù'ÐÁ(^…)Ù)*B¸*›1+å’+!Û+P ,s#, ,¥ ï+² ¯+· V+º è*¹i*²Û)«;)£ƒ(Ÿ¸'›Ù&šä%¢Ú$¬¿#¼ÿ˜"Óþf!ðý) ýäEü–|û>ÀúÚúkdùóÄøp/øè£÷Y!÷Ä©ö,=öŽÛõë ‚õC 0õ• âôâ–ô,Nôr ô¶Ðóùœó;ÿróyýNóµû-óïù ó(øäò_öµò˜ôòÒòJò ñòKïññŒíÐñÒë´ñê›ñhè}ñ»æWñå'ñ|ãòðçá¾ð`à‰ðåÞ_ðzÝAðÜ.ðÈÚð‡ÙðXØ ð7×ð+Öùï6ÕøïYÔðÓðåÒ?ðWÒrðáѵð~Ññ7Ñ^ñÑÇñÑCò.ÑËòmÑaóÍÑôAÒ¶ôÅÒrõ]Ó8öÔ ÷ÞÔó÷×Õîø×øùZØûØÙAüiÛsýݨþ ÞÝÿ;àßáDšã~xå¿ƒç ¶é^ì¶`î ¶ðY üò• 0õÁ [÷Û†ùè¿ûé þãgØÎ¿7š’cØ  ®!++“(ç#NõfËlŒ[94ÌüE ª¤!?ï"Ã%$5C%–L&åB''(]Ò(…p)Ÿö)°b*º·*»ó*³ +ª 7+Ÿ 4+’ +„ ï*v©*lK*dØ)^S)\º(a(oT'‚Œ&œ±%ÄÿÆ$ñþÊ#%þ¿"bý§!ªü ýûN[ûÃúÈ5ús®ù+ùª«ø62ø¹¿÷3T÷¤öö ¢öpUöÍ ö# Ãõr wõ¼$õÏôDzôƒ+ôÁâóÿÿ¢ó:þhósü.ó­úïòçø©ò"÷Zò_õò ó±ñçñ`ñ3ðñˆîÓðçì™ðOëeð¿é1ð9èûï¾æÄïPå‘ïíã`ï˜â6ïXáï)àï ßýîþÝÿîÝ ïÜ%ïKÛHï‘ÚvïôÙ²ïsÙð Ù]ð¸ØÆðxØ7ñGضñ"Ø@òØÓò(Øwó]Ø4ô»Øõ>ÙæõáÙ×ö”ÚÒ÷LÛÏøÜÇùÆÜÁú’ÝÁûyÞÆü…ßÜýºàÿâ7…ãs寄æáûçléßê!^ì#õí# ­ï$ ƒñ' uó' wõ y÷oùÒYûŒ3ý1ÿÇÊM“Ç]3*’õä· &i S l‘um]Rª*íõ%´Sex Œ§6x»M4¨ÁdzÝ ’= › Žò ûH ]   ² ô ý I >!Ÿt!ù–!T¨!°¬!!s{!ÙG!A!¯® H ™ÐFŽª û…;m~ÿÿ¢‹þ§þ ©ýŒ<ýjÊü=PüÑûÁLûtÈú FúÆÌùh Vù æø™ sø) û÷²|÷4õö³jö,ßõ¤Wõ×ô˜þ`ôýñó‘û‡óúó™ø¸ò#÷Sò®õîñBôñÝò;ññðð,ð³ðæîð­í^ðìDð^ë5ðMê0ðNé<ðaèTðŠç{ðÉæ´ðæþðzåQñåäªñ^äòãã~ò{ãúò1ã‰ó ã/ôãëôã¸õMãŽö‰ãg÷Æã<øþã ù=äÚù‰äªúñä‹û{å{ü,æ|ýþæ‹þãçšÿÎ螲铉êuUëGìñìÓØí™Øîcòï. ññUò¥ˆóF ®ôÑ ÃõG Åöª ¸÷ §øN šù —úË  ûú ¹ü Úý/ ÷þ3 ' ÿ áè ®¹ p -D ñ ¾µ ‘d g 6¯ òN š è0 ‚· 5 ¼³ Y6 ûº ž@ Bà ê9“ŸBø÷A°oº4îþ#ËWˆv²RÓ4çðìëÛÑö¢š{~NdMÞ7•!Dæâ}± v‹ 2 çw œã RH ¦ ¹ÿü eÿI ÿŽ—þÍþ—ý0 ýZüùû¥sûÌîú÷lú#èùR_ùƒÿÖø²þKøÝýÁ÷ ý=÷5üÄöfûTöŸúïõãù•õ4ùEõ’øþôú÷Àôn÷ôìöoôvö^ô öbô¨õuôPõ—ôõÃô¶ôøôuô6õCôõ ôáõôWö#ôçöKô÷„ôIøÇô ù õÈùDõú{õ4û°õêûñõ«üHö}ý¸öfþD÷`ÿå÷aŽø^1ùLÉù%SúëÏú HûMÆûûPü¯çücˆý/þ¶ÖþG uÿ½  ‡^ ú‘ `¸ »Ó ã rê Ñâ 4Ç š› û\ O ‘­ ¼B ÕÎÝQÝÌâAî±{1×>1:Œ%çÿHϬ˜b„4ùÿsÿíòþÐxþ± þŽ£ýaGý)öüê°ü£uü\Büü×ÿûžìûkãû:áûæûËïû‰ûû?üïÿ%üžÿDüMÿküþþ—ü¶þÇüpþöü)þýáý@ýŽýZý2ýlýÒü}ýiüýü¦ý™û»ý4ûÎý×úÜýyúßýúÓý¾ùºý\ù—ýøønýŽøCý%øý½÷ïüY÷Åüüöšü¨öiü\ö5üöúûÔõºû–õyû\õ:û&õûøôÍúÕô¡ú½ô}ú±ô_ú²ôFú¾ô2úÖô'úûô&ú+õ2úiõMúµõvúö®úröîúßö1ûT÷zûÒ÷ÉûZø$üóø•ü¢ùýhúºýCûmþ+ü'ÿýáÿúý‘Õþ9©ÿÝ|Y8MXÝzŨ®Ò‹îSò ß » , Ž ¸ b C ? Ô (e í ûa Ù½ ¤W)ñ:t;â1@’ü ßÍ ( jA £Ý Ðe éà åM Ŭ Ž DR 욎Û0ÑHiwóŸlÇÐï _G–xǯÿõ éþ# )þR ný| ¹ü¡ ü½ iûÒÐúß@úã¸ùá<ùÜËøÕbøÍøÆµ÷Âk÷Äÿ*÷ÇþðöÏýºöÔü‰öØû^öÖú:öÎù"öÀøö®÷ ö¡öö˜õö—ôö¢ó÷õ´òèõÎñ×õèðÈõÿï¼õï¹õ#î»õ0íÀõAìÃõ\ë¾õ…ê²õ¼éŸõé…õPèiõ¦çTõÿæCõ[æ6õ¼å2õ%å0õ—ä0õä/õ¸ã-õhã0õ'ã4õøâ?õ×âSõÀâsõµâ õ¶â×õÇâöíâcö&ã¸öxã÷âã}÷eäö÷üäøªåùkæÁù?çuúè0ûéïûê²üëýìZþFíHÿîJõï`tñ‚ó£šô¼.öǺ÷ÅAù¿Êú½`üà þÙ Éÿú œ z0X/(áׄ … #§ ½5UÈäajýàŽ;wz’Ë•þ‚X ÞùŒ×'¯ ¯{!%5"‡Ù"Õe#Î#F$n;$‹I$Ÿ G$® 7$º $½ $¼ Ú#ºš#µC#°Ñ"¯C"²›!ºà È ÛMõw—?ÿ¯qþ·¬ý¯ôü–Cümû8ûùnú±èùekùøø¸ŽøX,øî Ï÷~ v÷ "÷† Ñö‡öuDöçöVÒõÁ õ)mõþ7õôü÷ôVû´ô¸ùlôø%ô€öàóãô óHóaó¬ñ$óðäòxîžòäìMòWëóñÕé˜ñ_è;ñöæÞðšå‡ðHä8ðüâîï¸á¨ï}àdïMß(ï&ÞêîݱîÜ}î;ÛUîsÚ9îÄÙ(î,Ù%î¨Ø5î2ØSîÌ×~îx׸î9×ï×^ï×Ìï×Pð`×ìðÁךñ@Ø[òØØ)óƒÙô8ÚíôúÚßõËÛâöµÜü÷ºÝ-ùåÞsú:àËû¯á0ý<ã”þÓäòÿmæHè™’éí(ëJÑì²”î'uð¡ uò †ô} ›öÍ ¨ø¤úŽü)iþ(@"þì×ã™Ù =Ä ÃŸ (fq¥¯Ä9϶Ç)­ò7LÙ˜eÒÝô@þ“í ÙÀ!}"@.#cÒ#i$õ$˜u%›à%œ /&™ `&” z&‘ |&‘ h&–G&›&¥ê%¶§%ÎW%ì÷$€$Aò#{N#¼š"Ô!Zÿ!¹þ$ !þ?ýOýP…üBü%ûøû»¬úpEúæùºŽùP9ùÞãøbŠøÝ,øO È÷¶ e÷ ÿöfšöµ<öýßõ@€õ€õ¿ÿµôüýDô5üÌólúNó£øÎòÚöPòõÔñLó[ññæðÕïuð"îðzì’ïÛê!ïHé·î¾çPîBæïíÕä˜íxãOí*âíïàÞìÈß·ì¶Þ¢ì³Ý—ìÃÜšìéÛ¬ì!ÛÐìqÚíÜÙQífÙ®íÙ#îÛØ¦î¿Ø6ï»ØÔïÉØ‚ðàØAñ ÙòNÙüò­Ùýó-Úõ×Ú9ö¦Ûf÷•ܘø–ÝÈù Þöú­ß(ü¼àbýÏá©þóâüÿ1äZŽå¿ çžèsBê·çëç†í ï ¨ð1 4ò= ÅóD ^õD÷4¾ø|úÖ;ü‚óýÿš9 Ãi@º´ú%)”G Rn FØ (8û‹½Ìoú±CÉFðºÓ)²†îNNª ¦ 5[ ´¶ # ‡j âÇ 5& |‰¹ïçYÆ8®ö*׬«1t¸4?çʈUà™od›µ2üÌÿ8cÿióþ{þªþý´~ý®üü—{ütûûC{ûùúÄqúz ãù* KùÒ ­øu øe÷ Áö+ö°‚õ/çô¬Mô,ÿ´ó¬ýó-ü†ò´úóñ>ùfñÎ÷âð_ögðöô÷ï”ó“ï;ò9ïëðíî¨ï®îsîzîMíUî4ì?î'ë9î,êDî@écîbè•î˜çØîçæ,ïHæ‘ï¼åðCå‚ðÙäñ~ä®ñ1ä`òöã$ó×ãúóÓãáôèãÖõäÏöaäË÷¶äÉøåÆùnåÉúÖåÓûHææüËæþfç%ÿèEíèaÏés¼êu¬ëhšìP…í-nîYïØLð¥Hñg Pò eó¾ ôK  õÆ Àö* Ú÷~ ïøÃ üùû û' üG ýüY øý[ óþR ëÿ; å áá Ù¥ Ê_ ² ½ ^d % ঠ˜A N Û  t · k ¤ ?Á ÞZ ä #dÎÕ|?.«æ¥xgÚ.9úŒÎÓ§ ƒ9eZHr,„‘ó˜×–ºŠ¡u†Sm$Rê-¥WÍÿE3ù»ª7U«ýŸr 5É Âÿ Aÿb ´þ¥ þà …ý æü?Güa¥û|û’`ú¦·ù¹ ùÎ`øçµ÷ ÷jö<ÿÑõWþ>õsý¶ôü8ô±ûÂóÙú\óúÿòCù®ò‡ølòÙ÷=ò1÷ò”öòöòwõ.òùôYòˆô“ò)ôßòÖó<óŠó§óHó"ôó¯ôçòQõÅòö¶òÇö½ò™÷×òwøó]ù3óFúnó2û¨ó"üáóýôþeôÿ¸ôõ™õ#!ö"¯ö>÷ûÈ÷ÓFøž¾ø]4ù­ù¿0úb »úõ Pûx éûé €üE ýŠ šý» þÚ ‹þç úþå fÿÕ Òÿ¸ :Š ¢L  j¦ Æ= Ç rI ÄÁ4X¡œ ÖnÓ26VšyžhÇÓôB#¹N9r¼‰K•äÿ™‡ÿ—1ÿ˜äþ›¡þ¥jþ³=þÁþÍþÐðýÉçý¸ãýæý}íý[ùý; þ$þüAþÛbþ·ƒþ‰ þQ¹þÊþÄØþrÞþâþÃæþiçþ ãþ­ÚþHÇþݧþlzþõÿBþxÿþõþ»ýqþqýìý!ýfýÏüáüxü[üüÕû·ûQûOûÍúâúKúsúÍùúTù—ùßø0ùmøÍøøoø ÷øA÷Ç÷êö~÷žö<÷_ö÷*öÜöö¾öæõ®öÓõ¯öÌõ¾öÏõÛöÝõ ÷ùõH÷"ö•÷\öó÷¢ö`øõöÛøP÷fù·÷ú'ø¨ú¦ø_û2ù%üÎùùü{ú×ý0û½þìû¨ÿ¨ü–bý„þtÕþh–ÿ`a[<U"NA÷' ×ÿ «È n‚ %. ÖÍ ‡b 9 ë î e¢ ÌR ø \Š ‚ ‘v ŒÔ u&Op¸Ëùs2 a  i  { aT ? Çæø±#qN&wÍ œk Ä î— ' M¹ …G ÇÿÐ ÿN ^þÄ ¶ý0 ý–€üùôû\sûÄþú-”úš5úàùn‘ùÑKù( ùzÓøÃ¤ø }øT`ø¡ÿKøñþ:øGþ-øý øðüø@üý÷‡ûç÷ÈúÕ÷úÃ÷3ù´÷fø§÷›÷š÷Óö‰÷ör÷TõS÷šô-÷Þó÷óÌöZò˜ö”ñföÌð4öðöGïÌõ’î˜õâíaõ>í(õ¥ìîôì¶ô‡ë‚ôëSôƒê+ôê ô é÷ó@éèóðèâó±èèó‚èõódèôXè7ô[èoômè·ôŽè õ¾èqõéæõSéiö»éüö;êŸ÷ÐêTøyëù0ìëù÷ìÊúËí¶û©î¬ü—ï¬ý–ð¶þªñÐÿÔòòô]õQ°öƒø´\ùß³úü) týL èþm d‹ í¥ |²°œòpW 1± à €[ ´Œ ýXX›—ÌÁçÑèÈÕ¨³q†*MÑ dÀçgZ÷»o ÒKQ¬uÊ“á ¤ô ©  ‚ Q ­#C-Ï:QNÌf?…§®ÝMŠYÿ¹¢þÜöýøTý½ü"0ü.¬û3/û1·ú%GúÛùð xùË ùŸ Åøn yø:0øè÷ÇŸ÷‹Q÷H÷ÿ°ö²]ö_ÿ öþ½õªüpõLû õìùÌôørô2÷ôÚõ¨ó…ô8ó1óÇòÜñVò‡ðáñ2ïqñßíñŒì”ð?ë%ðþéµïÊèGï çÚî†æoî{å î|ä³í…ãdí–âí²áåìÛà»ìàìW߉ì¸Þ…ì2Þ”ìÁݵìjÝæì,Ý*íÿ܆íâÜóíÔÜrîÜÜïúÜ®ï/Ýmð€ÝAññÝ,ò~Þ,ó$ß?ôÜß]õ¦à‡ö€áÀ÷kâùlã[ú†äÀû»å5ýç´þaè8Ìéº>ë<³ì·0î.·ï¢Kñ ïò‰ ¤ôù göc 0ø¿ùù»û:výV)ÿZÕL+0û⸗aH öí p† Ë †0ë>C1—äÝ'–_9‹È£D¡®ˆ^I …Ø´…Ö,óÇ P Å &$!/l!8 œ!A º!G Í!R ×!b ×!vÌ!µ!¬Œ!ÓP!þ 5š s% ¼¢fÈá25£ÿ|ÿ¶‘þÞþùžý.ýÿÇüñbüÚÿû·›ûŠ2ûTÇú[úÅîùk‚ù ùš ­ø# @ø¥Ì÷Q÷“ÌöBöh¯õÌõ-ÿôˆýèóßûOó6ú²òøòãötñ:õÐð•ó+ðôñ†ïZðåîÆîHî;í°íºë!íDêìÕè!ìsç®ëæDëÔäêê™ã›êrâ[êaá*êfàêß ê²ÞêøÝ0êSÝbê¿Ü¨ê@ÜëÙÛsë‹ÛìWÛ¤ì@Û]íHÛ*îkÛ ï¡Û÷ïíÛñðPÜûñÆÜóQÝPô÷ݘõ¸Þöö“ß_øàÏù}á>û‹â¬ü§ãþÏä†ÿæóRçk®èçêcëÜíG‘î¢ ðì ’ñ# óH šô`'ök»÷kTù]ïú:‡üþµ¡ÿMÊŒ1öƒZÁ¼ëz Ð  â[ ¯‡j£²¯·;µ¾«7œ¤ˆ gk6Äô£dA²Òþ YG Ý“ \á Ñ3 >… Ú ì5 '”Qùob}Ò…G„½|7l¶O9!¾åJ•Ý3tà F ½5(ʼnPÝÜÿ&fÿ^ñþ…yþžþ¨ˆý¢ý|ütêûJPû°úÙ ú’ eù@ ¾øä ø€g÷¶ö ö'Kõ¨ô&Õó£ÿóþdòšü²ñûñ“ùdðøÆïœö2ï&õ¦î¸ó"îRò¨íõð?í¡ïäìZî—ì"í\ìøë3ìÛêìÍéìÑèìçç0ì ç`ìFæ¦ì—åíþävíväþíä“î£ã4ïWãäïã£ðõârñçâVòðâQóãaôIã}õ–ã¢öôãÎ÷^äôøÕäú\å@ûóålü›æ ýXçÛþ*è é]öé˜èêÈßëçÔì÷ÐíöÔîêáïÖúð¹ ò’ Eó` qô ˜õÇ ¶ö] Î÷ß àøKîù¦þúðü,(ýW?þuVÿ„eƒjucVP)2ó ±äe¾–¹ n[ B ö  Ž Ñ # … µ , E Ë Õ a h ò ý ‚‘ + ¡Ç,g­ %µ‘bòHÍ—ˆãG(jɧŽÜY&$ö6É<š5i&1õôµÌq›(aÞ“ÁCZëè‰iÝ©I)¬¢ÿÿWþ  éýÝ Ký ©ü4 üP Rûb úlâùq&ùriøn¬÷gôö`<öYŒõNàôA9ô6ÿ˜ó)þóýsòüïñûzñúñ$ù¼ð7øtðU÷:ðzöð¦õ÷ïÝôïï ôûïróðÏòYð<ò§ð¸ñ ñBñ{ñÖðøñxð‚ò%ðóÝïÂó¨ï€ô„ïRõuï:öxï2÷‹ï3øªï7ùÒï;úÿï=û2ð>üoðDý·ðNþñaÿ{ñzõñ•|ò¬ ó·™ó²&ôœ¯ôv9õCÆõ\öÀúöq ¡÷ Oø« üø/ £ù Búö Úú9 mûh úûˆ ‰ü— ý— ³ýŠ Jþn ÞþD kÿ ïÿÁ gm Õ >¢ £0 ¸ n9 Ù·F1¯ªl”½ †C†¾þœD/ŒËÕoYΊ»Náî#ÇE§jŽŽ}²tÑrérøuÿxþyõxçvÕr¿o¥k…f^[.Iö0³ gÞÿ§ÿ¹gÿW ÿðÓþ„þ'þ”ÃýYý‰åüøiüaæûÆ]û)Ðú‹Aúíÿ²ùPÿ#ù±þ•øþøpý~÷Ïüøö.üvöûûõõú‰õ`ú"õÕùÅôPùuôØø2ôhøúóøÑó¡÷¶óI÷«óúöµó³öÒó{öôRöOô6ö©ô'öõ'ö‡õ2ö öFö˜ödö8÷Žöì÷Çö¸ø÷™ùg÷‹úÌ÷‰û?øŒü¸øý3ù‘þµù“ÿ7ú•ÀúTû²óûÌžüêRý þÂþsÿ ï ¾Â \ˆ úC šõ >› ä2…´"²u4±¨ÖçråÌÓ"¯wzÅ3 ÚB or ó ’ i ¦ Ð ° - ´ ± Ë «  Ÿ M ‘ …~ ¹b í@  N䃫»k÷.8ð€²Ðx'>‰ÿôþÀfþxáý+fýÖôüŒü--üÛÙûŽûDQûýû³îúeÅúŸú´{úQ\úé?ú€(úú®úGùùâÿëùxÿÚùÿÄù’þ§ùþ†ùýaùý8ùpü ùßûÜøJûªøµúuøú9øŠùö÷òø¯÷Vøb÷¸÷÷÷¸öpöböÊõ ö%õ´õ„ô^õêó õQó¹ô¿òjô4òô¯ñÚó.ñœó³ðfóAð:óØïó{ïó)ïüòäîþò®îóƒî*óeîWóUî–óTîéóbîSô‚îÍô¶îYõüîõõSï›ö¹ïL÷.ð ø±ðÖø?ñ¹ùÞñ­úŽòµûQóÑü'ô÷ý õ#ÿýõLùöuû÷ùÆúò&û&Hüauý ©þÝ æÿ "7 ]J K¼:äð)ºK vn $Š ¿œ D¡ ®–ýz6MXdÎ\B(ÂÔQ~Î:œ ×nÁ6 OC^t_ŸSÀ ;Ú ð é ¬ c -±?GRÒiV†Õ§LÒ¾,7—u÷»ÿPÿ¤Yþð ·ý7 ýy ü½ üÿ Œû< ûz ¡ú±1úâÃùYù5ôøW•øu;ø’å÷¯’÷Ê=÷åçöþÿöÿ.öþÍõ#ýjõ%üõ!û ôú<ôùÔóøkó ÷ÿò öò õò ô¤ñó.ñòµðúð>ðôïÉïïîZïîíîîôì…îì#î!ëÉíCêtísé'í¬èäììç°ì4çˆì„ækìãå_ìQåbìÉäuìVä˜ìùãÌì±ãíxãríSãåíDãmîJãïaãÃï‹ã†ðÌãZñä=ò„ä/óûä2ô‰åJõ.æyöéæ¾÷½çù©èvúªéãû¼êSýÙëÀþí,8îœsï½ðŠò ‚óŽüô ƒöŒ øú  ùX .û¢¹üÜ@þÇÿ!R.Þ/m úü‚Á lp þÓ s- Íx»@òX$ZIG]!aáSŒ2%ÿ©¼m|Ó¢%Wšˆý¯Kщê»þÞò ø. ô< àL ºb ‡y L•·±ÝVñ7n¬zñæ?H–žõìZ4Äÿs0ÿ«ŸþÜþ„ý ýü3{ü=ûû>û6û( †ú úõ ~ùÑ õø¥gørØ÷7E÷ó°öªö\‚õæô¯ÿDôTþ›óõüðò“ûAò-úñÆøÜð^÷+ðñõzï…ôËîóî¸ñvíXðÓìþî4ì¯íœëjìë(ë‰êîéêÁè éœçBéæñèpå®èrä|è‡ã^è«âQèåáYè7áuèœà¬èàûè¡ß]éDßÖéüÞgêÈÞë«ÞÄë¥ÞŽì¶ÞríÜÞjîßxï{ߟðóßÞñ…à.ó/áŠôïáîõÀâ[÷ãÎø‰äIú‚åÌûŠæVý«çêþâè…,ê"‰ëÀõìVjîáßï_TñÎ Éò1 Aôˆ ¿õÔ D÷ÓøIeúlûû}ŽýxÿZ—$Ö}påõHc¨¼ N 0’ GË Gô 3  Í ~³æ4»©‚6uÝÉz ]Ÿ Û~åM>†ˆ¾ Çö ø3 q 8° Nò [9 ]„UÖC/%úôÃZ‚Æ84᥃‹ª+ƒ  „g¸ˆÿýÿ9xþiìý‹\ý¦Êü³5ü·žû®û™ dúy ¿ùO ù cøÝ¯÷–ööH7öôxõ—·ô3ôóË/ó_ÿmòðý«ñ|üéðû,ð“ùrï"øÂî±öîFõ{íåóììòrìFñìðÖëï×ë2î"ìíºìQíÁílíYïîiñ ïàó’ð}ö%òÄøbóÙúvô´üQõDþâõ¬ÿNöâ•ö Ëöïö÷á÷‰æö¶ö[{öDö¶#öÝ6öŒöR$÷ªò÷Áøƒùô?úh ÝúØ gûD ßû° Nü ¹üŒ "ýÿ ýr õýæ VþT ®þµ ùþ5ÿ;dÿ]‰ÿkªÿdÐÿLüÿ'4î }¡ ×< >¾ º' [y µ ÷á Úü•+òßÚÿÂþ·ã¸ê}91»ÿÏoÿVMÿËLÿ3@ÿ—)ÿÿyäþÿ·þ—’þM‹þ)§þ)ÙþGÿl7ÿ‰Rÿœ{ÿ¾Ûÿ“µ «ßÏí$àóªE… ­ ) u Í ý _ €«ÐšÚB¨ÊRXø÷±¢€?]²2êéãe¡’,pŠÌ§82Ùi~¤å n8 Œ gá  ³ Mäê šŽ /0 ²Ð&jýíÿ…<þýüf¿úÌÿùDþP÷àü³õ­û1ô¤úÐò°ùñ¸øsðª÷…ï‹öÃîlõ&îjô¤íó8íóæìò¶ì&ò´ìµñíì3ñ]í¢ðìíð‚îŽï ï!ï“ïÆî!ð}îÈð>î•ñî„ò½ízótíXô#íõÇì õ`ìö÷ë|ö•ëæöAë^÷øêÚ÷¼êJøŠê©øZêìø"êùäéù§éùtéùOéïø@éßøJéÖøiéÛø¡éøøúé+ùwêmùë¨ù²ëÏùPìÛùèìéù‹í úYî¤úqï€ûÝðœüòÈý'ôÓþ­õ«ÿ÷d<ø.’ù<,û¢ýTAÿ,tûˆœ ] ôI l~Þ Äc & ¦Ö3§²eï6ò4”úªŠbú/d²ÉÑh¶Ç]äÉÐ¥m,23ó2­(Y óÏ{jõÙV(œg ȧ éó T9Æ€AÕ¿&@\ÁÿkAþY½ü87û" °ù' 4øB Òöf —õy ƒôi‡ó5‡òãrñ‡Að-ïÚÏíŒÀì@ÿÞëêýë‚üiê û¥é†ùËèõ÷áç\öòæÄôæ3óHå¬ñ¥ä-ðä½î§ã[í?ãìââªêâ\éEâ èâçâüåâåHâ_äŸâÃã"ãEãÒãðâ±äÎâ¿åÛâðæ ã,èOãlé¢ã¼ê ä>ì¥ä î‰å2ðÃæ¡òAè,õÕé¢÷^ëæùÇìüî&þ‹ï|6ñ%1ójõ, ¹÷! óùÉöûÀýdÿÔý¤£ŽeB‹$cî î„ !Ù à!ç Y"½š"y´"8º"ÿ«"È|" "‰!g´ mEAÆ ,Ð…•ÙV- ‚°ÌKà0nL óg q‰ é¼aà lt ç! zß *ž öþM Òýæ ¾ül ²ûñ ®úˆ ½ù; éø <øÏ °÷Š 6÷% ¹öœ+öùŒõKêôRôóÎóI[ó—êòÐeòò¾ñùúðç'ð½ÿRï}þ„î3ýÃíáûí‰úFì5ùuëâ÷ê‰ö˜é'õ“èºóŒçIò—æÚðÁåqï åî{ä×ìä¬ë­ã–êmã£éKã×èFã0è^ã¡ç†ãçºãŸæ ä/æääå‹åãåâæ<æ™èäæˆê²çtì…è7îAéØïëéñ¨êgóŸë»õìì~ø‰îŽûYð©þ0ò”îó6…õš÷ézøK úÛ ½û“šýV‘ÿ…s`šyˆÙ– î Z +"¨ M#û P$B$%oÁ%n &=?&å&wÅ%øC%l¢$Ùâ#; #‰"Ä!íè—+«ôÓ‹£ûfp)åö^Íݨ]yÙ 4O Íà I: »Á8hÅ,`ûÙ‚šæA%ÖþJ lýb üx ßú ¾ù© ¤ø»|÷½>ö­ëôЉóR%ò Ãð´iïXîýþÑì¦ý‘ëYüVêû"éÈùñç|øÂæ.÷žåâõŽäšô”ã_ó²â8òéá&ñBá*ð½àLïaà–î1àî)àƒí1à í=à•ìSà!ìàÁë á›ëÚá¼ëãìdä£ìÉå'íç’í!èâí:é1î„ê§î%ì]ï(îTðdðpñ›ò‹ò˜ô…óEöNô¼÷ðô*ù…õ¼ú*öƒüíötþÓ÷jÌø8ÁùÉ–ú9û"«ûúûñ=üÒŠü· ëüœ Xýs Ãý- þ» Qþ gþD gþH ^þ9 Wþ( Zþ' kþ9 ‰þ_ ±þ‰ Øþ© ÿ° (ÿ› Rÿt …ÿH Åÿ%  v- â_ Xª à|c0¾ô ½D~w/­×ôƒV@Ë <î •È Ç‹ Ð, ºª — rh Kº ÁH@v’‡½yÆ K»   š r  3 â÷ V « ô - iTÖþrKýˆÑûŸjúºùÛÕ÷ ®öIªõ Ñôô’óöòšÿyòÿ#òªþ ògþSòfþõò¢þÑóÿ¶ôgÿzõ±ÿöÝÿ·öŒ÷KÄøÎcú’Cü~ þsÀÿH ëdÉ/5p¹É]B ·' 7 Ç - ‘ e v x D m  C ß÷ ®‰ hð - r;µÙÐèfçæÝZÎÊÿ¹2þ¢ÿ”ü‚þïú[ýBù-ü’÷úúçõÌùGô¥ø¼ò‰÷Iñyöñïqõµîmô™íqóœì†òÀë¹ñëñ^êðÙéðté‰ï9é ï-éŽîKéîˆéÏíÒé¥í$ê™ízê íáê¬íhë®íì£íñìšíÚíœíÂî­í–ïÎíQðþíõð8î–ñrîBò§îýòÙîÉóïô2ïsõ]ïCöï÷Íï¯÷ðLølðÕøÈðUù)ñÛùñqúøñ!ûkòèûéò½üqóŸý ôˆþ½ô}ÿõ~{ö÷‰ø£ù¥ú¶šû÷Åü„$þZ »ÿV uA2îÐYI¡±& °Æ ­™ ώ݃¡Pã! B !€*"·J#þm$]w%½L&Þ&%'ù0'” 'õ½&= I&ƒ ¯%Á ø$ò $!#ò ù!¯ « : 3¢õË5òg Š¡)©0¡0Š&d / ïö®ítñ>  6Ï{þ ÒüB 7ûù  ù¾ ø–}öxþôXšó)Uòå(ñ”ðCáî³íÎþ{ì¤ýCëvüê5ûéÙùôçeøäæèöÆåiõšäîó_ãyòâñåàï·ß î”ÞyìvÝâêYÜHéDÛ®ç3Úæ+ÙŸä0Ø2ãL×Ðá€ÖàÎÕEß<ÕÞÖÔöÜ™ÔðÛ†Ô ÛšÔEÚÜÔ£ÙNÕ-ÙõÕíØÜÖàØØüØWÙ9ÙÆÚÙPÜùÙÞÚàEÛaâWÜå¸ÝèSß&ë áîÊâõð{äÎó/æÔöè&úêÆýmìˆùî8˜ñ§%ôË ‹ö»ËøœøúŒ)ýˆtÿ{ÜEQË·þ!ôá#ú %Ê ë&k%(ó0)u*îÍ*SW+˜¦+µ¸+¢‡+[+ñ]*nx)Ôy(!h'YI&€#%ð#Š®"pM!G× L¼´gÁþq“>»øO½ÛlA ½Ù sÇ &Ê ÊÝ Yñ ÙúYöçìæé­õ)üˆ÷ËØþŸÿ*QþT öüx •û“ /ú Âø“ G÷s¾õ?'ôùˆò¥âðM:ïî’íŠîë#ÿOê·ý¿èIüFçÕúáådù‘äö÷VãŒö2â'õ-áÒóOà•ò¥ßuñ2ßkðâÞrï­Þ…îŽÞší”Þ¸ìÕÞøëhßnëOàëváöê¸âèêõãÜê'åÇêjæ¯êâç¶ê©éòê¾ëkëîìDðÛìdòší\ô@îBöÏî0øYï8úùïZü¾ð€þ«ñ“²ò€ºóC¬ôÞ}õ[1ö¿Øö ‚÷B 9ø] ù] Êù?‹úþ8û–ÎûNüP¿üy,ýŠ˜ýˆþ|kþ`Ñþ92ÿ‘ÿ¿ëÿiA•Ÿç/8¾ Q ïí V’ Â; -ç  ê0 EÏ ªw !0 ¥ø ,Å «‹ = cÖ¦]çá1m‚Ñ  /6 §= þ, 4 Uãf·nƒsCvÿñsþ‹kýbü‡VûóIúY<ù¼)ø÷~ öÝõ>ô Oó¡òsòçÿ¡ñaÿTñçþ.ñ‡þ3ñ?þ^ñþ ñöýîñáýHòÐý¿òÆýhóÖýZôþ–õzþ÷ ÿ†ø¨ÿñù<Cû½Œü5îý¸ÿ_?5.ç1áQ }Š þ» ~ä ù ¯ íW ·ë WX É• £ 3‘ )m óC – Ñ ~v Éü û a  § Úÿ Ö Ÿ2b? DàB©@€?eDÿYJþ^ÿTýrþgü™ýˆû×üºú0üú§û]ù:ûËøçúEø§úÈ÷|úX÷júûövú¹ö¢ú˜öäú”ö2û ö}û±ö¼û¾öôûÇö0ü×öwüùöËü3÷(ý~÷}ýÐ÷¹ýøÓý[øÉý†ø£ý¤øhý½øý×øÆüñø^üùäûùSûùªúùíùëøùÄøAø–øX÷bøhö(øtõæ÷ô¡÷óY÷¯ò÷ÞñÐöñ‘öjðVöÍï!öLïôõñîÚõÆîØõÆîèõéî ö"ï4ölïaöÕï™ötðéöXñd÷‚òøéóäøiõÊùêö¯úfø„ûéùTüû7ýbýBþgÿÿ‡è©_°È™ e 0% Bá Z—ˆ >Ò Ë# 0d g€lpA6èÝ`u¯ÛŽéýÔMœ}=‡±m÷7 íþ‘Õ œšYXÏ Š ÒB ú ò  š* =9 àF T Ng&€Ÿ¼ÿÓ$þåOýù•üôûLcû˜ÖúúÿDú]ÿ¬ù¹þùþ”øKý&ø‘üÉ÷èûv÷Wû÷Òú¶öXú<öØù³õLù(õ°ø¡ôøôo÷”óÕö óCö€òµõëñ+õQñ¢ô¹ðô"ðó”ïóï‡ò˜îò0îŽñÓí ñí¾ðaíkðNí,ðSíýïqíÞï®íÊïîÈïšîßïUïðAðcðPñÌðqòDñ¤óÈñíôYò\öóø×óèùÛôúûö þ=÷>qøJ˜ùJ¶úPßûp,ý­ ¤þö =6ÜThBËý /R\† •Ê ­ / \*âô/’B‚¿ê6Bˆ‚»ŸËš½s*>ÉÈV5ÔŒ@Ô ÷ Q A š ‚ ë º Dï ¤ K €zþ®‘ê;ÿ-ùý~ÇüÛ¦ûA˜úª¤ùÎø„øûo÷‚Ðö*öËxõ„Áô<ôèÿsóÿæòÿcò§þÝñGþEññý•ð¡ýÊïIýìîàüî\üíÄû)ì!û/ësú.êÁù#é ùèQøúæŒ÷èå»öÞäàõÜãõèâô â/ó8áEòvà_ñÊßð?ߨïÓÞÞîÞ$îuÞuí’ÞÒìêÞBìßÐë\àë{áQëÄâCë,äLë¯ågëVç˜ë0éìëTërìÊí2íð#î‚ó3ï…öPðƒùpñ{ü•òxÿÖó‹Hõ¿íö ¿øq ¨ú½ŠüäTþܧ¯LeÐ23 t"øŠ$È l&t (ù x)Y—*Ÿs+Ò ,ûf, ,þ„,ÌF,tÚ+õC+P{*)³](º'¤­%q%$)‹"Çè L=¿ƒ Är´FêŠÖH.o“î½Vè Í  X ; ü b ´‡ w­ :àõ%¨u_ËëÿeÀþ¡•ýÙ\üûd¯ù¼AøËöoSõ¸ÿÙóîþWòþÉð=ý/ï_ü‡í…ûÒë¬úêÓùZèöø¦æøüä.÷aãEöÙáWõaàfô÷ÞwóÝŽò^Ü«ñ8ÛÖð0ÚðKÙVï’Ø¥î Øî·×síŸ×úìÅוìØBì‰ØþëÙÇëÇÙë®Ú•ë×Û·ëMÝìßzìáíãíûäîóæ•îóè-ïëïïdíàðäïöñ~òóõ9ôŠ÷=õÞù+öü÷-þøD ùWGúdvûb˜üB£ýû þ‡ iÿç 7ÿ+Ã"‚2ÚÍŸZSÕîCj¥ÁýøIˆ&¿/ð@]D‚i©Ï¯ðÑ ó 1F@tO§`âz# ¢h Ù° ù MB q† wÏ ]" /| ÷Ú º2 vz %­ ·Í #á bô v l F  ¸Ô O ‡ Ï 3 ¦ }! ± Îõ ÝM å—ðþÑýþûFù*z÷3Àõ6ô<ŒòGñZËïvÿ¢î—þ¦íÁýÞìùüQìBüüëûÔëûÌë€úÜëú ì–ùgìFùíùêí ùïDùnðzùËñ²ùóäù[ôú¡õaú÷Ðú–ølûQú(üüìüÏý¤ýVÿEþ¤ÏþÂUÿÅäÿ¸‚£0ÕEbáÒO"‡Y‰€Xžø¬r©ÒŒSUþ‘•–~ÛUÿ'þgÿÛü™þœûÁýlúåüLùü=ø"ûC÷<ú_öXù‘õyøÛô¡÷?ôÖö»óöLógõõòÇô¾ò6ô«òºó½òTó÷òóOóÆò»ó›ò-ô‚ò ôzòõ‹ò§õ¶òCöþòñö[óª÷Âóeø,ôù—ô®ùõ9úõ·ú ö&û«öŒûV÷æûø/ü«ødüEù‚üÏùŽüPú‚üÌúeüJû;üÇû üAüÙû¸ü©û'ýzûŒýLûèý û7þíú|þºú½þ“úúþwú8ÿsúxÿŠúºÿÂúþÿ"ûF«û•aüñ<ýS1þº/ÿ"+‰4÷`uÇuË` f |` K7 êÌ—– [{ D‚ LŸ T¼ :Ââ©F}sIx ôZ!Ô$"£È"U8#ãl#T^#¨#è‘"Ú!:÷ ?ó"ÐäŠ0´‡äV,z\t‘v’h” M #­ í ° ái  >Í||Èþ. ý߉û“ úLªø f÷Õþ8öªýõ‡ü÷ójûØòQú¼ñ>ù­ð1ø²ï1÷ÆîFöèílõíœô/ìÏó?ëýòBê&ò=éNñ4è€ð,çÃï&æï'åqî*äÐí)ã*í(â|ì$áÈëàëßlêÞÐéÝ<é+ܵèaÛ;è·ÚÈç1ÚWçËÙðæ„Ù˜æ\ÙNæ[ÙæÙëåÍÙßåIÚëåùÚæâÛLæ Ý©æsÞ#çà¶çñá`èßã!éàåôéèßêVêïëðì.íÙïšîþò'ð7öÆñ[ùfóZüõ?ÿ¦ö#^ø(:úW8üœ LþÚ`æ`­D.yã ³ °‡ ¤Y v!#­‚$£%r‚&¨'Ä~'Ç¥'¯'sp'  'x³&É#&ûr%š$”#ál"Ÿ+!<Ù¾€.)‹ßÙ fU4„«ÙË¥êqB%#Cg)“ QÆ „  · Q Þ ¤ ý ù  P 1 ªOlz„ùŠz S‘ ÆxdÿàñýLküÀÒú6&ù§g÷ ™õ]½ó›ÿÑñÉþÜïïýáíýêë,üúéFûè[úFælùˆäpøÝâl÷GáeöÎßZõ{ÞQôQÝMóSÜTò‚ÛeñéÚ~ð‰Ú¨ïhÚçî‰Ú;îêÚží|Ûí.Ü–ìÝ*ì ÞÐëYßšëûà•ëòâ¹ë(åþëxçZì¿é¿ìöë+í/î¦í‰ðAîó ïçõðÕøñ¼û;òyþZóÿqôS‰õ‡®ö«ç÷Ê 5ùá Šúà Øû¼ýgHþÜkÿ‡#Ÿù­ ¯!š‚jÆ$ëÍòd׿–W3¶³ý!/ N Õ] $^ rR ¼:  Jï¸Ñz:Tô¤ « aw õ Ðz Šù Hk Ó Ü8 ©¡s<†úÖa±³—ï€g+B3.Ù ÿoÔýD—üJûìíù­ø] ÷ÿõ•ô,¡òÂ@ñ\îïùÿ®îÿ~í!ÿ\ìªþIë3þIê·ýhé<ý©èÆü èXüçòûaç•ûZçGûç ûÿçÛúè¹úWé ú!ê‹úýê}úþë|ú;í•úÀîÒú‹ð.û€òŸûzôü`öŽü.øÿüûùtýßûüýìý£þeÿS1uþd½iª  ¶z eÎ Æ6a/ãúR•°ÿ?LW†P«-¶ô¥¨}DGÌA±ŸSïæ3ktß· Fý §N ª W ­‹  a• ¿' #Áÿjÿ*{þþë‘ýâ,ýÝÕüÒŽüÁWü«1ü˜ü‹üzóûcçû<åûüïû  ü+1üŸ[üûü?™ül§ü}®üs·üOÃüÿÐü½ýÚüQü×üÒúÁüBù—ü¨÷`üöüaôØûÀòŽû%ñ@û’ïíú îú–ì*ú9ë¿ùùéPùÜèáøåçsøç øoæ­÷÷åU÷µå ÷ªåÔö×å±ö4æ™ö·æöWç‹öè“öé¯öcêëö÷ëM÷ÉíÔ÷¹ïrø§ñù‚óÌùOõú*÷?û)ùüWûý¨ý7þýÿbÿ7‹=¬ ıÚ8 ÷°  Di c›p ¡e uD  xÖ ­… ±–Pñû,’IQAÐÖ% y1 1 r . Ë 1  BL hw ¢˜ ì±@Á›ÍûÕgÛåä}ï4ÞBÆtÿ±²þ¤ÿý£\ý®ÈüÄAüÛÂûïNûõçúì‘ú×Púµ%úˆ úNøùãù«Êù=´ù½ÿ£ù(ÿ¡ù€þ­ùÅýÄùúüÛù$üìù@ûôùVúñùkùéù‚øâù÷ßù½öáùåõãùõäù[ôâù¯óÞùóÙù¬òÏùXòÈù%òÅùòÄù5òÊù~òÜùøòüùžó+úcôbúBõœú6ö×úJ÷ûø`û úÀûÁû<ü¡ýÒüŒÿwýgþ,¾þæ\ÿ¦¹z ‰‚ mwUB4Ô,ÊWeW\>äûš < îÅ = « · ?_ Ÿ™ Ù¼ ÷¿ üª è€ ´E dú úš z( ç ¤ L ² _ §ãœB1hÉhÿ²þÒÀüòûzú;†ùiÿ«ø›þÝ÷×ý÷ýKölü…õÈûÈô/ûô¦úyó)úäò¶ùRòGù»ñÜøñxøjðøµïÍ÷÷îŽ÷0î]÷`í2÷‰ì÷§ëÊö»êŒöÆéLöÊèöÊçÛõÀæ¯õ³å‡õ¨äXõ¢ãõ¥âÞô¸á•ôçàIô-àôßÄóߊó²ÞQózÞódÞîòyÞÆò¿Þ£ò4ß‹òÞß~òÀà~òááŽòHã²òîäôòÑæMóæè¹óë5ôwí¿ô÷ï[õ«ò ö™õäö¾øá÷üüø`ÿ.ú¯jûò©ü/ ïýp HÿÀ¹Fu窋ª*m¼ò!E A$Ï i&Y l(ÜD*Uæ+¸H-h.1A/IÎ/O080ýã/žx/á.o#.ž9-­$,£ç*w†)+(½e&2°$„ó"·.!ÐcÕœÅÚ¥uQ>Šþʱ ` u è¶ maý  È ‰²TO(÷ ©üÿ_úþþºýTÿ7üàý^û_üúÖúÐùDù#ù§÷‡øþõ÷÷Côn÷wòãöšðRö¬îÁõ±ì5õ¬ê²ôè9ôæÇó{äYóoâåòkàfòrÞâñˆÜ]ñ®ÚÙðëØWðB×ÙïµÕaïOÔëîÓyîÒî7ÑŸí•Ð;í-ÐÜìЈì ÐEìTÐìßÐóë¡Ñæë—Òîë½ÓÿëÕì¯ÖCìƒØ‰ì ÚñìýÜ|í…ß$î"ââîÉä«ïsç~ð'êZñòìQòÜïfóãò–ôúõÛõù-÷ûûøÊþÓùr,ûýüsûýÖkÿ# ÚX ?iœPð >›ƒúÁ,ï 8 " ïå ¢· >yÆ'3ņN¾¾ßêXå…מʤº—¨’Y{$_å<œHêå…ÀޝR; Ê ¾Y oæ !s É ^” Ø( 3º rH ’Ô š] äko-Ô–a'Ï ± /V  u €p{ÙkER­7þüdúù®ä÷ñÿÕõ.ÿÖómþêñªýðìüXî/ü½ìtûIë¼úûéúÚèVùåç©øçø†æm÷ æçöïåröïåöæ¾õrævõñæ7õœçõsèíô~éñôºêõìHõ„íõöîÝõhð/öáñŽöfó÷õŽ÷­ö-ø[øÚøúùŠù|û7úØüàúþ‹û/ÿ:ü9ìü2ýEþãâþŠqÿ õÿcp•ߣ@–pÆ:çòøŸø<ìËÒM§Ãk1œÀTÿáÿ!ÿgÿÂþçþtþfþ2þäýùýaýÊýÞü­ý^ü¥ýâû¸ýjûâýüú þ™úkþAú¾þøùÿ¾ùyÿ‘ùåÿxù\mùØoùS€ùÆ£ù-Õù…úÑcúºú?û^ûgóûXsü/ýüìý*þÇþ”hÿ÷IÉŠÿ¼þQÞýòü±üFûà ú.;ùˆeøÕ¢÷ðöNQöuËõ‰^õ õÞôbÒô9íô 6õÜ®õ¯Wö1÷t2ø^PùI‡ú6×û.Fý8Þþ\›v÷deN×/Q Óâ d ¤À |~ 9; Îö 2¬ id {mÛ?–ìHpëÄzäûÐkÃ"½"򯂼r„8xÖÏbÝ"QÁ þ 3 Ê ¬ € -% ´¼AHÙÈ?:­ ïþƒþäýëüæüVûðûÆùûAø+úÅöcùXõ­øøó ø¦òo÷dñÓö2ð5öïõîäô í7ô+ì‹óZëÞò—ê+òèétñOé¶ðÌèéïcèïè*îáç;í¯çEìçGëWçIê2çMéçVè ç`çCçsæ‚çåÑç¸ä%èòãyèAãÆè«â é2âQéÕá§é›áê‰á™ê¡á>ëâáüëPâÈìéâ•í­ã_îä(ïÁå÷ïçÓð¨èÄñ[êÒò/ìöóî1õ'ð€öTòá÷ªôOù*÷ÇúÂù=üaü³ý÷þ)ÿz¤ó0kÕéŽk Qâ  :¹ eP [Ó K½º7"ÆÔÕ¶:cPàI-JÒ9]ŧ 1;¤X_LKƒ¦Ë¸V¾¼¼´5«R§a§i«gº\ØD!;òv¹² yë 6 ô Z ¸ ™ ‚ ä R5 )†ÑçË8¶T¦^žZŸÿI¦þ&±ýôÿ¿ü°þÐûXýåúëûúhú(ùÖøTø3÷~÷ƒõ¦öÊóÆõ òãôLðÿó‹î!óÌìOòëñgé¸ðÍçîïGæ$ïÚäYîãíeâÉìZáìyàkëÇßÏêEßAêôÞÅé×ÞXéñÞøè=ß­èÁßè„àlè‡áwèÃâè+äÜè¶å*éaç‰é1éê-ëœêaícëÆïSìMòjíÝôîd÷ÞïÞù*ñPüòÅþãóDWõÍÝöOxø¸%úö áû ªýæwÿ¡;<𵌠9~:ä G ¯§ %û o6ŒO‚?\ž³?…´Ó a.7Ñüè!“Ceˆï¯BàŠËf ³ =  m R “ ² ê Ì > â™øû\?¹t ·QŠ^µ¼Õé†îñäÿ`ÉþÖÿ›ýTÿXüÚþûlþŸù þ-ø´ý°ö`ý*õýžó§üò<ü~ðÌûìî^ûZíõúÍë•úMê7úáèÙù‰çxùOæù7塸Aä.økã¿÷¼âU÷5âïöÖáŽö á5ö“áâõ¶á’õ âKõ“âõ_ãæôjäÈô¨å¸ô ç·ô†è¿ôêÐôÅëøôší8õŸï”õÕñö$ô‰öxö÷Ãø®÷ûJø<ý÷øwÿºù½‘úzûHmündýj \þ> Uÿí M|GôAR8/ª" möΓñ8 .Ì PN \Æ Q9 6©  ÊZ }‰ #š ¿ˆ W^ ë) zñ ¼ † 2N Ê k¯ < ¼² c †¢ó=mÚòu€ ©Ž2 ©~ é\ W– Í¿ LÕ ÖØ jÅš™V$÷£ÿÿïŠþJýý”þ{ýÌüýùúü ùü>÷–ûYõûtónúŒñÎù©ï-ùÔí‘øìú÷_êl÷ÊèâöUç[öæÙõÏä[õÆãâôéâlô5âýóªá›óHáFóáóáÏòKá¹ò¿á»ònâÑòKãùòEä1óYåsó…æÃóÑç+ôMé²ôøêZõËìöµîñöšðÒ÷sò¸ø?ô¥ùöœúØ÷¦û´ùÀü—ûæýnýÿ)ÿ:»^'{mšš®š¯™rgI  © Î  q g ü ˜ g « ´ ª ä œ û … g ò F Ó % ü Q Ò î ¥ r w á I @  ‘úÛâÞXí“ ÌA z A² ê Å" Z ` ¶ÿä ÿ1 €þ| ûý¾ Œýô 4ý óü/ Àü3 šü$ xü VüÌ 6ü !ü ü 'ü EüW rü¬ü®æü¸ý®Ný–týqýA¦ý½ýËÿÕýŠþöýHýþ üIþÙúkþµùþ¢ø†þ£÷zþ»öcþïõNþBõ?þµô:þFô?þøóIþÉóTþÀóWþàóWþ,ôZþ©ôcþPõvþö˜þìöÊþÐ÷ÿÈøPÿÚù¦ÿû süyíýònÿqáñ=y…Ĩ\K‘äÆ ¨Û bÆ  ´ R ‰ ç ã y # F‰ N 6f ú ¼ ú !  †  Ï  Þ & ž > P Nï Wy _î cI d‰ eµgÊlÌrÄ„ÿ°¤þ”ÖýrýIrüÖûçþAû¯ý²útü(ú:û§ùú4ù×øÍø±÷rø–öø†õÀ÷ôd÷‰ó÷òŸöÀñ7öñðÌõ1ð[õïáôÝî]ôLîÌóÊí0ó[í‡òüìÔñ©ìñdìVð&ìŽïøëÄîÚëûíÎë4íÔëmìïëªëìîê7ì:ê^ìéˆìùè»ì{èùìèLíÚç¸í»ç9îÃçÊîïçgï@è ð¶èµðSéañêòþêÐòì¡óOíˆô¿îõcð·ö:òø÷9ôKùQö¢úwøøû©úJýìüþCÿÿÿ¹}OóÜ” ¥ oŒ. ÜÝ ƒ O"{Ök”b´ùJV Í!1€"rX#“ $——$}ü$N4% :%º %H!Â$¯!F$æ! #ë!Ü"Ã!"n!!ü  q Ïè½C…WBMû­Í\gêÎ`•Îb95¡ Ø ] ¤ ² q E K" –èã@À¢‘U‡þýÂŽûjÿúþ²ø›üQ÷!ûùõšùªôøgó_ö0ò«ôñèòßïñ¿îDï£íeíìƒë}ë¢éuêÆç{éíåŒèä£çVâ¿æžàÛåõÞüäaÝ%äéÛYã‘ÚžâZÙ÷áLØbál××à¸ÖZà1ÖìßÞÕŽßÁÕGßÔÕßÖß„Öß1×0ߨrß5ÙÖßÚXàÜ÷àÆÝ´áߎâwáƒã€ã”ä¯åÉåè*çê¯èíPê»ïìRòÎíÜô¢ï^÷‡ñÜù†ó^ü¢õäþÜ÷e$úÕtü'¾þQ÷R #0 Fó b~ 0  ¨¾ Ð?ÍT©E[áÃ?SÊ«0À‡ÁΩn6Xoi¯jÈ_½H(h í¿ÔEº°šÿt/>Nû_°h`m m©i9Zº>(æÅ³ùU!3  èý ¨ã NÆÛ ¤T · [<?kŠó¡åÿ°þÜþ¹ü×ýÁúÓüÌøÌûÚöÁúïô¶ùó¬øLñ¨÷—ï®öüíÃõ|ìåô ë ôåé9óËèmòÖç¤ñçäð_æ1ðßå’ï‹åïiå‡îwåî°åÊíæ‹í æ\íJç@í è5íéè7íæéJíësíDì»í¥íîïšî—ð'ï ò¾ïsó\ðÖôÿð8ö¯ñ¡÷pòùCó‚ú'ôèûõ7ý öeþúörÿå÷dÊø>ªù …úÉ[ûy2üý Òý˜þjPÿ®÷ÿß‹‰"ñ-K7˜>ÜHPESpU”V­Z·e¶{¥ ‡ÎeÿF1/`!Œ¹ëTê„ͬ¯È˜ÒΑº ˜¶eÊ!ÛÈä[ãÙà?ßäËíðü ûæÿæÇþ¡ý–uüpEûMú-æø ¿÷Û£öž—õS¢ôýÃó§óX^ò×ñÕÿlñ¡ÿñoÿíð@ÿÞðÿóðåþ2ñÀþ›ñ¡þ.ò“þçòšþÂó·þ½ôèþÒõ*ÿøöyÿ5øÐÿƒù-èú—büñý±ÿ_'¶à5§£n7d¾ ß ¾I Ÿ d | YP # ÉÅ Vf Ëõ (tlè–I¤™‘Ô`òð´Ï:‘²7!Ň>æ £ A ò — ) ê K 6 X ~ P É 6 rØ×šJUà @½yÿ=/þÂåüN ûã`ú+ù!ø¿âöY×õéÚôsëóö ót6òëÿkñYÿ±ð½þðþuïZýûî•ü˜îÀûHîÜúîêùÌííø“íæ÷aíÖö5íÂõí¦ôí‰óíkòíLñGí2ðxíï¯íîàíí î0ì.îZëTîšêˆîôéÎîké-ïéŸï·èð‹è—ðèñ˜è‰ñÖèò>éŽòÍé)ó„êÚó`ë¡ô[ìõuíiö¯î^÷ðWømñUùîò^ú„ôrû0öüî÷àý¾ù?ÿšû«týBÿþó§RI³ä ~•   Š ¢ é !" 3ä ö?²NXQéKa7¾ûÔs ê<æn¬jxYÌ#uÓeµÚF0ÏiU†Ú‹c}ô _Š 2' öà ±Z \ò ü ‰ ‘ !  ¹ ¤ O 'ß ¨d +á¯T8¾ÄUÿuêý¿ƒüû"û&Èù?vøG0÷?ôõ(Àôÿ™óÔý{ò–üiñNû_ðÿù`ï¨ømîL÷„íïõ¥ì’ôÑë9ó ëèñYê¤ðµélï#éAî¥è,í3è.ìÍçJëwç„ê2çßéç]éãæýèÝæ½èðæ¢èç¯èeçæèÉçGéIèÓéáè‹êéfëQêbì)ëíìÄî"í&ðIî¡ñ‘ï4óóðÛômò‘öôZø¦õ7ú[÷üù þàúëÿ«ü¼zþ~M3-áŠ' ó¯ Ø  ª `f | u˜QvÀÉPÆ"Rùj®f=I¬üË,u:%¢ï)–§}{Í×3%0í +P µ Þ žo Rà ÿ ¤ k I Áî ‘ q3ÅÖzU ˾}ã8þýþÊý¡üÿ~ûüýcúÞüQù°ûDøyú@÷7ùDöè÷Nõöbô2õ}óÏó¡òiòÎññþð ï1ðBîgïèì£î˜ëæíSê3í éˆìûçìëíæWëûåÄê+å:êwäºéçãEé|ãÞè3ã‹è ãNèã!è'ãèxãûçòãèšä#èmåVèfæ£èƒçéÇè›é1êBê¿ëëgíÜë%ïÎìøðÑíÜòîîÒô,ðàö‰ñÿøó&ûšôLýCödÿö÷o±ùpqûl:ýcÿS ô4 çû á£Ý)Ô¾ à– Z4 9§%3ó±¡1|¨¿æFîuÍ“¢ŸƒŽÚoB5@·/fù ¢°,N–ççs#ôOklÞvJm°R&e诡éY /¸=d = . ¤  7 æ Ħ OTÛîmxð YAÿµÞýÿyüOýû‹û­ùÂùKøõ÷ïö#ö›õRôLô„òó¼ðÇñþîŽðOí`ï¬ë<îê"í¨èìJçëæêâä-éÛãUèõâ•ç/âëæáVæáØå×àmåºàåÃàÔäóàªäDáœä·á°äQâääã4åäŸåå&æ(æÀæbçkç°è0èêéëê$í7ëÆîoìgð¹íò ï˜ófð*õÈñ¹ö6óMø±ôâù<öpûÑ÷îülùTþû¡ÿü×þü‡ÿóX¸ý ÓW—G´åÁ t ¶ ò – g b Õ  > Ç £ b îd d½ à W @Ÿ ]ç m4t…vÛt1k…ZÔ9fèuæ"!ÎR‚u?˜¼ “o } Y³ #B ÛÏ }` ò |‰ Ù" !¶ S B q Â~ 6v £_ 7lÍÁ*v&ÏÓ|T)ÿ’ÛýГüWû\ÿ*ú¡þùäýø$ý ÷cü+ö¥û_õôú±ôSú"ôÁù³óBùcóÑø1óiøóøó¾÷;ó€÷}óZ÷àóI÷bôO÷üôm÷£õ÷\öÝ÷÷/øô÷—øÞøùÙùªùáúQúèûûèü¿ûÜý}üÅþ@ýªÿ þ‹äþnÆÿE¬ ”¼uOEÊ/²VÃïô~pÊù È+‰19Ýõyµ aý)„·ôCOË•RÆÚçfùúÿ™ÿAÿÿñþþ¤þúü\þñûþçúÐýÛù”ýÔø`ýÑ÷3ýÖöýçõêüõÆü.ôühómü®ò;üòüfñÇûÜð‡ûaðBû÷ï÷úœï£úPïFúïßùÝîpù¹îøø¦îwø¦îñ÷ºîf÷áîØöïHöSï¶õ•ï'õÚï—ô!ð ônð…óÆðó.ñ“ò¬ñ.ò<òÝñÚò¢ñó{ñ&ôjñÈôoñgõ‰ñ ö¼ñ»ö ò÷wòZøóHù­óDúsôIûRõPüMöYýd÷lþšøÿìù¾VûÿÑüLVþ ÞÿùlU»±. i¬ %3 Û ¼ ? ¶úYÜ­9î”ä""KÇSi<í SÁže Îï áa!Õµ!ªê!hö!Ü!‰!ø>!U¼ ¢ ài•?¥b—|pŽ0›Ô¢a§Û® F½ ŸÏ ëã /÷ f “ ¸ )Ö<ðS mˆ7¡TþµtüÁ•úÊÿ¼øÌþêöÉýõÂüXó¶û™ñ¢úäï…ù8îbø–ì5÷ýêöpéÇôîç‡óxæEòåÿðµã¸ïiâqî.á/íþßóëáÞ»ê×ÝéÛÜjèñÛTçÛOæWÚ]å®Ù…äÙÅã«ØãSØ’âØ$âó×Öáëרáؤá>ØÍážØâÙŒâÅÙãŠÚÑãnÛ¨äzÜ¡å¯ÝÁæ ß è’àvé;âúêä’ìßå:îËçôïÎé¾ññëžó4î‘õð”÷'ó˜ùÉõ”ûrø‡ýûlÿ·ýGQîñ¸:mä † Š í ‘6íe/{V|fdX2/ää wt"ôÖ#U%&Ð'óÈ'b(Ö(ó)Ú:)µ.)ü(A£(ú$(©†'PÐ&õþ%%G$ïì"•¶!6j Ï ^œç n™ó vrõÖm0Ü †= Ù‘ 'Û t  À I o [Šª–ü•Nˆ£mûÿETþ®üÐ û‰ÿnù:þÔ÷åü>öû°ô2ú+óÙø«ñ‚÷0ð.ö½îâôQížóïëgòšê@ñUé(ð"è"ïç4îïå]íîä ìÿãì%ã„ë`â#ë¸áÚê0á¯êÄà¤êsàºê>àðê+àLë6àÎëaàqì±à*í!áøí¯áÙîXâÌïãÑðäïñ å)ó6æwôçËõæè"÷_êwøåëÅùxíûïXüÕð¥ý£òðþ„ô1oög\øˆ>ú“üŠåýo­ÿAt=¶V¿äh] ô Ä _  « R Ü  ú ° ¶ ï² È¨ ƒ— } “] è7  ;Ø I£ Go 6=  ãÞ±>‚ÌII¶Ð’nTÀÓI‹ƒ:· ßæ z ( –A U Œcúq[}²‡D–}ÿ®þŸÖý ÷üŸÿüþ,ûœýCú üZùªûuø¶ú‘÷ÆùµöÙøâõð÷õ÷^ô3ö°ófõó¨ô„òöó òPó¬ñ¸òdñ.ò5ñ¯ññDññòð2ñµðfñŽð¶ñ|ð#ò€ð¯ò™ðYóÉðôñòôtñÙõëñÎövòÑ÷óâøÇóú’ôBûsõ‹üköÙýt÷&ÿˆøjŸù¤¹úÖÙûý/9þWyÿu¾üx 2W Y oÊ wc wë q_ a À C  AË aj kð `_ B¹ þ Û 3• UE fï c‘ J. ! ç U š å @ p Ú ü h ‰ é  ^ °Ï L8 î ‘ 2hÓÍv0Ž¿éi>ŽÂàh8™£6pÂáFNÄ´ÿ9ÿ§mþ Äýeÿý¶þzü÷ýÛû1ý?û`ü ú‰ûþù«úWùÇù¨øâøø÷ø÷D÷÷ö&ößõ@õ,õ^ô~ô„óÓó±ò*óèñ‹ò-ñ÷ñƒðjñîïæðmïmðïüï®î—ïpîAïFîï4îÛî?îÊîhîÐî®îîîï!ï–ïjï4ðÌïèðJð­ñàð…òŒñoóQòkô0ó}õ+ô¦ö>õã÷lö*ù²÷súùºû_úüüÂû6þ,ýoÿ¢þ¦%ß¶P<êRxTù>f Æ Ó b ! Ÿª Ë Þ~ ÙÉ ´ý p ' ‹# í 3î ]À iŠ YI -ÿ ã® €W ýý bŸ ²B ìã†*-3Ø/‰ > óÝ ©² `MÏâO®|ÜNŸ']ÿéýÉÕüvÆû½úÃÀù`Ëø÷â÷‡÷,öŒ\õ“ôoÿÑóÕþó3þgòŒýÅñàü4ñ4ü²ð‡û>ðÙúÔï-úpï‚ùïÜø´î9øbîž÷!î÷÷íŠöçíöïí¸õ îjõ9î.õmîõ«îæôøîßôUïñôËïõ\ð^õ ñºõÕñ/ö·ò½ö­ó\÷¸ôøÐõÏøööŸù(ø|úlùlûÅúoü2üý¶ýœþJÿ»ÿæÖƒëù³G ß}  ³ ì=¶ ®l  I” u l ”» ñ T  œ í Y´ …h Ž xŸ F' õ£ ƒ øy QÔ‹+§}«Ê™pc5¯éýN,§º < e¹ É.1›œÿÿnzþ×òýBpý±þöü"ý}ü”ûü úŠû‰ø û ÷Žú—õ ú'ô‹ùÀò ùbñ‰ø ðøÁî~÷|íõöAìiöëØõçéBõËè¬ô·çô²æó»åíòÑä`ò÷ãØñ,ãVñpâÙðÆágð+áþï àï-àNïÓßï’ßêîmßÔîgßÕîzßéî¥ßïìßOïRà¤ïÚàð‚á©ðNâSñBãòVäüò‡åôóÚæõQè&öèé]÷Ÿë£øuíùùpïaû†ñÝü·ókþö_øÊú7=ýʸÿT<ØÌY kÕ  L ¿ ¸ bòMeq½yþg-=LýT¢F!,#›¼$î4&"z'6“(-) @*ÒÙ*€L+–+¢µ+§+p+×+%ƒ*eÐ)šü(Ç(ðî&¸%2h$M þ"m {! á± 5Õ xÿ¨)ÏRî|«àR ’ Ñ  Fÿÿ¸þþïýÿ"ýýVüûˆûùµú-÷àùCõù^ó%ø~ñD÷¥ï]öÐíuõìŽô?ê©ó‚èÆòÑæãñ,åñ”ã.ðâ\ïˆà‘îßÎí¾ÝíuÜzìCÛèë-Úfë3ÙøêUØžê‘×RêêÖ!êaÖ êõÕê¯Õ/ê‘Õdê˜Õ·êÅÕ#ëÖ¤ë˜Ö@ì;×õìØÀíêØžîýÙ“ï8Û¡ð—ÜÅñ"ÞûòÔß?ô¨áŽõ•ãáö–å3ø®ç‰ùÚéåúìGüxî­ýéðÿlólõõ½€ø û3ýX o„xøraZ ½ 0  ó <¢ `: o¿ c1 : óÞ ŒMZo’€°ƒ±|— i^!K "&"ü ò"Ë 0#• Q#[ V# ?#Ù #’ Ï"J v" "½ {!s Ý $ * × ^‰ 8 —ê ž™ —E î_1-ñÄ¥TQáòiˆìfŸÙ D” ¨ iY̨(ò„8ß}ÿ:¿þ˜þÿýöü<ýXûwü¿ùµû(øøúšö@úõ’ù˜óíø0òPøÙð½÷“ï4÷aî¸öCíLö9ìóõDë­õgêvõ¨éTõéDõ‚èFõè\õÝç‡õ¹çÅõ¯çö¿çpöîçÞö9è`÷£èñ÷,锸ÜéDù§êþù…ë¼úvìyûuí:üîþüœïÇýÌð•þ òeÿ^ó.·ôîö£b÷I­øáóùm4ûìpüa¥ýÈÏþìÿföïÂÔÖ£Ø`̱™ˆT‚ÛÎ~Q%oÆ}awúa?$½ßU¤íbŠ+ÈÔÿoÿ3ÿ´íþT¬þ÷nþ¢6þRþÙýº³ým–ý{ýÌdý|Mý/5ýëý¬ýrïü?Öü ¾üÓÿ¥ü”ÿ†üPÿfüÿ>ü¶þüjþæûþ³ûÔý}ûŠýEû=ý ûìüÏú–ü“ú;üWúßûú€ûâù û®ùÇúùoúVùú0ùÕùù”ùüø\ùòø,ùöøù ùéø0ùÛøaùÛø£ùìøñùùNúTù¾ú¥ù>ûúÏûŠúqüû ý±ûÝý`ü¨þ%ýÿþiýþ^ Z)[SY‚V·SõQ<TT í O J ? ¤  ñ ð 0´ bl…ɦwœ"|ÁBGë«sôÜ*'VdùQ¾!jÔÿe}ÙÝ0#iWƒw…ˆ rŽ HŽ Š ½‚ ^ sô f{ ZõPjLÚNEZ¯k…‰ÿ§ÿùýÏþküþãú=ýaù„üè÷Öûvö0ûõ‘ú²óøùaòeùñÖøÜïMø­îÌ÷‡íM÷pìÓöcë\ödêèõuéuõ’èõ¹ç˜ôìæ*ô,æ¿óuåVóÌäîò4äˆò­ã$ò9ãÆñÚâmñŠâñKâËðâ…ðôáCðßá ðãáÖïâ²ï9âœïŽâ”ïãšïŽã®ï.äÏïåäýï´å>ðæð¥çððÌègñêìñwë€òýì%óœîÚóSðŸô$òwõô_ööS÷#øSøBúVùjü`ú˜þpûÌ…ü ¢ýYÈþ­ïÿ M 9Œ\¶|ϛ׸ÌͱЃ¾ ?œ Úm T3 ¬ î Ý!Ÿ è">Î#À‘$!0%a¦%†ú%”,&—8&Ÿ&«â%¹‚%Â%¼a$œ #^Ä" Ì!©º CÞ H ð( ƒÐ q v Ú‘ 1 x Äâ O :Ám 9ž ·Ë5ù¯%#R‘~ù¯ÿ\àý¾ü"Nú†øêÏöMõ¬có µñbÿð¸þnî þÖìYýIë©üÈé÷ûRèJûéæœú‘åôùGäRù ã±øæáøÓà{÷×ßèöñÞ`ö#ÞâõvÝqõçÜõxÜÀô)ÜxôúÛ>ôíÛôÿÛúó9ÜïóžÜúó-ÝôäÝKô½ÞŠô¹ß×ôÓà4õ â õkãööä«öªæL÷ƒèø÷{êªøŽì`ù¬îú×ðÜúó¡ûZõoü·÷Cý#úþ›üåþÿ©ÿ“` k­ÂE Ö< _\àgUY¸3ò@‘bqgošg W~B4%Äý, Âr tš Ÿ ªƒ <C Òåsb!½Óýƒ")3Å0WëÿúŠÿË>ÿ‹ ÿ=ðþãáþ~Òþ»þš—þ$lþ­ Bþ5 $þ¾ þE)þËJþPuþÒ›þU¶þÚÀþ`ÿ¹þêýªþxüœþû”þù™þ4ø¥þÏö´þmõ¾þô»þ³ò§þ^ñˆþð_þÈî1þŒíþYìÜý1ëµýêý éfýè@ýçý7æîümåËü·ä©üäŒü”ãvü(ãhüÓâeü›âküƒâ~üŒâü¶âÈüÿâúüiã8ýðãý’äÕýUå8þ?æ«þMç.ÿ€èºÿÓéLCëãÇì€`î# ðÊÑñz­ó1 õè¥÷Ÿ¶ùOÎûöåý•üÿ+»(@ ;¼ I+ J Œ @ Û ! íC ŸY :^ ¿P *2 | µÁ Ón Ò ­™ c ÷„hê·Cí‘ ÕøNÇ€|²ç‹éX4—ÿkÜþ‘"þ«jý·¶ü¶ ü¦jûˆÕú^Sú'áùâ}ù”!ù@Éøä vø‚ #ø Ö÷¹–÷Oc÷ßF÷l8÷ó7÷t<÷ðÿ?÷gþ:÷Þü-÷Vû÷Óù÷Sø÷Øö$÷`õH÷éóy÷wò­÷ñØ÷ïò÷<îü÷åìÿ÷›ëøaêø9éEø(è‡ø)çÕøAæ$ùpåpùµä®ù äæù|ãú ãRú¶â ú…âûvâsûŒâòûÂâzüãýƒãŠýäþÄäþ—å1ÿŠæÉÿŸçiÌèê¿gëoÚì"eîÖð‹¸ñ8yóÞAõ ÷Öø§£ú3rü·Aþ1 ¡ Ö ”X @œ ÜÑ bø Ó  1  {  ­ ü Ê٠Х ¼e  C¼ ÞV _çÅmëNaqÑ€>{¥d:nÒ·5`™þŽoà•X ×ÿ}ZÿèßþPjþ·þýšý} <ýÚ èü2 ›üƒ TüÎ ü Ðû_ •û§[ûð$û:ñúƒÄúÃúýxú1Yú[8ú€ú ðù¾ÇùÞÿùýþvùþRù7ý3ùTüùoûù‰úíø£ùÛø¾øÊøÜ÷ºøÿö«ø-ö øeõ˜ø¯ôšøô§ømóÃøäòðøiò*ùýñqù¤ñ¿ùañú8ñcú#ñ»ú&ñûEñŽû~ñüÒñÁüBòýÎòHþuóÿ/ôÚÿøô”ÔõLÃöÈ÷Òãø­ú–Rû‹›ü{çý_2ÿ.yçÁ * I¾ ‡M ½Õ åS þà   õ Y Ñ x “ } = l Î F B ›Ê ×v ø þ“ è ¸b m® ê ù BM cŒ ¹ ˜Ó ­ß½âÎÚÜÈïÿ±ÿ”%þqMýL€ü'»ûÿþúâýNúÇü¨ù³ûù¦ú…ø ùø£ø–÷­÷4÷¿öÝöÚõ’öõQö1ôölóóõ±òÔõòÀõañ´õÉð±õ:ð²õ¸ï¹õAïÇõÒîÙõnîðõî öÀí*övíIö7íiöí‰öåì«öÑìÐöÌìööÕì!÷æìN÷í÷+í¯÷cíÞ÷­íøî@øzîwøï³ø ïûøRðNùñ©ùøñ úæòsúæóÜú÷ôGûö¹û]÷7ü´øÄü(úaý²ûþPý¹þøþqÿ©*eê)®ùw×G¼ ¨ ï• Ä{™[p1Eý ¾å l¨ `  ÿ S& ‰  £ ž!zx"Û/#,Å#j5$|$šœ$‡˜$]o$%$á¡#–#BH"ç h!{ i ö L] ² ¾ù O8 Êt 2³„öÅ7üu&±CéW g Kq }v¶xø|B~—ÿ…ÿôþýVþœû½ý¯ù(ýÈ÷—üèõ ü ô†û9ò ûnð•ú©î*úïìÄù=ëcù–éùýç­ømæXøëäøxã»÷ât÷ºà2÷pßîö7Þ±öÝzöüÛGöüÚöÚêõBÙÃõ‰ØŸõç×~õe×`õ×Kõ¹Ö<õŽÖ3õ†Ö4õÖ=õÓÖRõ-×mõ²×‘õeØ¿õ:Ùõõ6Ú0ö[Ûwö¥ÜÌöÞ-÷¢ß™÷Yáø0ã’ø'åù=ç§ùoé9úÃëÖú0î}û¹ð+üYóàü ö˜ýÀøMþ|ûþþ9þ®ÿ÷Z» ·H c ¾®`CæÌPCŸ®Ñådܲ¶ ÷p"3$`m%{±&„Å'«(jf)Iö) ^*ò›*½¯*|š*6c*ì*„)Fã(í (•8'87&Ú%}ë#'¤"ÚM!“æVo#èôRƱ™oOL“1Ô#"K-ƒ ?» Uñ k$~U‡š¹ªì¾$ÿØ[ýö—ûÔù0øF\öO¥ôNóòGGñ8¢ï)îxìóêëyéË è¦¯æyaåG%äÿâÒñá–ùà[à!Ußéÿ®Þ³ÿ%Þÿ¸ÝLÿkÝÿ>Ýêþ5ÝÃþOÝ¥þŽÝþöÝ„þ‚Þ‚þ.߇þûßþéàŸþ÷á¸þ!ãÜþlä ÿÜå>ÿiç{ÿé¿ÿÍêœìKzî—fðç]ò7aô†möÖ€ø#”úk§ü­¸þ꿽I®kŽ] » ƒH j¿F h×—Œª2¡Ít[)Ú¾S5Èÿ‘7ÿÒŸþþlýÌüý&üÎ{û‡Óú%-ú±‘ù,ù˜øõ øJš÷•2÷ÖÔö |ö:0ö_ôõyÈõ‰¯õ“ ¨õ— ²õ˜ Ëõ• ïõ’ öŒVö†œö{ëölG÷[°÷F$ø-Ÿø"ù÷ÿ«ùÜþ7úÂýÉúªü^û–ûöû…úŽüwù%ýoøºýi÷LþhöÜþnõjÿ{ôúÿ’ó‹·òëñ¥0ñ)…ð¦éïbïŠíîùŠîf;îÒî=äíªÞíôí|(îâwîCàî _ï÷õïL¡ð¢dñúAòS 7ó® Gô lõ^ ¢ö¬ æ÷ö 1ù: ƒúw Ýû° =ýå ¥þ B |f è€ O «’ øŠ 8w h W ‡ + “ ô Ž ± v a H š ¦# .ž œ ïl'ÄGPSD‘Æåô™9BÁc:£Ÿÿý ½þK Üý’ ýÏ )ü Yû3 ‘úY Ïù}ùœbø¹»÷Õ÷òö ö7”õ^(õ†Çô®rô×ÿ*ôþþíó(þ½óTý›ó…ü„ó½ûxóøúuó8úxóxù‚ó¹øóù÷¦ó7÷Æóvöíóµõô÷ôWô<ô”ô‡óÑôØòõ/òMõ‹ñ‰õìðÇõTð öÀïVö2ï§ö­îüö5îU÷Ëí²÷qíø*íløöìÏøÔì3ùÄì›ùËìúåìzúíøú^í|ûÀí ü?î¥üØîGýŠïìýUðþ9ñ8ÿ3òäÿFó”uôM¾õ÷Ûø­úšûV1ý'Ñþóx·)uà0 ›ã U•  @ ° å L  × Q… ºì ?M‚s²‚ÑuáIàúÍ¥þmLz¹ ‡B v¼ C& ò€ …Ñ û TS “…¼¯ÐÔÎôº—)dH%kÜ Š ½3 ñÿØ -ÿ{pþºýÁýfxü êû·iûg÷úÿ“úÙý;úžüíùkû­ùAúxù ùQùø7ùúö&ùóõ!ùöô#ùô,ùó:ù8òOùcñgù–ð„ùÔï§ùïÌùjîòùÆíú+í>úžìaú ìƒú­ë£úHë¼úñêÓú§êêúkêÿú?êû#ê+ûêBû*êWûMêgû‡êqûÔêyû6ë€û°ë‰ûBìûìì¹û®íÝû‡îüzï0ü€ð\üœñŠüÏò»üôòüzõ3ýòöý}øÖýú6þ¼ûþjýÿÿxÿÙíÿšc`Þ*\óܹ [w Û+ ZÎÖaQàÉL>Ÿ­Øûm¹ë÷·&fHô`^q¥wÊtÌg«HhÔ†€è/³]BrÎnWSÚ#WßÍŠ>&©·? ~À ìÿ: `ÿ±×þ$Vþ“ÝýkýlýÛžüOÿDüÅýñû@ü¨ûÂúfûKù/ûÙ÷ûqöçúõÓú·óÉúgòÈúñÌúßïÕú¨îåú}íüú]ìûFëAû=êkû@é›ûPèÍûlçüšæ5üÖåkü!å£ü|äÙüëãýlãFýÿâ~ý¨â´ýjâêýGâ$þ>â]þOâ‘þ|âÄþÁâøþ ã)ÿ™ã[ÿ4äŽÿñäÆÿÒåÖæ9üçu>鱚êíì,¢ílRï´ñÿ óJõ–*÷áXù+‘ûvÓýÂmeŶ! Là Š8Ã…ôÀ éIúmðÌ¥±2±·£!„_"Y|#&m$ê3%¤Ñ%WG&Ž&¤®&<ª&È&M+&˳%A%µV$&k#”a";!mÿûÜþ¡Qþ2Íý±Qýàüvuü ü§û7Gûdîú‰¤ú¯ kúÑ Fúó 3ú0ú36úTAúvOúœbúÈþ}ú÷ü¢ú.ûÔúmùû´÷^ûö¯ûWôü°ò_üñ¶ütï ýãí[ý[ì«ýÛêùýjéFþè’þ­æÝþbå&ÿ#ägÿôâ¢ÿÒáÕÿ¼à¸ßÉÞ;òÝS3ÝfÜtÜ{–Û‚=Û€þÚyÞÚrßÚkÛcFÛ[°ÛU>ÜRìÜNºÝK®ÞMÄßVþàf\â{Þã–~å¶9çÚéýê-íbï›EñØ„óÔõb/ø¨’úñùü9`ÿ~ÂÁ w>Åu ¦< Ó_ölc#=+ú%šñ†ÄËðIõüÖ¨ I(!ß!gñ!æ#"Z7"Ã."+"’ÿÁ!÷þZ!_þÙ ÈýA 6ýŒ£üÄüé„ûÿûúxúøÿùà–ù»=ùˆñøHµø…ø±`øYJøý?øžDø<[øÕ øi ´øú òø‰;ùùìù&Vú°Íú:QûÉÿÞûXþoüçüýyû‘ý úþ¤ø¤þ@÷+ÿãõµÿŽôA@óÑýñcÅðò—ïyxîôfí`hìÀzëêfÒé²éý~èHøç“ŽçÕCç ç<úæ`úæxç‹Mçžžç³èÇ èÜOéñêþøê ïë øìîBï ‚ð Ôñ 3ó Ÿôöú÷í ù݇úÅþû©oý‰Úþd9:’ ßÒ•POmx©nIM ã rÀ úY zÙ õC h˜ ÓØ : ÿ úþ Rþ ¨ýê þü´ Rün ¥û øú¼ OúR ªùá ùi røê ã÷e [÷ÚÙöI`ö´òõ ŠõŽ0õüäôl¦ôÞyôQ\ôÅMô8Iô­Oô$`ôžyôôžÍô! õ©ÿZõ-ÿ¶õ±þö5þ‰ö·ýùö9ýl÷»üà÷AüWøÇûÓøQûSùÚúØùeúcúóùðúù}ûùüžøü5øýÔ÷•ý}÷þ1÷œþïö ÿ·ö¢ÿ†öaöšHö>ö‰Könö{¤öøîöxL÷ú¹÷~9øÍø{wùô7úk ûàøûZõüÙþ_ÿëHw }þ ¼| î SU §¹ ü P t ¡ Ò ë * , { aÀ ˆö Ÿ¡+‘+k+ÑÚ [¤ È`  E¤ W) J   ÎX cž ÚØ1m)ŽC•V‡bag)fà e‡ a aÿ­eþ0lý¬}ü%•û›´úßùˆÿùþVøü¤÷û÷Œùuöøøõºö‹õ^õ/õôäôÑò¨ôŸñ}ô|ð`ôeïTô^îWôcílôsìô’ë¹ôÁêñôýé4õHé|õ¦èÎõè(öŒç…öççö¬æJ÷Oæ®÷æøÁåsø“åÕøså6ùdå—ùfåõùzåNú¢å¤úÚåóú$æ7ûƒæuûóæ­ûuçåû èüÁèSü‹é‹ünêÀüeëòüsìý•íGýÊînýð—ýñÄýþòøý•ô1þ@önþÿ÷¯þËùóþ¥û;ÿ‹ý‡ÿ|ÿÕÿw(}ƒŒæ O¶ ¿É 2× £ÚÓ‚¾ï˜]aÎB»¸F-´šû4 NC!’+"Èð"ö”#$Gn$i¥$„·$”¥$’j${$Q„#Ý"Î"&!- Ùþ€Á"mºG…ÍòLOÉDáÃHNÎ{ Z¤ êË ~ð½ÿ9eÿaÿ‹Èþ¼þ†þðüNþ+ûþoùúý¹÷ßýöÌýkôÁýÐò¼ý@ñ¾ý·ïÃý<îÐýËìãýeëúýêþÄè4þˆçTþZæwþ<åšþ0ä½þ5ãáþKâÿrá$ÿ°àBÿà`ÿnß|ÿòÞ•ÿÞ©ÿGÞ¼ÿÞÍÿÞØÿ Þäÿ4Þñÿ{ÞùÿâÞÿÿnßàÝàÃá Íâ úãEå°æ:èÝé"œë)sí2bï?eñOzó`žõqÐ÷ úŽSü™žþ¥ê²7¿€ÏÂÝø è î9î@é2Ü ÊͲt˜úx`S¤(Æøÿ¾Àÿ”|ÿF2ÿÔäþ= þ‚ 8þ£ ßý¤ …ý~ +ý4 ÌüËküB ü˜¢ûÓ>ûõÞú†úõ;úÙúù¬Åùn•ùlùÄCù_ùðùyóøþöø‚ ù <ù… zù Àùˆ ú \ú°ú û pû-âûÃþbüZýñüøû†ýœú!þEù¼þõ÷Vÿªöëÿdõ|%ô íòš½ñ(–ð²xï9fî¼[í7[ì¦iëƒêk¨é¾ßè&èF~ç}çæªcæÍöåê¡ådå@å8åHå påþ²åëæÖæÀ,ç«æç”Áè{¹écÉêJöë0;í™î ðó–ñâ6óÔéôʬöÁ}ø¸[ú°Aü©+þ¡˜ì‚Ñs±c‡ OQ 3 ³éF¸Á~%:n𞟲D¬á‡uAÿÛ}Uî±Xè»ÿÿmþãÁýªýUeüè²û`ýú¾Fúù6ÝøT3ø`‘÷_ùöRiö:æõnõãõ«¢ôi Sô! ôÕ áó‡ ¿ó7¯óæ±ó”ÇóEíóõ&ô£pôTÅôÿ%õ»ý‘õqü ö-û‘öîù&÷¶øÈ÷„÷wøVö/ù.õêù ô¦úìò^ûÕñüÅðÉüÀï}ýÅî4þØíòþ÷ì°ÿ$ìjcë¯êÇêcréïîèr}èð#èfàçÙ¸çG¨ç±¯çÐçe è¯`èïÐè(ZéVêÁê¥›ëÆŽìâšíý¾îôï#Bñ0¥ò7ô=™õ='÷:Ãø5fú,ü"»ýhÿñ¼Ø`¼üŒx Mƒ æ æ5 ªqh•!¤Ôš~u"5ÀÜYféÒs(÷`w~ó…hrÜHM¼ÿ°*ÿF˜þÅþ5sý˜äüíZü4ÒûpPû£ÒúÎYúñ êù ƒù( &ù@ ÕøU øj Uø"ø”÷÷©×÷¾À÷Ô´÷ì¶÷Ä÷&ß÷Iøn0øšÿeøÄþŸøïýÞøý$ùIünùwû¿ùªúúáùpúùÐúWø0û™÷’ûÝöòû%öPüqõ¯üÁô ýôgýwóÁýßòþOòqþÊñÆþQñÿæðkÿ‰ð¿ÿ<ð ÿïVÔïºïà¯ï!½ïbßïªðõlðB×ð’Yñâïñ.šòu[ó¹1ôýõFö“,÷æQø?…ù™ÇúñüEmý‘Êþ×)ŒTìLÈ©2P]“ }È ‘ë ™ø ’ñ ~Ò`œ8LãÃ`w¿·-B9Á%5ô›¨÷AN¿œ$âr$«cÓ ¡ÿæ Úþë þà OýÆ ü£ÏûvûBjú ÅùÏ,ù”žøZø"¦÷ïþ?÷Àýçö–üŸörûhöXúAöEù*ö>ø%öB÷.öQöGönõpö•ô¦öÈóêöó<÷Qòš÷¨ñø ñvø}ðòøúïrù„ïöùï~ú»î ûhî—û î%üåí´üµíBý•íÐýíXþ|íÙþ†íSÿšíÄÿ¼í*ëí‰+îæyî=ÜîSïÜÜïvðXñ…Øñ«¦òÊ…óåyôþƒõ ö)Ð÷>ùNfú\Êûg<ýqºþzE…Ú’{¢&µÖÊ‹ãD üû ­ 8ZXýx˜—%¶¤Ôñn±-ÜIïdå|»Št“ „†Ôu \ ?õº÷]Èß?OŸ©¡J‡åP{š£4ÃïOAÙÿ…eÿ¾ ïþí |þ þ: ýZ<ýyÝüš…ü¾ÿ5üåýïûü°û@úzûxøMûµö'ûûô ûJóøú¢ñíú ðìú{î÷úùì û‡ë#û!êEûÊèmûç™ûDæËûåüûã=üìâ}üîá½üáÿü.àCýk߉ý½ÞÎý%Þþ¤ÝSþ5Ý”þÙÜÏþ˜ÜÿnÜAÿ_Üvÿnܨÿ¡ÜØÿòÜ]Ý-åÝQŒÞrNß‘/à¯1áÉWââœãúåæ!è2ÓéD¥ëX“íkšï|¹ñ’ëó¢0ö°…ø¿æúËQý×Ãÿä6ó¯(   !q#Ì Kjqó]à,ÉÞ¬n ˆÜ!`�H$ùC%¾&~À&:='óÿ“'¨ÿÂ'ZÿÉ'ÿª'·þd'cþú&þm&½ý½%jýí$ýÿ#Èü÷"|üÓ!5ü• õûB¾û×û[mûÎSû4@ûŽ3ûÞ-û#3ûdAûž]ûÕ‰û Âû; üp Rü¥¨üÝýfýWÍý™;þäþ°þ2ý+ÿ„û¬ÿÝù-=ø±¥ö8õ¼ó=ò¹žð23ï¥Òí{ìv1ë×õé0Ç耨çÇ™æ•å4¥äZÇãvÿâ‹M☲áš0á’Åà„qàk7àLà%àý4àÎnà›ÉàgAá1Ôá÷‚â¼Oã:äG@ådæØ¤ç£ýèrmêCóëíí7ïÇñð£ºò‚ŽôblöERø*=ú+üøþÞÃá§»‡ˆdJ=þŸ ä- ¯ª w;`øÿ˜¬ÿ¶Xÿ»ûþ¡–þk*þ¹ý¬Eý"Íü{Oü¿ÐûéNûùÈúð=úѰù˜%ùI›øäømš÷å$÷K·ö¥Qöóóõ3õhPõ’õ³ÜôʸôÛ¤ôå  ôë «ôï Ãôì êôê !õägõÛ½õÒ öÇ’ö»÷²›÷¨.ø Ìø™tù”ÿ'ú‘þàúý¢ûüiü•û1ýžúüý®ùÆþÂøÿá÷S÷3öÚfõš¢ôTéó <ó¼œògò‘ñž#ñ*Äðªtð!6ð’ ðüøï] ýï¶ ð GðO ŽðŒ çð¼ Xñä Üñ uò #ó/ çó< ½ôD ¢õD ™ö=  ÷0 ´ø Òù ùúß 'ü¸ \ýŽ “þ] Êÿ& ê 7¨ ha “ ³¿ÉeÑ˳ 1‰ ¿O Fÿ Éš E ¼ ,é ™)TbiÁhTw2Ïÿ&ÿÎ |þ‘ ÓýT +ý …üì âû¸ Aût ¥ú ú™ |ù òøa oø© ÷÷áˆ÷!÷5ÆöSuöi0öwóõÁõ‰˜õ“{õ¥jõÄÿeõòþmõ.þ€õwýžõÂüÃõ üðõXû$ö£ú]öîùö:ùåöˆø3÷Ú÷†÷1÷à÷‹ö<øëõ›øOõúø·ôZù#ô»ù”óú ó{ú‰òÛúò;ûœñ™û6ñöûÜðRü”ð­ü`ðý>ðbý/ð»ý8ðþVðiþˆð¼þÊðÿñgÿsñ¼ÿÝñUòhÙòÄjó" ô‚»ôå|õJNö®0÷øtùØ'ú?@ûªhüý‡Þþö)d€Íâ0LŽºæ&:Šˆæ Ó;  S ã † 5¯ zÌ ©Ù ¸Ú ¦Ð |¹ =” òc ›( +߉è' ¹?Û¹œ+G–Üù]VƯBUN¥>ôFßžÿŸøþZ Wþ ½ý¹ +ýX £üæ#üj¯ûçGûdêúåšúkWúúþ!úŽýøù*üÛùËúÊùvùÈù(øÑùÞöçùžõúiô3úBófú,ò£ú,ñæú=ð.û]ïzû†îËûµíüíìtü2ìÎü‰ë(ýøêý|ê×ýê,þ·éyþeé¾þéÿßè<ÿ¯èuÿ”èªÿèÛÿ èÃè*ùèG>éZ“éiùérrêvþêxëyQìxívöípçîiìïbñY0òOkóHµôD öAt÷BêøGoúMüWšýb>ÿq肚™O±̬éN æ ${ >X¦t.ž§óÂ%Ú;ð<ý1éûœì+ÚŒÇòיÎy®Tv&*îÆ°Cn)Õçÿì¦ÿçdÿÍ#ÿ§àþyþ?Yþ÷þ Öý4™ýº dý4 3ý§ ýäü‹Æü¯üwŸüð’ükŽüëþünýšüôûªü}úÁü ùÞü¤÷ýFö-ýöôYý·óŒý†òÃý^ñþý=ð9þ#ïyþî¼þíÿþìEÿ3ë‹ÿiêÒÿ­éþèYZèš¿çÜ2ç·æ[Sæ— æÒÕå ¶åC¬åu´å§Ïå׿Læ2¯æ^.ç†Äç¬wèÍCéð(ê'ë1>ìRlíq°î ð©|ñ¿óÑ¡ôàOöíøøÚù´û ™ý ‰ÿ {n÷_ãJÇ4 ¤ | Pí½ås¤ ^…é¶>X…òµˆÆ³ t)±ÿs/ÿ¾­þì,þ¨ýø$ýÓ£ü‹'ü®û…9ûÌÉúð`úûûùõœùÞIù¹ùÊø0ŸøÌøSnøËdø8aø¡ gø yøh ™øÊÉø)ùˆTùé­ùKú±uúÿÝú‹ýHûü¸û{ú.üù©ü’÷+ý2ö°ýÛô7þó½þIò>ÿ ñºÿÔï1¨î í ‰ìr”ëÒ¬ê,Ñé~ýèË2èvçIÌæ{7榵åÈLåáôäó¯äyäWä LäWäyäø²äëåÝtåËú庘æ¨Tç—%èŠ é~ êr!ëjOìd’í_íî\\ð[Þñ^tócõjÏörø}Uú‡ü“éýºÿ¦“®v±\°;¬ ¢Å ”i ƒþ k‹L(ŠýôÈ@ˆlArôVŸ CÐãj~ð^¥ÿ®0ÿÞ·þé8þÓ·ý9ýK¹üç<ürÂûéLûLÝúšsúÎ úî²ùú[ùö ùçÈøÐŽø¬`øƒ>øS)ø øÛ #ø– 1øP Iø nø¹ŸøkÜø#ùÎuùƒÑù>2úÿÿšúÇþûŽý|ûVüùûû|üèùý¹ø”ý•÷$þ}ö²þqõ<ÿnôÃÿqóEwòÅ„ñI›ðÌÀïQôîÔ8îQíÆóì3eì—éëñ|ëF#ëšÜêì¨ê8Žê€‡êÄ—ê¿ê3ë^Vë…Âë£@ì¼ÕìÓíã?îñïùûïú÷ð÷òî'óÜXôÅ”õ¨×ö‡ø`eù3´úÿ üÆoý‡×þA;õ”¡ÜGç;„]{¨“3ž ¹’ :l ¸% 2Á §H » ÿ ÿvoþ¾ÞýîPýÄüü:üÛµû¡3ûUµúþ :ú Åù3 Vùº ðø3 ø <øø ô÷I ²÷’ {÷×L÷$÷_÷£îöæãö*àömèö±üöõ÷;>÷Šj÷Ûœ÷0Ò÷ÿ øïþNøVþ’øÅýÝø9ý.ù¶ü‚ù6üØù¶û0ú8ûŒú¾úæúKú@ûàùœûùõû'ùPüÒø¨ü€øý.ø^ýß÷¸ý–÷þU÷qþ÷Êþòö#ÿÐö}ÿµö×ÿ¡ö1˜ö™öð¤öR¼ö´ßö÷wP÷ÚŸ÷@ÿ÷¬oøëøŒuùúv²úéeûX)üÃùü-×ý–Âþ»ÿl½ØÆ> Ó  ßø êC ø… ¼ $é A  X + a ? U H 3 E 2 Æ ‚Þ 6 ÚM hï Ö‡ # N–_ ZtBÔ&Ùr¶ öt1Àiò Ö " Eÿ €þþ ¾ýÕý›RüS¦ûû¦múIßùê]ùŒÿæø0þ|øÔüø~ûÏ÷,ú÷ÝøW÷•÷0÷Uö÷ õ÷øó÷Ûò÷Éñ÷Äð8÷Ìï`÷àî‘÷îÆ÷BíøŽìDøæë‹øJëÕø½ê$ù<êxùÊéÌùmé ú&évúóèÊúÏèû¹ègû²è°û¹èûûÏèEüöèŒü4éÏüƒéýäéNýYê‡ýáê¼ýyëîý"ìþÞìKþ«íwþ‹î¡þ|ïÍþð÷þšñ ÿÇòKÿôvÿTõ ÿ±öÊÿøõÿ”ùûM®ü}Mþ®÷ÿâªhL+„í½«ôd / hÏ ¡„Û7áIyzù©[Õ¦üà" F#h(„œÓ®n¹à¹2 ²g ¨€ š‚ Šj u0 aÏHF'˜ÊÓà¡ájÏ2©ýmÈ•°`2,¤ù Áe‹º W #R ò™ÃÜšt^P /æÿ1þõÿ„üÚÿÞúÂÿ@ùªÿª÷–ÿö†ÿ“ôwÿókÿªñaÿKðWÿøîNÿ´íFÿyì?ÿFë:ÿ ê8ÿ é4ÿè2ÿç1ÿ9æ0ÿlå0ÿ®ä1ÿÿã7ÿ^ã;ÿÐâAÿXâHÿøáPÿªáZÿvádÿXáqÿQá„ÿ`á™ÿ†á¯ÿÇáÆÿâàÿâûÿãÅã2ŠäSjåwcæuçÄŸèíáé8ë;©ì`.îƒÊï£~ñÃCóßõüõöÛø*Äú<´üE­þG±D¼8È$Î Äì¦ Æw ˜Acÿ(´åZ—ìD^ðÿª’ÿÓ.ÿÞÈþÏ`þ¦õýg†ýý“«üó>ü-ÓûAjû2û«úÁQúcúé¹ùVyù¦?ùÛùùéøÿÏøõÀøÛÁø°Ìøxåø5ùë/ù”cù5œùÒ áùi 2úú Œú‹ ðú_û²ÕûJMüãÉü}GýÄýºÿBþbþÁþýAÿÍûÃÿúBXùÂ'ø@úö¶Ôõ'¹ô’®ó÷­òSºñ©ÒðûôïIï‘TîÒ™í íì?PìjÄëŽLë°åêÌŽêåIêùê õéçé"ðé) ê0Bê5ê8íê9cë<îë?ŒìA?íAîCâîEÑïFÕðEîñEóCKô?Šõ;Ñö6ø.yù#áúSüÊýëBÿЮ¯ˆj[Á&íg¯±hï  È# n ø  Ç/†·79Ø·_5˰ÿ%ÿJ˜þfþluýbàüILüºûÚ-ûƒ£úú—œù!ùg«ø¾?ø Ø÷I y÷€ $÷± ×ö× •öù \ö .ö* ö=ôõMçõ^äõmìõ€þõ’ö¤>ö¶nöÊÿ§ößþéöûý5÷ý‡÷Eüß÷rû=ø¢ú¢øÓùùù~ù=øõù~÷rúÇöòúötûuõøûÙôüAôý²óŒý*óþ­òžþ;ò(ÿ×ñ´ÿ‚ñ?:ñÌñYÔðá¸ðe«ðæ®ðdÂðÝèðU ñÍlñ@Ìñ²@òÆò…\óæô@¼ô”†õà_ö'L÷hHø¡SùÓlúþ‹û# ¯ü> ÙýO ÿX EV ‡M Í9  JøwË™”´VÊ Û ¾ä gÞ Á ¢‡62ÄÈLIÒ»UÒmM¤È¼B¶º–4_°.³±ÿE6ÿÅÀþ2OþŒáýÒ yý ý3 ºüR düi üw Ïû’ûYû(û|üúvÕúp³úk—úhúgsúlÿjúxþhú‰ýiú¡ükúÀûqúåúxúúúAùˆú|ø•úÂ÷¤ú÷²úoöÃúÔõÕú?õéú¯ôþú&ôû¦ó%û1ó6ûÈòJûmò`ûòxûÑñ”ûñ±ûWñÐû%ñóûýðüãð=üÔðhüÔð—üßðÌüúðý!ñDýTñ‰ý”ñÒýáñ þ>òtþ©òÍþ"ó+ÿ­óÿGôóÿñô]«õÎröDG÷¼)ø6ù±ú-"û§;ü [ý–þ ªÿ{Øç QG´‰ÍbªDçm ˆ @ž [® k¸ q¹jªWƒ9@ àÐk‰ã7HÙœoÞý…ú}Æì{Y¿¥"ƒäÏG¬ÿ,ÿ>zþB çý: Zý$ Ñü QüÞØû¯gûyû?ŸúJúÁÿù¼ùCƒùÿVùÐý3ùœüùqû ùNúù1ùùøù ÷"ùö<ù õ_ùô‡ù5óµùcòçùŸñ úäð]ú4ðžúŽïâúóî*ûdîvûäíÂûzíü í^üÖì®üšìüükìJýIìšý6ìêý2ì:þ@ì‰þbìÚþ—ì(ÿàìuÿ;íÁÿ¨í &îQ¶î™Wïßð$Ëðk¤ñ°òòó4ôt½õ±ëöí'ø%pù\Çú’+üÆšý÷ÿ%Ry’œ½ Ú-ó¹ = ´ $-r/¼.þ&4] röjÝA¿øœ•uL‰"ßð½;‰5PÉÕf˜ëXX¯Ûìžb$åô¨Áj€-2ôÿ× ½ÿs ˆÿ Uÿ‘ %ÿôþ–Çþ™þkþ =þ‰þ ÿëý‘ýÅýü ý¯ú|ýKù[ýí÷9ý—öýIõõüôÖüÉò¶üœñ™ü~ð}üoïcülîLüuí6üŠì ü§ëüÐêþû êïûVéãûµèÞû$èÜû¥çÝû6çâûÔæîûæü=æü æ)üòåIüëåmüùå—üæÉü[æý¨æ<ý ç}ý†çÂýè þ´è[þpé¬þBêÿ+ë\ÿ,ì¸ÿBílît¨ïÖöð4Zò‘ÐóëZõBóö——øæCú4ùû|¸ý¾‚ÿøT+*TrÔ‰š—V š •À ‰lsS¡+ùyÀ¹{ã0øà÷‹á0²ÔbtïZ¬¤FÏãÿÞÿÓÿ­Àþggþþ„Ãýêzý69ýjþü‡Éü‘üˆzük`ü<MüÿDü´Bü\HüüVü’lü Œü© °ü. Üü° ý0Bý°{ý3¸ý·÷ý=9þÇÿþSþÅþâüÿxûWÿúÿÂøäÿs÷%.ödóô¢½óÝòkñNTðNï³Wîâoí —ì2ÉëVëtTê°é¨éÀ¢è×9èëçç¨ç{ç"cç/_ç<nçIçVÉçcèo‚è|銗é—Cê£ë°Ó뻹ìŲíÏÁîÙÞïâ ñèBòí†óñ×ôï6öí¤÷çùÝ‘úÐüÀzý¬éþ‘VrÆM7#£ôÀ[‡šJÆ â ¿ó sö #ë ÍÑsŸU¶ÿðRÿwìþçˆþC þ‹ºýÂQýâçüì€üãüȰû˜LûVìúú¦6ú6ãù¹”ù.Gù›ùýÀøV„ø¥ Nøì ø. ö÷k Õ÷¡ º÷Ö ¨÷ ›÷5–÷c—÷ ÷»±÷åÈ÷ç÷; øg8ø•løÇ§øÿÿéø9ÿ4ùwþƒùµýÚùòü9ú2üšúuûûÂúrûúæûqùaü×øáüBøhý°÷öý"÷…þœöÿ ö®ÿ¯õFJõßôô~«ômô¾<ô`ôÿó§õóHùóå ô3ôkô£µô-õ±wõ1 ïõ© uö ÷€ ¯÷Þ bø0 ùv ãù° ²úà Œû sü cý% Xþ# Qÿ Dù 3Ð ™ X ð Ù± ¾L šÞ eg åÁ\W Êà 3_ –Ï ô- Nv §§ ýà QÈ ¦¼ ú¡ Rp «1 Ý lÿx Ñþÿ <þx ¬ýä"ýB ü“#üÚ¬û>ûLÕú{tú¤úÊÊùìù >ù-ùNÿÆøqþ“ø˜ýdøÁü:øñûø%ûù÷`úà÷¥ùÊ÷ïø·÷Dø§÷Ÿ÷—÷÷Œ÷pö€÷çõy÷iõt÷÷ôs÷’ôu÷8ôw÷æó~÷œó‡÷Yó‘÷ óž÷òò®÷ÒòÄ÷¿òÞ÷¼òü÷Áò øÏòIøåòvøóªø*óãø_ó$ù ókùîó¸ùLôú¶ôjú+õÎúªõ7û6ö§ûÊöüi÷›üøýÐø¨ý–ù9þhúÍþFûeÿ/ü!ýŸþ=$ÿÛ0zE^ºyZ˜õ¼å"®> 0g ª† ™ ‡¢ é¤B ¡” —Ú ‚ ^B $` Ñt hy ìt `e ÂL ) Hû eà c€ I3 ÚÍzoù¦n5˾DBÃa@l¼g5T®2 $ È  ‘2 Ý‚$—ÿÁ ÿ[­þúÿ@þ˜þÖý7ýrýÛûý„ú¸ü1ùeüå÷ü¢öÍûgõˆû6ôJûóûïñáúÛðµúÓïúÚîpúðíWúíBúIì4úŠë,úÖê)ú/ê-ú˜é8úéIú¡è`úEè{úûç›úÁç¾ú—ççú~çûuçGû}çûœç¾ûÒçÿûèDü{è‹üïèÒüxéýêgý¿êµýëþWìRþ@í¥þ>îõþQïDÿvð’ÿ­ñßÿõò'Môl´õ¯'÷î¦ø*.úd½û›TýÊôþõK=ûY«nP€ê~ “ —‘ —‡ƒèt4aeL}3sNã½ G~²[85MþJä,Èò¬™’%w™\öD=0l‰“ˆüÿnòÿEäÿÕÿÎÆÿƒ¸ÿ1 «ÿ× žÿw ’ÿ †ÿ¬yÿCiÿÚWÿpCÿ -ÿ¨ÿIÿÿþóýäþ¡üËþUû°þú”þÑøxþš÷]þlö@þIõ$þ4ô þ.óðý/òÛý9ñÅýNð²ýnï¦ý™î›ýÕí–ý"í•ý‚ìšýðë¤ýjë³ýóêÉý‰êäý-êþãé2þ¯écþéœþ~éØþƒéÿ›écÿÅé²ÿêOê]²ê¹*ë¶ëzTìÝ íCÒí¨«î™ït™ðÕ©ñ4ÇòŽóóâ,õ1oözÁ÷½ ùöŒú*üUuýuêþZ™È™:­|^Œ6î@ É€ †³ 8Ø áî„÷í²ÎA˜ËGRàÔeUÒ×(Wg×ÿXÿšÚþŽ`þjçý4týçýƒü 8ü‚Úûæ‚û61ûvæú©¤úÎkúå8úó úö êùï Ëùá ³ùË ¢ù±—ù“”ùq™ùL¦ù'ºùÓùàðùÀú£ÿ1ú‰þWúpýú\ü®úLûâúDúûFùZûPø›ûb÷Üû|öüõ]üÅô üõóæü1ó,ý}òvý×ñÄý=ñþ°ðdþ-ð³þµïÿJïUÿíî¦ÿ¡î÷ÿiîHBî›-îí(î?4î’Oîäzî4¸îƒïÑiïÜïfcð®ûðò£ñ6^òs)ó­ôææô×õHÒör×÷˜êøº ú×4ûídüÿ–ý ÇþóÿK{ùªçÒÎó°Ž g ;ë Ë ÙŸ ¥b k-°î9«¯cgÐ¥†Ð8çëç›ÔK°ú{¥8Qâýÿ}§ÿRÿ…üþó §þU Qþ® üýü ¥ýC Pý úü¹ ¤üëPüüû@«ûf\ûŠ û¬ÂúÌyúí2úïù5°ù[tù‡ÿ?ù´þùãýâøý½øHü ø‚ûˆøÄúwø úoø\ùoø°øxø ø‹øf÷¨øÉöÎø2öù§õ<ù%õ~ù¯ôÉùAôúÛózú~óäú'óYûÝòØûò_ümòïüIò…ý2òþ)ò¹þ-òXÿ=òüÿ[òŸˆòIÅòøó§hóUÑóþJô¢Ñô?gõÖ öd¿öì{÷nBøæùVìù»Ôú Åûb Áü  ÃýÑ Åþõ Æÿ Å Ä Æ Éè ˾ Æ‹ ¹I žþv¨B H ß½ pg ø yˆ öý l^ á® Rí Á/15 &zìÊ ^ƒ ×ÿ+ Qÿ ÎþL RþÅ Ùý/ eý öüÞ Œü% (ücÉûšoûÉûóËú‚ú9?úXþùuÄù“ù²[ùÖÿ+ùúþù"þÜøOý»øü ø»û†øüúpøCú]ø”ùMøëøAøHø8ø¯÷3ø"÷3ø ö9ø)öCø¿õPø]õbøõzø±ô˜øjô¹ø0ôßøô ùâó?ùÏówùÈóµùÊóûùÔóGúêó™ú ôñú;ôOûwô³ûÀôüõŠüyõÿüåõxý\ö÷ýàöxþo÷üþ ø†ÿ¯ø_ù›ú)àú»²ûJüÜoýlVþùBÿ‚0"‰!ô%e%Ð5’üåç , Í m ª £ ~ Ï D ö ú  Ÿ0 5? ¾F 8A ¡1 ö 5ò aÆ w“ zX l JÑ‚Ä+bËëfbùɆb ’— ½ ŒÕ ß xßê×Xé,‹”fýÿ>eÿÍþéÿ6þ¾þ ý“ý ýiüzüCûêû!ú_ûù×úñ÷Súãö×ùÞõ_ùáôîøìó„øó!ø%òÇ÷Oñu÷ƒð,÷Åïìöï·öwîŒöæíiöcíRöëìGöìGö#ìRöÖëhöšë‰öoëµöVëéöOë'÷Vëp÷këÁ÷‘ëøÈëøìïølìdùÙìÜùZíYúëíÚúŒî`ûAïçûðoüÚðúüÀñ†ý·òþ¼ó›þÐô"ÿôõ§ÿ)÷$iøž·ù û‚iüëÏýO:ÿª¯ÿ,M®’/ϯ(3œ Z yw ’Þ ¤9°‹´Ëµù°§™ˆývÌb„K"3§cç™Ë´¯³•—{`dP¥>#-‹Ûõ6áEÊA·(¤ÍŠl>Wæ ?† " °ß<·ÇPeÙ8c ðÿÚ€þ¤ýn®û4Núùÿöø»ÿ¦÷|ÿ]ö<ÿõýþèó¾þ¾òþ¡ñGþ‘ð þïÖýœî¡ý·írýÝìGýì!ýSëý¦êçü êÔüéÄü é½ü¥è¾üMèÆüèÕüÕçëü´ç ý¦ç3ý¬ç^ýÆçýôçËý4è þˆèNþîè˜þiéçþ÷é9ÿ˜êÿKëãÿì;ëì’ÕíëÑîEÛïœõðòòELó”‹ôÝØõ"1÷a•øšÿùÍlûûÙü!Hþ?ºÿW.d¥ih„]èJC1” Ú è ¸F ƒfFsqº\l4ùëiH Í«;G’äÿÓ€ÿÿ´þMþèýß„ý¢!ýQÀüìaüuüì¬ûTVû®û÷·ú4núe+úŠìù¤´ùµ €ù¾ Sù¿ *ù» ù° ëø¤Öø”Éø‚ÁøoÃø\ÐøKâø;üø,ùEùÿsùþ¨ùýçùü-ú&û|ú=úÔú\ù4û€øœû¬÷üáö{ü öòügõlý»ôìýôoþó÷þó„ÿŒòò¥¿ñ9jñÎ&ñ^óðíÍð{¸ð±ð»ðÔð’üð 2ñ‚yññÐñW5ò·«ò0ó[Âó¢^ôßõ ºõ= yö] D÷v ø… øø‹ Úùˆ ¿ú{ ¦ûh üK }ý' mþü^ÿÉJ4QðÆÃyŽ(SÒ zº ZÂìeré¤Q B­ ßø {2 \ ¯w J‚ ä ~o P ±$ Jè ãÿ  xÿK ÿêŸþ2þÅý•Wýèü‹xüûüf”ûÏ!û3¬ú•9úöÅùUSù·äøtø|øäÿž÷Lÿ6÷·þÔö&þvö›ý öýÐõ‘ü‡õüGõœûõ*ûçô¾úËôWúÀôúùÍô¦ùòôZù6õù õÜø5ö­øëöŠøÃ÷qø¡ødøsù`øAúaøûhø½ûvøqüŠø!ý¦øÒýÈø‚þòø.ÿ&ùÔÿ`ùp ùèù•7úŒú¤éú*Mû²¹û>.üÉ­üW4ýãÅýi\þéúþcÿÖDBô§° rZ 8ª î Ë* “Z W{  Þ•   [ y Y ³ / R ú æ · o h ï  c ¨È 8¿a=–´¸#É‹Èî³O‹¯Mÿ v  ã1 Z® Ý kz Ç £ÿ =ÿ4 ÔþViþoüýý†(ý†ÆünüuüeÈûSsû@ÿû-þÍúýú ügúüúTúõùOúóøLúø÷=ú÷)úöú6õú\ô+úó\úÎòœúòÙúlñ ûÎð1û=ðPû»ïrûFïŸûãîØû‘îüMîgüî±üëíôüÌí1ý¹ígý¸íšýÊíÌýòíþ*î;þrî|þÇîÅþ(ïÿ’ïoÿðÍÿ‡ð0ñ•¼ññpòD6ó ôÑîô ×õ?Çöm½÷•ºø¶ÂùÏÔúáñûìýòGþ÷zÿû°üçþ!T…±Ú" ,( .K 1e 7t ?pN_`<r }Ê|{sh¬`(X’UèL%8L]æV­7n+¾ée§û]} î´IP‘çÿÅwÿéÿþþþ ¦ýü 7ýê ÍüÐ fü­ü‚œûQ2ûÂúãVú©úùp²ù8ƒùÿdùÓýHù¥ü(ùûù[úÚø=ùÁø%ø½ø÷ÖøöùõHù'ôŒùAóÎùfò ú•ñEúÐðˆúðÛúsïAûÚî¸ûOî;üÐíÂü`íJýûìËý¦ìCþcìºþ0ì2ÿì°ÿì4ì¾ìJ1ìÑaìP£ìÃ÷ì/[í‘Óíî[îJõïüWðP#ñžþñãéòäóGêôhüõ‚÷–=ø¦jù³¥ú¾êûÃ:ýÀþ¸èÿ¦>Ž‘màB+tÚ¸£÷n1 9b Š ¿£ r«¡µRJñ–¨<>ÝÄw5ŠÑõ“ÿÿÿó¤þÐ3þ˜ÃýLPýïÜü~iüùøû_‰û±ûñ¼ú^ú=úP¹ùX uùU ;ùL ù< àø$ ¶øøâmø¸Zø‹\ø^vø/¡øÓøÝÿÿø»þ%ùŸýGùˆüqùwû°ùlúúgùwúiøôús÷mû†öØû¤õ5üÌôŠüÿóàü?ó?ýò²ýìñ1þTñµþÇð8ÿFð²ÿÐïdïuïǾî€îgUîº8î*îf)î´5îùPî4yîd³î‹ûî«UïÇ¿ïã5ð»ðOñ8òñR¤òbcóm.ôtõvæõwÑö{Æ÷}ÉøÕù…èú‹ü’ý—=þ™\ÿ™{•ŸŒÃƒç|w t2n;_; G2 $ úÿ ÑÔ ¨œ |WI›Å!q•ô²AN~å°|Ï Þ—ÿÚÿ¿‘þþJuýòæü[ü Ôû¦Rû!Óú‘Zúó åùD wù‡ ù½ ­øé Oø ô÷0 ¡÷Q`÷n7÷‹)÷¡5÷³M÷Áe÷Êx÷Ò†÷Ý¡÷ëÿÕ÷ýþ(øþžø3ý)ùUü»ùxûFúŸúÈúÈùDûõøÄû+øVüj÷ýü³öµý öwþkõ9ÿÔôõÿFô¤½óI>óéÉòˆ_ò&òżñbñüRñŽ2ñññý"ñ]6ñ²ZñýŒñAÎñ~ò³òãôò tó ô* ›ô* @õ! ìõ £öùf÷ß6ø½ù˜óùmÜú=Çû³üÉ¡ý„Žþ9€ÿèp—bJOþ6°[ìü»“}"5°ä@†Õ j¥ ü! ‡Œ è „2 úÿj pÿ“ âþª Tþµ Éý³ =ý¢ °ü‚ #üU ”û ûÍ súv äù Yù¤ Òø. Qø¯Õ÷)`÷öö ’öv<öÜíõ= õžUõýõYÖô³¯ô£ôn¯ôÐÊô8äô¨ÿúôÿ õ’þ!õ þNõŠý˜õ ýöŒüöüþö¨ûs÷EûÝ÷êúAø–ú­øMú,ùúÀùÇùiúŠùûUùÁû$ùdüøøüüÖøŽý¾øþ°ø³þ®øNÿ³øíÿ¿øÒø5çøÔùk&ùøRù|ŠùøÏùpúærúbÐúÞ4ûZûÕüI‡ü¯ý‘ýe!þ³¸þ UÿL ÷ÿš ›è D2 ñx ›¹ Cï ë ”9 <R äc ‰s +„ à P‘ Ó… J i ¹ ;   u À Ä z  . 7 Ö ^ r u üz wn ãP E$ Ÿç òš <A ~Û ºe îâSD´fˆÿP§þÈýÃíüóüFû=yú[·ùuýøÿQø¤þ±÷·ý÷Ìü†öâûüõúúõúõ9ùØôaø°ô‘÷›ôÆöŠôöyôKõfôô^ô÷óoô[ó¥ôÍòþôIòpõÐñåõfñRö ñ¶ö·ð÷rð|÷9ðö÷ð†øòï(ùæïÏùëïsúþïûðŸûGð(ü|ð®ü½ð6ý ñ½ýjñBþÙñÂþZòBÿêò¸ÿ‡ó$0ô†ãôâŸõ1döy3÷¼ øûñø5äùmæúŸóûÊ ýð(þFÿ)c@W lÆò•$¬YÁ‹Ö· éÚ ûñ þ 1Kùeæ~Ç‘šŸZ¨­³!½ÇêÍ4ÍmÀ•¦§ƒŸX-Dþð͇— \~áÍ2wu¤´ÁJÍßÈu¶ — «ÿo Eÿ? àþ |þÑþ‘¾ýLeý ý´¶üg_üüÎþÕû…ý®û@ü ûûœûÇù–û“ø‡ûf÷rû?ö_û!õaû ôûó»ûò ü ñWü&ð›üIïÔüxîý´í@ýüìŠýTìèý·ëRþ+ë¿þ²ê(ÿGêÿêéèÿœé?^é•.éìéDé›éò$éHPéšéæÛé,;êj­ê 0ëÒÅënì-(íUóí|Ñスð×Éñêâòùô8õ uö½÷ùpúÓû:ý£þ óuÜßÁN¥½Š'mˆKÝ % æ^ §‹ bª¿ËÉ~Â'ªÄW;âÞfgåÿÚ`ÿ6Øþ€Lþ¶ºýÙ&ýæüÛòû¹Wû~»ú,"úÄŠùHõø½hø$ã÷zd÷Áîöúö"ö<ËõI†õKQõF &õ< õ+ æô Ùô äôä õÃJõŸõyúõVSö5­ö÷ƒ÷õþøéýÂøàü€ùÝû>úàúóúéùžûøøHüøöü7÷³ýeö}þŸõLÿäô5ôבó÷ò;hòÝãñzlññ©£ð7Uð¿ðBéï¸Æï!³ï~­ïÍ´ïÈïIìï|!ð­cð×´ðýñ „ñ8 òH ŠòP óS ¾óO gôH õ? Úõ8 ¥ö1 y÷* Vø" ;ù ú ûìðûÒÚüºÈý¡¸þЍÿq•Q}(bõ>½ƒÛDV¼j¬ H£Ø/Y ³Ì 01 §ˆ Ð { Ù3 .R }a Æÿe ÿ] FþJ €ý* ¸üý ïûÄ +û| gú( ¦ùÇ èøa -øô{÷ƒÑö 6ö“©õ$õŒ¥ôþ/ôiÇóÐró47ó™ó ókó×óD ó°óFó‹ÿóõþóóeþkôØýçôSýcõÓüßõWü_öáûëönû‹÷þú9øúõø(ú°ùÈùjúpù#û#ùÖûÝøŠü ø=ýiøóý5ø©þø]ÿã÷ Ê÷¹¸÷`µ÷þ¾÷•Ò÷"ñ÷©ø)Gø¥~ø¿ø ù÷cù[Æù·6ú ²úX6ûžÀûÞPüæüNý€&þ®ÓþØ„ÿû9 ï) ¥6 Y? F ½K mI > Ä* g Û–«x–@ k ¼Ä i T œ‡ $­ §à $È š½ ¤ v| ÛI < ˜º ña Eû™ÿ‡êþ 8þ‹ýîâüS>ü±¡û  û\zú«öù÷{ù> ù„­øÉSøøVÿ³÷žþs÷èýF÷8ý1÷‹ü6÷áûJ÷=ûg÷žúƒ÷ú ÷lùÅ÷àøú÷]øGøã÷©øt÷ù÷Šù®ö÷ùTöbúþõÊú±õ8ûlõ®û0õ,üõ®üÜô-ýÄôªý¸ô#þ²ô–þ´ôÿ¼ôpÿÇô×ÿÞô8úô“#õë\õ? õïõÝGö$§öe ÷¢v÷Ùë÷ hø=ñøj…ù–"úÃËúî{û.üEçüp¤ý—eþÀ-ÿêúÿÎ@©m‡™cÄ;ë Ü?§hr’;µ ÑÄ âz ê& ìà ìQ éÒ ßF ˯ ©x^5¤çÖŽö*¾ýIçÈÀ<‰¤Eò X‘ ¥ íÿž /ÿ nþr ¨ýÈ åü "üP cû†¦ú´ëùÜ9ùýŽøð÷-`÷>ÞöLföXøõe–õqÿAõþþô“ý×ô§üÉô¿ûÏôÛúâôÿùýô'ù!õTøQõ÷”õÍöïõödöhõçöÄôs÷,ôøŸó–øó,ù¡òÊù6òrú×ñ$û‚ñÙû:ñ‘üñIýÔðýýµð®þ£ðZÿ¡ð­ð¢Æð?ìðÙ ñm`ñþ¬ñ‡ òsò€ìòìtóM ô§®ôù^õCöˆàöʯ÷ˆø>jùpVú›Mû½NüÛVýòeþuÿŠ*¡8·@ÌDÞEíCûB@ 9 +ü ç óÄ Ì“ ¢TuG¦8Ò¼‰.4‹ÔØm2ŽA>’' ýz¿ânE ¤” [ÿrµþÍ þdýW ½üŠ ü¯ |ûÈ áú× MúÝ¿ùÝ9ùÕ¿øÌSø½ô÷¬Ÿ÷›R÷ˆ ÷uÐödÿ¤öSþŽöEýö<üö8û¹ö:úÚöDùþöSø*÷i÷a÷ˆö¨÷¯õøàônøôÞø\óOù«òÀùò/úgñŸúÖðûRðûÚïülïü ïý¶îŽýmîþ2î~þîïþëí\ÿÛíÃÿÙí#åíƒþíã&î=\î–£îêûî8bïƒÖïÈYðëðDŠñ6ò»óòõ¾ó/˜ôi}õ¡oö×k÷ qø?€ùr•ú¥·ûÕáüþ1Kÿ[ƒ„¼­ôÕ(û[+¼4è1 (. C H öAÔ)¢bÈ€¸,RÈâPiÉå-YxÁ®ËuÕÄÊ®Xÿ›þ@ßýï!ýŠcü¨û‰ñúí?úA”ù†ñø¿[øíÓ÷\÷* õö8 Ÿö< Vö9 ö/ ãõ¼õ©õü­õæÎõÏö·NöŸ¢ö†ýöoÿ]÷[þÉ÷JýFø@ü×ø=ûzù@ú%úHùÕúVø‡ûj÷4ü„öãü§õ‘ýÔôCþ ôøþLó«ÿšò\óñ Sñ²ÂðP>ðæÇïr[ïõýîp­îâkîN6î°î üí_øí¨îèîDîK{îsÁî‘ï¬{ïÃòï×vðå ñïªñöWòùóúÑóùžôùyõó\öéK÷ÞAøÑ=ùÄ<ú¸<û«>üœCý…JþfQÿ?X]æ]¶V€HD/ý«æK³äxu2 ýà € ú k’ Ò 0k ƒÂ Ðÿ ÿI [þx šýš Úüª ü¬ WûŸ ”ú„ Òù] ù- Xøõ ¡÷² òög Nö µõ± )õE ®ôÏ BôR àóÏ ‰óH ;óÁùò9Èò®¯ò±òˆÊòðóòQ%ó°[ó—ósßó×:ô>®ô¨6õËõ{eöèÿ÷Tÿœ÷Áþ8ø3þÖø©ýù%ý2ú¦üéú)ü£û²û`ü=ûýÍúÌýeúzþú&ÿ°ùÌÿbùoùÙøºø^iøÿ@øœ ø3 øÁøH øÈøD/ø¿Oø9xø³¬ø,êø¡6ù ‹ù~ éùã QúB Áúœ 7ûð ´û? ;üˆ ÇüÍ Yý îýO „þˆ ÿ¸ ±ÿÜ Gñ ßö xó å ¡Ï ,° °‡ )N š ¨ d9 »¼ 6 N  … ­WÈŸÔÜÖ É2±NŽb`s&€àŒ™ÿ3§þ̶ýZÈüäÞûfúúâúYIùÍø=È÷¨÷‡ö}ÿöäþŠõLþõ¶ý¾ô"ýjô“ü)ôüô€ûöóýúô€úô úCô›ùhô2ù”ôÏøËôuøõ#øvõÖ÷êõ÷jöT÷ëö#÷h÷øöß÷ØöQøÄöÉø¹öGù³öÌù³öTúºöÜúÇöbûÜöàûùöXü%÷ÈüZ÷0ýš÷”ýâ÷óý1øNþ…øªþÝøÿ9ùYÿžù­ÿ úüÿ†úD ûˆ•ûÇ*üÃüE`ý„þŪþXÿM ”ÆÛ…#Gl µÏ—Jb“.áû1щÕI # j³ ªa ã ­ JH xÙ ž[¼ÏÎ4ÑŒÉÖ´“Bhd2tðu¡bF>Û eÅæn[ É—2—„ öå S: © ÿÿ¸ Sÿé ¥þ úý'Uý:¶üG"üM—ûOûKªúBGú9íù.˜ù"ÿKùþù ýÓøü¹øû¹øúÐøùòøøù÷?ù4öfùRõ—ùwôÜù¨ó:úßò«ú ò#ûlñœûÃðü$ð|ü’ïçü ïUý‘îÌý#îJþÂíÊþoíLÿ)íÈÿïì=Â쬤ì–ìw–ìÕ¦ì-ÆìƒõìØ5í'íuÝí½IîýÅî9Rïlìïš—ðÅMñíòêò=ÎócÁô…Ãõ¦ÏöÄã÷ßþøöú Gûxü)³ý6õþD=P‰YÔ[VXH’1Çúõ) ÒP ¨p t‚ 5„éuW-*ÁìMÑ=OÊÅC2¦—òõÿ,IÿP—þ^ßý['ýAnü·ûÒû}Xú­ùšù bøpÇ÷Æ3÷ªöH+öw»õšYõ± õ¾ Îô ¤ô †ôº nô­aôœaôŠuôu¤ô`íôHKõ2´õö öþþèöóý\÷ìüä÷êû‚øîú/ùøùâùùú ø2û>÷Ïûdögü”õýÎô¦ýôLþZóôþ²ò˜ÿò3~ñÆóðSvðÕðSŸïÊFï>ýî°Ãî”î‹tîõaîZ]î·hîƒî^­îªèîõ2ï>ïŠõïØnð&öðs‹ñ¿0ò âòN  ó kôÊ @õ "ö< ÷u ø® ùä ú û= ,ü\ >ýn Rþx hÿy ƒt ›f ³I Ç" Ðê Т ÆL µæ Ÿt  ôU d ÉÚ "ƒ m ¨œ ÚtË-;NExNÿŽUþ’[ýcü_jû+vúé‰ùœ¥øBÉ÷Þ úöm 7öð „õg ãôÒ Uô2 ×ó‰ góÙ ó" ªòedò¥8òâ'ò6òOXò„…òµ´òæåò#óHrózÝó±ÿaôéþöô$þ’õcý(ö¦ü¹öíûH÷8ûØ÷Šúqøàùù=ùÀù øoú øû~÷Åûøöhü|öýö˜ýœõ)þ9õ·þáôAÿ’ôËÿOôRô×ëóYËó×µóM«ó¾¯ó*½ó’Úóùô_:ôÃ}ô(Ìô‹(õëõIö¢ƒöø÷J¢÷˜?øèæø5˜ù‚RúÍû ÚûN ¥ü rý« @þÎ ÿé âÿÿ µ ‰ ] -ÿ õß ¶° nu / ÉÞl‚—§ '” ›ý Z b© ¶ê  KH d Òr w Uj –ÿQ Öþ/ þÿ VýÄ žü€ íû1 Cû× £úu ú ‰ùœù%«ø©Pø*ü÷¦¬÷e÷’-÷þ ÷i÷Ï÷6+÷ŸJ÷ f÷vƒ÷ã§÷QÜ÷¿ÿ&ø,ÿ‚ø˜þçøþKùvýªùéüúaüXúÞû®úaû ûæúqûnúÝûùùHü‡ù±üùý°øtýMøÐýð÷'þ›÷þJ÷Óþ÷)ÿÀö€ÿ‡ö×ÿUö//ö…öÛöõ1èõ„âõÙçõ.øõ…öÞ>ö:sö™³öøüöZQ÷¼²÷ø|’øÙù6›ù“,úòÊúPoû¨üúÒüD‰ý„Dþ»ÿì¾ÿ }9 @O Z ÊS Œ= E ÷梥CUÞúqúyîúU Z­ ¬÷ ô2 2` i š Æ• óÿŠ ÿs DþN lý —üÜ Æû ûú8 ;úÔ‚ùgÓøò0ørš÷í÷` öÌ=ö4çõ™õú]õV,õ³õ  õg õÂKõƒõÿ½õáþöõEþ5ö¯ýöýÛö‹üO÷üÓ÷|û]øýúèø†úkùúæù©ù`úCùÛúäø\ûŒøäû;ømüð÷öü°÷{ýy÷øýK÷pþ%÷ßþ÷Gÿîö¬ÿÜö ÑölÌöÌÕö-èöŠ÷æ0÷=e÷ ÷Þâ÷)*ør|ø½×ø <ùX­ù«)úÿ°úU?û§×û÷uüDýŽÁýÜnþ+!ÿ{ÛÿÈš_X&”ðʸüz* ;O ùo µƒ m‹ "† Òt v W  . ž ø ¸• kÿ ^ §° 3ó ³' (J ‘\ ñ^ HP ™2 å +Æ p{ ± òÿ¶ 3ÿ@ tþ» ¸ý* ýŒ Püâ§û.ûroú®âùàeùöø9‘ø\8ø}ç÷™¡÷´e÷Òÿ=÷ìþ+÷þ-÷'ý>÷HüW÷lûq÷•ú÷Áù®÷óøÜ÷,øøi÷jø¯öÆøýõ(ùQõ…ù°ôÝùô1ú„óƒúúòÛú{ò7ûòœûñü;ñeüçðÆüžð"ý^ðxý*ðËýðþæïjþÖïºþÑï ÿÙï[ÿðï¬ÿðûÿCðGƒð“ÐðÜ+ñ$“ñm ò¹òóW¿ó©nôý,õQôõ£Êöò©÷?˜ø‹ùØ’ú(¡ûy·üÉ×ýýþR%ŒS»„äµ æ(@FNvN¢ BÉ (è ù Ïû ïF×ñ³#A©ñ&‘™Œaè».aa~²ÿˆÿUþ_¦ý,úüåUü‰²ûû–‡úþù\ù§ùá®ø[ø/øDç÷N Ä÷O ¬÷F ¡÷6 Ÿ÷! ¬÷Ë÷éý÷ÇCø£–øíøZHù6¦ù úòþuúÓýïú¹üuû¤ûü‘úŒü„ùýøý÷þ…ö~þ’õóþ¨ôjÿÇóâÿîòVòÄWñ.›ðèïç@ï9¤î‡îÐ’ííY¯ìšSìÚìÀëMëƒqë·_ëç^ënëHŽëz½ë­ûëãMì²ìS'퇮í¹Eîìîî¦ïRnð‡Cñ½'òìóô9'õUAöme÷‘øŒÂùøú2ü}pý]´þ2ùÿú=·k¿ùª)6Sµs'Œ ‹˜ å— 4‹ xp ¶Fí ÃMÿgvþøýuÅüßíû6û|Dú°vùÔ¯øèó÷êA÷Ú™ö¸þõƒrõ>òôéƒô„#ôÓó˜ó[ó€5óäó=ó‹ 2óÑ Xó ŽóG Ëóy ô¨ YôѪôù õ{õ<÷õZöw ÷•–÷±øÎ¦øï/ù»ù3ÿMúUþáú}ýxû¨üü×û£ü û3ýCú¾ý‚ùGþÈøÎþøSÿi÷ÙÿÅö])öä˜õlõòôvôù´óy[óù óvÍòô›òruòó]òtRòôWòskòîŽòiÂòàóS UóÉ ²ó7 ôŸ “ô õY ¢õ© @öñ èö1 œ÷l Uøœ ù¿ ÙùÕ ¡úÜ nûÒ >ü¹ ý” ëý` Áþ ”ÿÏ `q ' é‰ ¤ Yj Ç©C`Ó UØÊ 38Žb܇®PÔwþÿ’+ÿŸZþŸý•Îü~üXdû+¿úó&ú³–ùiù øÃ8øfÛ÷Œ÷™F÷+ ÷ºäöEÉöоö\½öçÃösÍöþÙö‡ëö÷™/÷#a÷²ÿ˜÷CÿÏ÷Øþørþ6øþeø®ý”øOýÇøðüù“ü9ù:ütùåû¯ù“ûæùHûúûMú¿úúú±úHúçúú!ûáù]û´ùžûŒùáûlù'üQùoü>ù¹ü2ùý.ùWý4ù°ýAùþUùuþsùáþ˜ùRÿÇùÆÿþù;Aú³ú.åú­Eû0°û¶%ü>ŸüÁ!ýCªý¿=þ8×þ®{ÿ"ŠÎë€C0àÑ’C,÷I¨ZX\Q£5< Ë×S ’Ò CD è­ ƒ Z ™™ Ì ï  n Úû Câ ¯¸  ; è zÿ† ùþ }þœ þ Ÿý‚>ýæéüA ü”eüà6ü&üeöû¢áûÙÖûÕûCáûvûû«ÿüáþHüþtüOý üüÍüÍûýû<ýYú}ý§ùÂýþøþYøAþ»÷wþ%÷¨þ”öØþ öÿŽõ7ÿõeÿ§ô’ÿBô¹ÿåóÚÿóõÿBó þòÄò3‘òEjòVPòh?òx9ò‰?ò›Nò®còÀ„òÔ±òêçò+ó!|óAÛógGô޼ôµ>õâÉõ]öAýöuª÷¬cøä'ùõùJÏúz±û¨™üÓ‹ý„þ&€ÿIc‚r…x‡uˆiŠT‹8‰äs «[ f5  ¼Ê V„ ê/xÐýb~ãýÿQwÿ¯íþùbþ1ÖýWJýkÂüo>ü_½û>Bû ÏúÉdúuú¨ù[ùùˆÝøé °ø> øˆ }øÄ yøù ø% øH £ødÂø{ìø&ù›kù¦ºù® ú·]ú¾®úÅûÒÿWûÞþ¸ûîýüý„üüìü3ûMýTú¤ý{ùöý¨øEþÜ÷–þ÷çþ\ö5ÿ¨õƒÿüôÎÿYô¾óR-óޤòÈ%ò²ñ5Kñnïð§œðáWðð\ðï›ÏïÚ»ï´ï^¼ï¤Ñïê÷ï4*ð„mðÔ¿ð$ñxñÏò'”ò~1óÕÞó'—ôs^õ¹/öû ÷9ð÷râø¦áùÓìúôþû ý 7þ VÿúrÜ‘°³zÓ6óã„.>œE B „0 ê Fç ›¬ éc2 w¢¹'úÿš=ÿù€þDÇý{ý›gü§ÀûŸ#ûƒŽúUúˆùÆùf±øóYøq øàÕ÷>«÷Ž Ž÷Ò ~÷ v÷: v÷c ÷ƒ ™÷žÂ÷³û÷Â;øÎ~ø×ÁøÝùáFùçŽùïßùúÿ8úÿ’úþêú,ý<ûEü‰ûaûÎûƒúüªùSü×ø–ü øØüH÷ýöVýÜõý2õÆýôøý÷ó*þgóZþàòŠþcò½þðñðþ‰ñ(ÿ*ñ_ÿÚðšÿ•ðÚÿ[ð-ð[ ð£øïïðï?÷ï’ ðè-ðC^ð¢œðéðjDñЮñ8'ò ¯òEócèó¿šôUõpöÁðö Ò÷PÀøˆ¶ù´¸úÖÁûëËüõÚýõìþèͦ9rW/pà…„•ž¬ž1— ®† $k ”E þ bË Ãx"ƒžèÿNÿ„»þÝ,þ&¢ý]ý€§ü‘5üŽÍûwlûOûÌúÍúxcúDú 1ú"%ú•úù úQ úž 0úá Nú xúS «ú‚ Üú¬ ûÒ8ûôdû”û*ÍûB üWFül€ü²ü™ßü²ÿýÏþ+ýïýSýýxý6üŸý_ûÅýúèý¼ù þòø)þ.øGþp÷eþ¸ö„þ ö¥þdõÊþÈôôþ2ô"ÿ¥óTÿ#ó‹ÿ§òÄÿ4òÎñBrñ‹#ñÙàð+¬ð„…ðàmð@að¥cðrð{ðç»ðQõð¹>ñ—ñÿñâyò>ýò–óç.ô/ØôkõœSöÁ!÷Ùú÷çÙøè¿ùݬúÅžûŸ•ül‘ý)þÙŽÿ|‡€ s"aK1| ãáDª£g [» »ÿO ÿÕ ƒþN ïý· aý Üü` _üœ êûÉ ûæ ûó Äúò vúâ 5úÄ úœ Üùd Åù ·ùÓ ®ùy ©ù «ù¬ ³ù8 Éù¾ ëù; ú³Eú&qú—˜ú½úkáúÓû96ûŸgû˜ûlÂûÕåû;ü£ü )üv:üèÿNüZÿcüÒþvüOþŠüÍýšüPýªüÕü¸ü\üÇüæûÖürûèüûýŸú ý>úGýäùtýŽù¨ý@ùáý÷ø"þ³øgþwø³þ?øÿø\ÿè÷¼ÿÅ÷!¯÷¢÷ž÷„¥÷µ÷†Î÷ñ÷†øRø’øùÜøt2ùéùXùù½lúçúlmû±ùûëŽü'ý;ÂýQeþX ÿS´ÿA_ ñÀ¶pnÁ½aVüèsø£wòkøâS\ ÖàV Ø6 aK ðÿS ‡ÿL &ÿ5 Êþ xþß,þ£êýW´ýþ‰ýšký+Wý±Fý,;ýž2ý-ýk0ýÉ<ý"TývqýÈŽý¥ýe¶ý´ÿÁýÿËýPþ×ý ýèýôüøýMüþ«ûþ û þuúþâùñýWùÜýÒøÅýSø­ýÜ÷”ýn÷{ý÷bý«öGýXö)ý ö ýÈõëüŽõÍü^õ²ü8õüõüõ‡üõô…üòô‹üöô˜üõªüõÄü>õãüjõ ý¡õ7ýàõlý)öªýyöðýÒö=þ4÷“þ ÷éþøBÿ–ø™ÿ ùôÿµùMSú§÷ú¥û]Xü²ýÓýJšþŠiÿÃ>óû:ÞOÃX¦W‰Kj4K*ç ²à u± 1} è= šô F  íA’Ö5\ÙÿÔ~ÿ>$ÿ˜Ðþàþ9þ@ùýWÀýZŽýKfý,Fý÷0ý±!ý[ýò"ýz6ýðUýX€ý² ³ýþ ëý; %þm _þ” žþ± âþÄ0ÿІÿÕÝÿÓ/Í{ÅÀºþ«7žp“ÿ«ˆþâ}ýwü9vûUxúe€ùløm¥÷iÁöcçõZõMJô=‹ó'Ôò (òó…ñÔíð¶_ð™Þïiïnÿî]£îTQîO îNÒíS¥í\†íisí~ní˜ví¸Žíß³íåíD'îzxî±ÖîèBï¼ïTEð‹ÛðÁñö4ò&öòQÆór¡ôŠ‹õšö ~÷œ†ø™ùx´úWÔû(üüî+þª_ÿY“ýÍ– &A­w.¨©Ò ö’ÿ ÿ* nþ8 Ûý; Gý2µü'üï û²ûe¦ú8ú’Óù wùx'ùÎãø©ø>yøUVøYAøE:øAøáUø’uø1œø¼Çø;úø¨4ùxùSÅù”úÉtúð Îú #û% sû3 Âû< ü@ \üA­ü<þü7Jý.ý%Ìýþ.þXþ‚þÿªþþÐþ'ýôþ:üÿRû9ÿoúUÿ”ùrÿÀøÿô÷«ÿ/÷ËÿtöîÿÂõõEzôzåó¶XóöÖò:_ò‚òñÏñ:ñuïðÒ°ð6~ð Wð <ð}.ðë,ðX8ðÃQð,xð”«ðøìðX;ñ²˜ñòLwòŠùò¾ˆóæ$ô Ìô €õ @ö ÷÷Û÷еøž•ù^|úkû¶`üPYýàUþhSÿçO_HÏA:6 'j÷ÌÖ2«œx 9 ÿí øþ• {þ- þ· •ý2 /ýž Òüù ~üG 6ü„ øû² ÇûÒ ¡ûà „ûß nûË _û§ Tût Nû1 Oûâ Wûˆ eû" |û± –û6 ­û² Áû! Îû‡ Øûæàû=ëûúûÛü%ümü´ üúÿû?íûƒÙûÇÄû ®ûQ›û›ÿˆûçþsû7þ`ûŒýKûåü8ûEü'û¨ûûûû‚úûöùûqù*ûòøCûzøfû øû ÷Áû@÷øûæö8ü—öüOöÓüö/ýÚõ–ý­õþ‰õwþmõîþ]õhÿUõäÿWõ_eõß~õb¢õâÐõb öÛMöNö½õö!W÷}Å÷Ñ=ø¿øZLùãù¹€ú×'ûéÒûîƒüå:ýÑõý°¹þˆ€ÿUGØÝŽ£?hé(Žæ3ÓQv¤À?lÐV ÔÎ ‘; R› ì ëÿ1 Áÿh  ÿ‘ ‰ÿ« zÿ· wÿ´ yÿ¡ …ÿ€ –ÿP «ÿ ÁÿÉ Ûÿt øÿ ¦ <. d¯%°’ÎùåZõµ  cµT ¡÷ñ×@±–ÿ…íþUGþ$¥ýòÿý»ÿoüƒÿÛûHÿKû ÿÂúÍþ=úŽþ¿ùTþIùþÚøêýsøÀýøœý¹÷~ýg÷jý÷[ýÕöSý•öSý]öYý+öjýö„ýâõ¨ýÉõÖý¹õ þ²õFþ²õƒþ¹õÆþÈõ ÿÝõWÿüõ¥ÿ!öõÿPöFŠö•Íöâ÷)p÷lÍ÷ª4øä¢øù@˜ùb ú}¯úŒIû’êûü;ýkíýJ£þ _ÿï·ßx¤4iê+œíJ¬øÿh¥ÿ RÿÕÿƒ±þ+hþÉ"þ] äýè ªýf xý× Ný= +ý• ýß ý øüM üün ý~ ý~ 6ýo ZýR „ý$ ²ýè æýž þE Xþá •þo Öþò ÿj _ÿÕ¢ÿ8Üÿ“ç<2fy޼´ùÖ4ñm§ á [ÿðœþÞàýÈ)ý¯wü’Êûs#ûQ‚ú,ëù[ùâÿÓø¼ÿSø˜ÿÝ÷zÿn÷aÿ ÷Oÿ¯öCÿ^ö?ÿö>ÿ×õCÿ¢õMÿvõ]ÿSõwÿ9õ˜ÿ*õÁÿ$õòÿ&õ(3õdIõ£jõæ“õ,Æõsö¿Bö öQàö—=÷Ù¤÷øPŠøƒ ù±‘ù×úô³úPûòû›üJýòýýÔµþ®oÿ}-Cï³¶yg@µÊVŠõE’ü.­ÍÿYmÿþÿœ µþ1 cþ¼ þ> Ðý± “ý [ýp -ý» ý÷ íü& ÛüE ÖüU ÚüV çüG ûü+ ýþ =ý hýv ˜ý Îý° þ7 Bþ± €þ Ãþ‚ ÿÛIÿ*…ÿq¼ÿ¯ìÿäA>hc…ª¦¾ÆÉæÿÊÿÂ-þ´Sý¤~ü«ûuÞúYú8Tùšøïÿé÷Æÿ@÷ÿ ösÿöKÿ{õ(ÿöô ÿ{ôïþ ôÚþ¦óÌþKóÀþùò¹þ´ò¸þzò¿þIòÏþ#òæþ òÿúñ*ÿõñUÿüñƒÿò´ÿ-òéÿUò#‡ò`ÄòŸ óá]ó ¹ó`#ôš˜ôÒõ¡õ44ö\Ñö~v÷™$ø¬Ýø¶žù¹jú²?û¡ü‰þühäý<Ñþ ÀÿбªH§ü¦¬¥X¢›¬ÿ‘Uÿ‚ýþl ¦þP Tþ/ þ ÂýÔ ý˜ GýOý÷çü‘Áü¦ü•–üýŽüV‘ü žüÕ²üûÏüõü#ýùWýÑ’ý—ÎýKþìSþ}™þüåþl2ÿÍ~ÿ Æÿg œ DÇ |é ²þ å @c{‹•þ˜õ˜ê’ãÿˆÞþ{ÞýiàüTéû;ùú ú,ùéOøÍ{÷¶²ö¡ñõ’;õ…‘ô}ñóyZóyÏò|Oòˆ×ñœlñ³ ñÔ·ðønð!1ðOð}Üï²Äïè¶ï!³ï]»ï™ÏïÓìï ð>Oðn‘ð™âð¿>ñà¥ñûò òó¨óDôþëôãŸõ¿[ö÷Zê÷¾øÕ›ù†}ú1gûÕZüsNýEþ¥@ÿ:;Òÿ6gÿ1ýþ-”þ'0þÑývýý ýãÒüÁŠü• Jü` ü éûÓ Çû} ­û û§ ”û&‘û•˜ûöªûFÄû…äûµüÕ/üä[üâŠüѾü°öü}.ý;býí”ýÁý#êý¬ þ, 8þž \þ }þb ˜þ· ªþ ´þK ¸þ·þÊ´þ­þ;¢þq–þ¥…þØsþ ^þ@Iþw5þ¯ þíÿ þ/ÿÿýtþôý¾ýñýýòýdüúý¿ûþ!ûþ‰ú2þ÷ùOþnùvþëø¤þrøÜþøÿ–÷cÿ4÷­ÿÚöüÿˆöN>ö§þõÅõa–õÂrõ#TõƒAõá7õ<5õ”>õèQõ5nõ~“õÀÀõ÷øõ'7öO‚ökØö6÷ˆ÷ˆ ø~ƒøjùN„ù*úû¡úÆ<ûˆÜûFüþ&ý±Ïýbzþ$ÿ½Ðÿkz$ÊÍ|t1쵩LmÚ9b áèÿTÈÿ¿®ÿ"™ÿxŒÿňÿ‰ÿ9’ÿa ÿ{¯ÿ‰¿ÿˆÒÿ}èÿdÿÿ@5ÖM“`Eníw|$~³~;y¾m=Y·=0¨îÿ¿ÿ’ŠÿRÿ}ÿôÿ×þoÿ”þëþOþmþþóý¿ýýxýý1ý¥üìü@ü«üàûpü‡û:ü4û üèúãû¦ú¿ûjú¢û6úŒûú~ûßùyû¾ù~û¡ùŽû‹ù¥û~ùÃûtùçûrùüwùCüƒùyü•ù¶ü©ùùüÇù@ýçù‰ý úÕý8úþhúhþ ú°þßú÷þ"û<ÿkû}ÿ¸û»ÿ üóÿ^ü$ºüRýzýšîýµaþÇØþÓRÿÚÏÿÛNÕÑËY¾ãªp“ÿz_!B¯&< ÉöÿPâÿÖÐÿWÁÿÓµÿK®ÿ»­ÿ# ´ÿƒ ÂÿØ Õÿ& ïÿg 0É ]ç ú Ëÿ ø Lâ Ž¾ Ñ O Z ¢¨ ìC 4ÏyQ¸Çí3“Fëk<Š„£Æ´¼:·pª¡“ÔÿtÿM5þ!hýîü´Öûuû/Wúæ ùšðøKGøø§÷§÷U€öûõ¸‚õpõ-°ôîÿWô³ÿ ôzÿÆóHÿŽóÿ_ó÷þ=óÝþ&óÉþó»þó³þ'ó°þ<ó²þ[ó¹þ„óÄþ·óÕþóóêþ8ôÿˆôÿßô2ÿ>õKÿ¦õcÿöyÿ‘öŽÿ÷žÿ˜÷¬ÿ&ø¶ÿ»ø¼ÿTù»ÿõùµÿžúªÿKû™ÿÿû€ÿ·übÿsý@ÿ1þÿòþìþ·ÿºþ~†þIMþþåÕý³—ý~YýGýâüÓ«ü“xüQHü ü» ÷ûg Øû Áû¥ ³û3 ­û¹ ¯û2 ¹û  ÊûãûUüŸ/üÚdü¢ü ãü-)ý*sý¿ýóþÂfþ‚Àþ3ÿÖ vÿk Îÿñ j jÕ µ3 ûŠ @Ó € ºMë©4ÐJñ[d*hBg[`tQ’ÿ=°þ$Ðýöüé!üÇRû¥‰úÅù_ ù>Xø °÷÷íwöØëõÇfõ¸îô¯~ô«ô±Âó»tóË0óáöòüÈò¥ò8‹ò[|ò‚xò¬~ò×ò«ò4Ïò`þò‹6ó²yóÖÆóõô}ô'æô9XõCÒõGWöDãö8w÷'ø ½øëjùÅú–Õú`–û&Züæ&ý¢÷ýYËþ ÿÁvrP#+ØÿŠÿÝ>ÿ³÷þ‡³þTuþ <þä þ¢ÝýW ¶ý —ý¥ |ý: lýÆ býE cýµ mý }ýp “ý· ®ýî Éýêý.þ6;þ,mþ¡þë Õþ° ÿj 5ÿ `ÿ® ‰ÿ= °ÿ½ Õÿ0 ÷ÿ˜ ö ,H >HÒJGE=w/¥Ðúëÿ$ËÿL¥ÿv}ÿ¦ÿSÿ×þ'ÿ þùþFýËþ‡ü þËûvþûPþoú.þËùþ0ùôýžøßýøÎý–÷Áý÷¹ý´ö¹ýQöÁýøõÒýªõèýfõþ+õ%þøôKþÑôtþ³ô¢þôÖþ‘ô ÿŽôFÿ–ô‚ÿ¤ôÀÿ½ôþÿÜô7õp6õ¨nõÞ±õùõ>Köf¢öŠ÷©i÷ÃÙ÷ÕQøàÏøæRùåÜùÝmúÑû¿Ÿû¦@üŠçük”ýHDþ øþø¬ÿÐc¦|ÕS+J êÿ¸Íÿl·ÿ¢ÿÇ’ÿl‰ÿ †ÿ¢‡ÿ1 ÿ¸  ÿ4 ·ÿ§ Ôÿ ôÿk º ;ý d2 Z Àt ô€ , `p ’U Â* ìò ¬ 4W Vù sŽ Œ ž— ¨ ¨{¡à’=}“bä@/x﻽þ…BJ† ÉÉ„VÿAŸþþÿëýºÿ=ýyÿ”ü;ÿðûÿRûÊþ½ú—þ.úiþ¦ùAþ%ùþªøþ9øêýÏ÷Üým÷Õý÷×ýÇöÞýöìýEöýýöþäõ/þÀõQþ£õvþõŸþ„õÍþ€õúþ†õ(ÿ“õVÿ«õ„ÿÌõ¯ÿóõ×ÿ"öÿÿYö"–öDÜö_'÷v{÷ŠÙ÷–=øœ¨øù˜‘ùŽú•úlûS­û6BüÜü÷ÿwýÒÿþ«ÿ¼þƒÿaÿYÿ3ÿ¯ ÿXéþÿÉþ¥­þK•þì€þ‹oþ%cþ¹]þG]þÍdþOtþLjþ6¥þ›ÄþöçþH ÿŠ 8ÿÅ fÿò šÿ Ðÿ* 1 H. ƒ ¹ îØ £ Mc y £ÅÉfì!›#‹ülñ×ÔA²©‹_{.åùTÂÆÿˆ:ÿO²þ.þÜÿ¯ý¥ÿ6ýnÿÃü:ÿWü ÿòûÞþ“û¶þ:û“þêúuþ¡ú^þ_úLþ%úBþñù?þÃùDþùLþ}ù[þdùnþRù…þFù£þ@ùÄþCùëþHùÿTùCÿeùrÿzù¡ÿ–ùÑÿµùþÿÛù+úV3ú~gú¦žúËÛúëûbû­û/ûû<NüB£üDþüA]ý8¿ý+'þ‘þÿþñoÿÖâÿ¹TšÊxBX¹83¬$çÿÑÿ»ÿ„ªÿðœÿZ“ÿÀ‘ÿ”ÿv›ÿɪÿ¾ÿWÕÿ’ñÿÂé0W°àéDÁu¡RË ò¶X<ï\~w‹€—öe›Ï‘4‚–môQP/¬ÿÿÙ`þ¤»ýjý,}üêâû¦Mû`¿ú8úÒÿµù‹ÿ<ùCÿÉøýþ_ø»þø{þ«÷?þ^÷þ÷Õýäö¨ýµö~ýö]ýwöBýfö-ýaöýdöýsöýŠöý©öýÓö*ý÷<ý>÷Sý~÷oýÇ÷Žýø¯ýpøÑýÌøóý2ùþŸù;þ ú]þú}þúú¡þwû¾þùûÛþ€üôþ ý ÿœýÿ-þ(ÿÁþ2ÿXÿ9ÿðÿ;ÿˆ:ÿ$7ÿÁ2ÿ`*ÿÿ ÿ@ÿÞõþyæþÙþ¬Ïþ?ÅþϽþ]ºþæ¸þh ºþå Áþ[ ËþÉ Ýþ. õþŠ ÿÝ 4ÿ& \ÿe ‡ÿ— ¹ÿÀ îÿÝ #í _ð æ âÏ *ª ty ¿: ì J” Œ- ̺ ; D° ~ ³|ßÑ!e5¡DÙJ I7B`3†«ÿÒÿÚöþ®þ|CýEoü œûÊÐú† úCIùýøµÝ÷n4÷(”öãþõ¡põ`íô$tôíÿô¸ÿ¢óˆÿHó]ÿüò:ÿ¹òÿƒòÿYòîþ7òßþ"òÔþòÏþòÎþòÐþ1òÙþOòåþwòõþªòÿæòÿ,ó)ÿ{ó:ÿÒóKÿ0ô\ÿ˜ômÿõ{ÿ~õˆÿýõÿ‡ö”ÿ÷—ÿ°÷”ÿNøŽÿòøƒÿœùtÿKúbÿûLÿ¿û3ÿüÿGý÷þþÕþßþ±þ­ÿ‹þ~cþQ=þ(þýôýÒÑý§°ýy“ýIvý_ýÛMýœ@ýX 8ý 6ý¸ :ý\ Eý÷ Rý† gý ƒý ¢ýì ÇýIðý—þØUþ Žþ/ÊþBÿFCÿ;€ÿºÿöøÿ¼3so«¶ áC  @6 e †ù ¡N ¸™ ÊÝÕÛNÚ}ÔªÉÔµüŸ#„JfsCž ÍÿúÿþÓ4þªoý°ü\øû5GûúòÿýùÖÿdùºÿÓø£ÿLøÿÏ÷ÿZ÷xÿîötÿötÿ6özÿèõ„ÿ¢õ‘ÿhõ¥ÿ6õ¼ÿ õÕÿêôôÿÓôÄô6½ô\¿ôÊô¦ÜôÌöôðõ>õ6nõV¥õsåõ*ö£wöµÌöÂ$÷ʃ÷Ïé÷ÎUøËÈøÃ@ùµ¾ù¥CúÊúwUû[æû={üýþ­ýÜKþºëþ™‹ÿv+UË8l ¨ñÿCßÿÛÐÿoÆÿþÀÿ‡¿ÿ Âÿ‡ÇÿüÑÿhÞÿÌðÿ%t¼:öW' tL h «v Æ| âs þ_ B 1 DâR£Y[[ X±QPEç4x‡àº€ù]q(æñÿ^¶ÿÕyÿK;ÿÂüþ:½þ¹ÿ}þ9ÿ?þ»þþCþÊýÒý“ýeýaýüü3ý™ü ý=üãüåûÃü–û¬üLû˜ü ûŒüÍú†ü—ú…üiúŒüBú˜ü!ú¨üú¾üïùÛüáùüüØù#ýÕùMýÚùyýåù¨ýôùÙý ú þ"ú=þ@úpþdú¡þúÔþ¼úÿñú2ÿ+û_ÿiû‰ÿ«û®ÿñûÐÿ<üïÿŠüÞü 6ý6ýFðýSSþ_¸þf ÿj‰ÿoõÿrbsÐs@q¯p oŽsüvi|Ó†8‘šŸø°PÄ£Ýðù6v:®`܉µå1:H:y1«Úÿ ×7¥el'¹ÙÝ„û)Ê$f1<›E8JØMzH;¶&I×á_´åÿƒiÿIëþ mþÉòý‚xý6ýä‹ü‘ü;®ûäKûðú7 úæÿZú”ÿúGÿíùýþÁù·þ›ùwþ{ù<þaùþLùØý>ù°ý5ùŽý5ùrý8ù[ýDùKýSù@ýgù<ýƒù=ý¢ùBýÆùLýîùYýúiýJú{ýúý»ú¦ýúú¼ý>ûÔý‰ûìýÚûþ/üþ‹ü*þìü=þOýMþ´ý[þþhþþpþæþuþMÿvþ³ÿwþuþ~qþåkþKcþ²ZþPþ~Dþâ8þE-þ¨$þ þkþËþ)þ…þáþ9þŽ&þÝ7þ$Hþd`þŸyþØ—þ »þ=âþe ÿ€;ÿŽmÿŽÿ‰Ðÿ{g6Ml*£ùÚ¼qEu¸¦QÔãþo&÷Ev`ðw_‰Æ–(Ÿ‡¤ä¢C›¦ÿˆ ÿqkþUÍý20ý–üñýûÒkûµáú—_úwäùQqù*ù¥øÛLø¶û÷—±÷|q÷f;÷T÷Bðö3Ýö%ÔöÓöÙöæöúö÷ =÷m÷!§÷/é÷</øIzøVÇøcùqpùËù/ú™–ú¥û­pûµàû¸Qü¸Åü·:ý±±ý©*þž¤þ"ÿÿmY˜C*•õÿÛÿ ¾ÿ¤ÿù‹ÿpsÿã]ÿTIÿÄ7ÿ0%ÿ—ÿùÿV ÿª ÿö ÿ=ÿ€ÿ¾(ÿø6ÿ' LÿJ dÿb ÿl šÿk µÿb ÒÿU îÿB & ,üMÄl‡.žÐ³lÂÏ’×Ý ßÝŽØ÷ËY¸¶žo[Î4. ŽÿâÿìþµÿHþ‡ÿ¦ýWÿý#ÿlüîþØûµþJû}þÄúHþEúþËùëý[ùÅýòø£ý‘øƒý8ødýæ÷Hýž÷/ý^÷ý)÷ýÿö ýàöýËö&ý½ö;ý¶öSýµömý¼öˆýÉö¦ýâöÈý÷ðý1÷ þc÷Xþ™÷”þÓ÷Ïþø ÿVøEÿ ø{ÿñø«ÿJùÛÿ¥ù ú:kúkÑúš=ûɪûñüü/ýEƒýVþcƒþoÿwŒÿ~€˜~!zªs5kÀ`LV×J_>è2m(ñ qìbÒ;Ÿ ![ +® :ö O0 c_ y€ š ¨­ ¸ ݹ ù¬ ’ 4f O- fç }— Ž@ ›Þ¨v¯²‡²¬m¡ÑŽ.v‡YÞ54 ˆßÚ­)ww:Åÿüÿ»`þv´ý.ýèÿoü ÿÔûVÿAû ÿ²úÅþ*ú}þ¬ù9þ5ùøýÆø¼ý`øƒýøPý®÷ ýe÷öü&÷Ñüñö²üÆö—ü¡öü‡ösürökücölü`ösüfö€üvö’üö§ü­ö¿üÐöÙüøö÷ü$÷ýU÷@ý÷lýÎ÷›ýøËý]øþý¬ø,þþøXþSù€þ«ù¦þúÍþgúôþËúÿ2ûGÿœûpÿ ü–ÿ{ü·ÿðüÐÿeýâÿÜýòÿXþÒþOÿ"Îÿ6KIÍ\PjÒrUz×~X…Ö‘Q Ç°:êØê‡üñP&§=ôV5pn‹¥¨ØÄ â! ÿ7 > 57 N& b té„¿‘›U¢¦Å¤n ’¢3kÀSK4ÓWë×ÀS‘Ì_C*»ó5¹±0C³ÿ9ÿÎÿÂþ“ÿOþXÿàýÿuýéþý¶þ²ü‡þXüZþü0þ¸û þrûìý4ûÒýýú»ýÍú©ý£úžý{ú•ýZú‘ý=ú“ý'ú™ýú¤ýú´ýúÇýúÞýúöý úþ+ú-þ=úIþPúhþjú‡þ‰ú¨þ«úÊþÑúêþùú ÿ#û)ÿQûDÿ‚û\ÿ¶ûrÿìû…ÿ'ü˜ÿcüªÿ¥ü¹ÿèüÇÿ/ýÑÿyýÛÿÃýãÿþéÿ`þìÿ°þíÿÿîÿWÿíÿ¬ÿîÿïÿ[óÿµúÿg ¼ "[+ª8÷GD\ŽvÓ–¼Bän “.µQÓsî—þ¿ëöGÝs¾šš»pÖAíÿÑ‹?&ë,’,5#×xûܺ·Xõÿ_‘ÿ+/ÿõÌþºnþzþ6Âýïtý¤*ýXæü ¦üÁÿküuÿ7ü)ÿ üáþåû›þÇûUþ±ûþ¡ûÖý–ûžý•ûjý›û;ý¦ûý¸ûðüÏûÓüêû½ü ü¬ü-ü üUü›ü„ü›ü·ü£üîü¯ü(ýÀüaý×ü›ýðüÖý ýþ-ýRþQý’þwýÖþžýÿÈý[ÿòýžÿþßÿDþ kþ_“þ¡ºþäàþ#ÿd"ÿ§?ÿçZÿ'qÿh…ÿ§šÿä«ÿ"»ÿ_Éÿ›ÓÿÖÛÿâÿMçÿ‡ëÿ¾ñÿôöÿ%þÿR{ ¢Çë( 5'D:VCmD‡>£6¿(ÛúþÜ=­bu‡3¬èÒ™öCì<‹_$~¶›>µ¾É<Ú¶å-í¦ÿñÿõ‘þõþîyýãìüÑaü¸×û™SûwÔúRZú,æùyùÙù¯²ø€[øL øÃ÷á…÷©O÷s%÷?÷éöâÿØöµÿÓöÿ×öeÿæö?ÿþöÿ÷ûþA÷ßþn÷Çþ¡÷²þÝ÷£þ"ø˜þnø‘þÀøŽþùþrùŽþÐùþ4ú–þšúþû§þsû´þæûÂþZüÐþÐüßþIýìþÃýùþ?þÿºþÿ6ÿÿ´ÿ*ÿ/3ÿ®9ÿ.>ÿ­Cÿ+Fÿ¨Hÿ%GÿŸEÿAÿ’<ÿ5ÿ{.ÿî'ÿ] ÿÊÿ4ÿ–ÿó ÿJ ÿ›ÿêÿ5 ÿy ÿ· ÿë ÿ #ÿ1 1ÿE BÿS Sÿ[ eÿ[ {ÿR ’ÿ= ¬ÿ Çÿì äÿ± m  7ËQpk „ œ'µ¦ÉÛŠëôõ[ú¾üû|÷Öð-æ„ÚÞÿÉ6ÿ´þœíýOý_¶ü? ü‘ûûÿ ûÙÿ…ú¶ÿú”ÿ“ùqÿ&ùPÿÁø0ÿgøÿø÷þÊ÷Þþ‡÷ÆþL÷´þ÷¦þööœþÖö™þÁö›þ´ö þ­öªþ¬ö¸þ²öÈþÀöÞþØöôþööÿ÷4ÿD÷[ÿr÷‡ÿ¤÷³ÿÛ÷áÿøWø;žøiçø–7ù‰ùðÞù7úJ’úsñú›Tû½¸ûÜ!üõü üümý)áý6Uþ=Ëþ@Cÿ@½ÿ;83´%4³3ì³Õ/¿¨¦Œ“tYz>é$V ¹öãfÒ±Ãöµ6©rŸ¤—Ì’çöù“ò—âšËž«¤…©R­²É·uº»·¸O³à¬n¢ô”t‚òmlUã8YÎöÿFÏÿ½¤ÿ6vÿ´ÿEÿ4ÿÿ¶þÜþ=þ¤þÈýlþXý3þðüûýŒüÃý/üýÚûWý‹û$ýCûòüûÁüÆú”ü’újüiúGüFú*ü)úüúüúôûôùëûïùéûïùëûöùóûúüúü*ú1üDúRü`úyüú¤ü¢úÓüÊúýôú<ý"ûtýTû¯ýˆûîý¿û/þ÷ûqþ1ü´þnüøþ¬ü;ÿíü|ÿ0ý¾ÿvýþÿ½ý:þvRþ°Ÿþæíþ=ÿJŒÿxÞÿ¢1Ì…óÚ04„P×i(v“È¥¶eÆ±Ôøá8îrú¦Ö /U#s*†3’<’CŒK€PoTYW<VVéV²RtM.Fæ;™-Jõï@Ôß´~“n¶ESòÿè“ÿµ4ÿ~×þD}þ (þÊÕýŠˆýJ=ýøüÇÿ¹ü…ÿüBÿKüÿü¿þôûþÑûDþ²ûþšûÐý‰ûœý{ûlývû>ýwûýyûñüûÒü‰û·ü—û ü«ûüÂû€üÝûxüýûtüüuü?üzüdü„üŠüü³üžüßü³ü ýÉü:ýâükýþüžýýÒý9ýþXý<þwýsþ–ý­þµýæþÖý!ÿöý`ÿþžÿ6þÞÿSþnþ_‡þ¢Ÿþåµþ)ÊþnàþµôþüÿCÿ‰.ÿÍ@ÿPÿOaÿrÿσÿ“ÿI¥ÿ€ºÿ°ÐÿÙêÿþ!<?V]i{w›{¾râd L30^Šéµ»Þ†G-R³u`— ¸®×Qóï ‰ +¶4J8ßÿ6tÿ0 ÿ%¡þ:þÙýêxýÌý¨Çü‚vüU+ü%åûó¤û¾kû†:ûLûìúÕÑúš»ú^¬ú#£úêÿ¡ú²ÿ§úzÿ´úFÿÆúÿÞúêþüúÂþûþ@û}þjû`þ–ûJþÉû6þÿû)þ7ü!þqüþ¬ü þèü&þ'ý.þcý;þ¤ýMþåýbþ&þxþiþ’þ«þ®þîþÊþ1ÿëþtÿ ÿµÿ'ÿöÿGÿ6dÿxÿºÿû¸ÿ=Ñÿ~èÿ¿ýÿý =}#»,ú275s6¬5á3/I*| ­Ú ýÿ%ñÿAæÿYÝÿlÖÿ}ÏÿŠÈÿ’Âÿ’¾ÿЏÿz¶ÿ_¸ÿ?¼ÿÄÿïÎÿÁÙÿŠæÿMôÿ¹d$ 8®KN^éq…–§©6¹ÅÿÇTÿÖâþâsþêþî—ýï-ýíÅüçbüâüØ­ûÍZûÀ û°Äú„ú„KúiúMïù-Ëù¯ùïÿ™ùÑÿŠù±ÿ„ù“ÿ†ùtÿùVÿù9ÿ´ùÿÐùÿþòùæþúÐþCú¾þsú®þ©ú¡þäú—þ$û‘þgûþ­ûþõû“þAü™þŒü¢þÚü­þ,ý¼þ~ýÎþÔýäþ+þüþ„þÿÜþ/ÿ7ÿKÿÿfÿéÿÿBžÿºÿøÙÿSõÿ¯ *hCÃZqt†Ì—"¨x¶ËÃÎeׯßôç8ëzîµðìðïAðaï}ð’ð£ï­ð¯ï¦ð’ðtóOö#úïÿ·u* Õx©9%Å(L)Î(M(Ç#>³( ÿ ÿüŽþìþÚƒýÃý©†ü üsšûT.û4Çúeúñÿ úÌÿ¸ù¥ÿmùÿ*ùXÿîø.ÿ»øÿøâþkøºþMø—þ8øtþ+øTþ&ø8þ(øþ1ø þ@øøýTøëýoøßýŒøÖý±øÑýÜøÏý ùÔý@ùÝýzùìýµùþóùþ4ú7þxúTþ¿útþ û•þVû·þ¦ûÝþøûÿLü2ÿ¢ü_ÿúüÿSý»ÿ­ýçÿþgþ9Çþ`(ÿ…ÿ¨ïÿÈR清1íAVO¿Y%`‰bîaOa±\TpJÊ?1j!±õ5òqâ¨ÑÖÃù²¤$š.1ˆ* } yìwÄvyW|€Ìˆ|'—Êže¦ý¬²·©»1¾·½=½Á»EµÉ®N£Øÿ”cÿ‚ïþm€þUþ:«ýIýþÿìüÞÿ“ü»ÿ@ü–ÿõûnÿ®ûEÿlûÿ1ûïþúúÄþÌúšþ£úqþ€úJþdú%þMúþ;úäý-úÅý"ú¨ýúýú|ý"úký-ú_ý;úZýMúYýbú]ýxúeý’úsý®ú„ýÍúšýñú´ýûÔýAû÷ýoûþ›ûGþÍûsþÿû¢þ3üÒþjüÿ¢ü>ÿÜüuÿý¯ÿ]ýçÿ ýäýQ,þ…tþµ½þä ÿUÿ@£ÿmðÿ—;¿‰âÙ&t0ÄBRU^™jÙt}S‚Œ„À…ò€x;pThj_zW†OGŽ=‡1y#dG &üî×á©ÔuÆ=¸¨Â–†=sù^²Jm3%à›åVȪØÿ‰œÿfdÿA-ÿûþóÿÍþÊÿ¢þŸÿ|þsÿZþFÿ=þÿ$þëþþ¼þýýþðý^þçý2þáýþßýÙýâý°ýéýˆýïýcýúýAýþ!ýþý!þïü2þØüFþÆü]þ¶ütþ«ü‹þ¤ü¢þ¢ü·þ¥üÏþ¬üæþ·üýþÇüÿÙü0ÿîüKÿýgÿ!ý€ÿ=ýœÿ]ý¶ÿ€ýÑÿ¨ýìÿÐýûý$&þCPþczþƒ£þ¥ÍþÆöþèÿ Gÿ0pÿT—ÿx½ÿ›áÿ½á ?*]Mxn“Š®¢ƶÜËòÝîü1F[þqóˆäœÏ±¹ÆžÙ{îS$ï5¶Ozh:ƒô˜­«b¿ÑÄÿâqÿôÿËþwþ #þ)Òý/‚ý04ý,éü%¡ü]ü üüäûè¯ûÎû±Uû0ûjû?úúéúàßú­ÜúwÞú=æúõúÆû‰"ûJBû gûÍÿ‘ûÿÀûQÿóûÿ)üÚþaü¤þœüpþÛü?þýþ`ýèý§ýÂýïý ý7þƒýþjýÅþWý ÿHýUÿ@ýÿ<ýæÿ:ý.?ýuGý½RýbýIvýŒýϧýÄýRâý’þÒ"þCþNdþ‰…þħþþÇþ5æþkÿÿÍ7ÿûPÿ(fÿSyÿ|‹ÿ¡šÿæÿݯÿóµÿ¸ÿ»ÿ½ÿ$¾ÿ'¿ÿ"¾ÿ¼ÿ¶ÿç³ÿȯÿ¡©ÿx§ÿH§ÿ§ÿÓ©ÿŽ«ÿC°ÿóµÿŸ¼ÿFÅÿçÐÿ†Þÿ!íÿ·þÿJÛ$l9ýÿNŒÿcÿx«þ<þ¦Ïý¿eýØüüï™ü9üÝû'‡û56û@êúI¤úQdúX,ú_÷ùbËùc¦ù`ˆùXpùM]ù<Pù,KùLùRùõ_ùâtù΋ù¶¨ù Éù…ëùjúRAú:sú$©úãúþÿûíÿ\ûÜÿ›ûÎÿÜûÄÿ ü»ÿeü³ÿ®ü¯ÿùü«ÿFý«ÿ”ý®ÿäý³ÿ3þºÿƒþÅÿÕþÏÿ)ÿÜÿ~ÿëÿÓÿúÿ( ×+0=‡Má`9på‘8ŸŒ«Ý¶/¾~ÇËÎÒUÖ’ÖËÕÒ1Î]ȆÁ¦»»°Ë¦ÓœÕÏ„Äw²l–atUHH=Ü2œ(W ¹a¤ùÿ?òÿÙêÿpäÿßÿ—Øÿ)Óÿ¼ÍÿPÅÿäÿ¾ÿzÿ³ÿÿ©ÿ®þÿLþÿïýƒÿ•ýtÿ?ýdÿïüSÿ£üAÿ]ü.ÿüÿáûÿ¬ûéþ~ûÑþVû¹þ3ûŸþû‡þüúnþéúVþÚú>þÓú'þÐúþÓúùýÛúäýäúÕýñúÈýû¾ýû·ý.û´ýKû´ýkû³ýŒûµý±û¹ýÖûÄýýûÔý%üêýOüþ}ü#þ¬üFþÞühþýþEý³þ{ýÜþ±ýÿèý6ÿ!þhÿ]þœÿ™þÒÿÖþÿ;Vÿo˜ÿ ÛÿÑb/¨[î…2­vÒ¼óI,BÏUdHo€x¸|í}|Mzwr˜i³^ÊPÜ@è/ñó îüâêÏÙ·Ç™µt¤L–‡êx±kr`0VëL£CX< 4»-j%Æu$Õÿþ‡ÿô<ÿèòþÚ«þÊgþ¹&þ¤êý°ýuzý[Ký>ýöüÔüÚÿ´ü´ÿ™ü‹ÿ‚ü_ÿnü1ÿ`üÿTüØþOüªþNü{þOüMþSüþYüðýaüÂýlü—ý{üoýüIý£ü%ý¹üýÓüëüìüÒüý½ü"ý­ü>ý£ü_ýœü‚ý™ü¥ýœüÉý¥üïý±üþÃü?þÝühþùü”þýÀþ:ýîþbýÿ‹ýNÿ·ý€ÿêý³ÿþéÿRþ‹þSÅþˆÿþ¿8ÿõpÿ,¦ÿcÛÿ›ÓB v>¨oØœÇ/óUuB’d®‚ƙޭò»ÅÌÎ(Ê.Á2²34„3g0E.)ô%ÃX 䦸gð&çæÞ¥ÕcË"¿äÿ³¤ÿ©hÿ›.ÿöþ€Âþoþ^aþK5þ6þ"ëý Ìýó°ýÚ™ý¿‡ý¢wý„lýddýC_ý!^ýÿÿ`ýÛÿdý·ÿmý‘ÿxýmÿ†ýGÿ•ý"ÿ¦ýþþ¸ýÚþÉý·þÞý˜þóýxþ þYþ$þ?þ=þ%þUþþnþûý‡þéý þÜý¹þÒýÓþËýîþÇýÿÅý$ÿÆý=ÿËýZÿÓývÿàý’ÿïý®ÿþËÿþèÿ*þAþ&[þFvþg‘þНþ­ÍþÏëþñ ÿ)ÿ5HÿXfÿ}‚ÿ¢ÿŹÿæÓÿëÿ!:U*n=„N—`¥o¯}¶Џ•·Ÿ´¨ª±œ»‹ÇtÒXÝ8éóíüÔ`+(ó7¸G{W=gvÁÿ†ÿ‘@ÿžÿªÄþ¶ˆþÁNþÍþØáýÞ±ýã‚ýçXýç2ýâýÛòüÒØüÆÄü·µü¤©ü¤üw£ü[§ü<®ü»üôËüËÞü öütýE2ýUýçÿ{ý·ÿ¢ý…ÿËýSÿõý"ÿ"þñþOþÂþ€þ•þ³þjþäþAþÿþIÿùý{ÿÜý­ÿÀýÞÿ©ý—ý?‰ýq~ý¢yýÓzý}ý3†ýa“ýޤý¼¹ýèÐýìý> þh,þ”Qþ»vþâþÆþ,ðþNÿn@ÿŽiÿ­ÿÉ·ÿãÝÿù !@&^/w6Œ: 8±1À%ÎØÿáææÈç¦çäRáÝéÙ¯ÓqÎ.Ééž¼S¶°°¬]§ ¦·ÿ¥`ÿ¦ ÿ§´þª^þ® þ³¹ýºiý¿ýÆÒü΋üÖIüÞ üæÒûñ›û÷kû?ûû öúÛúÄú³ú©ú ¢ú¡úÿ¤ú÷¬úëºúßËúÏáú»ûú¦û>ûwcû^ŒûE¶û+ãûü÷ÿEüÛÿ{ü¾ÿ²ü£ÿëü‡ÿ'ýmÿ`ýUÿœý>ÿÛý(ÿþÿYþÿšþôþÜþèþÿÞþdÿÙþ¨ÿÕþëÿÒþ.ÓþvÕþ½ÛþãþJíþ‘ûþÙ ÿ!ÿg,ÿ®@ÿòTÿ5gÿy}ÿ»’ÿü¨ÿ;½ÿxÓÿ²çÿçúÿ Hs,š9¾FÜQô\ckquv yüyäwÆv¢swqImj×d–bQ^Z·WfSQ¸M]KG¢EBEãC‚B#AÆÿAjÿ>ÿ<·þ9`þ6þ2¿ý.rý(*ý!åü¦ükü5üýÿüðÿÖûáÿ®ûÑÿ‰ûÀÿkû®ÿOû›ÿ:û‡ÿ(ûsÿû\ÿûGÿ û1ÿ ûÿ ûÿûðþûÛþ%ûÉþ3ûµþDû£þWû•þpûˆþŠû~þ¤ûxþÃûuþâûtþüuþ%üwþJüþrüˆþ›ü—þÇü«þóüÀþ!ýÚþRýöþ„ýÿ·ý6ÿìýYÿ$þ}ÿ\þ¤ÿ—þÌÿÓþöÿÿ NÿKŽÿwÍÿ£ ÍLöÐDgRˆ‘§Ïà ÞFô~·ë!(I-s0™.»*Ù!ó û$é)Ö,Á(­"˜kîRÔ<´&”oüFçÖ펴‹¦X™#Œî¸wnKg_âX­R{KJD<ðÿ3Åÿ*›ÿuÿQÿ/ÿùÿÿêÿóþÖÿØþÂÿÂþ«ÿ­þ’ÿ™þuÿ‡þXÿvþ9ÿjþÿ_þ÷þVþÕþPþ°þKþŠþEþeþCþ=þ@þþ@þðý@þÊýBþ¦ýEþ„ýHþdýMþGýSþ,ý[þýcþþüiþìüsþÜüþÒüŒþÌü™þÌü¨þÐü¸þ×üÊþäüÝþóüðþ ýÿ#ýÿAý4ÿaýNÿ‡ýhÿ±ý„ÿÜý ÿ þ½ÿ<þÚÿpþøÿ§þÞþ5ÿVQÿt‹ÿ“Åÿ®ýÿÊ4åjÿ Ô/B7Rea’l»uá{}#{?wYopc…U—C©/·ÁúÉÜϼӛÖvÖPÕ+ÔÐÜÿγÿÈŠÿÁaÿº:ÿ±ÿ§îþœËþ‘©þ„‹þwnþiRþY;þI&þ7þ"þüý÷õýßðýÅîý©ñýŒ÷ýnþýN þ-þ)þã;þ½Qþ“gþj€þ?šþ·þéÿÕþ¼ÿöþŽÿÿ`ÿ8ÿ4ÿ\ÿÿÿÛþ§ÿ¯þÍÿ…þõÿ]þ6þ=þaïý‚Ïý¥±ýÅ–ýåýký"Yý>KýZ?ýu9ý5ý¦4ý¾8ýÕ>ýìGýRýaý.rýB„ýW˜ýj®ý|Åý‘ßý¤ùý¸þË0þÜKþìhþøƒþžþ ¹þÒþìþÿ ÿ1ÿGÿ \ÿoÿñƒÿß—ÿÈ©ÿ­ºÿÊÿmÛÿGìÿüÿò ÂŽ0WBWãk¦€g–'«äÿ¢ÿÙ^ÿòÿ Øþ'”þDUþ`þ{Öý—œý±býË+ýä÷üúÈüœü&sü9MüK,ü[üg÷ûoãûuÒûvÆûu¾ûpºûg¼û\ÀûLÊû9Õû"ãûøûêüÊ)ü¦FügüVŠü,­üÿÓüÒúü¤"ýtMýD{ý¬ýèÿÝý½ÿþÿGþfÿyþ>ÿ¬þÿßþõþÿÕþGÿ¹þ~ÿ þ¶ÿŠþðÿyþ)kþbbþœ[þÓYþ [þ@_þvgþ¬rþã€þ‘þP£þ…¹þ¸ÏþéçþÿCÿk2ÿ’Lÿ·fÿÙÿù—ÿ¯ÿ1ÄÿFØÿVéÿaøÿghg`"W+H/410-ß+¹&Ž!^+õ¼ ‚EþÿùÿÄôÿ€ïÿ;ìÿóêÿ­êÿdêÿìÿÛÿïÿ–ÿóÿSÿùÿÿÒþ–þZþ þ'éý1¶ý=†ýG[ýS1ý^ ýiëüsÍü|²ü‡›ü‡ü•wü—iü™`ü˜Yü•Vü‘Vü‹Xü†^ü~eütpüh}üXŒüHžü5°ü"Äü ÚüúÿóüåÿýÒÿ*ý¾ÿHý©ÿiý“ÿ‹ýÿ­ýlÿÑýXÿ÷ýIÿþ9ÿGþ+ÿqþ ÿžþÿÌþÿûþ ÿ+ÿÿ^ÿÿ‘ÿÿÆÿ ÿüÿÿ1ÿh!ÿž+ÿÕ7ÿ GÿDVÿ|eÿ´wÿíˆÿ#šÿW­ÿˆÁÿ·Óÿãæÿ úÿ4 Y|,›:¶IÍXàeëròó‰ï“é›à£Ò­¿³¨¹ŒÁiÆBÌÓéظÝ„ãOêðÝ÷¢ýd% ç¥e%êÿ$®ÿ)sÿ.:ÿ1ÿ2Îþ3šþ0hþ-9þ( þ"ãý¿ýžýý÷eýæLýÒ6ý½$ý¥ýŒýpüüTôü6îüìüôÿíüÒÿðü¯ÿöü‹ÿþügÿýBÿýÿýýþ)ýÛþ9ýºþIý›þ\ý|þsýaþŠýGþ¡ý3þºý!þÕýþðýþ þÿý*þúýKþöýmþöýþüý´þþÙþþÿ þ(ÿ5þQÿKþ}ÿeþ¨ÿþÓÿœþÿÿ¹þ)ÙþXûþ†ÿ´@ÿãdÿŠÿ>­ÿiÏÿ”òÿ¾æ* H3cU|v‘”¥¬·ÄÆÙÓêÝøæì ïññ ïëúêéåØàÃÛ®Ô—Î|Ê_Ä;¿¼ñºÈ¹¡¸zºT¼-¾ÃÜɲ͇Õ^Ý5å îêÿöÈÿÿ§ÿˆÿhÿJÿ,ÿÿ÷þÞþÈþµþ¢þ ’þ„þòtþâgþÏZþ¹Nþ¢Dþ†;þk3þN0þ--þ *þêÿ'þÆÿ%þ ÿ#þyÿ"þSÿ#þ-ÿ%þÿ+þãþ0þÀþ8þžþBþþLþaþVþEþaþ+þoþþ~þþþñý¡þäý¶þÚýÏþÕýçþÓýÿÔýÿÚý9ÿâýUÿíýsÿûý’ÿ þ²ÿ"þÓÿ:þôÿTþpþ8ŒþZ«þzËþ˜îþ·ÿÖ4ÿòZÿ ~ÿ(¢ÿ?ÆÿTæÿes%€EŠe„“¢•¿’ÙŽð…zl.ZAFS1dtÿ„å’Èž«¨Œ²l¼KÅ+Í ÔíÿÛÐÿá±ÿå”ÿêzÿì`ÿîIÿï2ÿîÿí ÿéýþäïþßãþØÚþÍÕþÂÑþ´Òþ¤Ôþ“Øþ~ÞþjäþRíþ8õþÿÿÿßÿ¾/ÿ›AÿwSÿQgÿ*{ÿŽÿÜÿ ÿ³ÿ´ÿŠÿÆÿbÿÙÿ9ÿîÿÿìþÇþ,¡þA~þS\þg<þx þŠþïý¯ÛýÄÈý×¹ýé­ýü£ýšý •ý2•ýD—ýV›ýh¤ýz¬ýŒ¸ýžÆý®Öý¿åýÏ÷ýÝ þêþô4þÿJþaþwþþ¦þ½þÓþéþþþ ÿþ(ÿï=ÿßRÿÌfÿ¶|ÿžÿ‚¢ÿcµÿAÈÿÝÿöòÿÌ¡t4EJcåÿz´ÿ”‚ÿ±MÿËÿêæþ ³þ)€þIOþiþ‡ïý§ÃýƘýçoýHý(%ýIýfæüËü›²ü²üÆ‹ü×üæsüólüýgügüiüpüýxüô„üå“üÒ¥ü¹ºüžÐü‚éüaý; ýAýædý¸‰ý‡¯ýSÖýÿýç(þ±Rþy}þA«þ ÚþÓÿ ÿÿ=ÿhÿpÿ4ÿ¥ÿÿØÿÕþ ªþ=þrZþ¥7þÚþüýIäý‚Îýº½ýò±ý'¨ýY¡ý‹žý¼ ýì¢ý©ýL²ý{½ý§ÊýÐÙýõéýûý2þM!þf4þ|Kþ`þœuþ¦ˆþ¬þ¬°þ¦ÂþœÓþŽåþ{öþeÿMÿ.$ÿ 2ÿè?ÿ½KÿŽWÿXbÿ!nÿézÿ®†ÿp“ÿ2žÿò«ÿ°¹ÿlÇÿ%×ÿàåÿ˜õÿQ Èÿ(„ÿ;BÿNÿcÂþw„þIþ¡þ·×ýÍ£ýâoýö@ý ýìü.Åü@¡üOü^bühHüt0ü~ü… üŠúûŽîû‘äûŽÜû‰×ûƒÕû|Õûq×ûfÞûZåûLïû<ûû,üü*üï?üÙWüÃqü®Žü˜¬ü‚Îünðü[ýF=ý2eý’ý Áýüÿñýíÿ$þÝÿZþÑÿþÄÿÉþºÿÿ°ÿ>ÿ¨ÿzÿ¡ÿ¶ÿ™ÿôÿ“ÿ3Žÿs‹ÿ´ˆÿó†ÿ0ƒÿmÿ©ÿä€ÿ€ÿY}ÿ}ÿÄ~ÿô}ÿ ~ÿH}ÿl~ÿ~ÿ¯~ÿËÿãÿ÷ƒÿ…ÿ†ÿˆÿŒÿÿ •ÿÿœÿð£ÿà¬ÿ̶ÿ²Àÿ•ÊÿtÕÿPãÿ)òÿÖ« €2PC!Uòg¿xŒ‰Z›)¬ø¼ÉÊšÙlå>îõçÿú¼ÿþ“ÿÿlÿýGÿù$ÿòÿêãþÞÄþЧþ¾Œþ©qþ•Xþ|Cþ`-þDþ' þùýèÿíýÆÿáý¥ÿÕýƒÿËý_ÿÄý?ÿ½ýÿ·ýýþµýßþ´ýÂþ¶ý¦þ¸ýŒþ½ýuþÄý`þËýOþÕýAþàý4þîý,þýý'þ þ&þ þ(þ6þ*þNþ1þgþ;þ€þHþšþXþ·þjþÔþ€þòþ–þÿ°þ3ÿËþUÿçþvÿÿ™ÿ ÿ»ÿ<ÿÜÿ[ÿüÿxÿ–ÿ9´ÿZÑÿxïÿ• °"É:áPõfyŒ&ž3¬>»FÉLÖOàPèOïIøCÿ:1# !ù(é/×7Å>±GO‰Yrc_mJx7ƒ'Ž˜¤öÿ­çÿ·ÖÿÁÇÿɸÿЬÿסÿÛ™ÿÝ’ÿÞ‹ÿ܆ÿÙÿÔ{ÿËvÿÁqÿ´mÿ£lÿmÿ|lÿdmÿInÿ+oÿ nÿêoÿÆqÿŸtÿxxÿO|ÿ&ÿüÿ†ÿÑÿ‰ÿ¥ÿÿvÿ’ÿJÿ—ÿÿžÿôþ§ÿÉþ±ÿ¡þ»ÿzþÆÿTþÑÿ1þÝÿþéÿïý÷ÿÓý¹ý¡ý$ý7{ýIlý^býtYýˆTý›Pý°OýÆSýÞXýó`ý kýxý3†ýF—ýXªýg¾ýwÕý‡ëý“þžþ¦:þ¬Vþ°tþ°’þ®¯þ©Íþ£ìþ› ÿ,ÿ‚Mÿrnÿ_ÿI²ÿ1Õÿ÷ÿúÜ8½[}{žXÀ5ãîÿ&ÊÿH¦ÿhÿˆ_ÿ§;ÿÃÿàùþûÚþ¾þ-¢þC‡þXnþjYþ{Eþ‰5þ”%þþ¢ þ¤þ¥úý¢õýñý“ðýˆóýy÷ýgýýRþ; þ!þþå)þÅ5þ¢Eþ~UþXfþ1yþ þá¡þ¸³þŽÆþfÛþ=ïþÿïÿÿËÿ6ÿ¦ÿQÿ‚ÿjÿ`ÿ„ÿ@ÿÿ"ÿ·ÿÿÒÿìþìÿÕþ¿þ$«þDšþc‹þ‚}þ¡rþ¾hþÞ`þü[þWþ8TþWRþwQþ•Rþ²SþÍVþæWþý[þ^þ(aþ=fþPiþamþosþ{wþƒ|þ†‚þ‰†þˆŒþ…‘þ€˜þxŸþn¨þ`±þO»þ;Åþ#ÑþàþìîþÎÿ­ÿŒ(ÿh?ÿCVÿpÿó‹ÿɧÿžÇÿsèÿG+ñÿQÈÿvœÿrÿÃIÿé ÿúþ6Ôþ[°þþ¥kþÇLþè0þþ#üý=åýSÐýe½ýu¬ý€Ÿý‰”ýŽŠýýŽ{ý‰yýwýpxý]zýHý.…ýýò˜ýѤý¬²ý…Ãý\Ôý1èýþý×þ¨-þyGþJcþ€þðÿžþÄÿ¿þ˜ÿâþlÿÿDÿ-ÿÿTÿ÷þ}ÿÕþ¦ÿ³þÏÿ•þùÿzþ"bþMJþ|6þª&þ×þ þ5þaÿýûý¹øýãùý ûý2þWþzþœþ½"þÙ.þò;þ IþXþ+iþ6xþ=‰þCšþD­þBÀþ<Óþ4çþ%úþÿÿ#ÿè9ÿÌOÿ­eÿ‹|ÿf“ÿ@«ÿÃÿëÚÿ¼óÿŒ ]$+@ùZÆt‘]©)ÃöÿÜÄÿö‘ÿ`ÿ*0ÿ@ÿXÖþo©þƒ~þ–Vþ¨0þ¸ þÇêýÔÊýß­ýç’ýíyýòaýôLýó:ýò)ýíýåýÜýÑüüÄöüµóü£òü‘ðü|òühöüQúü9ý ýýê$ýÎ3ý³Cý˜Vý}jýcýH™ý.µýÑýûÿïýâÿþËÿ3þµÿWþžÿ|þŠÿ¤þuÿÏþdÿúþRÿ(ÿ@ÿWÿ/ÿ…ÿÿ¶ÿÿèÿÿöþKéþ€Þþ´ÔþéÊþ¾þQ´þƒ­þ´¢þã›þ“þ?Œþm‡þ—€þÀ{þåwþtþ'qþAoþYpþnpþ}rþŒwþ˜}þ¡‚þ§Œþ©–þ¥¡þ¯þ’ÁþƒÓþqèþ]þþGÿ-0ÿKÿóiÿÒ‡ÿ®§ÿˆÈÿ`ëÿ6 /áT´x‡œ[¾,àýÎ! Ar^Ey‘íÿ§Âÿ¹•ÿÉlÿÖBÿßÿæòþéËþê¨þç†þàcþ×BþË#þ¹þ¦èý‘Ìýy±ý_›ýB…ý$oý]ýäLýÂ<ý 0ý}$ý[ý8ýýøÿ ýØÿ ý¹ÿ ýÿýÿýgÿýOÿ+ý;ÿ6ý'ÿFýÿWýÿlýùþƒýïþ›ýæþ¸ýàþÕýÝþõýÛþþÛþ7þÝþ[þàþþåþ¨þíþÑþóþûþüþ$ÿÿNÿÿxÿÿ¡ÿ%ÿÊÿ1ÿôÿ<ÿHÿESÿm^ÿ“jÿ·sÿÚÿû‰ÿ“ÿ6ÿS§ÿl±ÿ…»ÿšÅÿ­Íÿ½ÕÿËàÿÕêÿÞôÿæþÿê îï"î.ì<æIáXØiÏyÇŠºœ®­¤¿–Ò‡äxõiWF*7;)KY eüqí|݄̊¼­’ž“‘t‡f}YrJd:U,A-øÿæëÿÉÞÿ­ÐÿÃÿn¸ÿN¬ÿ, ÿ —ÿëÿÿÇÿ„ÿ¦ÿzÿ…ÿqÿbÿkÿ?ÿdÿÿ`ÿÿ^ÿàþ[ÿÃþZÿ¨þ\ÿŒþ^ÿsþ`ÿ[þdÿCþkÿ.þrÿþzÿ þ„ÿûýÿíý›ÿáý¨ÿ×ý¶ÿÎýÆÿÈýÕÿÄýåÿ¿ýöÿ¿ýÀýÁý!Åý2ÊýBÑýQÛý]æýkòývþþ‡#þ6þ’Kþ•aþ—{þ–”þ“±þŽÑþˆïþÿs4ÿgYÿX~ÿH¦ÿ6Ïÿ$÷ÿ"ûÿMåÿ{Íÿ¨¶ÿÖœÿƒÿ1iÿ_OÿŠ8ÿ· ÿáÿ ñþ3ÜþZÆþ€²þ¡ þÂþÝ~þöqþfþ \þ1Sþ;LþDGþIEþIDþGDþ?Gþ4Jþ'PþVþý_þåjþÇuþ¨ƒþ†’þ`£þ8³þÄþäÖþ¶èþˆûþXÿ)&ÿø<ÿÈTÿ—nÿf‰ÿ8 ÿ ·ÿÞÿÑÿ°ÿéÿ†ÿ]ÿ5ÿ;ÿXìþvÊþ“«þ±ŒþÏqþìXþ @þ(*þGþfþ„òý¡ãý¿ÕýÝÉýú¾ýµý3®ýM¦ýfŸý}™ý‘•ý¥ý¸ýÉ‹ý׉ýåˆýñ‰ýøŒýýýü‘ýü–ýú›ýó¢ýê«ýßµýÑÁý¿ÏýªÝý”ïýyþ\þ=1þIþùhþÓ…þ«¥þ‚ÉþXíþ,ÿþ<ÿÎeÿ ’ÿo¿ÿ?îÿáÿJ±ÿ{€ÿªQÿÛ"ÿ õþ:Æþi›þ–qþÄHþí þúý<Öý^³ý~”ý›sýµVýË<ýà"ýò ý÷üãü ÒüÃü ¶ü«üý£üñœüá˜üΕü¸•ü¡–ü†™üi üG©ü%³üÀüÝÐü·áüõüh ý>$ý@ýí]ýÂ}ý™ŸýpÃýHéý!þúÿ=þÖÿjþ°ÿšþŒÿËþjÿÿþIÿ3ÿ)ÿgÿ ÿÿìþÒÿÐþ ¶þBþ}†þ¸pþó[þ+Iþd9þš(þÎþþ4þfüý—õýÃðýîíýêý8êýYìýuðýŽõý¦þý¹þÇþÑ!þØ.þÜ@þÜTþÖiþÍþØþ´³þ¡Ïþ‹ëþr ÿT*ÿ5Hÿjÿñÿ˯ÿ¥ÒÿzõÿO$8öZÇy˜ši¹8ÖôÙ©'z>JSfðÿvÄÿ„˜ÿlÿ™Cÿ¡ÿ¥ñþ§Ìþ¦§þ¤ƒþŸ`þ˜@þ!þ„þyåýjÊý\±ýJ™ý8‚ý%mýZýüIýç:ýÔ,ý¿ ýªý•ý€ ýjýVýA ý.ýý ýúÿ)ýéÿ:ýØÿIýÈÿ\ý¸ÿtý¨ÿý™ÿ¨ýŠÿÄý|ÿåýnÿþaÿ+þTÿQþGÿxþ:ÿ£þ,ÿÏþÿüþÿ)ÿÿXÿùþ‡ÿíþ¶ÿàþåÿÕþÊþCÀþs¶þ¡«þÏ£þúšþ$”þLþrŠþ˜ˆþ¼ˆþ܈þü‹þ‘þ0–þC þT«þc¹þoÊþyÜþ‚ñþ‡ÿ‰!ÿˆ=ÿƒ[ÿ{|ÿpÿa¿ÿRåÿB//W~ï¦ÖÍ»õ ‚CdgG‰)« ÉëæÌ¬.n?OM0X_ôÿcØÿd»ÿ` ÿX„ÿNiÿAOÿ15ÿÿÿííþÒÖþ³Âþ’¬þqšþM‰þ)wþhþÝZþ¶MþAþf7þ?/þ)þòÿ$þÍÿ!þ¨ÿ þ…ÿ!þbÿ#þ@ÿ(þ ÿ.þÿ7þæþCþÍþOþ³þ_þþpþ‡þƒþtþ˜þdþ¯þSþÇþCþáþ8þüþ-þÿ$þ9ÿþYÿþyÿþ›ÿþ¼ÿþÜÿ þþÿ þþ@þbþ„þ¤#þÃ,þß5þû@þLþ/XþFfþ[tþo†þšþ­þ›Âþ¦Øþ®ðþ´ÿ¸!ÿ¹=ÿ¹Yÿ·uÿ³”ÿ¬³ÿ¤Óÿšòÿ‚3sUdvU—C¹0Úú ÷7äTÒq¼Š§£“»~ÑhåVõ@. %úÿ+çÿ.Õÿ/Âÿ.°ÿ)žÿ$ÿ{ÿlÿ]ÿ÷Nÿæ=ÿÔ.ÿ ÿ«ÿ–ÿóþeæþKÙþ0ÌþÁþø¶þܬþÀ¥þ£œþ…–þh‘þJþ,‰þˆþòÿ‰þÖÿŠþ¸ÿŽþœÿ•þÿžþbÿ§þGÿ²þ*ÿÁþÿÐþôþàþÚþóþÀþÿ§þÿŽþ7ÿvþQÿ_þlÿIþ‰ÿ3þ¥ÿþÂÿ þàÿûýýÿëýÛý9ÐýYÃýw¹ý–³ý³­ýͪýçªýÿ­ý²ý+¹ý?ÄýOÑý_áýlôýwþ€!þ…=þ‡\þˆ~þ‡¢þƒÉþ}òþtÿjIÿ]vÿN¤ÿ>Ôÿ-7jðØÐÁ©1^w‹_¶Fß-+þÿLèÿkÐÿ†ºÿž¥ÿ°ÿÂ~ÿÎjÿÕWÿÛGÿÚ9ÿØ*ÿÑÿÇÿ¹ÿ¨úþ”òþ|éþbâþFÛþ'×þÓþâÐþ¿Ðþ˜ÏþqÐþKÑþ!ÑþøÔþÏ×þ¦Ûþ}âþTêþ-ôþÿþãÿ ÿ½ÿÿ˜ÿ#ÿvÿ3ÿTÿBÿ4ÿSÿÿgÿöþ{ÿÛþ’ÿ¿þªÿ¥þÂÿþÝÿwþ÷ÿaþLþ*9þG%þeþ„þ£öýÂèýâÝýÒýÈý:¿ýV·ýs±ý«ý§¨ýÁ¦ýÖ¦ýê§ýü©ý ®ý´ý"¼ý+Æý1Òý4ßý5ðý1þ,þ$-þGþ bþø€þäŸþпþ·âþœÿ€/ÿbWÿAÿªÿûÖÿÕ°-‰Za‰:¶âìÿÅÿ<œÿguÿ‘Nÿ¸&ÿÞÿÞþ&ºþE˜þcxþ€Xþ™:þ¯þÃþÒêýßÒýè»ýï§ýó”ýõ‚ýôrýïeýèXýÞNýÑDýÀ=ý­9ý˜5ý2ýh3ýM5ý19ý=ýòEýÐOý­Zýˆhýcyý<‹ý ýì¶ýÄÐý›ëýr þI(þKþöÿqþÍÿ˜þ¢ÿÀþyÿëþPÿÿ(ÿHÿÿyÿØþ«ÿ²þßÿ‹þhþJEþ#þ¹þñâý(Æý`©ý—ýÌwýcý9Qýn?ýŸ2ýÎ'ýúý$ýIýlýý­!ýÇ,ýß9ýòJý]ý sýý¨ýÈý éýþó4þâ]þÍ…þµ±þ™Þþx ÿV:ÿ2jÿ šÿàÈÿ´÷ÿ†$WR%ó«¿Õ‰ýT#Gèj´‰|¦FÁÙÞÿíªÿÿwÿDÿÿ#áþ+±þ/‚þ0Uþ/)þ-ÿý&Õý­ý‡ý aýþ>ýïýàüüÏÞü¾Áü¬¦ü˜üƒvüpbü[OüF?ü11ü&ü üóüàüÉü´üŸü‰'üu3ü_BüKUü8jü#„ü ¢üúÿÂüåÿäüÎÿ ý¸ÿ4ý¢ÿ]ý‹ÿývÿ¾ý`ÿòýJÿ)þ5ÿaþÿ›þÿÖþòþÿÝþNÿÈþ‹ÿµþËÿ¡þþGþ…oþÃbþTþ9IþrAþª:þß6þ3þB4þp6þ:þÄBþéMþ Yþ)hþDzþZþm§þ}Àþ‰Ûþ’÷þ˜ÿ›9ÿ›[ÿ–ÿ¤ÿ†ÊÿwïÿgU:@a*‡­÷ÐÛõ½ž5}TYo6‰¢î¶ÈÊ¢Ù{æUð,÷üÚþ³ýŠøaò:èÝéÿÐÂÿ¿›ÿ¬sÿ—Lÿ'ÿhÿNÞþ3ºþ˜þ÷xþÙWþº9þ™þyþXèý7Ñý¼ýöÿªýÖÿšý´ÿý“ÿýsÿyýTÿrý5ÿqýÿqýøþsýÜþzýÂþ‚ý§þŽýŽþœývþ®ý_þÁýKþ×ý5þðý#þ þþ*þþIþ÷ýkþìýþâý°þÜýÔþÖýùþÓý ÿÔýHÿÔýoÿÖý”ÿÜý»ÿäýáÿîýýý% þFþh3þ‡Iþ¤bþ¿}þØ™þî·þØþûþ#!ÿ.Fÿ9mÿA—ÿGÀÿJèÿJJ;Ee@9¹0â& 3 Xÿ}ò âÀÑàÁü¯Ÿ0E|Xlh\wLƒ=‹.””’óÿæÿ‡Ùÿ~ÍÿrÁÿd·ÿT«ÿDŸÿ1•ÿŠÿÿïuÿÕlÿ½dÿ¢[ÿ‡SÿjKÿMDÿ1=ÿ5ÿò/ÿÔ*ÿ´$ÿ•"ÿuÿUÿ5ÿÿôÿ ÿÔÿ#ÿ²ÿ'ÿ‘ÿ/ÿpÿ6ÿNÿ?ÿ.ÿLÿ ÿYÿêþiÿÉþ{ÿ§þÿ‡þ¡ÿfþµÿGþÍÿ'þåÿ þêýÎý7³ýV—ýs~ý’hý±QýÏ>ýí0ý !ý+ýIýf ý ý™ý±$ýÈ:ýÛZýíýüªý Õýþ)þSþ!~þ ¨þÒþþþ +ÿþXÿî„ÿܱÿÇÜÿ°—/|Y_…@°ÜþÛ4·_’ˆm²H×"üþÿÚÿ=´ÿ\ÿwlÿ‘Iÿ¦'ÿºÿÉåþÔÇþÝ©þâŒþâqþàXþÜ?þÑ(þÆþ¸þ¤ìýŽÜývÌýZ¿ý<³ý§ýùžýÔ•ý¯ýˆˆý_…ý5„ýƒýä†ý¾‰ý™Žýt”ýR›ý2¦ý±ýñÿ¿ýÐÿÐý¬ÿâýŠÿ÷ýiÿþIÿ'þ)ÿ@þ ÿ^þîþ|þÒþþ¶þÁþ˜þçþ€þÿiþ8ÿWþbÿJþŽÿ>þ½ÿ1þìÿ#þþK þ|þ¬þÞþ þ>þpþŸþÎþúþ#'þL2þqAþ”QþµbþÔrþï„þ•þ§þ.ºþ<ÏþFçþMÿOÿN;ÿL\ÿD}ÿ8¡ÿ+Äÿçÿï&ÕE¸d™‚wžT¸.ÓêÞÿµ‰(^:1L\Õk¨yz†K“Ÿòÿ¨Çÿ±›ÿ·qÿ»GÿÁÿÅõþÉÏþÊ©þÌ…þÉcþÃ@þ¼ þ²þ©ãý Éý”­ý‡”ýw~ýchýMUý4Cý2ý$ýæýËý­ýŽýnýüLüü(üüýàÿý¼ÿý•ÿýrÿ-ýMÿ?ý*ÿSý ÿiýçþ†ýÃþ¤ý¡þÄý~þèý^þ þ@þ5þ'þ_þþ‹þþºþîýëþÛýÿÈýTÿ¸ý‹ÿ«ýÂÿ£ýúÿ¡ý/£ýe§ýž­ýÕ´ý »ýEÃýzÐý¯àýàôý þ=(þfEþcþ°€þÒžþð½þ ßþ"ÿ5(ÿDPÿNzÿU¢ÿWÉÿUðÿPF:9`*†¬Òç÷Ë­<Š]dy?”­ìÅÃÛ–ði=%à1²;ƒBUG'IûÿHÍÿF£ÿCxÿ=Mÿ6&ÿ-þþ ×þ¯þþ‹þègþÒFþ»&þ¤þŠêýqÍýS´ý3œýƒýïmýËZý§Fý…7ýa)ý<ýýôÿ ýÐÿýªÿý…ÿþüaÿý=ÿýÿ ýûþýÚþý½þ-ý¡þ?ý†þSýmþiýRþƒý;þ ý$þÀýþáýþþ÷ý+þðýTþéýþáý®þÙýßþÒýÿÏýEÿÏýxÿÖý­ÿáýäÿíýøýOþ†þ¿þõ%þ+5þ_Jþ’bþÅ{þó•þ!¯þMÆþuÝþôþ¿ ÿß'ÿüBÿ_ÿ)}ÿ=›ÿK¸ÿWÓÿ_îÿce a<YVPpAŒ2§ Á ÚòñØ»œ3zGVZ2o ‚䔼¤•µlÃBÎÚëâÀé•ñh÷>üýéÿýÁÿø–ÿònÿëFÿáÿ×öþËÏþ»ªþ©„þ•`þ>þdþIýý,ÞýÀýð¦ýÏŠý­qýˆ[ýbEý92ý ýìÿýÅÿýœÿþüuÿ÷üOÿñü*ÿñüÿòüáþôü¿þüüœþýzþýZþ"ý<þ6ý!þLý þeýúýýíýŸýâý¿ý×ýãýËý þÀý0þ¹ý[þ¸ý‡þ½ý´þÉýãþØýÿçýEÿöývÿþ¨ÿþÙÿ'þ >þ:[þjzþ™œþȾþóßþ ÿI"ÿqDÿ•hÿ¶‹ÿÖ±ÿò×ÿ ýÿ"!7EGgTŠ`«gÉkènl!h=bW[oO…B˜4«"»ÉýØæãÑîº÷¡þˆoU:!ýíøÓó¹ìŸâ…ÖlÈQ·:¤! }õÿhàÿSÉÿ;´ÿ!žÿ‰ÿèuÿÉ_ÿ¨Lÿˆ8ÿg&ÿDÿ"ÿôþÞÿäþºÿÖþ“ÿÈþoÿ»þJÿ°þ%ÿ¤þÿœþÞþ•þ¼þŽþšþ‹þzþ‰þ\þ‰þ@þŠþ&þŽþ þ“þðý™þ×ý¢þÁý­þ¯ý»þ¢ýÊþ™ýÛþ‘ýîþ‰ýÿýÿyý4ÿvýPÿvýkÿ}ý‡ÿ‰ý¥ÿ—ýÃÿ¦ýáÿ³ýÀý!ÏýAàýb÷ý‚þ 0þ½PþÙoþôŽþ­þ'Ìþ<ìþQÿc2ÿrXÿÿˆ¦ÿ‘Îÿ–ôÿ–•=“a‹„ƒ©wÍfóWD=/_ÿ å½ÈÛ«ön*NE-\ sïÿ†Ïÿ™¯ÿ¨ÿ³pÿ¾QÿÆ4ÿÍÿÔýþ×ãþ×ÊþÔ³þÍþ‡þ¶tþ¦dþ•SþƒDþm8þS,þ7$þþóþÎþ¦ þ~ þTþ& þù þÈþ—þeþ2$þ-þÌÿ9þ™ÿFþeÿUþ3ÿeþÿwþÐþˆþ¡þŸþuþ¶þJþÏþ!þéþúýÿÖý%ÿ³ýBÿ“ýdÿyý…ÿcý¨ÿRýÎÿDýóÿ7ý+ýBýmý˜ýÄýï*ý:ýDIýoYý›iýÅyýïý¦ý?Äýeäý‰þ©(þÈJþælþŒþ°þ,Òþ>öþKÿU@ÿ^eÿbˆÿbªÿ_ÍÿXîÿL >),IgþƒâŸÄº¤ÓìX/.×B¨UxhFxŠà™«¨w´CÁËÝÿÕªÿßwÿçDÿîÿõâþø³þø†þùZþ÷.þôþñÜýì·ýå“ýÝpýÐOýÂ0ý°ýøü‰àütÊü^µüE¢ü+’üƒüòwüÑnü¯füŒaüi^üE]ü!`üÿÿeüÛÿlü·ÿwü“ÿ„üqÿ”üNÿ¦ü,ÿ»ü ÿÓüéþïüÉþ ý«þ,ýþQýuþvýaþ ýQþÌýCþùý4þ*þ$þ]þþ“þ þÉþþÿþ<ÿþwÿ þµÿþóÿþ0#þp*þ°6þîEþ-Zþjoþ¦‡þà þ¹þQÑþ†ëþºÿë!ÿ=ÿAZÿgzÿŠšÿ¨¹ÿÂ×ÿÚõÿíü/Kh…¡ ¾ÿÙðôß Ê$±:–PveTx0Œ œß­´¾†ËVÖ&ÞöçÅí’ò_õ,÷ø÷Äó‘í_ä,ÚüÿÎÎÿÀœÿ±oÿBÿˆÿoëþSÀþ6˜þqþøJþÖ'þ³þãýfÅý?¨ý‹ýîÿrýÄÿYý˜ÿDýmÿ/ýCÿýÿ ýðþÿüÇþóü¢þêü|þäüXþàü8þÝüþÞüþýáüãýçüÈýïü²ýúüŸý ýŽýý†ý-ýýBý~ý[ý}ýxý|ý•ý~ý¶ý‚ýÙý‹ýÿýšý'þ¯ýQþÆý|þÝý§þôý×þ þÿ$þ8ÿ?þjÿ_þÿþÐÿ¤þÈþ4ìþdÿ–1ÿÇTÿövÿ#™ÿP¼ÿ{áÿ£É$íGh,†G¤_ÀsÛ…÷”ž+§D¬^®s­Š¨ž ±•ćÔwåfõQ:"".í8ÏB¯JRmYK_(bcädÂ`ž[zUXL5C7ôÿ'Óÿ²ÿ“ÿétÿÏWÿ³:ÿ•ÿtÿRéþ,Ïþ¸þÛ¡þ°‹þƒwþVcþ'SþøÿCþÉÿ4þ˜ÿ&þhÿþ6ÿþÿ þ×þþ©þýý}þûýRþúý)þûýþþýÝýþ¹ý þ˜ýþ{ý!þcý/þQý?þAýSþ3ýgþ$ý~þý–þý²þýÐþýîþýÿ*ý/ÿ7ýQÿEýwÿUýœÿfýÃÿ}ýêÿ—ýµý:Õý`öýˆþ®9þÔ\þúþ¦þBÍþcôþƒÿ¡Cÿ½jÿ×’ÿìºÿàÿ '-K7o=‘@´@Õ=ô8.0#Lhô˜ß¯Èưڕìxÿ[=)ü3Ü=¼F›MyQWR6QMöÿGÖÿB·ÿ:™ÿ0|ÿ#`ÿEÿ*ÿêÿÓ÷þ¹áþÊþ€´þa¢þAþ~þûnþÕ_þ®Rþ‡Eþ^8þ5.þ #þäÿþ»ÿþ’ÿþlÿ þCÿ þÿ þúþ þØþ þ¶þþ˜þþ{þþ`þ!þEþ,þ-þ7þþEþ þUþþfþùýyþòýŽþëý£þçý»þæý×þçýòþîýÿøý/ÿþPÿþrÿ"þ”ÿ2þ¹ÿ@þÞÿTþiþ*þQ˜þw±þžÊþÆãþëûþÿ60ÿZJÿ}dÿž~ÿ½˜ÿÚ²ÿöÌÿäÿ$þÿ7G,VE`[isn‰pŸnµjÊcàWõJ :'1DúWáiÃ|¥Œ†œe¬CºÈúÔÕá®ê‰òb÷<úüóÿüÏÿû«ÿù‡ÿñeÿçEÿÛ%ÿËÿ¸éþ£Íþ‹´þq›þU†þ6pþ[þñKþÊ;þ¢-þy þMþ þõÿþÇÿÿý˜ÿúýkÿ÷ý<ÿõýÿöýâþúý¶þþý‹þþbþ þ>þþþþùý*þÙý9þ»ýHþ ýZþŠýmþzý‚þoý˜þeý±þ]ýËþYýæþWýÿYýÿ_ý@ÿjýaÿzý‚ÿ‹ý¦ÿ ýÉÿ¸ýíÿÏýéý6þ^&þ…GþªkþÓþøµþÚþBÿf&ÿ‰Mÿ©tÿÉšÿèÀÿæÿ  7/MT`wo˜}¸‡ÖŽô’“.‘Hc…|z“kªY½EÑ/âó÷Ù¸•)r3L=%EýLÒR¨V}VQV&TüÿOÓÿI§ÿC}ÿ9Tÿ.,ÿ!ÿÞþû¹þæ•þÎsþ´Sþ™4þ{þ\üý:ãýÌýòµýÉ¢ý¡ýx€ýMrý"gýøÿ]ýËÿTýŸÿOýtÿKýHÿHýÿIýòþJýÈþNý þVý|þ^ýYþhý7þtýþ‚ýùý’ýÝý¥ýÄý¹ý®ýÑýýêýýþ…ý!þ|ýAþuýaþpý„þnýªþpýÑþvýùþ~ý$ÿ‹ýPÿšý}ÿ©ý«ÿ»ýÛÿÍý áý:øýlþŸ+þÓFþbþ:€þlžþœ¼þÍÛþûúþ*ÿV8ÿ€Xÿ©wÿЗÿó·ÿ×ÿ0õÿKa0tN†l‘‰š§Ÿáßžü—2~LlfV~<– ­Ãß×»ë”þi=!1à=®F|NIRWáY«YvWBP GÛÿ<§ÿ,uÿDÿÿëåþѸþµŒþ”`þs8þMþ&ìýþÊýÓ«ý§ŒýznýLSý;ýðÿ$ýÁÿý’ÿüücÿíü5ÿÞüÿÑüÝþÉü³þÂüŽþ½üjþ¹üHþ¸ü)þºü þ¼üñýÃü×ýËüÄýÕü´ýâüªýòü£ýýžýýœý.ýýGý ýaý¦ý~ý±ýý¿ý¿ýÑýãýæýþûý1þþ[þ*þ†þCþ²þ_þâþ{þÿ™þAÿºþtÿÛþ§ÿûþÛÿÿ =ÿ@]ÿs}ÿ§›ÿÚºÿ Ùÿ?öÿn/ËKõfEšh±ŒÈ«ßÇóß ö 0D$U-f2w4‡3•.¤'²¿ËþÖëàÔë»ò¢ú„þfG%Üÿ¶úòièBÛÌóº̧¢‘zyU_.B"åÿÀÿÜžÿ¶{ÿ‘Yÿh9ÿ>ÿûþëÿßþ¿ÿÄþ“ÿ©þhÿ‘þ<ÿyþÿcþåþOþ»þ<þ“þ,þmþþIþ þ(þþþ÷ýêýíýÌýæý²ýâýœýÝýŠýÚý{ýÛýqýÝýjýáýeýæýaýîý^ý÷ý`ýþeýþpý þý3þýFþ¢ý\þ·ýsþÉý‹þßý¥þ÷ýÀþþßþ1þüþPþÿpþ=ÿ‘þ^ÿ²þ€ÿÔþ£ÿõþÄÿÿåÿ;ÿ^ÿ)ÿK¦ÿlÊÿîÿ¬Ê3çVx™0ºEÚWúhw9ƒXŒv”“—®˜É˜á•ú‡%~:pMbaSqA-•ë¢Ô£º¤¢£ˆžn—T; mXñÿBØÿ)Àÿ ªÿï•ÿ΀ÿ«mÿ…\ÿ^Iÿ29ÿ)ÿÙÿªÿ|ÿKüþóþíÿìþ½ÿåþÿàþ]ÿÜþ/ÿÙþÿ×þÖþÕþ¬þÖþ†þØþaþÚþ?þÝþ!þâþþçþæýìþÍýóþ¸ýûþ¨ýÿœý ÿ“ýÿŽý%ÿ‰ý3ÿ‡ýAÿ†ýOÿ‰ý_ÿýpÿ›ý‚ÿªý—ÿºýªÿÍýÁÿÞý×ÿïýîÿþþ0þ7IþQdþlþ‡›þ¤¶þÀÐþÜëþøÿÿ/:ÿISÿdnÿ}Šÿ•£ÿ¬½ÿÁÖÿÔïÿçö5Kd!z&‘'©&À"×íù-çBÓV½i¥~Š‘l£M³+ÂÐåÜ¿æ˜ðpøHÿ øÿÏÿ¦ÿú}ÿõTÿì.ÿßÿÒâþÀ¾þ­œþ–zþ}Zþa<þDþ$þîýà×ý¼Äý–±ýp¢ýI•ýŠý÷ÿ€ýÏÿxý¥ÿtý|ÿqýUÿpý/ÿrý ÿuýéþ{ýÈþýªþŠýŽþ–ýqþ¤ýWþ±ý@þÂý+þÓýþçýþýý þþþ+þþEþþý`þþý|þþ™þþ¹þþÙþ"þúþ3þÿEþBÿVþgÿhþŒÿ|þ²ÿ“þÚÿ«þÅþ'âþPþþzÿ£7ÿÍSÿöpÿŒÿH©ÿnÅÿ“áÿºþÿß5%PEjc„€œ™µ°ÌÆãØúéö';N b r ‚“û¢ñ®â»ÐǼӥ܊ânèPë-í íåì¼ê”äkÝ@ÒÅæ¶º¤Œ^{1cI×ÿ/¬ÿÿðWÿÍ-ÿ©ÿ„Þþ\¸þ4”þ rþãÿQþºÿ2þÿþgÿúý>ÿáýÿÊýëþµýÃþ¢ýžþ‘ýyþýVþuý5þjýþaýüýYýãýTýÍýSý·ýRý¤ýSý“ýUý‡ý[ý€ýbý}ýjý|ýuý~ýýýý„ý¢ýŠýµý”ýÈý¢ýßý´ý÷ýÉýþàý-þ÷ýJþ þkþ$þ‹þ=þ­þXþÑþtþöþ’þÿ³þEÿÓþnÿóþ˜ÿÿÃÿ2ÿîÿSÿrÿC‘ÿp³ÿÔÿÈõÿó5IUqu™”¾±ãÐï% C*]HvfŒƒŸŸ°»½ÕÇîÍÐÑ4ÍKÇa¾u±‡ —¤x¯a¹FÀ(Å ÇèÇÄà¾z´R§)—†×p­V‚:Y/ûÖÞÿ¯µÿ†ŽÿXiÿ+Dÿü"ÿÊÿþ˜Þþf¿þ1¢þþÿ‡þÊÿnþ•ÿVþaÿ?þ.ÿ+þûþþÊþþ›þùýmþíýDþâýþØý÷ýÒýÓýËý±ýÇý“ýÆýwýÅý_ýÆýNýÊýAýÎý8ýÔý.ýÜý&ýæý!ýñýýüý!ý þ(ýþ5ý+þCý>þRýSþeýhþvýþ‡ý˜þœý²þµýÍþÎýéþëýÿ þ'ÿ'þFÿGþgÿeþŠÿ„þ­ÿ¤þÑÿÄþöÿåþÿ>'ÿcIÿ‰jÿ®ŒÿÒ®ÿ÷Îÿïÿ= `-NŸm½Ú¬óË ê#8$H@V[ctlŽs©wÀyØxítmc#W1H?6J"S Zó_Ùa¼`Ÿ]€W_N<C5ö%Ñ­þˆæbÌ=¯‘öÿpÒÿN®ÿ*ÿjÿßIÿ¸*ÿ ÿiîþ@Òþ¹þðÿ þÊÿˆþ¢ÿrþ{ÿ^þVÿLþ3ÿ;þÿ*þóþþÖþþ¸þþœþÿý‚þøýjþóýWþîýHþìý:þëý0þìý&þïýþñýþøýþþ þ þþþþþþ,þ%þ;þ+þLþ3þ^þ=þrþHþ‡þVþþfþ¶þvþÏþˆþêþ›þÿ­þ"ÿÁþ?ÿÖþ`ÿéþÿÿþ ÿÿÀÿ+ÿáÿCÿ\ÿ$uÿFŽÿg§ÿ‰¿ÿªÙÿËôÿê %(AB[^ww’Ž®¥ɸãÊýØæ.ðGù`ÿwŒ ²ýÃöÒíàâëÔõÅü²Ÿ‹tý\÷Bí'â ÕðÄÓ±·™š€{e_GB(% âðÿ¾Õÿ˜¼ÿs¤ÿK‹ÿ"tÿûÿ_ÿÓÿKÿ¬ÿ9ÿ„ÿ'ÿ]ÿÿ5ÿ ÿÿûþîþïþÍþåþ®þÛþþÓþuþÌþ]þÅþEþÁþ0þ¿þþ¼þ þ»þþºþüý½þ÷ý¾þõý¿þòýÅþñýÉþñýÏþ÷ýÕþþýÜþ þäþþîþ(þøþ9þÿHþÿYþÿkþ*ÿ~þ7ÿ“þHÿ©þXÿÃþiÿÛþ{ÿôþÿ ÿ¤ÿ%ÿ·ÿ<ÿÌÿTÿâÿnÿùÿ†ÿ  ÿ$»ÿ<ÔÿSîÿkƒ ›:²QÊißõš ³Ë0ä@ýP^+kBwVl…€Š“Œ¨‹º‹Ì†Ûévöj] N<(ûáÈ« pôPå2Ó¿óÿ§Òÿ²ÿs’ÿUrÿ7Tÿ6ÿôÿÐüþªâþ…Èþ^¯þ7šþ…þéÿrþÂÿaþœÿRþvÿDþOÿ:þ+ÿ1þÿ(þæþ%þÇþ!þ©þþŒþ þqþ!þXþ&þ@þ+þ,þ4þþ=þ þHþþVþùýcþòýqþëýƒþçý•þäý©þäý½þèýÓþïýêþúýÿþÿþ2ÿþKÿ'þgÿ6þƒÿEþŸÿWþ¼ÿkþØÿ€þ÷ÿ—þ¬þ1ÄþQÛþoòþ ÿ¯#ÿÐ=ÿîXÿtÿ-ÿKªÿhÅÿ†àÿ¢üÿ½Ø2ñN j †5¢H¿ZÚhôv'‰>‘V”o•„”𑝉¿€ÏuÜfèTó@ü+ö Ú º˜ÿtõQê*ÝÍØ»®¦„Xv-[=×ÿ¬ÿþÿÛUÿ¸*ÿ”ÿoÙþK²þ&þjþÝÿHþ¹ÿ&þ”ÿþqÿëýNÿÐý,ÿ·ý ÿ ýîþ‹ýÒþxý¹þiý þZý‹þNývþDýdþ=ýUþ8ýFþ5ý;þ3ý3þ3ý.þ6ý+þ;ý)þAý)þJý+þTý-þaý3þpý;þ€ýGþ‘ýSþ¤ý`þ¹ýnþÐý{þèýŠþþšþþªþ;þ¾þZþÐþ{þæþ›þûþÀþÿâþ%ÿÿ9ÿ.ÿOÿTÿeÿ}ÿ{ÿ§ÿ’ÿÐÿªÿúÿÂÿ#ÚÿOôÿz ¥#Ñ:üQ(kR„{Ÿ£¸ÊÑïì7W5vL“d¬zÄ‘Ø¦ê»øÎÝìú "ö#å!Ó½¥ŠkôLâ+θ㠽…•gkGA&ëÝ¿·•‘jh?@íÿîÿÄÿÅÿÿ›ÿuÿsÿPÿJÿ+ÿ$ÿ ÿþþèþÙþÉþ¶þ«þ”þþuþuþXþ]þ=þEþ"þ0þ þþöý þâýýýÓýðýÆýåý»ýÚý¶ýÒý°ýÌý«ýÅý§ýÃý¦ýÁý©ýÂý®ýÄý·ýÇýÁýÌýÌýÒýØýÙýåýâýóýëýþøýþþ(þþ>þ%þUþ5þkþIþ„þ]þþrþµþˆþÐþ þéþ¹þÿÓþ"ÿîþ?ÿ ÿ^ÿ'ÿ}ÿCÿÿbÿ¼ÿÿÜÿ¡ÿýÿÁÿáÿ;] ~@ž`À€áž½"ÛAö`,œE¸[Óqî„—¦.´A¿SÉ`ÐmÔvØ}ÙÖ‚ÓÌ~Ãw¹n¬bžRŽB|/iTÿ?å'Ȫö‹ÜiÃF¨!ýsØY²?Œ%f ?òÿÜÿöÿÄÿÒÿ®ÿ¯ÿ˜ÿÿ„ÿjÿqÿJÿ]ÿ,ÿMÿÿ<ÿóþ,ÿØþÿÀþÿ©þÿ”þþþ‚þõþrþíþcþçþWþáþKþÝþ?þÛþ5þÙþ-þØþ'þØþ$þÜþ"þÞþ!þáþ!þåþ#þëþ#þóþ$þùþ)þÿ-þ ÿ3þÿ:þ#ÿDþ0ÿNþ=ÿXþJÿbþXÿmþjÿyþ{ÿˆþŒÿ—þŸÿ§þ²ÿ¸þÇÿËþÙÿàþîÿôþ ÿÿ,6ÿANÿWfÿm‚ÿ‚ÿ˜¹ÿ­ÖÿÁòÿÔè*ùG c‚( 5½@ÙJôSY']>aUaj`|\ŽWœQ¨G²<º0À!ÄÄþÃí¿Ù¸Ä®²£ –†{tiaWMD6.ëëÿÐÔÿ´ºÿ™£ÿ~ŒÿctÿG_ÿ+Hÿ2ÿúÿÿâÿ ÿÉÿýþ²ÿîþœÿáþ‰ÿÙþwÿÐþfÿÈþVÿÃþGÿ¾þ9ÿ¹þ.ÿ¶þ$ÿ´þÿ²þÿ³þÿµþ ÿ·þ ÿºþÿ¿þÿÅþÿÊþÿÒþ ÿÚþ ÿâþÿíþÿ÷þÿÿÿÿ ÿÿ(ÿ)ÿ.ÿ:ÿ5ÿKÿ?ÿ\ÿEÿpÿOÿƒÿVÿ—ÿ`ÿªÿiÿ¿ÿsÿÒÿ~ÿæÿ‰ÿ÷ÿ•ÿ ¡ÿ¯ÿ1½ÿEÊÿXØÿmèÿ€÷ÿ”§¹)Î:ßLò^o‚)”:§J¹ZÉgÚrêùŠ•ž¥*ª4«:ª@¨C¦D¡Cœ@•<‹6}/m$\I 4úèÔî¿Õª¹“œz~a^G>,ÿÿøÿáÿÝÿÃÿÃÿ¤ÿ©ÿ…ÿÿgÿuÿGÿ\ÿ+ÿEÿÿ0ÿôþÿÛþÿÃþõþ­þãþ™þÔþˆþÇþvþ¼þgþ°þZþ¨þNþŸþDþ™þ=þ•þ8þ“þ4þ’þ3þ“þ4þ•þ5þ—þ9þšþ<þþCþ¢þLþ©þVþ±þbþ»þoþÅþ~þÎþŒþ×þ›þàþ«þëþ»þ÷þÎþÿâþÿöþÿ ÿ.ÿ!ÿ=ÿ6ÿLÿLÿ[ÿbÿlÿzÿ}ÿ‘ÿÿ¨ÿ¢ÿÀÿ´ÿ×ÿÉÿñÿßÿõÿ 9 P8hOh™‚°šÈ´ßÎõç !64JL]eoz‘Ž¥œ¶¨È´ØÀæÈòÐýÓÓÔ Ò ÏËÅü»ñ°å¡Ö‘Å~°jšT€?g(L.ô×ï¹Ïš­z‰Zg;E#ýÿßÿáÿ¿ÿÀÿŸÿ¡ÿÿ‚ÿ`ÿcÿBÿGÿ'ÿ,ÿ ÿÿòþúþÙþäþÄþÏþ­þ½þ™þ¬þˆþþvþþhþƒþ[þwþNþoþFþfþ?þcþ9þaþ5þ]þ3þ[þ1þXþ2þVþ3þWþ7þ[þ=þ_þEþdþMþiþWþmþbþsþmþwþyþ}þ†þ…þ”þþ¤þ•þµþ þÇþ«þÚþ·þïþÂþÿÏþÿÜþ*ÿëþAÿúþXÿ ÿoÿÿ‡ÿ/ÿžÿCÿ¹ÿYÿÓÿoÿíÿ†ÿŸÿ·ÿ:ÑÿVëÿpŒ §=ÃZÞvù“±-ÎFé_u Œ9¡Q³hÈ}Ú’ê¤ø³Á ÍÖÛàââÝ× ÑýÅî¸Þ¨Ë–¸„¢oYsAW(:òú×Ù»·Ÿ–‚thPK./ éÿýÿÅÿäÿ£ÿÌÿ‚ÿµÿbÿŸÿCÿ‰ÿ%ÿvÿÿdÿíþTÿÒþEÿ¹þ7ÿ£þ*ÿþÿyþÿiþÿYþþþKþøþ?þðþ5þëþ-þäþ&þÞþ"þÙþþÖþþÓþþÑþþÏþ!þÎþ&þÍþ+þËþ2þÉþ:þÈþBþÉþLþÌþVþÎþcþÒþqþÖþ€þÛþþàþŸþåþ­þíþ¿þ÷þÑþÿäþ ÿ÷þÿ ÿ&ÿ ÿ6ÿ4ÿHÿKÿYÿbÿlÿwÿÿÿ–ÿ§ÿ®ÿ¿ÿÇÿØÿàÿñÿøÿ!-<HUcp‰š£µ½ÎÔçìÿ-0BGUZgnt€€Ž‹›“§™²œ¼œÅ›Í—БшÑ}ÍpÉaÁO¹<¯(¤™ý‰æxÏdµOœ;%hPö6ÝÅ«óÿ‘ÝÿvÈÿ\³ÿB ÿ(ÿÿùÿoÿáÿbÿÊÿWÿ´ÿLÿŸÿAÿŠÿ6ÿvÿ+ÿeÿ#ÿSÿÿBÿÿ4ÿÿ&ÿ ÿÿ ÿÿÿÿÿþþþúþöþõþîþóþèþñþãþîþàþëþÞþéþÞþåþÞþâþÝþßþßþÝþßþÜþâþÝþåþÝþéþÝþïþàþóþâþúþåþÿéþÿïþÿõþÿþþ"ÿÿ+ÿÿ6ÿ#ÿAÿ0ÿMÿAÿZÿTÿgÿfÿtÿ{ÿ‚ÿ‘ÿ‘ÿ§ÿ ÿ¿ÿ¯ÿØÿ¾ÿòÿÎÿ ßÿ'ðÿD_z"–4²DÌSäbýt‚+‘@ R®bºpÃ}̇ÔÛ”â—ç˜ê—ì’ëŒèƒãyÝkØ]ÐNÆ<¼*±¤•ì…×tÀc«Q•@.jU Bøÿ.æÿÓÿÁÿùÿ°ÿéÿ ÿÙÿ’ÿÍÿƒÿÁÿvÿµÿjÿ«ÿ^ÿ¡ÿTÿ˜ÿLÿÿDÿ‡ÿ?ÿ€ÿ:ÿ{ÿ7ÿuÿ5ÿqÿ5ÿkÿ6ÿgÿ8ÿaÿ;ÿZÿ@ÿSÿFÿNÿKÿJÿQÿGÿYÿBÿaÿ<ÿkÿ6ÿuÿ/ÿ€ÿ(ÿŒÿ!ÿ•ÿÿ¡ÿÿ­ÿÿ·ÿÿÃÿ ÿÏÿÿÜÿÿèÿÿõÿÿÿ ÿ ÿ! ÿ-ÿ8ÿC%ÿO1ÿ[<ÿfKÿrXÿ}iÿˆ{ÿ”ÿž¡ÿ©µÿ³Ìÿ¾âÿÊøÿÓÞ%ê;òQúf{ £µÅ%Ô(á,ë,ô,û)(&"û ôþìñâäÖÓÈ»±­ž›‰ŠryZgAW'D 4óÿ$Úÿ¿ÿ£ÿùÿ‡ÿíÿmÿßÿQÿÔÿ6ÿÉÿÿÀÿÿ¹ÿêþ±ÿÒþ¬ÿ¼þ©ÿ§þ§ÿ•þ¥ÿ„þ¤ÿsþ¢ÿdþ¡ÿXþ ÿNþ¢ÿDþ¤ÿ<þ¦ÿ5þ©ÿ2þ«ÿ1þ­ÿ2þ¬ÿ3þ­ÿ7þ­ÿ=þ­ÿDþ¯ÿLþ°ÿVþ¯ÿbþ®ÿnþ«ÿ{þ¨ÿŒþ¥ÿþ£ÿ®þŸÿÁþÿÔþšÿçþ˜ÿüþ—ÿÿ•ÿ&ÿ“ÿ>ÿ“ÿUÿ”ÿlÿ”ÿ„ÿ—ÿœÿšÿµÿŸÿËÿ§ÿäÿ­ÿýÿ·ÿÀÿ-ÌÿFÙÿ^æÿwôÿ¨¿&×:îLat3‡Iœ^¯p„Ó—æ§ö¸ÇÕã%î-ø2ÿ587 2 , % ýòñæàÙÍɸ¸¤¦“v{_cFH,,ýÿòæÿÓÏÿ´¸ÿ•¤ÿtÿS|ÿ1kÿXÿðÿJÿÏÿ<ÿ¯ÿ/ÿÿ%ÿqÿÿQÿÿ5ÿ ÿÿÿþþÿåþÿÍþýþ·þúþ¢þúþþûþ}þüþmþÿþ_þÿSþÿIþÿ?þÿ7þÿ3þÿ.þÿ+þ ÿ*þ ÿ)þ ÿ+þ ÿ.þ ÿ2þ ÿ8þ ÿ@þÿGþÿQþÿ[þÿeþÿoþÿ|þ ÿŠþ%ÿ˜þ+ÿ¦þ3ÿ¶þ<ÿÇþFÿ×þQÿéþ_ÿûþoÿÿ~ÿ#ÿÿ7ÿ£ÿJÿ¸ÿ`ÿÍÿvÿäÿ‹ÿüÿ£ÿºÿ.ÑÿJéÿd2¹KÔeï —"°;ÆSÞiö} $Ÿ9¬O·`ÁpÈ̎͛ͧɲú»¾°Â£Ã–Á…¿rº_µI­4£—‰ëwÓeºS¡>Š)r[ûDâ.È­“ôÿxãÿ]ÑÿCÃÿ'´ÿ¦ÿõÿšÿÞÿÿÄÿ…ÿ­ÿzÿ˜ÿpÿ‚ÿgÿoÿ_ÿ[ÿXÿIÿPÿ9ÿJÿ)ÿCÿÿ;ÿÿ4ÿÿ*ÿúþ"ÿóþÿëþÿåþ ÿáþÿÞþûþÛþñþÚþçþÛþÝþÜþÕþÞþÌþáþÃþåþ¼þéþ¶þïþ¯þóþªþùþ¥þÿ¢þ ÿ þÿžþÿŸþ#ÿ¢þ-ÿ¦þ6ÿ®þAÿ¶þKÿÁþVÿÎþcÿÜþnÿëþ|ÿüþ‰ÿÿ–ÿ$ÿ¤ÿ<ÿ³ÿTÿÀÿmÿÏÿˆÿÞÿ¢ÿïÿ¾ÿÿÿÚÿ ÷ÿ..>KNf]€lš|²ŒÉ›Þªò¹ÅÐ Ü+å6î=÷BþCDC > 9 3+"û ôþëðáâÔÕÇÆº¶ª©œœŒ|‚ivWkDa1WM Eüÿ>êÿ8×ÿ2Æÿ.¶ÿ*¦ÿ'–ÿ"ˆÿzÿnÿbÿWÿNÿGÿ ?ÿ9ÿ3ÿýÿ0ÿ÷ÿ,ÿïÿ*ÿéÿ+ÿâÿ)ÿØÿ,ÿÎÿ-ÿÄÿ/ÿ¹ÿ2ÿ«ÿ5ÿ ÿ9ÿ”ÿ>ÿ‡ÿFÿ|ÿKÿpÿQÿeÿXÿYÿ^ÿOÿeÿFÿmÿ<ÿvÿ4ÿ~ÿ-ÿ‡ÿ)ÿÿ%ÿ˜ÿ$ÿ¢ÿ%ÿ¬ÿ%ÿ¶ÿ)ÿÀÿ-ÿÉÿ4ÿÔÿ<ÿàÿFÿìÿQÿ÷ÿ_ÿoÿ}ÿŽÿ' ÿ3³ÿAÆÿNÙÿ[íÿivƒ';œK©\µmÁz·ؓáé¦ð¬÷±ý³´³ ±¬§ —ûóƒíxäkÚ_ÍQ¾D¯7Ÿ*Ž}jWüÿDóÿ.éÿáÿÚÿòÿÓÿÝÿÏÿÊÿÊÿ·ÿÈÿ£ÿÆÿÿÅÿ~ÿÆÿlÿÆÿ\ÿÇÿLÿÉÿ?ÿËÿ3ÿÌÿ'ÿÏÿÿÓÿÿÕÿ ÿÙÿÿÜÿÿÜÿÿÛÿýþÛÿüþÛÿýþÚÿÿþÙÿÿØÿÿÔÿ ÿÑÿÿÌÿÿÆÿ ÿÀÿ(ÿ¹ÿ2ÿ²ÿ<ÿ«ÿFÿ¤ÿPÿœÿ[ÿ–ÿgÿÿrÿŠÿ~ÿ„ÿ‰ÿ€ÿ•ÿ{ÿ¡ÿwÿ­ÿuÿ¹ÿuÿÆÿvÿÒÿyÿÝÿ{ÿéÿ‚ÿöÿ‰ÿÿ šÿ¥ÿ#±ÿ/Áÿ;ÏÿFÞÿSñÿ^ju$8ŒM˜_¤q®ƒ¸•¥̴ÖÂàÐèÛïåöìúóÿ÷ùú ÷ ó ï èßÕúÉó¼ë¯â¡ØË€½p®`O>y.g S?,öÿêÿÞÿìÿÔÿÖÿËÿÀÿÄÿ«ÿ½ÿ•ÿ¸ÿ€ÿ´ÿkÿ¯ÿXÿ­ÿGÿ¬ÿ5ÿ«ÿ$ÿªÿÿ¬ÿÿ­ÿùþ­ÿîþ°ÿâþ±ÿÚþ´ÿÔþ¶ÿÍþ¶ÿÈþ·ÿÅþ¶ÿÃþµÿÃþ´ÿÄþ´ÿÆþ±ÿÊþ°ÿÎþ­ÿÕþ§ÿÜþ¢ÿäþœÿíþ•ÿ÷þÿÿ‰ÿ ÿƒÿÿ|ÿ'ÿuÿ5ÿoÿCÿiÿPÿdÿ_ÿ_ÿoÿZÿ~ÿVÿŽÿTÿžÿSÿ®ÿTÿÀÿWÿÐÿZÿáÿ^ÿóÿdÿlÿuÿ$ÿ5‹ÿF˜ÿW§ÿi·ÿzÆÿŒ×ÿéÿ®ûÿ¾ Ðà3ðDþX jz(Š6˜C§N³Y½aÇhÎoÔtØwÚ{Ú}Ù}×zÑuËnÄgº^°T¥I™;‹,~o`óRßEÉ6±(šfLûÿ1ñÿèÿüÿàÿâÿÙÿÇÿÓÿ¬ÿÏÿ’ÿËÿyÿÈÿ^ÿÆÿHÿÆÿ1ÿÅÿÿÆÿÿÇÿóþÈÿßþÉÿÏþÌÿ¿þÍÿ±þÐÿ¥þÒÿšþÓÿ’þÕÿ‰þÔÿ‚þÔÿ~þÑÿyþÑÿwþÐÿvþÍÿxþÊÿ{þÆÿ~þÃÿ‚þ¼ÿ†þµÿŽþ±ÿ•þ©ÿþ¤ÿ§þÿ±þ–ÿ¼þÿÈþŠÿÔþ„ÿàþÿíþ{ÿûþwÿ ÿuÿÿsÿ&ÿtÿ6ÿtÿGÿxÿWÿ|ÿhÿÿyÿ‡ÿ‰ÿÿ›ÿ™ÿ®ÿ¤ÿÁÿ±ÿÓÿ¾ÿæÿÍÿúÿÜÿ îÿþÿ4G \2qE†W™j­zÀ‹Ô›éªü¹Å Ð1ÚAàPç]ëjívîí‹ê’å–à›ÙΜĸœª˜ž’Š€€pt`gQXBI19"&ýûÿèïÿÑâÿ»Øÿ£ÏÿŒÇÿrÀÿ[¹ÿD³ÿ*¯ÿ«ÿüÿ©ÿæÿ§ÿÏÿ¥ÿ¹ÿ¤ÿ¤ÿ¢ÿ‘ÿ£ÿ~ÿ¢ÿjÿ¢ÿYÿ£ÿJÿ¢ÿ;ÿ¡ÿ-ÿŸÿ ÿÿÿœÿ ÿ™ÿÿ–ÿøþ”ÿòþŽÿëþ‰ÿæþ„ÿãþ~ÿßþwÿÜþpÿÝþiÿÜþbÿÝþZÿÝþSÿàþMÿâþFÿåþ@ÿéþ:ÿíþ5ÿðþ1ÿ÷þ.ÿþþ,ÿÿ+ÿ ÿ-ÿÿ/ÿÿ4ÿ#ÿ9ÿ,ÿ@ÿ6ÿIÿ>ÿRÿJÿ]ÿUÿlÿaÿ{ÿlÿŠÿyÿœÿ‡ÿ®ÿ”ÿÁÿ¡ÿÕÿ¯ÿéÿ¾ÿÿÿÍÿÛÿ)ëÿ?úÿS i~'’8¤F¶UÅdÔqã~ïŒø™¥° ºÁÉÎÒ ØÚÝúÞñÝæÚÝ×ÓÐÇ̺ů½£µ–«‹¡—t‹karWfNYFK?>922&-* '$øÿ îÿäÿÛÿÔÿÌÿÅÿÀÿ»ÿ ¶ÿ³ÿ°ÿþÿ­ÿøÿ¬ÿñÿ«ÿêÿªÿâÿ¬ÿØÿ­ÿÎÿ®ÿÄÿ±ÿ¸ÿ²ÿ«ÿ´ÿŸÿ·ÿ“ÿ¹ÿ†ÿ½ÿzÿÀÿlÿÄÿ_ÿÈÿRÿËÿFÿÎÿ:ÿÑÿ.ÿÔÿ%ÿØÿÿÛÿÿßÿÿãÿÿçÿÿëÿÿïÿÿòÿÿöÿÿúÿÿÿÿÿÿÿ (ÿ3ÿ@ÿNÿ!]ÿ(lÿ-}ÿ4Žÿ:Ÿÿ@²ÿGÂÿMÔÿTåÿ[öÿbhm!r0v<yG}QZƒa…h„m„pr~t{svrrpjmciYeO`E]9W-S NHDöÿ?åÿ;×ÿ9Æÿ6¶ÿ5¨ÿ4–ÿ3ˆÿ4yÿ6jÿ8\ÿ;Oÿ>DÿB7ÿH-ÿL$ÿOÿTÿYÿ^ ÿcÿhÿmÿpÿrÿsÿt ÿsÿsÿqÿn&ÿi0ÿd:ÿ]DÿUOÿMZÿCfÿ9rÿ/€ÿ#ÿ›ÿ ªÿ¸ÿ÷ÿÅÿêÿÓÿÝÿßÿÑÿîÿÆÿûÿ½ÿ³ÿªÿ#£ÿ/ÿ=˜ÿI”ÿV‘ÿbÿoÿ{’ÿ…”ÿ’™ÿžŸÿ©¤ÿ³¬ÿ¾´ÿʼÿÓÇÿÝÑÿçÜÿðçÿøòÿþÿ #",&2*9,>.B0F/F.G+F(E"A>9 2,÷#êÜ;ÿÿ®öÿ›ìÿŠãÿvÚÿaÐÿLÈÿ7Áÿ"¹ÿ ´ÿöÿ®ÿáÿ«ÿËÿ§ÿ¶ÿ¤ÿŸÿ¢ÿŠÿ¢ÿuÿ¤ÿbÿ¦ÿNÿ©ÿ<ÿ«ÿ+ÿ°ÿÿµÿ ÿºÿýþ¿ÿïþÄÿãþÊÿØþÑÿÐþØÿÇþÝÿÀþäÿ¼þéÿ·þëÿ³þðÿ±þõÿ°þ÷ÿ°þúÿ³þüÿµþýÿºþúÿÀþùÿÄþøÿÊþôÿÒþñÿÚþíÿâþèÿíþåÿ÷þßÿÿØÿ ÿÔÿÿÎÿ$ÿÊÿ1ÿÅÿ=ÿÀÿKÿ¼ÿYÿ¹ÿfÿ¶ÿvÿµÿ…ÿ´ÿ”ÿµÿ¢ÿ·ÿ²ÿ¹ÿÂÿ¼ÿÒÿÁÿâÿÇÿóÿÎÿØÿâÿ$ìÿ5øÿFX iz)‹7›F¬S¼bÍpÝ}í‰û•Ÿ© ²*¹4À>ÆFÈLËQËTÊVÉWÄVÀT¸P²JªEŸ<•1‹'s gþ[íNÜBÊ6µ*£Žz fPúÿ;óÿ%ëÿåÿüÿàÿèÿÜÿÓÿÙÿÁÿ×ÿ®ÿÔÿœÿÒÿŠÿÑÿzÿÐÿiÿÐÿ[ÿÒÿNÿÒÿBÿÒÿ7ÿÕÿ-ÿÔÿ$ÿÑÿÿÑÿÿÑÿÿÏÿ ÿÎÿÿÌÿÿÉÿÿÅÿÿÀÿÿ»ÿÿ¶ÿÿ°ÿ ÿ¨ÿ ÿ¡ÿÿ™ÿÿ‘ÿÿ‰ÿÿÿ$ÿxÿ+ÿpÿ0ÿhÿ8ÿ_ÿ?ÿXÿGÿRÿOÿLÿWÿGÿ_ÿEÿiÿAÿsÿ?ÿ}ÿ@ÿ‡ÿ@ÿÿBÿšÿFÿ¥ÿJÿ±ÿPÿ¼ÿWÿÇÿaÿÔÿkÿáÿvÿíÿƒÿúÿÿÿ­ÿ!¼ÿ.Íÿ<ÜÿIíÿWþÿg s€,Œ:™I¥W°d»pÄz΄׌ߒä™éíŸñ¢ò¢ó¢ó ðžîšé–å‘݋օÍ}Äx¸q¬k¡d’]…WvSgNYHID9?)=; :ûÿ9îÿ8ßÿ9Òÿ8Äÿ8·ÿ9«ÿ;Ÿÿ;•ÿ=‹ÿ@ÿ?yÿ?rÿ@jÿ?dÿ?_ÿ<[ÿ;Wÿ9Tÿ5Rÿ0Qÿ+Pÿ$QÿPÿQÿ RÿUÿúÿVÿñÿZÿåÿ]ÿÙÿaÿÏÿeÿÂÿjÿ·ÿmÿ«ÿrÿŸÿwÿ•ÿ|ÿ‹ÿ‚ÿÿ‰ÿwÿŽÿoÿ•ÿiÿœÿdÿ£ÿ_ÿ«ÿ[ÿ²ÿYÿºÿXÿÂÿYÿËÿYÿÓÿ]ÿÜÿcÿçÿhÿñÿoÿûÿwÿÿ ‰ÿ•ÿ# ÿ-­ÿ7¹ÿCÇÿNÓÿZàÿdîÿmúÿwˆ‘'™0¡9¦@«G°M³Q´U·V·Y·Y¶X³W°S¬Q§M I˜C>ˆ9~2t-i)]#RF:/" þÿóÿèÿ Ýÿ Óÿ Éÿ Àÿ¸ÿ°ÿ¨ÿ¢ÿÿ˜ÿ!“ÿ%ÿ'Žÿ)Œÿ+‹ÿ,Šÿ,‹ÿ/‹ÿ.‹ÿ+ÿ)Žÿ%‘ÿ!”ÿ–ÿ™ÿÿ ÿ£ÿûÿ§ÿóÿ«ÿéÿ¯ÿßÿ´ÿÕÿ·ÿËÿ»ÿÂÿ¾ÿ¸ÿÂÿ¯ÿÆÿ§ÿËÿžÿÎÿ—ÿÒÿÿØÿŒÿÛÿ‡ÿßÿ‚ÿäÿÿéÿ}ÿîÿ}ÿóÿ~ÿøÿ€ÿýÿ„ÿˆÿŽÿ •ÿœÿ¥ÿ­ÿ&¸ÿ,Äÿ4Ïÿ:Ûÿ@èÿHóÿNU Za!f,j7pAsIvQyXz^{c{gzjzlwmtlqlkjfg`eX_PZHU>P4K*E>95ýÿ0òÿ+åÿ&Úÿ"ÍÿÃÿ·ÿ­ÿ¡ÿ—ÿ‘ÿ‡ÿ€ÿzÿsÿnÿjÿ#gÿ%dÿ(cÿ*bÿ-cÿ/dÿ0fÿ1iÿ3mÿ4rÿ3wÿ3|ÿ0‚ÿ-‰ÿ)‘ÿ$˜ÿ  ÿ¨ÿ±ÿ ºÿÂÿýÿÌÿóÿÖÿéÿßÿßÿçÿÕÿñÿÊÿûÿ¿ÿµÿ «ÿ¡ÿ™ÿ%‘ÿ-ˆÿ6‚ÿ>{ÿFuÿOqÿVoÿ^mÿglÿnmÿvmÿ|pÿ„tÿŒzÿ’ÿ™„ÿŸŒÿ¥”ÿ«ÿ°§ÿµ±ÿ¹»ÿ¾ÆÿÂÑÿÃÛÿÆåÿÉïÿËùÿËÊ ÉÅà ½'¸-³0¬3¥6œ7’9‡8|8p8c5T2G08,()%"ùÿêÿ×ÿÇÿ·ÿ¦ÿ–ÿ†ÿvÿ hÿZÿMÿAÿ5ÿ)ÿ ÿÿ ÿ%ÿ*ÿ/ýþ4ùþ9÷þ=õþAöþDõþIöþLøþOúþRþþSÿTÿTÿSÿQÿN%ÿJ-ÿF7ÿA@ÿ;Hÿ5Tÿ._ÿ%jÿtÿ€ÿ Šÿ—ÿúÿ¢ÿòÿ¯ÿçÿ¼ÿÞÿÈÿÕÿÔÿÍÿáÿÆÿîÿ¿ÿûÿ¹ÿ³ÿ¯ÿ#«ÿ0ªÿ>§ÿK§ÿZ¨ÿh©ÿu®ÿ„±ÿ‘µÿŸºÿ¬Áÿ¹ÈÿÇÎÿÓ×ÿßàÿìèÿöñÿúÿ ") .'1-32566;6<3?0@,?&?=: 83ö-ê)Ü#;® ŒxÿÿgùÿTôÿAîÿ.çÿäÿ áÿ÷ÿÝÿæÿÛÿÔÿØÿÂÿÖÿ²ÿÖÿ ÿ×ÿ’ÿÖÿƒÿ×ÿtÿÚÿfÿÝÿYÿßÿMÿãÿCÿæÿ9ÿêÿ0ÿíÿ)ÿðÿ!ÿôÿÿ÷ÿÿúÿÿþÿ ÿ ÿÿÿÿÿÿÿ ÿþÿ ÿûÿÿøÿÿôÿÿïÿÿèÿÿâÿ#ÿÝÿ(ÿ×ÿ/ÿÐÿ5ÿËÿ:ÿÃÿCÿ¾ÿJÿ¸ÿRÿ´ÿZÿ®ÿcÿªÿkÿ¥ÿtÿ£ÿÿ¡ÿ‰ÿ ÿ“ÿ¡ÿžÿ ÿªÿ¡ÿ¶ÿ¤ÿÂÿ¨ÿÎÿ®ÿÛÿ²ÿçÿ¸ÿôÿÀÿÈÿ ÐÿÛÿ(åÿ5ïÿBúÿN[gt&€1‹<•FŸP©Z°b¸j¿rÃwÈ{̀ф҇ՈՈӉчυ˂Ç~Â{»uµq®l¦fœ_”YŒTMwImBc;Y8M3C09,/(%&#! ýÿöÿîÿçÿáÿÚÿÖÿÑÿÌÿÇÿÄÿÁÿ½ÿ»ÿ¸ÿ ¶ÿ´ÿ²ÿ°ÿûÿ¯ÿõÿ­ÿíÿ¬ÿçÿ­ÿÝÿ¬ÿÔÿ«ÿÌÿªÿÂÿ«ÿ¸ÿ«ÿ®ÿ«ÿ¤ÿ­ÿšÿ­ÿÿ­ÿ†ÿ°ÿ~ÿ±ÿvÿ³ÿmÿµÿfÿ¸ÿ`ÿºÿZÿ¾ÿUÿÁÿPÿÅÿMÿÈÿMÿÍÿLÿÓÿMÿ×ÿMÿÝÿPÿáÿTÿçÿYÿíÿ^ÿôÿeÿùÿnÿvÿ~ÿ ‰ÿ”ÿŸÿªÿ!¶ÿ(Âÿ,Íÿ/Ùÿ3åÿ6ñÿ9ûÿ<< =< ='</;68<6@3D.G(J$MNOO PNþÿN÷ÿNïÿKéÿKâÿJÚÿIÓÿJÍÿIÆÿJÁÿJ»ÿI¶ÿJ²ÿJ®ÿL«ÿN§ÿP¦ÿR¤ÿU£ÿY¢ÿ\£ÿ_¤ÿc§ÿf¨ÿi¬ÿl®ÿo±ÿqµÿtºÿu¿ÿvÄÿwÉÿwÍÿuÓÿuÚÿsàÿrçÿoîÿlôÿjûÿd^WPG>!4'*- 17 ;@õÿEéÿJÝÿMÓÿQÉÿV¾ÿYµÿ]¬ÿa£ÿdÿh˜ÿl“ÿpŽÿr‹ÿv‹ÿyŠÿ}‹ÿ‹ÿ„ÿˆÿ‹”ÿŽšÿžÿ’¤ÿ“«ÿ•²ÿ—¸ÿ—Àÿ•Èÿ“Îÿ’Õÿ‘Üÿâÿ‰éÿ„îÿ€óÿzøÿtýÿme]RH>3(ÿÿøÿüÿëÿúÿÝÿöÿÐÿôÿÃÿðÿ¶ÿíÿ©ÿëÿÿçÿÿåÿ…ÿâÿzÿàÿpÿàÿfÿßÿ\ÿÞÿTÿßÿLÿÞÿEÿàÿ?ÿâÿ:ÿäÿ5ÿçÿ1ÿêÿ.ÿîÿ,ÿñÿ*ÿõÿ*ÿúÿ*ÿýÿ,ÿ,ÿ/ÿ 3ÿ6ÿ;ÿAÿFÿLÿ!Sÿ$Yÿ&`ÿ'hÿ(pÿ*xÿ)‚ÿ)‹ÿ&”ÿ%œÿ$§ÿ±ÿ»ÿÅÿÎÿ Øÿãÿïÿúÿÿÿüÿ÷ÿòÿ$ðÿ-ëÿ:èÿCèÿOåÿ[åÿdæÿpçÿzéÿ„êÿŽìÿ˜îÿ¡òÿ©öÿ±úÿ¸¿Ç ÍÓ×Ù!Ü(Þ-ß4Þ9Þ=ÛCÙGÕLÑNÌPÅS½TµS«S¡S—PŒOLuHhD[>N:@520%+&!ýÿïÿãÿÕÿ Éÿ½ÿ±ÿ¥ÿýÿ›ÿùÿÿöÿ‡ÿôÿÿòÿwÿðÿoÿïÿiÿðÿbÿðÿ\ÿïÿXÿðÿTÿïÿQÿðÿNÿðÿMÿóÿJÿóÿIÿóÿJÿõÿIÿôÿJÿóÿJÿòÿMÿòÿNÿïÿPÿîÿTÿëÿWÿèÿZÿæÿ^ÿâÿcÿÞÿhÿØÿmÿÒÿrÿËÿwÿÆÿ~ÿ¿ÿ„ÿ¸ÿŠÿ²ÿ‘ÿ«ÿ˜ÿ¥ÿ ÿÿ¨ÿ—ÿ±ÿÿºÿŠÿÂÿ„ÿÌÿÿÖÿ{ÿàÿyÿëÿwÿöÿuÿtÿ sÿtÿtÿ+wÿ7|ÿBÿN‡ÿYŽÿe•ÿpÿz§ÿ„¯ÿ·ÿ•ÃÿžÎÿ§Ûÿ®éÿ´õÿº¿ ÃÇ!Ç+È5Ç?ÈGÇQÄYÁ`½f·j¯o©s t—vxƒyyxovctWsKp>m2i%ea ]YöÿVëÿPßÿNÔÿJÉÿG¿ÿDµÿ@«ÿ>£ÿ<›ÿ<“ÿ;ÿ:‡ÿ;‚ÿ9}ÿ8xÿ9sÿ9pÿ:mÿ;jÿ:hÿ;gÿ;fÿ:dÿ:eÿ8fÿ6hÿ4hÿ2jÿ/lÿ+mÿ&pÿ!sÿvÿyÿ~ÿ‚ÿ…ÿùÿ‹ÿñÿÿçÿ”ÿÝÿšÿÓÿ ÿÉÿ§ÿÀÿ¬ÿ¸ÿ´ÿ®ÿ»ÿ¤ÿÃÿ›ÿÉÿ’ÿÒÿ‹ÿÛÿ„ÿäÿ}ÿìÿvÿõÿqÿþÿnÿjÿgÿhÿ#gÿ-hÿ6hÿ>kÿGnÿPrÿYyÿa€ÿi†ÿqŽÿw–ÿ~ÿ„§ÿбÿŽ»ÿ‘Åÿ—Îÿ˜Øÿ›âÿìÿöÿþÿ›™ —”$*‰/„4~8w:q<i?bAZBSEKEDF<G4E,D$CA@ ?@ÿÿ@úÿ?óÿ?îÿ=æÿ<àÿ=Ûÿ<Öÿ=Ðÿ?Êÿ@Èÿ?Âÿ@¿ÿA¼ÿB¸ÿAµÿB±ÿE®ÿD«ÿA©ÿA§ÿA¥ÿ?¥ÿ=¢ÿ;¡ÿ9 ÿ5ÿ2ÿ.œÿ(›ÿ#œÿœÿžÿžÿŸÿ¢ÿûÿ¢ÿóÿ¥ÿêÿ¨ÿâÿªÿÚÿ­ÿÑÿ²ÿÊÿ¶ÿÃÿ¹ÿ»ÿ¿ÿ´ÿÅÿ­ÿËÿ§ÿÐÿ¢ÿÕÿÿÝÿ™ÿâÿ–ÿêÿ”ÿòÿ’ÿùÿ‘ÿ’ÿ’ÿ ”ÿ–ÿ™ÿ ÿ%¡ÿ,¦ÿ2­ÿ6³ÿ;¹ÿ?ÀÿBÇÿFÎÿHÖÿJÞÿKåÿLíÿLóÿKúÿKHF C@<82."($$&'(* )(&ýÿ'öÿ%òÿ$ìÿ%èÿ"ãÿ!àÿ"Üÿ!Øÿ!ÖÿÓÿÑÿ Ðÿ Ïÿ#Ïÿ%Ðÿ(Ïÿ*Ðÿ-Òÿ/Óÿ2Õÿ4Öÿ7×ÿ:Ûÿ>ÞÿBáÿFåÿHèÿLëÿNïÿOòÿPõÿQùÿPüÿPÿÿPNLI EA;4.&# &*ýÿ-óÿ0éÿ3ßÿ6Õÿ:Ëÿ<Ãÿ?»ÿC²ÿF«ÿJ£ÿMÿP–ÿSÿVÿYŠÿZˆÿ]†ÿ_…ÿ`†ÿc†ÿc‰ÿdŒÿeÿc•ÿbšÿ`žÿ]¤ÿ[«ÿX²ÿUºÿPÁÿKÈÿFÑÿ@Ùÿ9àÿ3èÿ+ïÿ#öÿûÿ ùÿîÿäÿÚÿÏÿÄÿºÿ°ÿ¦ÿžÿ–ÿŒÿ„ÿ|ÿtÿmÿfÿbÿ]ÿWÿSÿOÿNÿ LÿJÿIÿJÿJÿKÿNÿOÿRÿVÿZÿ]ÿ cÿ$hÿ'nÿ*uÿ-{ÿ0ƒÿ3‹ÿ6’ÿ9™ÿ:¢ÿ;ªÿ=²ÿ=¼ÿ<Äÿ=Îÿ<Øÿ;âÿ9íÿ8ùÿ41 -)#)5ALW bnxûÿ€÷ÿ‹ðÿ•ëÿŸèÿ©ãÿ³àÿ½ÝÿÅÚÿÌÙÿÓÖÿÙÖÿßÕÿäÔÿéÖÿíØÿïÚÿòÛÿóÞÿôâÿñäÿðèÿîìÿéðÿæôÿà÷ÿÛýÿÔÌĺ° ¥™tfZL>. øÿ êÿ ÝÿÎÿÂÿµÿÿÿ©ÿþÿžÿúÿ’ÿ÷ÿ†ÿõÿ|ÿòÿrÿïÿjÿíÿbÿìÿXÿéÿRÿéÿKÿèÿEÿéÿ?ÿèÿ:ÿæÿ5ÿçÿ1ÿéÿ.ÿèÿ+ÿêÿ(ÿìÿ&ÿíÿ$ÿïÿ$ÿïÿ!ÿñÿ"ÿòÿ%ÿôÿ%ÿõÿ&ÿ÷ÿ(ÿøÿ*ÿ÷ÿ-ÿ÷ÿ/ÿøÿ4ÿ÷ÿ9ÿ÷ÿ>ÿôÿCÿóÿIÿñÿPÿïÿVÿìÿ]ÿêÿeÿçÿnÿãÿvÿßÿ~ÿÜÿ‰ÿÖÿ”ÿÔÿŸÿÐÿªÿÌÿ·ÿÉÿÃÿÆÿÏÿÄÿÜÿÁÿèÿ¾ÿöÿ½ÿ»ÿºÿ¹ÿ)ºÿ7¼ÿD¾ÿQÁÿ^ÅÿkÈÿwÍÿƒÓÿØÿ˜ßÿ¢æÿ¬îÿ´öÿºþÿÂÉÍÒ ×*Ù2Û:ÜBÛJÙSØZÖaÒgÏmÊqÄt½w¶y¯{¦{žz•{ŒzƒxyuorfoZiNdE_;Z2U(PJC >7ûÿ2óÿ.êÿ(ãÿ$ÛÿÔÿÌÿÅÿ¿ÿ¸ÿ ³ÿ ­ÿ¦ÿ¢ÿÿšÿ–ÿ’ÿÿŒÿÿÿ‰ÿþÿ‡ÿüÿ…ÿúÿ„ÿøÿ‚ÿöÿÿôÿ€ÿðÿÿíÿÿéÿ‚ÿåÿƒÿàÿƒÿÛÿ†ÿÖÿ‰ÿÑÿ‹ÿÌÿÿÆÿ’ÿ¿ÿ—ÿ¹ÿšÿ±ÿžÿ«ÿ¤ÿ¤ÿ«ÿÿ°ÿ–ÿ¶ÿÿ½ÿŠÿÃÿ„ÿÊÿ€ÿÑÿzÿÙÿuÿàÿqÿèÿmÿîÿjÿõÿhÿýÿhÿgÿhÿjÿlÿoÿ!rÿ'wÿ+|ÿ.‚ÿ4‰ÿ7‘ÿ:™ÿ=¢ÿ?¬ÿA¶ÿAÀÿBÉÿAÓÿBÝÿAçÿ@óÿ?þÿ=:96#3,14-<*C&J!PW\`eg k mprrÿÿsýÿtúÿsøÿtöÿtôÿsóÿsòÿqïÿqîÿqíÿnìÿnêÿmëÿkêÿjéÿièÿiéÿgéÿgèÿdçÿcåÿbæÿ_åÿ^æÿ[éÿXéÿVèÿSéÿOèÿLéÿHéÿDëÿ>ìÿ:îÿ4ïÿ-ðÿ(óÿ!õÿ÷ÿúÿ þÿýÿöÿíÿ åÿÝÿÕÿÌÿÅÿ ¾ÿ%·ÿ*°ÿ/©ÿ2¥ÿ6 ÿ;šÿ>–ÿB‘ÿFÿIÿMŒÿO‹ÿPŠÿR‹ÿT‹ÿTÿSŽÿT‘ÿS”ÿP˜ÿOœÿL¡ÿI¦ÿE«ÿA°ÿ<µÿ7ºÿ3¿ÿ-Äÿ&Éÿ ÍÿÓÿ×ÿ ÜÿàÿÿÿãÿøÿèÿñÿëÿéÿíÿâÿñÿÜÿñÿÕÿôÿÎÿöÿÈÿøÿÂÿùÿ¾ÿúÿ¸ÿüÿ´ÿýÿ¯ÿýÿªÿÿÿ§ÿÿÿ¤ÿþÿ¢ÿŸÿÿ›ÿšÿ˜ÿ™ÿ ™ÿ ™ÿ œÿœÿÿŸÿ¡ÿ£ÿ"¥ÿ&¨ÿ)ªÿ/­ÿ4±ÿ7µÿ;¸ÿ>»ÿB¿ÿFÂÿIÆÿLËÿNÎÿPÒÿQØÿRÜÿTâÿSçÿRëÿOñÿN÷ÿKþÿHEA =72 +&%,39@ FMÿÿSùÿYòÿ^ìÿcèÿhãÿmÝÿrÙÿvÕÿzÒÿ}Ïÿ€ÍÿÌÿƒÍÿƒÍÿ‚ÌÿƒÍÿ‚Ðÿ‚ÒÿÕÿ|ØÿzÜÿuàÿpãÿléÿfîÿ`óÿYøÿSüÿKÿÿD<4 +#ùÿðÿèÿßÿÖÿÏÿÇÿ¿ÿ¹ÿ±ÿ«ÿ¥ÿ Ÿÿ›ÿ•ÿ‘ÿŒÿüÿ‰ÿúÿ†ÿ÷ÿƒÿõÿÿñÿÿïÿ}ÿíÿ|ÿëÿ{ÿéÿ{ÿéÿ|ÿèÿ|ÿéÿ}ÿèÿÿèÿÿéÿ‚ÿéÿ…ÿëÿˆÿìÿŒÿîÿŽÿðÿ’ÿòÿ—ÿôÿœÿôÿ¡ÿ÷ÿ¦ÿùÿ¬ÿûÿ³ÿýÿ¹ÿÿÿÀÿÇÿÏÿ×ÿàÿèÿðÿúÿ ÿÿ'ýÿ0üÿ:øÿCöÿMôÿWñÿ`ïÿhìÿqêÿwèÿ€æÿˆãÿŽâÿ•àÿšßÿžÞÿ£Þÿ§ßÿ©Þÿ«ßÿ­ßÿ¬áÿ¬ãÿ¬åÿªæÿ¨êÿ¤íÿ ðÿšôÿ•÷ÿûÿˆÿÿ€yp g^TJ@6!+$') +,øÿ/íÿ/âÿ/Øÿ1Ïÿ0Æÿ0½ÿ/³ÿ.«ÿ.£ÿ+œÿ*•ÿ(Žÿ&ˆÿ%‚ÿ"}ÿ xÿsÿnÿjÿgÿdÿaÿ_ÿ^ÿ]ÿ[ÿZÿ[ÿ [ÿ [ÿ ^ÿ _ÿ aÿ cÿ fÿiÿmÿpÿtÿzÿÿ†ÿŒÿ’ÿ™ÿýÿ¡ÿúÿ©ÿ÷ÿ±ÿõÿ»ÿñÿÃÿîÿËÿêÿÖÿæÿàÿâÿëÿßÿ÷ÿÛÿ×ÿ ÓÿÏÿ!Ëÿ,Éÿ7ÅÿBÂÿMÀÿW½ÿa»ÿlºÿw¹ÿ¹ÿ‰ºÿ“ºÿ›»ÿ¢¼ÿ©¾ÿ¯ÁÿµÃÿ¹Çÿ½ËÿÀÐÿÄ×ÿÆÝÿÇâÿÈçÿÇîÿÅôÿÃûÿÀ½¸ µ±© ¤&+•13„9}<t>kBaCWFMFCG9F/F%DB@ ?;øÿ9îÿ5äÿ1Üÿ-Ôÿ*Êÿ&Ãÿ"ºÿ²ÿ«ÿ£ÿœÿ•ÿ ÿ ˆÿ‚ÿ}ÿxÿsÿnÿjÿgÿþÿcÿþÿ`ÿÿÿ^ÿþÿ\ÿÿÿZÿþÿYÿÿÿXÿþÿXÿÿÿYÿÿÿ[ÿþÿ\ÿÿÿ^ÿþÿaÿþÿcÿýÿhÿüÿmÿûÿrÿùÿwÿøÿ|ÿõÿƒÿòÿŠÿðÿÿìÿ˜ÿéÿ ÿåÿ§ÿâÿ±ÿÞÿºÿÙÿÂÿÖÿÌÿÑÿÕÿÌÿÝÿÉÿçÿÅÿñÿÁÿùÿ¾ÿºÿ ·ÿµÿ²ÿ$°ÿ+®ÿ3­ÿ:¬ÿ@­ÿF­ÿM¯ÿR±ÿV²ÿ\·ÿ_ºÿb¾ÿeÂÿhÇÿiÎÿkÓÿmÙÿmàÿlçÿmîÿlõÿlýÿih fdb`%],[2W6T<PCMGJKFNCR@T<W9Y6Y2Z/[+Z'[#Z!YXWTSP MKHFCýÿAùÿ>öÿ<óÿ9ïÿ6ìÿ3êÿ1çÿ.äÿ,áÿ)ßÿ'Üÿ#Úÿ!Ùÿ×ÿÖÿ×ÿ×ÿÖÿ ×ÿ Öÿ×ÿ×ÿÚÿüÿÛÿöÿÞÿóÿáÿïÿãÿêÿæÿåÿèÿàÿìÿÛÿïÿÖÿóÿÑÿ÷ÿÌÿúÿÇÿýÿÂÿ¾ÿ¸ÿ´ÿ ¯ÿ «ÿ¨ÿ¥ÿ¢ÿŸÿÿœÿ›ÿ™ÿ˜ÿ™ÿ›ÿœÿÿ ÿ£ÿ¥ÿ ©ÿ ¬ÿ°ÿµÿºÿûÿ½ÿ÷ÿÂÿòÿÉÿîÿÎÿçÿÒÿâÿØÿÞÿÜÿØÿâÿÔÿæÿÑÿìÿÌÿðÿÇÿöÿÃÿúÿ¿ÿÿÿ¼ÿ¸ÿµÿ²ÿ °ÿ­ÿ«ÿ«ÿ©ÿ¨ÿ§ÿ¨ÿ§ÿ ªÿ!«ÿ"«ÿ%­ÿ'¯ÿ)±ÿ+´ÿ,·ÿ/»ÿ0½ÿ2Àÿ4Äÿ6Çÿ8Êÿ;Îÿ>Òÿ@ØÿCÝÿEáÿHçÿJëÿMñÿOõÿPûÿSÿÿUUXYXX!Y&X.U3T:S@OFLMHSEZA_<g6m0r*x%ƒˆ‹”ýÿ–öÿšðÿœéÿžâÿ Üÿ¡Öÿ Ñÿ ÌÿÇÿœÃÿ›Áÿ—½ÿ”»ÿ¹ÿŒ·ÿ†¶ÿ·ÿy·ÿr·ÿjºÿcºÿZ¼ÿRÀÿIÂÿ@Åÿ7Èÿ-Ìÿ#ÐÿÓÿ×ÿÛÿýÿÞÿóÿâÿèÿåÿÝÿéÿÓÿìÿÊÿîÿÂÿñÿ¸ÿóÿ®ÿôÿ¦ÿöÿÿøÿ•ÿøÿÿøÿ†ÿøÿÿ÷ÿxÿ÷ÿqÿ÷ÿkÿõÿgÿôÿbÿóÿ\ÿòÿXÿñÿSÿîÿQÿíÿMÿëÿKÿéÿIÿéÿGÿçÿFÿæÿDÿåÿEÿæÿDÿåÿDÿæÿEÿåÿHÿæÿIÿæÿLÿçÿOÿéÿRÿêÿVÿíÿ\ÿðÿaÿòÿfÿõÿlÿ÷ÿsÿúÿzÿüÿ‚ÿŠÿ’ÿÿ §ÿ ±ÿ»ÿÆÿÑÿÝÿèÿôÿÿÿ !"$#1%=$I%V$`!l!w ™ ¨°¶½ÄÉÌÐ Ò Ô Õ Ô ÔÓ ÏÍ É Å ¿ ¸ ²«£œ“‹wmcYO E ;!2"'!""!ÿÿ!öÿ ìÿãÿÛÿÐÿÈÿÁÿ¸ÿ°ÿ§ÿ ÿ ™ÿ ’ÿ‹ÿ†ÿÿzÿvÿþÿpÿûÿlÿùÿgÿöÿeÿôÿaÿóÿ_ÿñÿ\ÿïÿZÿîÿYÿìÿXÿêÿYÿêÿYÿéÿYÿèÿZÿçÿ\ÿåÿ^ÿåÿbÿãÿfÿãÿjÿâÿpÿàÿtÿàÿzÿÞÿ€ÿÝÿˆÿÜÿÿÚÿ—ÿÚÿŸÿ×ÿ¨ÿÖÿ±ÿÔÿ»ÿÒÿÅÿÏÿÎÿÍÿÙÿËÿåÿÊÿïÿÇÿùÿÆÿÅÿ ÂÿÀÿ!¿ÿ+½ÿ5»ÿ>»ÿG¼ÿO»ÿX¼ÿ_¼ÿg¼ÿn¿ÿu¿ÿyÁÿ~ÃÿÆÿ„ÉÿˆÍÿŠÓÿŒ×ÿÝÿâÿŽæÿŒìÿ‹òÿ‰ùÿ†þÿƒ |xsn$i+c0\7W<P?IECG<L5P/Q(T!UVX YXUûÿUôÿTîÿRèÿPáÿMÛÿKÕÿGÐÿDÉÿBÅÿ>Àÿ;»ÿ8¶ÿ4±ÿ1­ÿ.ªÿ,¦ÿ(¢ÿ&Ÿÿ#œÿ!›ÿ˜ÿ–ÿ–ÿ“ÿ“ÿ”ÿ“ÿ•ÿ—ÿ˜ÿ›ÿžÿ ÿ¥ÿ ©ÿ ­ÿ ³ÿ·ÿ¾ÿÅÿÊÿÑÿÿÿØÿüÿàÿøÿèÿôÿïÿðÿ÷ÿìÿþÿèÿâÿ ÞÿØÿÔÿ!Îÿ(Êÿ.Åÿ5Àÿ:»ÿ@¶ÿE±ÿJ®ÿOªÿR¦ÿV£ÿZ ÿ[žÿ^œÿ_œÿ`›ÿ`œÿ_œÿ`œÿ_žÿ_ ÿ]£ÿ[§ÿX«ÿV°ÿSµÿOºÿL¿ÿHÅÿEËÿAÑÿ=Øÿ9àÿ6æÿ0îÿ,ôÿ)ûÿ$ "'-ýÿ1úÿ4öÿ7òÿ9íÿ;êÿ=åÿ?âÿAÞÿAÚÿB×ÿAÓÿBÏÿAËÿAÈÿAÄÿAÁÿ?¾ÿ?¼ÿ>¸ÿ;¶ÿ<³ÿ:±ÿ9¯ÿ8­ÿ7¬ÿ4«ÿ3ªÿ3«ÿ0«ÿ0ªÿ.«ÿ,­ÿ+®ÿ*°ÿ(³ÿ&¶ÿ%ºÿ#½ÿ!ÁÿÆÿËÿÐÿ×ÿÝÿãÿêÿ ïÿ ÷ÿýÿ ýÿúÿõÿòÿ%íÿ*éÿ0æÿ7àÿ<Þÿ@ÚÿEÖÿGÓÿKÏÿOÍÿQÊÿSÈÿTÆÿVÅÿVÄÿUÃÿUÄÿSÃÿQÃÿOÄÿMÃÿJÄÿFÆÿCÇÿ?Êÿ:Íÿ5Ïÿ2Òÿ.Ôÿ'Øÿ ÛÿÞÿâÿäÿ èÿëÿïÿÿÿòÿûÿõÿöÿ÷ÿòÿûÿìÿýÿèÿÿÿãÿàÿÜÿØÿÕÿÑÿÐÿ Íÿ Ëÿ Èÿ Æÿ Äÿ ÂÿÀÿÀÿ¿ÿ¾ÿ¿ÿ¾ÿ¾ÿ¿ÿ¾ÿ¿ÿ¿ÿÀÿÂÿÄÿ"Æÿ"Çÿ%Êÿ'Íÿ(Ðÿ+Óÿ,×ÿ/Üÿ0ßÿ2äÿ4éÿ5ïÿ6öÿ6úÿ996 554 2&0--4*:&@"GMRY^ chkûÿoöÿsïÿtêÿvåÿxÞÿyØÿxÔÿxÏÿwÌÿtÈÿsÄÿpÂÿl¾ÿh½ÿe»ÿ_ºÿX¹ÿRºÿLºÿE»ÿ>½ÿ7¿ÿ/Âÿ&ÄÿÈÿËÿ ÐÿÓÿþÿ×ÿöÿÝÿíÿáÿäÿæÿÜÿêÿÔÿíÿËÿóÿÃÿøÿ½ÿüÿµÿÿÿ®ÿ¨ÿ ÿšÿ •ÿ Žÿ‰ÿ…ÿÿ|ÿxÿtÿqÿoÿkÿiÿhÿfÿdÿdÿ eÿ dÿ eÿ fÿiÿjÿlÿoÿsÿwÿ|ÿÿ†ÿ‹ÿ‘ÿ ˜ÿ Ÿÿ ¨ÿ ±ÿ »ÿÃÿÌÿØÿâÿíÿùÿ&3 ?L Wc p{†‘œ¤­·½Æ Ì ÓØÛÞàýÿáúÿà÷ÿáóÿàñÿÞïÿÚîÿÖëÿÑêÿÌêÿÇèÿÀèÿ¸çÿ°åÿ¨çÿŸèÿ•éÿ‹éÿëÿvëÿkîÿ`ïÿTðÿHóÿ=õÿ2÷ÿ&ùÿûÿýÿÿÿùÿîÿãÿØÿÌÿÁÿ¸ÿ®ÿ¤ÿšÿÿ†ÿ ~ÿvÿlÿfÿ^ÿVÿPÿIÿDÿ?ÿ:ÿ5ÿ0ÿ-ÿ*ÿþÿ'ÿþÿ%ÿÿÿ$ÿþÿ%ÿýÿ$ÿüÿ%ÿýÿ%ÿüÿ'ÿüÿ+ÿýÿ.ÿüÿ2ÿýÿ6ÿýÿ>ÿþÿDÿýÿKÿýÿRÿýÿZÿüÿdÿýÿnÿýÿxÿüÿƒÿýÿÿüÿ›ÿùÿ¨ÿùÿ´ÿøÿÁÿöÿÎÿõÿÛÿóÿêÿòÿøÿïÿîÿëÿéÿ-èÿ:äÿFãÿTáÿ_ßÿjÝÿuÛÿ€Úÿ‹Ùÿ”×ÿœÖÿ¥×ÿ¬×ÿ³Öÿ·Øÿ¼ÚÿÁÚÿÄÛÿÆÞÿÉàÿËäÿËçÿÊëÿÊðÿÇóÿÆøÿÃýÿ½»¶ °¬¦Ÿ˜#’(‹,ƒ1z5s8l<b=Z@QCIE?E7F-G$FED C@ùÿ?òÿ<çÿ:Þÿ7Öÿ4Íÿ1Æÿ.½ÿ*¶ÿ'­ÿ$¦ÿ Ÿÿ™ÿ’ÿŒÿ‡ÿ‚ÿ}ÿ zÿ vÿ rÿqÿoÿnÿnÿmÿoÿoÿrÿuÿyÿ}ÿ€ÿ†ÿŒÿÿÿ’ÿþÿ™ÿþÿŸÿüÿ§ÿúÿ°ÿùÿ·ÿ÷ÿ¿ÿôÿÈÿñÿÐÿïÿÙÿêÿáÿçÿëÿäÿóÿàÿüÿÛÿÖÿÔÿÏÿÉÿÅÿ%Àÿ*¼ÿ/¸ÿ5´ÿ8¯ÿ=­ÿA©ÿB¦ÿE£ÿG¡ÿH¡ÿJžÿIÿIžÿIžÿFŸÿF¢ÿD£ÿ@§ÿ?©ÿ<­ÿ9²ÿ6µÿ2»ÿ0Âÿ,Æÿ)Ìÿ%Óÿ!Ùÿàÿçÿïÿöÿüÿ ÿÿýÿ!úÿ(øÿ-õÿ1òÿ7îÿ;ìÿ>êÿBçÿFåÿGâÿJàÿMÝÿOÛÿQÚÿQ×ÿTÕÿTÕÿTÒÿVÐÿVÏÿUÍÿVÌÿUÍÿSÌÿSÌÿTÌÿSÍÿRÌÿPÍÿPÐÿNÑÿMÓÿLÖÿJÙÿJÝÿGàÿFäÿDéÿBîÿ?óÿ=ùÿ:ÿÿ84 2.*'$!+29@F MRYûÿ^öÿcòÿhìÿjæÿnßÿqÛÿsÖÿuÑÿuÌÿvÇÿuÃÿt¿ÿr¼ÿq¸ÿoµÿk²ÿg°ÿa­ÿ\¬ÿX«ÿRªÿL«ÿE«ÿ>ªÿ6«ÿ/­ÿ'®ÿ°ÿ²ÿ³ÿ·ÿ¹ÿùÿ¼ÿñÿ¾ÿéÿÂÿáÿÄÿÚÿÇÿÒÿÊÿËÿÍÿÃÿÑÿ½ÿÓÿ·ÿÕÿ°ÿØÿ«ÿÚÿ¤ÿÝÿ ÿßÿ›ÿâÿ•ÿäÿ‘ÿçÿÿéÿŠÿêÿ†ÿíÿƒÿïÿ€ÿðÿ~ÿòÿ{ÿôÿyÿöÿwÿøÿwÿûÿvÿýÿwÿvÿwÿwÿwÿxÿ zÿ|ÿÿÿ†ÿŠÿ"ÿ(’ÿ+˜ÿ.Ÿÿ4¤ÿ6«ÿ;³ÿ>»ÿAÃÿFËÿIÖÿLÞÿNçÿPóÿRþÿSTST'S0S;QGNPLZIeFoAw=€:‰5.—(ž$¤¨­² ³¶·ûÿ·÷ÿ¸ñÿ¶íÿµçÿ³ãÿ¯Þÿ­Ûÿ§Øÿ¢ÖÿÔÿ–ÑÿÑÿˆÐÿ€ÏÿxÐÿpÐÿgÒÿ]ÓÿUÕÿJ×ÿ@Ùÿ7Üÿ-Þÿ#áÿãÿæÿèÿýÿëÿóÿíÿéÿðÿàÿòÿØÿôÿÎÿöÿÅÿøÿ¾ÿùÿ´ÿúÿ­ÿúÿ¥ÿüÿÿýÿ—ÿüÿÿýÿ‰ÿüÿ„ÿüÿ}ÿúÿxÿùÿsÿúÿnÿøÿiÿ÷ÿfÿ÷ÿcÿõÿ_ÿôÿ\ÿôÿZÿòÿYÿòÿWÿóÿUÿòÿUÿóÿVÿòÿWÿóÿZÿòÿ[ÿóÿ_ÿõÿbÿöÿfÿ÷ÿjÿùÿpÿúÿuÿýÿ}ÿþÿ…ÿŒÿ”ÿÿ§ÿ±ÿ »ÿ ÆÿÑÿÝÿéÿöÿ $1=HT`ku‡˜ Ÿ ¥«°³¶þÿ¹ûÿ¹ùÿ¸öÿ¹ôÿ¸ñÿ¶ïÿ²îÿ°ìÿ¬êÿ§êÿ éÿšèÿ”éÿŒèÿ„èÿ{éÿséÿiëÿaëÿWìÿMïÿCïÿ9ñÿ/óÿ%ôÿõÿøÿúÿýÿûÿõÿþÿíÿÿÿâÿØÿÏÿÇÿ¾ÿµÿ­ÿ¦ÿŸÿ—ÿ ÿ Šÿ„ÿ ÿ xÿ sÿ oÿ jÿgÿ bÿ`ÿ^ÿ[ÿYÿXÿXÿUÿWÿYÿYÿ\ÿ_ÿbÿfÿjÿ pÿ uÿ!|ÿ"ƒÿ!‹ÿ"“ÿ!›ÿ"¤ÿ!®ÿ"¸ÿ!ÄÿÏÿÚÿæÿñÿýÿ ,8COüÿ[ùÿdôÿpïÿzêÿ‚çÿŠãÿ“ÝÿšÚÿ¢×ÿ©Óÿ­Ðÿ²ÍÿµËÿ¸Éÿ»Çÿ¼Çÿ¾Æÿ½Åÿ¼ÆÿºÅÿ¸ÆÿµÈÿ±Êÿ®ÍÿªÏÿ¤ÒÿÔÿ—ØÿÜÿˆàÿ€ãÿxçÿpëÿhðÿ^ôÿV÷ÿNýÿCÿÿ:2(  ùÿñÿçÿÝÿÕÿÌÿÄÿ»ÿ³ÿ«ÿ¢ÿ›ÿ“ÿÿ‡ÿ€ÿzÿtÿ nÿiÿ dÿ aÿ]ÿ YÿXÿUÿTÿSÿSÿTÿTÿWÿYÿ\ÿ`ÿfÿjÿ!pÿ"uÿ$}ÿ%…ÿ&Œÿ'•ÿ&žÿ&§ÿ'±ÿ&»ÿ'Åÿ&Ðÿ$Üÿ"åÿ ñÿûÿ# -7AÿÿKüÿSöÿZòÿbìÿhçÿoãÿuÝÿyÙÿ}Ôÿ€ÐÿƒÍÿ†Éÿ‡ÆÿˆÃÿ‡Áÿˆ¿ÿ‡½ÿ†¼ÿƒ»ÿ‚¼ÿ~»ÿz¼ÿw½ÿsÀÿnÁÿiÅÿdÆÿ_ÈÿZÌÿUÏÿOÓÿH×ÿCÛÿ?Þÿ8äÿ2çÿ-ëÿ'ñÿ ôÿøÿüÿÿÿ  þÿ ùÿôÿïÿêÿåÿàÿÛÿ Öÿ!Òÿ$Ïÿ'Êÿ)Æÿ+Äÿ,Àÿ.½ÿ0ºÿ1·ÿ3µÿ5²ÿ5°ÿ7®ÿ9­ÿ9¬ÿ:­ÿ;¬ÿ;­ÿ=­ÿ<¯ÿ=±ÿ=²ÿ@¶ÿ?¸ÿ<¼ÿ<Àÿ<Ãÿ;Éÿ:Îÿ8Ôÿ6Ûÿ3ßÿ1çÿ.íÿ+ôÿ'ûÿ#  $*0ÿÿ6úÿ<óÿ@ïÿEêÿJåÿNàÿQÛÿTÖÿVÑÿWÌÿYÉÿXÆÿYÂÿXÀÿU¼ÿT¹ÿQ¹ÿN¶ÿJµÿF´ÿA´ÿ<´ÿ7´ÿ1µÿ*´ÿ%µÿ·ÿ¸ÿºÿ»ÿ¼ÿýÿ¿ÿöÿÂÿïÿÄÿèÿÆÿáÿÈÿÛÿËÿÔÿÎÿÎÿÐÿÈÿÑÿÂÿÔÿ¾ÿ×ÿ¸ÿÙÿ³ÿÜÿ¯ÿÞÿªÿàÿ§ÿâÿ£ÿäÿ ÿçÿÿéÿšÿìÿ˜ÿîÿ—ÿñÿ–ÿóÿ“ÿöÿ“ÿùÿ“ÿýÿ‘ÿ’ÿ”ÿ”ÿ ”ÿ —ÿ˜ÿ›ÿžÿ ÿ"£ÿ(§ÿ,«ÿ2¯ÿ6³ÿ;¸ÿ@¿ÿEÄÿJÊÿOÑÿTØÿYßÿ\æÿ_ïÿb÷ÿeþÿhikm"m+l5k>hHgQcZad]nWvS~M†IŽC–<œ5¢.¨&®±´·¹ºüÿ¼ôÿ»íÿ»çÿ¸àÿ¶Úÿ³Ôÿ®ÎÿªÊÿ¤ÅÿŸÁÿ—¾ÿ»ÿˆ¸ÿ¶ÿw´ÿm³ÿc±ÿY²ÿN±ÿC±ÿ8²ÿ-³ÿ"µÿµÿ ·ÿ¸ÿ÷ÿ»ÿìÿ½ÿàÿ¿ÿÔÿÂÿËÿÄÿ¿ÿÅÿµÿÇÿ«ÿÉÿ¡ÿËÿ™ÿÍÿ‘ÿÎÿ‡ÿÑÿÿÒÿwÿÕÿoÿÖÿiÿØÿbÿÚÿ\ÿÚÿUÿÜÿPÿÞÿLÿßÿGÿáÿDÿãÿ@ÿåÿ<ÿæÿ:ÿèÿ8ÿëÿ7ÿíÿ5ÿïÿ6ÿðÿ5ÿôÿ6ÿ÷ÿ6ÿùÿ9ÿýÿ<ÿ>ÿCÿFÿJÿ PÿWÿ]ÿdÿmÿuÿ!ÿ%‰ÿ(“ÿ+ÿ/¨ÿ2´ÿ4Áÿ6Íÿ8Úÿ:èÿ;õÿ<=<=+<8=E<S:`:l8x6…41›/§,±)·%À#Ç ÎÓ×Ýßá â äáßÞÙÿÿÖýÿÑûÿÌùÿÅ÷ÿ½öÿ¶ôÿ®óÿ¥òÿœñÿ’ïÿˆîÿ~íÿtíÿiìÿ]êÿTëÿHêÿ=èÿ2èÿ&éÿèÿçÿåÿýÿæÿòÿåÿæÿåÿÝÿæÿÓÿåÿÉÿæÿÀÿåÿ¸ÿæÿ¯ÿåÿ¥ÿæÿžÿæÿ•ÿçÿŽÿéÿ‡ÿêÿÿëÿzÿìÿuÿïÿoÿðÿhÿóÿeÿöÿaÿøÿ]ÿûÿYÿýÿVÿSÿRÿQÿPÿ Qÿ PÿQÿRÿUÿWÿ\ÿ_ÿ cÿ"hÿ"nÿ%uÿ%|ÿ$ƒÿ%‹ÿ$“ÿ%ÿ$¦ÿ!®ÿ ¸ÿÄÿÎÿØÿäÿðÿ úÿþÿ$ùÿ0ôÿ:ðÿBíÿMèÿVâÿ^ßÿgÜÿnØÿvÕÿ|ÑÿÎÿ…ÌÿŠËÿŽÉÿ‘Çÿ”Çÿ”Èÿ—Çÿ—Èÿ•Èÿ“Ëÿ‘ÌÿÎÿ‹ÐÿˆÓÿ„ÖÿÙÿzÜÿußÿpâÿiåÿbéÿ\ìÿTðÿLôÿE÷ÿ>úÿ7üÿ/'  üÿ ôÿ íÿçÿàÿÙÿÓÿÍÿÇÿÂÿ»ÿ¶ÿ±ÿ¬ÿ¨ÿ¤ÿ¡ÿÿ!šÿ!—ÿ$”ÿ&’ÿ(‘ÿ*ÿ-Žÿ/ÿ0ÿ3Žÿ6ÿ8ÿ:“ÿ;”ÿ=˜ÿ?›ÿAŸÿA£ÿB©ÿB­ÿE³ÿE¹ÿCÀÿBÆÿAÍÿAÕÿ>Ýÿ<åÿ9îÿ7öÿ3ÿÿ/,&! (09 @IOûÿVöÿ]ïÿcéÿhãÿmÝÿqØÿtÑÿwÌÿyÇÿ|Âÿ~¾ÿ~ºÿ}·ÿ}³ÿz°ÿy­ÿv«ÿs¨ÿp¦ÿl¦ÿf¥ÿa¦ÿ\¥ÿV¦ÿO¦ÿJ¦ÿB¨ÿ<©ÿ5«ÿ.­ÿ&®ÿ²ÿ´ÿ¸ÿ»ÿ¾ÿýÿÂÿöÿÄÿðÿÈÿéÿÌÿâÿÏÿÜÿÓÿÖÿ×ÿÑÿÜÿÊÿßÿÄÿäÿÀÿéÿ»ÿíÿ¶ÿñÿ³ÿõÿ¯ÿûÿªÿÿÿ§ÿ¤ÿ¡ÿ žÿ›ÿ™ÿ—ÿ –ÿ%•ÿ*“ÿ/’ÿ4‘ÿ9’ÿ<’ÿ?’ÿE”ÿH”ÿL•ÿP˜ÿS™ÿVÿX ÿZ¤ÿ\§ÿ]«ÿ_°ÿ_µÿ`»ÿ_Âÿ^Çÿ]Îÿ\ÕÿXÜÿVäÿSëÿQóÿMüÿIC >:5%0-+5&= ENU\ cipüÿu÷ÿxñÿ|íÿèÿ‚ãÿ„àÿ‡ÜÿˆØÿ‡Öÿ‡Óÿ†ÑÿƒÎÿ‚Ìÿ~ÊÿzÉÿuÇÿpÆÿlÅÿfÆÿ`ÅÿYÃÿRÃÿKÄÿCÃÿ;Äÿ4Ãÿ+Äÿ#ÄÿÃÿÄÿ ÃÿÄÿüÿÃÿôÿÄÿìÿÄÿäÿÄÿÜÿÆÿÖÿÆÿÏÿÅÿÈÿÇÿÂÿÈÿ½ÿÉÿ¶ÿÌÿ±ÿÍÿ¬ÿÏÿ§ÿÒÿ¤ÿÔÿ ÿ×ÿœÿÙÿ™ÿÝÿ–ÿáÿ”ÿåÿ’ÿèÿ‘ÿîÿÿóÿŽÿøÿÿýÿŽÿŽÿÿ ÿ’ÿ“ÿ•ÿ$—ÿ+šÿ/ÿ6¡ÿ<¥ÿ@ªÿE­ÿJ³ÿO¸ÿR¿ÿVÅÿZÊÿ[Òÿ^Øÿ_àÿ`çÿ`ïÿ_÷ÿ`þÿ_] YWT'P0K8F@AH<P7X0^*e#mrv| €…þÿ‰ùÿŠòÿìÿŽçÿàÿÛÿŽ×ÿÒÿ‹Ïÿ‰Êÿ…Èÿ‚Äÿ}ÂÿwÀÿq½ÿk¼ÿeºÿ]ºÿU¹ÿMºÿE·ÿ<·ÿ3ºÿ+ºÿ ¹ÿºÿ»ÿ½ÿüÿ¿ÿóÿÀÿêÿÁÿâÿÄÿÙÿÅÿÏÿÆÿÈÿÈÿ¿ÿËÿ·ÿÎÿ¯ÿÐÿ§ÿÓÿ¡ÿÕÿšÿØÿ“ÿÚÿŽÿÞÿ‰ÿáÿ…ÿãÿÿçÿ{ÿêÿwÿîÿtÿòÿqÿöÿoÿúÿmÿþÿkÿjÿiÿjÿ iÿjÿjÿlÿoÿ"pÿ%sÿ*wÿ-zÿ1~ÿ5„ÿ8‰ÿ;ÿ>”ÿ@›ÿC¡ÿE¨ÿG°ÿH¹ÿJÁÿIÊÿJÒÿJÝÿIçÿJñÿIüÿGEDA'>1<=9G6R2\/g+s'|#„Ž—Ÿ§® ³º¾ÀÿÿÄûÿÆøÿÈôÿÊñÿÊîÿÇëÿÆèÿÅäÿÀâÿ¼àÿ¸Ýÿ²Ûÿ«Úÿ¤×ÿÔÿ”Ôÿ‹ÑÿÏÿwÎÿmËÿcÊÿYÈÿNÇÿBÆÿ8Åÿ,Äÿ ÃÿÃÿ ÂÿÿÿÀÿôÿÁÿéÿÀÿÞÿÁÿÓÿÁÿÉÿÂÿ¿ÿÄÿµÿÄÿ«ÿÆÿ¢ÿÇÿšÿÉÿ’ÿÌÿ‰ÿÏÿ‚ÿÒÿ{ÿÖÿuÿÙÿoÿÜÿhÿáÿdÿçÿ_ÿëÿZÿñÿVÿõÿSÿúÿPÿÿÿNÿMÿKÿJÿIÿJÿIÿ"Jÿ(Mÿ,Nÿ2Pÿ6Tÿ:Wÿ=[ÿAaÿCfÿEjÿFpÿGwÿJ~ÿJ†ÿIÿH–ÿFŸÿE©ÿC³ÿA½ÿ=Çÿ:Ñÿ7Üÿ3çÿ.òÿ+þÿ&!(4 ?HT_þÿgùÿoôÿzñÿ‚îÿ‰êÿ‘çÿ—åÿœâÿ¡àÿ¦Þÿ«Ýÿ®Ûÿ°Úÿ±Ùÿ²Úÿ±Úÿ±Ùÿ±Úÿ®Ùÿ¬Úÿ©Úÿ¥ÛÿŸÜÿ›Üÿ•ßÿßÿ‰ßÿ‚áÿ{áÿsäÿläÿdäÿ[æÿSæÿJéÿAéÿ9êÿ0ëÿ(ìÿïÿîÿ ðÿñÿÿÿôÿ÷ÿõÿïÿ÷ÿèÿùÿàÿúÿÙÿüÿÑÿþÿËÿÅÿ¿ÿ¹ÿ³ÿ ¯ÿ ©ÿ¥ÿŸÿ›ÿ˜ÿ•ÿ ’ÿ#ÿ&ÿ)Œÿ,Šÿ/‰ÿ2ˆÿ4‡ÿ6ˆÿ8ˆÿ:‹ÿ;‹ÿ<ÿ=ÿ<’ÿ=•ÿ<™ÿ<žÿ<¡ÿ:¦ÿ9«ÿ6±ÿ4¸ÿ2½ÿ.Äÿ,Ëÿ'Òÿ#Ùÿàÿèÿïÿ÷ÿ þÿ üÿ÷ÿ!ñÿ(íÿ.çÿ5ãÿ9Ýÿ@ÙÿDÔÿGÑÿMÌÿPÉÿSÆÿVÂÿVÀÿY½ÿY»ÿX¸ÿY¶ÿX´ÿV³ÿS±ÿR°ÿO¯ÿK°ÿH°ÿD¯ÿ?°ÿ<¯ÿ8°ÿ2°ÿ+²ÿ&³ÿ!µÿ·ÿ¸ÿ»ÿ ¼ÿÁÿÄÿûÿÇÿ÷ÿÊÿñÿÎÿíÿÒÿçÿØÿãÿÝÿßÿáÿÜÿçÿÖÿìÿÔÿòÿÑÿùÿÎÿýÿËÿÉÿ ÇÿÅÿÄÿÃÿ$Âÿ*Àÿ1Àÿ7¿ÿ>¾ÿC¿ÿJÀÿPÁÿUÀÿ\Áÿ`ÄÿdÄÿgÆÿlÇÿoÉÿqËÿtÎÿuÑÿvÔÿu×ÿvÛÿuÞÿuâÿsæÿrëÿoïÿkóÿgùÿbÿÿ_ZS MHB;%5+.1(8 =CI PTYûÿ^õÿcîÿgéÿjâÿnÝÿqÙÿsÓÿuÐÿvÌÿvÈÿxÅÿwÁÿt½ÿu»ÿr¸ÿo¶ÿk³ÿh±ÿd°ÿ_­ÿY¬ÿR«ÿK©ÿE¨ÿ>§ÿ6¦ÿ.¥ÿ%¥ÿ¤ÿ¢ÿ £ÿ¢ÿûÿ£ÿóÿ£ÿéÿ£ÿáÿ¥ÿÙÿ¦ÿÏÿ¦ÿÈÿ¨ÿÀÿªÿ¹ÿ«ÿ°ÿ­ÿ©ÿ°ÿ£ÿ³ÿœÿ¶ÿ–ÿºÿÿ¾ÿŒÿÃÿ‡ÿÅÿ‚ÿËÿÿÐÿ|ÿÖÿyÿÝÿwÿâÿtÿéÿsÿðÿrÿöÿqÿþÿrÿrÿ tÿuÿvÿ yÿ'{ÿ-ÿ5ÿ<…ÿAˆÿHÿN’ÿT—ÿYœÿ^¢ÿb©ÿe®ÿiµÿl¼ÿnÄÿqËÿrÒÿrÛÿsãÿrêÿqóÿpüÿml hea&^/Z8U@PKKQDZ>c:j4r-z(€!‡’— œŸ¢ûÿ¥ôÿ§ïÿ¨êÿ©åÿªàÿ§Ûÿ§Øÿ¥Ôÿ¡ÏÿžÌÿšÈÿ–ÅÿÃÿ‹¿ÿ„¼ÿ}¹ÿu¹ÿm¶ÿe´ÿ\³ÿS±ÿJ±ÿ@¯ÿ7¯ÿ-°ÿ#¯ÿ°ÿ°ÿ²ÿýÿ³ÿóÿµÿêÿ·ÿâÿ¹ÿØÿ¼ÿÎÿ¾ÿÇÿÁÿ¾ÿÅÿ¶ÿÈÿ¯ÿÌÿ§ÿÐÿ ÿÕÿšÿÚÿ“ÿÝÿŽÿáÿŠÿçÿ„ÿîÿÿóÿ{ÿøÿwÿýÿtÿqÿoÿ mÿmÿlÿkÿ jÿ$mÿ'mÿ,mÿ0oÿ3qÿ7tÿ9vÿ;zÿ=~ÿ?ƒÿA‡ÿA‹ÿB’ÿA—ÿBÿA¥ÿ@«ÿ?²ÿ>ºÿ;Ãÿ:Éÿ9Òÿ6Üÿ3äÿ/ïÿ-ùÿ*'$ &09AJ S [ekszþÿûÿ†øÿŠõÿóÿ“ðÿ–íÿ™ëÿ›èÿœæÿ›äÿœãÿ›àÿ™Ýÿ–Ûÿ”Ùÿ×ÿŒÔÿ†ÒÿÐÿ|ÏÿuÌÿnËÿgÉÿ^ÇÿVÇÿNÆÿEÅÿ<Äÿ3Ãÿ+Äÿ ÃÿÄÿÆÿÆÿþÿÇÿ÷ÿÉÿìÿËÿäÿÎÿÜÿÐÿÕÿÔÿÌÿ×ÿÅÿÛÿ¿ÿßÿ¸ÿäÿ²ÿéÿ¬ÿîÿ§ÿóÿ¢ÿùÿÿÿÿ˜ÿ•ÿ’ÿŽÿŒÿŠÿ!‰ÿ(†ÿ-†ÿ2…ÿ9†ÿ>…ÿB†ÿF†ÿI†ÿOˆÿQŠÿSŒÿWŽÿW‘ÿY”ÿY˜ÿZœÿZ¡ÿX¥ÿX©ÿU°ÿT¶ÿQºÿMÁÿJÇÿFÌÿAÔÿ<Ûÿ8ãÿ3êÿ-òÿ)úÿ# !)0þÿ9ùÿ@ôÿGïÿOêÿVåÿ]àÿcÛÿiØÿoÔÿuÐÿxÍÿ|ÊÿÈÿƒÄÿ…Ãÿ‡Áÿ‰¾ÿ‰¾ÿŠ»ÿ‰»ÿ‡ºÿ…¹ÿ‚ºÿ€·ÿ}¶ÿx·ÿs¶ÿn·ÿi¹ÿdºÿ]¹ÿV»ÿP¼ÿI½ÿAÀÿ8Áÿ2Ãÿ*Æÿ!ÇÿÊÿÍÿÏÿÓÿûÿ×ÿóÿÛÿëÿÞÿäÿãÿÜÿçÿÖÿëÿÏÿñÿÉÿõÿÂÿûÿ½ÿÿÿ·ÿ°ÿ¬ÿ §ÿ¤ÿ ÿœÿ ™ÿ%–ÿ*”ÿ/’ÿ4ÿ9Žÿ<ÿ?ŒÿCŒÿFÿIŒÿKÿNÿPÿQ’ÿR”ÿT–ÿS™ÿT›ÿTŸÿS£ÿP¨ÿP«ÿO°ÿLµÿJºÿGÂÿDÇÿ@Ìÿ=Óÿ:Ùÿ7áÿ3èÿ.ïÿ+÷ÿ&ýÿ!  '/6<ûÿA÷ÿHòÿNïÿTêÿYåÿ]áÿaÝÿdÙÿhÕÿkÒÿmÌÿnÊÿoÆÿnÂÿnÀÿo¼ÿnºÿl·ÿj³ÿg±ÿc¯ÿ`­ÿ\«ÿXªÿR©ÿN§ÿH¨ÿC§ÿ=§ÿ7¨ÿ1©ÿ*«ÿ%¬ÿ¯ÿ²ÿ´ÿ ¸ÿ¼ÿÂÿûÿÆÿöÿËÿïÿÐÿêÿÖÿåÿÝÿàÿãÿÛÿêÿØÿñÿÔÿøÿÏÿÿÿÍÿÉÿ ÇÿÅÿÂÿ"Àÿ*¾ÿ0¾ÿ7»ÿ>»ÿC»ÿJ¹ÿOºÿT¹ÿYºÿ\ºÿ`¼ÿd¼ÿe¼ÿh¿ÿiÀÿjÂÿjÄÿiÅÿiÇÿhÊÿfÍÿdÏÿaÓÿ^ÖÿZÚÿVÝÿQáÿNæÿHéÿCîÿ<óÿ7øÿ3ýÿ,& #'ûÿ,ôÿ2îÿ6êÿ;åÿ?áÿBÝÿFÙÿJÓÿMÐÿPÍÿQÉÿTÆÿTÃÿUÀÿV½ÿUºÿU·ÿSµÿR³ÿP±ÿM¯ÿJ®ÿF«ÿB«ÿ>©ÿ:§ÿ4§ÿ/¨ÿ(§ÿ"¨ÿ§ÿ¨ÿ¨ÿ©ÿ«ÿüÿ¬ÿôÿ¯ÿíÿ±ÿçÿ²ÿßÿ·ÿØÿºÿÒÿ½ÿÌÿÁÿÇÿÆÿÀÿËÿ»ÿÐÿ¶ÿÕÿ±ÿÚÿ¬ÿßÿ©ÿåÿ¥ÿìÿ¡ÿòÿ ÿùÿÿÿÿ›ÿšÿ ˜ÿ™ÿ˜ÿ ˜ÿ'™ÿ.™ÿ4œÿ:ÿ@ ÿE£ÿJ¥ÿO¨ÿT¬ÿY¯ÿ^³ÿa·ÿd½ÿgÁÿiÆÿlËÿnÐÿnÕÿoÛÿnâÿoçÿnîÿlõÿkûÿifd `]Y!U(P0K6F=AC<I7P2W,\%c imrv{€ýÿ‚øÿ†ñÿ‰ìÿ‹åÿßÿŽÚÿÓÿÏÿŽÉÿÅÿ‹Àÿ‰»ÿ†¶ÿƒ±ÿ¬ÿz©ÿu¥ÿp¡ÿjžÿc›ÿ\™ÿU—ÿL–ÿE”ÿ<“ÿ3”ÿ+“ÿ ”ÿ–ÿ—ÿ˜ÿýÿ›ÿóÿžÿéÿ¢ÿáÿ¥ÿÙÿ¨ÿÎÿ­ÿÆÿ³ÿ¾ÿ·ÿ´ÿ½ÿ¬ÿÄÿ¥ÿÉÿÿÏÿ—ÿ×ÿÿÝÿŠÿäÿ„ÿëÿ€ÿòÿ{ÿùÿvÿrÿoÿ lÿjÿhÿ gÿ%fÿ+dÿ2eÿ7dÿ;eÿ>hÿBhÿGjÿInÿLpÿOsÿPwÿR{ÿT€ÿTƒÿS‰ÿTÿS•ÿSšÿR¡ÿP¨ÿO°ÿM·ÿK¿ÿHÆÿFÍÿC×ÿAàÿ=éÿ:ñÿ7úÿ41 .*'($2 9CMV^g nv~„‹ýÿúÿ—öÿœóÿŸïÿ£ìÿ§éÿ¨åÿªáÿ«ÝÿªÛÿ«×ÿªÔÿ¨Ðÿ¥Îÿ£ËÿŸÈÿ›Æÿ•ÃÿÁÿ‰¿ÿƒ½ÿ|»ÿt»ÿmºÿd¹ÿ\ºÿS¹ÿJºÿAºÿ6¼ÿ.¾ÿ%ÀÿÂÿÅÿÈÿËÿùÿÐÿðÿÔÿèÿØÿÞÿÜÿÖÿâÿÏÿçÿÇÿîÿÀÿóÿºÿøÿ³ÿþÿ®ÿ¨ÿ¡ÿžÿšÿ–ÿ ’ÿ%ÿ*Œÿ/‹ÿ4ˆÿ8†ÿ;†ÿ?…ÿC…ÿE‚ÿHƒÿJ†ÿK†ÿL†ÿLˆÿOŠÿOŒÿLŽÿK‘ÿJ”ÿH˜ÿF›ÿDžÿA£ÿ>©ÿ;­ÿ7³ÿ4·ÿ0¼ÿ,Âÿ&Èÿ!ÎÿÔÿÛÿâÿéÿ ïÿöÿþÿþÿùÿ ôÿïÿêÿåÿ&àÿ+Ûÿ2Øÿ8Ôÿ>ÏÿBÌÿGÈÿMÅÿQÃÿV¾ÿZ¼ÿ]¹ÿ`·ÿbµÿd³ÿd±ÿf±ÿg°ÿg¯ÿd°ÿd¯ÿc°ÿ`¯ÿ^°ÿ[²ÿX´ÿT¶ÿP·ÿK»ÿF¾ÿAÁÿ<Åÿ8Èÿ3Íÿ-Óÿ'×ÿ Ýÿáÿçÿìÿ óÿùÿþÿûÿ÷ÿñÿíÿçÿãÿ!àÿ'Ûÿ-Øÿ1Õÿ7Ñÿ;Îÿ@ÌÿEÉÿJÇÿNÅÿQÄÿTÃÿWÃÿYÀÿ\Àÿ^Áÿ^Àÿ_Áÿ`Àÿ_Áÿ`Äÿ^Äÿ]Åÿ]ÇÿZÈÿXÊÿWÍÿSÏÿQÒÿMÔÿJ×ÿFÛÿBÞÿ>âÿ:åÿ7éÿ3íÿ-òÿ)õÿ$ûÿ!ÿÿ üÿ"÷ÿ'ñÿ,íÿ/çÿ4ãÿ7Ýÿ:Ùÿ>Óÿ@ÏÿDÊÿGÅÿGÀÿJ»ÿK¸ÿL´ÿL®ÿKªÿL§ÿK£ÿI ÿGžÿEšÿC˜ÿ@–ÿ<”ÿ9“ÿ5”ÿ1”ÿ-”ÿ)˜ÿ#›ÿ Ÿÿ¤ÿ«ÿ°ÿµÿ »ÿ ÂÿÇÿËÿûÿÓÿôÿØÿïÿßÿêÿåÿåÿëÿàÿòÿÛÿøÿÖÿþÿÑÿÎÿÊÿÆÿÅÿÂÿ#Àÿ)¾ÿ0¼ÿ5»ÿ<ºÿA¹ÿHºÿMºÿQ¹ÿVºÿY¹ÿ^ºÿaºÿc¼ÿg½ÿi¾ÿiÀÿjÁÿiÄÿjÅÿiÇÿiÊÿgÍÿeÏÿbÓÿ`×ÿ\ÛÿXÞÿSãÿOçÿKëÿDñÿ>ôÿ:øÿ5ýÿ.(#  !%üÿ*öÿ-ñÿ1íÿ7çÿ:ãÿ=ÞÿBÚÿE×ÿHÑÿKÍÿNÊÿQÆÿSÄÿVÂÿXÀÿZ½ÿ[»ÿ[¹ÿ]¸ÿ\¶ÿZ·ÿ[·ÿZ¶ÿX·ÿV¶ÿS·ÿQ¶ÿM·ÿIºÿCºÿ?¼ÿ<¿ÿ7Àÿ0Ãÿ+Åÿ%ÆÿÉÿÌÿÏÿ Òÿ×ÿþÿÚÿøÿßÿðÿäÿêÿéÿãÿîÿÝÿóÿÖÿøÿÏÿýÿÉÿÅÿÀÿ »ÿ¶ÿ±ÿ­ÿªÿ¦ÿ"£ÿ&¡ÿ) ÿ,ÿ/ÿ2žÿ5ÿ8žÿ:ÿ<žÿ>žÿ@¡ÿB¢ÿB¥ÿE¨ÿEªÿE®ÿG±ÿFµÿG¸ÿF¼ÿFÁÿDÄÿCÈÿBÎÿ@Òÿ?Øÿ<Üÿ;âÿ7æÿ4ìÿ0ðÿ,õÿ(úÿ$ÿÿ "þÿ(ùÿ,ôÿ2îÿ6çÿ;ãÿ@ÝÿEØÿIÔÿLÎÿPÊÿTÅÿWÁÿZ¾ÿ]»ÿ`¸ÿbµÿd²ÿd¯ÿe¬ÿd«ÿeªÿdªÿd«ÿbªÿa«ÿ_ªÿ\«ÿX­ÿT®ÿQ°ÿK³ÿF¶ÿAºÿ<¾ÿ8Âÿ2Åÿ,Éÿ%ÍÿÓÿ×ÿÝÿâÿèÿþÿïÿ÷ÿóÿïÿøÿéÿýÿâÿÚÿÕÿ ÎÿÉÿÅÿÀÿ"»ÿ(¶ÿ,±ÿ2­ÿ6ªÿ9§ÿ=¤ÿA¢ÿD ÿHŸÿJÿMžÿOœÿQ›ÿRœÿTÿTžÿVžÿV¡ÿU£ÿT¤ÿS¨ÿSªÿP­ÿO¯ÿL³ÿI·ÿG»ÿC¾ÿ@Ãÿ<Æÿ8Êÿ5Ðÿ0Õÿ+Úÿ&ßÿ!äÿéÿîÿóÿ ùÿþÿùÿôÿîÿçÿ!ãÿ%Þÿ-Ùÿ2Öÿ8Ñÿ>ÌÿBÊÿHÅÿLÂÿR¿ÿW¼ÿ[ºÿa¸ÿe¶ÿhµÿk´ÿn±ÿp±ÿr°ÿs¯ÿt²ÿt²ÿs³ÿt¶ÿsµÿr·ÿo·ÿlºÿi¼ÿe¾ÿaÃÿ]ÅÿWÉÿSËÿMÎÿGÑÿ@Õÿ:Øÿ3Üÿ+àÿ$ãÿéÿìÿ ðÿõÿøÿøÿýÿñÿéÿâÿÜÿ ÔÿÎÿÈÿÂÿ¾ÿ ¸ÿ"´ÿ&¯ÿ*ªÿ-¦ÿ1£ÿ5 ÿ7žÿ:œÿ=›ÿ?šÿB˜ÿD˜ÿF–ÿH–ÿJ˜ÿK™ÿK™ÿLœÿKÿLžÿK¡ÿK¢ÿJ¥ÿI¨ÿH¬ÿE¯ÿD²ÿ@¶ÿ=¹ÿ:½ÿ6Áÿ2Åÿ.Èÿ(Îÿ$Óÿ!×ÿÝÿáÿçÿ ëÿñÿÿÿõÿûÿúÿôÿÿÿïÿêÿ ãÿÝÿÙÿÔÿ Îÿ%Êÿ*Åÿ/Áÿ4¾ÿ9»ÿ>¸ÿB¶ÿH´ÿL²ÿQ¯ÿT¯ÿW®ÿZ¬ÿ]®ÿ`°ÿ`±ÿc³ÿdµÿe¶ÿe¸ÿd»ÿc¾ÿbÂÿaÆÿ^Êÿ]ÍÿYÒÿVØÿSÜÿOßÿKäÿFéÿAîÿ<ôÿ7ûÿ3ÿÿ-("  "&þÿ)ùÿ/ôÿ1ïÿ5êÿ8åÿ:àÿ<Ýÿ?ÙÿBÕÿDÓÿFÐÿFÍÿHËÿIÉÿJÇÿIÆÿJÅÿIÃÿJÃÿIÃÿIÀÿIÀÿFÁÿEÀÿBÁÿ?Âÿ=Äÿ:Ãÿ9Äÿ6Æÿ2Æÿ/Èÿ+Êÿ&Ëÿ!ÍÿÏÿÑÿÓÿÕÿ ØÿÚÿÞÿûÿáÿ÷ÿãÿñÿçÿìÿêÿåÿîÿàÿñÿÛÿôÿÖÿøÿÑÿûÿÌÿÿÿÈÿÅÿÀÿ»ÿ ¹ÿµÿ±ÿ¯ÿ­ÿ¬ÿ!ªÿ$¨ÿ'¦ÿ)¦ÿ+¥ÿ-¦ÿ/¦ÿ0§ÿ1©ÿ3«ÿ4¬ÿ3­ÿ3°ÿ2±ÿ0´ÿ0¸ÿ.¼ÿ-Áÿ)Äÿ'Èÿ$Ìÿ"ÏÿÕÿÚÿßÿäÿéÿ îÿóÿùÿÿÿþÿúÿõÿ òÿíÿëÿçÿ#äÿ(áÿ,Þÿ2Ýÿ6Úÿ;Ùÿ>×ÿBÖÿHÕÿLÔÿOÕÿTÕÿWÔÿZÕÿ]×ÿ_×ÿbØÿdÛÿdÚÿfÝÿgßÿháÿgãÿhæÿgèÿfêÿcíÿbïÿ`òÿ]õÿY÷ÿVúÿRüÿNHD>72 + %üÿôÿ íÿ#åÿ%ßÿ'Øÿ)Ñÿ,Ëÿ.Åÿ1Àÿ3»ÿ5³ÿ6¯ÿ9«ÿ:¨ÿ;¤ÿ<¢ÿ>Ÿÿ@ÿ@œÿ?šÿ@˜ÿ?˜ÿ@šÿ?œÿ?ÿ>žÿ<¡ÿ;¢ÿ8¥ÿ6¨ÿ3ªÿ/®ÿ,²ÿ(¸ÿ$¼ÿÀÿÃÿÉÿÍÿ ÒÿØÿÜÿüÿâÿöÿæÿðÿëÿéÿðÿåÿóÿÝÿøÿØÿýÿÓÿÌÿÇÿÃÿ ½ÿ¹ÿ´ÿ°ÿ­ÿ!©ÿ$§ÿ(£ÿ+¡ÿ. ÿ1ÿ4ÿ7œÿ9›ÿ<œÿ=ÿAžÿCŸÿE¢ÿF£ÿH¥ÿJ¨ÿJªÿK®ÿL²ÿK¶ÿL¹ÿK½ÿKÁÿIÆÿIËÿHÐÿEÓÿD×ÿ@ßÿ>äÿ;éÿ8îÿ6óÿ0øÿ.ýÿ)#  %*þÿ0øÿ7ñÿ;íÿ?çÿCâÿGÞÿMØÿQÔÿVÐÿYÍÿ]ÉÿaÆÿcÃÿgÁÿi¾ÿl¼ÿnºÿn¹ÿp¸ÿq¶ÿr¸ÿqºÿrºÿp¹ÿnºÿm¼ÿj½ÿg¿ÿeÂÿaÄÿ]ÈÿXÊÿUÍÿPÑÿIÔÿC×ÿ>Ûÿ7ßÿ0äÿ*éÿ#ëÿðÿöÿ úÿýÿûÿóÿìÿ æÿÞÿØÿÒÿËÿ!Çÿ$Áÿ(»ÿ+·ÿ/³ÿ2¯ÿ5«ÿ8¨ÿ;¤ÿ>¢ÿ@ ÿAŸÿDÿFœÿF›ÿGœÿHœÿJ›ÿIœÿJœÿIÿGŸÿF¡ÿE¢ÿC¤ÿA¦ÿ>©ÿ<«ÿ9®ÿ5°ÿ0´ÿ+·ÿ)»ÿ$¾ÿÂÿÆÿÊÿ ÍÿÒÿØÿýÿÜÿøÿàÿðÿãÿëÿéÿäÿîÿßÿóÿØÿùÿÓÿÿÿÏÿÉÿÅÿ Àÿ¼ÿ¸ÿµÿ"±ÿ(®ÿ,¬ÿ2ªÿ6ªÿ;©ÿ@§ÿE¨ÿJ§ÿM¨ÿPªÿT¬ÿW­ÿY°ÿ\³ÿ^¶ÿ`¹ÿ`¼ÿaÀÿcÃÿ`Èÿ_Ìÿ`Ïÿ^Õÿ[ÚÿXßÿVâÿSæÿOìÿKðÿFöÿAûÿ<ÿÿ73- )# "&)ûÿ-öÿ0òÿ4íÿ7çÿ9ãÿ<Þÿ?ÛÿB×ÿFÓÿHÑÿJÍÿLÊÿNÈÿQÆÿRÅÿTÄÿUÃÿVÃÿWÂÿXÀÿYÁÿXÀÿXÁÿUÁÿUÄÿTÄÿRÄÿQÆÿNÆÿLÈÿHÊÿDËÿ@Íÿ=Ïÿ7Òÿ3Ôÿ.Öÿ(×ÿ!ÛÿÝÿßÿâÿåÿèÿüÿëÿöÿïÿîÿñÿçÿôÿáÿøÿÚÿûÿÓÿþÿÍÿÇÿÂÿ»ÿ ¶ÿ±ÿ¬ÿ©ÿ¦ÿ£ÿ¡ÿ#žÿ%œÿ)šÿ,™ÿ.˜ÿ1™ÿ2šÿ4œÿ6ÿ7Ÿÿ9¡ÿ8¤ÿ9§ÿ9ªÿ8®ÿ9²ÿ8¶ÿ8¹ÿ5¿ÿ4Äÿ1Éÿ.Íÿ,Òÿ)Øÿ'Üÿ#âÿ æÿìÿñÿøÿýÿ  þÿúÿ÷ÿóÿïÿ%ìÿ*èÿ-åÿ1âÿ5àÿ8Ýÿ<Ûÿ?ÚÿB×ÿEÖÿHÖÿJÔÿMÔÿOÑÿPÑÿRÒÿTÑÿTÒÿTÒÿVÔÿUÕÿSÔÿSÖÿS×ÿQØÿOÚÿNÛÿJÝÿHßÿEßÿAáÿ=äÿ9åÿ6çÿ0éÿ+ëÿ&íÿ!ðÿòÿôÿõÿ øÿûÿÿÿýÿûÿôÿïÿêÿäÿ Þÿ ØÿÕÿÑÿÌÿÈÿÅÿÁÿ ¾ÿ#½ÿ%ºÿ(¹ÿ*·ÿ-¶ÿ/¶ÿ1µÿ2µÿ5·ÿ5¸ÿ7¹ÿ8»ÿ9»ÿ8¾ÿ9Àÿ8Âÿ8Äÿ7Èÿ5Êÿ4Íÿ2Ñÿ0Ôÿ-×ÿ+Ûÿ'Þÿ$áÿ åÿèÿìÿïÿóÿ ÷ÿúÿýÿüÿ÷ÿôÿ ïÿ êÿçÿãÿßÿÜÿÙÿ!Öÿ$Óÿ'Ñÿ)Îÿ-Ìÿ0Ëÿ3Êÿ6Êÿ8Çÿ<Çÿ=Èÿ@ÇÿBÉÿDËÿGËÿGËÿHÍÿJÎÿIÑÿJÒÿJÕÿIÖÿIÙÿGÜÿEÞÿDáÿ@ãÿ>æÿ;èÿ7ëÿ4íÿ0ðÿ,òÿ&öÿ!øÿûÿýÿÿÿýÿöÿðÿ éÿ äÿÜÿÖÿÑÿËÿÄÿÀÿ»ÿ"¶ÿ$³ÿ&¯ÿ(«ÿ*ªÿ-§ÿ/¦ÿ0¥ÿ3¤ÿ5£ÿ5¢ÿ6¥ÿ7¦ÿ9§ÿ8ªÿ9­ÿ:¯ÿ:²ÿ8¶ÿ8¹ÿ7½ÿ5Áÿ4Æÿ1Ëÿ/Ðÿ.Õÿ*Úÿ'ßÿ#äÿ éÿîÿóÿøÿýÿ  þÿ üÿ÷ÿñÿíÿçÿ"ãÿ&Þÿ)Ûÿ.Öÿ1Óÿ5Ðÿ8Ìÿ;Éÿ<Çÿ?ÅÿCÂÿEÀÿG¿ÿI¾ÿK¾ÿM»ÿO»ÿP¼ÿQ»ÿS¾ÿT¿ÿS¿ÿSÁÿTÃÿSÄÿSÆÿPÇÿPÊÿNÍÿLÐÿJÓÿGÕÿDÙÿ@Üÿ=àÿ8ãÿ5æÿ0êÿ+íÿ&ðÿ ôÿøÿüÿÿÿþÿøÿ òÿëÿåÿßÿÙÿÓÿ#Ïÿ&Éÿ*Åÿ.Àÿ2»ÿ4¸ÿ8´ÿ;°ÿ>¯ÿA¬ÿD«ÿGªÿI§ÿK§ÿL¨ÿN§ÿP¨ÿP¨ÿQªÿP¬ÿQ­ÿP¯ÿP²ÿP´ÿN·ÿL»ÿJ¾ÿIÁÿEÅÿBÈÿ?Ìÿ;Ðÿ7Ôÿ3Øÿ-Üÿ)áÿ#ãÿéÿîÿñÿ õÿûÿÿÿýÿùÿñÿ íÿ çÿàÿÛÿÖÿÑÿ"Ìÿ%Èÿ*Åÿ-Áÿ1¼ÿ5ºÿ8·ÿ<µÿ?²ÿB°ÿD¯ÿH®ÿJ¬ÿM­ÿO¬ÿQ¬ÿQ­ÿT¬ÿT­ÿT®ÿV°ÿU±ÿT³ÿSµÿR·ÿO¹ÿN¼ÿJ¾ÿGÁÿDÅÿ?Æÿ;Éÿ8Ìÿ2Ðÿ,Óÿ&Öÿ!ÚÿÞÿáÿåÿéÿíÿüÿñÿöÿõÿïÿùÿèÿüÿâÿÜÿÖÿÑÿ ÌÿÇÿÃÿ¾ÿ»ÿ#·ÿ'´ÿ,³ÿ/°ÿ4°ÿ9¯ÿ<®ÿ?¬ÿC­ÿF®ÿI°ÿL±ÿP´ÿR·ÿT¹ÿV¼ÿV¾ÿYÂÿYÅÿXÈÿYÌÿXÐÿYÕÿXÚÿUÜÿTáÿQæÿNéÿLîÿHñÿEõÿAúÿ=ýÿ960+ & ! !$þÿ'ùÿ)ôÿ,ïÿ.êÿ2çÿ4ãÿ6Þÿ8Ûÿ:×ÿ<Ôÿ?ÒÿAÎÿBÌÿDÊÿEÈÿFÆÿGÆÿFÅÿGÃÿJÃÿIÃÿGÀÿFÀÿFÁÿDÀÿBÂÿ@Äÿ=Äÿ;Ãÿ8Åÿ4Æÿ0Æÿ+Èÿ(Éÿ$ËÿÌÿÍÿÐÿ ÑÿÔÿÖÿýÿ×ÿöÿÛÿðÿÝÿêÿßÿäÿâÿÞÿäÿØÿèÿÓÿëÿÌÿíÿÇÿñÿÃÿôÿ¿ÿøÿ¼ÿûÿ¶ÿþÿ³ÿ°ÿ­ÿ«ÿ ©ÿ ¨ÿ¦ÿ¦ÿ¥ÿ¦ÿ¥ÿ§ÿ!©ÿ$«ÿ'­ÿ)¯ÿ+²ÿ+´ÿ-¸ÿ.»ÿ/¿ÿ.Äÿ/Çÿ/Êÿ.Ðÿ.Ôÿ.×ÿ,Üÿ+âÿ*æÿ(ìÿ&ðÿ#õÿ!úÿþÿ   %*-1þÿ7ýÿ:úÿ=øÿAöÿDôÿGôÿKóÿNñÿQðÿSïÿVðÿXïÿZîÿZíÿ[îÿ[ïÿ^ðÿ^ïÿ]ïÿ\ðÿYïÿYðÿVóÿSóÿQóÿNõÿJõÿFõÿA÷ÿ<øÿ8÷ÿ3øÿ-úÿ(úÿ!úÿýÿýÿ ýÿÿÿÿÿüÿÿÿöÿïÿèÿâÿÜÿÕÿÑÿÌÿÇÿÃÿ ¾ÿ ºÿ ·ÿ´ÿ±ÿ°ÿ®ÿ¬ÿ¬ÿ«ÿªÿ«ÿ¬ÿ®ÿ°ÿ±ÿ³ÿµÿ¸ÿºÿ½ÿ¿ÿÃÿÆÿÉÿÌÿÐÿÓÿÖÿ Úÿ Ýÿáÿåÿèÿëÿþÿïÿúÿòÿ÷ÿöÿóÿùÿðÿýÿìÿéÿåÿâÿßÿ ÜÿÚÿ×ÿÔÿÒÿÐÿÎÿ"Ìÿ&Ìÿ)Ëÿ,Êÿ/Ëÿ2Êÿ5Ëÿ8Êÿ:Ëÿ=Ìÿ?ÍÿAÎÿCÑÿEÒÿFÔÿG×ÿGÙÿHÜÿIÞÿFáÿFãÿFæÿDêÿCìÿ@ïÿ?òÿ;õÿ8ùÿ4ûÿ0þÿ+&$  þÿùÿôÿíÿ çÿ#ãÿ%Þÿ(Ùÿ*Öÿ+Ñÿ.Ìÿ1Éÿ1Æÿ4Ãÿ6Áÿ7¿ÿ:¿ÿ;½ÿ<¼ÿ=»ÿ>¼ÿ@»ÿ?¼ÿ@½ÿBÀÿBÁÿAÃÿ@Æÿ?Çÿ?Êÿ=Íÿ;Ïÿ;Óÿ9Öÿ6Úÿ3Þÿ1áÿ.åÿ*éÿ'ìÿ#ðÿôÿ÷ÿûÿÿÿ  þÿùÿôÿïÿêÿåÿàÿ!Ýÿ$Ùÿ'Ôÿ+Ñÿ-Íÿ/Éÿ2Çÿ4Äÿ6Ãÿ8¿ÿ;¾ÿ;¼ÿ=»ÿ?ºÿ@¹ÿAºÿBºÿA¹ÿAºÿB¹ÿAºÿAºÿ@¼ÿ?½ÿ=¿ÿ:Àÿ9Áÿ6Äÿ3Æÿ1Èÿ-Êÿ)Íÿ$Ïÿ ÒÿÖÿØÿÚÿ ÞÿáÿåÿýÿèÿøÿëÿñÿïÿíÿòÿçÿõÿáÿùÿÛÿüÿÖÿÿÿÑÿÌÿÇÿÃÿ Àÿ¼ÿ¹ÿ¶ÿ³ÿ±ÿ#¯ÿ&®ÿ*¬ÿ-­ÿ1¬ÿ5¬ÿ7­ÿ:¬ÿ=®ÿ?°ÿB²ÿB´ÿE·ÿGºÿG½ÿJ¿ÿJÂÿIÆÿJÉÿIÍÿIÑÿGÔÿFÚÿEÝÿBáÿ@æÿ?èÿ;îÿ8òÿ6õÿ1úÿ.ÿÿ)%"  "'þÿ*ùÿ/öÿ2òÿ6ìÿ;éÿ=æÿAâÿEßÿHÜÿKÙÿNÕÿQÔÿTÒÿWÏÿYÏÿZÎÿ[Ìÿ^Ëÿ^Êÿ_Ëÿ`Ëÿ_Êÿ_Ëÿ]Êÿ\ËÿZËÿXÌÿVÍÿRÍÿOÐÿKÐÿFÑÿAÓÿ<Ôÿ7Öÿ2×ÿ+Úÿ%ÛÿÝÿßÿáÿ ãÿåÿýÿçÿ÷ÿéÿïÿìÿéÿîÿâÿñÿÚÿóÿÕÿöÿÎÿøÿÉÿûÿÃÿþÿ½ÿ¹ÿ´ÿ±ÿ¬ÿ ©ÿ §ÿ¥ÿ¤ÿ¡ÿ¡ÿŸÿžÿ"žÿ$¡ÿ'¡ÿ)£ÿ+¥ÿ-¦ÿ/©ÿ0«ÿ1®ÿ3°ÿ4´ÿ3·ÿ3»ÿ4¿ÿ3Ãÿ4Çÿ3Êÿ2Ðÿ0Òÿ/×ÿ-Üÿ+Þÿ(äÿ&éÿ#îÿ!ñÿõÿûÿÿÿ ÿÿüÿ"øÿ'õÿ*òÿ/ðÿ2íÿ5ëÿ9èÿ<æÿ?äÿBãÿFáÿHßÿJßÿKÞÿNÝÿPÛÿPÜÿQÛÿQÛÿTÜÿRÛÿPÜÿQÛÿOÜÿMÛÿKÜÿJÜÿGßÿDßÿ@ßÿ<áÿ8áÿ5âÿ0äÿ+äÿ&æÿ!çÿéÿêÿìÿ îÿïÿñÿþÿóÿùÿôÿôÿöÿïÿøÿêÿûÿåÿýÿàÿþÿÛÿØÿÔÿÏÿÍÿÉÿ Çÿ ÆÿÄÿÂÿÀÿÀÿ¿ÿ¾ÿ¿ÿ¾ÿ ¿ÿ!Áÿ"Áÿ%Áÿ%Ãÿ&Äÿ'Åÿ&Çÿ'Éÿ'Ëÿ&Îÿ'Ðÿ&Óÿ%Õÿ$Øÿ#Úÿ!Ýÿ àÿãÿæÿêÿíÿðÿôÿ÷ÿ ûÿ þÿ ÿÿüÿúÿøÿ÷ÿôÿ!òÿ%ñÿ(îÿ,îÿ0ìÿ2ëÿ5éÿ8éÿ:èÿ=éÿ?èÿAéÿAèÿCéÿDéÿEèÿDéÿEèÿDéÿCéÿAëÿ@ëÿ>ëÿ<íÿ9îÿ6íÿ3ïÿ.ðÿ+ðÿ&òÿ!óÿòÿôÿõÿ õÿ÷ÿøÿÿÿøÿúÿúÿóÿúÿïÿûÿêÿýÿåÿýÿàÿÿÿÜÿÿÿÙÿÔÿÐÿÍÿÈÿÆÿÃÿÁÿÀÿ ¿ÿ ¾ÿ ¾ÿ»ÿ»ÿ¼ÿ»ÿ½ÿ¿ÿÀÿÁÿÄÿÅÿÇÿÉÿËÿÎÿÐÿÔÿ×ÿÙÿÝÿàÿãÿæÿêÿíÿðÿôÿ ÷ÿ úÿþÿÿÿýÿ úÿ÷ÿõÿòÿðÿíÿ ëÿ#éÿ&èÿ)æÿ,äÿ0ãÿ2áÿ5àÿ8àÿ:ßÿ<Þÿ>ßÿ@ÞÿBßÿCßÿEàÿFáÿGáÿFãÿFäÿGåÿFæÿFçÿDêÿCëÿAíÿ?ïÿ=ðÿ:óÿ7ôÿ4÷ÿ0ùÿ,úÿ(ýÿ$þÿ  þÿ ùÿ ôÿîÿèÿåÿàÿÛÿ×ÿÓÿÏÿËÿÉÿ Åÿ!Äÿ"Áÿ$¿ÿ%¿ÿ&½ÿ'¼ÿ(»ÿ*»ÿ)¹ÿ*ºÿ+»ÿ,¼ÿ+½ÿ+¿ÿ,¿ÿ+Áÿ)Ãÿ)Äÿ)Æÿ&Éÿ&Ëÿ$Îÿ"Ñÿ Ôÿ×ÿÙÿÝÿßÿãÿçÿ êÿ îÿñÿõÿùÿþÿüÿúÿöÿóÿïÿ ìÿ éÿåÿâÿßÿÛÿØÿ"Öÿ'Óÿ*Ñÿ-Ïÿ0Îÿ3Ëÿ5Ëÿ8Éÿ:Èÿ<Çÿ>Èÿ@ÇÿAÈÿBÇÿCÈÿEÈÿDÈÿDÉÿDËÿAËÿAÍÿ?Ïÿ=Ðÿ<Òÿ:Ôÿ6Öÿ3Øÿ1Úÿ,Ýÿ(ßÿ$âÿäÿåÿèÿìÿ îÿñÿóÿöÿüÿøÿ÷ÿüÿñÿÿÿíÿêÿåÿàÿÞÿ ÙÿÖÿÓÿÐÿÏÿÌÿÉÿ!Çÿ#Çÿ&Æÿ)Åÿ+Æÿ.Åÿ0Åÿ3Äÿ6Æÿ8Åÿ:Æÿ;Èÿ=Êÿ?Ëÿ@ÌÿAÎÿBÐÿAÒÿAÔÿB×ÿAÙÿBÜÿAÞÿ?áÿ>ãÿ<æÿ;êÿ9ìÿ6îÿ4òÿ1õÿ.÷ÿ*ûÿ'þÿ$    ýÿ!úÿ%ôÿ(òÿ+îÿ.êÿ2çÿ4äÿ7áÿ9ßÿ<Üÿ=Ùÿ@×ÿBÕÿCÓÿEÑÿFÐÿGÏÿFÌÿFÌÿGÌÿFÊÿDÊÿCËÿAÊÿ?Ëÿ=Êÿ:Ëÿ8Ëÿ4Ìÿ1Íÿ-Ìÿ)Íÿ#ÐÿÐÿÑÿÒÿÓÿ ÖÿÖÿÙÿþÿÛÿøÿÜÿñÿÞÿíÿàÿçÿáÿâÿäÿÞÿåÿØÿèÿÔÿëÿÑÿíÿÍÿðÿÈÿòÿÆÿõÿÂÿ÷ÿÀÿúÿ½ÿþÿ»ÿÿÿ¹ÿ¸ÿ¶ÿµÿ ´ÿ ´ÿ³ÿ³ÿ¶ÿ´ÿµÿ·ÿ·ÿ!ºÿ"»ÿ%½ÿ&¿ÿ(Âÿ*Äÿ*Æÿ+Éÿ,Ìÿ,Ðÿ/Óÿ/Öÿ.Ùÿ.Ýÿ+áÿ+åÿ,èÿ*ìÿ)ðÿ(õÿ%ùÿ$üÿ"  #' + .36:>@DÿÿFþÿIüÿLûÿNùÿPøÿP÷ÿR÷ÿSôÿTôÿSôÿTòÿRòÿPóÿPòÿNïÿLïÿJðÿGïÿDðÿ@ïÿ=ðÿ9ïÿ6îÿ0íÿ-îÿ)íÿ#íÿîÿðÿðÿïÿ ðÿïÿðÿþÿðÿùÿóÿõÿóÿòÿòÿíÿóÿçÿôÿäÿõÿáÿöÿÝÿøÿÚÿøÿÖÿúÿÓÿûÿÑÿüÿÎÿþÿÌÿþÿËÿÈÿÆÿÆÿÅÿÄÿÃÿÄÿÁÿÀÿ Áÿ Àÿ Àÿ Áÿ Áÿ Äÿ ÄÿÄÿ Æÿ Æÿ Èÿ Éÿ Êÿ Ìÿ ÍÿÐÿÓÿÕÿØÿÚÿÝÿßÿãÿæÿþÿêÿýÿíÿûÿñÿùÿõÿøÿùÿ÷ÿüÿõÿóÿóÿòÿ ñÿïÿðÿîÿíÿîÿ!íÿ%îÿ(íÿ,íÿ.îÿ1íÿ3îÿ5ïÿ7ðÿ9ïÿ9ðÿ:óÿ;óÿ:ôÿ;õÿ:öÿ:ùÿ9øÿ8ûÿ7ýÿ4ýÿ3ÿÿ0-+'$!   ýÿúÿ÷ÿõÿòÿðÿîÿìÿêÿèÿçÿåÿäÿãÿãÿâÿàÿáÿàÿ áÿ áÿàÿ áÿàÿ áÿáÿ âÿäÿãÿäÿæÿæÿæÿéÿéÿêÿëÿìÿîÿïÿ ñÿ óÿôÿ÷ÿùÿÿÿúÿþÿýÿûÿþÿøÿõÿóÿðÿíÿ éÿ çÿåÿâÿàÿßÿÜÿÚÿÚÿ×ÿ Öÿ!Õÿ"Ôÿ%Ôÿ&Óÿ'Ñÿ'Òÿ*Ñÿ*Òÿ)Òÿ*Óÿ)Õÿ(Ôÿ&Õÿ&×ÿ$Øÿ"Úÿ!ÛÿÛÿÞÿßÿáÿãÿåÿ æÿ èÿëÿíÿïÿÿÿðÿýÿóÿùÿõÿöÿ÷ÿóÿúÿïÿüÿìÿÿÿéÿæÿãÿáÿßÿÞÿ Ûÿ ÚÿØÿÖÿÖÿÕÿÔÿÕÿÔÿÕÿ"Ôÿ#Õÿ%Õÿ&Ôÿ'Õÿ*Õÿ+Öÿ,×ÿ-×ÿ/Úÿ.Úÿ.Úÿ/Üÿ0Üÿ0ßÿ.àÿ/áÿ.äÿ.åÿ+çÿ+éÿ*ëÿ'íÿ&ðÿ#òÿ!õÿ÷ÿúÿüÿ þÿüÿøÿ!öÿ%ôÿ(ñÿ+ïÿ/ìÿ2êÿ4èÿ7æÿ9ãÿ;âÿ=àÿ?ßÿ@ÞÿAÝÿBÜÿAÛÿAÛÿBÙÿAÙÿAÚÿ?Ùÿ=Úÿ;Ùÿ:Úÿ7Ùÿ5Úÿ2Úÿ/Üÿ+Üÿ'Üÿ#ÞÿßÿÞÿàÿáÿâÿ äÿåÿçÿÿÿéÿüÿéÿ÷ÿëÿóÿíÿðÿïÿëÿðÿèÿóÿäÿôÿâÿ÷ÿßÿúÿÜÿúÿÚÿýÿ×ÿÿÿÖÿÔÿÑÿÐÿÏÿ Îÿ ÌÿÍÿÌÿËÿÊÿËÿËÿÊÿËÿ!Êÿ"Ëÿ%Íÿ%Íÿ'Ìÿ)Íÿ*Îÿ*Ðÿ*Ðÿ,Òÿ,Óÿ+Ôÿ+Öÿ)Öÿ)Ùÿ)Úÿ'Ýÿ&ßÿ%àÿ#ãÿ!æÿèÿìÿîÿòÿõÿùÿüÿÿÿ    þÿûÿùÿöÿ#ôÿ&òÿ*ðÿ-íÿ0ìÿ3êÿ5éÿ7èÿ9åÿ;åÿ;äÿ=ãÿ=âÿ<àÿ=áÿ<àÿ<àÿ;ßÿ:Þÿ9ßÿ7Þÿ5ßÿ2áÿ0áÿ-àÿ*áÿ'àÿ$áÿ äÿäÿãÿåÿæÿæÿ éÿéÿéÿìÿÿÿìÿýÿïÿúÿïÿøÿñÿõÿóÿòÿôÿðÿöÿíÿøÿëÿúÿéÿûÿèÿþÿåÿÿÿäÿãÿáÿàÿßÿÞÿ Þÿ Ûÿ ÛÿÛÿÙÿÚÿÚÿÙÿÙÿ×ÿÖÿ×ÿÖÿÖÿ ×ÿÖÿ ×ÿ"Úÿ"Úÿ!Ùÿ"Ûÿ!Üÿ Üÿßÿ àÿáÿäÿçÿéÿìÿîÿñÿôÿøÿûÿþÿ   !$ÿÿ'ýÿ)ûÿ,úÿ.ùÿ/øÿ1øÿ3õÿ3õÿ2õÿ3óÿ2ôÿ3òÿ2ðÿ2ðÿ/ñÿ.ïÿ,îÿ*ïÿ'îÿ%îÿ"îÿ îÿëÿëÿìÿëÿìÿ ëÿ ìÿëÿìÿíÿïÿÿÿîÿþÿïÿûÿïÿùÿðÿöÿñÿôÿñÿòÿóÿðÿôÿïÿôÿîÿöÿëÿ÷ÿêÿøÿéÿúÿèÿúÿæÿýÿæÿþÿåÿäÿåÿâÿáÿáÿßÿßÿàÿßÿÞÿ Üÿ Ýÿ Üÿ Ûÿ Úÿ ÛÿÛÿÚÿÛÿÚÿÛÿÚÿÛÿ Ýÿ Ýÿ Ýÿ àÿ áÿ ãÿ åÿæÿéÿìÿîÿòÿôÿøÿûÿþÿÿÿÿÿýÿ ýÿ üÿúÿûÿùÿøÿùÿ!øÿ%ùÿ'øÿ)øÿ,ùÿ.øÿ/ùÿ0øÿ2ùÿ3øÿ2ùÿ2úÿ3ûÿ2úÿ2ûÿ0ýÿ/þÿ.ýÿ,þÿ*'%ÿÿ$!  þÿýÿ üÿ ùÿ ùÿ ÷ÿ õÿ õÿ ôÿóÿóÿðÿðÿðÿîÿîÿíÿëÿìÿêÿéÿéÿæÿæÿæÿäÿäÿáÿáÿâÿàÿßÿ àÿ àÿ ßÿàÿßÿàÿàÿáÿâÿâÿÿÿåÿýÿæÿûÿçÿøÿêÿöÿíÿôÿïÿòÿñÿðÿôÿíÿ÷ÿëÿùÿêÿýÿèÿÿÿæÿäÿãÿáÿáÿ àÿ ßÿÝÿÝÿÜÿÛÿÜÿÛÿÜÿÛÿÛÿÜÿÜÿÝÿÞÿÞÿßÿáÿáÿãÿãÿäÿæÿçÿêÿëÿíÿ ïÿ ðÿòÿôÿöÿøÿûÿýÿÿÿÿÿþÿýÿüÿúÿ ûÿ úÿúÿøÿøÿùÿøÿùÿøÿùÿøÿ ùÿ$ùÿ%øÿ&ùÿ)øÿ*ùÿ,øÿ-ùÿ.øÿ/ùÿ0øÿ1øÿ0õÿ0õÿ1öÿ0õÿ1ôÿ0óÿ0ôÿ.óÿ-ôÿ-óÿ,ôÿ*ôÿ(óÿ'ôÿ$óÿ#ôÿ ôÿöÿöÿ÷ÿúÿúÿýÿ ÿÿ ÿÿ üÿ ùÿöÿôÿñÿîÿëÿéÿçÿæÿãÿ!áÿ#àÿ#Ýÿ$Üÿ%Ûÿ$Úÿ%Øÿ$Ùÿ#×ÿ"×ÿ"ÖÿÔÿÕÿÔÿÕÿÕÿÔÿÕÿÔÿ Õÿ ÔÿÕÿÕÿÖÿØÿÿÿ×ÿüÿÙÿúÿÚÿ÷ÿÛÿõÿÜÿòÿÝÿðÿßÿîÿáÿíÿâÿëÿäÿêÿæÿèÿèÿçÿêÿçÿíÿåÿïÿåÿñÿæÿóÿåÿöÿäÿøÿâÿüÿãÿþÿâÿâÿãÿâÿãÿ âÿ ãÿâÿãÿâÿãÿãÿâÿãÿâÿ!ãÿ"âÿ$ãÿ&âÿ(ãÿ(ãÿ)ãÿ*äÿ,æÿ+åÿ,æÿ,çÿ+èÿ,éÿ+ìÿ+íÿ)ïÿ(ñÿ(òÿ&õÿ$øÿ#ûÿ!ýÿ   !%(+--02þÿ3üÿ5úÿ6ùÿ7øÿ6õÿ6õÿ6óÿ5òÿ4ñÿ3ðÿ0ïÿ/ïÿ-ìÿ*ìÿ)ìÿ'êÿ$ëÿ!êÿèÿçÿèÿçÿçÿèÿ çÿ èÿçÿèÿçÿèÿèÿéÿþÿëÿûÿêÿùÿëÿøÿíÿöÿíÿõÿîÿôÿðÿóÿñÿòÿòÿñÿóÿðÿôÿïÿöÿïÿöÿìÿùÿëÿúÿëÿüÿéÿþÿèÿÿÿçÿçÿæÿåÿâÿâÿàÿÞÿÞÿÝÿÜÿÛÿ Úÿ Ùÿ Øÿ Øÿ Õÿ Õÿ Öÿ Õÿ Öÿ Õÿ Öÿ ×ÿ Ùÿ Úÿ Üÿ Ýÿ Þÿ áÿäÿæÿéÿìÿïÿóÿöÿùÿýÿ ÿÿÿÿÿÿ ÿÿ"þÿ"ýÿ#þÿ#ýÿ&ýÿ&þÿ%ýÿ&þÿ%ýÿ$þÿ"ýÿ"þÿ!ýÿ þÿþÿýÿþÿýÿþÿýÿþÿýÿþÿýÿþÿþÿ þÿ þÿ ÿÿ ÿÿ ÿÿ ýÿûÿùÿøÿ÷ÿöÿôÿòÿðÿïÿíÿìÿìÿêÿ èÿ èÿ çÿ æÿ çÿæÿçÿæÿçÿçÿèÿéÿêÿíÿÿÿíÿþÿïÿüÿòÿúÿóÿúÿõÿùÿøÿ÷ÿùÿöÿüÿõÿþÿôÿóÿñÿòÿðÿïÿðÿ ïÿ íÿ íÿîÿíÿîÿíÿîÿîÿíÿîÿîÿîÿðÿðÿïÿðÿñÿ òÿ ñÿ òÿõÿõÿôÿöÿ÷ÿ÷ÿùÿùÿúÿûÿÿÿûÿÿÿþÿýÿþÿýÿÿÿþÿýÿþÿýÿþÿýÿýÿþÿýÿþÿþÿ þÿ ÿÿÿÿÿÿþÿýÿþÿýÿýÿüÿúÿúÿøÿøÿ÷ÿöÿöÿôÿôÿóÿñÿòÿðÿïÿðÿïÿðÿðÿðÿ òÿ òÿ óÿöÿõÿøÿùÿúÿýÿÿÿÿÿþÿüÿúÿøÿ÷ÿ öÿ ôÿòÿñÿñÿðÿïÿíÿìÿëÿëÿêÿèÿéÿèÿèÿèÿçÿèÿçÿèÿèÿèÿéÿèÿéÿéÿ êÿ ìÿìÿíÿîÿîÿñÿñÿñÿóÿÿÿôÿþÿöÿýÿ÷ÿüÿúÿúÿúÿûÿûÿúÿþÿúÿÿÿùÿùÿúÿùÿúÿùÿúÿúÿ ûÿ úÿûÿûÿúÿûÿúÿùÿùÿúÿùÿùÿøÿöÿ÷ÿõÿ ôÿôÿ òÿòÿ ñÿðÿñÿîÿíÿîÿíÿìÿëÿìÿîÿîÿíÿîÿïÿñÿ òÿ ôÿõÿöÿùÿúÿûÿþÿÿÿýÿûÿùÿ÷ÿõÿôÿ òÿ ñÿïÿíÿìÿëÿéÿéÿèÿçÿæÿäÿåÿäÿãÿäÿãÿäÿãÿäÿãÿäÿäÿ ãÿ äÿ ãÿäÿäÿåÿæÿæÿçÿèÿèÿêÿëÿÿÿìÿþÿîÿýÿîÿþÿðÿýÿòÿýÿóÿþÿõÿýÿöÿþÿùÿýÿûÿþÿûÿýÿþÿþÿýÿþÿþÿýÿþÿýÿ þÿ ýÿþÿýÿýÿýÿúÿúÿûÿúÿùÿùÿ øÿ öÿ!öÿ!ôÿ$ôÿ$óÿ#òÿ$óÿ$òÿ$ðÿ#ðÿ#ñÿ$ðÿ#ñÿ"ñÿ òÿ óÿòÿôÿõÿöÿøÿúÿûÿýÿ    ÿÿþÿûÿùÿùÿöÿõÿôÿòÿñÿðÿîÿíÿìÿëÿéÿéÿèÿçÿåÿ åÿ äÿ ãÿäÿãÿãÿáÿáÿâÿáÿâÿÿÿãÿþÿäÿýÿãÿüÿäÿûÿäÿûÿæÿúÿæÿùÿçÿúÿéÿùÿéÿúÿêÿùÿëÿùÿîÿúÿïÿùÿðÿúÿòÿùÿóÿúÿöÿùÿ÷ÿøÿùÿöÿûÿ÷ÿüÿöÿþÿöÿÿÿöÿöÿõÿõÿõÿòÿòÿñÿ ðÿ ðÿ îÿ îÿíÿìÿìÿêÿêÿëÿêÿéÿèÿêÿëÿêÿëÿëÿíÿíÿïÿðÿòÿôÿöÿøÿúÿýÿÿÿ      ÿÿÿÿÿÿýÿýÿþÿýÿüÿûÿüÿ ûÿ ûÿ úÿ ùÿ úÿ ùÿúÿúÿùÿúÿùÿúÿüÿüÿûÿüÿüÿþÿþÿýÿÿÿÿÿÿÿþÿýÿüÿúÿùÿ÷ÿöÿõÿóÿòÿñÿïÿíÿìÿêÿêÿèÿçÿæÿæÿåÿäÿåÿäÿÿÿäÿÿÿåÿýÿåÿýÿçÿüÿçÿûÿèÿûÿêÿùÿëÿùÿíÿ÷ÿîÿ÷ÿïÿ÷ÿòÿõÿóÿöÿõÿóÿøÿòÿùÿóÿûÿòÿüÿòÿþÿòÿñÿòÿñÿòÿòÿñÿòÿòÿóÿ óÿ òÿ óÿ óÿ ôÿ öÿ õÿ öÿ øÿ øÿ øÿúÿúÿ ûÿüÿüÿþÿþÿÿÿ                  ÿÿþÿýÿûÿúÿùÿøÿ÷ÿ÷ÿ õÿ õÿ öÿ õÿöÿõÿöÿõÿöÿöÿøÿþÿøÿüÿùÿûÿúÿùÿûÿ÷ÿýÿöÿýÿôÿþÿòÿñÿïÿîÿìÿêÿêÿéÿçÿæÿæÿåÿäÿâÿãÿâÿáÿâÿáÿâÿáÿâÿáÿáÿâÿáÿâÿáÿÿÿâÿþÿâÿýÿãÿýÿãÿûÿäÿûÿæÿûÿçÿùÿèÿúÿéÿùÿêÿúÿìÿùÿíÿøÿïÿøÿðÿúÿòÿúÿôÿùÿöÿúÿøÿùÿúÿúÿüÿüÿþÿüÿüÿþÿþÿþÿ ÿÿ ÿÿÿÿ!!ÿÿ"ýÿ#ýÿ"þÿ#üÿ$ûÿ%üÿ$ûÿ$ùÿ"ùÿ"úÿ#ùÿ!úÿ ùÿ úÿùÿùÿúÿúÿüÿüÿýÿþÿÿÿ    ÿÿýÿüÿúÿùÿ÷ÿõÿôÿóÿñÿðÿïÿíÿíÿìÿëÿêÿèÿèÿ çÿ çÿ åÿ åÿ æÿåÿäÿãÿäÿãÿäÿãÿäÿæÿæÿåÿÿÿçÿÿÿèÿÿÿèÿþÿêÿýÿêÿþÿëÿþÿíÿýÿîÿþÿðÿýÿñÿþÿóÿýÿôÿþÿöÿýÿøÿþÿúÿýÿûÿýÿýÿþÿÿÿýÿýÿýÿûÿûÿüÿûÿ úÿ ùÿ ùÿ ÷ÿ÷ÿöÿõÿõÿóÿóÿóÿñÿðÿïÿðÿîÿïÿïÿîÿïÿîÿïÿîÿïÿïÿïÿðÿðÿóÿôÿôÿ öÿ ÷ÿ øÿ úÿ üÿ þÿÿÿ ÿÿ ýÿ ýÿ üÿ ûÿúÿ øÿøÿ÷ÿ÷ÿöÿ õÿóÿ ôÿòÿ òÿ òÿ ïÿ ïÿ ðÿ ïÿ ðÿ ïÿïÿ îÿïÿðÿðÿïÿðÿðÿðÿóÿóÿòÿôÿôÿ÷ÿ÷ÿ÷ÿùÿúÿüÿüÿþÿÿÿ ÿÿ þÿ ýÿûÿ ûÿ úÿ÷ÿ ÷ÿöÿôÿóÿóÿ òÿòÿñÿ ðÿñÿ ðÿ ñÿ ñÿ ðÿ ñÿ ñÿ óÿóÿ óÿôÿõÿ÷ÿ÷ÿùÿûÿüÿýÿÿÿÿÿÿÿÿÿýÿýÿüÿûÿüÿûÿ úÿ úÿúÿ ÷ÿ÷ÿøÿöÿ÷ÿöÿöÿóÿóÿôÿóÿôÿóÿóÿòÿóÿòÿóÿôÿõÿôÿõÿõÿöÿ÷ÿöÿ÷ÿøÿøÿûÿûÿûÿýÿþÿÿÿ ÿÿ þÿ ýÿ üÿ ûÿûÿúÿ ùÿ ÷ÿ ÷ÿ öÿ öÿ õÿ ôÿ õÿ ôÿ õÿõÿôÿõÿôÿõÿ÷ÿ÷ÿ÷ÿøÿùÿûÿûÿüÿþÿÿÿÿÿþÿýÿýÿûÿûÿüÿûÿúÿúÿúÿ÷ÿ÷ÿ øÿ÷ÿ øÿ ÷ÿ öÿ ÷ÿ öÿ öÿ ÷ÿ öÿ÷ÿ öÿ÷ÿöÿ÷ÿ÷ÿøÿùÿøÿùÿùÿúÿûÿúÿûÿüÿüÿýÿÿÿÿÿ    ÿÿþÿüÿûÿûÿúÿøÿøÿ ÷ÿ öÿ õÿ ôÿ õÿóÿòÿóÿòÿóÿóÿòÿóÿóÿÿÿõÿþÿõÿüÿõÿûÿ÷ÿúÿ÷ÿøÿøÿ÷ÿùÿöÿúÿôÿûÿôÿûÿòÿüÿñÿÿÿðÿÿÿðÿïÿîÿíÿíÿëÿëÿëÿéÿéÿêÿéÿéÿèÿçÿèÿçÿèÿéÿéÿêÿéÿêÿêÿìÿìÿìÿîÿîÿïÿðÿðÿóÿõÿõÿ÷ÿøÿúÿüÿýÿ    !"""#"#""!ÿÿ!ÿÿ!þÿýÿûÿûÿúÿúÿûÿùÿøÿùÿùÿøÿùÿøÿ ùÿ ûÿ ûÿúÿûÿüÿüÿÿÿÿÿÿÿÿÿýÿûÿúÿùÿöÿõÿóÿòÿñÿïÿíÿíÿìÿéÿèÿèÿæÿåÿäÿãÿâÿâÿáÿáÿàÿßÿàÿßÿàÿßÿàÿßÿÿÿßÿÿÿàÿàÿÿÿâÿÿÿâÿþÿâÿÿÿãÿþÿäÿÿÿçÿþÿæÿÿÿèÿþÿêÿþÿëÿÿÿíÿÿÿîÿÿÿðÿòÿôÿÿÿöÿøÿÿÿûÿýÿÿÿ ÿÿÿÿþÿþÿþÿüÿüÿüÿúÿúÿúÿùÿøÿùÿùÿøÿùÿøÿùÿøÿùÿùÿùÿûÿûÿüÿýÿýÿÿÿÿÿ    ÿÿ ÿÿ ýÿ üÿ úÿ ùÿ øÿ ÷ÿ õÿ õÿ óÿ òÿ ñÿ ðÿðÿ îÿîÿíÿìÿíÿìÿêÿêÿëÿêÿëÿëÿëÿíÿíÿìÿîÿïÿïÿñÿñÿòÿóÿôÿöÿ÷ÿøÿùÿûÿüÿþÿÿÿÿÿÿÿÿÿÿÿþÿýÿüÿûÿ úÿùÿ øÿ øÿ÷ÿ öÿõÿ ôÿóÿ óÿòÿ ñÿòÿñÿñÿðÿñÿðÿñÿòÿòÿñÿòÿôÿôÿõÿ÷ÿ÷ÿøÿùÿúÿûÿüÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿýÿüÿýÿüÿüÿûÿúÿûÿúÿúÿûÿúÿúÿøÿøÿùÿøÿùÿøÿùÿûÿûÿúÿûÿûÿüÿýÿýÿþÿÿÿÿÿ        ÿÿ ÿÿ þÿ ýÿ ûÿûÿúÿùÿøÿøÿ÷ÿ÷ÿøÿ÷ÿøÿÿÿ÷ÿÿÿøÿþÿ÷ÿüÿøÿûÿ÷ÿúÿøÿøÿøÿøÿùÿ÷ÿøÿöÿùÿõÿûÿõÿûÿôÿüÿóÿýÿòÿýÿòÿÿÿðÿÿÿðÿÿÿðÿîÿÿÿïÿîÿîÿíÿîÿîÿíÿîÿíÿîÿíÿîÿíÿîÿîÿîÿïÿïÿÿÿïÿñÿÿÿñÿÿÿòÿóÿÿÿôÿÿÿõÿþÿõÿÿÿöÿþÿøÿþÿøÿÿÿúÿþÿüÿÿÿýÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿ þÿ ÿÿ ÿÿ ÿÿÿÿÿÿþÿüÿûÿúÿøÿ÷ÿõÿõÿôÿòÿòÿñÿðÿïÿîÿíÿìÿëÿëÿëÿêÿëÿêÿéÿèÿéÿèÿéÿèÿéÿéÿëÿëÿêÿìÿíÿíÿîÿïÿðÿòÿòÿôÿÿÿõÿöÿÿÿøÿÿÿúÿüÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿüÿýÿüÿûÿûÿúÿùÿùÿ÷ÿ÷ÿ÷ÿõÿõÿöÿõÿöÿõÿôÿôÿ õÿ õÿ öÿ õÿöÿ÷ÿøÿøÿúÿúÿûÿüÿÿÿüÿþÿþÿüÿÿÿüÿúÿøÿøÿöÿõÿôÿóÿòÿñÿðÿïÿïÿîÿíÿ ìÿíÿìÿëÿìÿëÿêÿéÿêÿéÿéÿêÿéÿêÿìÿìÿëÿìÿíÿíÿïÿïÿðÿòÿòÿóÿõÿ÷ÿùÿúÿûÿýÿþÿ  ÿÿÿÿþÿýÿüÿüÿûÿúÿùÿùÿøÿøÿ÷ÿöÿöÿôÿôÿõÿôÿ õÿ õÿ öÿ öÿ õÿöÿöÿ÷ÿ÷ÿøÿùÿùÿúÿÿÿúÿÿÿûÿýÿüÿüÿüÿûÿþÿúÿÿÿøÿÿÿøÿöÿöÿõÿóÿòÿñÿðÿðÿîÿíÿìÿìÿìÿëÿëÿéÿéÿêÿéÿêÿéÿêÿéÿêÿêÿìÿìÿìÿîÿîÿïÿðÿñÿóÿóÿõÿöÿ÷ÿùÿúÿüÿýÿþÿ      ÿÿÿÿþÿþÿýÿüÿüÿûÿûÿúÿùÿúÿ ùÿ ùÿ øÿ ùÿ ùÿ øÿ ùÿ øÿùÿùÿùÿúÿùÿúÿûÿüÿüÿýÿýÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿüÿüÿûÿûÿúÿùÿúÿùÿøÿùÿøÿ÷ÿöÿ÷ÿöÿöÿ÷ÿöÿ÷ÿöÿ÷ÿöÿ÷ÿöÿ÷ÿ÷ÿùÿùÿùÿúÿúÿüÿüÿüÿýÿþÿÿÿÿÿ          ÿÿÿÿþÿýÿüÿüÿûÿúÿùÿúÿøÿøÿùÿøÿÿÿøÿÿÿ÷ÿþÿöÿüÿ÷ÿüÿùÿûÿùÿúÿøÿùÿùÿùÿùÿøÿùÿ÷ÿúÿöÿúÿ÷ÿûÿöÿüÿõÿüÿöÿýÿôÿýÿóÿþÿôÿÿÿóÿÿÿóÿóÿóÿòÿóÿóÿòÿóÿóÿôÿôÿóÿôÿôÿõÿöÿõÿöÿ÷ÿ÷ÿùÿùÿùÿúÿûÿýÿýÿÿÿÿÿ      ÿÿ ÿÿÿÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿþÿþÿüÿþÿûÿÿÿùÿþÿøÿÿÿøÿþÿöÿÿÿôÿÿÿôÿÿÿòÿñÿÿÿñÿðÿîÿîÿíÿìÿëÿëÿêÿêÿèÿèÿéÿèÿèÿçÿèÿçÿèÿçÿèÿèÿéÿèÿéÿëÿëÿëÿìÿíÿïÿïÿÿÿñÿñÿÿÿóÿÿÿõÿöÿÿÿøÿøÿÿÿúÿüÿÿÿýÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿüÿüÿýÿýÿþÿýÿûÿûÿüÿûÿüÿûÿüÿ üÿ þÿ þÿýÿþÿþÿÿÿÿÿÿÿþÿýÿûÿúÿùÿøÿ÷ÿöÿôÿôÿóÿñÿñÿñÿðÿïÿîÿîÿ íÿ íÿìÿìÿíÿìÿíÿìÿíÿìÿíÿìÿíÿíÿíÿîÿîÿïÿïÿñÿòÿòÿôÿôÿõÿ÷ÿøÿúÿúÿûÿýÿÿÿÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿþÿÿÿþÿþÿýÿýÿüÿûÿüÿûÿúÿúÿùÿùÿùÿ÷ÿ ÷ÿ øÿ ÷ÿ ÷ÿ öÿ ÷ÿ öÿ ÷ÿöÿ÷ÿ÷ÿöÿ÷ÿ÷ÿøÿ÷ÿøÿúÿúÿúÿÿÿûÿþÿüÿþÿýÿýÿýÿýÿþÿüÿÿÿûÿÿÿúÿúÿùÿøÿ÷ÿ÷ÿöÿöÿõÿôÿõÿôÿôÿóÿôÿôÿóÿôÿóÿôÿóÿôÿôÿõÿõÿõÿöÿ÷ÿ÷ÿøÿøÿùÿúÿúÿüÿýÿþÿþÿÿÿ             ÿÿ ÿÿ ÿÿ þÿ þÿ ýÿ ýÿ ýÿ üÿüÿúÿúÿûÿúÿùÿúÿúÿùÿúÿùÿúÿùÿÿÿúÿÿÿùÿþÿùÿýÿúÿýÿúÿüÿúÿüÿûÿûÿúÿúÿûÿúÿüÿùÿýÿøÿüÿ÷ÿýÿøÿýÿ÷ÿþÿöÿýÿ÷ÿþÿöÿÿÿöÿÿÿõÿþÿöÿÿÿõÿÿÿõÿõÿÿÿôÿõÿôÿÿÿôÿõÿôÿõÿõÿöÿõÿöÿöÿöÿ÷ÿöÿ÷ÿøÿùÿúÿúÿûÿüÿýÿþÿþÿÿÿ             ÿÿÿÿþÿþÿÿÿþÿþÿýÿþÿýÿÿÿýÿþÿþÿþÿýÿýÿþÿüÿþÿûÿÿÿúÿÿÿúÿþÿùÿÿÿùÿÿÿøÿÿÿøÿ÷ÿÿÿ÷ÿöÿõÿöÿõÿõÿôÿõÿõÿôÿõÿôÿõÿôÿõÿõÿõÿöÿöÿõÿöÿøÿøÿøÿùÿùÿúÿúÿúÿûÿüÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿ    ÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿþÿþÿÿÿýÿþÿýÿþÿûÿÿÿúÿþÿúÿÿÿùÿÿÿøÿ÷ÿÿÿöÿõÿõÿôÿôÿóÿóÿóÿòÿòÿðÿðÿñÿðÿñÿðÿñÿðÿñÿñÿðÿñÿñÿóÿóÿóÿôÿôÿôÿõÿõÿöÿøÿøÿùÿúÿúÿüÿýÿþÿ ÿÿÿÿÿÿÿÿýÿýÿþÿ ýÿ þÿ ýÿ üÿ üÿýÿüÿýÿüÿýÿýÿýÿýÿþÿýÿÿÿþÿýÿþÿüÿÿÿûÿúÿÿÿùÿ÷ÿ÷ÿöÿõÿôÿóÿóÿòÿòÿñÿñÿðÿïÿîÿïÿîÿíÿîÿíÿîÿîÿîÿïÿîÿïÿïÿðÿðÿïÿðÿñÿñÿòÿòÿóÿôÿôÿöÿ÷ÿ÷ÿøÿùÿûÿüÿýÿþÿ ÿÿÿÿÿÿþÿýÿþÿýÿ ýÿ ýÿ üÿ ýÿ üÿ ýÿ üÿýÿüÿýÿýÿüÿýÿüÿýÿüÿýÿýÿþÿýÿþÿÿÿýÿýÿüÿûÿûÿúÿùÿøÿùÿùÿøÿ÷ÿöÿ÷ÿöÿõÿöÿõÿöÿõÿõÿôÿõÿõÿöÿöÿõÿöÿõÿöÿ÷ÿ÷ÿ÷ÿùÿùÿùÿúÿúÿûÿûÿüÿýÿýÿþÿÿÿÿÿýÿýÿþÿýÿýÿüÿýÿüÿüÿûÿüÿûÿûÿüÿûÿüÿûÿüÿûÿüÿÿÿûÿÿÿüÿýÿüÿýÿûÿýÿüÿüÿüÿýÿýÿüÿýÿüÿüÿûÿýÿüÿýÿüÿþÿûÿýÿûÿþÿûÿúÿûÿÿÿúÿúÿûÿúÿûÿúÿûÿûÿüÿûÿüÿüÿûÿüÿýÿýÿüÿýÿýÿþÿþÿ                ÿÿÿÿÿÿÿÿþÿýÿýÿýÿþÿüÿýÿûÿýÿûÿýÿúÿüÿùÿýÿøÿþÿøÿýÿ÷ÿýÿ÷ÿþÿöÿýÿöÿþÿöÿýÿõÿþÿõÿýÿôÿþÿôÿýÿõÿýÿôÿþÿõÿþÿôÿôÿôÿÿÿõÿôÿõÿôÿõÿõÿöÿöÿõÿöÿ÷ÿ÷ÿøÿøÿøÿùÿùÿúÿûÿüÿüÿþÿþÿÿÿ        ÿÿýÿýÿüÿûÿûÿúÿùÿøÿøÿ÷ÿ÷ÿöÿöÿõÿõÿôÿôÿõÿôÿóÿôÿôÿóÿôÿóÿôÿóÿôÿôÿôÿõÿôÿõÿöÿöÿöÿ÷ÿ÷ÿøÿøÿùÿùÿúÿüÿüÿüÿþÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ þÿ ÿÿ þÿ þÿ ÿÿ þÿ ÿÿ þÿþÿþÿýÿþÿýÿýÿþÿýÿþÿýÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿýÿýÿÿÿüÿûÿúÿùÿúÿùÿùÿ÷ÿ÷ÿøÿ÷ÿøÿ÷ÿöÿõÿöÿõÿõÿöÿõÿöÿõÿöÿöÿøÿøÿ÷ÿøÿøÿùÿøÿùÿúÿúÿûÿûÿüÿüÿýÿýÿþÿÿÿÿÿ ÿÿÿÿÿÿÿÿþÿÿÿþÿýÿþÿýÿýÿüÿüÿýÿüÿýÿüÿýÿüÿÿÿüÿÿÿýÿþÿüÿýÿýÿýÿüÿüÿýÿüÿýÿûÿýÿûÿþÿúÿýÿúÿþÿùÿþÿùÿÿÿùÿÿÿøÿÿÿùÿøÿøÿ÷ÿøÿøÿ÷ÿøÿ÷ÿøÿ÷ÿøÿ÷ÿøÿøÿøÿùÿøÿùÿùÿúÿúÿûÿûÿûÿüÿüÿýÿýÿþÿÿÿÿÿ   ÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿýÿÿÿýÿþÿýÿÿÿüÿþÿüÿÿÿýÿÿÿüÿüÿûÿÿÿüÿûÿÿÿûÿüÿûÿüÿûÿüÿûÿüÿûÿüÿüÿüÿüÿüÿýÿüÿýÿýÿýÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿýÿþÿüÿþÿüÿþÿûÿýÿûÿþÿûÿýÿúÿýÿûÿþÿúÿýÿûÿþÿúÿþÿùÿÿÿøÿÿÿùÿþÿøÿÿÿøÿþÿùÿÿÿøÿùÿøÿÿÿùÿøÿùÿúÿûÿúÿûÿûÿúÿûÿûÿüÿüÿýÿýÿþÿþÿþÿÿÿÿÿ   ÿÿþÿþÿýÿüÿüÿûÿûÿúÿùÿùÿøÿøÿ÷ÿ÷ÿöÿöÿöÿõÿöÿõÿöÿöÿõÿöÿõÿöÿõÿöÿõÿöÿöÿöÿ÷ÿ÷ÿ÷ÿøÿøÿøÿùÿùÿúÿúÿûÿüÿüÿýÿýÿýÿþÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿýÿüÿüÿüÿûÿûÿûÿúÿúÿùÿùÿøÿøÿùÿùÿùÿøÿùÿøÿùÿøÿùÿøÿøÿùÿùÿúÿúÿùÿúÿùÿúÿúÿúÿûÿûÿüÿüÿüÿýÿýÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿþÿþÿýÿþÿýÿýÿþÿýÿþÿýÿþÿýÿÿÿþÿÿÿýÿþÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿþÿýÿÿÿþÿÿÿýÿýÿþÿýÿüÿüÿýÿüÿýÿüÿýÿýÿþÿþÿýÿþÿýÿþÿþÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿþÿþÿþÿþÿýÿýÿþÿþÿýÿýÿþÿýÿÿÿüÿÿÿýÿþÿýÿÿÿüÿþÿýÿÿÿüÿþÿýÿÿÿüÿÿÿýÿþÿüÿÿÿýÿþÿüÿÿÿüÿþÿýÿÿÿüÿÿÿýÿýÿýÿÿÿþÿþÿÿÿýÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿýÿýÿÿÿüÿÿÿüÿþÿýÿþÿüÿÿÿüÿþÿûÿÿÿûÿüÿûÿÿÿûÿúÿÿÿûÿúÿÿÿúÿûÿúÿûÿûÿüÿüÿûÿüÿüÿýÿüÿýÿþÿþÿýÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿþÿýÿýÿüÿüÿüÿûÿûÿüÿûÿüÿûÿüÿûÿüÿûÿûÿüÿûÿüÿûÿüÿûÿüÿüÿýÿýÿüÿýÿþÿýÿýÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿÿÿþÿÿÿýÿýÿÿÿüÿýÿýÿüÿüÿüÿûÿüÿûÿûÿüÿûÿüÿûÿüÿûÿüÿûÿüÿüÿýÿýÿüÿýÿüÿýÿýÿýÿþÿþÿýÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿÿÿþÿþÿýÿýÿþÿýÿþÿþÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿýÿÿÿýÿýÿÿÿüÿÿÿüÿýÿÿÿüÿýÿÿÿüÿýÿÿÿüÿýÿÿÿüÿýÿÿÿýÿÿÿýÿþÿÿÿýÿþÿÿÿþÿýÿÿÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿýÿþÿýÿýÿþÿýÿýÿüÿýÿüÿüÿýÿüÿýÿüÿýÿýÿýÿþÿþÿýÿþÿýÿþÿýÿþÿþÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿLIST`INFOISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comIENG ICRD 2004-08-23centerim-4.22.10/share/url.wav0000644000175000001440000001264211461606612013036 00000000000000RIFFšWAVEfmt @@datavŠŠ™–‹€zyz{€“  —‹vjs{€‡’’†|‹Ž‡‡‘„€€„„€ƒŽ‘”Ž€sq‚“””•vux——‰‰†xqt€‡‰š—ˆvigw‰‘ €jej{†•—–—š˜‚mhn{€‚Ž  ‘mcl€Š• œ~rru~‚‡•’Š}z€€}™˜€zu~‚€Š“—†zr}†‘’އ„‡‰€xt€Œ„‚‡Œ„|ut€”–––~jfq€‡‘””Ž„vkm}ŠŽœ —€rhku€‡ˆ rcfz‡‹”——ˆymo{€~€——Š€{uuz€‰šš‘t{€€{{ƒ‡~zzƒŒˆ}}…”‘†z{€„…„…†{mt‡ŽŽŒ‚€{zxŠŽŠ†ŒŽ„rou€Š˜˜’nfpƒˆ„†“™“€vmnw‡ˆ„š—qpuz~‚‰Š–’€pnŠ’Š€wy~…‡„€‡‘™„rfv‚Œ‹Œ‹Š€wt€Š‡}}ƒ€€€€€€ƒŒ–˜Šws€‡„{}ˆŽ‹€zv€Š”†zv‰•”ƒ€ƒ„‚}w{‰“xowŠ‹ŠŒŠ„€€~}…ˆ}}„Œ…z}„†‚€€‡‘–“€so€Š‡~€Œ•sou‡“€€‰™“‡yz}€€€€…‘–}st€ƒƒ‹‘”Œ€€€€€|€“‹€€‡Œ†zw˜”‰xt}Š„}y†‘“…zw}Š€~„…}}€€€€„‡Š†€yz€†ŠŽ˜˜€w{~€€€‰‘†|u€†ˆ€}…–š‰vps€…€€†–™}qqxƒ‰‡„‹‘—ƒ}|~}€‚ŠŠ„~wx}€„—“†€€‚€€€‹y{„‰‚z„”‰€wz€‹‰ƒƒŒŒ~vs}‚Ї…‡Š…~wz€„†‹‘ƒ}wsz€‚‰Ž–”Šxqu€‚„‹‘”“wnx€‚€€‰•—€qnw‚†„…—’†zux~€ƒ†‡Œ‰z|€~€‡‹~~€€€”Ž{tx„ˆ‡ƒŒ…vr{І€…Œ„€vv€‡Œ††‹Š{qs„†ŠŠ~sp|ƒ‡‚ƒ–”„vps€ƒƒ‚‰’›€npx„’†wqwƒ‡’Œ€{y}€€ƒŽ‘€y|„†„‚…Œ€vy‹„€…Œ‹€yw€‡Šƒ€‡Œ€vxŠ‹‰†‡‡„€vt€‡Œ‹Œ‹†~xz€„†„„‡ŽŽ€xs}‚‡„„‰“Œ}sqŠ‹„‚…Ž…zuy‚‰‰„„ˆŽ‹}z€€‚…†ˆˆ…€~~€ƒ„„†ŒŽ†|€†‡„~‹Œƒ{z€‰‹‡‡ˆ€xx€ŠŽŠ€„„€|z€†‹ŽŠ‡„ƒ€~~€†ˆŒŠ†€xx}€ƒ‡‰Œƒ}uz€‡„†‹ƒ}ty‚ˆ‡ƒ„‹„{vy†ˆ„ƒ†„€}}†‡‡„„……„€€€†ˆ‡€~~€„„„‚ƒ‡‰ˆ€|}„Œ‹ƒ~~€†…€z{Œ†€„…‚€|ƒŒŽ‰€€€}†‰‹ˆ„€€€€€€ƒƒ„‡‹‰‚|y{€…‡„ƒ„Š‹„zv€…Š„€ƒ‡Š‚}wƒ‰„€€†ˆ‡}{€…‡„€€ƒƒƒ€‚ƒ€€€€„…‚€€‚ˆ…€~€…‰ˆ‚~‚†ƒ}z€‰Ž‹‚„‚~}€‡‹‡€€€€€ƒ†‡†„ƒ€}|€ƒ„ƒƒ†‡‡~|~ƒ‡„€€„ŠŠ{{„†„€€„‹‡|~‡…‚€…†ƒ€€‚ƒ€€„…„ƒƒƒ„€€††‡†€~€ƒ‡ƒ€†Œ†€„†€}€…†‚€€€ƒƒ€€€„‡‡…ƒƒ€€€€ƒ‚ƒ„ƒ€€€„†ƒ…‰ˆ{€‚„€€€„‡…€}~…†€€„††€€€€€‚ƒƒ‚€€‚ƒ…ƒ€€ƒƒ‚€€€ƒ„„€€…†ƒ€€€„…ƒ€€€‚…„€„„€€ƒ†„€€€‚€€€€„„ƒ€€‚…‡†€~€ƒ‚ƒ†„€„ƒ€„‡‡‚€}€„€ƒ„ƒ€€€„†„€€„ƒ‚€€€ƒƒ€€€€€‚†‡ƒ€€€ƒ…„€€ƒ„‚€~€„…ƒ€€€ƒ…„€€ƒ‡‡‚€€€€€†…‚€€‚††ƒ€€€€€€€…‡†€}~€„†„€€‚†…€~€„„€€€†‡ƒ€€‚…†€€€„„‚€€€€ƒ„ƒ€€‚„ƒ€€€‚„ƒ€ƒ†…€~}€„‡„€€ƒ„€}~‡‡ƒ€€ƒƒ€€€„†„ƒ€€€€€€ƒ„…„€€€‚…„€…†‚€~€„„€†‡ƒ€~€„†„€€ƒ€€„„‚€€€€‚„ƒƒ‚€€€€‚ƒ‚‚ƒ€€€…†„€‚ƒ€€„„ƒ€€‚€€‚€ˆŽ‘”Ž€pq‚“’””tux—•‰‰†xqw€‡‹š—‚vikw‰• ”€jej{•—–—š“‚mhs{€„Ž  ‘|mcr€Š™ œ‰~rqu~„‡’•’„}z€€}†™–€wu~‚‚€Š“—†ur}‹‘’‹‡„ˆ‰€ut€Š„‚‹Œ€|uw€•––•~jiq€Š‘””Ž€vkp}ŠŽœ —€mhkz€‡‰rclz‡”——‚ymr{€~‚—’Š€zuu{€‰”šš‹t{€{~ƒŽ‡~yzƒˆ}}Œ”‘z{€„…ƒˆ†tmt‡ŽŽŒ‚}{zyŠŽŠ†ŒŒ„rpu€Š“˜˜Žnfpƒˆƒ†“™“€rmn}‡„„›—qquz€‚‰Œ–Ž€p€Š’Š|wy€…‡€‡–™„kfv‰Œ‹‹‡€ww€Šƒ}}ˆ€€€€€€†Œ–•Šwu€‡€{}ˆŽ‹€wv€”†uv‰˜”ƒ€ƒ„€}w€‰“…xo€ŠŠŠŒŠƒ€€~}…ˆ}„Œ€z}„†‚€‡‘—“€oo€Œ‡~Œ•}so{‡“‰€€™“€yz~€€€…‘–}qt€ƒƒ‹“”Œ€€€€€}€‘‹€‡Œzw‘˜”‚xt€Š„xy†”“…zw}Š’€„…}}€€€€„ˆŠ†yz†Š˜˜‰€w{€€€‰‘†wu€‰ˆ€…–•‰vns€„€€–™‰}qq}ƒ‰†„‹”—€}|}€…ŠŠ„~vx}€„—“†€‚€€€„‹Œy~„‰€zŠ”‰}wz…‹‰‚ƒŒŒ~ts}…Ї…‡Š~w}€„†‹‘ƒ}vsz€‚‰–”ƒxqx€‚„‹‘•“rnxƒ‚€€‰•–€qpw‚†„…‘—’€zuz~€„†‡Œ‰y|€~€Œ†~~€€“Ž{sx„‰‡ƒŒ€vr€Šƒ€…„{vv€‹Œ††‹„{qv„‡ŠŠ~pp|…‡‚…–„vps€„ƒ‚‰–›ynp}„’’†wqw‚‹’‡€{z}€€ƒŽ‘€x|„…„‚‡ˆ€vy‡‹€…‹€ww€ŒŠ€€‡‡€v{ŠŠ‰†‡‡„}vt€ŠŒ‹Œ‹‚~x{€„†„„ŠŽŽ€ts}…‡„„‰’Œ}qqЉ„‚ˆŽ€zu|‚‰ˆ„„‹Ž‹{z€‚…‡ˆˆƒ€~~€ƒ„„†ŒŒ†}€†‡„€‹‹ƒ{z‰‹…Šˆ}xx‚ŠŽ‡€„„€|{€†ŽŠ†„ƒ€€~~€†ŠŒŠƒ€xz}€„‡‰ƒyuz‚‡„†ƒyty‚‰‡ƒ…‹Œ„{vyˆˆ„ƒ†„€}}€†‡‡„„……‚€€€†‰‡€~~€„„„‚ƒ‡Šˆ€|€„Œ‰ƒ~€€†ƒ€z}Œ†€†…‚~|†ŒŽ†€€€}€†‰‹ˆ‚€€€€€ƒƒ„‡‹‰€|y}€…†„ƒ†Š‹€zv€ˆŠ„€€ƒŠŠ‚zw†‰„€€†ˆ„}|€†ˆ…€ƒ„€€‚‚ƒ‚€€‚„…€€…Šˆƒ€‚‡ˆ…€€…‰…}z‡ŽŠ†€ƒ…}z€‡Œ‡„ƒ……ƒ€}~€‡‰ˆ†‡†€}y~€ƒ…‡‰‹Š…€{{€…„€€†Œ†}z}€„‚‚‹Œ€||…„ƒˆ‰†€}‚ƒ€‚‡‰‡…ƒ‚‚‡ˆ…€~€††ƒ€„‡„€€ˆŒˆ€€€ˆ‰‚~}€„†„‚ƒ†„€|‚‡ˆ‡††„€~~€ƒ„ƒƒ…‰†€€ƒ‚‚†Œ†~y|ƒ€‚‡‹ˆ‚~~€ƒ„€‚†‰†ƒ€€€€€‚„††ƒ€€€ƒ……‚€‚‚‚‚€€‚…†ƒ€€„„ƒ€€€„…„~€……ƒ‚„…ƒ€€€€„†…€€‚‚€€€€€„††„ƒ€€€‚ƒ…‰‡ƒ~€‚‚‚„‡‡ƒ€~€‚€€‚†‰‰„|€„…ƒ€€‚ƒƒ‚€€†ˆ„€„…ƒƒ‚‚‚ƒ€€‚€€‚‚‚††ƒ€€„†‡„€€„‚€€„†„€€€ƒ‡‡~€„‰‡‚€€€€€‚ˆ…€ƒƒƒƒƒ‚‚……ƒ€€€‚ƒ€€„‡„€~€†‡†€€……€~€„†…€‚†ˆ‚€€„‰‡‚€€€€€„‡†€€€‚„†„‚ƒ„ƒ€€€€‚†…€ƒ‡†€}}ˆ‰‡€€ƒ„€}€‚‰‡„€€€„…ƒ€€†‡ƒ‚€€€€€‚„…„ƒ€€„ˆ‡‚€€ƒ„‚€€‚††‚€…‡€‚†‰‡ƒ€€€‚€€ƒ‡‡ƒ€€€€‚ƒ†‡…ƒ€€€€‚„„ƒƒ‚‚€€€€‚‡‰…‚€ƒƒ€€€‚…†ƒ€€‚‚€€„ˆˆ…€€€„†„‚€€€€‚ƒ‚‚„ƒƒ€€€ƒ†…ƒ‚‚€€€€€‚…‡†€€€€ƒ…††€€€€€„†‡ƒ‚€~€‚…‡†€€€€€‚„ƒƒ„ƒ€€€€€…†…‚€€€€€†‡„€€€€€€€‚„…‚€€‚ƒ€€„„ƒ€€‚‚ƒ„‚€€€€‚ƒ…„ƒ€€€€€ƒ†…€€€€€€‚‡ˆ…€~~€€€€ƒ†…‚€~€€ƒ……‚€€€€€‚……ƒ€€€„††‚€€‚„ƒ€€‚…„€€€ƒ„‚€€ƒ…ƒ€€€‚‚‚‚‚‚€€€‚ƒƒƒƒ€€€€€‚„ƒ€‚‚‚…†€~€€„‚€‚ƒƒ€€€ƒ‚‚„ƒ€€€€€‚‚‚‚€€€€‚ƒ„ƒ€€€‚€€‚„ƒ€€€€‚ƒ€€„…ƒ€€ƒƒ‚€€‚€€€ƒƒ‚€€€€‚ƒ‚€€€€‚ƒ…„€€€‚ƒ€€ƒ‚€€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€centerim-4.22.10/share/email.wav0000644000175000001440000005437611461606612013335 00000000000000RIFFöXWAVEfmt D¬ˆXdataÒX *?Z|¨Ô:qŸ»Â‘Oê^kÿŒþŠýlüíúµùzøQ÷:öžõmõšõ¸öø¸ùêûsÿsº+ µ T1íFžž¿ l *$Ãù)ó‰êXä˜ÞßÙÕÓKÓLÔ؈ÜâÝè-ó™û_@ ¼½ (á-w3Ã5#6ô4Ì0½+|%þÖÉ u:÷Zëcã‡Ü/×Ò3ÐÐOÑïÔoÙÔÞ*å5îzõÌüÜ¿ ‚QêZ^.›†ýÿ¦ mU[þû}øyöôíóÛóMô"õVöÁ÷<ù ûüÌýëþ¶NiFÏW+ ðÿÆÿ„ÿÿžþþvýÓüDüÐûûžûàûnüXýÿ°†’Jp ‹ n +AžX¯ _ m½äÿÌû÷+òSîÆêØç<åôã±ãOäç êóí“òvùçþkî ¸KQu ߦ(}I˜èÇÀýáøüò7ïì°éÍç\çéç<éYìtïÑòXöû‰þÁ¼ ” z í ˜ µ ê 7θKÿîýdýý ýEý±ý?þôþÂU½â¦!šÿäþfþ÷ý›ýDý<ý[ý”ýôý[þÅþ1ÿ²ÿ UËßãÙȧ];!ýÿòÿßÿÁÿ˜ÿbÿ*ÿòþ½þ¡þ”þ¢þÓþ[ÿéÿ¥ñ+Ï23 ê W y räý_Xþõú6ö„òñîÄë“è¬æ¡å[åÎæÓèºë¥ï=öãû!ÃÃdÍ#)Á+ü,ï,9*—&¯!dLÓ¹ÿ1óîénáÇÙªÑOÍaÊUÉ•ÊfÍÒþ×âÌê<ô%þ~ ¶H%C-F1Ë3k4ý2þ/`+§%y†2 ¡©ø$ñ™êå;ß™Ü$ÛÛgÜÝÞ^â„æÃìò€÷ßü~×u `L\¿_U¾º € }§…&ÿ¹ýªüïûKûBûqûÒûVüðü‘ý+þÌþAÿœÿÝÿ  -Hbnqb=èÿÿÿþÙý:ýšü ü–ûLû8û[ûüØüÓýÿÍGÍX"^j " g F ¬ †½ÄöÿÕý¸û¿ù€÷ö õ^ôTôÖôÇõG÷úUü¹þüê—áó J  ‚ è1#¸}þCüWú¹ø:÷¡öröÉöå÷2ùíúñüŒ)ÂÇ w ‰ à  ­ Ó Õ;dƒþ˜úË÷8õ+ó;ñŽðŒðñ{ò4ô;ö“øåûƒþŽ¡‘, C "  • º C ¾j;¢1ÿíý~üÅûTû/û/û…ûü–üLýðýˆþÿ™ÿíÿ&G^VD. '1&áÿ€ÿÿþïý.ý„üàûTûûÛúøú]û‡ü´ý:ÿôaØN æmcqø±µ° ý­Öý ÷åñûìaèxã‹àkÞrÝ%ÞÁß­â¦æ×í2ôFûé: »˜È!6(­+î-Œ.ü,?*é%` óIsýòêãÛܙ֕ÓãÑÚÑýÓ7×àÛ”á©ê_òfúVJ ½Œ>"'$ô$[$"ð7\ ¾sþøøó£ðîšëéêîê¾ë„í ï2òõîøûûÎþI!Å÷ÃaFã76.µ°Ï]ÿÿÈþ³þ«þÉþôþ&ÿ]ÿŽÿ·ÿ×ÿïÿûÿ#8Phx~j0÷ÿ¯ÿXÿãþ‚þ!þËý†ý_ýZýxýõý~þ6ÿu‚†{v i€{‡F*ÿ ýëúcø±öYõWôÒóòó†ô¬õøCúöüýÿgçr  òº;0 ÷Z„ûëô7ð ì¯è‡å2äôã™äÿæèé„íÚñ`ø«ý ’šJ9‡ ÈD8¡ $üÉõñEî±ëhéçè"é6êbìÑî»ñâôAù®üôÿ´é… ™ i > ­ · D Ê0™¤8ýÿõþåýmý4ý-ýBýýíýUþÃþ ÿpÿ­ÿÞÿöÿ9c—Îý%91à~îÿ/ÿ þþüâû¹úuùøµ÷1÷6÷y÷2øXùºûòýq_k P ¾[n»³9Û¹ @‘–þzùÞò!îáé(æ§âúà1à˜àóâÈåÀé”î`öÊüTº ®\"£#Ÿ#H"¶Øå!Ìn8û†ópîêŒæKãâîáÃâeåŠè^ìçð—÷ÑüÊqã ,Ñœû Aß+l Z  ÿÔüuúæ÷˜ö»õ_õgõùõìöøëù†û(ýÈþ³åÑ5"ÞméV …½ÿlÿOÿGÿOÿ`ÿ~ÿÿºÿÕÿéÿöÿýÿ 2Mkˆ¡°¤Ž`ŽÿÿmþÊýýküèû~ûTû[û™ûüMýqþÛÿƒýÓ º é £ ò R O Æ ¡ê«þÑøÑôñ¹íGêdè,ççæè¼ékìÜïºõÈúCþ µ¹!î"µ#!#Œ ^ ܸ öïýÁö·í·çÁâºÞ;Û/ÚBÚ¿ÛXßTãMèïíJö÷ü®@ GO<.„ ¶ ñb¢3n ¿™¦ü-øóðî£ìÅë4ì7íÛîqññó­ösùý®ÿ #&¶èÙLŽ¥}wz•™þÿÿFÿÿÿ'ÿKÿtÿ ÿÆÿãÿöÿÿÿþÿýÿ1iªúU¸]’‰jAqvÿOþ±übû úÎø÷´ö.öùõ‰öW÷”øSú_ýýÿÃ¥N é NDò¹É8Ï â HêÈý­ù°õ÷ðïífë£éèè„é>ëöî‘òÇöûê\ eÅ1æ¥K Þü £ê7ÿWùbõò;ïŸìœëQëÜëŸíºï}ò¦õrúVþ;Ú … W”N/Æ [  {Ê!ƒý3ûUùf÷‡ö!öö‘öi÷zøÆù•ûýþöÿ¬¼‰ xr6ØL¶ˆÞf¤ÿxÿgÿhÿsÿŽÿ¬ÿÉÿáÿóÿýÿþÿÿÿ>l©ö@ŒÐøÐ6•Âÿ¹þ3ýìû¤úbùø8÷”öLö®öJ÷cøëù¾üEÿ&S“ º —"v¡+ÙýØÒ êÿrúøô.î€éåQâ°ßÞÞ ßyà/äèúì¨òRûQ~ g§ø,"`%'¡'ˆ&ú#Ôĵ OáûÂôLîÕæXâßßÜËÛÜZÞZá™æëñõöÿ¤ n¼žqhg*8ˆ[¤ §X~ÿ üùÓõ-ôó™ò„ò'ó<ô˜õ™÷nùEûýOÿÇöݼ ã—#{šHáÿÔÿÔÿÛÿéÿõÿþÿüÿòÿåÿÛÿÕÿØÿëÿU¡þzéY¿ <CØõäÿOþý±ûbúòøü÷7÷ÇöÝö>÷øLù¯ûàý_ ‚ R U .v)°÷ £äÿûY÷åòøï¦íæëÓêåê«ëMíªðäóÆ÷ü`5Ç Ê*§3ùˆïéæ ‹¾ýmûÚùNøâöôåò×ñÒðîîIî¯íHí\ì0ì5ì@ì|ì°ìí®íBî3ï ðÚðÆñ6ó,ô/õ'öË÷Ëø¼ù®úûýßýšþHÿyþuÛ£ÙeW;ëÓ—UÙ•U߬Y9! %+.äÿÿgÿ%ÿ×þ~þâýkýëü]ü‹ûîúCú™ù·øøS÷žööõIõ­ô'ô£ókó óÜò»ò3óFó~óÅóõ³õeö?÷,øˆúÆûý†þœDÿÊT ( ÖÜt}ád Ü N!}!q!Q!ç w ã¤×2޾$9 6 ; B79Bÿhû“ùá÷BöÍôéñ½ðÇïãîí¥ìBììcëyëÂëììíªíuî@ïVðSñHòNó¶ô¶õ»ö±÷ù úãú³ûpüý+þ³þ-ÿêÿ8y«üܺ—zY;"#?b‰¶èRw¥Ñõçôóçw>ô•¤ÿÿmþ±ýæübûiúhùRøŠögõ2ôóBñ ðìîÀí±ìhërê£éÖèUèèçƒçUçäçüçRè¶è|ê]ëPì{í¸îçñ’óMõ4÷Qûpý¨ÿéŠØ. m ¼àØÍËMŒÅ ¸"_#ý#K$È$Á$m$$#2"C! ÞrÖ?|Fp€ž  AföI»þDýðûcùXøx÷®öõ¤ôKôôióuó¦óáó;ôiôæô{õö±öc÷øÄø’ù>úèú†ûHüÖüVýÎý7þ´þÿCÿzÿ·ÿÕÿëÿùÿ 3Sz¬ï4ƒÙ@¦ï]Î8¢Ø$kžfrdGo™s ¶µÿ¢þgü%ûÛù|øöœô&ó½ñ[ïðí ìFëêHè2çKæcåääãXãã¬ãûãSä×屿—ç¶èàéËìbîðÎñ™õŽ÷¡ù·ûøÿ%( ò ª YßÍ %ö~ý=ÝÖ”KÇXqŠ÷Æ›R7ë Ž ? ÷§j1)aÿóý_ýæü€ü¯û‚ûcû[ûû/û[ûûÌûõûBü—üêü;ý“ýåý6þ†þÊþ ÿAÿvÿžÿ¾ÿØÿêÿ÷ÿþÿýÿúÿøÿøÿ 2bÀýB²sã{ö{Ÿ*®8°ŽêD C i ‡ † ë»j µ Lo`J(öþ·ý6ûÜùˆø&÷ªô^ó òËð«îí|ìuë–êOéŸè"è§çRçEç=çlç*è—è<éçé¯ë½ìÏí ïKðó—ôö»÷ýú¨üZþ^ðyæ¨ Þ ê ë Âu tÓƒK(Â5§Í;\ „ ) 5 L \ä%WþEžùÿ„ÿ#ÿÐþþþõýéýæýÅýÞýüý#þ;þjþþÎþÿþ+ÿWÿÿ¢ÿÀÿÙÿëÿøÿÿÿýÿöÿìÿàÿÓÿÅÿ¹ÿºÿ¶ÿ¸ÿÀÿëÿ.`Ðzà’4γ` ¾š@ ë †  ©  Œ ¤ Ö   A í  k ¦»¿U¶E?ý£ûúZø¹ö¦ó ò…ðúîXìëÏé·èêææTå¨ä:ä¹ãŽã ã¸ãbäõäŽå`æ)è3éoê¬ëWîáïjñó­ô÷÷¶ùkû'ý„*ÇU^® ì ý (óŽuj„oQ^ëuÞ3}¯ æ Ë ã   C.g¤ŠçOÉú”>÷ÿƒÿ]ÿDÿ6ÿ3ÿÿ0ÿFÿ_ÿrÿÿ¬ÿÆÿÜÿîÿúÿÿÿ÷ÿèÿÒÿ¶ÿ•ÿnÿBÿÿîþÀþ”þjþbþIþ7þ0þ2þˆþ°þçþ0ÿùÿoüœæ±’}'6 V p ! F[zßÍ¿ŽR÷nß¶½¹~6´ô%y)©  x’‘Uý$ûûøÊö­ô›ð–î·ìÚê‰çæšäbã0áAà—ßöÞšÞÞÞ?Þ…ÞPß àóàâýãF彿0èëÃìvîBðòVõ&÷ãø¢úáýyÿq8dxaB á T µ í ­ § { F A Ê P ¾ 2 Û.bªüO­èVÒVÄgÏ~S2ûÿùÿúÿýÿÿÿÿÿøÿêÿÕÿ¹ÿ”ÿ`ÿ'ÿæþšþGþãýýý©ü<üÏû_ûõú­úQúú¹ùÎù³ù£ù¬ùÃùúêúXûäûjý7þ$ÿ'cŸôRêk é y ÿ’‡ýH|¾Œ©½ÆÇ‚3®ÔïÉÿé9cY H ¡] ÿãü¹ú€öyô•òºðFíÎë`ê+éÏæéå>åŸäCälã]ãŽãÆã$äÒäƒåiæÍçÜèêJë]íÆî$ð”ñôò\õÄöømù³ûÞüüýÿÛ©aû'†ÈûzhA³`µSð’3Ùˆ<ù¸†];  úÿèÿ»ÿ•ÿeÿ*ÿÄþqþþ©ý ýŠüüpûÛúú{ùÞø:ø•÷÷xöùõªõFõûô¶ôýôûôõ5õqõ£ö3÷Õ÷œø¤ú­ûÙüþÔFËSPì   ªlëG¨ÌÚçÀððLU0›+ºÎÝ´0ÐC´b ’ Å ä.Nz±þüü±ù)øÇöqõêòïññAð®î/îãí¢íŽí'íNí¡íøíhî ï¯ïrðñUò@ó"ô„õzöd÷Sø4ùšúoû4üñüþ·þBÿ½ÿÞ Q´Âüª­Šb9龕qP4  %8M\p‚‘‡†n)ÿÿÉÿ…ÿ7ÿ—þ*þ³ý.ýOü·ûûgúkù³øøD÷‘ö´õõlôÏóQóçò€ò8òTò7ò?òPò1ó˜ó ô¦ôOõ8÷4øAùqúýþýÿ‡·W  ² HÂA›368´JÛ2•¨‚Ué@b€>ü•ÖV ¿ . ^¿ÿþýüºú‚ù ÷$öQõôó òEòòkñpñœñÏñ"ò`òÙòlóÿó¿ôwõ*öêöé÷£øcùúûÂû^üôü{ý@þ­þ ÿ`ÿÝÿ:YŽ”“Š‹waK6%";Y}§Ðþ/`‘©ÎîåäÔº9ôŸ7?ÿ©þþJý†üû0úEùHø³ö´õ¨ô§ó1ò1ñGðWï…î—íâìTìÉëŸëqëJëRëìkìéìsíLïAðEñwò·ó¼öSøõù¶ûgÿMGHJ A : žVÞb²$ó»æ(cY8ãN´\M>þÀI½9˜Ÿ ù J ª’õlï#þ×ü©û’ú¡ùÀ÷÷Žööõöôäôöô·ô÷ôSõ´õ+ö•ö"÷½÷TøùªùGúæú û.ü·ü3ýËý3þþÞþ"ÿrÿŸÿÂÿÜÿøÿ!9Yˆ¼ø>–ìK¯ˆóc½}Ð ?[^ТWû½`†“ÿ~þUýüËúMøÝöoõïóbññïsî íØêƒéQèçæÃäíãPã·â~âcâPâ~âˆãäÂäŠåÛç"étêüëŽí(ñó õ ÷iûšýÖÿ‰²Õ Ò ®w –çy}?öAn’ts kŤ•ˆP ™5¼K Ü d “@Ó½Åÿæþþqý+ü½ûlû,ûúŒú•ú³úŸúÜú(ûwûÐûü|üàü@ý ýýýRþ¢þïþ.ÿdÿ’ÿºÿÖÿêÿøÿÿÿÿÿúÿõÿôÿóÿöÿþÿ7\Šã-‚åRúƒ±‚)ÚˆR § O Õ U Ò 5 “ n … w ‡ 0 ®  @RN"pŒÿûýbü0ùz÷Éõ ôéðKï¢íìqéèÄæ‚åwäæââáðàŽàƒààÀà¨á3âãÕãøåDç“èê›ëèî¼ðòô[øVú[üWþ>ìœà Q — ÍÐæ¢)¡¤¯¯„ïDkx‹#   ‚Š“®Ct¹ óo ÿSÿËþ¥þþƒþ[þlþƒþ¢þ³þÜþÿ1ÿZÿ}ÿ¡ÿÀÿÙÿìÿùÿùÿíÿÜÿÆÿ±ÿ—ÿ{ÿaÿGÿCÿ5ÿ-ÿ-ÿ`ÿzÿ¡ÿÔÿ[±‰fû™Hý"ð½– ‘ i 1 Ü #ñN…µ5 ×u f • ´ [ ÕfH«ÿRýŸûHø‘öìô?ó;ðÇîQíìµé•è©çÁææòä~äIää'äqäÀäKå{æCç>è;é^ë±ìîxïêðÎóiõûöœø¸ûLýÝþ]JÞû, Á h å  G _ m À € : Õ } ú _ Æ  J šà/=ŒçEhß^ëIð¥e æÿÍÿ¼ÿ´ÿ¤ÿ«ÿ¶ÿÃÿÎÿÝÿëÿöÿýÿþÿöÿèÿÒÿ·ÿ–ÿoÿDÿÿâþ­þþMþþîýãýÇý°ý¥ý¢ýõýþHþŠþNÿ¼ÿ=ÑТ{ ü ¨ µ ³ ¹ìʆJáN·¥­­{?ùOš´jC ñ “ j¿ ;…þžü»úÓø÷~óÃñ,ð—îÂë…êNéOè{æ»å7åºä|äääXä¡äXåæÒæÁçtéêÓëíuïêðUòÔóGõøùéúUüñþ3jÀ£s…ð8 q ˆ æ ¯ q P áoïnâM¿ˆ|r ¬Wöº‡^2 ýÿýÿÿÿþÿ÷ÿëÿÙÿ¼ÿšÿpÿ>ÿúþµþjþþ¼ýVýñüŒü"üÄûdûû«ú†úCúúçù,ú4úHúwúµú¶û5üÈüyý)ÿ8†Î*‹ ˆ ó mÕ!~»ý«™ˆBý{¾ú‡BôbÆÔ¼š>+’Ì  øÓ†þ_üFú2ø9öhò¢ðïví“êpéXèçÇå7åéä¤äŸäcä¤ä!å¢åægçOècéëHì—íÝîñwòÐó1õöÎøúGûoüuþpÿW(¯DÅ',>C2X$á™c¥Cæ†(Ñz.ì²€T4  ôÿßÿÁÿ™ÿHÿÿ¸þ]þËýWýÔüKü†ûåúAú“ùåøøc÷¼öözõñôiôúóâó™ópóRóñó$ôgôÒôNõþöÖ÷ÂøÕùdü»ý0ÿºÿ¶€G § y8®›.•þ˸ ,!Z!!!° ? ŠÎÎMÒ·.Tw g \? þ%üUúÐö8õÎótòÛïêîî[íÚëwëLë+ë>ëëTëÑëRìúìÇí’î}ï¾ð·ñÃòÄóNõ\ö\÷]øMùÄú¢ûkü+ýVþëþqÿäÿ¦í%K¡™‰of?êÅšsQ4 !9Rp‘²Çãú÷óæÌd'Ýÿ‚ÿÿ>þ¯ýýgü?û{ú§ùÑø…÷›ö¹õÌôêóÅòêñ&ñ^ð«ï!ï™î5î<î î îîïlïçïðHñoó‹ô¸õ ÷ú¨ûZýÿÁŸ‡dü Ñ ŒKäÐA}¸¯w9¼€º²¤!’ý,Ww6õ‰ÐFœù Å  N•Rµ0ÿ¼ýdüÔù»øÇ÷äö*õ¡ô'ôÖóúòãòòò óDóPó²ó/ô®ô?õæõ‰ö9÷øÁøtùúÿú¢û7üÆüGý÷ýaþ¾þÿ~ÿ³ÿÞÿÿÿ,6:8:/" &@aЏë$^›Û[€³âíøóäa#ÖsnÝÿ9ÿþ¾ý9üOû_ú^ù¨÷¢öŒõôßòÒñÙðÙïôîÌíí[ìµëGëùê°êšêëCëëì‰íZî6ïAðWñ ô|õøö•øüËý¢ÿ}L) Ò <á]Õ!ŽžuDšð?QxGÜks™¿³ª­\­2 Ê R èIâŽ?Úÿºþ²ý¿üéûJú²ù<ùÖøö÷Ö÷Ã÷Ì÷÷Á÷ øUø´øùsùîùfúëúmûçûbüìüXýÀýþˆþÔþÿMÿ|ÿ®ÿËÿàÿïÿüÿ /Jm˜ÕW¦bÆ+™mØ)Ø dOfshÈŽ8ЇÛ>Lÿ:þýÝûžú;øàö‰õ"ôÆñvðïÛíãë¸ê´é­èÓçÄææ©å;å7åAåRåžåÇæ\ç*èéKë‘ìßí]ïáðIôöè÷×ùÂý¿ÿÄÇħ „ : ŠR’š¥cå]:6)ä›`§k]R& ºv # ô ²pA.!rÿ³þ þyýýüÑû©ûû3ûJûiûšû©ûïû?üüæü3ýŠýáý2þ‚þÊþ ÿDÿyÿ¢ÿÃÿÝÿðÿûÿýÿøÿóÿíÿêÿóÿûÿ X†À~áMÈK ªJ÷Ñ~4â› B × n Ç * ˆ Ç ÿ Ž v P  ¸ ( o £pJ´¼ÿ(þ…üÏúùÄõûóCò€ðiíÕë9êÈè^æåäìââéàTàà¸ßÐßàWàáàLâ ã1äGåßçféïê¤ìYîôñèó×õÜ÷ÖûØýÜÿѯv. ¾ Ð 18 ÎS¡âŠ^)ÄqÚ^NT`VT Ò ½ · ­#3HpdÀ)9Ñÿzÿ4ÿÿþþ‹þ’þ„þ¢þÃþêþÿ1ÿ\ÿ‚ÿ¦ÿÃÿÜÿïÿûÿþÿõÿåÿÐÿ¶ÿ—ÿuÿZÿ9ÿÿûþáþíþèþëþúþSÿƒÿÅÿ×RÞxš[%âJC 8 : — … |^b/܈æA–¾Ý Ô{ð&PJ2 _ æ]¯.IþVügú›ö«ôÒòóðíóëVêëè^æ&å)ä1ãxâJáÙà­àˆà£àájáâhãQäpåæëèhêáëíï8òúó±õu÷Æúuü$þÀÿÑ6‡´ ì ª U Õ  E [ f ½ y - Ä o ä D ¥ ã ( s·gÂ!QËMÞJö°u'òÿäÿÝÿÒÿØÿàÿêÿñÿúÿÿÿüÿóÿâÿËÿ¬ÿ„ÿWÿ#ÿéþ©þgþ þÙýœýVýý×üÅüžü|üjü`ü¿üãüý\ý@þ¹þJÿïÿb7 åü? e O € £ÏvtvVbª3_‚žƒ^@¨*ñÓ„*ù J “¼ìüÿ þü0ú~ö°ôóVñCîíìžë}ê_èçÝæBæáå$åå+åSåºåTæñæÀç$éêCëcìîÛï+ñ’òìóköÔ÷-ù†úõü-þYÿp€_*Ö1¡ð0SÔÉ£vk·Mëxü†Š­I؃8õ®€Z<ÿÿûÿñÿãÿÐÿµÿŠÿ_ÿ*ÿîþšþKþõý—ý4ý¿üRüåûsû û¥ú>úâùµùmù8ù ùLùRùcùùÉùÈúEûÔû€ü1þÿ.z¼gç Q ² {¿ >t!èœaÙTý½sî`Ÿ›ŽNfÀ + GclÿˆýŸû¼ùô÷ƒôëò}ñðíƒì‘ëÕêRéÛèŸèlèpèAèƒèøèqé9ê ëàëÕìSîaï‰ð¨ñŠóÂôìõ÷;ø)ú<û<ü4ýÝþ©ÿc A³Xø ôÏOÈz)Þ“L ΚnJ. ÷ÿßÿ¾ÿ’ÿ\ÿôþ¢þFþÜý4ý´ü&ü“ûÄúúxùÈøøW÷®öösõøô…ôô¾óÍó¡ó˜ó™óhô¼ô õ«õGö!øùúDûîýUÿ×m³i/ ì /î’>ÉsÝN Ö›®ëãÔ~ßáˆ+œn·Ý A BLMkÿ„ýµûóùSø*õËóšòyñHï’îëívíXì*ì/ì>ì}ììíí9îïêïÂð²ñþòóóöôìõb÷[øCù)úþúGüý«ýFþ;ÿ®ÿcñ9HuhQ6ÿ×®ˆgG,)Cb…¤Éî1@HüÙ¥´ÿIÿËþ@þ-ýzü¼ûìú’ù°ø½÷Ëö`õaôoósò‰ñgðŒïÍî îí í™ìTìì”ì¼ìðì=îÜîŒïnð`ñïóCõ¨ö6ø¥ûkýMÿ;89D > ë°výc“¿8Û8 ¼ Í ˜ [ ‹ÈþøË]ñ[_²ë. Î ü;v'ÿþ–üHûÅø»÷Ùö ölôúó˜ó`ó§òªòÑòóSó}óóó‚ôõ¸õjö÷Ï÷®ø_ùúºú•û1ü¾üDý¼ýXþ¶þÿKÿ¤ÿÎÿíÿ!$# -Mr ÔVê5„Õ#q˜Ñ,ÿøÝ0Þ{ý¸@ÿeþ{ý§û”ú{ùOøGöõ×ó¤ò¹ð‡ïjîFíBìèêêHéŽèè±çbçHçËçôçXèÇèpêSëAìfí•î„ñó­ônö%ú ü þ %(+ Æ ‰&½#ÊïÝÂH­ )tJäyœÁæÛÒè”Hár # $Î}!÷þþ-ý–ûüú‚úú9ùùüøù½øèø(ùmùÂùúiúÙúFû¹û.üü ý€ýßý:þ‹þâþ!ÿWÿ…ÿªÿÍÿâÿðÿùÿÿÿ;Z€¯ç:ˆÜ<¶"˜”ŠkÑ6ŠÚÎî\%Ðjc ¼®•ÿiþ(ýÞûWùò÷öõ—ò<ñÖïˆîdì+ëêéèÛæ$æ¡å!åïäãäßäåæŽæJçè#êVëìøífï•òOô öä÷¢ûŒý{ÿe?ß… » *m¥¦¬jïiT[Z#ÿŽïOGXl`Z§{ [ - I ,5?\†nÿÞþaþúý3ýüüÛüÆü}ü‘ü­üÖüæü ýbý¤ýéý'þkþ­þêþ$ÿXÿ„ÿªÿÊÿâÿòÿüÿÿÿúÿòÿèÿâÿÚÿÓÿÑÿãÿðÿ"n¦ë:Ê7®3À“7Þs!׃ = ß n ý K ¤ ø + U Ô °  $ Ë 0 n š_6ùš¤ÿû}ö*ò3íêžçæ^åÍåKçžé9î‰òw÷ñüµŒ ðÌÛΓõRˆíÈ` uÿ…÷òaídétåÃãúâOãå†ç×êºî¶ô­ùÁþÎ KÇòm-áq€ L ËEèþÝûløxöõ;ô±óô°ôÁõa÷óø¢úPüpþôÿFVjÚÓkñiÌJÖvêÿÏÿÇÿÈÿÖÿæÿõÿþÿüÿóÿèÿÞÿÛÿãÿ4wÎH½5¬]‡‚‹ÃPÿ”ý üú¢øG÷(öIõàôëôdõóö˜ø¯úEýHÕ º$rüº™Áó W +tïúöŸñ„íéŸæçä0äËäBæÃèìãñþöü{C ­guk,¡—íCæ X|ÿÏùéòvîÜê è®å&åsåÊæ©é¸ìuð™ô’úDÿÞä ´¹ Í[R¥á B Z[Z~þøûäù±÷§öö÷õ5öñöç÷ù¹úü~ýÊþUO ýæ¨O耲i0íÿçÿëÿòÿúÿùÿìÿÛÿÉÿÀÿ¼ÿÇÿäÿ+|â[ùƒ …Þä$WFïÿäý6ü„úÓøóö¯õ¨ôôôdôQõ»öŒù%ü*ÿ‰/¥ × À©?9Y$tä M+þúøqòîíêÕæûãëâ»â²ãŒæ²éÏíœòúE? cöŽG/ B Z;ÕØ_ wuüÆö±ññë˜èEæÓäXä?åòæéåíÞñGöáú™Ÿ ú ŽP>óšÌ " EP~×ý”û¼ù×÷ ÷«ö·ö÷Û÷Üøýù„ûÌüþ%ÿq8Æ h\4ò¢Lø­e5úÿûÿþÿþÿôÿãÿÌÿ°ÿ•ÿ~ÿpÿ€ÿÿÕÿ*ÀPñ k ›#Ä(ÈsÚÿ þ“û¥ùÎ÷ö_ô\óµò’òZógôöBøü[ÿû·i ½ Úé ƒÑG  £sýDø_ó’íÓéåæ¹äsã ãµäáæ-ëLï3ôœùj_ «ëQIõ¿„G ïsäúÎõDñGìé¾çâæìæ èê ìïðÎôäø)ýǶ á ²ßk@Zñ Ý ·ƒýBûåùéøøý÷5ø¼ø•ù…ú‘û üðýëþÆÿ~<¸½°|>ûµ{K(üÿòÿÞÿÂÿŸÿxÿRÿ9ÿ'ÿ*ÿEÿŸÿ‹3"òÃ’XÞ8OØBL¸»þ’ü^ú›÷–õÔóYòCñäðñÌñèó öÐøü"6P / ²§å€"­e"¾¨ تû£õ„ðžêç'äXâˆáâ°ãCæ@ëñï@õ û\… '9«šló`³<mJ ϶ùµôdðÄì*éŸçéæ0ç£è´ê€íÃð®õÂùãýôñ ˆ h W> Ñ ¯ mZúÃÿÒý¯ûŠúËù_ù(ùtùôù¥ú˜û|üdý>þ<ÿåÿlÌ 1' ä²V0ýÿõÿáÿÄÿÿnÿ9ÿÿÙþ¸þ¾þÒþ ÿdÿ ׬—ö”Zè**Ω{éF þ´ûRùnöjô¤òIñcð)ð”ð”ñô‘ö˜ù*ý€¸Ï °®½ðW–4Ç ËTòø¨óÛîê(æáãqâ+â_ãaåsèOì®ò(øýý Ô Œ@­÷Q€=Ò+ ÂSþ'ù ó=ïGìê`èFèíèlê@í!ð‚ó!÷/ü »¯ ± Ëyt ý É Ášt¸×þAýüÇúKú#ú;úú ûÌûüzý9þêþÿ!y¯ÇÑ»šuP0 úÿêÿÏÿ¡ÿkÿ,ÿçþ¡þdþ7þþDþ|þÞþrÿ}v‰².+ôpœfÒ>­·^ìü9ú–÷õ9òqðïIîaîïpð|ò`öíùóý_hÉ Ê^öÒñ”‹€­U ê&ÿ_ù(òAíé£å•â€áVáaâLåèÂìñùÿí Ñ(‡ÈÅÙÔö#žº ÅŒý§ø]ôŒï×ìëôé®éêì@îÅñôôjøõû§úß8 © Á ; ; ¬ ™ = šVs“A¶þwýƒü—ûPûDûsûÎûQüêüˆýCþ×þWÿÁÿ(ZrvpY?' çÿÃÿÿNÿöþ¢þKþûýÂýýšý½ýHþÜþ¦ÿ¦-uÂuj, — n  Ê:æ<ÿ`üžøÕõJóñàîÇí<íkíçî®ð7ó_öŽûôÿ¥Z "]¥TÀ 9PüŠö-ñôêç(äâá¢áãµå…êïAôèùéæ} X´©ƒu&FÈ. 0YYûÚöìò©î~ìë‚ê½êÝë²íð¦óßö5ú›ýùörp h  \  M - Â2U¯(oþsýÃüRüýûüRüµü7ý¼ýCþÁþGÿ£ÿéÿ=B;,   ûÿÎÿÿ,ÿÊþ\þàýxýýØüÐüãü-ý®ýÇþ×ÿ€zÒ ¿  í?ƒ}þPû)øHôñJïní ìÐë%ìVí-ðó”ö±úïâà K„ÐBëxÅ-€Šú ³öûUõðê„æÅã"â„á7âäÎæÛëŽðÄõpûD 7Äž©#sÏ8úÃ9 yštú_öõò,ð{í~ì/ì§ì îßï7òÚô¨øÁûÌþ¶.AÍæ Ä ¾ [ – Y ž)Mí¸ÿ¹þ³ý=ýýöüýOý©ýþˆþîþIÿ”ÿÚÿÿÿ$4BG>Ýÿÿ-ÿ þþ•ýý‘ü:üüûûbüÞü¡ý¨þp¹u”% y Ž 4 S  !  ñX5Öüjù ö òbï!í‰ë—êêhëûìxðÞóÞ÷zü0eV íý8aU;èO< ¡ƒøÔò¾íLé»ä}â.á áqâ¢ääçâëQòÎ÷’ýw÷ ð~ž­ÚöœØSWz¼ÿ°ú‘õuòðhî#í.íÑíïgñ·ó\ö!ùáü³ÿR—Y € B:Í…8ûˆÿÅþ<þ¾ý¡ý®ýÖýþgþ»þÿaÿžÿÍÿíÿ 2Mi€ƒ|^ ðÿÊÿ—ÿZÿßþƒþþ¨ýéü]üÂû"û8ú„ùÒøø]÷~öÈõ õtôæóhóëòŒòòXòHòBò óYóµó=ôÕô±ö¢÷¦øÐùƒüìýpÿ[Ü› î ¯W•SÀ@é¶Cñ8:6Ÿ‡¹æÙ”KÐÔ3q² # ;\tÄöþ9ý‹ûÿù÷³õôzóiñ¸ðð§ï’îcîeîpî¥î«îïŸï,ðäð«ñoòHókôIõ2ö÷Wø5ùúÑúŽûªüNýáýhþ6ÿ˜ÿìÿ0¤ÅÜæùåͱ}_C, $<Z}¤ÎðAei~ŠŽL.ȺÿFÿ¿þ+þýJü…û¯úJùeøp÷~öõô&ó.òKñ1ð_ï¬î÷íuí íªìsìÌìÏìíEíœîDïûïäðÝñjôÁõ'÷²øüÔý¬ÿhXP 4 Ñ Jõq)s‚‹/¼B…äß–Gg™Éû˜3ÑHo×' ‚ [©h\æþŠýAüûÜøö÷7÷‹ö*õÕôômôßóôó*ôhôÂôõyõö“ö7÷ß÷ø+ù÷ù–ú6ûÊûˆü ý…ýõýWþÕþÿ\ÿÿÏÿëÿÿÿ  %?aŽÀù9ƒÏs¿c¯úDnˆ@5åª.˜*_ÿ€þ‹ý‹ü–úpùGø ÷òôºótò=ñVï&îíúëëÅéóèOè­çSççëæóæ±çþç„èéøêþëíRî ïÀòjôöï÷Áûµý¼ÿÅääã Á ]—dàé·}Ê F@R ƒùíúçËÂe¢-  M éaÁ‚F<ÿIþlý®ü=û»úYúúLù<ù8ùMù&ù_ù©ùøùVú£ú û}ûêû]üÍü5ý›ýþ\þ«þðþ8ÿlÿ–ÿ¸ÿÓÿéÿõÿüÿ '?m™ÎVÁ"‰ü ’­7ºA¦vÉ ô  ÿ3çzûkº¶f)ÿÚývü ûFøÀö?õ¯óüðˆï îªìgê!éèäæøå¶äþãããäâêâ÷âDã\äòäÅåŸæáè1ê†ë í‘îññÆó›õŒ÷uûqýtÿoiH Î ‡ËÆG¼¢¡˜V+²ZOXdQE•f C  8 ù<Lp¡B¦ÿÿ§þIþ’ýaýEý5ý÷üý,ýVýiý¢ýàýþ^þ–þÓþÿBÿrÿ›ÿ½ÿØÿíÿúÿûÿòÿåÿÖÿÇÿ¿ÿµÿ®ÿ¬ÿÈÿÚÿõÿz¾n™!¹YNÁ‡‰J  Ñ £ U ñ ë L§ßŒg4Ö k Ê ÿ ! ÉCÕ·ÿgý©ûíù‰öÀô óLñ2î¨ìë·éUçæåä[ã:â¸áwá;áZá¥á÷áˆâàãµäÄå׿Cé¸ê-ìÌíiïµòˆôSö,øÃû•ýdÿ#”#¡û£ · ž t‹ì<·}<Òxæ4„— º å ÿ $ ê/X'k·˜#¼Ýÿ©ÿ‚ÿhÿ7ÿ7ÿ?ÿMÿRÿlÿ†ÿ¡ÿ·ÿÏÿäÿóÿýÿþÿôÿäÿÍÿ±ÿŽÿhÿAÿÿèþºþ¡þ}þ\þCþ0þ[þfþ}þ£þ0ÿ~ÿßÿQVô¦dĦއ€   * “qI:ô‰L…·µª¬4¯öçæ¶ v r Ø1k²ÉþÜüæúùø;õ\óšñØï©ì4ëÂéƒèBæ?åyä¹ã6ã^â&â,â9â â.ãÀãäæçFèzéÛëZíÑîdðíñáô†öø¸ù·ü7þ¬ÿ ¶ÝïÝ»f é [ ¦ z ‹ y ] u  ¸ ? Ð A ¤ S« iÑ…Šô•?õ›jD&ùÿôÿóÿõÿøÿüÿýÿôÿåÿÐÿ°ÿ‹ÿ_ÿ*ÿîþ¦þ\þþ¹ýeýý¸üdü*üßû ûdûtû\ûNûUûgû üXü³ü(ýiþÿÝÿ·“ŸÁé[ ž ò ; Z¥ØÉÅÄ—†*™íäÒ‚)¨×ûäFîg× P s‘„xþrülúzøµôèò@ñžï¢ìbë)ê)é:çææŽåWå×äçä4å†å%æäæ¤ç“èê5ënì¡íÆï'ñ}òâó8õž÷öø;ú~û¹ýÒþÜÿÏšSø—ä5<k5øÕw°Nât :ß‹@ò¸ˆ_:#þÿøÿìÿÛÿ¶ÿ“ÿgÿ1ÿÛþþ8þÙýSýÞüeüâû]û¾ú0ú¨ùùœø%ø®÷H÷$÷Ûö«ö‚öîö÷0÷x÷Ï÷ ùÇù€ú]ûvýþÇÿÔL×bK ç q ‰‰ÒøæÔŠ_Ö :Ö€"„ÞúÙ²U_ÌO˜  © šœþªüÁú÷ø~õèó~ò!ñîší³ììêêåé½éËé›éæéaêàêšëkì:í,îï‘ð«ñ»òsô•õ©öÀ÷ÇøwúmûQü+ý“þAÿßÿha»8­¹´¦‹‹[%í¾C Ô£vQ2  *8JZhbb\M äÿ¯ÿkÿÿþþ“ýý#ü‚ûÑúúùMøŠ÷¼ö÷õõFô˜óèòXòÜñbñ ññòðïð÷ðâñGòºòXóôö÷=ø‚ùfüæý„ÿ1±~Y( š hÌ^'”ÍÜ ^Ý~µ¨”èN­ÏìÒ~)¥¥þ7v ï 2S¹øþLý¯û4úU÷ö õ ôòxñêðŒð“ïtï‚ï™ïÙïíï\ðëð}ñ3ò÷ò·ó‰ôœõpöK÷øFùúÑúŠû3ü+ý»ý;þ¯þZÿªÿîÿ#z ±¢ŽyaN7",Gj¼íTy§Ôúõ °…M0¹ÿ.ÿ‘þæý“ü¿ûåú÷ùgøl÷bö^õÐóÄòÈñÄðØï­îÔííiìéë‡ë)ëüêdësë¶ëìzí5îýîøïñ³óõ”ö3ø´û‚ýhÿWJEE . Õ¤Mön%ekk…7~+ÒëA5( §GÄoÊ 2 *Šûm‹+ÿâý¯üû‹ùºøøu÷7öðõ·õ¤õ,õIõ„õÅõ!öböØöa÷è÷€øù²ùLúû‘ûü¡üBý´ýþvþÇþ(ÿaÿÿ¶ÿáÿóÿþÿ %AcŒ¾ÿA‹Û5ìN£üU¦õ4\oûΑ›äJiÿsþhýQü/úôø¹÷mö0ôëò˜ñXðZî"í ìïê÷é´èæçHç®æ\æ/æ ææìæFçÝç}èqê…ë£ìôíOïwò+ôæõ¿÷•ûŒý”ÿ›°ª  u ¨ Ë/&â”Ë+È;©ž©¶™€Ž:ð> æ … 5áŸqNGWÿþ¼ýýÔûgûûØú=ú8ú?ú[úFú‚úÌúûrû½ûüƒüåüIý©ýþVþ«þïþ-ÿaÿ“ÿ¶ÿÑÿæÿôÿýÿÿÿþÿýÿ.Jo²î3„Þd×PÔ} Ÿ2Ôhñ}áJ ° ý E    ñ  ¦#ŽÒíô×Yÿ¡ý'üªúÀ÷*öôó7ðÀî?íßë–éSè=ç'æDå äbãõâââ•â²âã@äçäÌ叿 édêÂëPíàîEòôóõß÷»û±ýªÿšuC ¡ Æ $PnY?ßI¨q^Cóµ0‚ÒÈÑßÓÏ5   æ /(#1¥Î U(¤ÿ1ÿÑþ†þõýÔýÄýÀý˜ý´ýÕýÿýþNþ†þ½þóþ#ÿSÿÿ¥ÿÅÿÞÿðÿüÿÿÿ÷ÿëÿÜÿÊÿ¶ÿ¢ÿŽÿ‹ÿƒÿÿƒÿ²ÿÎÿ÷ÿ*ªgÙ«?ÝŒ@W$ðÈá ® „ I " Ù ve¾<^¾…>Ê5 { –   ÆcÚ×þýFûyùöõ#ôeò ð|íòëfê 驿{å†ä“ãßâÎá]á/á á;á˜áûáâ äïä æ*ç¢é!ëžìAîßï'óöô»öø üÐýÿ>‹p´3 0 ÿ ¾ Oèy3çu|Ë  5 ` ’ ¹ éÇô.j\µ‡·Fåâÿ½ÿ¢ÿ“ÿtÿyÿ…ÿ”ÿžÿ³ÿÈÿÛÿêÿ÷ÿÿÿüÿðÿÞÿÅÿ¤ÿÿTÿ#ÿðþÁþ‹þWþ"þ þçýÇý±ý£ýäýúýþQþÿdÿÚÿb•Mî}xv‡– J g x • á×!¯Ó$ûÞT½î¼¨a ß 2y¡ÈÐþÕüÔúáøõ2ónñ«ï{ì ë¢éjè/æ8å~äËãWãŒâaâwâ”âãœã9äå—æŸçÙèêlìçí[ïçðhòDõÝöføòùÍü:þ›ÿæbsnHý” c Ÿ V [ ?  $ Å c ë}ô`Ï(ûiâ>ÃTìt&á¨fC)þÿüÿýÿÿÿüÿôÿäÿÏÿ³ÿÿ]ÿ'ÿêþ¤þXþýý£ýFýãüƒü$üÁûfû,ûÞúžúcú€úpújú{ú™ú^ûºû&ü°üþàþ¾ÿ°¾â[± b Ç _¶ò5õôôÆ·Tº÷àÁdþmŠœyÊeÐ3  ¹Îͼ±þ¬ü©ú½øõ@ó¢ñ ð íìëÂêÒéøçNçÞæxæOæÝåùåPæ«æLçèÓèÃéCëUìˆí´îÁðòZó®ôôõ1øsù£úÎûØýÙþÉÿ¤?âqãÒ2GCXá¹`¨NîŽ4؆=ûÁ‰`?&ûÿîÿÚÿ¿ÿ†ÿUÿÿÔþdþþžý-ýüü}ûêúVú¥ù ùyøâ÷`÷åökööëõ§õ~õ^õâõ öBö›ö÷|ø8ùúøú;ýmþ»ÿ.ÈÐ x ª0Ð>„̦ŒqãIq’¸KœæöÉ—.4Ûj u„Ÿþ½üæú-ùÕõSôÿòºñHïhî—íúìœëEë#ë ë(ë ë_ëâëiì$íõíÅî±ïñýñ ó ô£õ³ö´÷µø¦ù+û üÔü”ýÌþbÿéÿ\*q©Î%'éß±M"jG+"6Let‰›©–‚h×ÿ‘ÿ;ÿÚþþ“ýýbü[û¥úàùùô÷÷Löqõ¢ô¦óßò.òzñððxðð²ïÛï½ïËïäïïðhñïñ¥òjóŸõÃöú÷Tùaüùý¨ÿg äÊ¡ $ô¤Xæ®An2æ•‘³“m®RcoJï” j¤ç r ™ÍýˆÝþCý»ûWú¥÷öˆõ ôÖòOò×ñŒñµð¨ðÄðéð3ñWñËñ]òðò¥ódôõçõèö¯÷{ø;ùGúû«ûOüäü¶ý1þþüþ„ÿÃÿöÿYfkhm^L:(  2Qw¢Ô@|·õLz ‹˜–‰ÔŠ*0¡ÿÿþIþ…ýüû&ú ùf÷Xö;õ'ô{òbñ]ðQï]î*íRìžëëêtêêÆé¦é'êGêêþê•ìfíDîWïwðNóÌôWöø©û†ýzÿt|~ƒ n è‹+šF{tdê[Äì2­CRu•€kPé‰ VÌ 1 ¥ ½,®6€6ÿþéüíûúKù´ø/ø÷àö¸ö±öRöxö¹ö÷`÷¦÷øžøù®ù@úÊúWû÷ûwüóüdýêýJþžþéþ)ÿqÿœÿ½ÿ×ÿðÿúÿ%=\Œ¾ø<’åA¡ wàMª i½?`kñÐ’E'”î,^dÿUþ0ýü±ù_ø÷«õIóõñ“ðGï1íòë×ê·é¿èvç«ææ„å:ååþä!åækæçÀçÌéðêì~íçî&òâó¤õ†÷iûfýnÿt‰|j 8 ·S¿ N…3×û:¸!†|†‘wa5ö£ r * Ý¡vJ4(Rzÿ¹þ þ|ýdü üÉû™ûûû.ûPûHû„ûÍûüjü²ü ýcý¹ýþ_þ¨þìþ.ÿaÿŽÿ²ÿÒÿæÿõÿýÿýÿøÿôÿöÿ÷ÿþÿ .Mv¨R© y¢-Ć!ÆfµE × ; £  Q • K H 9  ù ‰ óLeiX%yÿ–ý üxúi÷Ãõ*ô„ò¡ï#îžì<ëéè¦ç–æ†å«äxãÙâxâââ?âkâØâäÄäµå¬æ éoêÔëgíüî\ò1ôöí÷·û¢ý‘ÿu3ò£+ * sŒ–m3Àf÷Ïx2©öCBQfel í Ý Ú ÒCRf‹,nÃ&%µÿWÿ ÿÐþ_þJþDþGþ1þNþpþ˜þ´þâþÿ>ÿiÿŽÿ°ÿÎÿäÿôÿþÿýÿóÿäÿÐÿ¸ÿ£ÿ‰ÿpÿXÿBÿHÿCÿDÿPÿ•ÿ½ÿôÿ7ÙC½D<æ˜\$\: þ /  ã ¯ Hã~Ça—Ù7®ö ) ,  nô…¿þïüû9ù¢õÌó òAðí•ëê¹è`æ?åWätãÌâÏáqáSá<á~áêá[â ã†ävåžæÇç>ê¾ë:íÜîwð®óqõ*÷îøOüþ­ÿFeÉE“ w 1 Ù S {µÃÆ ¾iò ‰ ó E ™ ½ ó 1 f¥Ÿß-•zVù«i éÿÏÿ¿ÿ¸ÿ¨ÿ±ÿ¼ÿÊÿÕÿäÿñÿûÿùÿìÿÙÿ½ÿšÿrÿBÿÿÖþ˜þZþ&þèý¯ývýgýDý&ýýýjýý¾ýþÝþTÿßÿ~௔‚?Qd‰ « € ¬ Éñ‚|{VM‹#@U3Ê+~™C½V  H˜©ªþ¦üú¨ø×ôöò7ñyïQììêŽéeè?æZå°ää¬ãõâÛâã0ã²ãXäåàånç~èºéñêEí½î+ð¯ñ'óèõp÷èøaúýgþ²ÿæ0*ÎUÕ2«B :  åß~¥8¶)£ }úyx³^Äf:#üÿôÿçÿÕÿµÿ’ÿfÿ3ÿëþ¤þVþþý¡ý3ýÉü^üíûƒûû°úOúúÊù‹ùSùƒù|ù€ùŸùÍù·ú'û¨ûHüçýÂþ¹ÿÅ F˜ïq à H À '‚ã%n?:6î‚Þ4Ú«:Á "ì%²hà ÓàÙÄ·þ¶ü¸úÒø"õhóÕñLðríOì7ëVê‘èøçšçEç+çÇæñæSçºçcè,éöéèê`ìpíœîÁï·ñÿò9ô€õ¶öËøùùû(üþíþÇÿŠ÷„þ^(Ukthd*íÀlÃsÍ7ö½‹b>$ ÷ÿáÿÃÿ›ÿKÿ ÿ¾þfþ×ýhýìühü«ûûxúÓù1ùmøÆ÷*÷Šöö„õõ£ô“ôTô4ôô½ôôô9õ¤õ öÁ÷’øuù~úñü:þŸÿ+Ë|' O ¢L×…ô9\<·uÐëÿ|‹ÐÙž--ŒÊ_ l€†¬Æþòü*û€ùHöÙô—ócòðIï‰îÿí½ìuì`ìWì~ìoìÌìSíÝíšîgï1ðñYòIóHô<õµö²÷ øùiúÂûŠü?ýèýõþuÿçÿGï&Oh¦¡z[J!ö̧[<$ ,E^{›¹ÇÞïúØÊ²Îÿvÿÿšþ²ýýsü¾û‘úÈùïøøÔöîõõ(ôOóDòwñÄðð†ïï£î\î–î„îŸîÇîñï|ðñßñ¸òõHö’÷ù3üÛýÿk$ ûÙ j;ëž%êFiˆEëŠècuFBŒÑÙݶUön~Ûj  HÏ‚ëþhýøû«ú&ø÷8öiõÉóVóóò¸òþñÿñ&òVò§òÔòKóÜónôõÓõ…öA÷-øåøŸùNú:ûßûuüýƒý2þ˜þðþ=ÿ¦ÿÕÿúÿ;A@:8+ 9Y°æ `Ÿâ'k¯Ò3U.4't(ÌX1‹ÿÒþþ)ýzûwúoùTøtöUõ(ôó@ñðïýííÑëúêLêŸé1éäèèŒè%éWé¿é2êçëÎìÁíæîð ó›ô6ö÷÷®û–ý‘ÿ‘©§¨ ‘ ;ý—-(J2…ã8M~LÛdg–}eNëxú n ñ 0´Léd5ÿþý7üúÞù]ùíøú÷Õ÷½÷Â÷{÷ª÷ð÷<øuøæøWùÔùNúÓúXûÕûSüÞüMý·ýþ‚þÏþÿKÿˆÿ­ÿÊÿßÿóÿûÿÿÿ#9X~¹ò6‚æE©…yíeÅ*Žâñ*MgñÎL* ÷9^]Hÿþâüoúù³÷OöÈóUòôð†ïEíìÅê©é èçQæŽååŒä>ä-ä#äØäMåÊåƒæjègéžêÝëÏînðòÚó¦õuùvûvý}ÿˆ‰w] ö w!8íuÒ$8Beÿ“òDLW¸…Z Ö Ž V õààHˆÿÞþ¨ý5ýÜü”ü÷ûåûßûíûËûöû/ükü±üèü6ýˆýÖý"þnþ´þõþ3ÿfÿ’ÿµÿÔÿèÿöÿþÿcenterim-4.22.10/AUTHORS0000644000175000001440000000053111461606612011455 00000000000000The base of CenterIM was written by Konstantin Klyagin . It was called CenterICQ. Currently, the software is written and maintained by several people: # Stéphane Bisinger # David Riebenbauer # Mark Pustjens # Thomas Graf # and many more See for more information: http://www.centerim.org/index.php/CenterIM:General_disclaimer centerim-4.22.10/firetalk/0000755000175000001440000000000011473011456012266 500000000000000centerim-4.22.10/firetalk/Makefile.in0000644000175000001440000005166011473011437014262 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = firetalk DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libfiretalk_a_AR = $(AR) $(ARFLAGS) libfiretalk_a_LIBADD = am_libfiretalk_a_OBJECTS = aim.$(OBJEXT) irc.$(OBJEXT) toc.$(OBJEXT) \ firetalk.$(OBJEXT) safestring.$(OBJEXT) oscar.$(OBJEXT) libfiretalk_a_OBJECTS = $(am_libfiretalk_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libfiretalk_a_SOURCES) DIST_SOURCES = $(libfiretalk_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libfiretalk.a EXTRA_DIST = aim.c irc.c toc.c firetalk.c safestring.c oscar.c aim.h toc.h firetalk-int.h firetalk.h safestring.h oscar.h toc2_uuids.h AUTOMAKE_OPTIONS = foreign libfiretalk_a_SOURCES = aim.c irc.c toc.c firetalk.c safestring.c oscar.c SUBDIRS = AM_CPPFLAGS = -I$(top_srcdir)/../connwrap -I$(top_srcdir)/../connwrap all: all-recursive .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign firetalk/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign firetalk/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libfiretalk.a: $(libfiretalk_a_OBJECTS) $(libfiretalk_a_DEPENDENCIES) -rm -f libfiretalk.a $(libfiretalk_a_AR) libfiretalk.a $(libfiretalk_a_OBJECTS) $(libfiretalk_a_LIBADD) $(RANLIB) libfiretalk.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aim.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/firetalk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/irc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oscar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safestring.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toc.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/firetalk/firetalk-int.h0000644000175000001440000003201311461606612014750 00000000000000/* firetalk-int.h - FireTalk wrapper declarations Copyright (C) 2000 Ian Gulliver This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. 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 _FIRETALK_INT_H #define _FIRETALK_INT_H #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #include #include #include #ifndef HAVE_INET_ATON # define inet_aton(x,y) inet_pton(AF_INET,x,y) #endif #define DEBUG typedef struct s_firetalk_handle *firetalk_t; #define _HAVE_FIRETALK_T #ifndef _HAVE_CLIENT_T #define _HAVE_CLIENT_T typedef void *client_t; #endif #include "firetalk.h" #ifndef SHUT_RDWR #define SHUT_RDWR 2 #endif typedef void (*ptrtofnct)(firetalk_t, void *, ...); typedef struct { char **keys; void **data; int count; } firetalk_queue_t; struct s_firetalk_buddy { struct s_firetalk_buddy *next; char *nickname, *group, *friendly; long idletime, warnval; unsigned char online:1, away:1; int typing; char *capabilities; }; struct s_firetalk_deny { struct s_firetalk_deny *next; char *nickname; }; struct s_firetalk_member { struct s_firetalk_member *next; char *nickname; unsigned char admin:1; }; struct s_firetalk_room { struct s_firetalk_room *next; struct s_firetalk_member *member_head; char *name; unsigned char admin:1, sentjoin:1; }; struct s_firetalk_file { struct s_firetalk_file *next; char *who; char *filename; struct in_addr inet_ip; #ifdef _FC_USE_IPV6 struct in6_addr inet6_ip; int tryinet6; #endif uint16_t port; long size; long bytes; uint32_t acked; #define FF_STATE_WAITLOCAL 0 #define FF_STATE_WAITREMOTE 1 #define FF_STATE_WAITSYNACK 2 #define FF_STATE_TRANSFERRING 3 int state; #define FF_DIRECTION_SENDING 0 #define FF_DIRECTION_RECEIVING 1 int direction; #define FF_TYPE_DCC 0 #define FF_TYPE_RAW 1 int type; int sockfd; int filefd; void *clientfilestruct; }; struct s_firetalk_subcode_callback { struct s_firetalk_subcode_callback *next; char *command, *staticresp; ptrtofnct callback; }; struct s_firetalk_handle { void *handle; void *clientstruct; int connected; struct sockaddr_in remote_addr; struct in_addr local_addr; #ifdef _FC_USE_IPV6 struct sockaddr_in6 remote_addr6; struct in6_addr local_addr6; #endif unsigned long localip; int protocol; char *username; int fd; ptrtofnct callbacks[FC_MAX]; unsigned char *buffer; unsigned short bufferpos; struct s_firetalk_handle *next; struct s_firetalk_handle *prev; struct s_firetalk_buddy *buddy_head; struct s_firetalk_deny *deny_head; struct s_firetalk_room *room_head; struct s_firetalk_file *file_head; struct s_firetalk_subcode_callback *subcode_request_head; struct s_firetalk_subcode_callback *subcode_reply_head; struct s_firetalk_subcode_callback *subcode_request_default; struct s_firetalk_subcode_callback *subcode_reply_default; firetalk_queue_t subcode_requests; firetalk_queue_t subcode_replies; unsigned char deleted:1; }; typedef struct s_firetalk_protocol_functions { const char *strprotocol; const char *default_server; const short default_port; const unsigned short default_buffersize; fte_t (*periodic)(struct s_firetalk_handle *const); fte_t (*preselect)(client_t, fd_set *read, fd_set *write, fd_set *except, int *n); fte_t (*postselect)(client_t, fd_set *read, fd_set *write, fd_set *except); fte_t (*got_data)(client_t, unsigned char *buffer, unsigned short *bufferpos); fte_t (*got_data_connecting)(client_t, unsigned char *buffer, unsigned short *bufferpos); fte_t (*comparenicks)(const char *const, const char *const); fte_t (*isprintable)(const int); fte_t (*disconnect)(client_t); fte_t (*signon)(client_t, const char *const); fte_t (*get_info)(client_t, const char *const); fte_t (*set_info)(client_t, const char *const); fte_t (*set_away)(client_t, const char *const, const int); fte_t (*set_nickname)(client_t, const char *const); fte_t (*set_password)(client_t, const char *const, const char *const); fte_t (*set_privacy)(client_t, const char *const); fte_t (*im_add_buddy)(client_t, const char *const, const char *const, const char *const); fte_t (*im_remove_buddy)(client_t, const char *const, const char *const); fte_t (*im_add_deny)(client_t, const char *const); fte_t (*im_remove_deny)(client_t, const char *const); fte_t (*im_upload_buddies)(client_t); fte_t (*im_upload_denies)(client_t); fte_t (*im_send_message)(client_t, const char *const, const char *const, const int); fte_t (*im_send_action)(client_t, const char *const, const char *const, const int); fte_t (*im_evil)(client_t, const char *const); fte_t (*chat_join)(client_t, const char *const); fte_t (*chat_part)(client_t, const char *const); fte_t (*chat_invite)(client_t, const char *const, const char *const, const char *const); fte_t (*chat_set_topic)(client_t, const char *const, const char *const); fte_t (*chat_op)(client_t, const char *const, const char *const); fte_t (*chat_deop)(client_t, const char *const, const char *const); fte_t (*chat_kick)(client_t, const char *const, const char *const, const char *const); fte_t (*chat_requestextended)(client_t, const char * const); fte_t (*im_searchemail)(client_t, const char * const); fte_t (*chat_send_message)(client_t, const char *const, const char *const, const int); fte_t (*chat_send_action)(client_t, const char *const, const char *const, const int); char *(*subcode_encode)(client_t, const char *const, const char *const); const char *(*room_normalize)(const char *const); client_t (*create_handle)(); void (*destroy_handle)(client_t); } firetalk_protocol_t; enum firetalk_connectstate { FCS_NOTCONNECTED, FCS_WAITING_SYNACK, FCS_WAITING_SIGNON, FCS_ACTIVE }; fte_t firetalk_register_protocol(const firetalk_protocol_t *const proto); void firetalk_callback_im_getmessage(client_t c, const char *const sender, const int automessage, const char *const message); void firetalk_callback_im_getaction(client_t c, const char *const sender, const int automessage, const char *const message); void firetalk_callback_im_buddyonline(client_t c, const char *const nickname, const int online); void firetalk_callback_im_buddyaway(client_t c, const char *const nickname, const int away); void firetalk_callback_buddyadded(client_t c, const char *const name, const char *const group, const char *const friendly); void firetalk_callback_buddyremoved(client_t c, const char *const name, const char *const group); void firetalk_callback_typing(client_t c, const char *const name, const int typing); void firetalk_callback_capabilities(client_t c, const char *const nickname, const char *const caps); void firetalk_callback_warninfo(client_t c, const char *const nickname, const long warnval); void firetalk_callback_error(client_t c, const int error, const char *const roomoruser, const char *const description); void firetalk_callback_connectfailed(client_t c, const int error, const char *const description); void firetalk_callback_connected(client_t c); void firetalk_callback_disconnect(client_t c, const int error); void firetalk_callback_gotinfo(client_t c, const char *const nickname, const char *const info, const int warning, const long online, const long idle, const int flags); void firetalk_callback_idleinfo(client_t c, const char *const nickname, const long idletime); void firetalk_callback_statusinfo(client_t c, const char *const nickname, const char *const message); void firetalk_callback_doinit(client_t c, const char *const nickname); void firetalk_callback_setidle(client_t c, long *const idle); void firetalk_callback_eviled(client_t c, const int newevil, const char *const eviler); void firetalk_callback_newnick(client_t c, const char *const nickname); void firetalk_callback_passchanged(client_t c); void firetalk_callback_user_nickchanged(client_t c, const char *const oldnick, const char *const newnick); void firetalk_callback_chat_joined(client_t c, const char *const room); void firetalk_callback_chat_left(client_t c, const char *const room); void firetalk_callback_chat_kicked(client_t c, const char *const room, const char *const by, const char *const reason); void firetalk_callback_chat_getmessage(client_t c, const char *const room, const char *const from, const int automessage, const char *const message); void firetalk_callback_chat_getaction(client_t c, const char *const room, const char *const from, const int automessage, const char *const message); void firetalk_callback_chat_invited(client_t c, const char *const room, const char *const from, const char *const message); void firetalk_callback_chat_user_joined(client_t c, const char *const room, const char *const who, const char *const extra); void firetalk_callback_chat_user_left(client_t c, const char *const room, const char *const who, const char *const reason); void firetalk_callback_chat_user_quit(client_t c, const char *const who, const char *const reason); void firetalk_callback_chat_gottopic(client_t c, const char *const room, const char *const topic, const char *const author); #ifdef RAWIRCMODES void firetalk_callback_chat_modechanged(client_t c, const char *const room, const char *const mode, const char *const by); #endif void firetalk_callback_chat_user_opped(client_t c, const char *const room, const char *const who, const char *const by); void firetalk_callback_chat_user_deopped(client_t c, const char *const room, const char *const who, const char *const by); void firetalk_callback_chat_keychanged(client_t c, const char *const room, const char *const what, const char *const by); void firetalk_callback_chat_opped(client_t c, const char *const room, const char *const by); void firetalk_callback_chat_deopped(client_t c, const char *const room, const char *const by); void firetalk_callback_chat_user_kicked(client_t c, const char *const room, const char *const who, const char *const by, const char *const reason); const char *firetalk_subcode_get_request_reply(client_t c, const char *const command); void firetalk_callback_subcode_request(client_t c, const char *const from, const char *const command, char *args); void firetalk_callback_subcode_reply(client_t c, const char *const from, const char *const command, const char *const args); void firetalk_callback_file_offer(client_t c, const char *const from, const char *const filename, const long size, const char *const ipstring, const char *const ip6string, const uint16_t port, const int type); void firetalk_callback_needpass(client_t c, char *pass, const int size); void firetalk_enqueue(firetalk_queue_t *queue, const char *const key, void *data); const void *firetalk_peek(firetalk_queue_t *queue, const char *const key); void *firetalk_dequeue(firetalk_queue_t *queue, const char *const key); void firetalk_queue_append(char *buf, int buflen, firetalk_queue_t *queue, const char *const key); firetalk_t firetalk_find_handle(client_t c); fte_t firetalk_chat_internal_add_room(firetalk_t conn, const char *const name); fte_t firetalk_chat_internal_add_member(firetalk_t conn, const char *const room, const char *const nickname); fte_t firetalk_chat_internal_remove_room(firetalk_t conn, const char *const name); fte_t firetalk_chat_internal_remove_member(firetalk_t conn, const char *const room, const char *const nickname); struct s_firetalk_room *firetalk_find_room(struct s_firetalk_handle *c, const char *const room); fte_t firetalk_user_visible(firetalk_t conn, const char *const nickname); fte_t firetalk_user_visible_but(firetalk_t conn, const char *const room, const char *const nickname); void firetalk_handle_send(struct s_firetalk_handle *c, struct s_firetalk_file *filestruct); void firetalk_handle_receive(struct s_firetalk_handle *c, struct s_firetalk_file *filestruct); void firetalk_internal_send_data(struct s_firetalk_handle *c, const char *const data, const int length); int firetalk_internal_connect_host(const char *const host, const int port); int firetalk_internal_connect(struct sockaddr_in *inet4_ip #ifdef _FC_USE_IPV6 , struct sockaddr_in6 *inet6_ip #endif ); fte_t firetalk_internal_resolve4(const char *const host, struct in_addr *inet4_ip); struct sockaddr_in *firetalk_internal_remotehost4(client_t c); #ifdef _FC_USE_IPV6 fte_t firetalk_internal_resolve6(const char *const host, struct in6_addr *inet6_ip); struct sockaddr_in6 *firetalk_internal_remotehost6(client_t c); #endif enum firetalk_connectstate firetalk_internal_get_connectstate(client_t c); void firetalk_internal_set_connectstate(client_t c, enum firetalk_connectstate fcs); fte_t firetalk_set_timeout(unsigned int seconds); fte_t firetalk_clear_timeout(); const char *firetalk_debase64(const char *const str); const char *firetalk_htmlentities(const char *str); #endif centerim-4.22.10/firetalk/oscar.h0000644000175000001440000000151211461606612013466 00000000000000/* oscar.h - FireTalk OSCAR protocol declarations Copyright (C) 2000 Ian Gulliver This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. 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 _OSCAR_H #define _OSCAR_H #include #include /* AIM/OSCAR Functions */ /* ICQ/OSCAR Functions */ #endif centerim-4.22.10/firetalk/safestring.c0000644000175000001440000000534211461606612014524 00000000000000/* safestring.c - FireTalk replacement string functions Copyright (C) 2000 Ian Gulliver This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. 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 "safestring.h" #include #include #include #include #include void *safe_malloc(const size_t size) { char *output; output = malloc(size); if (output == NULL) { perror("malloc"); exit(EXIT_FAILURE); } return output; } void *safe_realloc(void *old, const size_t new) { char *output; output = realloc(old,new); if (output == NULL) { perror("realloc"); exit(EXIT_FAILURE); } return output; } char *safe_strdup(const char * const input) { char *output; size_t s; if (input == NULL) return NULL; s = strlen(input) + 1; output = safe_malloc(s); safe_strncpy(output,input,s); return(output); } void safe_strncpy(char * const to, const char * const from, const size_t size) { strncpy(to,from,size); to[size - 1]= '\0'; return; } void safe_strncat(char * const to, const char * const from, const size_t size) { size_t l; l = strlen(to); safe_strncpy(&to[l],from,size - l); return; } void safe_snprintf(char *out, const size_t size, char * const format, ...) { va_list ap; char numbuf[10]; /* stores shorts for printing */ size_t f,o = 0,fl,tl,ml; char *tempchr; int b = 0; fl = strlen(format); ml = size - 1; va_start(ap,format); for (f = 0; f < fl && o < ml && b == 0; f++) { if (format[f] == '%') { switch(format[++f]) { case 's': tempchr = va_arg(ap,char *); tl = strlen(tempchr); if (tl + o >= ml) b = 1; else { memcpy(&out[o],tempchr,tl); out += tl; } break; case 'd': sprintf(numbuf,"%d",va_arg(ap,int)); tl = strlen(numbuf); if (tl + o >= ml) b = 1; else { memcpy(&out[o],numbuf,tl); out += tl; } break; case '%': out[o++] = '%'; break; } } else out[o++] = format[f]; } out[o] = '\0'; return; } int safe_strncasecmp(const char *s1, const char *s2, size_t n) { size_t s; for (s = 0; s < n; s++) { if (tolower((unsigned char) s1[s]) != tolower((unsigned char) s2[s])) return 1; if (s1[s] == '\0') return 0; } return 0; } centerim-4.22.10/firetalk/toc.c0000644000175000001440000023347511461606612013156 00000000000000#include #include #include #include #include #include #include #define TOC_HTML_MAXLEN 65536 #define TOC_CLIENTSEND_MAXLEN (2*1024) #define TOC_SERVERSEND_MAXLEN (8*1024) #define ECT_TOKEN "" struct s_toc_room { struct s_toc_room *next; int exchange; char *name; long id; unsigned char invited:1, joined:1; }; struct s_toc_connection { unsigned short local_sequence; /* our sequence number */ unsigned short remote_sequence; /* toc's sequence number */ char *nickname, /* our nickname (correctly spaced) */ *awaymsg; time_t awaysince; struct s_toc_room *room_head; time_t lastself, /* last time we checked our own status */ lasttalk; /* last time we talked */ long lastidle; /* last idle that we told the server */ unsigned char passchange:1, /* whether we're changing our password right now */ gotconfig:1; int connectstate, permit_mode; char buddybuf[1024]; int buddybuflen; char *buddybuflastgroup; }; typedef struct s_toc_connection *client_t; #define _HAVE_CLIENT_T #include "firetalk-int.h" #include "firetalk.h" #define SFLAP_FRAME_SIGNON ((unsigned char)1) #define SFLAP_FRAME_DATA ((unsigned char)2) #define SFLAP_FRAME_ERROR ((unsigned char)3) #define SFLAP_FRAME_SIGNOFF ((unsigned char)4) #define SFLAP_FRAME_KEEPALIVE ((unsigned char)5) #define SIGNON_STRING "FLAPON\r\n\r\n" #define TOC_HEADER_LENGTH 6 #define TOC_SIGNON_LENGTH 24 #define TOC_HOST_SIGNON_LENGTH 4 #define TOC_USERNAME_MAXLEN 16 #include "toc2_uuids.h" static char lastinfo[TOC_USERNAME_MAXLEN+1] = ""; /* Internal Function Declarations */ static unsigned short toc_fill_header(unsigned char *const header, unsigned char const frame_type, unsigned short const sequence, unsigned short const length); static unsigned short toc_fill_signon(unsigned char *const signon, const char *const username); static unsigned char toc_get_frame_type_from_header(const unsigned char *const header); static unsigned short toc_get_sequence_from_header(const unsigned char *const header); static unsigned short toc_get_length_from_header(const unsigned char *const header); static char *toc_quote(const char *const string, const int outside_flag); static int toc_internal_disconnect(client_t c, const int error); static int toc_internal_split_exchange(const char *const string); static char *toc_internal_split_name(const char *const string); static fte_t toc_send_printf(client_t c, const char *const format, ...); #include #ifdef DEBUG_ECHO extern void *curconn; extern void status_echof(void *conn, const unsigned char *format, ...); static void toc_echof(client_t c, const char *const where, const char *const format, ...) { va_list ap; char buf[8*1024]; int len; void statrefresh(void); va_start(ap, format); vsnprintf(buf, sizeof(buf), format, ap); va_end(ap); len = strlen(buf); while ((len > 0) && (buf[len-1] == '\n')) buf[--len] = 0; if (*buf != 0) status_echof(curconn, firetalk_htmlentities(buf)); statrefresh(); } static void toc_echo_send(client_t c, const char *const where, const unsigned char *const data, size_t _length) { unsigned char ft; unsigned short sequence, length; assert(_length > 4); length = toc_get_length_from_header(data); ft = toc_get_frame_type_from_header(data); sequence = toc_get_sequence_from_header(data); assert(length == (_length-6)); toc_echof(c, where, "frame=%X, sequence=out:%i, length=%i, value=[%.*s]\n", ft, sequence, length, length, data+TOC_HEADER_LENGTH); } #endif /* Internal Function Definitions */ static fte_t toc_find_packet(client_t c, unsigned char *buffer, unsigned short *bufferpos, char *outbuffer, const int frametype, unsigned short *l) { unsigned char ft; unsigned short sequence, length; if (*bufferpos < TOC_HEADER_LENGTH) /* don't have the whole header yet */ return(FE_NOTFOUND); length = toc_get_length_from_header(buffer); if (length > (TOC_SERVERSEND_MAXLEN - TOC_HEADER_LENGTH)) { toc_internal_disconnect(c, FE_PACKETSIZE); return(FE_DISCONNECT); } if (*bufferpos < length + TOC_HEADER_LENGTH) /* don't have the whole packet yet */ return(FE_NOTFOUND); ft = toc_get_frame_type_from_header(buffer); sequence = toc_get_sequence_from_header(buffer); memcpy(outbuffer, &buffer[TOC_HEADER_LENGTH], length); *bufferpos -= length + TOC_HEADER_LENGTH; memmove(buffer, &buffer[TOC_HEADER_LENGTH + length], *bufferpos); outbuffer[length] = '\0'; *l = length; #ifdef DEBUG_ECHO if (ft != 5) { char buf[1024*8]; int j; assert(length < sizeof(buf)); memmove(buf, outbuffer, length+1); for (j = 0; j < length; j++) if (buf[j] == 0) buf[j] = '0'; toc_echof(c, "find_packet", "frame=%X, sequence=in:%i, length=%i, value=[%s]\n", ft, sequence, length, buf); } #endif if (frametype == SFLAP_FRAME_SIGNON) c->remote_sequence = sequence; else { if (sequence != ++c->remote_sequence) { toc_internal_disconnect(c, FE_SEQUENCE); return(FE_DISCONNECT); } } if (ft == frametype) return(FE_SUCCESS); else return(FE_WEIRDPACKET); } static unsigned short toc_fill_header(unsigned char *const header, unsigned char const frame_type, unsigned short const sequence, unsigned short const length) { header[0] = '*'; /* byte 0, length 1, magic 42 */ header[1] = frame_type; /* byte 1, length 1, frame type (defined above SFLAP_FRAME_* */ header[2] = sequence/256; /* byte 2, length 2, sequence number, network byte order */ header[3] = (unsigned char) sequence%256; header[4] = length/256; /* byte 4, length 2, length, network byte order */ header[5] = (unsigned char) length%256; return(6+length); } static unsigned short toc_fill_signon(unsigned char *const signon, const char *const username) { size_t length = strlen(username); signon[0] = 0; /* byte 0, length 4, flap version (1) */ signon[1] = 0; signon[2] = 0; signon[3] = 1; signon[4] = 0; /* byte 4, length 2, tlv tag (1) */ signon[5] = 1; signon[6] = length/256; /* byte 6, length 2, username length, network byte order */ signon[7] = (unsigned char)length%256; memcpy(signon+8, username, length); return(length + 8); } static char *aim_interpolate_variables(const char *const input, const char *const nickname) { static char output[16384]; /* 2048 / 2 * 16 + 1 (max size with a string full of %n's, a 16-char nick and a null at the end) */ int o = 0,gotpercent = 0; size_t nl,dl,tl,l,i; char date[15],tim[15]; { /* build the date and time */ int hour; int am = 1; struct tm *t; time_t b; b = time(NULL); t = localtime(&b); if (t == NULL) return(NULL); hour = t->tm_hour; if (hour >= 12) am = 0; if (hour > 12) hour -= 12; if (hour == 0) hour = 12; sprintf(tim,"%d:%02d:%02d %s",hour,t->tm_min,t->tm_sec,am == 1 ? "AM" : "PM"); snprintf(date,15,"%d/%d/%d",t->tm_mon + 1,t->tm_mday,t->tm_year + 1900); } nl = strlen(nickname); dl = strlen(date); tl = strlen(tim); l = strlen(input); for (i = 0; i < l; i++) { switch (input[i]) { case '%': if (gotpercent == 1) { gotpercent = 0; output[o++] = '%'; output[o++] = '%'; } else gotpercent = 1; break; case 'n': if (gotpercent == 1) { gotpercent = 0; memcpy(&output[o],nickname,nl); o += nl; } else output[o++] = 'n'; break; case 'd': if (gotpercent == 1) { gotpercent = 0; memcpy(&output[o],date,dl); o += dl; } else output[o++] = 'd'; break; case 't': if (gotpercent == 1) { gotpercent = 0; memcpy(&output[o],tim,tl); o += tl; } else output[o++] = 't'; break; default: if (gotpercent == 1) { gotpercent = 0; output[o++] = '%'; } output[o++] = input[i]; } } output[o] = 0; return(output); } static const char *aim_normalize_room_name(const char *const name) { static char newname[2048]; if (name == NULL) return(NULL); if (strchr(name+1, ':') != NULL) return(name); if (strlen(name) >= (sizeof(newname)-2)) return(NULL); strcpy(newname, "4:"); strcpy(newname+2, name); return(newname); } #define STRNCMP(x,y) (strncmp((x), (y), sizeof(y)-1)) static char *htmlclean(const char *str) { static char buf[2048]; int i, b = 0; for (i = 0; (str[i] != 0) && (b < sizeof(buf)-1); i++) if (STRNCMP(str+i, ">") == 0) { buf[b++] = '>'; i += sizeof(">")-2; } else if (STRNCMP(str+i, "<") == 0) { buf[b++] = '<'; i += sizeof("<")-2; } else if (STRNCMP(str+i, """) == 0) { buf[b++] = '"'; i += sizeof(""")-2; } else if (STRNCMP(str+i, " ") == 0) { buf[b++] = ' '; i += sizeof(" ")-2; } else if (STRNCMP(str+i, "&") == 0) { buf[b++] = '&'; i += sizeof("&")-2; } else buf[b++] = str[i]; buf[b] = 0; return(buf); } #undef STRNCMP static char *aim_handle_ect(void *conn, const char *const from, char *const message, const int reply) { char *ectbegin, *ectend, *textbegin, *textend; while ((ectbegin = strstr(message, ECT_TOKEN)) != NULL) { textbegin = ectbegin+sizeof(ECT_TOKEN)-1; if ((textend = strstr(textbegin, ECT_ENDING)) != NULL) { char *arg; *textend = 0; ectend = textend+sizeof(ECT_ENDING)-1; if ((arg = strchr(textbegin, ' ')) != NULL) { *arg++ = 0; if (reply == 1) firetalk_callback_subcode_reply(conn, from, textbegin, htmlclean(arg)); else firetalk_callback_subcode_request(conn, from, textbegin, htmlclean(arg)); } else { if (reply == 1) firetalk_callback_subcode_reply(conn, from, textbegin, NULL); else firetalk_callback_subcode_request(conn, from, textbegin, NULL); } memmove(ectbegin, ectend, strlen(ectend)+1); } else break; } return(message); } static fte_t toc_im_add_buddy_flush(client_t c) { if (c->buddybuflen > 0) { free(c->buddybuflastgroup); c->buddybuflastgroup = strdup(""); c->buddybuflen = 0; return(toc_send_printf(c, "toc2_new_buddies {%S}", c->buddybuf)); } return(FE_SUCCESS); } static fte_t toc_postselect(client_t c, fd_set *read, fd_set *write, fd_set *except) { return(FE_SUCCESS); } static unsigned char toc_get_frame_type_from_header(const unsigned char *const header) { return(header[1]); } static unsigned short toc_get_sequence_from_header(const unsigned char *const header) { unsigned short sequence; sequence = ntohs(*((unsigned short *)(&header[2]))); return(sequence); } static unsigned short toc_get_length_from_header(const unsigned char *const header) { unsigned short length; length = ntohs(*((unsigned short *)(&header[4]))); return(length); } static char *toc_quote(const char *string, const int outside_flag) { static char output[TOC_CLIENTSEND_MAXLEN]; size_t length, counter; int newcounter; while (*string == ' ') string++; length = strlen(string); if (outside_flag == 1) { newcounter = 1; output[0] = '"'; } else newcounter = 0; while ((length > 0) && (string[length-1] == ' ')) length--; for (counter = 0; counter < length; counter++) if (string[counter] == '$' || string[counter] == '{' || string[counter] == '}' || string[counter] == '[' || string[counter] == ']' || string[counter] == '(' || string[counter] == ')' || string[counter] == '\'' || string[counter] == '`' || string[counter] == '"' || string[counter] == '\\') { if (newcounter > (sizeof(output)-4)) return(NULL); output[newcounter++] = '\\'; output[newcounter++] = string[counter]; } else { if (newcounter > (sizeof(output)-3)) return(NULL); output[newcounter++] = string[counter]; } if (outside_flag == 1) output[newcounter++] = '"'; output[newcounter] = 0; return(output); } static char *toc_hash_password(const char *const password) { #define HASH "Tic/Toc" const unsigned char hash[] = HASH; static char output[TOC_CLIENTSEND_MAXLEN]; size_t length; int i, newcounter; length = strlen(password); output[0] = '0'; output[1] = 'x'; newcounter = 2; for (i = 0; i < length; i++) { if (newcounter >= sizeof(output)-2-1) return(NULL); sprintf(output+newcounter, "%02X", password[i]^hash[i%(sizeof(hash)-1)]); newcounter += 2; } output[newcounter] = 0; return(output); } static fte_t toc_compare_nicks (const char *s1, const char *s2) { if ((s1 == NULL) || (s2 == NULL)) return(FE_NOMATCH); while (*s1 == ' ') s1++; while (*s2 == ' ') s2++; while (*s1 != 0) { if (tolower((unsigned char)(*s1)) != tolower((unsigned char)(*s2))) return(FE_NOMATCH); s1++; s2++; while (*s1 == ' ') s1++; while (*s2 == ' ') s2++; } if (*s2 != 0) return(FE_NOMATCH); return(FE_SUCCESS); } static int toc_internal_disconnect(client_t c, const int error) { if (c->nickname != NULL) { free(c->nickname); c->nickname = NULL; } if (c->awaymsg != NULL) { free(c->awaymsg); c->awaymsg = NULL; assert(c->awaysince > 0); c->awaysince = 0; } if (c->room_head != NULL) { struct s_toc_room *iter, *iternext; for (iter = c->room_head; iter != NULL; iter = iternext) { iternext = iter->next; free(iter->name); free(iter); } c->room_head = NULL; } if (c->buddybuflastgroup != NULL) { free(c->buddybuflastgroup); c->buddybuflastgroup = strdup(""); c->buddybuflen = 0; } toc_send_printf(c, "toc_set_dir %s", ""); toc_send_printf(c, "toc_noop"); firetalk_callback_disconnect(c, error); return(FE_SUCCESS); } static int toc_internal_add_room(client_t c, const char *const name, const int exchange) { struct s_toc_room *iter; iter = c->room_head; c->room_head = calloc(1, sizeof(struct s_toc_room)); if (c->room_head == NULL) abort(); c->room_head->next = iter; c->room_head->name = strdup(name); if (c->room_head->name == NULL) abort(); c->room_head->exchange = exchange; return(FE_SUCCESS); } static int toc_internal_set_joined(client_t c, const long id) { struct s_toc_room *iter; for (iter = c->room_head; iter != NULL; iter = iter->next) if (iter->joined == 0) if (iter->id == id) { iter->joined = 1; return(FE_SUCCESS); } return(FE_NOTFOUND); } static int toc_internal_set_id(client_t c, const char *const name, const int exchange, const long id) { struct s_toc_room *iter; for (iter = c->room_head; iter != NULL; iter = iter->next) if (iter->joined == 0) if ((iter->exchange == exchange) && (toc_compare_nicks(iter->name, name) == 0)) { iter->id = id; return(FE_SUCCESS); } return(FE_NOTFOUND); } static int toc_internal_find_exchange(client_t c, const char *const name) { struct s_toc_room *iter; for (iter = c->room_head; iter != NULL; iter = iter->next) if (iter->joined == 0) if (toc_compare_nicks(iter->name, name) == 0) return(iter->exchange); firetalkerror = FE_NOTFOUND; return(0); } static int toc_internal_find_room_id(client_t c, const char *const name) { struct s_toc_room *iter; char *namepart; int exchange; namepart = toc_internal_split_name(name); exchange = toc_internal_split_exchange(name); for (iter = c->room_head; iter != NULL; iter = iter->next) if (iter->exchange == exchange) if (toc_compare_nicks(iter->name, namepart) == 0) return(iter->id); firetalkerror = FE_NOTFOUND; return(0); } static char *toc_internal_find_room_name(client_t c, const long id) { struct s_toc_room *iter; static char newname[TOC_CLIENTSEND_MAXLEN]; for (iter = c->room_head; iter != NULL; iter = iter->next) if (iter->id == id) { snprintf(newname, sizeof(newname), "%d:%s", iter->exchange, iter->name); return(newname); } firetalkerror = FE_NOTFOUND; return(NULL); } static int toc_internal_split_exchange(const char *const string) { return(atoi(string)); } static char *toc_internal_split_name(const char *const string) { return(strchr(string, ':')+1); } static const char *toc_get_tlv_value(char **args, int arg, const int type) { for (; args[arg] && args[arg+1]; arg += 2) if (atoi(args[arg]) == type) return(firetalk_debase64(args[arg+1])); return(NULL); } static int toc_internal_set_room_invited(client_t c, const char *const name, const int invited) { struct s_toc_room *iter; for (iter = c->room_head; iter != NULL; iter = iter->next) if (toc_compare_nicks(iter->name,name) == 0) { iter->invited = invited; return(FE_SUCCESS); } return(FE_NOTFOUND); } static int toc_internal_get_room_invited(client_t c, const char *const name) { struct s_toc_room *iter; for (iter = c->room_head; iter != NULL; iter = iter->next) if (toc_compare_nicks(aim_normalize_room_name(iter->name),name) == 0) return(iter->invited); return(-1); } static fte_t toc_send_printf(client_t c, const char *const format, ...) { va_list ap; size_t i, datai = TOC_HEADER_LENGTH; char data[TOC_CLIENTSEND_MAXLEN]; va_start(ap, format); for (i = 0; format[i] != 0; i++) { if (format[i] == '%') { switch (format[++i]) { case 'd': case 'i': { int i = va_arg(ap, int); i = snprintf(data+datai, sizeof(data)-datai, "%i", i); if (i > 0) datai += i; break; } case 'x': { int i = va_arg(ap, int); i = snprintf(data+datai, sizeof(data)-datai, "%x", i); if (i > 0) datai += i; break; } case 's': { const char *s = toc_quote(va_arg(ap, char *), 1); size_t slen = strlen(s); if ((datai+slen) > (sizeof(data)-1)) return(FE_PACKETSIZE); strcpy(data+datai, s); datai += slen; break; } case 'S': { const char *s = va_arg(ap, char *); size_t slen = strlen(s); if ((datai+slen) > (sizeof(data)-1)) return(FE_PACKETSIZE); strcpy(data+datai, s); datai += slen; break; } case '%': data[datai++] = '%'; break; } } else { data[datai++] = format[i]; if (datai > (sizeof(data)-1)) return(FE_PACKETSIZE); } } va_end(ap); #ifdef DEBUG_ECHO toc_echof(c, "send_printf", "frame=%X, sequence=out:%i, length=%i, value=[%.*s]\n", SFLAP_FRAME_DATA, c->local_sequence+1, datai-TOC_HEADER_LENGTH, datai-TOC_HEADER_LENGTH, data+TOC_HEADER_LENGTH); #endif { struct s_firetalk_handle *fchandle; unsigned short length; fchandle = firetalk_find_handle(c); data[datai] = 0; length = toc_fill_header((unsigned char *)data, SFLAP_FRAME_DATA, ++c->local_sequence, datai-TOC_HEADER_LENGTH+1); firetalk_internal_send_data(fchandle, data, length); } return(FE_SUCCESS); } static char *toc_get_arg0(char *const instring) { static char data[TOC_SERVERSEND_MAXLEN]; char *colon; if (strlen(instring) > TOC_SERVERSEND_MAXLEN) { firetalkerror = FE_PACKETSIZE; return(NULL); } strncpy(data, instring, sizeof(data)-1); data[sizeof(data)-1] = 0; colon = strchr(data, ':'); if (colon != NULL) *colon = 0; return(data); } static char **toc_parse_args(char *str, const int maxargs, const char sep) { static char *args[256]; int curarg = 0; char *colon; while ((curarg < (maxargs-1)) && (curarg < 256) && ((colon = strchr(str, sep)) != NULL)) { args[curarg++] = str; *colon = 0; str = colon+1; } args[curarg++] = str; args[curarg] = NULL; return(args); } /* External Function Definitions */ static fte_t toc_isprint(const int c) { if ((c >= 0) && (c <= 255) && (isprint(c) || (c >= 160))) return(FE_SUCCESS); return(FE_INVALIDFORMAT); } static client_t toc_create_handle() { client_t c; c = calloc(1, sizeof(struct s_toc_connection)); if (c == NULL) abort(); c->lasttalk = time(NULL); c->buddybuflastgroup = strdup(""); return(c); } static void toc_destroy_handle(client_t c) { toc_internal_disconnect(c, FE_USERDISCONNECT); assert(c->nickname == NULL); assert(c->awaymsg == NULL); assert(c->awaysince == 0); assert(c->room_head == NULL); free(c->buddybuflastgroup); free(c); } static fte_t toc_disconnect(client_t c) { return(toc_internal_disconnect(c, FE_USERDISCONNECT)); } static fte_t toc_signon(client_t c, const char *const username) { struct s_firetalk_handle *conn; /* fill & send the flap signon packet */ conn = firetalk_find_handle(c); c->lasttalk = time(NULL); c->connectstate = 0; c->permit_mode = 0; c->gotconfig = 0; free(c->nickname); c->nickname = strdup(username); if (c->nickname == NULL) abort(); /* send the signon string to indicate that we're speaking FLAP here */ #ifdef DEBUG_ECHO toc_echof(c, "signon", "frame=0, length=%i, value=[%s]\n", strlen(SIGNON_STRING), SIGNON_STRING); #endif firetalk_internal_send_data(conn, SIGNON_STRING, sizeof(SIGNON_STRING)-1); return(FE_SUCCESS); } #ifdef ENABLE_NEWGROUPS static fte_t toc_im_remove_group(client_t c, const char *const group) { struct s_firetalk_handle *fchandle; char buf[TOC_CLIENTSEND_MAXLEN]; int count = 0, slen = 0; fchandle = firetalk_find_handle(c); if (fchandle->buddy_head != NULL) { struct s_firetalk_buddy *iter; for (iter = fchandle->buddy_head; iter != NULL; iter = iter->next) if (toc_compare_nicks(iter->group, group) != FE_NOMATCH) { char *str = toc_quote(iter->nickname, 1); int i = strlen(str); if (slen+i+2 >= sizeof(buf)) return(FE_PACKET); buf[slen++] = ' '; strcpy(buf+slen, str); slen += i; count++; } } if (count > 0) toc_send_printf(c, "toc2_remove_buddy%S %s", buf, group); toc_send_printf(c, "toc2_del_group %s", group); return(toc_send_printf(c, "toc_get_status %s", c->nickname)); } #endif static fte_t toc_im_remove_buddy(client_t c, const char *const name, const char *const group) { return(toc_send_printf(c, "toc2_remove_buddy %s %s", name, group)); } static fte_t toc_im_add_buddy(client_t c, const char *const name, const char *const group, const char *const friendly) { char buf[1024]; int slen; if (c->gotconfig == 0) return(FE_SUCCESS); if (strcmp(c->buddybuflastgroup, group) == 0) { if (friendly != NULL) snprintf(buf, sizeof(buf), "b:%s:%s\n", name, friendly); else snprintf(buf, sizeof(buf), "b:%s\n", name); } else { if (friendly != NULL) snprintf(buf, sizeof(buf), "g:%s\nb:%s:%s\n", group, name, friendly); else snprintf(buf, sizeof(buf), "g:%s\nb:%s\n", group, name); free(c->buddybuflastgroup); c->buddybuflastgroup = strdup(group); if (c->buddybuflastgroup == NULL) abort(); } slen = strlen(buf); if ((c->buddybuflen+slen+1) >= sizeof(c->buddybuf)) toc_im_add_buddy_flush(c); if ((c->buddybuflen+slen+1) >= sizeof(c->buddybuf)) return(FE_PACKET); strcpy(c->buddybuf+c->buddybuflen, buf); c->buddybuflen += slen; return(FE_SUCCESS); } static fte_t toc_im_add_deny(client_t c, const char *const name) { return(toc_send_printf(c, "toc2_add_deny %s", name)); } static fte_t toc_im_remove_deny(client_t c, const char *const name) { return(toc_send_printf(c, "toc2_remove_deny %s", name)); } static fte_t toc_im_upload_buddies(client_t c) { struct s_firetalk_handle *fchandle; fchandle = firetalk_find_handle(c); if (fchandle->buddy_head != NULL) { struct s_firetalk_buddy *buddyiter; for (buddyiter = fchandle->buddy_head; buddyiter != NULL; buddyiter = buddyiter->next) toc_im_add_buddy(c, buddyiter->nickname, buddyiter->group, buddyiter->friendly); } return(FE_SUCCESS); } static fte_t toc_im_upload_denies(client_t c) { char data[TOC_CLIENTSEND_MAXLEN]; struct s_firetalk_deny *denyiter; unsigned short length; struct s_firetalk_handle *fchandle; fchandle = firetalk_find_handle(c); if (fchandle->deny_head == NULL) return(FE_SUCCESS); data[sizeof(data)-1] = 0; strncpy(data+TOC_HEADER_LENGTH, "toc_add_deny", (size_t)(sizeof(data)-TOC_HEADER_LENGTH-1)); for (denyiter = fchandle->deny_head; denyiter != NULL; denyiter = denyiter->next) { strncat(data+TOC_HEADER_LENGTH, " ", (size_t)(sizeof(data)-TOC_HEADER_LENGTH-1)); strncat(data+TOC_HEADER_LENGTH, toc_quote(denyiter->nickname, 0), (size_t)(sizeof(data)-TOC_HEADER_LENGTH-1)); if (strlen(data+TOC_HEADER_LENGTH) > 2000) { length = toc_fill_header((unsigned char *)data, SFLAP_FRAME_DATA, ++c->local_sequence, strlen(&data[TOC_HEADER_LENGTH])+1); #ifdef DEBUG_ECHO toc_echo_send(c, "im_upload_denies", data, length); #endif firetalk_internal_send_data(fchandle, data, length); strncpy(data+TOC_HEADER_LENGTH, "toc_add_deny", (size_t)(sizeof(data)-TOC_HEADER_LENGTH-1)); } } length = toc_fill_header((unsigned char *)data, SFLAP_FRAME_DATA, ++c->local_sequence, strlen(&data[TOC_HEADER_LENGTH])+1); #ifdef DEBUG_ECHO toc_echo_send(c, "im_upload_denies", data, length); #endif firetalk_internal_send_data(fchandle, data, length); return(FE_SUCCESS); } static fte_t toc_internal_send_message(client_t c, const char *const dest, const unsigned char *const message, const int isauto, firetalk_queue_t *queue) { char buf[TOC_CLIENTSEND_MAXLEN]; int i, j, len = strlen(message); assert(c != NULL); assert(dest != NULL); assert(*dest != 0); assert(message != NULL); if (!isauto) c->lasttalk = time(NULL); if (len >= sizeof(buf)-1) return(FE_PACKETSIZE); for (j = i = 0; (i < len) && (j < sizeof(buf)-1); i++) if (toc_isprint(message[i]) == FE_SUCCESS) buf[j++] = message[i]; else { char numbuf[10]; snprintf(numbuf, sizeof(numbuf), "&#%i;", message[i]); if (j+strlen(numbuf) >= sizeof(buf)-1) return(FE_PACKETSIZE); strcpy(buf+j, numbuf); j += strlen(numbuf); } buf[j] = 0; firetalk_queue_append(buf, sizeof(buf), queue, dest); #ifdef DEBUG_ECHO toc_echof(c, "internal_send_message", "dest=[%s] message=[%s] len=%i", dest, message, len); #endif return(toc_send_printf(c, "toc2_send_im %s %s%S", dest, buf, isauto?" auto":"")); } static fte_t toc_im_send_reply(client_t c, const char *const dest, const char *const message) { struct s_firetalk_handle *fchandle; assert(dest != NULL); assert(message != NULL); if (strcasecmp(dest, ":RAW") == 0) return(toc_send_printf(c, "%S", message)); fchandle = firetalk_find_handle(c); return(toc_internal_send_message(c, dest, aim_interpolate_variables(message, dest), 1, &(fchandle->subcode_replies))); } static fte_t toc_im_send_message(client_t c, const char *const dest, const char *const message, const int auto_flag) { struct s_firetalk_handle *fchandle; assert(dest != NULL); assert(message != NULL); if (strcasecmp(dest, ":RAW") == 0) return(toc_send_printf(c, "%S", message)); if (auto_flag) return(toc_im_send_reply(c, dest, message)); fchandle = firetalk_find_handle(c); return(toc_internal_send_message(c, dest, message, 0, &(fchandle->subcode_requests))); } static fte_t toc_im_send_action(client_t c, const char *const dest, const char *const message, const int auto_flag) { struct s_firetalk_handle *fchandle; char tempbuf[TOC_CLIENTSEND_MAXLEN]; if (strcasecmp(dest, ":RAW") == 0) return(toc_send_printf(c, "%S", message)); if (strlen(message) > 2042) return(FE_PACKETSIZE); fchandle = firetalk_find_handle(c); snprintf(tempbuf, sizeof(tempbuf), "/me %s", message); return(toc_internal_send_message(c, dest, tempbuf, 0, &(fchandle->subcode_requests))); } static fte_t toc_preselect(client_t c, fd_set *read, fd_set *write, fd_set *except, int *n) { toc_im_add_buddy_flush(c); return(FE_SUCCESS); } static fte_t toc_get_info(client_t c, const char *const nickname) { strncpy(lastinfo, nickname, (size_t)TOC_USERNAME_MAXLEN); lastinfo[TOC_USERNAME_MAXLEN] = 0; return(toc_send_printf(c, "toc_locate_user %s", nickname)); } static char *toc_ctcp_encode(client_t c, const char *const command, const char *const message) { char *str; if (message != NULL) { const char *encodedmsg = firetalk_htmlentities(message); str = malloc(sizeof(ECT_TOKEN)-1+strlen(command)+1+strlen(encodedmsg)+sizeof(ECT_ENDING)-1+1); if (str == NULL) abort(); sprintf(str, ECT_TOKEN "%s %s" ECT_ENDING, command, encodedmsg); } else { str = malloc(sizeof(ECT_TOKEN)-1+strlen(command)+sizeof(ECT_ENDING)-1+1); if (str == NULL) abort(); sprintf(str, ECT_TOKEN "%s" ECT_ENDING, command); } return(str); } static fte_t toc_set_info(client_t c, const char *const info) { char profile[1024], /* profiles can only be a maximum of 1023 characters long, so this is good */ *versionctcp = NULL, *awayctcp = NULL; size_t infolen = strlen(info), extralen = 0; if (infolen >= sizeof(profile)) { firetalk_callback_error(c, FE_MESSAGETRUNCATED, NULL, "Profile too long"); return(FE_MESSAGETRUNCATED); } if ((versionctcp = firetalk_subcode_get_request_reply(c, "VERSION")) == NULL) versionctcp = PACKAGE_NAME ":" PACKAGE_VERSION ":unknown"; if ((versionctcp = toc_ctcp_encode(c, "VERSION", versionctcp)) != NULL) extralen += strlen(versionctcp); if (infolen+extralen >= 1024) { firetalk_callback_error(c, FE_MESSAGETRUNCATED, NULL, "Profile+away message too long, truncating"); infolen = 1024-extralen-1; } snprintf(profile, sizeof(profile), "%.*s%s%s", infolen, info, versionctcp?versionctcp:"", awayctcp?awayctcp:""); free(versionctcp); free(awayctcp); return(toc_send_printf(c, "toc_set_info %s", profile)); } static fte_t toc_set_away(client_t c, const char *const message, const int auto_flag) { if (message != NULL) { if (strlen(message) >= 1024) { firetalk_callback_error(c, FE_MESSAGETRUNCATED, NULL, "Message too long"); return(FE_MESSAGETRUNCATED); } free(c->awaymsg); c->awaymsg = strdup(message); if (c->awaymsg == NULL) abort(); c->awaysince = time(NULL); return(toc_send_printf(c, "toc_set_away %s", message)); } else { if (c->awaymsg != NULL) { free(c->awaymsg); c->awaymsg = NULL; } c->awaysince = 0; return(toc_send_printf(c, "toc_set_away")); } } static fte_t toc_set_nickname(client_t c, const char *const nickname) { return(toc_send_printf(c, "toc_format_nickname %s", nickname)); } static fte_t toc_set_password(client_t c, const char *const oldpass, const char *const newpass) { c->passchange++; return(toc_send_printf(c, "toc_change_passwd %s %s", oldpass, newpass)); } static fte_t toc_set_privacy(client_t c, const char *const mode) { if (strcasecmp(mode, "ALLOW ALL") == 0) c->permit_mode = 1; else if (strcasecmp(mode, "BLOCK ALL") == 0) c->permit_mode = 2; else if (strcasecmp(mode, "ALLOW PERMIT") == 0) c->permit_mode = 3; else if (strcasecmp(mode, "BLOCK DENY") == 0) c->permit_mode = 4; else if (strcasecmp(mode, "ALLOW BUDDY") == 0) c->permit_mode = 5; else { firetalk_callback_error(c, FE_BADMESSAGE, NULL, "Supported modes: ALLOW ALL, BLOCK ALL, ALLOW PERMIT, BLOCK DENY, ALLOW BUDDY"); return(FE_BADMESSAGE); } return(toc_send_printf(c, "toc2_set_pdmode %i", c->permit_mode)); } static fte_t toc_im_evil(client_t c, const char *const who) { return(toc_send_printf(c, "toc_evil %s norm", who)); } static void toc_uuid(const char *const uuid, int *A1, int *A2, int *B, int *C, int *D, int *E1, int *E2, int *E3) { if (strlen(uuid) <= 4) { *A1 = 0x0946; *A2 = strtol(uuid, NULL, 16); *B = 0x4C7F; *C = 0x11D1; *D = 0x8222; *E1 = 0x4445; *E2 = 0x5354; *E3 = 0x0000; } else { char buf[5]; buf[4] = 0; strncpy(buf, uuid+0, 4); assert((buf[4] == 0) && (strlen(buf) == 4)); *A1 = strtol(buf, NULL, 16); strncpy(buf, uuid+4, 4); assert((buf[4] == 0) && (strlen(buf) == 4)); *A2 = strtol(buf, NULL, 16); strncpy(buf, uuid+9, 4); assert((buf[4] == 0) && (strlen(buf) == 4)); *B = strtol(buf, NULL, 16); strncpy(buf, uuid+14, 4); assert((buf[4] == 0) && (strlen(buf) == 4)); *C = strtol(buf, NULL, 16); strncpy(buf, uuid+19, 4); assert((buf[4] == 0) && (strlen(buf) == 4)); *D = strtol(buf, NULL, 16); strncpy(buf, uuid+24, 4); assert((buf[4] == 0) && (strlen(buf) == 4)); *E1 = strtol(buf, NULL, 16); strncpy(buf, uuid+28, 4); assert((buf[4] == 0) && (strlen(buf) == 4)); *E2 = strtol(buf, NULL, 16); strncpy(buf, uuid+32, 4); assert((buf[4] == 0) && (strlen(buf) == 4)); *E3 = strtol(buf, NULL, 16); } } static int toc_cap(int A1, int A2, int B, int C, int D, int E1, int E2, int E3) { int j; for (j = 0; j < sizeof(toc_uuids)/sizeof(*toc_uuids); j++) if (((toc_uuids[j].A1 == A1) || (toc_uuids[j].A1 == -1)) && ((toc_uuids[j].A2 == A2) || (toc_uuids[j].A2 == -1)) && ((toc_uuids[j].B == B) || (toc_uuids[j].B == -1)) && ((toc_uuids[j].C == C) || (toc_uuids[j].C == -1)) && ((toc_uuids[j].D == D) || (toc_uuids[j].D == -1)) && ((toc_uuids[j].E1 == E1) || (toc_uuids[j].E1 == -1)) && ((toc_uuids[j].E2 == E2) || (toc_uuids[j].E2 == -1)) && ((toc_uuids[j].E3 == E3) || (toc_uuids[j].E3 == -1))) return(j); return(-1); } static struct { fte_t fte; unsigned char hastarget:1; const char *str; } toc2_errors[] = { /* General Errors */ /* 900 */ { FE_UNKNOWN, 0, NULL }, /* 901 */ { FE_USERUNAVAILABLE, 1, NULL }, /* TOC1 $1 not currently available */ /* TOC2 User Not Logged In You can only send Instant Messanges to, or Chat with, buddies who are currently signed on. You need to wait and try again later when your buddy is signed on. */ /* 902 */ { FE_USERUNAVAILABLE, 1, "You have either tried to warn someone you haven't sent a message to yet, or you have already warned them too many times today." }, /* TOC1 Warning of $1 not currently available */ /* TOC2 Warning Not Allowed You have either tried to warn someone you haven't sent an Instant Message to yet; or, you have already warned them too many times today. */ /* 903 */ { FE_TOOFAST, 0, "You are sending commands too fast." }, /* TOC1 A message has been dropped, you are exceeding the server speed limit */ /* TOC2 Server Limit Exceeded If you send messages too fast, you will exceed the server's capacity to handle them. Please try to send your message again. */ /* 904 */ { FE_UNKNOWN, 0, NULL }, /* 905 */ { FE_UNKNOWN, 0, NULL }, /* 906 */ { FE_UNKNOWN, 0, NULL }, /* 907 */ { FE_UNKNOWN, 0, NULL }, /* 908 */ { FE_UNKNOWN, 0, NULL }, /* 909 */ { FE_UNKNOWN, 0, NULL }, /* Admin Errors */ /* 910 */ { FE_UNKNOWN, 0, NULL }, /* 911 */ { FE_BADUSER, 0, NULL }, /* 912 */ { FE_UNKNOWN, 0, NULL }, /* 913 */ { FE_UNKNOWN, 0, NULL }, /* 914 */ { FE_UNKNOWN, 0, NULL }, /* 915 */ { FE_UNKNOWN, 0, NULL }, /* 916 */ { FE_UNKNOWN, 0, NULL }, /* 917 */ { FE_UNKNOWN, 0, NULL }, /* 918 */ { FE_UNKNOWN, 0, NULL }, /* 919 */ { FE_UNKNOWN, 0, NULL }, /* Unknown */ /* 920 */ { FE_UNKNOWN, 0, NULL }, /* 921 */ { FE_UNKNOWN, 0, NULL }, /* 922 */ { FE_UNKNOWN, 0, NULL }, /* 923 */ { FE_UNKNOWN, 0, NULL }, /* 924 */ { FE_UNKNOWN, 0, NULL }, /* 925 */ { FE_UNKNOWN, 0, NULL }, /* 926 */ { FE_UNKNOWN, 0, NULL }, /* 927 */ { FE_UNKNOWN, 0, NULL }, /* 928 */ { FE_UNKNOWN, 0, NULL }, /* 929 */ { FE_UNKNOWN, 0, NULL }, /* Buddy List Errors */ /* 930 */ { FE_UNKNOWN, 0, "The Buddy List server is unavailable at this time. Wait a few minutes, and try to sign on again." }, /* TOC1 UNDOCUMENTED */ /* TOC2 Buddy List Server is Unavailable The Buddy List server is unavailable at this time, and your AIM Express (TM) connection will be closed. Wait a few minutes, and try to sign on again. */ /* 931 */ { FE_UNKNOWN, 0, "Unable to add buddy or group. You may have the max allowed buddies or groups or are trying to add a buddy to a group that doesn't exist and cannot be created." }, /* 932 */ { FE_UNKNOWN, 0, NULL }, /* 933 */ { FE_UNKNOWN, 0, NULL }, /* 934 */ { FE_UNKNOWN, 0, NULL }, /* 935 */ { FE_UNKNOWN, 0, NULL }, /* 936 */ { FE_UNKNOWN, 0, NULL }, /* 937 */ { FE_UNKNOWN, 0, NULL }, /* 938 */ { FE_UNKNOWN, 0, NULL }, /* 939 */ { FE_UNKNOWN, 0, NULL }, /* Unknown */ /* 940 */ { FE_UNKNOWN, 0, NULL }, /* 941 */ { FE_UNKNOWN, 0, NULL }, /* 942 */ { FE_UNKNOWN, 0, NULL }, /* 943 */ { FE_UNKNOWN, 0, NULL }, /* 944 */ { FE_UNKNOWN, 0, NULL }, /* 945 */ { FE_UNKNOWN, 0, NULL }, /* 946 */ { FE_UNKNOWN, 0, NULL }, /* 947 */ { FE_UNKNOWN, 0, NULL }, /* 948 */ { FE_UNKNOWN, 0, NULL }, /* 949 */ { FE_UNKNOWN, 0, NULL }, /* Chat Errors */ /* 950 */ { FE_ROOMUNAVAILABLE, 1, NULL }, /* TOC1 Chat in $1 is unavailable. */ /* TOC2 User Unavailable You can only Chat with buddies who are currently signed on and available. AOL Instant Messenger users have the option to put up an "Unavailable" notice, indicating that they are away from their computer or simply too busy to answer messages. You need to wait and try again later when your buddy is available. */ /* 951 */ { FE_UNKNOWN, 0, NULL }, /* 952 */ { FE_UNKNOWN, 0, NULL }, /* 953 */ { FE_UNKNOWN, 0, NULL }, /* 954 */ { FE_UNKNOWN, 0, NULL }, /* 955 */ { FE_UNKNOWN, 0, NULL }, /* 956 */ { FE_UNKNOWN, 0, NULL }, /* 957 */ { FE_UNKNOWN, 0, NULL }, /* 958 */ { FE_UNKNOWN, 0, NULL }, /* 959 */ { FE_UNKNOWN, 0, NULL }, /* IM & Info Errors */ /* 960 */ { FE_TOOFAST, 1, "You are sending messages too fast." }, /* TOC1 You are sending message too fast to $1 */ /* TOC2 Server Limit Exceeded Sending messages too fast will exceed the server's capacity to handle them. */ /* 961 */ { FE_INCOMINGERROR, 1, "You missed a message because it was too big." }, /* TOC1 You missed an im from $1 because it was too big. */ /* TOC2 Server Limit Exceeded The sender sent their messages too fast, exceeding the server's capacity to handle them. */ /* 962 */ { FE_INCOMINGERROR, 1, "You missed a message because it was sent too fast." }, /* TOC1 You missed an im from $1 because it was sent too fast. */ /* TOC2 Server Limit Exceeded The Instant Messenging system is designed to accommodate normal conversions, consisting of a few lines of text at a time. Larger messages, like a magazine article or a full-length letter, might get dropped. Please ask the sender to send their message through e-mail instead. */ /* 963 */ { FE_UNKNOWN, 0, NULL }, /* 964 */ { FE_UNKNOWN, 0, NULL }, /* 965 */ { FE_UNKNOWN, 0, NULL }, /* 966 */ { FE_UNKNOWN, 0, NULL }, /* 967 */ { FE_UNKNOWN, 0, NULL }, /* 968 */ { FE_UNKNOWN, 0, NULL }, /* 969 */ { FE_UNKNOWN, 0, NULL }, /* Dir Errors */ /* 970 */ { FE_SUCCESS, 0, NULL }, /* TOC1 Failure */ /* TOC2 UNDOCUMENTED */ /* 971 */ { FE_USERINFOUNAVAILABLE, 0, "Too many matches." }, /* TOC1 Too many matches */ /* TOC2 UNDOCUMENTED */ /* 972 */ { FE_USERINFOUNAVAILABLE, 0, "Need more qualifiers." }, /* TOC1 Need more qualifiers */ /* TOC2 UNDOCUMENTED */ /* 973 */ { FE_USERINFOUNAVAILABLE, 0, "Directory service unavailable." }, /* TOC1 Dir service temporarily unavailable */ /* TOC2 UNDOCUMENTED */ /* 974 */ { FE_USERINFOUNAVAILABLE, 0, "Email lookup restricted." }, /* TOC1 Email lookup restricted */ /* TOC2 UNDOCMENTED */ /* 975 */ { FE_USERINFOUNAVAILABLE, 0, "Keyword ignored." }, /* TOC1 Keyword Ignored */ /* TOC2 UNDOCUMENTED */ /* 976 */ { FE_USERINFOUNAVAILABLE, 0, "No keywords." }, /* TOC1 No Keywords */ /* TOC2 UNDOCUMENTED */ /* 977 */ { FE_SUCCESS, 0, NULL }, /* TOC1 Language not supported */ /* TOC2 UNDOCUMENTED */ /* 978 */ { FE_USERINFOUNAVAILABLE, 0, "Country not supported." }, /* TOC1 Country not supported */ /* TOC2 UNDOCUMENTED */ /* 979 */ { FE_USERINFOUNAVAILABLE, 0, "Failure unknown." }, /* TOC1 Failure unknown $1 */ /* TOC2 UNDOCUMENTED */ /* Auth errors */ /* 980 */ { FE_BADUSERPASS, 0, "The Screen Name or Password was incorrect. Passwords are case sensitive, so make sure your caps lock key isn't on." }, /* TOC1 Incorrect nickname or password. */ /* TOC2 Incorrect Screen Name or Password The Screen Name or Password was incorrect. Passwords are case sensitive, so make sure your caps lock key isn't on. AIM Express (TM) uses your AIM Screen Name and Password, not your AOL Password. If you need an AIM password please visit AOL Instant Messenger. Forgot your password? Click here. */ /* 981 */ { FE_SERVER, 0, "The service is unavailable currently. Please try again in a few minutes." }, /* TOC1 The service is temporarily unavailable. */ /* TOC2 Service Offline The service is unavailable currently. Please try again in a few minutes. */ /* 982 */ { FE_BLOCKED, 0, "Your warning level is too high to sign on." }, /* TOC1 Your warning level is currently too high to sign on. */ /* TOC2 Warning Level too High Your warning level is current too high to sign on. You will need to wait between a few minutes and several hours before you can log back in. */ /* 983 */ { FE_BLOCKED, 0, "You have been connected and disconnecting too frequently. Wait 10 minutes and try again. If you continue to try, you will need to wait even longer." }, /* TOC1 You have been connecting and disconnecting too frequently. Wait 10 minutes and try again. If you continue to try, you will need to wait even longer. */ /* TOC2 Connecting too Frequently You have been connecting and disconnecting too frequently. You will need to wait around 10 minutes before you will be allowed to sign on again. */ /* 984 */ { FE_UNKNOWN, 0, NULL }, /* 985 */ { FE_UNKNOWN, 0, NULL }, /* 986 */ { FE_UNKNOWN, 0, NULL }, /* 987 */ { FE_UNKNOWN, 0, NULL }, /* 988 */ { FE_UNKNOWN, 0, NULL }, /* 989 */ { FE_UNKNOWN, 0, "An unknown signon error has occured. Please wait 10 minutes and try again." }, /* TOC1 An unknown signon error has occurred $1 */ /* TOC2 Unknown Error An unknown signon error has occured. Please wait 10 minutes and try again. */ /* Client Errors */ /* 990 */ { FE_UNKNOWN, 0, NULL }, /* 991 */ { FE_UNKNOWN, 0, NULL }, /* 992 */ { FE_UNKNOWN, 0, NULL }, /* 993 */ { FE_UNKNOWN, 0, NULL }, /* 994 */ { FE_UNKNOWN, 0, NULL }, /* 995 */ { FE_UNKNOWN, 0, NULL }, /* 996 */ { FE_UNKNOWN, 0, NULL }, /* 997 */ { FE_UNKNOWN, 0, NULL }, /* 998 */ { FE_UNKNOWN, 0, "The service believes you are using an outdated client; this is possibly an attempt to block third-party programs such as the one you are using. Check your software's web site for an updated version." }, /* TOC1 UNDOCUMENTED */ /* TOC2 AIM Express (TM) Update Your browser is using a cached version of Quick Buddy that is now outdated. To remedy this, simply quit or close your browser and re-launch it. The next time you load Quick Buddy, it will be automatically updated. */ /* 999 */ { FE_UNKNOWN, 0, NULL }, }; static char *decodeUTF16(const char *const end, char *s) { int i; for (i = 0; (s[i] != -2) && (s+i < end-1); i += 2) if (s[i] == 0) s[i/2] = s[i+1]; else s[i/2] = '.'; s[i/2] = 0; return(s+i); } static fte_t toc_got_data(client_t c, unsigned char *buffer, unsigned short *bufferpos) { char *tempchr1, *arg0, **args, data[TOC_SERVERSEND_MAXLEN - TOC_HEADER_LENGTH + 1]; fte_t r; unsigned short l; got_data_start: r = toc_find_packet(c, buffer, bufferpos, data, SFLAP_FRAME_DATA, &l); if (r == FE_NOTFOUND) return(FE_SUCCESS); else if (r != FE_SUCCESS) return(r); arg0 = toc_get_arg0(data); if (arg0 == NULL) return(FE_SUCCESS); if (strcmp(arg0, "ERROR") == 0) { /* ERROR::Var args */ int err; args = toc_parse_args(data, 3, ':'); assert(strcmp(arg0, args[0]) == 0); if (args[1] == NULL) { toc_internal_disconnect(c, FE_INVALIDFORMAT); return(FE_INVALIDFORMAT); } err = atoi(args[1]); if ((err < 900) || (err > 999)) { toc_internal_disconnect(c, FE_INVALIDFORMAT); return(FE_INVALIDFORMAT); } if (err == 911) { /* TOC1 Error validating input */ /* TOC2 UNDOCUMENTED */ if (c->passchange != 0) { c->passchange--; firetalk_callback_error(c, FE_NOCHANGEPASS, NULL, NULL); goto got_data_start; } } err -= 900; if (toc2_errors[err].fte != FE_SUCCESS) firetalk_callback_error(c, toc2_errors[err].fte, toc2_errors[err].hastarget?args[2]:NULL, toc2_errors[err].str?toc2_errors[err].str:(toc2_errors[err].fte == FE_UNKNOWN)?args[1]:NULL); } else if (strcmp(arg0, "IM_IN_ENC2") == 0) { /* IM_IN::: */ /* 1 source ** 2 'T'=auto, 'F'=normal ** 3 UNKNOWN TOGGLE ** 4 UNKNORN TOGGLE ** 5 user class ** 6 UNKNOWN TOGGLE from toc2_send_im_enc arg 2 ** 7 encoding [toc2_send_im_enc arg 3] "A"=ASCII "L"=Latin1 "U"=UTF8 ** 8 language, for example "en" ** 9 message ** ** Cell phone IM_IN_ENC2:+number:F:F:F: C,:F:L:en:message ** Spam bot IM_IN_ENC2:buddysn:F:F:F: U,:F:A:en:message ** naim 0.11.6 IM_IN_ENC2:buddysn:F:F:F: O,:F:A:en:message ** naim 0.12.0 IM_IN_ENC2:buddysn:F:F:T: O,:F:A:en:message ** WinAIM IM_IN_ENC2:buddysn:F:F:T: O,:F:A:en:message ** ICQ user IM_IN_ENC2:useruin:F:F:T: I,:F:A:en:message ** | | | | | | | ** | | | | | | language, limited to real languages (either two-letter code or "x-bad"), set by sender in toc2_send_im_enc ** | | | | | character encoding, can be A L or U, set by sender in toc2_send_im_enc ** | | | | unknown meaning, can be T or F, set by sender in toc2_send_im_enc ** | | | class, see UPDATE_BUDDY2 below ** | | seems to be T for TOC2/Oscar and F for cell phones and TOC1 ** | unknown, always seems to be F ** away status, T when away and F normally */ char *name, *message; int isauto; args = toc_parse_args(data, 10, ':'); assert(strcmp(arg0, args[0]) == 0); if ((args[1] == NULL) || (args[2] == NULL) || (args[9] == NULL)) { toc_internal_disconnect(c, FE_INVALIDFORMAT); return(FE_INVALIDFORMAT); } name = args[1]; isauto = (args[2][0]=='T')?1:0; message = args[9]; aim_handle_ect(c, name, message, isauto); if (*message != 0) { char *mestart; if (strncasecmp(message, "/me ",4) == 0) firetalk_callback_im_getaction(c, name, isauto, message+4); else if ((mestart = strstr(message, ">/me ")) != NULL) firetalk_callback_im_getaction(c, name, isauto, mestart+5); else { #if defined(DEBUG_ECHO) && defined(HAVE_ASPRINTF) char *A, *B, *C, *encoding, *newmessage = NULL; if (args[5][0] == ' ') A = ""; else if (args[5][0] == 'A') A = "AOL "; else A = "unknown0 "; if (args[5][1] == ' ') B = ""; else if (args[5][1] == 'A') B = "ADMINISTRATOR"; else if (args[5][1] == 'C') B = "WIRELESS"; else if (args[5][1] == 'I') B = "ICQ"; else if (args[5][1] == 'O') B = "OSCAR_FREE"; else if (args[5][1] == 'U') B = "DAMNED_TRANSIENT"; else B = "unknown1"; if ((args[5][2] == ' ') || (args[5][2] == 0) || (args[5][2] == ',')) C = ""; else if (args[5][2] == 'U') C = " UNAVAILABLE"; else C = " unknown2"; if (args[7][0] == 'A') encoding = "ASCII"; else if (args[7][0] == 'L') encoding = "Latin1"; else if (args[7][0] == 'U') encoding = "UTF8"; else encoding = "unknown"; asprintf(&newmessage, "[%s%s%s, %s, %s %s %s %s] %s", A, B, C, encoding, args[2], args[3], args[4], args[6], message); message = newmessage; #endif if (isauto) /* interpolate only auto-messages */ firetalk_callback_im_getmessage(c, name, 1, aim_interpolate_variables(message, c->nickname)); else firetalk_callback_im_getmessage(c, name, 0, message); #if defined(DEBUG_ECHO) && defined(HAVE_ASPRINTF) free(message); #endif } } firetalk_callback_im_buddyonline(c, name, 1); firetalk_callback_typing(c, name, 0); } else if (strcmp(arg0, "USER_INFO") == 0) { char *name, *info, *away, *third; int class = 0, warning, isaway; long online, idle; args = toc_parse_args(data, 9, ':'); assert(strcmp(arg0, args[0]) == 0); if (!args[1] || !args[2] || !args[3] || !args[4] || !args[5] || !args[6] || !args[7] || !args[8]) { toc_internal_disconnect(c, FE_INVALIDFORMAT); return(FE_INVALIDFORMAT); } #ifdef DEBUG_ECHO toc_echof(c, "got_data", "USER_INFO '%s' '%s' '%s' '%s' '%s' '%s' '%s'\n", args[1], args[2], args[3], args[4], args[5], args[6], args[7]); toc_echof(c, "got_data", "%s", args[8]); #endif name = args[1]; if (args[2][0] == 'T') { online = atol(args[4]); if (online == 0) online = 1; } else online = 0; isaway = (args[6][2]=='U')?1:0; warning = atol(args[3]); idle = atol(args[5]); info = args[8]; away = info; if (away[0] == 0) info = decodeUTF16(data+l, away); else info = strchr(info, -2); assert(info != NULL); assert(*info == -2); *info++ = 0; if (*away != 0) away = strdup(aim_interpolate_variables(away, c->nickname)); else away = NULL; #ifdef DEBUG_ECHO toc_echof(c, "got_data", "%i %i %i %i", info[0], info[1], info[2], info[3]); #endif assert((info[0] == -2) || (info[0] == '<') || ((info[0] == 0) && (info[1] == '<'))); if (info[0] == 0) third = decodeUTF16(data+l, info); else third = strchr(info, -2); assert(third != NULL); assert(*third == -2); *third++ = 0; info = aim_handle_ect(c, name, info, 1); info = aim_interpolate_variables(info, c->nickname); #ifdef DEBUG_ECHO toc_echof(c, "got_data", "USER_INFO 1 %i %s\n", isaway, away); toc_echof(c, "got_data", "USER_INFO 2 %s\n", info); toc_echof(c, "got_data", "USER_INFO 3 %s\n", third); #endif if (away != NULL) { firetalk_callback_subcode_reply(c, name, "AWAY", away); free(away); } firetalk_callback_gotinfo(c, name, info, warning, online, idle, class); } else if (strcmp(arg0, "CLIENT_EVENT2") == 0) { /* 1 source ** 2 status */ char *name; int typinginfo; args = toc_parse_args(data, 3, ':'); assert(strcmp(arg0, args[0]) == 0); if (!args[1] || !args[2]) { toc_internal_disconnect(c, FE_INVALIDFORMAT); return(FE_INVALIDFORMAT); } name = args[1]; typinginfo = atol(args[2]); firetalk_callback_typing(c, name, typinginfo); } else if (strcmp(arg0, "UPDATE_BUDDY2") == 0) { /* UPDATE_BUDDY::::::: */ /* 1 source ** 2 'T'=online, 'F'=offline ** 3 warning level out of 100 ** 4 signon time in seconds since epoch ** 5 idle time in minutes ** 6 flags: ABC; A in 'A'=AOL user; ** B in 'A'=admin, 'C'=cell phone, 'I'=ICQ, 'O'=normal, 'U'=unconfirmed; ** C in 'U'=away ** 7 status code, used in ICQ */ char *name; int isaway; long online, warn, idle; args = toc_parse_args(data, 8, ':'); assert(strcmp(arg0, args[0]) == 0); if (!args[1] || !args[2] || !args[3] || !args[4] || !args[5] || !args[6] || !args[7]) { toc_internal_disconnect(c, FE_INVALIDFORMAT); return(FE_INVALIDFORMAT); } name = args[1]; if (args[2][0] == 'T') { online = atol(args[4]); if (online == 0) online = 1; } else online = 0; isaway = (args[6][2]=='U')?1:0; warn = atol(args[3]); idle = atol(args[5]); firetalk_callback_im_buddyonline(c, name, online); if (online != 0) { firetalk_callback_im_buddyaway(c, name, isaway); firetalk_callback_idleinfo(c, name, idle); firetalk_callback_warninfo(c, name, warn); } else { assert(isaway == 0); assert(idle == 0); /* assert(warn == 0); Warning levels survive signing off*/ } } else if (strcmp(arg0, "BUDDY_CAPS2") == 0) { /* 1 source ** 2 capabilities separated by commas */ char capstring[1024], *name, **caps; int i, firstcap; args = toc_parse_args(data, 3, ':'); assert(strcmp(arg0, args[0]) == 0); if (!args[1] || !args[2]) { toc_internal_disconnect(c, FE_INVALIDFORMAT); return(FE_INVALIDFORMAT); } name = args[1]; caps = toc_parse_args(args[2], 255, ','); firstcap = strtol(caps[0], NULL, 16); for (i = 0; i < sizeof(toc_firstcaps)/sizeof(*toc_firstcaps); i++) if (toc_firstcaps[i].val == firstcap) { snprintf(capstring, sizeof(capstring), "%s", toc_firstcaps[i].name); break; } if (i == sizeof(toc_firstcaps)/sizeof(*toc_firstcaps)) snprintf(capstring, sizeof(capstring), "UNKNOWN_TYPE_%X", firstcap); for (i = 1; (caps[i] != NULL) && (*caps[i] != 0); i++) { int j, A1, A2, B, C, D, E1, E2, E3; toc_uuid(caps[i], &A1, &A2, &B, &C, &D, &E1, &E2, &E3); j = toc_cap(A1, A2, B, C, D, E1, E2, E3); if (j != -1) { if (strcmp(toc_uuids[j].name, "THIRD_PARTY_RANGE") != 0) snprintf(capstring+strlen(capstring), sizeof(capstring)-strlen(capstring), " %s", toc_uuids[j].name); else { #define O(x) (((x) == 0)?0:isspace(x)?'_':(x)) snprintf(capstring+strlen(capstring), sizeof(capstring)-strlen(capstring), " [%c%c%c%c%c%c%c%c%c%c%c%c", O(B>>8), O(B&0xFF), O(C>>8), O(C&0xFF), O(D>>8), O(D&0xFF), O(E1>>8), O(E1&0xFF), O(E2>>8), O(E2&0xFF), O(E3>>8), O(E3&0xFF)); #undef O snprintf(capstring+strlen(capstring), sizeof(capstring)-strlen(capstring), "]"); } } else { if (strlen(caps[i]) > 4) snprintf(capstring+strlen(capstring), sizeof(capstring)-strlen(capstring), " [%04X%04X-%04X-%04X-%04X-%04X%04X%04X]", A1, A2, B, C, D, E1, E2, E3); else snprintf(capstring+strlen(capstring), sizeof(capstring)-strlen(capstring), " UNKNOWN_CAP_%04X", A2); } } firetalk_callback_capabilities(c, name, capstring); } else if (strcmp(arg0, "BART2") == 0) { /* 1 source ** 2 base64-encoded strings, unidentified */ char **barts, *name; int i; args = toc_parse_args(data, 3, ':'); assert(strcmp(arg0, args[0]) == 0); name = strdup(args[1]); barts = toc_parse_args(args[2], 255, ' '); for (i = 0; (barts[i] != NULL) && (barts[i+1] != NULL) && (barts[i+2] != NULL); i += 3) { int j, flag = atoi(barts[i]), type = atoi(barts[i+1]); for (j = 0; j < sizeof(toc_barts)/sizeof(*toc_barts); j++) if (toc_barts[j].val == type) { #ifdef DEBUG_ECHO toc_echof(c, "got_data", "BART %i %i: %s: %s [%s]\n", flag, type, toc_barts[j].name, barts[i+2], firetalk_debase64(args[i+2])); #endif break; } if (type == 2) { const char *s = firetalk_debase64(args[i+1]); int len; assert(*s == 0); len = s[1]; assert(s[len+2] == 0); assert(s[len+3] == 0); #ifdef DEBUG_ECHO toc_echof(c, "got_data", "BART STATUS_TEXT %s %s\n", name, s+2); #endif firetalk_callback_statusinfo(c, name, s+2); } } free(name); } else if (strcmp(arg0, "NICK") == 0) { /* NICK: ** Tells you your correct nickname (ie how it should be capitalized and ** spacing) */ args = toc_parse_args(data, 2, ':'); assert(strcmp(arg0, args[0]) == 0); if (!args[1]) { firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "NICK"); return(FE_SUCCESS); } firetalk_callback_user_nickchanged(c, c->nickname, args[1]); free(c->nickname); c->nickname = strdup(args[1]); if (c->nickname == NULL) abort(); firetalk_callback_newnick(c, args[1]); } else if (strcmp(arg0, "EVILED") == 0) { /* EVILED:: ** The user was just eviled. */ args = toc_parse_args(data, 3, ':'); assert(strcmp(arg0, args[0]) == 0); if (!args[1]) { firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "EVILED"); return(FE_SUCCESS); } firetalk_callback_eviled(c, atoi(args[1]), args[2]); } else if (strcmp(arg0, "CHAT_JOIN") == 0) { /* CHAT_JOIN:: ** We were able to join this chat room. The Chat Room Id is ** internal to TOC. */ long id; char *name; int exchange, ret; args = toc_parse_args(data, 3, ':'); assert(strcmp(arg0, args[0]) == 0); if (!args[1] || !args[2]) { firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "CHAT_JOIN"); return(FE_SUCCESS); } id = atol(args[1]); name = args[2]; exchange = toc_internal_find_exchange(c, name); assert(exchange != 0); ret = toc_internal_set_id(c, name, exchange, id); assert(ret == FE_SUCCESS); ret = toc_internal_set_joined(c, id); assert(ret == FE_SUCCESS); firetalk_callback_chat_joined(c, toc_internal_find_room_name(c, id)); } else if (strcmp(arg0, "CHAT_IN_ENC") == 0) { /* CHAT_IN:::: ** A chat message was sent in a chat room. */ /* 1 room ID ** 2 source ** 3 'T'=private, 'F'=public ** 4 unknown ** 5 language ** 6 message */ long id; char *source, *message, *mestart; args = toc_parse_args(data, 7, ':'); assert(strcmp(arg0, args[0]) == 0); if (!args[1] || !args[2] || !args[3] || !args[4] || !args[5] || !args[6]) { firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "CHAT_IN_ENC"); return(FE_SUCCESS); } id = atol(args[1]); source = args[2]; message = args[6]; if (strncasecmp(message, "
", 11) == 0) {
			message += 11;
			if ((tempchr1 = strchr(message, '<')))
				*tempchr1 = 0;
		}
		if (strncasecmp(message, "/me ", 4) == 0)
			firetalk_callback_chat_getaction(c,
				toc_internal_find_room_name(c, id),
				source, 0, message+4);
		else if ((mestart = strstr(message, ">/me ")) != NULL)
			firetalk_callback_chat_getaction(c,
				toc_internal_find_room_name(c, id),
				source, 0, mestart+5);
		else
			firetalk_callback_chat_getmessage(c,
				toc_internal_find_room_name(c, id),
				source, 0, message);
	} else if (strcmp(arg0, "CHAT_UPDATE_BUDDY") == 0) {
		/* CHAT_UPDATE_BUDDY::::...
		**    This one command handles arrival/departs from a chat room.  The
		**    very first message of this type for each chat room contains the
		**    users already in the room.
		*/
		int	joined;
		long	id;
		char	*recip,
			*source,
			*colon;

		args = toc_parse_args(data, 4, ':');
		assert(strcmp(arg0, args[0]) == 0);

		if (!args[1] || !args[2] || !args[3]) {
			firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "CHAT_UPDATE_BUDDY");
			return(FE_SUCCESS);
		}
		joined = (args[2][0]=='T')?1:0;
		id = atol(args[1]);
		recip = toc_internal_find_room_name(c, id);
		source = args[3];

		while ((colon = strchr(source, ':'))) {
			*colon = 0;
			if (joined)
				firetalk_callback_chat_user_joined(c, recip, source, NULL);
			else
				firetalk_callback_chat_user_left(c, recip, source, NULL);
			source = colon+1;
		}
		if (joined) {
			firetalk_callback_chat_user_joined(c, recip, source, NULL);
			firetalk_callback_chat_user_joined(c, recip, NULL, NULL);
		} else
			firetalk_callback_chat_user_left(c, recip, source, NULL);
	} else if (strcmp(arg0, "CHAT_INVITE") == 0) {
		/* CHAT_INVITE::::
		**    We are being invited to a chat room.
		*/
		args = toc_parse_args(data, 5, ':');
		assert(strcmp(arg0, args[0]) == 0);

		if (!args[1] || !args[2] || !args[3] || !args[4]) {
			firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "CHAT_INVITE");
			return(FE_SUCCESS);
		}
		if (toc_internal_add_room(c, args[1], 4) == FE_SUCCESS)
			if (toc_internal_set_room_invited(c, args[1], 1) == FE_SUCCESS)
				if (toc_internal_set_id(c, args[1], 4, atol(args[2])) == FE_SUCCESS)
					firetalk_callback_chat_invited(c, args[1], args[3], args[4]);
	} else if (strcmp(arg0, "CHAT_LEFT") == 0) {
		/* CHAT_LEFT:
		**    Tells tic connection to chat room has been dropped
		*/
		args = toc_parse_args(data, 2, ':');
		assert(strcmp(arg0, args[0]) == 0);

		if (!args[1]) {
			firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "CHAT_LEFT");
			return(FE_SUCCESS);
		}
		firetalk_callback_chat_left(c, toc_internal_find_room_name(c, atol(args[1])));
	} else if (strcmp(arg0, "NEW_BUDDY_REPLY2") == 0) {
		/* NEW_BUDDY_REPLY2:19033926:added */
	} else if (strcmp(arg0, "UPDATED2") == 0) {
		/* UPDATED2:a:19033926:Buddy */
		/* UPDATED2:b:nmlorg:groupname:Dan */
		args = toc_parse_args(data, 255, ':');
		assert(strcmp(arg0, args[0]) == 0);

		if ((args[1] != NULL) && (args[2] != NULL) && (args[3] != NULL) && (strcmp(args[1], "b") == 0)) {
			char	*name = args[2],
				*group = args[3],
				*friendly = args[4];

			if ((friendly != NULL) && (*friendly == 0))
				friendly = NULL;
			firetalk_callback_buddyadded(c, name, group, friendly);
		}
	} else if (strcmp(arg0, "INSERTED2") == 0) {
		/* INSERTED2:25:76: */
		/* INSERTED2:b::yankeegurl680997:Recent Buddies */
		args = toc_parse_args(data, 255, ':');
		assert(strcmp(arg0, args[0]) == 0);

		if ((args[1] != NULL) && (args[2] != NULL) && (args[3] != NULL) && (args[4] != NULL) && (strcmp(args[1], "b") == 0)) {
			char	*name = args[3],
				*group = args[4],
				*friendly = args[5];

			if ((friendly != NULL) && (*friendly == 0))
				friendly = NULL;
			firetalk_callback_buddyadded(c, name, group, friendly);
		}
	} else if (strcmp(arg0, "DELETED2") == 0) {
		/* DELETED2:b:yankeegurl680997: */
		/* DELETED2:b:yankeegurl680997:Recent Buddies */
		/* DELETED2:M-^@T*80®ÿ¿M-^BGM-^Ayankeegurl680997: */
		args = toc_parse_args(data, 255, ':');
		assert(strcmp(arg0, args[0]) == 0);

		if ((args[1] != NULL) && (args[2] != NULL) && (args[3] != NULL) && (strcmp(args[1], "b") == 0)) {
			char	*name = args[2],
				*group = args[4];

			if ((group != NULL) && (*group == 0))
				group = NULL;
			firetalk_callback_buddyremoved(c, name, group);
		}
	} else if (strcmp(arg0, "DIR_STATUS") == 0) {
		/* DIR_STATUS::
		**     is always 0 for success status.
		*/
		args = toc_parse_args(data, 2, ':');
		assert(strcmp(arg0, args[0]) == 0);

		if (args[1] == NULL) {
			firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "DIR_STATUS with no status code");
			return(FE_SUCCESS);
		}
		switch (atoi(args[1])) {
		  case 0:
		  case 1:
			break;
		  case 2:
			firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "DIR_STATUS failed, invalid format");
			break;
		  default:
			firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "DIR_STATUS with unknown code");
			break;
		}
	} else if (strcmp(arg0, "ADMIN_NICK_STATUS") == 0) {
		/* ADMIN_NICK_STATUS::
		**     is always 0 for success status.
		*/
	} else if (strcmp(arg0, "ADMIN_PASSWD_STATUS") == 0) {
		/* ADMIN_PASSWD_STATUS::
		**     is always 0 for success status.
		*/
		c->passchange--;
		args = toc_parse_args(data, 3, ':');
		assert(strcmp(arg0, args[0]) == 0);

		if (!args[1]) {
			firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "ADMIN_PASSWD_STATUS");
			return(FE_SUCCESS);
		}
		if (atoi(args[1]) != 0)
			firetalk_callback_error(c, FE_NOCHANGEPASS, NULL, NULL);
		else
			firetalk_callback_passchanged(c);
	} else if (strcmp(arg0, "PAUSE") == 0) {
		/* PAUSE
		**    Tells TIC to pause so we can do migration
		*/
		c->connectstate = 1;
		firetalk_internal_set_connectstate(c, FCS_WAITING_SIGNON);
	} else if (strcmp(arg0, "RVOUS_PROPOSE") == 0) {
		/* RVOUS_PROPOSE::::::::
		**               [:tlv tag1:tlv value1[:tlv tag2:tlv value2[:...]]]
		**    Another user has proposed that we rendezvous with them to
		**    perform the service specified by .  They want us
		**    to connect to them, we have their rendezvous ip, their
		**    proposer_ip, and their verified_ip. The tlv values are
		**    base64 encoded.
		*/
		int	j, A1, A2, B, C, D, E1, E2, E3;

		args = toc_parse_args(data, 255, ':');
		assert(strcmp(arg0, args[0]) == 0);

		if (!args[1] || !args[2] || !args[3] || !args[4] || !args[5] || !args[6] || !args[7] || !args[8]) {
			firetalk_callback_error(c, FE_INVALIDFORMAT, NULL, "RVOUS_PROPOSE");
			return(FE_SUCCESS);
		}
#ifdef DEBUG_ECHO
		{
			int	i;

			toc_echof(c, "got_data", "RVOUS_PROPOSE\n1user=[%s]\n2uuid=%s\n3cookie=[%s]\n4seq=%s\n5rendezvous_ip=%s\n6proposer_ip=%s\n7verified_ip=%s\n8port=%s\n",
				args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
			for (i = 9; args[i] && args[i+1]; i += 2)
				toc_echof(c, "got_data", "RVOUS_PROPOSE\n%itype=%s\n%ivalue=%s [%s]\n", i, args[i], i+1, args[i+1], firetalk_debase64(args[i+1]));
		}
#endif
		toc_uuid(args[2], &A1, &A2, &B, &C, &D, &E1, &E2, &E3);
		j = toc_cap(A1, A2, B, C, D, E1, E2, E3);
		if (j == -1)
			firetalk_callback_error(c, FE_WEIRDPACKET, NULL, "Unknown rendezvous UUID");
		else {
			if (strcmp(toc_uuids[j].name, "FILE_TRANSFER") == 0) {
				const char *message, *file;

				if ((message = toc_get_tlv_value(args, 9, 12)) != NULL)
					firetalk_callback_im_getmessage(c, args[1], 0, message);

				if ((file = toc_get_tlv_value(args, 9, 10001)) != NULL) {
					unsigned long	size = ntohl(*((uint32_t *)(file+4)));

					firetalk_callback_file_offer(c,
						/* from */	args[1],		/* user */
						/* filename */	file+8,			/* filename */
						/* size */	size,
						/* ipstring */	args[7],		/* verified_ip */
						/* ip6string */	NULL,
						/* port */	(uint16_t)atoi(args[8]),/* port */
						/* type */	FF_TYPE_RAW);
				}
			} else
				firetalk_callback_error(c, FE_WEIRDPACKET, NULL, "Unhandled rendezvous UUID, do we have a capability set we do not actually support?");
		}
	} else
		firetalk_callback_error(c, FE_WEIRDPACKET, NULL, data);

	goto got_data_start;
}

static const char *toc_make_fake_cap(const unsigned char *const str, const int len) {
	static char buf[sizeof("FFFFFFFF-cccc-dddd-eeee-ffffgggghhhh")];
	const int ar[] = { 9, 11, 14, 16, 19, 21, 24, 26, 28, 30, 32, 34 };
	const int maxlen = 12;
	int	i;

	strcpy(buf, "FFFFFFFF-0000-0000-0000-000000000000");
	for (i = 0; (i < len) && (i < maxlen); i++) {
		char	b[3];

		sprintf(b, "%02X", str[i]);
		memcpy(buf+ar[i], b, 2);
	}
	return(buf);
}

static fte_t toc_got_data_connecting(client_t c, unsigned char *buffer, unsigned short *bufferpos) {
	char data[TOC_SERVERSEND_MAXLEN - TOC_HEADER_LENGTH + 1];
	char password[128];
	fte_t	r;
	unsigned short length;
	char *arg0;
	char **args;
	char *tempchr1;
	firetalk_t fchandle;

got_data_connecting_start:
	
	r = toc_find_packet(c, buffer, bufferpos, data, (c->connectstate==0)?SFLAP_FRAME_SIGNON:SFLAP_FRAME_DATA, &length);
	if (r == FE_NOTFOUND)
		return(FE_SUCCESS);
	else if (r != FE_SUCCESS)
		return(r);

	switch (c->connectstate) {
	  case 0: /* we're waiting for the flap version number */
		if (length != TOC_HOST_SIGNON_LENGTH) {
			firetalk_callback_connectfailed(c, FE_PACKETSIZE, "Host signon length incorrect");
			return(FE_PACKETSIZE);
		}
		if ((data[0] != 0) || (data[1] != 0) || (data[2] != 0) || (data[3] != 1)) {
			firetalk_callback_connectfailed(c, FE_VERSION, NULL);
			return(FE_VERSION);
		}
#if 0
		srand((unsigned int) time(NULL));
		c->local_sequence = (unsigned short)1+(unsigned short)(65536.0*rand()/(RAND_MAX+1.0));
#else
		c->local_sequence = 31337;
#endif

		length = toc_fill_header((unsigned char *)data, SFLAP_FRAME_SIGNON, ++c->local_sequence, toc_fill_signon((unsigned char *)&data[TOC_HEADER_LENGTH], c->nickname));

		fchandle = firetalk_find_handle(c);
#ifdef DEBUG_ECHO
		toc_echo_send(c, "got_data_connecting", data, length);
#endif
		firetalk_internal_send_data(fchandle, data, length);

		firetalk_callback_needpass(c, password, sizeof(password));

		c->connectstate = 1;
		{
			int	sn = tolower(c->nickname[0]) - 'a' + 1,
				pw = tolower(password[0]) - 'a' + 1,
				A = sn*7696 + 738816,
				B = sn*746512,
				C = pw*A,
				magic = C - A + B + 71665152;

			if (!isdigit(c->nickname[0]))			/* AIM Express */
			  r = toc_send_printf(c, "toc2_login "
				 "login.oscar.aol.com"	// authorizer host	[login.oscar.aol.com]
				" 29999"		// authorizer port	[29999]
				" %s"			// username
				" %S"			// roasted, armored password
				" English"		// language		[English]
				" %s"			// client version
				" 160"			// unknown number	[160]
				" %S"			// country code		[US]
				" %s"			// unknown string	[""]
				" %s"			// unknown string	[""]
				" 3"			// unknown number	[3]
				" 0"			// unknown number	[0]
				" 30303"		// unknown number	[30303]
				" -kentucky"		// unknown flag		[-kentucky]
				" -utf8"		// unknown flag		[-utf8]
				" -preakness"		// this enables us to talk to ICQ users
				" %i",			// magic number based on username and password
					c->nickname,
					toc_hash_password(password),
					/*PACKAGE_NAME*/ ":" /*PACKAGE_VERSION*/ ":contact " /*PACKAGE_BUGREPORT*/,
					"US",
					"",
					"",
					magic);
			else						/* ICQ2Go */
			  r = toc_send_printf(c, "toc2_login "
				 "login.icq.com"	// authorizer host	[login.icq.com]
				" 5190"			// authorizer port	[5190]
				" %S"			// username
				" %S"			// roasted, armored password
				" en"			// language		[en]
				" %s"			// client version
				" 135"			// unknown number	[135]
				" %s"			// country code		["US"]
				" %s"			// unknown string	[""]
				" %s"			// unknown string	[""]
				" 30"			// unknown number	[30]
				" 2"			// unknown number	[2]
				" 321"			// unknown number	[321]
				" -utf8"		// unknown flag		[-utf8]
				" -preakness"		// this enables us to talk to ICQ users
				" %i",			// magic number based on username and password
					c->nickname,
					toc_hash_password(password),
					PACKAGE_NAME ":" PACKAGE_VERSION ":contact " PACKAGE_BUGREPORT,
					"US",
					"",
					"",
					magic);
		}
		if (r != FE_SUCCESS) {
			firetalk_callback_connectfailed(c,r,NULL);
			return(r);
		}
		break;
	  case 1:
		arg0 = toc_get_arg0(data);
		if (strcmp(arg0, "SIGN_ON") != 0) {
			if (strcmp(arg0, "ERROR") == 0) {
				args = toc_parse_args(data, 3, ':');
				if (args[1] != NULL) {
					int	err = atoi(args[1]);

					if ((err >= 900) && (err <= 999)) {
						err -= 900;
						firetalk_callback_connectfailed(c, toc2_errors[err].fte, toc2_errors[err].str);
						return(toc2_errors[err].fte);
					}
				}
			}
			firetalk_callback_connectfailed(c, FE_UNKNOWN, NULL);
			return(FE_UNKNOWN);
		}
		c->connectstate = 2;
		break;
	  case 2:
	  case 3:
		arg0 = toc_get_arg0(data);
		if (arg0 == NULL)
			return(FE_SUCCESS);
		if (strcmp(arg0, "NICK") == 0) {
			/* NICK: */

			args = toc_parse_args(data, 2, ':');
			if (args[1]) {
				free(c->nickname);
				c->nickname = strdup(args[1]);
				if (c->nickname == NULL)
					abort();
			}
			c->connectstate = 3;
		} else if (strcmp(arg0, "CONFIG2") == 0) {
			/* CONFIG2: */
			char	*nl, *curgroup = strdup("Saved buddy");

			fchandle = firetalk_find_handle(c);
			args = toc_parse_args(data, 2, ':');
			if (!args[1]) {
				firetalk_callback_connectfailed(c, FE_INVALIDFORMAT, "CONFIG2");
				return(FE_INVALIDFORMAT);
			}
			tempchr1 = args[1];
			c->permit_mode = 0;
			while ((nl = strchr(tempchr1, '\n'))) {
				*nl = 0;

				if (tempchr1[1] == ':') {
					/* b:ACCOUNT:REAL NAME:?:CELL PHONE SLOT NUMBER:w:NOTES */

					args = toc_parse_args(tempchr1, 4, ':');

					switch (args[0][0]) {
					  case 'g':	/* Buddy Group (All Buddies until the next g or the end of config are in this group.) */
						free(curgroup);
						curgroup = strdup(args[1]);
						break;
					  case 'b':	/* A Buddy */
					  case 'a': {	/* another kind of buddy */
							char	*friendly = NULL;

							if ((args[2] != NULL) && (args[2][0] != 0))
								friendly = args[2];
							else
								friendly = NULL;
							if (strcmp(curgroup, "Mobile Device") != 0)
								firetalk_im_add_buddy(fchandle, args[1], curgroup, friendly);
						}
						break;
					  case 'p':	/* Person on permit list */
						toc_send_printf(c, "toc_add_permit %s", args[1]);
						break;
					  case 'd':	/* Person on deny list */
						firetalk_im_internal_add_deny(fchandle, args[1]);
						break;
					  case 'm':	/* Permit/Deny Mode.  Possible values are 1 - Permit All 2 - Deny All 3 - Permit Some 4 - Deny Some */
						c->permit_mode = atoi(args[1]);
						break;
					}
				}
				tempchr1 = nl+1;
			}
			free(curgroup);

			if ((c->permit_mode < 1) || (c->permit_mode > 5))
				c->permit_mode = 4;
			toc_send_printf(c, "toc2_set_pdmode %i", c->permit_mode);
			c->gotconfig = 1;
		} else {
			firetalk_callback_connectfailed(c, FE_WEIRDPACKET, data);
			return(FE_WEIRDPACKET);
		}

		if ((c->gotconfig == 1) && (c->connectstate == 3)) {
#ifdef ENABLE_GETREALNAME
			char	realname[128];
#endif

			/* ask the client to handle its init */
			firetalk_callback_doinit(c, c->nickname);
			if (toc_im_upload_buddies(c) != FE_SUCCESS) {
				firetalk_callback_connectfailed(c, FE_PACKET, "Error uploading buddies");
				return(FE_PACKET);
			}
			if (toc_im_upload_denies(c) != FE_SUCCESS) {
				firetalk_callback_connectfailed(c, FE_PACKET, "Error uploading denies");
				return(FE_PACKET);
			}
			r = toc_send_printf(c, "toc_init_done");
			if (r != FE_SUCCESS) {
				firetalk_callback_connectfailed(c, r, "Finalizing initialization");
				return(r);
			}

			{
				char	*name, *version;

				name = strdup(toc_make_fake_cap(PACKAGE_NAME, strlen(PACKAGE_NAME)));
				version = strdup(toc_make_fake_cap(PACKAGE_VERSION, strlen(PACKAGE_VERSION)));
				r = toc_send_printf(c, "toc_set_caps %S %S %S",
					"094613494C7F11D18222444553540000", name, version);
				free(name);
				free(version);
				if (r != FE_SUCCESS) {
					firetalk_callback_connectfailed(c, r, "Setting capabilities");
					return(r);
				}
			}

#ifdef ENABLE_GETREALNAME
			firetalk_getrealname(c, realname, sizeof(realname));
			if (*realname != 0) {
				char	*first, *mid, *last;

				first = strtok(realname, " ");
				mid = strtok(NULL, " ");
				last = strtok(NULL, " ");

				if (mid == NULL)
					mid = "";
				if (last == NULL) {
					last = mid;
					mid = "";
				}

				/* first name:middle name:last name:maiden name:city:state:country:email:allow web searches */
				r = toc_send_printf(c, "toc_set_dir \"%S:%S:%S\"", first, mid, last);
				if (r != FE_SUCCESS) {
					firetalk_callback_connectfailed(c, r, "Setting directory information");
					return(r);
				}
			}
#endif

			firetalk_callback_connected(c);
			return(FE_SUCCESS);
		}
		break;
	}
	goto got_data_connecting_start;
}

static fte_t toc_periodic(struct s_firetalk_handle *const conn) {
	struct s_toc_connection *c;
	time_t	now;
	long	idle;
	char	data[32];
	fte_t	r;

	c = conn->handle;

	if (firetalk_internal_get_connectstate(c) != FCS_ACTIVE)
		return(FE_NOTCONNECTED);

	now = time(NULL);

	if ((c->lastself+60) <= now) {
		c->lastself = now;
		r = toc_send_printf(c, "toc_get_status %s", c->nickname);
		if (r != FE_SUCCESS)
			return(r);
	}

	idle = (long)(now - c->lasttalk);
	firetalk_callback_setidle(c, &idle);

	if (idle < 600)
		idle = 0;

	if (idle/60 == c->lastidle/60)
		return(FE_IDLEFAST);

	if ((c->lastidle/60 == 0) && (idle/60 == 0))
		return(FE_IDLEFAST);
	if ((c->lastidle/60 != 0) && (idle/60 != 0))
		return(FE_IDLEFAST);

	c->lastidle = idle;
	sprintf(data, "%ld", idle);
	return(toc_send_printf(c, "toc_set_idle %s", data));
}

static fte_t toc_chat_join(client_t c, const char *const room) {
	int	i;

	i = toc_internal_get_room_invited(c,room);
	if (i == 1) {
		toc_internal_set_room_invited(c, room, 0);
		return(toc_send_printf(c, "toc_chat_accept %i", toc_internal_find_room_id(c, room)));
	} else {
		int	m;
		char	*s;

		s = toc_internal_split_name(room);
		m = toc_internal_split_exchange(room);
		toc_internal_add_room(c, s, m);
		return(toc_send_printf(c, "toc_chat_join %d %s", m, s));
	}
}

static fte_t toc_chat_part(client_t c, const char *const room) {
	int	id = toc_internal_find_room_id(c, room);

	if (id == 0)
		return(FE_ROOMUNAVAILABLE);
	return(toc_send_printf(c, "toc_chat_leave %i", id));
}

static fte_t toc_chat_set_topic(client_t c, const char *const room, const char *const topic) {
	return(FE_SUCCESS);
}

static fte_t toc_chat_op(client_t c, const char *const room, const char *const who) {
	return(FE_SUCCESS);
}

static fte_t toc_chat_deop(client_t c, const char *const room, const char *const who) {
	return(FE_SUCCESS);
}

static fte_t toc_chat_kick(client_t c, const char *const room, const char *const who, const char *const reason) {
	return(FE_SUCCESS);
}

static fte_t toc_chat_send_message(client_t c, const char *const room, const char *const message, const int auto_flag) {
	if (strlen(message) > 232)
		return(FE_PACKETSIZE);

	if (strcasecmp(room, ":RAW") == 0)
		return(toc_send_printf(c, "%S", message));
	else {
		int	id = toc_internal_find_room_id(c,room);

		if (id == 0)
			return(FE_ROOMUNAVAILABLE);
		return(toc_send_printf(c, "toc_chat_send %i %s", id, message));
	}
}

static fte_t toc_chat_send_action(client_t c, const char *const room, const char *const message, const int auto_flag) {
	char	tempbuf[TOC_CLIENTSEND_MAXLEN];

	if (strlen(message) > 232-4)
		return(FE_PACKETSIZE);

	snprintf(tempbuf, sizeof(tempbuf), "/me %s", message);
	return(toc_send_printf(c, "toc_chat_send %i %s",
		toc_internal_find_room_id(c, room), tempbuf));
}

static fte_t toc_chat_invite(client_t c, const char *const room, const char *const who, const char *const message) {
	int	id = toc_internal_find_room_id(c,room);

	if (id != 0)
		return(toc_send_printf(c, "toc_chat_invite %i %s %s", id, message, who));
	return(FE_NOTFOUND);
}

#ifdef ENABLE_FILE_OFFER
static fte_t toc_file_offer(client_t c, const char *const nickname,
		const char *const filename, const unsigned long localip,
		const uint16_t port, const long size) {
	struct s_firetalk_handle
		*fchandle = firetalk_find_handle(c);
	char	args[256];

	snprintf(args, sizeof(args), "SEND %s %lu %u %ld", filename, localip, port, size);
	return(firetalk_subcode_send_request(fchandle, nickname, "DCC", args));
}
#endif

/*
static fte_t toc_subcode_send_request(client_t c, const char *const to, const char *const command, const char *const args) {
	char	*ect;

	if (isdigit(c->nickname[0]))
		return(FE_SUCCESS);
	if ((ect = toc_ctcp_encode(c, command, args)) == NULL)
		return(FE_SUCCESS);

	toc_im_send_message(c, to, ect, 0);
	free(ect);
	return(FE_SUCCESS);
}

static fte_t toc_subcode_send_reply(client_t c, const char *const to, const char *const command, const char *const args) {
	char	*ect;

	if ((ect = toc_ctcp_encode(c, command, args)) == NULL)
		return(FE_SUCCESS);

	if (to != NULL) {
		fte_t	ret;

		ret = toc_im_send_message(c, to, ect, 1);
		free(ect);
		return(ret);
	} else {
#if 0
		if (args != NULL)
			ect_prof(c, command, ect);
		else
			ect_prof(c, command, "");
#endif
		free(ect);
		return(FE_SUCCESS);
	}
}
*/

const firetalk_protocol_t firetalk_protocol_toc2 = {
	strprotocol:		"TOC2",
	default_server:		"toc.n.ml.org",
	default_port:		9898,
	default_buffersize:	1024*8,
	periodic:		toc_periodic,
	preselect:		toc_preselect,
	postselect:		toc_postselect,
	got_data:		toc_got_data,
	got_data_connecting:	toc_got_data_connecting,
	comparenicks:		toc_compare_nicks,
	isprintable:		toc_isprint,
	disconnect:		toc_disconnect,
	signon:			toc_signon,
	get_info:		toc_get_info,
	set_info:		toc_set_info,
	set_away:		toc_set_away,
	set_nickname:		toc_set_nickname,
	set_password:		toc_set_password,
	set_privacy:		toc_set_privacy,
	im_add_buddy:		toc_im_add_buddy,
	im_remove_buddy:	toc_im_remove_buddy,
	im_add_deny:		toc_im_add_deny,
	im_remove_deny:		toc_im_remove_deny,
	im_upload_buddies:	toc_im_upload_buddies,
	im_upload_denies:	toc_im_upload_denies,
	im_send_message:	toc_im_send_message,
	im_send_action:		toc_im_send_action,
	im_evil:		toc_im_evil,
	chat_join:		toc_chat_join,
	chat_part:		toc_chat_part,
	chat_invite:		toc_chat_invite,
	chat_set_topic:		toc_chat_set_topic,
	chat_op:		toc_chat_op,
	chat_deop:		toc_chat_deop,
	chat_kick:		toc_chat_kick,
	chat_send_message:	toc_chat_send_message,
	chat_send_action:	toc_chat_send_action,
//	subcode_send_request:	toc_subcode_send_request,
//	subcode_send_reply:	toc_subcode_send_reply,
	subcode_encode:		toc_ctcp_encode,
	room_normalize:		aim_normalize_room_name,
	create_handle:		toc_create_handle,
	destroy_handle:		toc_destroy_handle,
#ifdef ENABLE_NEWGROUPS
	im_remove_group:	toc_im_remove_group,
#endif
#ifdef ENABLE_FILE_OFFER
	file_offer:		toc_file_offer,
#endif
};
centerim-4.22.10/firetalk/Makefile.am0000644000175000001440000000054011461606612014242 00000000000000noinst_LIBRARIES = libfiretalk.a
EXTRA_DIST = aim.c irc.c toc.c firetalk.c safestring.c oscar.c aim.h toc.h firetalk-int.h firetalk.h safestring.h oscar.h toc2_uuids.h
AUTOMAKE_OPTIONS = foreign
libfiretalk_a_SOURCES =  aim.c irc.c toc.c firetalk.c safestring.c oscar.c

SUBDIRS = 
AM_CPPFLAGS = -I$(top_srcdir)/../connwrap -I$(top_srcdir)/../connwrap
centerim-4.22.10/firetalk/toc.h0000644000175000001440000000774711461606612013164 00000000000000/*
toc.h - FireTalk TOC protocol declarations
Copyright (C) 2000 Ian Gulliver

This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.

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 _TOC_H
#define _TOC_H

#include "firetalk.h"
#include "firetalk-int.h"
#include 
#include 

/* AOL/TOC Functions */
client_t toc_create_handle();
void toc_destroy_handle(client_t c);

enum firetalk_error   toc_compare_nicks(const char * const nick1, const char * const nick2);
enum firetalk_error   toc_isprint(const int c);
enum firetalk_error   toc_disconnect(client_t c);
enum firetalk_error   toc_signon(client_t c, const char * const username);

enum firetalk_error   toc_preselect(client_t c, fd_set *read, fd_set *write, fd_set *except, int *n);
enum firetalk_error   toc_postselect(client_t c, fd_set *read, fd_set *write, fd_set *except);

enum firetalk_error   toc_im_add_buddy(client_t c, const char * const nickname);
enum firetalk_error   toc_im_remove_buddy(client_t c, const char * const nickname);
enum firetalk_error   toc_im_add_deny(client_t c, const char * const nickname);
enum firetalk_error   toc_im_remove_deny(client_t c, const char * const nickname);
enum firetalk_error   toc_im_upload_buddies(client_t c);
enum firetalk_error   toc_im_upload_denies(client_t c);
enum firetalk_error   toc_im_send_message(client_t c, const char * const dest, const char * const message, const int auto_flag);
enum firetalk_error   toc_im_send_action(client_t c, const char * const dest, const char * const message, const int auto_flag);
enum firetalk_error   toc_im_evil(client_t c, const char * const who);

enum firetalk_error   toc_chat_join(client_t c, const char * const room, const char * const password);
enum firetalk_error   toc_chat_set_topic(client_t c, const char * const room, const char * const topic);
enum firetalk_error   toc_chat_op(client_t c, const char * const room, const char * const who);
enum firetalk_error   toc_chat_deop(client_t c, const char * const room, const char * const who);
enum firetalk_error   toc_chat_kick(client_t c, const char * const room, const char * const who, const char * const reason);
enum firetalk_error   toc_chat_send_message(client_t c, const char * const room, const char * const message, const int auto_flag);
enum firetalk_error   toc_chat_send_action(client_t c, const char * const room, const char * const message, const int auto_flag);
enum firetalk_error   toc_chat_invite(client_t c, const char * const room, const char * const who, const char * const message);

enum firetalk_error   toc_subcode_send_request(client_t c, const char * const to, const char * const command, const char * const args);
enum firetalk_error   toc_subcode_send_reply(client_t c, const char * const to, const char * const command, const char * const args);

enum firetalk_error   toc_save_config(client_t c);
enum firetalk_error   toc_get_info(client_t c, const char * const nickname);
enum firetalk_error   toc_set_info(client_t c, const char * const info);
enum firetalk_error   toc_set_away(client_t c, const char * const message);
enum firetalk_error   toc_set_nickname(client_t c, const char * const nickname);
enum firetalk_error   toc_set_password(client_t c, const char * const oldpass, const char * const newpass);
enum firetalk_error   toc_got_data(client_t c, unsigned char * buffer, unsigned short * bufferpos);
enum firetalk_error   toc_got_data_connecting(client_t c, unsigned char * buffer, unsigned short * bufferpos);
enum firetalk_error   toc_periodic(firetalk_t c);

#endif
centerim-4.22.10/firetalk/aim.h0000644000175000001440000000177111461606612013134 00000000000000/*
aim.h - FireTalk generic AIM declarations
Copyright (C) 2000 Ian Gulliver

This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.

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 _AIM_H
#define _AIM_H

#include 
#include 

char *aim_interpolate_variables(const char *const input, const char *const nickname);
const char *aim_normalize_room_name(const char *const name);
char *aim_handle_ect(void *conn, const char *const from, char *message, const int reply);

#endif
centerim-4.22.10/firetalk/safestring.h0000644000175000001440000000227311461606612014531 00000000000000/*
safestring.h - FireTalk generic AIM declarations
Copyright (C) 2000 Ian Gulliver

This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.

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 _SAFESTRING_H
#define _SAFESTRING_H

#include 

void *safe_malloc(const size_t size);
void *safe_realloc(void *old, const size_t new);
char *safe_strdup(const char * const input);
void safe_strncpy(char * const to, const char * const from, const size_t size);
void safe_strncat(char * const to, const char * const from, const size_t size);
void safe_snprintf(char *out, const size_t size, char * const format, ...);
int safe_strncasecmp(const char *s1, const char *s2, size_t n);

#endif
centerim-4.22.10/firetalk/aim.c0000644000175000001440000001242511461606612013125 00000000000000/*
aim.c - FireTalk generic AIM definitions
Copyright (C) 2000 Ian Gulliver

This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.

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 "firetalk-int.h"
#include "firetalk.h"
#include "aim.h"

#include 
#include 
#include 

char	*aim_interpolate_variables(const char *const input, const char *const nickname) {
	static char output[16384]; /* 2048 / 2 * 16 + 1 (max size with a string full of %n's, a 16-char nick and a null at the end) */
	int o = 0,gotpercent = 0;
	size_t nl,dl,tl,l,i;
	char date[15],tim[15];

	{ /* build the date and time */
		int hour;
		int am = 1;
		struct tm *t;
		time_t b;
		b = time(NULL);
		t = localtime(&b);
		if (t == NULL)
			return NULL;
		hour = t->tm_hour;
		if (hour >= 12)
			am = 0;
		if (hour > 12)
			hour -= 12;
		if (hour == 0)
			hour = 12;
		snprintf(tim, sizeof(tim), "%d:%02d:%02d %s", hour, t->tm_min, t->tm_sec, (am == 1)?"AM":"PM");
		snprintf(date, sizeof(date), "%d/%d/%d", t->tm_mon+1, t->tm_mday, t->tm_year+1900);
	}
	nl = strlen(nickname);
	dl = strlen(date);
	tl = strlen(tim);
	l = strlen(input);
	for (i = 0; i < l; i++)
		switch (input[i]) {
		  case '%':
			if (gotpercent == 1) {
				gotpercent = 0;
				output[o++] = '%';
				output[o++] = '%';
			} else
				gotpercent = 1;
			break;
		  case 'n':
			if (gotpercent == 1) {
				gotpercent = 0;
				memcpy(&output[o],nickname,nl);
				o += nl;
			} else
				output[o++] = 'n';
			break;
		  case 'd':
			if (gotpercent == 1) {
				gotpercent = 0;
				memcpy(&output[o],date,dl);
				o += dl;
			} else
				output[o++] = 'd';
			break;
		  case 't':
			if (gotpercent == 1) {
				gotpercent = 0;
				memcpy(&output[o],tim,tl);
				o += tl;
			} else
				output[o++] = 't';
			break;
		  default:
			if (gotpercent == 1) {
				gotpercent = 0;
				output[o++] = '%';
			}
			output[o++] = input[i];
		}
	output[o] = '\0';
	return output;
}

const char *aim_normalize_room_name(const char *const name) {
	static char newname[2048];

	if (name == NULL)
		return(NULL);
	if (strchr(name+1, ':') != NULL)
		return name;
	if (strlen(name) >= (sizeof(newname)-2))
		return(NULL);

	strcpy(newname, "4:");
	strcpy(newname+2, name);

	return(newname);
}

#define STRNCMP(x,y)	(strncmp((x), (y), sizeof(y)-1))
static char
	*htmlclean(const char *str) {
	static char
		buf[2048];
	int	i, b = 0;

	for (i = 0; (str[i] != 0) && (b < sizeof(buf)-1); i++)
		if (STRNCMP(str+i, ">") == 0) {
			buf[b++] = '>';
			i += sizeof(">")-2;
		} else if (STRNCMP(str+i, "<") == 0) {
			buf[b++] = '<';
			i += sizeof("<")-2;
		} else if (STRNCMP(str+i, """) == 0) {
			buf[b++] = '"';
			i += sizeof(""")-2;
		} else if (STRNCMP(str+i, " ") == 0) {
			buf[b++] = ' ';
			i += sizeof(" ")-2;
		} else if (STRNCMP(str+i, "&") == 0) {
			buf[b++] = '&';
			i += sizeof("&")-2;
		} else
			buf[b++] = str[i];
	buf[b] = 0;

	return(buf);
}
#undef STRNCMP

#define ECT_TOKEN	""
char	*aim_handle_ect(void *conn, const char *const from,
		char *message, const int reply) {
	char	*ectbegin, *ectend, *textbegin, *textend;

	while ((ectbegin = strstr(message, ECT_TOKEN)) != NULL) {
		textbegin = ectbegin+sizeof(ECT_TOKEN)-1;

		if ((textend = strstr(textbegin, ECT_ENDING)) != NULL) {
			char	*arg;

			*textend = 0;
			ectend = textend+sizeof(ECT_ENDING)-1;

			if ((arg = strchr(textbegin, ' ')) != NULL) {
				*arg = '\0';
				arg++;
				if (reply == 1)
					firetalk_callback_subcode_reply(conn, from, textbegin, htmlclean(arg));
				else
					firetalk_callback_subcode_request(conn, from, textbegin, htmlclean(arg));
			} else {
				if (reply == 1)
					firetalk_callback_subcode_reply(conn, from, textbegin, NULL);
				else
					firetalk_callback_subcode_request(conn, from, textbegin, NULL);
			}
			memmove(ectbegin, ectend, strlen(ectend)+1);
		} else
			break;
	}
	return message;
}

const char *firetalk_nhtmlentities(const char *str, int len) {
	static char buf[1024];
	int	i, b = 0;

	for (i = 0; (str[i] != 0) && (b < sizeof(buf)-6-1) && ((len < 0) || (i < len)); i++)
		switch (str[i]) {
		  case '<':
			buf[b++] = '&';
			buf[b++] = 'l';
			buf[b++] = 't';
			buf[b++] = ';';
			break;
		  case '>':
			buf[b++] = '&';
			buf[b++] = 'g';
			buf[b++] = 't';
			buf[b++] = ';';
			break;
		  case '&':
			buf[b++] = '&';
			buf[b++] = 'a';
			buf[b++] = 'm';
			buf[b++] = 'p';
			buf[b++] = ';';
			break;
		  case '"':
			buf[b++] = '&';
			buf[b++] = 'q';
			buf[b++] = 'u';
			buf[b++] = 'o';
			buf[b++] = 't';
			buf[b++] = ';';
			break;
		  case '\n':
			buf[b++] = '<';
			buf[b++] = 'b';
			buf[b++] = 'r';
			buf[b++] = '>';
			break;
		  default:
			buf[b++] = str[i];
			break;
		}
	buf[b] = 0;
	return(buf);
}

const char *firetalk_htmlentities(const char *str) {
	return(firetalk_nhtmlentities(str, -1));
}
centerim-4.22.10/firetalk/toc2_uuids.h0000644000175000001440000001635711461606612014454 00000000000000static struct {
	const char *name;
	const int val;
} toc_firstcaps[] = {
	{ "WinAIM",	0x0000 },
	{ "AIM_Express",0x0002 },
	{ "ICQ2Go",	0x0210 },
};

static struct {
	const char *name;
	const int val;
} toc_barts[] = {
	{ "BUDDY_ICON_SMALL",	0 },
	{ "BUDDY_ICON",		1 },
	{ "STATUS_TEXT",	2 },
	{ "ARRIVE_SOUND",	3 },
	{ "DEPART_SOUND",	96 },
	{ "IM_BACKGROUND",	128 },
	{ "IM_CHROME",		129 },
	{ "IM_SKIN",		130 },
	{ "IM_SOUND",		131 },
	{ "BL_BACKGROUND",	256 },
	{ "BL_IMAGE",		257 },
	{ "BL_SKIN",		258 },
	{ "SMILEY_SET",		1024 },
	{ "MAIL_STATIONERY",	1025 },
};

static struct {
	const char *name;
	const int A1, A2, B, C, D, E1, E2, E3;
} toc_uuids[] = {
/*RV*/
	{ "ICHAT",			0x0946, 0x0000, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "SECURE_IM",			0x0946, 0x0001, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "VIDEO",			0x0946, 0x0100, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "LIVE_VIDEO",			0x0946, 0x0101, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "CAMERA",			0x0946, 0x0102, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "ICHATAV",			0x0946, 0x0105, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "SMS",			0x0946, 0x01FF, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "HIPTOP",			0x0946, 0x1323, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "AOL_TALK",			0x0946, 0x1341, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "DIRECT_PLAY",		0x0946, 0x1342, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "FILE_TRANSFER",		0x0946, 0x1343, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "ICQ_DIRECT_CONNECT",		0x0946, 0x1344, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "DIRECT_ICBM",		0x0946, 0x1345, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "AVATAR",			0x0946, 0x1346, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "COMMAND_LINE_GAMES",		0x0946, 0x1347, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "FILE_SHARING",		0x0946, 0x1348, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "ICQ_SERVER_RELAY",		0x0946, 0x1349, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "CHAT_ALLOW_ONLINE_HOST",	0x0946, 0x134A, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "SHARE_BUDDIES",		0x0946, 0x134B, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "PREAKNESS",			0x0946, 0x134D, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "ICQUTF8",			0x0946, 0x134E, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
	{ "CHAT",			0x748F, 0x2420, 0x6287, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },

     /*	{ "ICQ_FIRST",			0x0946, 0xE000, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 }, */
	{ "ICQ_WEBBIE",			0x0946, 0xE000, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 },
     /*	{ "ICQ_LAST",			0x0946, 0xE0FF, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 }, */

     /*	{ "APPLE_FIRST",		0x0946, 0xF000, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 }, */
     /*	{ "APPLE_LAST",			0x0946, 0xF00F, 0x4C7F, 0x11D1, 0x8222, 0x4445, 0x5354, 0x0000 }, */

/*AL*/	{ "MAIL",			0x5D5E, 0x1708, 0x55AA, 0x11D3, 0xB143, 0x0060, 0xB0FB, 0x1ECB },
	{ "NEWS",			0x5D5E, 0x1709, 0x55AA, 0x11D3, 0xB143, 0x0060, 0xB0FB, 0x1ECB },
	{ "STOCK",			0x5D5E, 0x170A, 0x55AA, 0x11D3, 0xB143, 0x0060, 0xB0FB, 0x1ECB },
	{ "WEATHER",			0x5D5E, 0x170E, 0x55AA, 0x11D3, 0xB143, 0x0060, 0xB0FB, 0x1ECB },
	{ "DRACULA",			0x7838, 0x2132, 0x8E20, 0x11D3, 0x9830, 0x8F6E, 0xD783, 0xEDD8 },
	{ "PICTURES",			0x58CF, 0x279A, 0x9911, 0x11D3, 0xA159, 0xD57F, 0xA28A, 0x7112 },
	{ "THIRD_PARTY",		0x9269, 0xD81C, 0xA6A2, 0x11D3, 0xAEE2, 0xE248, 0x9E91, 0xD6E7 },
	{ "NET2PHONE",			0x33DD, 0x2CBA, 0x0FDC, 0x11D4, 0xB073, 0xBC18, 0x38CE, 0xF8C8 },
	{ "RENDERED",			0xB380, 0x9AD8, 0x0DBA, 0x11D5, 0x9F8A, 0x0060, 0xB0EE, 0x0631 },

#if 0
/*FB*/	{ "FEEDBAG_BUDDY",		0x200A, 0x0000, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_GROUP",		0x200A, 0x0001, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_PERMIT",		0x200A, 0x0002, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_DENY",		0x200A, 0x0003, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_PD_INFO",		0x200A, 0x0004, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_BUDDY_PREFS",	0x200A, 0x0005, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_NON_BUDDY",		0x200A, 0x0006, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_TPA_PROVIDER",	0x200A, 0x0007, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_TPA_SUBSCRIPTION",	0x200A, 0x0008, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_CLIENT_PREFS",	0x200A, 0x0009, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_STOCK",		0x200A, 0x000A, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_WEATHER",		0x200A, 0x000B, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_WATCH",		0x200A, 0x000D, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_IGNORE",		0x200A, 0x000E, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_TIMESTAMP",		0x200A, 0x000F, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_EXTERNAL",		0x200A, 0x0010, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_FISH",		0x200A, 0x0012, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
	{ "FEEDBAG_BART",		0x200A, 0x0014, 0xA289, 0x11D3, 0xA52D, 0x0010, 0x8334, 0x1CFA },
#endif

#if 0
/*ES*/	{ "SERVICE_IMAP4",		0x3E80, 0x01DA, 0xDE70, 0x11D3, 0xA57D, 0x0010, 0x8334, 0x1CFA },
	{ "SERVICE_IMAP4_AOL",		0x5000, 0x0000, 0x2A9A, 0x11D5, 0x808A, 0x0060, 0xB0EE, 0x0631 },
	{ "SERVICE_IMAP4_NS",		0x5001, 0x0000, 0x2A9A, 0x11D5, 0x808A, 0x0060, 0xB0EE, 0x0631 },
	{ "SERVICE_SMTP",		0x3E80, 0x01DB, 0xDE70, 0x11D3, 0xA57D, 0x0010, 0x8334, 0x1CFA },
	{ "SERVICE_SMTP_AOL",		0x5000, 0x0001, 0x2A9A, 0x11D5, 0x808A, 0x0060, 0xB0EE, 0x0631 },
	{ "SERVICE_SMTP_NS",		0x5001, 0x0001, 0x2A9A, 0x11D5, 0x808A, 0x0060, 0xB0EE, 0x0631 },
	{ "SERVICE_ADDRBOOK",		0x3FF9, 0xB60D, 0xC55B, 0x4D4F, 0xB9D0, 0xCA6A, 0x0F57, 0x83BE },
	{ "SERVICE_ADDRBOOK_AOL",	0x5000, 0x0002, 0x2A9A, 0x11D5, 0x808A, 0x0060, 0xB0EE, 0x0631 },
	{ "SERVICE_ADDRBOOK_NS",	0x5001, 0x0002, 0x2A9A, 0x11D5, 0x808A, 0x0060, 0xB0EE, 0x0631 },
	{ "SERVICE_ADDRBOOK_AIM",	0x5002, 0x0002, 0x2A9A, 0x11D5, 0x808A, 0x0060, 0xB0EE, 0x0631 },
	{ "SERVICE_WEBMAIL",		0x7F53, 0xF598, 0x05AA, 0x11D4, 0xA5AD, 0x0010, 0x8334, 0x1CFA },
	{ "SERVICE_MAGIC_CARPET",	0xC28E, 0x07EC, 0x4486, 0x11D5, 0x9673, 0x0060, 0xB0EE, 0x0631 },
#endif

/*??*/	{ "ICQ_CLIENT_EVENTS",		0x563F, 0xC809, 0x0B6F, 0x41BD, 0x9F79, 0x4226, 0x09DF, 0xA2F3 },
	{ "FF_SPORTS",			0x6740, 0x0B76, 0x3516, 0x11D5, 0x8B6C, 0x0060, 0xB0EE, 0x0631 },
	{ "MAIL2",			0x8435, 0x0CC8, 0xE401, 0x11D5, 0x9754, 0x0060, 0xB0EE, 0x0631 },
	{ "ICQ_WINRTF",			0x97B1, 0x2751, 0x243C, 0x4334, 0xAD22, 0xD6AB, 0xF73F, 0x1492 },
	{ "ICQ_MAC",			0xDD16, 0xF202, 0x84E6, 0x11D4, 0x90DB, 0x0010, 0x4B9B, 0x4B7D },
	{ "ICQ_UTF8",			0x2E7A, 0x6475, 0xFADF, 0x4DC8, 0x886F, 0xEA35, 0x95FD, 0xB6DF },
	{ "OCW",			0x373B, 0x649A, 0x780C, 0x11D6, 0x8459, 0x0060, 0xB0EE, 0x0631 },
	{ "REMINDERS",			0x3B40, 0x56D2, 0x7457, 0x11D4, 0xA1D5, 0xDC24, 0x3835, 0xAD24 },
	{ "FF_NEWS",			0x3DFA, 0x0724, 0x2AD7, 0x11D5, 0x9773, 0x0060, 0xB0EE, 0x0631 },

	{ "TRILLIAN_CRYPT",		0xF2E7, 0xC7F4, 0xFEAD, 0x4DFB, 0xB235, 0x3679, 0x8BDF, 0x0000 },

	{ "THIRD_PARTY_RANGE",		0xFFFF, 0xFFFF,     -1,     -1,     -1,     -1,     -1,     -1 },
};
centerim-4.22.10/firetalk/oscar.c0000644000175000001440000000547611461606612013476 00000000000000/*
oscar.c - FireTalk OSCAR protocol definitions
Copyright (C) 2000 Ian Gulliver

This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.

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

midendian can suck my left nut.

*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include "firetalk-int.h"
#include "firetalk.h"
#include "oscar.h"

#define LOGIN_SERVER "login.oscar.aol.com"
#define LOGIN_PORT 443

struct s_oscar_flap {
	unsigned char command_start;
	unsigned char channel_id;
	unsigned short sequence_number;
	unsigned short data_length;
};

struct s_oscar_connection {
	int s;
	unsigned short local_sequence;
	unsigned short remote_sequence;
	char *cookie;
};

#define FLAP_CHANNEL_NEWCON 0x01
#define FLAP_CHANNEL_SNAC   0x02
#define FLAP_CHANNEL_ERROR  0x03
#define FLAP_CHANNEL_CLOSE  0x04

static int oscar_internal_disconnect(struct s_oscar_connection * const c, const int error);
static int oscar_send_flap(struct s_oscar_connection * const c, const unsigned char channel_id, const unsigned short length, const char * const data);
static int oscar_get_cookie(struct s_oscar_connection * const c);

static int oscar_internal_disconnect(struct s_oscar_connection * const c, const int error) {
	close(c->s);
	free(c);
	firetalkerror = error;
	firetalk_callback_disconnect(c,error);
	firetalkerror = FE_SUCCESS;
	return FE_SUCCESS;
}

static int oscar_send_flap(struct s_oscar_connection * const c, const unsigned char channel_id, const unsigned short length, const char * const data) {
	static struct s_oscar_flap header = { (unsigned char)0x2a, '\0', 0x0000, 0x0000 };

	header.channel_id = channel_id;
	header.sequence_number = c->local_sequence++;
	header.data_length = length;
	if (send(c->s,&header,sizeof(struct s_oscar_flap),0) != sizeof(struct s_oscar_flap)) {
		(void) oscar_internal_disconnect(c,FE_PACKET);
		firetalkerror = FE_PACKET;
		return FE_PACKET;
	}
	if (send(c->s,data,length,0) != length) {
		(void) oscar_internal_disconnect(c,FE_PACKET);
		firetalkerror = FE_PACKET;
		return FE_PACKET;
	}
	firetalkerror = FE_SUCCESS;
	return FE_SUCCESS;
}

static int oscar_get_cookie(struct s_oscar_connection * const c) {
	return 0;
}
centerim-4.22.10/firetalk/irc.c0000644000175000001440000012523611461606612013141 00000000000000/*
irc.c - FireTalk IRC protocol driver
Copyright (C) 2000 Ian Gulliver
Copyright 2002-2006 Daniel Reed 

This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.

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 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define ROOMSTARTS "#+&"


static char irc_tolower(const char c) {
	if ((c >= 'A') && (c <= 'Z'))
		return((c - 'A') + 'a');
	if (c == '[')
		return('{');
	if (c == ']')
		return('{');
	if (c == '\\')
		return('|');
	return(c);
}

static int irc_compare_nicks_int(const char *const nick1, const char *const nick2) {
	int	i = 0;

	while (nick1[i] != '\0') {
		if (irc_tolower(nick1[i]) != irc_tolower(nick2[i]))
			return(1);
		i++;
	}
	if (nick2[i] != '\0')
		return(1);

	return(0);
}

struct s_irc_whois {
	struct s_irc_whois *next;
	char	*nickname,
		*info;
	int	flags;
	long	online,
		idle;
};

typedef struct irc_conn_t *client_t;
#define _HAVE_CLIENT_T
#include "firetalk-int.h"

typedef struct irc_conn_t {
	char	*nickname,
		*password,
		 buffer[512+1];
	struct s_irc_whois
		*whois_head;
	int	 passchange;	/* whether we are currently changing our pass */
	unsigned char
		 usesilence:1,	/* are we on a network that understands SILENCE */
		 identified:1;	/* are we we identified */
} irc_conn_t;

#if 0
static const char *const irc_normalize_user_nick(const char *const name) {
	static char
		buf[512];
	int	i;

	if (strchr(name, '!') == NULL)
		return(name);

	for (i = 0; (i < sizeof(buf)) && (name[i] != '!'); i++)
		buf[i] = name[i];
	buf[i] = 0;
	return(buf);
}

static const char *const irc_normalize_user_mask(const char *const name) {
	static char
		buf[512];

	if (strchr(name, '!') != NULL)
		return(name);

	snprintf(buf, sizeof(buf), "%s!*@*", name);
	return(buf);
}
#endif

static void irc_disc_user_rem(irc_conn_t *c, const char *disc, const char *name) {
	struct s_firetalk_handle *fchandle;

	fchandle = firetalk_find_handle(c);

	if (firetalk_user_visible_but(fchandle, disc, name) == FE_NOMATCH)
		firetalk_callback_im_buddyonline(c, name, 0);
}

static void irc_disc_rem(irc_conn_t *c, const char *disc) {
	struct s_firetalk_handle *fchandle;
	struct s_firetalk_room *iter;
	struct s_firetalk_member *mem;

	fchandle = firetalk_find_handle(c);
	iter = firetalk_find_room(fchandle, disc);
	assert(iter != NULL);

	for (mem = iter->member_head; mem != NULL; mem = mem->next)
		irc_disc_user_rem(c, disc, mem->nickname);
}

static const char *irc_normalize_room_name(const char *const name) {
	static char	newname[2048];

	if (strchr(ROOMSTARTS, *name))
		return(name);
	snprintf(newname, sizeof(newname), "#%s", name);
	return(newname);
}



#include "firetalk.h"



#ifdef DEBUG_ECHO
extern void *curconn;
extern void status_echof(void *conn, const unsigned char *format, ...);

static void irc_echof(irc_conn_t *c, const char *const where, const char *const format, ...) {
	va_list	ap;
	char	buf[513];
	void	statrefresh(void);

	va_start(ap, format);
	vsnprintf(buf, sizeof(buf), format, ap);
	va_end(ap);

	while (buf[strlen(buf)-1] == '\n')
		buf[strlen(buf)-1] = 0;
	if (*buf != 0)
		status_echof(curconn, firetalk_htmlentities(buf));
//		firetalk_callback_chat_getmessage(c, ":RAW", where, 0, buf);

	statrefresh();
}
#endif

static fte_t irc_compare_nicks(const char *const nick1, const char *const nick2) {
	if (irc_compare_nicks_int(nick1, nick2) == 0)
		return(FE_SUCCESS);
	return(FE_NOMATCH);
}

static fte_t
	irc_isprint(const int c) {
	if (isprint(c))
		return(FE_SUCCESS);
	return(FE_INVALIDFORMAT);
}

static fte_t
	irc_isnickfirst(const int c) {
	return(isalpha(c) || (c == '[') || (c == ']') || (c == '\\') || (c == '`') || (c == '^') || (c == '{') || (c == '}'));
}

static fte_t
	irc_isnick(const int c) {
	return(irc_isnickfirst(c) || isdigit(c) || (c == '-'));
}

static char *irc_html_to_irc(const char *const string) {
	return string;
/*
	static char *output = NULL;
	int o = 0;
	size_t l,i=0;

	l = strlen(string);

	output = realloc(output, (l * 4) + 1);
	if (output == NULL)
		abort();

	while (i < l) {
		assert(o < ((l * 4) + 1));
		switch(string[i]) {
			case '&':
				if (!strncasecmp(&string[i],"&",5)) {
					output[o++] = '&';
					i += 5;
				} else if (!strncasecmp(&string[i],">",4)) {
					output[o++] = '>';
					i += 4;
				} else if (!strncasecmp(&string[i],"<",4)) {
					output[o++] = '<';
					i += 4;
				} else if (!strncasecmp(&string[i]," ",6)) {
					output[o++] = ' ';
					i += 6;
				} else
					output[o++] = string[i++];
				break;
			case '<':
				if (!strncasecmp(&string[i],"",3)) {
					output[o++] = (char) 2;
					i += 3;
				} else if (!strncasecmp(&string[i],"",4)) {
					output[o++] = (char) 2;
					i += 4;
				} else if (!strncasecmp(&string[i],"",3)) {
					output[o++] = (char) 22;
					i += 3;
				} else if (!strncasecmp(&string[i],"",4)) {
					output[o++] = (char) 22;
					i += 4;
				} else if (!strncasecmp(&string[i],"",3)) {
					output[o++] = (char) 31;
					i += 3;
				} else if (!strncasecmp(&string[i],"",4)) {
					output[o++] = (char) 31;
					i += 4;
				} else if (!strncasecmp(&string[i],"
",4)) { output[o++] = '\020'; output[o++] = 'r'; output[o++] = '\020'; output[o++] = 'n'; i += 4; } else output[o++] = string[i++]; break; case '\r': output[o++] = '\020'; output[o++] = 'r'; i++; break; case '\n': output[o++] = '\020'; output[o++] = 'n'; i++; break; case '\020': output[o++] = '\020'; output[o++] = '\020'; i++; break; default: output[o++] = string[i++]; break; } } assert(o <= ((l * 4) + 1)); output[o] = '\0'; return(output); */ } static const char *mIRCar[] = { "#FFFFFF", // 0 white "#000000", // 1 black "#0000FF", // 2 blue (navy) "#00FF00", // 3 green "#FF0000", // 4 red "#4E2F2F", // 5 brown (maroon) "#AA00FF", // 6 purple "#FF7700", // 7 orange (olive) "#FFFF00", // 8 yellow "#32CD32", // 9 lt.green (lime) "#349F79", // 10 teal (a kinda green/blue cyan) "#70DB93", // 11 lt.cyan (cyan ?) (aqua) "#3333FF", // 12 lt.blue (royal) "#FF00AA", // 13 pink (light purple) (fuchsia) "#A8A8A8", // 14 grey "#E6E8FA" // 15 lt.grey (silver) }; static const char *ANSIar[] = { "#000000", // 30 black "#FF0000", // 31 red "#00FF00", // 32 green "#FFFF00", // 33 yellow "#0000FF", // 34 blue "#FF00FF", // 35 magenta (purple) "#00FFFF", // 36 cyan (aqua) "#FFFFFF", // 37 white }; static const char *irc_mIRC_to_html(const char *const string, size_t *pos) { int i, col = 0; for (i = 0; (i < 2) && isdigit(string[*pos]); i++, (*pos)++) { col *= 10; col += string[*pos] - '0'; } if (string[*pos] == ',') { (*pos)++; for (i = 0; (i < 2) && isdigit(string[*pos]); i++, (*pos)++) ; } if ((col >= 0) && (col <= 15)) return(mIRCar[col]); else return("#000000"); } static char *irc_irc_to_html(const char *const string) { return string; /* static char *output = NULL; int o = 0; size_t l, i = 0, s; int infont = 0, inbold = 0, initalics = 0, inunderline = 0; assert(string != NULL); l = strlen(string); s = l*(sizeof("")-1) + 1; output = realloc(output, s); if (output == NULL) abort(); while (i < l) { switch(string[i]) { case 2: if (inbold == 1) { memcpy(&output[o],"",4); o += 4; inbold = 0; } else { memcpy(&output[o],"",3); o += 3; inbold = 1; } break; case 3: if (isdigit(string[i+1])) { i++; sprintf(output+o, "", irc_mIRC_to_html(string, &i)); o += sizeof("")-1; infont = 1; i--; } else if (infont == 1) { strcpy(output+o, ""); o += sizeof("")-1; infont = 0; } break; case 15: if (infont == 1) { strcpy(output+o, ""); o += sizeof("")-1; infont = 0; } if (inbold == 1) { strcpy(output+o, ""); o += sizeof("")-1; inbold = 0; } if (initalics == 1) { strcpy(output+o, ""); o += sizeof("")-1; initalics = 0; } if (inunderline == 1) { strcpy(output+o, ""); o += sizeof("")-1; inunderline = 0; } break; case 27: if (string[i+1] == '[') { i += 2; while ((string[i] != 0) && (string[i] != 'm')) { int num = 0; if (!isdigit(string[i])) break; while (isdigit(string[i])) { num *= 10; num += string[i] - '0'; i++; } if (string[i] == ';') i++; switch (num) { case 0: if (infont == 1) { strcpy(output+o, ""); o += sizeof("")-1; infont = 0; } if (inbold == 1) { strcpy(output+o, ""); o += sizeof("")-1; inbold = 0; } if (initalics == 1) { strcpy(output+o, ""); o += sizeof("")-1; initalics = 0; } if (inunderline == 1) { strcpy(output+o, ""); o += sizeof("")-1; inunderline = 0; } break; case 1: if (inbold == 0) { strcpy(output+o, ""); o += sizeof("")-1; inbold = 1; } break; case 2: if (inbold == 1) { strcpy(output+o, ""); o += sizeof("")-1; inbold = 0; } break; case 3: if (inunderline == 0) { strcpy(output+o, ""); o += sizeof("")-1; inunderline = 1; } break; case 7: if (initalics == 0) { strcpy(output+o, ""); o += sizeof("")-1; initalics = 1; } break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: sprintf(output+o, "", ANSIar[num-30]); o += sizeof("")-1; infont = 1; break; } } if (string[i] == 0) i--; } break; case 22: if (initalics == 1) { memcpy(&output[o],"",4); o += 4; initalics = 0; } else { memcpy(&output[o],"",3); o += 3; initalics = 1; } break; case 31: if (inunderline == 1) { memcpy(&output[o],"",4); o += 4; inunderline = 0; } else { memcpy(&output[o],"",3); o += 3; inunderline = 1; } break; case '&': memcpy(&output[o],"&",5); o += 5; break; case '<': memcpy(&output[o],"<",4); o += 4; break; case '>': memcpy(&output[o],">",4); o += 4; break; case 16: switch(string[++i]) { case 16: output[o++] = '\020'; break; case 'r': if (string[i+1] == '\020' && string[i+2] == 'n') { i += 2; memcpy(&output[o],"
",4); o += 4; } else output[o++] = '\r'; break; case 'n': output[o++] = '\n'; break; default: output[o++] = string[i]; break; } break; case ' ': if (string[i+1] == ' ') { memcpy(&output[o], " ", 6); o += 6; break; } default: output[o++] = string[i]; break; } i++; } output[o] = '\0'; return(output);*/ } static int irc_internal_disconnect(irc_conn_t *c, const int error) { struct s_irc_whois *whois_iter, *whois_iter2; if (c->nickname != NULL) { free(c->nickname); c->nickname = NULL; } if (c->password != NULL) { free(c->password); c->password = NULL; } for (whois_iter = c->whois_head; whois_iter != NULL; whois_iter = whois_iter2) { whois_iter2 = whois_iter->next; if (whois_iter->nickname != NULL) { free(whois_iter->nickname); whois_iter->nickname = NULL; } if (whois_iter->info != NULL) { free(whois_iter->info); whois_iter->info = NULL; } free(whois_iter); } c->whois_head = NULL; c->passchange = 0; c->usesilence = 1; c->identified = 0; firetalk_callback_disconnect(c, error); return(FE_SUCCESS); } static int irc_send_printf(irc_conn_t *c, const char *const format, ...) { va_list ap; size_t i, datai = 0; char data[513]; va_start(ap, format); for (i = 0; format[i] != 0; i++) { if (format[i] == '%') { switch (format[++i]) { case 's': { const char *s = irc_html_to_irc(va_arg(ap, char *)); size_t slen = strlen(s); if ((datai+slen) > (sizeof(data)-2-1)) return(FE_PACKETSIZE); strcpy(data+datai, s); datai += slen; break; } case '%': data[datai++] = '%'; break; } } else { data[datai++] = format[i]; if (datai > (sizeof(data)-2-1)) return(FE_PACKETSIZE); } } va_end(ap); data[datai] = 0; #ifdef DEBUG_ECHO irc_echof(c, "send_printf", "%s", data); #endif strcpy(data+datai, "\r\n"); datai += 2; { struct s_firetalk_handle *fchandle; fchandle = firetalk_find_handle(c); firetalk_internal_send_data(fchandle, data, datai); } return(FE_SUCCESS); } static char **irc_recv_parse(irc_conn_t *c, unsigned char *buffer, unsigned short *bufferpos) { static char *args[256]; static char data[513]; size_t curarg; char *tempchr; char *tempchr2; args[0] = NULL; assert(*bufferpos < sizeof(data)); memcpy(data, buffer, *bufferpos); data[*bufferpos] = '\0'; tempchr = strchr(data, '\n'); if (tempchr == NULL) return(NULL); if ((tempchr > data) && (tempchr[-1] == '\r')) tempchr[-1] = 0; else tempchr[0] = 0; *bufferpos -= (tempchr - data + 1); memmove(buffer, &buffer[tempchr - data + 1], *bufferpos); #ifdef DEBUG_ECHO irc_echof(c, "recv_parse", "%s", data); #endif curarg = 0; tempchr = data; if (*tempchr == ':') tempchr++; else args[curarg++] = ":SERVER"; while ((curarg < sizeof(args)/sizeof(*args)) && ((tempchr2 = strchr(tempchr, ' ')) != NULL)) { args[curarg++] = tempchr; *tempchr2 = 0; tempchr = tempchr2 + 1; if (*tempchr == ':') { tempchr++; break; } } args[curarg++] = tempchr; args[curarg] = NULL; return(args); } static char *irc_get_nickname(const char *const hostmask) { static char data[512]; char *tempchr; strncpy(data, hostmask, sizeof(data)-1); data[sizeof(data)-1] = 0; if ((tempchr = strchr(data, '!')) != NULL) *tempchr = 0; return(data); } static fte_t irc_set_nickname(irc_conn_t *c, const char *const nickname) { return(irc_send_printf(c,"NICK %s",nickname)); } static fte_t irc_set_password(irc_conn_t *c, const char *const oldpass, const char *const newpass) { c->passchange++; return(irc_send_printf(c,"PRIVMSG NickServ :SET PASSWORD %s",newpass)); } static void irc_destroy_handle(irc_conn_t *c) { irc_send_printf(c,"QUIT :Handle destroyed"); irc_internal_disconnect(c,FE_USERDISCONNECT); free(c); } static fte_t irc_disconnect(irc_conn_t *c) { irc_send_printf(c,"QUIT :User disconnected"); return(irc_internal_disconnect(c,FE_USERDISCONNECT)); } static irc_conn_t *irc_create_handle(void) { irc_conn_t *c; c = calloc(1, sizeof(*c)); if (c == NULL) abort(); c->usesilence = 1; return(c); } #if defined(HAVE_GETPWUID) && defined(HAVE_GETUID) # include #endif static fte_t irc_signon(irc_conn_t *c, const char *const nickname) { char pass[129]; *pass=0; firetalk_callback_needpass(c, pass, sizeof(pass)); if(strlen(pass)) if(irc_send_printf(c, "PASS %s", pass) != FE_SUCCESS) return FE_PACKET; #if defined(HAVE_GETPWUID) && defined(HAVE_GETUID) struct passwd *pw = getpwuid(getuid()); char buf[1024]; int i; for (i = 0; (pw->pw_gecos[i] != 0) && (pw->pw_gecos[i] != ',') && (i < sizeof(buf)-1); i++) buf[i] = pw->pw_gecos[i]; if (i == 0) { snprintf(buf, sizeof(buf), "http://www.centerim.org user"); i = strlen(buf); } buf[i] = 0; if (irc_send_printf(c, "USER %s %s %s :%s", pw->pw_name, nickname, nickname, buf) != FE_SUCCESS) return(FE_PACKET); #else if (irc_send_printf(c, "USER %s %s %s :%s", nickname, nickname, nickname, nickname) != FE_SUCCESS) return(FE_PACKET); #endif if (irc_send_printf(c, "NICK %s", nickname) != FE_SUCCESS) return(FE_PACKET); free(c->nickname); c->nickname = strdup(nickname); if (c->nickname == NULL) abort(); return(FE_SUCCESS); } static fte_t irc_preselect(irc_conn_t *c, fd_set *read, fd_set *write, fd_set *except, int *n) { return(FE_SUCCESS); } static fte_t irc_postselect(irc_conn_t *c, fd_set *read, fd_set *write, fd_set *except) { return(FE_SUCCESS); } static void irc_addwhois(irc_conn_t *c, const char *const name, const char *const format, ...) { struct s_irc_whois *whoisiter; char buf[1024]; va_list msg; va_start(msg, format); vsnprintf(buf, sizeof(buf), format, msg); va_end(msg); for (whoisiter = c->whois_head; whoisiter != NULL; whoisiter = whoisiter->next) if (irc_compare_nicks(name, whoisiter->nickname) == 0) { int len = whoisiter->info?strlen(whoisiter->info):0; whoisiter->info = realloc(whoisiter->info, len+strlen(buf)+1); if (whoisiter->info == NULL) abort(); strcpy(whoisiter->info+len, buf); break; } } static fte_t irc_got_data_parse(irc_conn_t *c, char **args) { struct s_irc_whois *whoisiter, *whoisiter2; char *tempchr; { static unsigned int inwhois = 0; int handled = 0, numeric; handled = 1; if (strcmp(args[1], "PING") == 0) { if (args[2] != NULL) { if (irc_send_printf(c, "PONG :%s", args[2]) != 0) { irc_internal_disconnect(c, FE_PACKET); return(FE_PACKET); } } else { if (irc_send_printf(c, "PONG") != 0) { irc_internal_disconnect(c, FE_PACKET); return(FE_PACKET); } } } else if (strcmp(args[1], "QUIT") == 0) { const char *name = irc_get_nickname(args[0]); firetalk_callback_im_buddyonline(c, name, 0); if (irc_compare_nicks(c->nickname, name) == 0) irc_internal_disconnect(c, FE_DISCONNECT); else firetalk_callback_chat_user_quit(c, name, irc_irc_to_html(args[2])); } else handled = 0; if (handled) return(FE_SUCCESS); numeric = atoi(args[1]); if (args[2] == NULL) goto unhandled; handled = 1; if (strcmp(args[1], "JOIN") == 0) { const char *name = irc_get_nickname(args[0]); firetalk_callback_im_buddyonline(c, name, 1); if (irc_compare_nicks(c->nickname, name) == 0) { firetalk_callback_chat_joined(c, args[2]); if (c->identified == 1) { if (irc_send_printf(c, "PRIVMSG ChanServ :OP %s %s", args[2], c->nickname) != FE_SUCCESS) { irc_internal_disconnect(c, FE_PACKET); return(FE_PACKET); } } } else { char *extra = strchr(args[0], '!'); firetalk_callback_chat_user_joined(c, args[2], name, (extra != NULL)?(extra+1):NULL); } } else if (strcmp(args[1], "PART") == 0) { const char *name = irc_get_nickname(args[0]); if (irc_compare_nicks(c->nickname, name) == 0) { irc_disc_rem(c, args[2]); firetalk_callback_chat_left(c, args[2]); } else { irc_disc_user_rem(c, args[2], name); firetalk_callback_chat_user_left(c, args[2], name, (args[3] != NULL)?irc_irc_to_html(args[3]):NULL); } } else if (strcmp(args[1],"NICK") == 0) { const char *name = irc_get_nickname(args[0]); if (irc_compare_nicks(c->nickname, name) == 0) { free(c->nickname); c->nickname = strdup(args[2]); if (c->nickname == NULL) abort(); firetalk_callback_newnick(c, c->nickname); } firetalk_callback_user_nickchanged(c, name, args[2]); } else handled = 0; if (handled) return(FE_SUCCESS); if (args[3] == NULL) goto unhandled; handled = 1; if (strcmp(args[1],"PRIVMSG") == 0) { /* scan for CTCPs */ while ((tempchr = strchr(args[3], 1))) { char *sp; if ((sp = strchr(tempchr+1, 1))) { *sp = 0; /* we have a ctcp */ if (strchr(ROOMSTARTS, args[2][0])) { /* chat room subcode */ if (strncasecmp(&tempchr[1],"ACTION ",7) == 0) firetalk_callback_chat_getaction(c, args[2], irc_get_nickname(args[0]), 0, irc_irc_to_html(tempchr+8)); } else { char *endcommand; endcommand = strchr(&tempchr[1], ' '); if (endcommand) { *endcommand = '\0'; endcommand++; firetalk_callback_subcode_request(c, irc_get_nickname(args[0]), &tempchr[1], endcommand); } else firetalk_callback_subcode_request(c, irc_get_nickname(args[0]), &tempchr[1], NULL); } memmove(tempchr, sp+1, strlen(sp+1) + 1); } else break; } if (args[3][0] != '\0') { if (strchr(ROOMSTARTS, args[2][0])) firetalk_callback_chat_getmessage(c, args[2], irc_get_nickname(args[0]), 0, irc_irc_to_html(args[3])); else firetalk_callback_im_getmessage(c, irc_get_nickname(args[0]), 0, irc_irc_to_html(args[3])); } } else if (strcmp(args[1],"NOTICE") == 0) { const char *name = irc_get_nickname(args[0]); /* scan for CTCP's */ while ((tempchr = strchr(args[3], 1))) { char *sp; if ((sp = strchr(tempchr+1, 1))) *sp = 0; /* we have a ctcp */ if (strchr(ROOMSTARTS, args[2][0]) == NULL) { char *endcommand; endcommand = strchr(&tempchr[1], ' '); if (endcommand) { *endcommand = '\0'; endcommand++; firetalk_callback_subcode_reply(c, name, &tempchr[1], endcommand); } else firetalk_callback_subcode_reply(c, name, &tempchr[1], NULL); } if (sp) memcpy(tempchr, sp+1, strlen(sp+1) + 1); else break; } if (strcasecmp(name, "NickServ") == 0) { if ((strstr(args[3],"IDENTIFY") != NULL) && (strstr(args[3],"/msg") != NULL) && (strstr(args[3],"HELP") == NULL)) { c->identified = 0; /* nickserv seems to be asking us to identify ourselves, and we have a password */ if (!c->password) { c->password = calloc(1, 128); if (c->password == NULL) abort(); firetalk_callback_needpass(c,c->password,128); } if ((c->password != NULL) && irc_send_printf(c,"PRIVMSG NickServ :IDENTIFY %s",c->password) != 0) { irc_internal_disconnect(c,FE_PACKET); return(FE_PACKET); } } else if ((strstr(args[3],"Password changed") != NULL) && (c->passchange != 0)) { /* successful change */ c->passchange--; firetalk_callback_passchanged(c); } else if ((strstr(args[3],"authentication required") != NULL) && (c->passchange != 0)) { /* didn't log in with the right password initially, not happening */ c->identified = 0; c->passchange--; firetalk_callback_error(c,FE_NOCHANGEPASS,NULL,args[3]); } else if ((strstr(args[3],"isn't registered") != NULL) && (c->passchange != 0)) { /* nick not registered, fail */ c->passchange--; firetalk_callback_error(c,FE_NOCHANGEPASS,NULL,args[3]); } else if (strstr(args[3],"Password accepted") != NULL) { /* we're recognized */ c->identified = 1; if (irc_send_printf(c,"PRIVMSG ChanServ :OP ALL") != FE_SUCCESS) { irc_internal_disconnect(c,FE_PACKET); return(FE_PACKET); } } else if (strchr(ROOMSTARTS, args[2][0])) firetalk_callback_chat_getmessage(c, args[2], name, 1, irc_irc_to_html(args[3])); else firetalk_callback_im_getmessage(c, name, 1, irc_irc_to_html(args[3])); } else if (strchr(name, '.') != NULL) { if (strncmp(args[3], "*** Notice -- ", sizeof("*** Notice -- ")-1) == 0) firetalk_callback_chat_getmessage(c, ":RAW", name, 1, irc_irc_to_html(args[3]+sizeof("*** Notice -- ")-1)); else firetalk_callback_chat_getmessage(c, ":RAW", name, 1, irc_irc_to_html(args[3])); } else if (args[3][0] != '\0') { if (strchr(ROOMSTARTS, args[2][0])) firetalk_callback_chat_getmessage(c, args[2], name, 1, irc_irc_to_html(args[3])); else firetalk_callback_im_getmessage(c, name, 1, irc_irc_to_html(args[3])); } } else if (strcmp(args[1], "TOPIC") == 0) { firetalk_callback_chat_gottopic(c, args[2], irc_irc_to_html(args[3]), irc_get_nickname(args[0])); } else if (strcmp(args[1], "KICK") == 0) { const char *name = irc_get_nickname(args[3]); if (irc_compare_nicks(c->nickname, name) == 0) { irc_disc_rem(c, args[2]); firetalk_callback_chat_kicked(c, args[2], irc_get_nickname(args[0]), irc_irc_to_html(args[4])); } else { irc_disc_user_rem(c, args[2], name); tempchr = strdup(name); if (tempchr == NULL) abort(); firetalk_callback_chat_user_kicked(c, args[2], tempchr, irc_get_nickname(args[0]), irc_irc_to_html(args[4])); free(tempchr); tempchr = NULL; } } else handled = 0; if (handled) return(FE_SUCCESS); if (numeric == 311) // RPL_WHOISUSER inwhois = 1; else if (numeric == 318)// RPL_ENDOFWHOIS inwhois = 0; if (!inwhois) switch (numeric) { case 333: /* :PREFIX 333 sn channel topicsetuser topicsettime */ case 306: /* :PREFIX 306 sn :You have been marked as being away */ case 305: /* :PREFIX 305 sn :You are no longer marked as being away */ case 396: /* :PREFIX 396 sn whoishost :is now your hidden host */ return(FE_SUCCESS); } handled = 1; switch (numeric) { case 366: /* :PREFIX 366 sn channel :End of /NAMES list. */ firetalk_callback_chat_user_joined(c, args[3], NULL, NULL); break; case 301: /* RPL_AWAY */ break; case 313: /* RPL_WHOISOPER */ for (whoisiter = c->whois_head; whoisiter != NULL; whoisiter = whoisiter->next) if (irc_compare_nicks(args[3],whoisiter->nickname) == 0) { whoisiter->flags |= FF_ADMIN; break; } break; case 318: /* RPL_ENDOFWHOIS */ whoisiter2 = NULL; for (whoisiter = c->whois_head; whoisiter != NULL; whoisiter = whoisiter->next) { if (irc_compare_nicks(args[3], whoisiter->nickname) == 0) { /* manual whois */ firetalk_callback_gotinfo(c, whoisiter->nickname, whoisiter->info, 0, whoisiter->online, whoisiter->idle, whoisiter->flags); free(whoisiter->nickname); whoisiter->nickname = NULL; if (whoisiter->info != NULL) { free(whoisiter->info); whoisiter->info = NULL; } if (whoisiter2) whoisiter2->next = whoisiter->next; else c->whois_head = whoisiter->next; free(whoisiter); whoisiter = NULL; break; } whoisiter2 = whoisiter; } break; case 401: /* ERR_NOSUCHNICK */ firetalk_callback_im_buddyonline(c, args[3], 0); case 441: /* ERR_USERNOTINCHANNEL */ case 443: /* ERR_USERONCHANNEL */ if (!strcasecmp(args[3], "NickServ") && c->passchange) c->passchange--; whoisiter2 = NULL; for (whoisiter = c->whois_head; whoisiter != NULL; whoisiter = whoisiter->next) { if (irc_compare_nicks(args[3], whoisiter->nickname) == 0) { free(whoisiter->nickname); whoisiter->nickname = NULL; if (whoisiter->info != NULL) { free(whoisiter->info); whoisiter->info = NULL; } if (whoisiter2) whoisiter2->next = whoisiter->next; else c->whois_head = whoisiter->next; free(whoisiter); whoisiter = NULL; firetalk_callback_error(c, FE_BADUSER, args[3], args[4]); break; } whoisiter2 = whoisiter; } break; case 403: /* ERR_NOSUCHCHANNEL */ case 442: /* ERR_NOTONCHANNEL */ firetalk_callback_error(c, FE_BADROOM, args[3], args[4]); break; case 404: /* ERR_CANNOTSENDTOCHAN */ case 405: /* ERR_TOOMANYCHANNELS */ case 471: /* ERR_CHANNELISFULL */ case 473: /* ERR_INVITEONLYCHAN */ case 474: /* ERR_BANNEDFROMCHAN */ case 475: /* ERR_BADCHANNELKEY */ firetalk_callback_error(c, FE_ROOMUNAVAILABLE, args[3], args[4]); break; case 412: /* ERR_NOTEXTTOSEND */ firetalk_callback_error(c, FE_BADMESSAGE, NULL, args[4]); break; case 421: /* ERR_UNKNOWNCOMMAND */ if (strcmp(args[3], "SILENCE") == 0) c->usesilence = 0; goto unhandled; break; case 433: /* ERR_NICKNAMEINUSE */ firetalk_callback_error(c, FE_BADUSER, NULL, "Nickname in use."); break; case 482: /* ERR_CHANOPRIVSNEEDED */ firetalk_callback_error(c, FE_NOPERMS, args[3], "You need to be a channel operator."); break; default: handled = 0; } if (handled) return(FE_SUCCESS); if (args[4] == NULL) goto unhandled; if (strcmp(args[1],"MODE") == 0) { const char *source = irc_get_nickname(args[0]); int loc = 0, arg = 4, dir = 1; #ifdef RAWIRCMODES int i; char buf[512]; strcpy(buf, args[3]); for (i = 4; args[i] != NULL; i++) { strcat(buf, " "); strcat(buf, args[i]); } firetalk_callback_chat_modechanged(c, args[2], buf, source); #endif while ((args[arg] != NULL) && (args[3][loc] != '\0')) { switch (args[3][loc++]) { case '+': dir = 1; break; case '-': dir = -1; break; case 'o': if (dir == 1) { firetalk_callback_chat_user_opped(c, args[2], args[arg++], source); if (irc_compare_nicks(args[arg-1], c->nickname) == FE_SUCCESS) firetalk_callback_chat_opped(c, args[2], source); } else if (dir == -1) { firetalk_callback_chat_user_deopped(c, args[2], args[arg++], source); if (irc_compare_nicks(args[arg-1], c->nickname) == FE_SUCCESS) { firetalk_callback_chat_deopped(c, args[2], source); if (c->identified == 1) { /* this is us, and we're identified, so we can request a reop */ if (irc_send_printf(c,"PRIVMSG ChanServ :OP %s %s",args[2],c->nickname) != FE_SUCCESS) { irc_internal_disconnect(c,FE_PACKET); return(FE_PACKET); } } } } break; case 'k': if (dir == 1) firetalk_callback_chat_keychanged(c, args[2], args[arg], source); else firetalk_callback_chat_keychanged(c, args[2], NULL, source); arg++; break; case 'v': case 'b': case 'l': arg++; break; default: break; } } return(FE_SUCCESS); } handled = 1; switch (numeric) { case 317: /* RPL_WHOISIDLE */ for (whoisiter = c->whois_head; whoisiter != NULL; whoisiter = whoisiter->next) if (irc_compare_nicks(args[3], whoisiter->nickname) == 0) { whoisiter->online = atol(args[5]); whoisiter->idle = atol(args[4])/60; } break; case 312: /* RPL_WHOISSERVER */ irc_addwhois(c, args[3], "
On server %s (%s)", args[4], irc_irc_to_html(args[5])); break; case 319: /* RPL_WHOISCHANNELS */ irc_addwhois(c, args[3], "
On channels %s", irc_irc_to_html(args[4])); break; case 332: /* RPL_TOPIC */ firetalk_callback_chat_gottopic(c, args[3], irc_irc_to_html(args[4]), NULL); break; default: handled = 0; } if (handled) return(FE_SUCCESS); if (args[5] == NULL) goto unhandled; if (numeric == 353) { /* RPL_NAMREPLY */ char *str = args[5]; while ((str != NULL) && (*str != 0)) { int oped = 0, voiced = 0; char *sp; if ((sp = strchr(str, ' ')) != NULL) *sp = 0; while ((*str != 0) && !irc_isnickfirst(*str)) { if (*str == '@') oped = 1; else if (*str == '+') voiced = 1; str++; } firetalk_callback_chat_user_joined(c, args[4], str, NULL); firetalk_callback_im_buddyonline(c, str, 1); if (oped) { firetalk_callback_chat_user_opped(c, args[4], str, NULL); if (irc_compare_nicks(str, c->nickname) == FE_SUCCESS) firetalk_callback_chat_opped(c, args[4], NULL); } if (sp != NULL) str = sp+1; else str = NULL; } return(FE_SUCCESS); } if ((args[6] == NULL) || (args[7] == NULL)) goto unhandled; if (numeric == 311) { /* RPL_WHOISUSER */ char *gecos = irc_irc_to_html(args[7]); int i; for (i = 0; gecos[i] != 0; i++) if (strncasecmp(gecos+i, "", sizeof("")-1) == 0) break; if (gecos[i] != 0) irc_addwhois(c, args[3], "%s@%s (%s)", args[4], args[5], firetalk_htmlentities(gecos)); else irc_addwhois(c, args[3], "%s@%s (%s)", args[4], args[5], gecos); return(FE_SUCCESS); } else if (numeric == 352) { /* WHO output */ char buf[1024], buf2[1024]; int i; snprintf(buf, sizeof(buf), "%s %s %s %s", args[7], args[4], args[5], args[6]); for (i = 8; args[i] != NULL; i++) { snprintf(buf2, sizeof(buf2), ", %s", args[i]); strncat(buf, buf2, sizeof(buf)-strlen(buf)-1); } firetalk_callback_chat_getmessage(c, ":RAW", args[3], 0, buf); return(FE_SUCCESS); } unhandled: if (inwhois) { char buf[1024]; int i; snprintf(buf, sizeof(buf), "
%s", args[3]); for (i = numeric?4:3; args[i+1] != NULL; i++) ; snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), " %s", args[i]); for (i = numeric?4:3; args[i+1] != NULL; i++) snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), " %s", args[i]); snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), " (%s)", args[1]); irc_addwhois(c, args[3], "%s", buf); } else { char buf[1024], buf2[1024]; int i; *buf = 0; for (i = 1; args[i+1] != NULL; i++) { snprintf(buf2, sizeof(buf2), "%s, ", args[i]); strncat(buf, buf2, sizeof(buf)-strlen(buf)-1); } strncat(buf, args[i], sizeof(buf)-strlen(buf)-1); firetalk_callback_chat_getmessage(c, ":RAW", irc_get_nickname(args[0]), 0, buf); } } return(FE_SUCCESS); } static fte_t irc_got_data(irc_conn_t *c, unsigned char *buffer, unsigned short *bufferpos) { char **args; while (((args = irc_recv_parse(c, buffer, bufferpos)) != NULL) && (args[1] != NULL)) { fte_t fte; if ((fte = irc_got_data_parse(c, args)) != FE_SUCCESS) return(fte); } return(FE_SUCCESS); } static fte_t irc_got_data_connecting(irc_conn_t *c, unsigned char *buffer, unsigned short *bufferpos) { char **args; while (((args = irc_recv_parse(c, buffer, bufferpos)) != NULL) && (args[1] != NULL)) { if (strcmp(args[1], "ERROR") == 0) { irc_send_printf(c,"QUIT :error"); if (args[2] == NULL) firetalk_callback_connectfailed(c, FE_PACKET, "Server returned ERROR"); else firetalk_callback_connectfailed(c, FE_PACKET, args[2]); return(FE_PACKET); } else { switch (atoi(args[1])) { case 1: /* :PREFIX 001 sn :Welcome message */ if (strcmp(c->nickname, args[2]) != 0) { firetalk_callback_user_nickchanged(c, c->nickname, args[2]); free(c->nickname); c->nickname = strdup(args[2]); if (c->nickname == NULL) abort(); firetalk_callback_newnick(c, args[2]); } break; case 376: /* End of MOTD */ case 422: /* MOTD is missing */ firetalk_callback_doinit(c,c->nickname); firetalk_callback_connected(c); break; case 431: case 432: case 436: case 461: irc_send_printf(c,"QUIT :Invalid nickname"); firetalk_callback_connectfailed(c,FE_BADUSER,"Invalid nickname"); return(FE_BADUSER); case 433: irc_send_printf(c,"QUIT :Invalid nickname"); firetalk_callback_connectfailed(c,FE_BADUSER,"Nickname in use"); return(FE_BADUSER); case 465: irc_send_printf(c,"QUIT :banned"); firetalk_callback_connectfailed(c,FE_BLOCKED,"You are banned"); return(FE_BLOCKED); default: { fte_t fte; if ((fte = irc_got_data_parse(c, args)) != FE_SUCCESS) return(fte); break; } } } } return(FE_SUCCESS); } static fte_t irc_chat_join(irc_conn_t *c, const char *const room) { return(irc_send_printf(c,"JOIN %s",room)); } static fte_t irc_chat_part(irc_conn_t *c, const char *const room) { return(irc_send_printf(c,"PART %s",room)); } static fte_t irc_chat_send_message(irc_conn_t *c, const char *const room, const char *const message, const int auto_flag) { if (strcasecmp(room, ":RAW") == 0) return(irc_send_printf(c, "%s", message)); #ifdef DEBUG_ECHO irc_echof(c, "chat_send_message", "c=%#p, room=%#p \"%s\", message=%#p \"%s\", auto_flag=%i\n", c, room, room, message, message, auto_flag); #endif if (auto_flag) return(irc_send_printf(c, "NOTICE %s :%s", room, message)); else return(irc_send_printf(c, "PRIVMSG %s :%s", room, message)); } static fte_t irc_chat_send_action(irc_conn_t *c, const char *const room, const char *const message, const int auto_flag) { return(irc_send_printf(c,"PRIVMSG %s :\001ACTION %s\001",room,message)); } static fte_t irc_chat_invite(irc_conn_t *c, const char *const room, const char *const who, const char *const message) { return(irc_send_printf(c,"INVITE %s %s",who,room)); } static fte_t irc_im_send_message(irc_conn_t *c, const char *const dest, const char *const message, const int auto_flag) { struct s_firetalk_handle *fchandle; char buf[512+1]; if (strcasecmp(dest, ":RAW") == 0) return(irc_send_printf(c, "%s", message)); fchandle = firetalk_find_handle(c); if (auto_flag) { snprintf(buf, sizeof(buf), "NOTICE %s :%s", dest, message); firetalk_queue_append(buf, sizeof(buf), &(fchandle->subcode_replies), dest); } else { snprintf(buf, sizeof(buf), "PRIVMSG %s :%s", dest, message); firetalk_queue_append(buf, sizeof(buf), &(fchandle->subcode_requests), dest); } return(irc_send_printf(c, "%s", buf)); } static fte_t irc_im_send_action(irc_conn_t *c, const char *const dest, const char *const message, const int auto_flag) { return(irc_send_printf(c, "PRIVMSG %s :\001ACTION %s\001", dest, message)); } static fte_t irc_chat_set_topic(irc_conn_t *c, const char *const room, const char *const topic) { return(irc_send_printf(c,"TOPIC %s :%s",room,topic)); } static fte_t irc_chat_op(irc_conn_t *c, const char *const room, const char *const who) { return(irc_send_printf(c,"MODE %s +o %s",room,who)); } static fte_t irc_chat_deop(irc_conn_t *c, const char *const room, const char *const who) { return(irc_send_printf(c,"MODE %s -o %s",room,who)); } static fte_t irc_chat_kick(irc_conn_t *c, const char *const room, const char *const who, const char *const reason) { if (reason) return(irc_send_printf(c,"KICK %s %s :%s",room,who,reason)); else return(irc_send_printf(c,"KICK %s %s",room,who)); } static fte_t irc_chat_requestextended(client_t c, const char * const room) { return (irc_send_printf(c,"WHO %s", room)); } static fte_t irc_im_add_buddy(irc_conn_t *c, const char *const name, const char *const group, const char *const friendly) { struct s_firetalk_handle *fchandle; fchandle = firetalk_find_handle(c); if (firetalk_user_visible(fchandle, name) == FE_SUCCESS) firetalk_callback_im_buddyonline(c, name, 1); return(FE_SUCCESS); } static fte_t irc_im_remove_buddy(irc_conn_t *c, const char *const name, const char *const group) { firetalk_callback_im_buddyonline(c, name, 0); return(FE_SUCCESS); } static fte_t irc_im_add_deny(irc_conn_t *c, const char *const nickname) { if (c->usesilence == 1) return(irc_send_printf(c,"SILENCE +%s!*@*",nickname)); else return(FE_SUCCESS); } static fte_t irc_im_remove_deny(irc_conn_t *c, const char *const nickname) { if (c->usesilence == 1) return(irc_send_printf(c,"SILENCE -%s!*@*",nickname)); else return(FE_SUCCESS); } static fte_t irc_im_upload_buddies(irc_conn_t *c) { return(FE_SUCCESS); } static fte_t irc_im_upload_denies(irc_conn_t *c) { return(FE_SUCCESS); } static fte_t irc_im_evil(irc_conn_t *c, const char *const who) { return(FE_SUCCESS); } static fte_t irc_set_privacy(client_t c, const char *const mode) { return(FE_SUCCESS); } static fte_t irc_get_info(irc_conn_t *c, const char *const nickname) { struct s_irc_whois *whoistemp; whoistemp = c->whois_head; c->whois_head = calloc(1, sizeof(struct s_irc_whois)); if (c->whois_head == NULL) abort(); c->whois_head->nickname = strdup(nickname); if (c->whois_head->nickname == NULL) abort(); c->whois_head->flags = 0; c->whois_head->online = 0; c->whois_head->idle = 0; c->whois_head->info = NULL; c->whois_head->next = whoistemp; return(irc_send_printf(c, "WHOIS %s", nickname)); } static fte_t irc_set_info(irc_conn_t *c, const char *const info) { return(FE_SUCCESS); } static fte_t irc_set_away(irc_conn_t *c, const char *const message, const int auto_flag) { if (message) return(irc_send_printf(c,"AWAY :%s",message)); else return(irc_send_printf(c,"AWAY")); } static fte_t irc_periodic(struct s_firetalk_handle *const conn) { return(FE_SUCCESS); } #if 0 static fte_t irc_subcode_send_request(irc_conn_t *c, const char *const to, const char *const command, const char *const args) { if (args == NULL) { if (irc_send_printf(c,"PRIVMSG %s :\001%s\001",to,command) != 0) { irc_internal_disconnect(c,FE_PACKET); return(FE_PACKET); } } else { if (irc_send_printf(c,"PRIVMSG %s :\001%s %s\001",to,command,args) != 0) { irc_internal_disconnect(c,FE_PACKET); return(FE_PACKET); } } return(FE_SUCCESS); } static fte_t irc_subcode_send_reply(irc_conn_t *c, const char *const to, const char *const command, const char *const args) { if (to == NULL) return(FE_SUCCESS); if (args == NULL) { if (irc_send_printf(c,"NOTICE %s :\001%s\001",to,command) != 0) { irc_internal_disconnect(c,FE_PACKET); return(FE_PACKET); } } else { if (irc_send_printf(c,"NOTICE %s :\001%s %s\001",to,command,args) != 0) { irc_internal_disconnect(c,FE_PACKET); return(FE_PACKET); } } return(FE_SUCCESS); } #endif static char *irc_ctcp_encode(irc_conn_t *c, const char *const command, const char *const message) { char *str; if (message != NULL) { str = malloc(1 + strlen(command) + 1 + strlen(message) + 1 + 1); if (str == NULL) abort(); sprintf(str, "\001%s %s\001", command, message); } else { str = malloc(1 + strlen(command) + 1 + 1); if (str == NULL) abort(); sprintf(str, "\001%s\001", command); } return(str); } const firetalk_protocol_t firetalk_protocol_irc = { strprotocol: "IRC", default_server: "irc.n.ml.org", default_port: 6667, default_buffersize: 1024/2, periodic: irc_periodic, preselect: irc_preselect, postselect: irc_postselect, got_data: irc_got_data, got_data_connecting: irc_got_data_connecting, comparenicks: irc_compare_nicks, isprintable: irc_isprint, disconnect: irc_disconnect, signon: irc_signon, get_info: irc_get_info, set_info: irc_set_info, set_away: irc_set_away, set_nickname: irc_set_nickname, set_password: irc_set_password, im_add_buddy: irc_im_add_buddy, im_remove_buddy: irc_im_remove_buddy, im_add_deny: irc_im_add_deny, im_remove_deny: irc_im_remove_deny, im_upload_buddies: irc_im_upload_buddies, im_upload_denies: irc_im_upload_denies, im_send_message: irc_im_send_message, im_send_action: irc_im_send_action, im_evil: irc_im_evil, chat_join: irc_chat_join, chat_part: irc_chat_part, chat_invite: irc_chat_invite, chat_set_topic: irc_chat_set_topic, chat_op: irc_chat_op, chat_deop: irc_chat_deop, chat_kick: irc_chat_kick, chat_send_message: irc_chat_send_message, chat_send_action: irc_chat_send_action, // subcode_send_request: irc_subcode_send_request, // subcode_send_reply: irc_subcode_send_reply, subcode_encode: irc_ctcp_encode, set_privacy: irc_set_privacy, room_normalize: irc_normalize_room_name, create_handle: irc_create_handle, destroy_handle: irc_destroy_handle, }; centerim-4.22.10/firetalk/firetalk.c0000644000175000001440000025563311461606612014172 00000000000000/* firetalk.c - FireTalk wrapper definitions Copyright (C) 2000 Ian Gulliver Copyright 2002-2006 Daniel Reed This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FIRETALK #include "firetalk-int.h" #include "firetalk.h" typedef void (*ptrtotoc)(void *, ...); typedef void (*sighandler_t)(int); /* Global variables */ fte_t firetalkerror; static struct s_firetalk_handle *handle_head = NULL; static const firetalk_protocol_t **firetalk_protocols = NULL; static int FP_MAX = 0; fte_t firetalk_register_protocol(const firetalk_protocol_t *const proto) { const firetalk_protocol_t **ptr; if (proto == NULL) abort(); ptr = realloc(firetalk_protocols, sizeof(*firetalk_protocols)*(FP_MAX+1)); if (ptr == NULL) return(FE_UNKNOWN); firetalk_protocols = ptr; firetalk_protocols[FP_MAX++] = proto; return(FE_SUCCESS); } static void firetalk_register_default_protocols(void) { extern const firetalk_protocol_t firetalk_protocol_irc, firetalk_protocol_toc2; if (firetalk_register_protocol(&firetalk_protocol_irc) != FE_SUCCESS) abort(); if (firetalk_register_protocol(&firetalk_protocol_toc2) != FE_SUCCESS) abort(); } int firetalk_find_protocol(const char *strprotocol) { static int registered_defaults = 0; int i; if (strprotocol == NULL) abort(); for (i = 0; i < FP_MAX; i++) if (strcasecmp(strprotocol, firetalk_protocols[i]->strprotocol) == 0) return(i); if (!registered_defaults) { registered_defaults = 1; firetalk_register_default_protocols(); for (i = 0; i < FP_MAX; i++) if (strcasecmp(strprotocol, firetalk_protocols[i]->strprotocol) == 0) return(i); } return(-1); } /* Internal function definitions */ /* firetalk_find_by_toc searches the firetalk handle list for the toc handle passed, and returns the firetalk handle */ firetalk_t firetalk_find_handle(client_t c) { struct s_firetalk_handle *iter; for (iter = handle_head; iter != NULL; iter = iter->next) if (iter->handle == c) return(iter); abort(); } firetalk_t firetalk_find_clientstruct(void *clientstruct) { struct s_firetalk_handle *iter; for (iter = handle_head; iter != NULL; iter = iter->next) if (iter->clientstruct == clientstruct) return(iter); return(NULL); } #define DEBUG #ifdef DEBUG # define VERIFYCONN \ do { \ if (firetalk_check_handle(conn) != FE_SUCCESS) \ abort(); \ } while(0) static fte_t firetalk_check_handle(firetalk_t c) { struct s_firetalk_handle *iter; for (iter = handle_head; iter != NULL; iter = iter->next) if (iter == c) return(FE_SUCCESS); return(FE_BADHANDLE); } #else # define VERIFYCONN \ do { \ } while(0) #endif static char **firetalk_parse_subcode_args(char *string) { static char *args[256]; int i,n; size_t l; l = strlen(string); args[0] = string; n = 1; for (i = 0; (size_t) i < l && n < 255; i++) { if (string[i] == ' ') { string[i++] = '\0'; args[n++] = &string[i]; } } args[n] = NULL; return(args); } static unsigned char firetalk_debase64_char(const char c) { if ((c >= 'A') && (c <= 'Z')) return((unsigned char)(c - 'A')); if ((c >= 'a') && (c <= 'z')) return((unsigned char)(26 + (c - 'a'))); if ((c >= '0') && (c <= '9')) return((unsigned char)(52 + (c - '0'))); if (c == '+') return((unsigned char)62); if (c == '/') return((unsigned char)63); return((unsigned char)0); } const char *firetalk_debase64(const char *const str) { static unsigned char out[256]; int s, o, len = strlen(str); for (o = s = 0; (s <= (len - 3)) && (o < (sizeof(out)-1)); s += 4, o += 3) { out[o] = (firetalk_debase64_char(str[s]) << 2) | (firetalk_debase64_char(str[s+1]) >> 4); out[o+1] = (firetalk_debase64_char(str[s+1]) << 4) | (firetalk_debase64_char(str[s+2]) >> 2); out[o+2] = (firetalk_debase64_char(str[s+2]) << 6) | firetalk_debase64_char(str[s+3]); } out[o] = 0; return((char *)out); } fte_t firetalk_im_internal_add_deny(firetalk_t conn, const char *const nickname) { struct s_firetalk_deny *iter; VERIFYCONN; for (iter = conn->deny_head; iter != NULL; iter = iter->next) if (firetalk_protocols[conn->protocol]->comparenicks(iter->nickname, nickname) == FE_SUCCESS) break; /* not an error, user is in buddy list */ if (iter == NULL) { iter = conn->deny_head; conn->deny_head = calloc(1, sizeof(struct s_firetalk_deny)); if (conn->deny_head == NULL) abort(); conn->deny_head->next = iter; conn->deny_head->nickname = strdup(nickname); if (conn->deny_head->nickname == NULL) abort(); } firetalk_callback_im_buddyonline(conn->handle, nickname, 0); return(FE_SUCCESS); } #undef FIRETALK_FORK_RESOLV #ifdef FIRETALK_FORK_RESOLV fte_t firetalk_internal_resolve4(const char *const host, struct in_addr *inet4_ip) { int pi[2]; if (pipe(pi) != 0) return(FE_NOTFOUND); switch(fork()) { case -1: close(pi[0]); close(pi[1]); return(FE_NOTFOUND); case 0: { struct hostent *he; close(pi[0]); if (((he = gethostbyaddr(host, strlen(host), AF_INET)) != NULL) && (he->h_addr_list != NULL)) write(pi[1], he->h_addr_list[0], sizeof(inet4_ip->s_addr)); close(pi[1]); _exit(2); } default: { struct timeval tv; fd_set readset; FD_ZERO(&readset); FD_SET(pi[0], &readset); close(pi[1]); tv.tv_sec = 5; tv.tv_usec = 0; if ((select(pi[0]+1, &readset, NULL, NULL, &tv) > 0) && FD_ISSET(pi[0], &readset) && (read(pi[0], &(inet4_ip->s_addr), sizeof(inet4_ip->s_addr)) == sizeof(inet4_ip->s_addr))) { close(pi[0]); return(FE_SUCCESS); } close(pi[0]); return(FE_NOTFOUND); } } } #else fte_t firetalk_internal_resolve4(const char *const host, struct in_addr *inet4_ip) { struct hostent *he; he = gethostbyname(host); if (he && he->h_addr_list) { memmove(&(inet4_ip->s_addr), he->h_addr_list[0], sizeof(inet4_ip->s_addr)); return(FE_SUCCESS); } memset(&(inet4_ip->s_addr), 0, sizeof(inet4_ip->s_addr)); return(FE_NOTFOUND); } #endif struct sockaddr_in *firetalk_internal_remotehost4(client_t c) { struct s_firetalk_handle *conn = firetalk_find_handle(c); return(&(conn->remote_addr)); } #ifdef _FC_USE_IPV6 fte_t firetalk_internal_resolve6(const char *const host, struct in6_addr *inet6_ip) { struct addrinfo *addr = NULL; // xxx generalize this so that we can use this with v6 and v4 struct addrinfo hints = {0, PF_INET6, 0, 0, 0, NULL, NULL, NULL}; if (getaddrinfo(host, NULL, &hints, &addr) == 0) { struct addrinfo *cur; for (cur = addr; cur != NULL; cur = cur->ai_next) if (cur->ai_family == PF_INET6) { memcpy(&(inet6_ip->s6_addr), ((struct sockaddr_in6 *)cur->ai_addr)->sin6_addr.s6_addr, 16); freeaddrinfo(addr); return(FE_SUCCESS); } } memset(&(inet6_ip->s6_addr), 0, sizeof(inet6_ip->s6_addr)); if (addr != NULL) freeaddrinfo(addr); return(FE_NOTFOUND); } struct sockaddr_in6 *firetalk_internal_remotehost6(client_t c) { struct s_firetalk_handle *conn = firetalk_find_handle(c); return(&(conn->remote_addr6)); } #endif int firetalk_internal_connect_host_addr(const char *const host, const uint16_t port, struct sockaddr_in *inet4 #ifdef _FC_USE_IPV6 , struct sockaddr_in6 *inet6 #endif ) { #ifdef _FC_USE_IPV6 if (firetalk_internal_resolve6(host, &(inet6->sin6_addr)) == FE_SUCCESS) { inet6->sin6_port = htons(port); inet6->sin6_family = AF_INET6; } else inet6 = NULL; #endif if (firetalk_internal_resolve4(host, &(inet4->sin_addr)) == FE_SUCCESS) { inet4->sin_port = htons(port); inet4->sin_family = AF_INET; } else inet4 = NULL; return firetalk_internal_connect(inet4 #ifdef _FC_USE_IPV6 , inet6 #endif ); } int firetalk_internal_connect_host(const char *const host, const int port) { struct sockaddr_in myinet4; #ifdef _FC_USE_IPV6 struct sockaddr_in6 myinet6; #endif return(firetalk_internal_connect_host_addr(host, port, &myinet4 #ifdef _FC_USE_IPV6 , &myinet6 #endif )); } int firetalk_internal_connect(struct sockaddr_in *inet4_ip #ifdef _FC_USE_IPV6 , struct sockaddr_in6 *inet6_ip #endif ) { int s,i; #ifdef _FC_USE_IPV6 if (inet6_ip && (inet6_ip->sin6_addr.s6_addr[0] || inet6_ip->sin6_addr.s6_addr[1] || inet6_ip->sin6_addr.s6_addr[2] || inet6_ip->sin6_addr.s6_addr[3] || inet6_ip->sin6_addr.s6_addr[4] || inet6_ip->sin6_addr.s6_addr[5] || inet6_ip->sin6_addr.s6_addr[6] || inet6_ip->sin6_addr.s6_addr[7] || inet6_ip->sin6_addr.s6_addr[8] || inet6_ip->sin6_addr.s6_addr[9] || inet6_ip->sin6_addr.s6_addr[10] || inet6_ip->sin6_addr.s6_addr[11] || inet6_ip->sin6_addr.s6_addr[12] || inet6_ip->sin6_addr.s6_addr[13] || inet6_ip->sin6_addr.s6_addr[14] || inet6_ip->sin6_addr.s6_addr[15])) { h_errno = 0; s = socket(PF_INET6, SOCK_STREAM, 0); if ((s != -1) && (fcntl(s, F_SETFL, O_NONBLOCK) == 0)) { i = connect(s, (const struct sockaddr *)inet6_ip, sizeof(struct sockaddr_in6)); if ((i == 0) || (errno == EINPROGRESS)) return(s); } } #endif if (inet4_ip && inet4_ip->sin_addr.s_addr) { h_errno = 0; s = socket(PF_INET, SOCK_STREAM, 0); if ((s != -1) && (fcntl(s, F_SETFL, O_NONBLOCK) == 0)) { i = connect(s, (const struct sockaddr *)inet4_ip, sizeof(struct sockaddr_in)); if ((i == 0) || (errno == EINPROGRESS)) return(s); } } firetalkerror = FE_CONNECT; return(-1); } enum firetalk_connectstate firetalk_internal_get_connectstate(client_t c) { struct s_firetalk_handle *conn = firetalk_find_handle(c); return(conn->connected); } void firetalk_internal_set_connectstate(client_t c, enum firetalk_connectstate fcs) { struct s_firetalk_handle *conn = firetalk_find_handle(c); conn->connected = fcs; } void firetalk_internal_send_data(firetalk_t c, const char *const data, const int length) { if (c->connected == FCS_NOTCONNECTED || c->connected == FCS_WAITING_SYNACK) return; if (send(c->fd,data,length,MSG_DONTWAIT|MSG_NOSIGNAL) != length) { /* disconnect client (we probably overran the queue, or the other end is gone) */ firetalk_callback_disconnect(c->handle,FE_PACKET); } /* request ratelimit info */ /* immediate send or queue? */ } fte_t firetalk_user_visible(firetalk_t conn, const char *const nickname) { struct s_firetalk_room *iter; VERIFYCONN; for (iter = conn->room_head; iter != NULL; iter = iter->next) { struct s_firetalk_member *mem; for (mem = iter->member_head; mem != NULL; mem = mem->next) if (firetalk_protocols[conn->protocol]->comparenicks(mem->nickname, nickname) == FE_SUCCESS) return(FE_SUCCESS); } return(FE_NOMATCH); } fte_t firetalk_user_visible_but(firetalk_t conn, const char *const room, const char *const nickname) { struct s_firetalk_room *iter; VERIFYCONN; for (iter = conn->room_head; iter != NULL; iter = iter->next) { struct s_firetalk_member *mem; if (firetalk_protocols[conn->protocol]->comparenicks(iter->name, room) == FE_SUCCESS) continue; for (mem = iter->member_head; mem != NULL; mem = mem->next) if (firetalk_protocols[conn->protocol]->comparenicks(mem->nickname, nickname) == FE_SUCCESS) return(FE_SUCCESS); } return(FE_NOMATCH); } fte_t firetalk_chat_internal_add_room(firetalk_t conn, const char *const name) { struct s_firetalk_room *iter; VERIFYCONN; for (iter = conn->room_head; iter != NULL; iter = iter->next) if (firetalk_protocols[conn->protocol]->comparenicks(iter->name, name) == FE_SUCCESS) return(FE_DUPEROOM); /* not an error, we're already in room */ iter = conn->room_head; conn->room_head = calloc(1, sizeof(struct s_firetalk_room)); if (conn->room_head == NULL) abort(); conn->room_head->next = iter; conn->room_head->name = strdup(name); if (conn->room_head->name == NULL) abort(); return(FE_SUCCESS); } fte_t firetalk_chat_internal_add_member(firetalk_t conn, const char *const room, const char *const nickname) { struct s_firetalk_room *iter; struct s_firetalk_member *memberiter; VERIFYCONN; for (iter = conn->room_head; iter != NULL; iter = iter->next) if (firetalk_protocols[conn->protocol]->comparenicks(iter->name, room) == FE_SUCCESS) break; if (iter == NULL) /* we don't know about that room */ return(FE_NOTFOUND); for (memberiter = iter->member_head; memberiter != NULL; memberiter = memberiter->next) if (firetalk_protocols[conn->protocol]->comparenicks(memberiter->nickname, nickname) == FE_SUCCESS) return(FE_SUCCESS); memberiter = iter->member_head; iter->member_head = calloc(1, sizeof(struct s_firetalk_member)); if (iter->member_head == NULL) abort(); iter->member_head->next = memberiter; iter->member_head->nickname = strdup(nickname); if (iter->member_head->nickname == NULL) abort(); return(FE_SUCCESS); } static void firetalk_im_delete_buddy(firetalk_t conn, const char *const nickname) { struct s_firetalk_buddy *iter, *prev; for (prev = NULL, iter = conn->buddy_head; iter != NULL; prev = iter, iter = iter->next) { assert(iter->nickname != NULL); assert(iter->group != NULL); if (firetalk_protocols[conn->protocol]->comparenicks(nickname, iter->nickname) == FE_SUCCESS) break; } if (iter == NULL) return; if (prev != NULL) prev->next = iter->next; else conn->buddy_head = iter->next; free(iter->nickname); iter->nickname = NULL; free(iter->group); iter->group = NULL; if (iter->friendly != NULL) { free(iter->friendly); iter->friendly = NULL; } if (iter->capabilities != NULL) { free(iter->capabilities); iter->capabilities = NULL; } free(iter); iter = NULL; } static struct s_firetalk_buddy *firetalk_im_find_buddy(firetalk_t conn, const char *const name) { struct s_firetalk_buddy *iter; for (iter = conn->buddy_head; iter != NULL; iter = iter->next) { assert(iter->nickname != NULL); assert(iter->group != NULL); if (firetalk_protocols[conn->protocol]->comparenicks(iter->nickname, name) == FE_SUCCESS) return(iter); } return(NULL); } fte_t firetalk_im_remove_buddy(firetalk_t conn, const char *const name) { struct s_firetalk_buddy *iter; VERIFYCONN; if ((iter = firetalk_im_find_buddy(conn, name)) == NULL) return(FE_NOTFOUND); if (conn->connected != FCS_NOTCONNECTED) { int ret; ret = firetalk_protocols[conn->protocol]->im_remove_buddy(conn->handle, iter->nickname, iter->group); if (ret != FE_SUCCESS) return(ret); } firetalk_im_delete_buddy(conn, name); return(FE_SUCCESS); } fte_t firetalk_im_internal_remove_deny(firetalk_t conn, const char *const nickname) { struct s_firetalk_deny *iter; struct s_firetalk_deny *prev; VERIFYCONN; prev = NULL; for (iter = conn->deny_head; iter != NULL; iter = iter->next) { if (firetalk_protocols[conn->protocol]->comparenicks(nickname, iter->nickname) == FE_SUCCESS) { if (prev) prev->next = iter->next; else conn->deny_head = iter->next; free(iter->nickname); iter->nickname = NULL; free(iter); return(FE_SUCCESS); } prev = iter; } return(FE_NOTFOUND); } fte_t firetalk_chat_internal_remove_room(firetalk_t conn, const char *const name) { struct s_firetalk_room *iter; struct s_firetalk_room *prev; struct s_firetalk_member *memberiter; struct s_firetalk_member *membernext; VERIFYCONN; prev = NULL; for (iter = conn->room_head; iter != NULL; iter = iter->next) { if (firetalk_protocols[conn->protocol]->comparenicks(name, iter->name) == FE_SUCCESS) { for (memberiter = iter->member_head; memberiter != NULL; memberiter = membernext) { membernext = memberiter->next; free(memberiter->nickname); memberiter->nickname = NULL; free(memberiter); } iter->member_head = NULL; if (prev) prev->next = iter->next; else conn->room_head = iter->next; if (iter->name) { free(iter->name); iter->name = NULL; } free(iter); return(FE_SUCCESS); } prev = iter; } return(FE_NOTFOUND); } fte_t firetalk_chat_internal_remove_member(firetalk_t conn, const char *const room, const char *const nickname) { struct s_firetalk_room *iter; struct s_firetalk_member *memberiter; struct s_firetalk_member *memberprev; VERIFYCONN; for (iter = conn->room_head; iter != NULL; iter = iter->next) if (firetalk_protocols[conn->protocol]->comparenicks(iter->name, room) == FE_SUCCESS) break; if (iter == NULL) /* we don't know about that room */ return(FE_NOTFOUND); memberprev = NULL; for (memberiter = iter->member_head; memberiter != NULL; memberiter = memberiter->next) { if (firetalk_protocols[conn->protocol]->comparenicks(memberiter->nickname,nickname) == FE_SUCCESS) { if (memberprev) memberprev->next = memberiter->next; else iter->member_head = memberiter->next; if (memberiter->nickname) { free(memberiter->nickname); memberiter->nickname = NULL; } free(memberiter); return(FE_SUCCESS); } memberprev = memberiter; } return(FE_SUCCESS); } struct s_firetalk_room *firetalk_find_room(firetalk_t c, const char *const room) { struct s_firetalk_room *roomiter; const char *normalroom; normalroom = firetalk_protocols[c->protocol]->room_normalize(room); for (roomiter = c->room_head; roomiter != NULL; roomiter = roomiter->next) if (firetalk_protocols[c->protocol]->comparenicks(roomiter->name, normalroom) == FE_SUCCESS) return(roomiter); firetalkerror = FE_NOTFOUND; return(NULL); } static struct s_firetalk_member *firetalk_find_member(firetalk_t c, struct s_firetalk_room *r, const char *const name) { struct s_firetalk_member *memberiter; for (memberiter = r->member_head; memberiter != NULL; memberiter = memberiter->next) if (firetalk_protocols[c->protocol]->comparenicks(memberiter->nickname, name) == FE_SUCCESS) return(memberiter); firetalkerror = FE_NOTFOUND; return(NULL); } void firetalk_callback_needpass(client_t c, char *pass, const int size) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_NEEDPASS]) conn->callbacks[FC_NEEDPASS](conn, conn->clientstruct, pass, size); } static const char *isonline_hack = NULL; void firetalk_callback_im_getmessage(client_t c, const char *const sender, const int automessage, const char *const message) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_deny *iter; if (strstr(message, "callbacks[FC_IM_GETMESSAGE]) { for (iter = conn->deny_head; iter != NULL; iter = iter->next) if (firetalk_protocols[conn->protocol]->comparenicks(sender, iter->nickname) == FE_SUCCESS) return; isonline_hack = sender; conn->callbacks[FC_IM_GETMESSAGE](conn, conn->clientstruct, sender, automessage, message); isonline_hack = NULL; } } void firetalk_callback_im_getaction(client_t c, const char *const sender, const int automessage, const char *const message) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_deny *iter; if (conn->callbacks[FC_IM_GETACTION]) { for (iter = conn->deny_head; iter != NULL; iter = iter->next) if (firetalk_protocols[conn->protocol]->comparenicks(sender, iter->nickname) == FE_SUCCESS) return; isonline_hack = sender; conn->callbacks[FC_IM_GETACTION](conn, conn->clientstruct, sender, automessage, message); isonline_hack = NULL; } } void firetalk_callback_im_buddyonline(client_t c, const char *const nickname, int online) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *buddyiter; online = online?1:0; if ((buddyiter = firetalk_im_find_buddy(conn, nickname)) != NULL) if (buddyiter->online != online) { buddyiter->online = online; if (online != 0) { assert(buddyiter->away == 0); assert(buddyiter->typing == 0); assert(buddyiter->warnval == 0); assert(buddyiter->idletime == 0); if (strcmp(buddyiter->nickname, nickname) != 0) { free(buddyiter->nickname); buddyiter->nickname = strdup(nickname); if (buddyiter->nickname == NULL) abort(); } if (conn->callbacks[FC_IM_BUDDYONLINE] != NULL) conn->callbacks[FC_IM_BUDDYONLINE](conn, conn->clientstruct, nickname); } else { buddyiter->away = 0; buddyiter->typing = 0; buddyiter->warnval = 0; buddyiter->idletime = 0; if (conn->callbacks[FC_IM_BUDDYOFFLINE] != NULL) conn->callbacks[FC_IM_BUDDYOFFLINE](conn, conn->clientstruct, nickname); } } } void firetalk_callback_im_buddyaway(client_t c, const char *const nickname, const int away) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *buddyiter; if ((buddyiter = firetalk_im_find_buddy(conn, nickname)) != NULL) if ((buddyiter->away != away) && (buddyiter->online == 1)) { buddyiter->away = away; if ((away == 1) && (conn->callbacks[FC_IM_BUDDYAWAY] != NULL)) conn->callbacks[FC_IM_BUDDYAWAY](conn, conn->clientstruct, nickname); else if ((away == 0) && (conn->callbacks[FC_IM_BUDDYUNAWAY] != NULL)) conn->callbacks[FC_IM_BUDDYUNAWAY](conn, conn->clientstruct, nickname); } } static void firetalk_im_insert_buddy(firetalk_t conn, const char *const name, const char *const group, const char *const friendly) { struct s_firetalk_buddy *newiter; newiter = calloc(1, sizeof(*newiter)); if (newiter == NULL) abort(); newiter->next = conn->buddy_head; conn->buddy_head = newiter; newiter->nickname = strdup(name); if (newiter->nickname == NULL) abort(); newiter->group = strdup(group); if (newiter->group == NULL) abort(); if (friendly == NULL) newiter->friendly = NULL; else { newiter->friendly = strdup(friendly); if (newiter->friendly == NULL) abort(); } } void firetalk_callback_buddyadded(client_t c, const char *const name, const char *const group, const char *const friendly) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (firetalk_im_find_buddy(conn, name) == NULL) { firetalk_im_insert_buddy(conn, name, group, friendly); if (conn->callbacks[FC_IM_BUDDYADDED] != NULL) conn->callbacks[FC_IM_BUDDYADDED](conn, conn->clientstruct, name, group, friendly); } } void firetalk_callback_buddyremoved(client_t c, const char *const name, const char *const group) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *iter; if (((iter = firetalk_im_find_buddy(conn, name)) != NULL) && ((group == NULL) || (strcmp(iter->group, group) == 0))) { firetalk_im_delete_buddy(conn, name); if (conn->callbacks[FC_IM_BUDDYREMOVED] != NULL) conn->callbacks[FC_IM_BUDDYREMOVED](conn, conn->clientstruct, name); } } void firetalk_callback_typing(client_t c, const char *const name, const int typing) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *buddyiter; assert(conn->username != NULL); assert(name != NULL); assert(typing >= 0); if (!conn->callbacks[FC_IM_TYPINGINFO]) return; if ((buddyiter = firetalk_im_find_buddy(conn, name)) != NULL) { assert(buddyiter->online != 0); if (buddyiter->typing != typing) { buddyiter->typing = typing; conn->callbacks[FC_IM_TYPINGINFO](conn, conn->clientstruct, buddyiter->nickname, typing); } } } void firetalk_callback_capabilities(client_t c, const char *const nickname, const char *const caps) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *buddyiter; if (!conn->callbacks[FC_IM_CAPABILITIES]) return; if ((buddyiter = firetalk_im_find_buddy(conn, nickname)) != NULL) if ((buddyiter->capabilities == NULL) || (strcmp(buddyiter->capabilities, caps) != 0)) { free(buddyiter->capabilities); buddyiter->capabilities = strdup(caps); conn->callbacks[FC_IM_CAPABILITIES](conn, conn->clientstruct, nickname, caps); } } void firetalk_callback_warninfo(client_t c, const char *const nickname, const long warnval) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *buddyiter; if (!conn->callbacks[FC_IM_EVILINFO]) return; if ((buddyiter = firetalk_im_find_buddy(conn, nickname)) != NULL) if ((buddyiter->warnval != warnval) && (buddyiter->online == 1)) { buddyiter->warnval = warnval; conn->callbacks[FC_IM_EVILINFO](conn, conn->clientstruct, nickname, warnval); } } void firetalk_callback_error(client_t c, const int error, const char *const roomoruser, const char *const description) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_ERROR]) conn->callbacks[FC_ERROR](conn, conn->clientstruct, error, roomoruser, description); } void firetalk_callback_connectfailed(client_t c, const int error, const char *const description) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->connected == FCS_NOTCONNECTED) return; close(conn->fd); conn->connected = FCS_NOTCONNECTED; if (conn->callbacks[FC_CONNECTFAILED]) conn->callbacks[FC_CONNECTFAILED](conn, conn->clientstruct, error, description); } void firetalk_callback_disconnect(client_t c, const int error) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *buddyiter, *buddynext; struct s_firetalk_deny *denyiter, *denynext; struct s_firetalk_room *roomiter, *roomnext; if (conn->connected == FCS_NOTCONNECTED) return; close(conn->fd); if (conn->username != NULL) { free(conn->username); conn->username = NULL; } for (buddyiter = conn->buddy_head; buddyiter != NULL; buddyiter = buddynext) { buddynext = buddyiter->next; buddyiter->next = NULL; free(buddyiter->nickname); buddyiter->nickname = NULL; free(buddyiter->group); buddyiter->group = NULL; free(buddyiter->friendly); buddyiter->friendly = NULL; if (buddyiter->capabilities != NULL) { free(buddyiter->capabilities); buddyiter->capabilities = NULL; } free(buddyiter); } conn->buddy_head = NULL; for (denyiter = conn->deny_head; denyiter != NULL; denyiter = denynext) { denynext = denyiter->next; denyiter->next = NULL; free(denyiter->nickname); denyiter->nickname = NULL; free(denyiter); } conn->deny_head = NULL; for (roomiter = conn->room_head; roomiter != NULL; roomiter = roomnext) { struct s_firetalk_member *memberiter; struct s_firetalk_member *membernext; roomnext = roomiter->next; roomiter->next = NULL; for (memberiter = roomiter->member_head; memberiter != NULL; memberiter = membernext) { membernext = memberiter->next; memberiter->next = NULL; free(memberiter->nickname); memberiter->nickname = NULL; free(memberiter); } roomiter->member_head = NULL; free(roomiter->name); roomiter->name = NULL; free(roomiter); } conn->room_head = NULL; if (conn->connected == FCS_ACTIVE) { conn->connected = FCS_NOTCONNECTED; if (conn->callbacks[FC_DISCONNECT]) conn->callbacks[FC_DISCONNECT](conn, conn->clientstruct, error); } else conn->connected = FCS_NOTCONNECTED; } void firetalk_callback_gotinfo(client_t c, const char *const nickname, const char *const info, const int warning, const long online, const long idle, const int flags) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_IM_GOTINFO]) conn->callbacks[FC_IM_GOTINFO](conn, conn->clientstruct, nickname, info, warning, online, idle, flags); } void firetalk_callback_idleinfo(client_t c, const char *const nickname, const long idletime) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *buddyiter; if (!conn->callbacks[FC_IM_IDLEINFO]) return; if ((buddyiter = firetalk_im_find_buddy(conn, nickname)) != NULL) if ((buddyiter->idletime != idletime) && (buddyiter->online == 1)) { buddyiter->idletime = idletime; conn->callbacks[FC_IM_IDLEINFO](conn, conn->clientstruct, nickname, idletime); } } void firetalk_callback_statusinfo(client_t c, const char *const nickname, const char *const message) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *buddyiter; if (conn->callbacks[FC_IM_STATUSINFO]) conn->callbacks[FC_IM_STATUSINFO](conn, conn->clientstruct, nickname, message); } void firetalk_callback_doinit(client_t c, const char *const nickname) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_DOINIT]) conn->callbacks[FC_DOINIT](conn, conn->clientstruct, nickname); } void firetalk_callback_setidle(client_t c, long *const idle) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_SETIDLE]) conn->callbacks[FC_SETIDLE](conn, conn->clientstruct, idle); } void firetalk_callback_eviled(client_t c, const int newevil, const char *const eviler) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_EVILED]) conn->callbacks[FC_EVILED](conn, conn->clientstruct, newevil, eviler); } void firetalk_callback_newnick(client_t c, const char *const nickname) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_NEWNICK]) conn->callbacks[FC_NEWNICK](conn, conn->clientstruct, nickname); } void firetalk_callback_passchanged(client_t c) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_PASSCHANGED]) conn->callbacks[FC_PASSCHANGED](conn, conn->clientstruct); } void firetalk_callback_user_nickchanged(client_t c, const char *const oldnick, const char *const newnick) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_buddy *buddyiter; struct s_firetalk_room *roomiter; struct s_firetalk_member *memberiter; char *tempstr; if ((buddyiter = firetalk_im_find_buddy(conn, oldnick)) != NULL) if (strcmp(buddyiter->nickname, newnick) != 0) { tempstr = buddyiter->nickname; buddyiter->nickname = strdup(newnick); if (buddyiter->nickname == NULL) abort(); if (conn->callbacks[FC_IM_USER_NICKCHANGED]) conn->callbacks[FC_IM_USER_NICKCHANGED](conn, conn->clientstruct, tempstr, newnick); free(tempstr); } for (roomiter = conn->room_head; roomiter != NULL; roomiter = roomiter->next) for (memberiter = roomiter->member_head; memberiter != NULL; memberiter = memberiter->next) if (firetalk_protocols[conn->protocol]->comparenicks(memberiter->nickname, oldnick) == FE_SUCCESS) { if (strcmp(memberiter->nickname, newnick) != 0) { tempstr = memberiter->nickname; memberiter->nickname = strdup(newnick); if (memberiter->nickname == NULL) abort(); if (conn->callbacks[FC_CHAT_USER_NICKCHANGED]) conn->callbacks[FC_CHAT_USER_NICKCHANGED](conn, conn->clientstruct, roomiter->name, tempstr, newnick); free(tempstr); } break; } } void firetalk_callback_chat_joined(client_t c, const char *const room) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (firetalk_chat_internal_add_room(conn, room) != FE_SUCCESS) return; } void firetalk_callback_chat_left(client_t c, const char *const room) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (firetalk_chat_internal_remove_room(conn, room) != FE_SUCCESS) return; if (conn->callbacks[FC_CHAT_LEFT]) conn->callbacks[FC_CHAT_LEFT](conn, conn->clientstruct, room); } void firetalk_callback_chat_kicked(client_t c, const char *const room, const char *const by, const char *const reason) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (firetalk_chat_internal_remove_room(conn, room) != FE_SUCCESS) return; if (conn->callbacks[FC_CHAT_KICKED]) conn->callbacks[FC_CHAT_KICKED](conn, conn->clientstruct, room, by, reason); } void firetalk_callback_chat_getmessage(client_t c, const char *const room, const char *const from, const int automessage, const char *const message) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_CHAT_GETMESSAGE]) conn->callbacks[FC_CHAT_GETMESSAGE](conn, conn->clientstruct, room, from, automessage, message); } void firetalk_callback_chat_getaction(client_t c, const char *const room, const char *const from, const int automessage, const char *const message) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_CHAT_GETACTION]) conn->callbacks[FC_CHAT_GETACTION](conn, conn->clientstruct, room, from, automessage, message); } void firetalk_callback_chat_invited(client_t c, const char *const room, const char *const from, const char *const message) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_CHAT_INVITED]) conn->callbacks[FC_CHAT_INVITED](conn, conn->clientstruct, room, from, message); } void firetalk_callback_chat_user_joined(client_t c, const char *const room, const char *const who, const char *const extra) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_room *iter; iter = firetalk_find_room(conn, room); if (iter == NULL) return; if (who == NULL) { if (iter->sentjoin == 0) { iter->sentjoin = 1; if (conn->callbacks[FC_CHAT_JOINED]) conn->callbacks[FC_CHAT_JOINED](conn, conn->clientstruct, room); } } else { if (firetalk_chat_internal_add_member(conn, room, who) != FE_SUCCESS) return; if (iter->sentjoin == 1) if (conn->callbacks[FC_CHAT_USER_JOINED]) conn->callbacks[FC_CHAT_USER_JOINED](conn, conn->clientstruct, room, who, extra); } } void firetalk_callback_chat_user_left(client_t c, const char *const room, const char *const who, const char *const reason) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (firetalk_chat_internal_remove_member(conn, room, who) != FE_SUCCESS) return; if (conn->callbacks[FC_CHAT_USER_LEFT]) conn->callbacks[FC_CHAT_USER_LEFT](conn, conn->clientstruct, room, who, reason); } void firetalk_callback_chat_user_quit(client_t c, const char *const who, const char *const reason) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_room *roomiter; struct s_firetalk_member *memberiter, *membernext; for (roomiter = conn->room_head; roomiter != NULL; roomiter = roomiter->next) for (memberiter = roomiter->member_head; memberiter != NULL; memberiter = membernext) { membernext = memberiter->next; if (firetalk_protocols[conn->protocol]->comparenicks(memberiter->nickname, who) == FE_SUCCESS) firetalk_callback_chat_user_left(c, roomiter->name, who, reason); } } void firetalk_callback_chat_gottopic(client_t c, const char *const room, const char *const topic, const char *const author) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_room *r; r = firetalk_find_room(conn, room); if (r != NULL) if (conn->callbacks[FC_CHAT_GOTTOPIC]) conn->callbacks[FC_CHAT_GOTTOPIC](conn, conn->clientstruct, room, topic, author); } #ifdef RAWIRCMODES void firetalk_callback_chat_modechanged(client_t c, const char *const room, const char *const mode, const char *const by) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_CHAT_MODECHANGED]) conn->callbacks[FC_CHAT_MODECHANGED](conn, conn->clientstruct, room, mode, by); } #endif void firetalk_callback_chat_user_opped(client_t c, const char *const room, const char *const who, const char *const by) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_room *r; struct s_firetalk_member *m; r = firetalk_find_room(conn, room); if (r == NULL) return; m = firetalk_find_member(conn, r, who); if (m == NULL) return; if (m->admin == 0) { m->admin = 1; if (conn->callbacks[FC_CHAT_USER_OPPED]) conn->callbacks[FC_CHAT_USER_OPPED](conn, conn->clientstruct, room, who, by); } } void firetalk_callback_chat_user_deopped(client_t c, const char *const room, const char *const who, const char *const by) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_room *r; struct s_firetalk_member *m; r = firetalk_find_room(conn, room); if (r == NULL) return; m = firetalk_find_member(conn, r, who); if (m == NULL) return; if (m->admin == 1) { m->admin = 0; if (conn->callbacks[FC_CHAT_USER_DEOPPED]) conn->callbacks[FC_CHAT_USER_DEOPPED](conn, conn->clientstruct, room, who, by); } } void firetalk_callback_chat_keychanged(client_t c, const char *const room, const char *const what, const char *const by) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (conn->callbacks[FC_CHAT_KEYCHANGED]) conn->callbacks[FC_CHAT_KEYCHANGED](conn, conn->clientstruct, room, what, by); } void firetalk_callback_chat_opped(client_t c, const char *const room, const char *const by) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_room *r; r = firetalk_find_room(conn,room); if (r == NULL) return; if (r->admin == 0) r->admin = 1; else return; if (conn->callbacks[FC_CHAT_OPPED]) conn->callbacks[FC_CHAT_OPPED](conn, conn->clientstruct, room, by); } void firetalk_callback_chat_deopped(client_t c, const char *const room, const char *const by) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_room *r; r = firetalk_find_room(conn,room); if (r == NULL) return; if (r->admin == 1) r->admin = 0; else return; if (conn->callbacks[FC_CHAT_DEOPPED]) conn->callbacks[FC_CHAT_DEOPPED](conn, conn->clientstruct, room, by); } void firetalk_callback_chat_user_kicked(client_t c, const char *const room, const char *const who, const char *const by, const char *const reason) { struct s_firetalk_handle *conn = firetalk_find_handle(c); if (firetalk_chat_internal_remove_member(conn, room, who) != FE_SUCCESS) return; if (conn->callbacks[FC_CHAT_USER_KICKED]) conn->callbacks[FC_CHAT_USER_KICKED](conn, conn->clientstruct, room, who, by, reason); } const char *firetalk_subcode_get_request_reply(client_t c, const char *const command) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_subcode_callback *iter; for (iter = conn->subcode_request_head; iter != NULL; iter = iter->next) if (strcmp(command, iter->command) == 0) if (iter->staticresp != NULL) return(iter->staticresp); return(NULL); } void firetalk_callback_subcode_request(client_t c, const char *const from, const char *const command, char *args) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_subcode_callback *iter; enum firetalk_connectstate connectedsave = conn->connected; /* nasty hack: some IRC servers send CTCP VERSION requests during signon, before 001, and demand a reply; idiots */ conn->connected = FCS_ACTIVE; for (iter = conn->subcode_request_head; iter != NULL; iter = iter->next) if (strcmp(command, iter->command) == 0) { if (iter->staticresp != NULL) firetalk_subcode_send_reply(conn, from, command, iter->staticresp); else { isonline_hack = from; iter->callback(conn, conn->clientstruct, from, command, args); isonline_hack = NULL; } conn->connected = connectedsave; return; } if (strcmp(command, "ACTION") == 0) /* we don't support chatroom subcodes, so we're just going to assume that this is a private ACTION and let the protocol code handle the other case */ firetalk_callback_im_getaction(c, from, 0, args); else if (strcmp(command, "VERSION") == 0) firetalk_subcode_send_reply(conn, from, "VERSION", PACKAGE_NAME ":" PACKAGE_VERSION ":unknown"); else if (strcmp(command, "CLIENTINFO") == 0) firetalk_subcode_send_reply(conn, from, "CLIENTINFO", "CLIENTINFO PING SOURCE TIME VERSION"); else if (strcmp(command, "PING") == 0) { if (args != NULL) firetalk_subcode_send_reply(conn, from, "PING", args); else firetalk_subcode_send_reply(conn, from, "PING", ""); } else if (strcmp(command, "TIME") == 0) { time_t temptime; char tempbuf[64]; size_t s; time(&temptime); strncpy(tempbuf, ctime(&temptime), sizeof(tempbuf)-1); tempbuf[sizeof(tempbuf)-1] = 0; s = strlen(tempbuf); if (s > 0) tempbuf[s-1] = '\0'; firetalk_subcode_send_reply(conn, from, "TIME", tempbuf); } else if ((strcmp(command,"DCC") == 0) && (args != NULL) && (strncasecmp(args, "SEND ", 5) == 0)) { /* DCC send */ struct in_addr addr; unsigned long ip; long size = -1; uint16_t port; char **myargs; #ifdef _FC_USE_IPV6 struct in6_addr addr6; struct in6_addr *sendaddr6 = NULL; #endif myargs = firetalk_parse_subcode_args(&args[5]); if ((myargs[0] != NULL) && (myargs[1] != NULL) && (myargs[2] != NULL)) { /* valid dcc send */ if (myargs[3] != NULL) { size = atol(myargs[3]); #ifdef _FC_USE_IPV6 if (myargs[4] != NULL) { /* ipv6-enabled dcc */ inet_pton(AF_INET6,myargs[4],&addr6); sendaddr6 = &addr6; } #endif } sscanf(myargs[1], "%lu", &ip); ip = htonl(ip); memcpy(&addr.s_addr, &ip, 4); port = (uint16_t)atoi(myargs[2]); firetalk_callback_file_offer(c, from, myargs[0], size, inet_ntoa(addr), NULL, port, FF_TYPE_DCC); } } else if (conn->subcode_request_default != NULL) conn->subcode_request_default->callback(conn, conn->clientstruct, from, command, args); conn->connected = connectedsave; } void firetalk_callback_subcode_reply(client_t c, const char *const from, const char *const command, const char *const args) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_subcode_callback *iter; for (iter = conn->subcode_reply_head; iter != NULL; iter = iter->next) if (strcmp(command, iter->command) == 0) { isonline_hack = from; iter->callback(conn, conn->clientstruct, from, command, args); isonline_hack = NULL; return; } if (conn->subcode_reply_default != NULL) conn->subcode_reply_default->callback(conn, conn->clientstruct, from, command, args); } /* size may be -1 if unknown (0 is valid) */ void firetalk_callback_file_offer(client_t c, const char *const from, const char *const filename, const long size, const char *const ipstring, const char *const ip6string, const uint16_t port, const int type) { struct s_firetalk_handle *conn = firetalk_find_handle(c); struct s_firetalk_file *iter; iter = conn->file_head; conn->file_head = calloc(1, sizeof(struct s_firetalk_file)); if (conn->file_head == NULL) abort(); conn->file_head->who = strdup(from); if (conn->file_head->who == NULL) abort(); conn->file_head->filename = strdup(filename); if (conn->file_head->filename == NULL) abort(); conn->file_head->size = size; conn->file_head->bytes = 0; conn->file_head->acked = 0; conn->file_head->state = FF_STATE_WAITLOCAL; conn->file_head->direction = FF_DIRECTION_RECEIVING; conn->file_head->sockfd = -1; conn->file_head->filefd = -1; conn->file_head->port = htons(port); conn->file_head->type = type; conn->file_head->next = iter; conn->file_head->clientfilestruct = NULL; if (inet_aton(ipstring, &conn->file_head->inet_ip) == 0) { firetalk_file_cancel(c, conn->file_head); return; } #ifdef _FC_USE_IPV6 conn->file_head->tryinet6 = 0; if (ip6string) if (inet_pton(AF_INET6, ip6string, &conn->file_head->inet6_ip) != 0) conn->file_head->tryinet6 = 1; #endif if (conn->callbacks[FC_FILE_OFFER]) conn->callbacks[FC_FILE_OFFER](conn, conn->clientstruct, (void *)conn->file_head, from, filename, size); } void firetalk_handle_receive(struct s_firetalk_handle *c, struct s_firetalk_file *filestruct) { /* we have to copy from sockfd to filefd until we run out, then send the packet */ static char buffer[4096]; unsigned long netbytes; ssize_t s; while ((s = recv(filestruct->sockfd, buffer, 4096, MSG_DONTWAIT)) == 4096) { if (write(filestruct->filefd, buffer, 4096) != 4096) { if (c->callbacks[FC_FILE_ERROR]) c->callbacks[FC_FILE_ERROR](c, c->clientstruct, filestruct, filestruct->clientfilestruct, FE_IOERROR); firetalk_file_cancel(c, filestruct); return; } filestruct->bytes += 4096; } if (s != -1) { if (write(filestruct->filefd, buffer, (size_t)s) != s) { if (c->callbacks[FC_FILE_ERROR]) c->callbacks[FC_FILE_ERROR](c, c->clientstruct, filestruct, filestruct->clientfilestruct, FE_IOERROR); firetalk_file_cancel(c, filestruct); return; } filestruct->bytes += s; } if (filestruct->type == FF_TYPE_DCC) { netbytes = htonl((uint32_t)filestruct->bytes); if (write(filestruct->sockfd, &netbytes, 4) != 4) { if (c->callbacks[FC_FILE_ERROR]) c->callbacks[FC_FILE_ERROR](c, c->clientstruct, filestruct, filestruct->clientfilestruct, FE_IOERROR); firetalk_file_cancel(c, filestruct); return; } } if (c->callbacks[FC_FILE_PROGRESS]) c->callbacks[FC_FILE_PROGRESS](c, c->clientstruct, filestruct, filestruct->clientfilestruct, filestruct->bytes, filestruct->size); if (filestruct->bytes == filestruct->size) { if (c->callbacks[FC_FILE_FINISH]) c->callbacks[FC_FILE_FINISH](c, c->clientstruct, filestruct, filestruct->clientfilestruct, filestruct->size); firetalk_file_cancel(c, filestruct); } } void firetalk_handle_send(struct s_firetalk_handle *c, struct s_firetalk_file *filestruct) { /* we have to copy from filefd to sockfd until we run out or sockfd refuses the data */ static char buffer[4096]; ssize_t s; while ((s = read(filestruct->filefd, buffer, 4096)) == 4096) { if ((s = send(filestruct->sockfd, buffer, 4096, MSG_DONTWAIT|MSG_NOSIGNAL)) != 4096) { lseek(filestruct->filefd, -(4096 - s), SEEK_CUR); filestruct->bytes += s; if (c->callbacks[FC_FILE_PROGRESS]) c->callbacks[FC_FILE_PROGRESS](c, c->clientstruct, filestruct, filestruct->clientfilestruct, filestruct->bytes, filestruct->size); return; } filestruct->bytes += s; if (c->callbacks[FC_FILE_PROGRESS]) c->callbacks[FC_FILE_PROGRESS](c, c->clientstruct, filestruct, filestruct->clientfilestruct, filestruct->bytes, filestruct->size); if (filestruct->type == FF_TYPE_DCC) { uint32_t acked = 0; while (recv(filestruct->sockfd, &acked, 4, MSG_DONTWAIT) == 4) filestruct->acked = ntohl(acked); } } if (send(filestruct->sockfd, buffer, s, MSG_NOSIGNAL) != s) { if (c->callbacks[FC_FILE_ERROR]) c->callbacks[FC_FILE_ERROR](c, c->clientstruct, filestruct, filestruct->clientfilestruct, FE_IOERROR); firetalk_file_cancel(c, filestruct); return; } filestruct->bytes += s; if (filestruct->type == FF_TYPE_DCC) { while (filestruct->acked < (uint32_t)filestruct->bytes) { uint32_t acked = 0; if (recv(filestruct->sockfd, &acked, 4, 0) == 4) filestruct->acked = ntohl(acked); } } if (c->callbacks[FC_FILE_PROGRESS]) c->callbacks[FC_FILE_PROGRESS](c, c->clientstruct, filestruct, filestruct->clientfilestruct, filestruct->bytes, filestruct->size); if (c->callbacks[FC_FILE_FINISH]) c->callbacks[FC_FILE_FINISH](c, c->clientstruct, filestruct, filestruct->clientfilestruct, filestruct->bytes); firetalk_file_cancel(c, filestruct); } /* External function definitions */ const char *firetalk_strprotocol(const enum firetalk_protocol p) { if ((p >= 0) && (p < FP_MAX)) return(firetalk_protocols[p]->strprotocol); return(NULL); } const char *firetalk_strerror(const fte_t e) { switch (e) { case FE_SUCCESS: return("Success"); case FE_CONNECT: return("Connection failed"); case FE_NOMATCH: return("Usernames do not match"); case FE_PACKET: return("Packet transfer error"); case FE_RECONNECTING: return("Server wants us to reconnect elsewhere"); case FE_BADUSERPASS: return("Invalid username or password"); case FE_SEQUENCE: return("Invalid sequence number from server"); case FE_FRAMETYPE: return("Invalid frame type from server"); case FE_PACKETSIZE: return("Packet too long"); case FE_SERVER: return("Server problem; try again later"); case FE_UNKNOWN: return("Unknown error"); case FE_BLOCKED: return("You are blocked"); case FE_WEIRDPACKET: return("Unknown packet received from server"); case FE_CALLBACKNUM: return("Invalid callback number"); case FE_BADUSER: return("Invalid username"); case FE_NOTFOUND: return("Username not found in list"); case FE_DISCONNECT: return("Server disconnected"); case FE_SOCKET: return("Unable to create socket"); case FE_RESOLV: return("Unable to resolve hostname"); case FE_VERSION: return("Wrong server version"); case FE_USERUNAVAILABLE: return("User is currently unavailable"); case FE_USERINFOUNAVAILABLE: return("User information is currently unavailable"); case FE_TOOFAST: return("You are sending messages too fast; last message was dropped"); case FE_ROOMUNAVAILABLE: return("Chat room is currently unavailable"); case FE_INCOMINGERROR: return("Incoming message delivery failure"); case FE_USERDISCONNECT: return("User disconnected"); case FE_INVALIDFORMAT: return("Server response was formatted incorrectly"); case FE_IDLEFAST: return("You have requested idle to be reset too fast"); case FE_BADROOM: return("Invalid room name"); case FE_BADMESSAGE: return("Invalid message (too long?)"); case FE_MESSAGETRUNCATED: return("Message truncated"); case FE_BADPROTO: return("Invalid protocol"); case FE_NOTCONNECTED: return("Not connected"); case FE_BADCONNECTION: return("Invalid connection number"); case FE_NOPERMS: return("No permission to perform operation"); case FE_NOCHANGEPASS: return("Unable to change password"); case FE_DUPEROOM: return("Room already in list"); case FE_IOERROR: return("Input/output error"); case FE_BADHANDLE: return("Invalid handle"); case FE_TIMEOUT: return("Operation timed out"); default: return("Invalid error number"); } } firetalk_t firetalk_create_handle(const int protocol, void *clientstruct) { struct s_firetalk_handle *c; if ((protocol < 0) || (protocol >= FP_MAX)) { firetalkerror = FE_BADPROTO; return(NULL); } c = handle_head; handle_head = calloc(1, sizeof(*handle_head)); if (handle_head == NULL) abort(); handle_head->buffer = calloc(1, firetalk_protocols[protocol]->default_buffersize); if (handle_head->buffer == NULL) abort(); handle_head->clientstruct = clientstruct; handle_head->next = c; handle_head->connected = FCS_NOTCONNECTED; handle_head->protocol = protocol; handle_head->handle = firetalk_protocols[protocol]->create_handle(); return(handle_head); } void firetalk_destroy_handle(firetalk_t conn) { VERIFYCONN; assert(conn->deleted == 0); assert(conn->handle != NULL); firetalk_protocols[conn->protocol]->destroy_handle(conn->handle); conn->handle = NULL; conn->deleted = 1; } fte_t firetalk_disconnect(firetalk_t conn) { VERIFYCONN; if (conn->connected == FCS_NOTCONNECTED) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->disconnect(conn->handle)); } fte_t firetalk_signon(firetalk_t conn, const char *server, short port, const char *const username) { VERIFYCONN; if (conn->connected != FCS_NOTCONNECTED) { firetalk_disconnect(conn); conn->connected = FCS_NOTCONNECTED; } free(conn->username); conn->username = strdup(username); if (conn->username == NULL) abort(); conn->bufferpos = 0; if (server == NULL) server = firetalk_protocols[conn->protocol]->default_server; if (port == 0) port = firetalk_protocols[conn->protocol]->default_port; errno = 0; conn->fd = firetalk_internal_connect_host_addr(server, port, &(conn->remote_addr) #ifdef _FC_USE_IPV6 , &(conn->remote_addr6) #endif ); if (conn->fd != -1) { conn->connected = FCS_WAITING_SYNACK; return(FE_SUCCESS); } else return(firetalkerror); } fte_t firetalk_handle_synack(firetalk_t conn) { int i; unsigned int o = sizeof(int); if (getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, &i, &o)) { close(conn->fd); conn->connected = FCS_NOTCONNECTED; if (conn->callbacks[FC_CONNECTFAILED]) conn->callbacks[FC_CONNECTFAILED](conn, conn->clientstruct, FE_SOCKET, strerror(errno)); return(FE_SOCKET); } if (i != 0) { close(conn->fd); conn->connected = FCS_NOTCONNECTED; if (conn->callbacks[FC_CONNECTFAILED]) conn->callbacks[FC_CONNECTFAILED](conn, conn->clientstruct, FE_CONNECT, strerror(i)); return(FE_CONNECT); } conn->connected = FCS_WAITING_SIGNON; i = firetalk_protocols[conn->protocol]->signon(conn->handle, conn->username); if (i != FE_SUCCESS) return(i); return(FE_SUCCESS); } void firetalk_callback_connected(client_t c) { unsigned int l; struct sockaddr_in addr; struct s_firetalk_handle *conn = firetalk_find_handle(c); conn->connected = FCS_ACTIVE; l = (unsigned int)sizeof(struct sockaddr_in); getsockname(conn->fd, (struct sockaddr *)&addr, &l); memcpy(&conn->localip, &addr.sin_addr.s_addr, 4); conn->localip = htonl((uint32_t)conn->localip); if (conn->callbacks[FC_CONNECTED]) conn->callbacks[FC_CONNECTED](conn, conn->clientstruct); } fte_t firetalk_handle_file_synack(firetalk_t conn, struct s_firetalk_file *file) { int i; unsigned int o = sizeof(int); if (getsockopt(file->sockfd, SOL_SOCKET, SO_ERROR, &i, &o)) { firetalk_file_cancel(conn, file); return(FE_SOCKET); } if (i != 0) { firetalk_file_cancel(conn, file); return(FE_CONNECT); } file->state = FF_STATE_TRANSFERRING; if (conn->callbacks[FC_FILE_START]) conn->callbacks[FC_FILE_START](conn, conn->clientstruct, file, file->clientfilestruct); return(FE_SUCCESS); } enum firetalk_protocol firetalk_get_protocol(firetalk_t conn) { VERIFYCONN; return(conn->protocol); } fte_t firetalk_register_callback(firetalk_t conn, const int type, void (*function)(firetalk_t, void *, ...)) { VERIFYCONN; if (type < 0 || type >= FC_MAX) return(FE_CALLBACKNUM); conn->callbacks[type] = function; return(FE_SUCCESS); } fte_t firetalk_im_add_buddy(firetalk_t conn, const char *const name, const char *const group, const char *const friendly) { struct s_firetalk_buddy *iter; VERIFYCONN; if ((iter = firetalk_im_find_buddy(conn, name)) != NULL) { if (!((strcmp(iter->group, group) == 0) && (((iter->friendly == NULL) && (friendly == NULL)) || ((iter->friendly != NULL) && (friendly != NULL) && (strcmp(iter->friendly, friendly) == 0))))) { /* user is in buddy list somewhere other than where the clients wants it */ if (conn->connected != FCS_NOTCONNECTED) { fte_t ret; ret = firetalk_protocols[conn->protocol]->im_remove_buddy(conn->handle, iter->nickname, iter->group); if (ret != FE_SUCCESS) return(ret); } free(iter->group); iter->group = strdup(group); if (iter->group == NULL) abort(); free(iter->friendly); if (friendly == NULL) iter->friendly = NULL; else { iter->friendly = strdup(friendly); if (iter->friendly == NULL) abort(); } } } else firetalk_im_insert_buddy(conn, name, group, friendly); if (conn->connected != FCS_NOTCONNECTED) { fte_t ret; ret = firetalk_protocols[conn->protocol]->im_add_buddy(conn->handle, name, group, friendly); if (ret != FE_SUCCESS) return(ret); } if ((isonline_hack != NULL) && (firetalk_protocols[conn->protocol]->comparenicks(name, isonline_hack) == FE_SUCCESS)) firetalk_callback_im_buddyonline(conn->handle, isonline_hack, 1); return(FE_SUCCESS); } fte_t firetalk_im_add_deny(firetalk_t conn, const char *const nickname) { int ret; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); ret = firetalk_im_internal_add_deny(conn,nickname); if (ret != FE_SUCCESS) return(ret); return(firetalk_protocols[conn->protocol]->im_add_deny(conn->handle,nickname)); } fte_t firetalk_im_remove_deny(firetalk_t conn, const char *const nickname) { int ret; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); ret = firetalk_im_internal_remove_deny(conn,nickname); if (ret != FE_SUCCESS) return(ret); return(firetalk_protocols[conn->protocol]->im_remove_deny(conn->handle,nickname)); } fte_t firetalk_im_upload_buddies(firetalk_t conn) { VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->im_upload_buddies(conn->handle)); } fte_t firetalk_im_upload_denies(firetalk_t conn) { VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->im_upload_denies(conn->handle)); } fte_t firetalk_chat_requestextended(firetalk_t conn, const char * const room) { const char *normalroom; if (conn->connected != FCS_ACTIVE) return FE_NOTCONNECTED; normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return FE_ROOMUNAVAILABLE; return firetalk_protocols[conn->protocol]->chat_requestextended(conn->handle,normalroom); } fte_t firetalk_im_send_message(firetalk_t conn, const char *const dest, const char *const message, const int auto_flag) { fte_t e; VERIFYCONN; if ((conn->connected != FCS_ACTIVE) && (strcasecmp(dest, ":RAW") != 0)) return(FE_NOTCONNECTED); e = firetalk_protocols[conn->protocol]->im_send_message(conn->handle, dest, message, auto_flag); if (e != FE_SUCCESS) return(e); e = firetalk_protocols[conn->protocol]->periodic(conn); if (e != FE_SUCCESS && e != FE_IDLEFAST) return(e); return(FE_SUCCESS); } fte_t firetalk_im_send_action(firetalk_t conn, const char *const dest, const char *const message, const int auto_flag) { fte_t e; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); e = firetalk_protocols[conn->protocol]->im_send_action(conn->handle, dest, message, auto_flag); if (e != FE_SUCCESS) return(e); e = firetalk_protocols[conn->protocol]->periodic(conn); if (e != FE_SUCCESS && e != FE_IDLEFAST) return(e); return(FE_SUCCESS); } fte_t firetalk_im_get_info(firetalk_t conn, const char *const nickname) { VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->get_info(conn->handle, nickname)); } fte_t firetalk_set_info(firetalk_t conn, const char *const info) { VERIFYCONN; if (conn->connected == FCS_NOTCONNECTED) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->set_info(conn->handle, info)); } fte_t firetalk_im_list_buddies(firetalk_t conn) { struct s_firetalk_buddy *buddyiter; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); if (!conn->callbacks[FC_IM_LISTBUDDY]) return(FE_SUCCESS); for (buddyiter = conn->buddy_head; buddyiter != NULL; buddyiter = buddyiter->next) conn->callbacks[FC_IM_LISTBUDDY](conn, conn->clientstruct, buddyiter->nickname, buddyiter->group, buddyiter->friendly, buddyiter->online, buddyiter->away, buddyiter->idletime); return(FE_SUCCESS); } fte_t firetalk_chat_listmembers(firetalk_t conn, const char *const roomname) { struct s_firetalk_room *room; struct s_firetalk_member *memberiter; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); if (!conn->callbacks[FC_CHAT_LISTMEMBER]) return(FE_SUCCESS); room = firetalk_find_room(conn, roomname); if (room == NULL) return(firetalkerror); for (memberiter = room->member_head; memberiter != NULL; memberiter = memberiter->next) conn->callbacks[FC_CHAT_LISTMEMBER](conn, conn->clientstruct, room->name, memberiter->nickname, memberiter->admin); return(FE_SUCCESS); } const char *firetalk_chat_normalize(firetalk_t conn, const char *const room) { return(firetalk_protocols[conn->protocol]->room_normalize(room)); } fte_t firetalk_set_away(firetalk_t conn, const char *const message, const int auto_flag) { VERIFYCONN; if (conn->connected == FCS_NOTCONNECTED) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->set_away(conn->handle, message, auto_flag)); } fte_t firetalk_set_nickname(firetalk_t conn, const char *const nickname) { VERIFYCONN; if (conn->connected == FCS_NOTCONNECTED) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->set_nickname(conn->handle, nickname)); } fte_t firetalk_set_password(firetalk_t conn, const char *const oldpass, const char *const newpass) { VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->set_password(conn->handle, oldpass, newpass)); } fte_t firetalk_set_privacy(firetalk_t conn, const char *const mode) { VERIFYCONN; assert(mode != NULL); if (conn->connected == FCS_NOTCONNECTED) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->set_privacy(conn->handle, mode)); } fte_t firetalk_im_evil(firetalk_t conn, const char *const who) { VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); return(firetalk_protocols[conn->protocol]->im_evil(conn->handle, who)); } fte_t firetalk_chat_join(firetalk_t conn, const char *const room) { const char *normalroom; VERIFYCONN; if (conn->connected == FCS_NOTCONNECTED) return(FE_NOTCONNECTED); normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return(FE_ROOMUNAVAILABLE); return(firetalk_protocols[conn->protocol]->chat_join(conn->handle, normalroom)); } fte_t firetalk_chat_part(firetalk_t conn, const char *const room) { const char *normalroom; VERIFYCONN; if (conn->connected == FCS_NOTCONNECTED) return(FE_NOTCONNECTED); normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return(FE_ROOMUNAVAILABLE); return(firetalk_protocols[conn->protocol]->chat_part(conn->handle, normalroom)); } fte_t firetalk_chat_send_message(firetalk_t conn, const char *const room, const char *const message, const int auto_flag) { const char *normalroom; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); if (*room == ':') normalroom = room; else normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return(FE_ROOMUNAVAILABLE); return(firetalk_protocols[conn->protocol]->chat_send_message(conn->handle, normalroom, message, auto_flag)); } fte_t firetalk_chat_send_action(firetalk_t conn, const char *const room, const char *const message, const int auto_flag) { const char *normalroom; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return(FE_ROOMUNAVAILABLE); return(firetalk_protocols[conn->protocol]->chat_send_action(conn->handle, normalroom, message, auto_flag)); } fte_t firetalk_chat_invite(firetalk_t conn, const char *const room, const char *const who, const char *const message) { const char *normalroom; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return(FE_ROOMUNAVAILABLE); return(firetalk_protocols[conn->protocol]->chat_invite(conn->handle, normalroom, who, message)); } fte_t firetalk_chat_set_topic(firetalk_t conn, const char *const room, const char *const topic) { const char *normalroom; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return(FE_ROOMUNAVAILABLE); return(firetalk_protocols[conn->protocol]->chat_set_topic(conn->handle, normalroom, topic)); } fte_t firetalk_chat_op(firetalk_t conn, const char *const room, const char *const who) { const char *normalroom; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return(FE_ROOMUNAVAILABLE); return(firetalk_protocols[conn->protocol]->chat_op(conn->handle, normalroom, who)); } fte_t firetalk_chat_deop(firetalk_t conn, const char *const room, const char *const who) { const char *normalroom; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return(FE_ROOMUNAVAILABLE); return(firetalk_protocols[conn->protocol]->chat_deop(conn->handle, normalroom, who)); } fte_t firetalk_chat_kick(firetalk_t conn, const char *const room, const char *const who, const char *const reason) { const char *normalroom; VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); normalroom = firetalk_protocols[conn->protocol]->room_normalize(room); if (!normalroom) return(FE_ROOMUNAVAILABLE); return(firetalk_protocols[conn->protocol]->chat_kick(conn->handle, normalroom, who, reason)); } fte_t firetalk_subcode_send_request(firetalk_t conn, const char *const to, const char *const command, const char *const args) { VERIFYCONN; if (conn->connected != FCS_ACTIVE) return(FE_NOTCONNECTED); // return(firetalk_protocols[conn->protocol]->subcode_send_request(conn->handle, to, command, args)); firetalk_enqueue(&conn->subcode_requests, to, firetalk_protocols[conn->protocol]->subcode_encode(conn->handle, command, args)); return(FE_SUCCESS); } fte_t firetalk_subcode_send_reply(firetalk_t conn, const char *const to, const char *const command, const char *const args) { VERIFYCONN; if ((conn->connected != FCS_ACTIVE) && (*to != ':')) return(FE_NOTCONNECTED); // return(firetalk_protocols[conn->protocol]->subcode_send_reply(conn->handle, to, command, args)); firetalk_enqueue(&conn->subcode_replies, to, firetalk_protocols[conn->protocol]->subcode_encode(conn->handle, command, args)); return(FE_SUCCESS); } fte_t firetalk_subcode_register_request_callback(firetalk_t conn, const char *const command, void (*callback)(firetalk_t, void *, const char *const, const char *const, const char *const)) { struct s_firetalk_subcode_callback *iter; VERIFYCONN; if (command == NULL) { if (conn->subcode_request_default) free(conn->subcode_request_default); conn->subcode_request_default = calloc(1, sizeof(struct s_firetalk_subcode_callback)); if (conn->subcode_request_default == NULL) abort(); conn->subcode_request_default->callback = (ptrtofnct)callback; } else { iter = conn->subcode_request_head; conn->subcode_request_head = calloc(1, sizeof(struct s_firetalk_subcode_callback)); if (conn->subcode_request_head == NULL) abort(); conn->subcode_request_head->next = iter; conn->subcode_request_head->command = strdup(command); if (conn->subcode_request_head->command == NULL) abort(); conn->subcode_request_head->callback = (ptrtofnct)callback; } return(FE_SUCCESS); } fte_t firetalk_subcode_register_request_reply(firetalk_t conn, const char *const command, const char *const reply) { struct s_firetalk_subcode_callback *iter; VERIFYCONN; if (command == NULL) { if (conn->subcode_request_default) free(conn->subcode_request_default); conn->subcode_request_default = calloc(1, sizeof(struct s_firetalk_subcode_callback)); if (conn->subcode_request_default == NULL) abort(); conn->subcode_request_default->staticresp = strdup(reply); if (conn->subcode_request_default->staticresp == NULL) abort(); } else { iter = conn->subcode_request_head; conn->subcode_request_head = calloc(1, sizeof(struct s_firetalk_subcode_callback)); if (conn->subcode_request_head == NULL) abort(); conn->subcode_request_head->next = iter; conn->subcode_request_head->command = strdup(command); if (conn->subcode_request_head->command == NULL) abort(); conn->subcode_request_head->staticresp = strdup(reply); if (conn->subcode_request_head->staticresp == NULL) abort(); } return(FE_SUCCESS); } fte_t firetalk_subcode_register_reply_callback(firetalk_t conn, const char *const command, void (*callback)(firetalk_t, void *, const char *const, const char *const, const char *const)) { struct s_firetalk_subcode_callback *iter; VERIFYCONN; if (command == NULL) { if (conn->subcode_reply_default) free(conn->subcode_reply_default); conn->subcode_reply_default = calloc(1, sizeof(struct s_firetalk_subcode_callback)); if (conn->subcode_reply_default == NULL) abort(); conn->subcode_reply_default->callback = (ptrtofnct)callback; } else { iter = conn->subcode_reply_head; conn->subcode_reply_head = calloc(1, sizeof(struct s_firetalk_subcode_callback)); if (conn->subcode_reply_head == NULL) abort(); conn->subcode_reply_head->next = iter; conn->subcode_reply_head->command = strdup(command); if (conn->subcode_reply_head->command == NULL) abort(); conn->subcode_reply_head->callback = (ptrtofnct)callback; } return(FE_SUCCESS); } fte_t firetalk_file_offer(firetalk_t conn, const char *const nickname, const char *const filename, void *clientfilestruct) { struct s_firetalk_file *iter; struct stat s; struct sockaddr_in addr; char args[256]; unsigned int l; VERIFYCONN; iter = conn->file_head; conn->file_head = calloc(1, sizeof(struct s_firetalk_file)); if (conn->file_head == NULL) abort(); conn->file_head->who = strdup(nickname); if (conn->file_head->who == NULL) abort(); conn->file_head->filename = strdup(filename); if (conn->file_head->filename == NULL) abort(); conn->file_head->sockfd = -1; conn->file_head->clientfilestruct = clientfilestruct; conn->file_head->filefd = open(filename, O_RDONLY); if (conn->file_head->filefd == -1) { firetalk_file_cancel(conn, conn->file_head); return(FE_IOERROR); } if (fstat(conn->file_head->filefd, &s) != 0) { firetalk_file_cancel(conn, conn->file_head); return(FE_IOERROR); } conn->file_head->size = (long)s.st_size; conn->file_head->sockfd = socket(PF_INET, SOCK_STREAM, 0); if (conn->file_head->sockfd == -1) { firetalk_file_cancel(conn, conn->file_head); return(FE_SOCKET); } addr.sin_family = AF_INET; addr.sin_port = 0; addr.sin_addr.s_addr = INADDR_ANY; if (bind(conn->file_head->sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) != 0) { firetalk_file_cancel(conn, conn->file_head); return(FE_SOCKET); } if (listen(conn->file_head->sockfd, 1) != 0) { firetalk_file_cancel(conn, conn->file_head); return(FE_SOCKET); } l = (unsigned int)sizeof(struct sockaddr_in); if (getsockname(conn->file_head->sockfd, (struct sockaddr *)&addr, &l) != 0) { firetalk_file_cancel(conn, conn->file_head); return(FE_SOCKET); } conn->file_head->bytes = 0; conn->file_head->state = FF_STATE_WAITREMOTE; conn->file_head->direction = FF_DIRECTION_SENDING; conn->file_head->port = ntohs(addr.sin_port); conn->file_head->next = iter; conn->file_head->type = FF_TYPE_DCC; snprintf(args, sizeof(args), "SEND %s %lu %u %ld", conn->file_head->filename, conn->localip, conn->file_head->port, conn->file_head->size); return(firetalk_subcode_send_request(conn, nickname, "DCC", args)); } fte_t firetalk_file_accept(firetalk_t conn, void *filehandle, void *clientfilestruct, const char *const localfile) { struct s_firetalk_file *fileiter; struct sockaddr_in addr; VERIFYCONN; fileiter = filehandle; fileiter->clientfilestruct = clientfilestruct; fileiter->filefd = open(localfile, O_WRONLY|O_CREAT|O_EXCL, S_IRWXU); if (fileiter->filefd == -1) return(FE_NOPERMS); addr.sin_family = AF_INET; addr.sin_port = fileiter->port; memcpy(&addr.sin_addr.s_addr, &fileiter->inet_ip, 4); fileiter->sockfd = firetalk_internal_connect(&addr #ifdef _FC_USE_IPV6 , NULL #endif ); if (fileiter->sockfd == -1) { firetalk_file_cancel(conn, filehandle); return(FE_SOCKET); } fileiter->state = FF_STATE_WAITSYNACK; return(FE_SUCCESS); } fte_t firetalk_file_cancel(firetalk_t conn, void *filehandle) { struct s_firetalk_file *fileiter, *prev; VERIFYCONN; prev = NULL; for (fileiter = conn->file_head; fileiter != NULL; fileiter = fileiter->next) { if (fileiter == filehandle) { if (prev != NULL) prev->next = fileiter->next; else conn->file_head = fileiter->next; if (fileiter->who) { free(fileiter->who); fileiter->who = NULL; } if (fileiter->filename) { free(fileiter->filename); fileiter->filename = NULL; } if (fileiter->sockfd >= 0) { close(fileiter->sockfd); fileiter->sockfd = -1; } if (fileiter->filefd >= 0) { close(fileiter->filefd); fileiter->filefd = -1; } free(fileiter); return(FE_SUCCESS); } prev = fileiter; } return(FE_NOTFOUND); } fte_t firetalk_file_refuse(firetalk_t conn, void *filehandle) { return(firetalk_file_cancel(conn, filehandle)); } fte_t firetalk_compare_nicks(firetalk_t conn, const char *const nick1, const char *const nick2) { VERIFYCONN; return(firetalk_protocols[conn->protocol]->comparenicks(nick1, nick2)); } fte_t firetalk_isprint(firetalk_t conn, const int c) { VERIFYCONN; return(firetalk_protocols[conn->protocol]->isprintable(c)); } fte_t firetalk_select() { return(firetalk_select_custom(0, NULL, NULL, NULL, NULL)); } fte_t firetalk_select_custom(int n, fd_set *fd_read, fd_set *fd_write, fd_set *fd_except, struct timeval *timeout) { int ret; fd_set *my_read, *my_write, *my_except; fd_set internal_read, internal_write, internal_except; struct timeval internal_timeout, *my_timeout; struct s_firetalk_handle *fchandle; my_read = fd_read; my_write = fd_write; my_except = fd_except; my_timeout = timeout; if (!my_read) { my_read = &internal_read; FD_ZERO(my_read); } if (!my_write) { my_write = &internal_write; FD_ZERO(my_write); } if (!my_except) { my_except = &internal_except; FD_ZERO(my_except); } if (!my_timeout) { my_timeout = &internal_timeout; my_timeout->tv_sec = 15; my_timeout->tv_usec = 0; } if (my_timeout->tv_sec > 15) my_timeout->tv_sec = 15; /* internal preselect */ for (fchandle = handle_head; fchandle != NULL; fchandle = fchandle->next) { struct s_firetalk_file *fileiter; if (fchandle->deleted) continue; if (fchandle->connected == FCS_NOTCONNECTED) continue; while (fchandle->subcode_requests.count > 0) { int count = fchandle->subcode_requests.count; char *key = strdup(fchandle->subcode_requests.keys[0]); firetalk_protocols[fchandle->protocol]->im_send_message(fchandle->handle, key, "", 0); free(key); assert(fchandle->subcode_requests.count < count); } while (fchandle->subcode_replies.count > 0) { int count = fchandle->subcode_replies.count; char *key = strdup(fchandle->subcode_replies.keys[0]); firetalk_protocols[fchandle->protocol]->im_send_message(fchandle->handle, key, "", 1); free(key); assert(fchandle->subcode_replies.count < count); } firetalk_protocols[fchandle->protocol]->periodic(fchandle); if (fchandle->connected == FCS_NOTCONNECTED) continue; if (fchandle->fd >= n) n = fchandle->fd + 1; assert(fchandle->fd >= 0); FD_SET(fchandle->fd, my_except); if (fchandle->connected == FCS_WAITING_SYNACK) FD_SET(fchandle->fd, my_write); else FD_SET(fchandle->fd, my_read); for (fileiter = fchandle->file_head; fileiter != NULL; fileiter = fileiter->next) { if (fileiter->state == FF_STATE_TRANSFERRING) { if (fileiter->sockfd >= n) n = fileiter->sockfd + 1; switch (fileiter->direction) { case FF_DIRECTION_SENDING: assert(fileiter->sockfd >= 0); FD_SET(fileiter->sockfd, my_write); FD_SET(fileiter->sockfd, my_except); break; case FF_DIRECTION_RECEIVING: assert(fileiter->sockfd >= 0); FD_SET(fileiter->sockfd, my_read); FD_SET(fileiter->sockfd, my_except); break; } } else if (fileiter->state == FF_STATE_WAITREMOTE) { assert(fileiter->sockfd >= 0); if (fileiter->sockfd >= n) n = fileiter->sockfd + 1; FD_SET(fileiter->sockfd, my_read); FD_SET(fileiter->sockfd, my_except); } else if (fileiter->state == FF_STATE_WAITSYNACK) { assert(fileiter->sockfd >= 0); if (fileiter->sockfd >= n) n = fileiter->sockfd + 1; FD_SET(fileiter->sockfd, my_write); FD_SET(fileiter->sockfd, my_except); } } } /* per-protocol preselect, UI prepoll */ for (fchandle = handle_head; fchandle != NULL; fchandle = fchandle->next) { if (fchandle->deleted) continue; firetalk_protocols[fchandle->protocol]->preselect(fchandle->handle, my_read, my_write, my_except, &n); if (fchandle->callbacks[FC_PRESELECT]) fchandle->callbacks[FC_PRESELECT](fchandle, fchandle->clientstruct); } /* select */ if (n > 0) { ret = select(n, my_read, my_write, my_except, my_timeout); if (ret == -1) return(FE_PACKET); } /* per-protocol postselect, UI postpoll */ for (fchandle = handle_head; fchandle != NULL; fchandle = fchandle->next) { if (fchandle->deleted) continue; firetalk_protocols[fchandle->protocol]->postselect(fchandle->handle, my_read, my_write, my_except); if (fchandle->callbacks[FC_POSTSELECT]) fchandle->callbacks[FC_POSTSELECT](fchandle, fchandle->clientstruct); } /* internal postpoll */ for (fchandle = handle_head; fchandle != NULL; fchandle = fchandle->next) { struct s_firetalk_file *fileiter, *filenext; if (fchandle->deleted) continue; if (fchandle->connected == FCS_NOTCONNECTED) continue; assert(fchandle->fd >= 0); if (FD_ISSET(fchandle->fd, my_except)) firetalk_protocols[fchandle->protocol]->disconnect(fchandle->handle); else if (FD_ISSET(fchandle->fd, my_read)) { short length; /* read data into handle buffer */ length = recv(fchandle->fd, &fchandle->buffer[fchandle->bufferpos], firetalk_protocols[fchandle->protocol]->default_buffersize - fchandle->bufferpos, MSG_DONTWAIT); if (length < 1) firetalk_callback_disconnect(fchandle->handle, FE_DISCONNECT); else { fchandle->bufferpos += length; if (fchandle->connected == FCS_ACTIVE) firetalk_protocols[fchandle->protocol]->got_data(fchandle->handle, fchandle->buffer, &fchandle->bufferpos); else firetalk_protocols[fchandle->protocol]->got_data_connecting(fchandle->handle, fchandle->buffer, &fchandle->bufferpos); if (fchandle->bufferpos == firetalk_protocols[fchandle->protocol]->default_buffersize) firetalk_callback_disconnect(fchandle->handle, FE_PACKETSIZE); } } else if (FD_ISSET(fchandle->fd, my_write)) firetalk_handle_synack(fchandle); for (fileiter = fchandle->file_head; fileiter != NULL; fileiter = filenext) { filenext = fileiter->next; if (fileiter->state == FF_STATE_TRANSFERRING) { assert(fileiter->sockfd >= 0); if (FD_ISSET(fileiter->sockfd, my_write)) firetalk_handle_send(fchandle, fileiter); if ((fileiter->sockfd != -1) && FD_ISSET(fileiter->sockfd, my_read)) firetalk_handle_receive(fchandle, fileiter); if ((fileiter->sockfd != -1) && FD_ISSET(fileiter->sockfd, my_except)) { if (fchandle->callbacks[FC_FILE_ERROR]) fchandle->callbacks[FC_FILE_ERROR](fchandle, fchandle->clientstruct, fileiter, fileiter->clientfilestruct, FE_IOERROR); firetalk_file_cancel(fchandle, fileiter); } } else if (fileiter->state == FF_STATE_WAITREMOTE) { assert(fileiter->sockfd >= 0); if (FD_ISSET(fileiter->sockfd, my_read)) { unsigned int l = sizeof(struct sockaddr_in); struct sockaddr_in addr; int s; s = accept(fileiter->sockfd, (struct sockaddr *)&addr, &l); if (s == -1) { if (fchandle->callbacks[FC_FILE_ERROR]) fchandle->callbacks[FC_FILE_ERROR](fchandle, fchandle->clientstruct, fileiter, fileiter->clientfilestruct, FE_SOCKET); firetalk_file_cancel(fchandle, fileiter); } else { close(fileiter->sockfd); fileiter->sockfd = s; fileiter->state = FF_STATE_TRANSFERRING; if (fchandle->callbacks[FC_FILE_START]) fchandle->callbacks[FC_FILE_START](fchandle, fchandle->clientstruct, fileiter, fileiter->clientfilestruct); } } else if (FD_ISSET(fileiter->sockfd, my_except)) { if (fchandle->callbacks[FC_FILE_ERROR]) fchandle->callbacks[FC_FILE_ERROR](fchandle, fchandle->clientstruct, fileiter, fileiter->clientfilestruct, FE_IOERROR); firetalk_file_cancel(fchandle, fileiter); } } else if (fileiter->state == FF_STATE_WAITSYNACK) { assert(fileiter->sockfd >= 0); if (FD_ISSET(fileiter->sockfd, my_write)) firetalk_handle_file_synack(fchandle, fileiter); if (FD_ISSET(fileiter->sockfd, my_except)) firetalk_file_cancel(fchandle, fileiter); } } } /* handle deleted connections */ { struct s_firetalk_handle *fchandleprev, *fchandlenext; fchandleprev = NULL; for (fchandle = handle_head; fchandle != NULL; fchandle = fchandlenext) { fchandlenext = fchandle->next; if (fchandle->deleted == 1) { assert(fchandle->handle == NULL); if (fchandle->buddy_head != NULL) { struct s_firetalk_buddy *iter, *iternext; for (iter = fchandle->buddy_head; iter != NULL; iter = iternext) { iternext = iter->next; if (iter->nickname != NULL) { free(iter->nickname); iter->nickname = NULL; } if (iter->group != NULL) { free(iter->group); iter->group = NULL; } if (iter->capabilities != NULL) { free(iter->capabilities); iter->capabilities = NULL; } free(iter); } fchandle->buddy_head = NULL; } if (fchandle->deny_head != NULL) { struct s_firetalk_deny *iter, *iternext; for (iter = fchandle->deny_head; iter != NULL; iter = iternext) { iternext = iter->next; if (iter->nickname != NULL) { free(iter->nickname); iter->nickname = NULL; } free(iter); } fchandle->deny_head = NULL; } if (fchandle->room_head != NULL) { struct s_firetalk_room *iter, *iternext; for (iter = fchandle->room_head; iter != NULL; iter = iternext) { struct s_firetalk_member *memberiter, *memberiternext; for (memberiter = iter->member_head; memberiter != NULL; memberiter = memberiternext) { memberiternext = memberiter->next; if (memberiter->nickname != NULL) { free(memberiter->nickname); memberiter->nickname = NULL; } free(memberiter); } iter->member_head = NULL; iternext = iter->next; if (iter->name != NULL) { free(iter->name); iter->name = NULL; } free(iter); } fchandle->room_head = NULL; } if (fchandle->file_head != NULL) { struct s_firetalk_file *iter, *iternext; for (iter = fchandle->file_head; iter != NULL; iter = iternext) { iternext = iter->next; if (iter->who != NULL) { free(iter->who); iter->who = NULL; } if (iter->filename != NULL) { free(iter->filename); iter->filename = NULL; } free(iter); } fchandle->file_head = NULL; } if (fchandle->subcode_request_head != NULL) { struct s_firetalk_subcode_callback *iter, *iternext; for (iter = fchandle->subcode_request_head; iter != NULL; iter = iternext) { iternext = iter->next; if (iter->command != NULL) { free(iter->command); iter->command = NULL; } if (iter->staticresp != NULL) { free(iter->staticresp); iter->staticresp = NULL; } free(iter); } fchandle->subcode_request_head = NULL; } if (fchandle->subcode_request_default != NULL) { if (fchandle->subcode_request_default->command != NULL) { free(fchandle->subcode_request_default->command); fchandle->subcode_request_default->command = NULL; } free(fchandle->subcode_request_default); fchandle->subcode_request_default = NULL; } if (fchandle->subcode_reply_head != NULL) { struct s_firetalk_subcode_callback *iter, *iternext; for (iter = fchandle->subcode_reply_head; iter != NULL; iter = iternext) { iternext = iter->next; free(iter->command); free(iter); } fchandle->subcode_reply_head = NULL; } if (fchandle->subcode_reply_default != NULL) { if (fchandle->subcode_reply_default->command != NULL) { free(fchandle->subcode_reply_default->command); fchandle->subcode_reply_default->command = NULL; } free(fchandle->subcode_reply_default); fchandle->subcode_reply_default = NULL; } if (fchandle->username != NULL) { free(fchandle->username); fchandle->username = NULL; } if (fchandle->buffer != NULL) { free(fchandle->buffer); fchandle->buffer = NULL; } if (fchandleprev == NULL) { assert(fchandle == handle_head); handle_head = fchandlenext; } else { assert(fchandle != handle_head); fchandleprev->next = fchandlenext; } free(fchandle); } else fchandleprev = fchandle; } } return(FE_SUCCESS); } void firetalk_enqueue(firetalk_queue_t *queue, const char *const key, void *data) { queue->count++; queue->keys = realloc(queue->keys, (queue->count)*sizeof(*(queue->keys))); queue->data = realloc(queue->data, (queue->count)*sizeof(*(queue->data))); queue->keys[queue->count-1] = strdup(key); if (queue->keys[queue->count-1] == NULL) abort(); queue->data[queue->count-1] = data; } const void *firetalk_peek(firetalk_queue_t *queue, const char *const key) { int i; assert(queue != NULL); assert(key != NULL); for (i = 0; i < queue->count; i++) if (strcmp(queue->keys[i], key) == 0) return(queue->data[i]); return(NULL); } void *firetalk_dequeue(firetalk_queue_t *queue, const char *const key) { int i; assert(queue != NULL); assert(key != NULL); for (i = 0; i < queue->count; i++) if (strcmp(queue->keys[i], key) == 0) { void *data = queue->data[i]; free(queue->keys[i]); queue->keys[i] = NULL; memmove(queue->keys+i, queue->keys+i+1, (queue->count-i-1)*sizeof(*(queue->keys))); memmove(queue->data+i, queue->data+i+1, (queue->count-i-1)*sizeof(*(queue->data))); queue->count--; queue->keys = realloc(queue->keys, (queue->count)*sizeof(*(queue->keys))); queue->data = realloc(queue->data, (queue->count)*sizeof(*(queue->data))); return(data); } return(NULL); } void firetalk_queue_append(char *buf, int buflen, firetalk_queue_t *queue, const char *const key) { const char *data; while ((data = firetalk_peek(queue, key)) != NULL) { if (strlen(buf)+strlen(data) >= buflen-1) break; strcat(buf, data); free(firetalk_dequeue(queue, key)); } } fte_t firetalk_im_searchemail(firetalk_t conn, const char * const email) { if (conn->connected != FCS_ACTIVE) return FE_NOTCONNECTED; return firetalk_protocols[conn->protocol]->im_searchemail(conn->handle,email); } fte_t firetalk_getsockets(const int prot, int **r, int **w, int **e) { struct s_firetalk_handle *fchandle; struct s_firetalk_file *fileiter; int rs, ws, es, *pr, *pw, *pe; pr = pw = pe = NULL; rs = ws = es = 0; #define wadd(fd) {pw = (int *) realloc(pw, (++ws)*sizeof(int)); pw[ws-1] = fd;} #define radd(fd) {pr = (int *) realloc(pr, (++rs)*sizeof(int)); pr[rs-1] = fd;} #define eadd(fd) {pe = (int *) realloc(pe, (++es)*sizeof(int)); pe[es-1] = fd;} fchandle = handle_head; while(fchandle) { if((fchandle->connected == FCS_NOTCONNECTED) || (fchandle->protocol != prot)) { fchandle = fchandle->next; } else { eadd(fchandle->fd); if(fchandle->connected == FCS_WAITING_SYNACK) wadd(fchandle->fd) else radd(fchandle->fd); fileiter = fchandle->file_head; while(fileiter) { if(fileiter->state == FF_STATE_TRANSFERRING) { switch(fileiter->direction) { case FF_DIRECTION_SENDING: wadd(fchandle->fd); eadd(fchandle->fd); break; case FF_DIRECTION_RECEIVING: radd(fchandle->fd); eadd(fchandle->fd); break; } } else if(fileiter->state == FF_STATE_WAITREMOTE) { radd(fchandle->fd); eadd(fchandle->fd); } else if(fileiter->state == FF_STATE_WAITSYNACK) { wadd(fchandle->fd); eadd(fchandle->fd); } fileiter = fileiter->next; } fchandle = fchandle->next; } } radd(0); wadd(0); eadd(0); *r = pr, *w = pw, *e = pe; return FE_SUCCESS; } centerim-4.22.10/firetalk/firetalk.h0000644000175000001440000002752011461606612014167 00000000000000/* firetalk.h - FireTalk wrapper declarations Copyright (C) 2000 Ian Gulliver This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. 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 _FIRETALK_H #define _FIRETALK_H #include #include #include #include #define _FC_USE_IPV6 #ifndef _HAVE_FIRETALK_T typedef void *firetalk_t; #define _HAVE_FIRETALK_T #endif /* enums */ enum firetalk_protocol { FP_DUMMY }; enum firetalk_callback { FC_CONNECTED, /* void *connection, void *clientstruct */ FC_CONNECTFAILED, /* void *connection, void *clientstruct, int error, char *reason */ FC_DOINIT, /* void *connection, void *clientstruct, char *nickname */ FC_ERROR, /* void *connection, void *clientstruct, int error, char *roomoruser (room or user that error applies to, null if none) */ FC_LOG, /* void *connection, void *clientstruct, char *message */ FC_DISCONNECT, /* void *connection, void *clientstruct, int error */ FC_SETIDLE, /* void *connection, void *clientstruct, long *idle */ FC_EVILED, /* void *connection, void *clientstruct, int newevil, char *eviler */ FC_NEWNICK, /* void *connection, void *clientstruct, char *nickname */ FC_PASSCHANGED, /* void *connection, void *clientstruct */ FC_NEEDPASS, /* void *connection, void *clientstruct, char *pass, int size */ FC_PRESELECT, /* void *connection, void *clientstruct */ FC_POSTSELECT, /* void *connection, void *clientstruct */ FC_IM_IDLEINFO, /* void *connection, void *clientstruct, char *nickname, long idletime */ FC_IM_STATUSINFO, /* void *connection, void *clientstruct, char *nickname, char *message */ FC_IM_EVILINFO, /* void *connection, void *clientstruct, char *nickname, long warnval */ FC_IM_BUDDYADDED, /* void *connection, void *clientstruct, char *nickname, char *group, char *friendly */ FC_IM_BUDDYREMOVED, /* void *connection, void *clientstruct, char *nickname */ FC_IM_TYPINGINFO, /* void *connection, void *clientstruct, char *nickname, int typing */ FC_IM_CAPABILITIES, /* void *connection, void *clientstruct, char *nickname, char *caps */ FC_IM_GOTINFO, /* void *connection, void *clientstruct, char *nickname, char *info, int warning, int online, int idle, int flags */ FC_IM_USER_NICKCHANGED, /* void *connection, void *clientstruct, char *oldnick, char *newnick */ FC_IM_GOTCHANNELS, FC_IM_GETMESSAGE, /* void *connection, void *clientstruct, char *sender, int automessage_flag, char *message */ FC_IM_GETACTION, /* void *connection, void *clientstruct, char *sender, int automessage_flag, char *message */ FC_IM_BUDDYONLINE, /* void *connection, void *clientstruct, char *nickname */ FC_IM_BUDDYOFFLINE, /* void *connection, void *clientstruct, char *nickname */ FC_IM_BUDDYAWAY, /* void *connection, void *clientstruct, char *nickname */ FC_IM_BUDDYUNAWAY, /* void *connection, void *clientstruct, char *nickname */ FC_IM_LISTBUDDY, /* void *connection, void *clientstruct, char *nickname, char *group, char online, char away, long idletime */ FC_CHAT_JOINED, /* void *connection, void *clientstruct, char *room */ FC_CHAT_LEFT, /* void *connection, void *clientstruct, char *room */ FC_CHAT_KICKED, /* void *connection, void *clientstruct, char *room, char *by, char *reason */ FC_CHAT_GETMESSAGE, /* void *connection, void *clientstruct, char *room, char *from, int automessage_flag, char *message */ FC_CHAT_GETACTION, /* void *connection, void *clientstruct, char *room, char *from, int automessage_flag, char *message */ FC_CHAT_INVITED, /* void *connection, void *clientstruct, char *room, char *from, char *message */ //#ifdef RAWIRCMODES FC_CHAT_MODECHANGED, /* void *connection, void *clientstruct, char *room, char *mode, char *by */ //#endif FC_CHAT_OPPED, /* void *connection, void *clientstruct, char *room, char *by */ FC_CHAT_DEOPPED, /* void *connection, void *clientstruct, char *room, char *by */ FC_CHAT_USER_JOINED, /* void *connection, void *clientstruct, char *room, char *who */ FC_CHAT_USER_LEFT, /* void *connection, void *clientstruct, char *room, char *who, char *reason */ FC_CHAT_GOTTOPIC, /* void *connection, void *clientstruct, char *room, char *topic, char *author */ FC_CHAT_USER_OPPED, /* void *connection, void *clientstruct, char *room, char *who, char *by */ FC_CHAT_USER_DEOPPED, /* void *connection, void *clientstruct, char *room, char *who, char *by */ FC_CHAT_USER_KICKED, /* void *connection, void *clientstruct, char *room, char *who, char *by, char *reason */ FC_CHAT_USER_NICKCHANGED, /* void *connection, void *clientstruct, char *room, char *oldnick, char *newnick */ FC_CHAT_KEYCHANGED, /* void *connection, void *clientstruct, char *room, char *what, char *by */ FC_CHAT_LISTMEMBER, /* void *connection, vodi *clientstruct, char *room, char *membername, int opped */ FC_CHAT_LIST_EXTENDED, FC_CHAT_END_EXTENDED, FC_CHAT_NAMES, FC_FILE_OFFER, /* void *connection, void *clientstruct, void *filehandle, char *from, char *filename, long size */ FC_FILE_START, /* void *connection, void *clientstruct, void *filehandle, void *clientfilestruct */ FC_FILE_PROGRESS, /* void *connection, void *clientstruct, void *filehandle, void *clientfilestruct, long bytes, long size */ FC_FILE_FINISH, /* void *connection, void *clientstruct, void *filehandle, void *clientfilestruct, long size */ FC_FILE_ERROR, /* void *connection, void *clientstruct, void *filehandle, void *clientfilestruct, int error */ FC_MAX /* tracking enum, don't hook this */ }; typedef enum { FE_SUCCESS, FE_CONNECT, FE_NOMATCH, FE_PACKET, FE_RECONNECTING, FE_BADUSERPASS, FE_SEQUENCE, FE_FRAMETYPE, FE_PACKETSIZE, FE_SERVER, FE_UNKNOWN, FE_BLOCKED, FE_WEIRDPACKET, FE_CALLBACKNUM, FE_BADUSER, FE_NOTFOUND, FE_DISCONNECT, FE_SOCKET, FE_RESOLV, FE_VERSION, FE_USERUNAVAILABLE, FE_USERINFOUNAVAILABLE, FE_TOOFAST, FE_ROOMUNAVAILABLE, FE_INCOMINGERROR, FE_USERDISCONNECT, FE_INVALIDFORMAT, FE_IDLEFAST, FE_BADROOM, FE_BADMESSAGE, FE_MESSAGETRUNCATED, FE_BADPROTO, FE_NOTCONNECTED, FE_BADCONNECTION, FE_NOPERMS, FE_NOCHANGEPASS, FE_DUPEROOM, FE_IOERROR, FE_BADHANDLE, FE_TIMEOUT } fte_t; /* Firetalk functions */ int firetalk_find_protocol(const char *strprotocol); const char *firetalk_strprotocol(const enum firetalk_protocol p); const char *firetalk_strerror(const fte_t e); firetalk_t firetalk_create_handle(const int protocol, void *clientstruct); void firetalk_destroy_handle(firetalk_t conn); enum firetalk_protocol firetalk_get_protocol(firetalk_t conn); fte_t firetalk_disconnect(firetalk_t conn); fte_t firetalk_signon(firetalk_t conn, const char *const server, const short port, const char *const username); fte_t firetalk_register_callback(firetalk_t conn, const int type, void (*function)(firetalk_t, void *, ...)); firetalk_t firetalk_find_clientstruct(void *clientstruct); fte_t firetalk_im_add_buddy(firetalk_t conn, const char *const name, const char *const group, const char *const friendly); fte_t firetalk_im_remove_buddy(firetalk_t conn, const char *const name); fte_t firetalk_im_add_deny(firetalk_t conn, const char *const name); fte_t firetalk_im_remove_deny(firetalk_t conn, const char *const name); fte_t firetalk_im_upload_buddies(firetalk_t conn); fte_t firetalk_im_upload_denies(firetalk_t conn); fte_t firetalk_im_send_message(firetalk_t conn, const char *const dest, const char *const message, const int auto_flag); fte_t firetalk_im_send_action(firetalk_t conn, const char *const dest, const char *const message, const int auto_flag); fte_t firetalk_im_list_buddies(firetalk_t conn); fte_t firetalk_im_evil(firetalk_t c, const char *const who); fte_t firetalk_im_get_info(firetalk_t conn, const char *const nickname); fte_t firetalk_chat_join(firetalk_t conn, const char *const room); fte_t firetalk_chat_part(firetalk_t conn, const char *const room); fte_t firetalk_chat_send_message(firetalk_t conn, const char *const room, const char *const message, const int auto_flag); fte_t firetalk_chat_send_action(firetalk_t conn, const char *const room, const char *const message, const int auto_flag); fte_t firetalk_chat_invite(firetalk_t conn, const char *const room, const char *const who, const char *const message); fte_t firetalk_chat_set_topic(firetalk_t conn, const char *const room, const char *const topic); fte_t firetalk_chat_op(firetalk_t conn, const char *const room, const char *const who); fte_t firetalk_chat_deop(firetalk_t conn, const char *const room, const char *const who); fte_t firetalk_chat_kick(firetalk_t conn, const char *const room, const char *const who, const char *const reason); fte_t firetalk_chat_listmembers(firetalk_t conn, const char *const room); fte_t firetalk_chat_requestextended(firetalk_t conn, const char * const room); fte_t firetalk_im_searchemail(firetalk_t conn, const char * const email); fte_t firetalk_im_internal_add_deny(firetalk_t conn, const char *const nickname); fte_t firetalk_im_internal_remove_buddy(firetalk_t conn, const char *const nickname); fte_t firetalk_im_internal_remove_deny(firetalk_t conn, const char *const nickname); fte_t firetalk_subcode_send_reply(firetalk_t conn, const char *const to, const char *const command, const char *const args); fte_t firetalk_subcode_send_request(firetalk_t conn, const char *const to, const char *const command, const char *const args); fte_t firetalk_subcode_register_request_callback(firetalk_t conn, const char *const command, void (*callback)(firetalk_t, void *, const char *const, const char *const, const char *const)); fte_t firetalk_subcode_register_request_reply(firetalk_t conn, const char *const command, const char *const reply); fte_t firetalk_subcode_register_reply_callback(firetalk_t conn, const char *const command, void (*callback)(firetalk_t, void *, const char *const, const char *const, const char *const)); fte_t firetalk_file_offer(firetalk_t conn, const char *const nickname, const char *const filename, void *clientfilestruct); fte_t firetalk_file_accept(firetalk_t conn, void *filehandle, void *clientfilestruct, const char *const localfile); fte_t firetalk_file_refuse(firetalk_t conn, void *filehandle); fte_t firetalk_file_cancel(firetalk_t conn, void *filehandle); fte_t firetalk_compare_nicks(firetalk_t conn, const char *const nick1, const char *const nick2); fte_t firetalk_isprint(firetalk_t conn, const int c); fte_t firetalk_set_info(firetalk_t conn, const char *const info); fte_t firetalk_set_away(firetalk_t c, const char *const message, const int auto_flag); const char *firetalk_chat_normalize(firetalk_t conn, const char *const room); fte_t firetalk_set_nickname(firetalk_t conn, const char *const nickname); fte_t firetalk_set_password(firetalk_t conn, const char *const oldpass, const char *const newpass); fte_t firetalk_set_privacy(firetalk_t conn, const char *const mode); fte_t firetalk_select(); fte_t firetalk_select_custom(int n, fd_set *fd_read, fd_set *fd_write, fd_set *fd_except, struct timeval *timeout); fte_t firetalk_getsockets(const int prot, int **r, int **w, int **e); #ifndef FIRETALK extern fte_t firetalkerror; /* internal function, exported because dan reed is lazy */ int firetalk_internal_connect_host(const char *const host, const int port); #endif #define FF_SUBSTANDARD 0x0001 #define FF_NORMAL 0x0002 #define FF_ADMIN 0x0004 #ifndef MSG_DONTWAIT # define MSG_DONTWAIT 0 #endif #ifndef MSG_NOSIGNAL # define MSG_NOSIGNAL 0 #endif #endif centerim-4.22.10/NEWS0000644000175000001440000000004711461606612011106 00000000000000Please see the ChangeLog file. Thanks. centerim-4.22.10/.tarball-version0000644000175000001440000000001011473011460013474 000000000000004.22.10 centerim-4.22.10/depcomp0000755000175000001440000004426711473011437011776 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free # Software Foundation, Inc. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u="sed s,\\\\\\\\,/,g" depmode=msvisualcpp fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: centerim-4.22.10/aclocal.m40000644000175000001440000012001311473011434012236 00000000000000# generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/ax_with_curses.m4]) m4_include([m4/codeset.m4]) m4_include([m4/gettext.m4]) m4_include([m4/glibc2.m4]) m4_include([m4/glibc21.m4]) m4_include([m4/gpgme.m4]) m4_include([m4/iconv.m4]) m4_include([m4/intdiv0.m4]) m4_include([m4/intmax.m4]) m4_include([m4/inttypes-pri.m4]) m4_include([m4/inttypes.m4]) m4_include([m4/inttypes_h.m4]) m4_include([m4/isc-posix.m4]) m4_include([m4/lcmessage.m4]) m4_include([m4/lib-ld.m4]) m4_include([m4/lib-link.m4]) m4_include([m4/lib-prefix.m4]) m4_include([m4/libcurl.m4]) m4_include([m4/longdouble.m4]) m4_include([m4/longlong.m4]) m4_include([m4/nls.m4]) m4_include([m4/po.m4]) m4_include([m4/printf-posix.m4]) m4_include([m4/progtest.m4]) m4_include([m4/signed.m4]) m4_include([m4/size_max.m4]) m4_include([m4/stdint_h.m4]) m4_include([m4/uintmax_t.m4]) m4_include([m4/ulonglong.m4]) m4_include([m4/wchar_t.m4]) m4_include([m4/wint_t.m4]) m4_include([m4/xsize.m4]) centerim-4.22.10/configure.ac0000644000175000001440000004675111473007750012712 00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) AC_INIT([centerim], m4_esyscmd([misc/git-version-gen .tarball-version]), [http://bugzilla.centerim.org]) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADER([config.h]) AM_INIT_AUTOMAKE([-Wall]) AC_ISC_POSIX AC_CANONICAL_HOST AC_GNU_SOURCE ######################## # Checks for programs. # ######################## AC_PROG_CC AC_PROG_CXX AC_PROG_CPP AC_PROG_RANLIB AM_GNU_GETTEXT AM_GNU_GETTEXT_VERSION([0.14.6]) ######################### # Checks for libraries. # ######################### AC_ARG_ENABLE(icq, AS_HELP_STRING([--disable-icq], [Build without ICQ]), build_icq="$enableval", build_icq="yes" ) AC_ARG_ENABLE(yahoo, AS_HELP_STRING([--disable-yahoo], [Build without Yahoo!]), build_yahoo="$enableval", build_yahoo="yes" ) AC_ARG_ENABLE(aim, AS_HELP_STRING([--disable-aim], [Build without AIM]), build_aim="$enableval", build_aim="yes" ) AC_ARG_ENABLE(irc, AS_HELP_STRING([--disable-irc], [Build without IRC]), build_irc="$enableval", build_irc="yes" ) AC_ARG_ENABLE(jabber, AS_HELP_STRING([--disable-jabber], [Build without Jabber]), build_jabber="$enableval", build_jabber="yes" ) AC_ARG_ENABLE(gg, AS_HELP_STRING([--disable-gg], [Build without Gadu-Gadu]), build_gg="$enableval", build_gg="yes" ) AC_ARG_ENABLE(msn, AS_HELP_STRING([--disable-msn], [Build without MSN]), build_msn="$enableval", build_msn="yes" ) AC_ARG_ENABLE(rss, AS_HELP_STRING([--disable-rss], [Build without RSS reader]), build_rss="$enableval", build_rss="yes" ) AC_ARG_ENABLE(lj, AS_HELP_STRING([--disable-lj], [Build without LiveJournal client]), build_lj="$enableval", build_lj="yes" ) AC_ARG_ENABLE(locales-fix, AS_HELP_STRING([--enable-locales-fix], [enables workaround for broken locales. use this option if some of characters in your texts in Chinese or Japanese disappear]), locales_fix="$enableval", locales_fix="yes" ) AC_ARG_WITH(fribidi, AS_HELP_STRING([--with-fribidi=[DIR]], [enable Hebrew and Arabic support using fribidi library in DIR]), [with_fribidi=$withval], [with_fribidi=no] ) AC_ARG_WITH(ssl, AS_HELP_STRING([--with-ssl], [enable SSL secured connections using either OpenSSL or GnuTLS (auto)]), [with_ssl=$withval] ) AC_ARG_WITH(openssl, AS_HELP_STRING([--with-openssl=[DIR]], [enable SSL secured connections using the OpenSSL library in DIR (optional)]), [with_openssl=$withval] ) AC_ARG_WITH(nss_compat, AS_HELP_STRING([--with-nss_compat=[DIR]], [enable SSL secured connections using the NSS compat library in DIR (optional)]), [with_nss_compat=$withval] ) AM_PATH_GPGME( [0.4.2], [have_gpgme=yes], [have_gpgme=no] ) LIBCURL_CHECK_CONFIG( [yes], [4.12.0], [have_libcurl=yes], [have_libcurl=no] ) AC_ARG_WITH(libjpeg, AS_HELP_STRING([--without-libjpeg], [Compile without JPEG token support (for Gadu-Gadu registration)]) ) AC_ARG_WITH(libotr, AS_HELP_STRING([--with-libotr], [enable Off-the-Record Messaging (libotr) WARNING: use at your own risk, not supported yet]), [with_libotr=$withval], [with_libotr=no] ) AC_ARG_WITH(libXss, AS_HELP_STRING([--with-libXss], [enable Xss]), [with_libXss=$withval], [with_libXss=no], ) ##################### # Check for fribidi # ##################### AC_MSG_CHECKING(whether to use fribidi) FRIBIDI_LIBS="" FRIBIDI_CFLAGS="" FRIBIDI_PC="" have_fribidi=no if test "x$with_fribidi" = "xyes"; then if ! pkg-config fribidi; then AC_MSG_ERROR([*** fribidi.pc not found]) fi FRIBIDI_CFLAGS=`pkg-config --cflags fribidi` CFLAGS="$CFLAGS $FRIBIDI_CFLAGS" FRIBIDI_LIBS=`pkg-config --libs fribidi` FRIBIDI_PC="fribidi," AC_CHECK_LIB(fribidi, fribidi_get_mirror_char, :, AC_MSG_ERROR([*** libfribidi not found.]), $FRIBIDI_LIBS) AC_DEFINE(HAVE_FRIBIDI, 1, [has fribidi library]) AC_DEFINE(KTOOL_USE_FRIBIDI, 1, [use fribidi in ktools]) have_fribidi=yes fi AC_MSG_RESULT([$have_fribidi]) ################# # Check for SSL # ################# if test "x$with_ssl" != "xno"; then with_ssl="no" AC_MSG_CHECKING(for OpenSSL) if test -z "$with_openssl" -o "x$with_openssl" = "xyes"; then for ac_dir in $with_openssl /usr/local /usr; do if test -f "$ac_dir/include/openssl/ssl.h"; then with_openssl=$ac_dir break; fi done fi if test -n "$with_openssl" -a "x$with_openssl" != "xno" -a -z "$with_nss_compat"; then CFLAGS="$CFLAGS -I${with_openssl}" AC_MSG_RESULT([found in $with_openssl]) AC_DEFINE(HAVE_OPENSSL, 1, [use openssl]) with_ssl="yes" AC_CHECK_LIB(crypto, main) AC_CHECK_LIB(ssl, main) AC_CHECK_LIB(crypto, SSLeay_add_all_algorithms, AC_DEFINE(HAVE_SSLEAY, 1, [use SSLeay])) else AC_MSG_RESULT([not found or disabled]) fi if test "x$with_ssl" = "xno" -a -z "$with_nss_compat"; then AC_CHECK_LIB(gnutls-extra, gnutls_global_init_extra, [ AC_CHECK_LIB(lzo, lzo1x_1_compress, LZO_LIBS=-llzo) if test -z "$LZO_LIBS"; then AC_CHECK_LIB(lzo2, lzo1x_1_compress, LZO_LIBS=-llzo2, [ AC_MSG_ERROR( *** *** Could not find liblzo or liblzo2. ) ]) fi CXXFLAGS="$CXXFLAGS $LIBGNUTLS_CFLAGS" LIBS="$LIBS $LIBGNUTLS_LIBS -lgnutls-extra -lgnutls" AC_DEFINE(HAVE_GNUTLS, 1, [use gnutls]) with_ssl="yes" ], AC_MSG_ERROR( Could not find gnutls-extra. Stopping. )) fi if test "x$with_ssl" = "xno"; then PKG_PROG_PKG_CONFIG # NSS is essential for OpenSSL compatibility layer # drags in NSPR as well PKG_CHECK_MODULES(NSS, nss >= 3) CFLAGS="$CFLAGS $NSS_CFLAGS" CXXFLAGS="$CXXFLAGS $NSS_CFLAGS" LIBS="$LIBS $NSS_LIBS" # The compatibility layer AC_MSG_CHECKING(for NSS compat) if test -n "$with_nss_compat" -a "x$with_nss_compat" != "xno"; then if test -f "${with_nss_compat}"; then CFLAGS="$CFLAGS -I${with_nss_compat} -I/usr/include/nspr4" CXXFLAGS="$CXXFLAGS -I${with_nss_compat} -I/usr/include/nspr4" fi AC_CHECK_LIB(nss_compat_ossl, SSL_CTX_new, [ AC_DEFINE(HAVE_NSS_COMPAT, 1, [use nss_compat]) LIBS="$LIBS -lnss_compat_ossl" with_ssl="yes" ]) else AC_MSG_RESULT([Not enabled, sadly]) fi fi if test x"$with_ssl" != x"no"; then AC_DEFINE(HAVE_SSL, 1, [ssl is available]) else AC_MSG_ERROR([Karamba! SSL library not found.]) fi else AC_MSG_RESULT([disabled (use --with-ssl=[DIR] to enable)]) fi ################### # Check for gpgme # ################### if test "x$have_gpgme" = "xyes"; then AC_DEFINE(HAVE_GPGME, 1, [has gpgme library]) GPGME_CXXFLAGS="$GPGME_CFLAGS" CFLAGS="$CFLAGS $GPGME_CFLAGS" CXXFLAGS="$CXXFLAGS $GPGME_CXXFLAGS" LIBS="$LIBS $GPGME_LIBS" fi ############################### # Check for Largefile support # ############################### AC_SYS_LARGEFILE AC_FUNC_FSEEKO AC_TYPE_OFF_T ############################# # Check for pthread library # ############################# original_LIBS="$LIBS" LIBS="-lpthread $original_LIBS" AC_TRY_LINK([#include], [pthread_create((void *)0, (void *)0, (void *)0, (void *)0)], [pthread=yes], [pthread=no]) if test x${pthread} = xyes; then AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_THREAD, 1, [pthread library is available]) else LIBS="$original_LIBS" AC_MSG_RESULT([no]) fi AC_CHECK_HEADERS(sys/utsname.h, [ AC_CHECK_FUNC(uname, AC_DEFINE(HAVE_UNAME, 1, [check uname function]),) ]) ##################### # Check for libcurl # ##################### CURL_CFLAGS="$LIBCURL_CPPFLAGS" CURL_CXXFLAGS="$LIBCURL_CPPFLAGS" CURL_LIBS="$LIBCURL" CFLAGS="$CFLAGS $CURL_CFLAGS" CXXFLAGS="$CXXFLAGS $CURL_CXXFLAGS" LIBS="$LIBS $CURL_LIBS" ##################### # Check for libjpeg # ##################### AC_MSG_CHECKING(for libjpeg (for Gadu-Gadu registration)) JPEG_LIBS="" have_libjpeg=no if test "x$with_libjpeg" != "xno"; then AC_MSG_RESULT([]) AC_CHECK_LIB(jpeg, jpeg_start_decompress, [ AC_CHECK_HEADERS(jpeglib.h, [ AC_DEFINE(HAVE_LIBJPEG, 1, [define if you have libjpeg]) JPEG_LIBS="-ljpeg $LIBS" LIBS="$LIBS $JPEG_LIBS" have_libjpeg=yes ]) ]) fi ##################### # Check for libotr # ##################### AC_MSG_CHECKING(for libotr) have_libotr=no if test "x$with_libotr" != "xno"; then AC_MSG_RESULT([]) AC_CHECK_LIB(otr, otrl_init, [ AC_CHECK_HEADERS(libotr/context.h libotr/userstate.h, [ AC_DEFINE(HAVE_LIBOTR, 1, [define if you have libotr]) OTR_LIBS="-lotr $LIBS" LIBS="$LIBS $OTR_LIBS" have_libotr=yes ]) ]) fi ##################### # Check for Xss # ##################### AC_MSG_CHECKING(whether to use Xss) have_libXss=no if test "x$with_libXss" = "xyes"; then AC_MSG_RESULT([]) AC_CHECK_LIB(Xss, XScreenSaverQueryInfo, [ AC_CHECK_HEADER(X11/extensions/scrnsaver.h, [ AC_DEFINE(HAVE_LIBXSS, 1, [define if you have Xss]) XSS_LIBS="-lX11 -lXss" LIBS="$LIBS $XSS_LIBS" have_libXss=yes AC_MSG_RESULT([yes]) ]) ]) fi #################### # Check for others # #################### AC_C_BIGENDIAN AM_ICONV_LINK LIBS="$LIBS $LIBICONV" AC_CHECK_SIZEOF([int]) AC_CHECK_SIZEOF([short]) AC_CHECK_LIB(socket, socket) AC_CHECK_LIB(nsl, gethostbyname) AX_WITH_CURSES if test "x$ax_cv_ncurses" = "xyes" then LIBS="$LIBS $CURSES_LIB" else AC_MSG_ERROR([You need ncurses/ncursesw library and header files.]) fi AC_TRY_COMPILE([ #include #include ],[ socklen_t foo; ], ac_cv_c_socklen_t=yes, ac_cv_c_socklen_t=no) if test "x$ac_cv_c_socklen_t" = "xno"; then AC_DEFINE(socklen_t, int, [Define type of socklen_t for systems missing it]) fi case "$host_os" in darwin*) LIBS="$LIBS -flat_namespace" CXXFLAGS="$CXXFLAGS -I/sw/include" ;; esac AM_CONDITIONAL(BUILD_ICQ, test "x$build_icq" = "xyes") AM_CONDITIONAL(BUILD_YAHOO, test "x$build_yahoo" = "xyes") AM_CONDITIONAL(BUILD_AIM, test "x$build_aim" = "xyes") AM_CONDITIONAL(BUILD_IRC, test "x$build_irc" = "xyes") AM_CONDITIONAL(BUILD_FIRETALK, test "x$build_irc" = "xyes" -o "x$build_aim" = "xyes") AM_CONDITIONAL(BUILD_JABBER, test "x$build_jabber" = "xyes") AM_CONDITIONAL(BUILD_GADU, test "x$build_gg" = "xyes") AM_CONDITIONAL(BUILD_MSN, test "x$build_msn" = "xyes") AM_CONDITIONAL(BUILD_RSS, test "x$build_rss" = "xyes" -o "x$build_lj" = "xyes") AM_CONDITIONAL(BUILD_LJ, test "x$build_lj" = "xyes") AM_CONDITIONAL(HAVE_THREAD, test "x$pthread" = "xyes") AM_CONDITIONAL(HAVE_LIBOTR, test "x$have_libotr" = "xyes") AM_CONDITIONAL(HAVE_FRIBIDI, test "x$have_fribidi" = "xyes") if test "x$build_icq" = "xyes"; then AC_DEFINE(BUILD_ICQ, 1, [build with ICQ support]) fi if test "x$build_yahoo" = "xyes"; then if test "x$have_curl" = "xno"; then AC_MSG_ERROR([Yahoo cannot be built without the curl library.]) fi if test -z "$libcurl_feature_SSL" -o "x$libcurl_feature_SSL" = "xno"; then AC_MSG_ERROR([Yahoo requires libcurl built with SSL support.]) fi AC_DEFINE(BUILD_YAHOO, 1, [build with yahoo support]) fi if test "x$build_aim" = "xyes"; then AC_DEFINE(BUILD_AIM, 1, [build with aim support]) fi if test "x$build_irc" = "xyes"; then AC_DEFINE(BUILD_IRC, 1, [build with irc support]) fi if test "x$build_jabber" = "xyes"; then if test "x$have_gpgme" = "xno"; then AC_MSG_WARN([No GPG support in Jabber, since GPGME library not found or its setup not ok]) fi AC_DEFINE(BUILD_JABBER, 1, [build with jabber support]) fi if test "x$build_gg" = "xyes"; then if test "x$have_libjpeg" = "xno"; then AC_MSG_WARN([No jpeg support in Gadu-Gadu, you will not be able to register??????????]) fi AC_DEFINE(BUILD_GADU, 1, [build with gadu-gadu support]) fi if test "x$build_msn" = "xyes"; then if test "x$have_curl" = "xno"; then AC_MSG_ERROR([MSN cannot be built without the curl library.]) fi if test -z "$libcurl_feature_SSL" -o "x$libcurl_feature_SSL" = "xno"; then AC_MSG_ERROR([MSN requires libcurl built with SSL support.]) fi AC_DEFINE(BUILD_MSN, 1, [build with MSN support]) fi if test "x$build_rss" = "xyes" -o "x$build_lj" = "xyes"; then AC_DEFINE(BUILD_RSS, 1, [build the integrated rss feeds reader]) fi if test "x$build_lj" = "xyes"; then AC_DEFINE(BUILD_LJ, 1, [build the integrated livejournal client]) fi if test "x$locales_fx" != "xno"; then AC_DEFINE([LOCALES_HACK], 1, [enables workaround for broken locales]) fi ############################ # Checks for header files. # ############################ AC_FUNC_ALLOCA AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([argz.h]) AC_CHECK_HEADERS([arpa/inet.h]) AC_CHECK_HEADERS([fcntl.h]) AC_CHECK_HEADERS([float.h]) AC_CHECK_HEADERS([ftw.h]) AC_CHECK_HEADERS([inttypes.h]) AC_CHECK_HEADERS([langinfo.h]) AC_CHECK_HEADERS([libintl.h]) AC_CHECK_HEADERS([limits.h]) AC_CHECK_HEADERS([locale.h]) AC_CHECK_HEADERS([malloc.h]) AC_CHECK_HEADERS([netdb.h]) AC_CHECK_HEADERS([netinet/in.h]) AC_CHECK_HEADERS([stddef.h]) AC_CHECK_HEADERS([stdint.h]) AC_CHECK_HEADERS([stdio_ext.h]) AC_CHECK_HEADERS([stdlib.h]) AC_CHECK_HEADERS([string.h]) AC_CHECK_HEADERS([strings.h]) AC_CHECK_HEADERS([sys/ioctl.h]) AC_CHECK_HEADERS([sys/mount.h]) AC_CHECK_HEADERS([sys/param.h]) AC_CHECK_HEADERS([sys/socket.h]) AC_CHECK_HEADERS([sys/statvfs.h]) AC_CHECK_HEADERS([sys/time.h]) AC_CHECK_HEADERS([sys/vfs.h]) AC_CHECK_HEADERS([syslog.h]) AC_CHECK_HEADERS([unistd.h]) AC_CHECK_HEADERS([utmp.h]) AC_CHECK_HEADERS([wchar.h]) AC_CHECK_HEADERS([sys/types.h]) AC_CHECK_HEADERS([_G_config.h]) AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_CHECK_HEADERS([vector iostream fstream string algorithm list memory iterator exception utility],, AC_MSG_ERROR([You need to have the libstdc++ headers installed])) AC_CHECK_HEADERS([hash_map strstream ext/hash_map sstream],,) AC_LANG_RESTORE ################################################## # check whether make supports order-only targets # ################################################## AC_CACHE_CHECK([whether ${MAKE-make} supports order-only targets], [centerim_cv_make_order_only], [cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: | say say: echo say .PHONY: all say _ACEOF centerim_cv_make_order_only=no ${MAKE-make} -f conftest.make >/dev/null 2>&1 && centerim_cv_make_order_only=yes rm -f conftest.make ]) if test x$centerim_cv_make_order_only = xyes; then ORDER_ONLY="|" fi ################################################################## # Checks for typedefs, structures, and compiler characteristics. # ################################################################## AC_STRUCT_TIMEZONE AC_HEADER_STDBOOL AC_C_CONST AC_C_INLINE AC_C_RESTRICT AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM AC_C_VOLATILE AC_CHECK_TYPES([ptrdiff_t]) AC_TYPE_SIGNAL ################# # Substitutions # ################# AC_SUBST(FRIBIDI_LIBS) AC_SUBST(FRIBIDI_CFLAGS) AC_SUBST(FRIBIDI_PC) AC_SUBST(GPGME_LIBS) AC_SUBST(GPGME_CFLAGS) AC_SUBST(GPGME_CXXFLAGS) AC_SUBST(GNUTLS_LIBS) AC_SUBST(GNUTLS_CFLAGS) AC_SUBST(GNUTLS_CXXFLAGS) AC_SUBST(CURL_LIBS) AC_SUBST(CURL_CFLAGS) AC_SUBST(CURL_CXXFLAGS) AC_SUBST(JPEG_LIBS) AC_SUBST(ORDER_ONLY) ################################# # Checks for library functions. # ################################# AC_FUNC_SELECT_ARGTYPES AC_CHECK_FUNCS([gethostbyname]) AC_CHECK_FUNCS([gethostname]) AC_CHECK_FUNCS([getpass]) AC_CHECK_FUNCS([inet_aton]) AC_CHECK_FUNCS([inet_ntoa]) AC_CHECK_FUNCS([memset]) AC_CHECK_FUNCS([select]) AC_CHECK_FUNCS([setenv]) AC_CHECK_FUNCS([socket]) AC_CHECK_FUNCS([strerror]) AC_CHECK_FUNCS([strtol]) ######################## # Create output files. # ######################## ALL_LINGUAS="zh_TW zh_CN uk sv ru ro pt_BR pl nl ms it hu fr es de cs bg" AC_CONFIG_FILES([Makefile connwrap/Makefile firetalk/Makefile kkconsui/Makefile kkconsui/include/Makefile kkconsui/src/Makefile kkstrtext/Makefile kksystr/Makefile kksystr/include/Makefile kksystr/src/Makefile libgadu/Makefile libicq2000/Makefile libicq2000/libicq2000/Makefile libicq2000/src/Makefile libjabber/Makefile libmsn/Makefile libmsn/msn/Makefile libyahoo2/Makefile misc/Makefile share/Makefile src/Makefile src/hooks/Makefile intl/Makefile po/Makefile.in]) AC_OUTPUT AC_MSG_RESULT([ Build options: Version $VERSION Install prefix $prefix CFLAGS $CFLAGS CXXFLAGS $CXXFLAGS Protocols and Clients:]) if test "x$build_icq" = "xyes"; then AC_MSG_RESULT([ ICQ]); fi if test "x$build_yahoo" = "xyes"; then AC_MSG_RESULT([ Yahoo]); fi if test "x$build_aim" = "xyes"; then AC_MSG_RESULT([ AIM]); fi if test "x$build_jabber" = "xyes"; then AC_MSG_RESULT([ jabber]); fi if test "x$build_gg" = "xyes"; then AC_MSG_RESULT([ Gadu-Gadu]); fi if test "x$build_msn" = "xyes"; then AC_MSG_RESULT([ MSN Messenger]); fi if test "x$build_rss" = "xyes"; then AC_MSG_RESULT([ RSS Reader]); fi if test "x$build_lj" = "xyes"; then AC_MSG_RESULT([ LiveJournal client]); fi if test "x$have_fribidi" = "xyes"; then AC_MSG_RESULT([ LiveJournal client]); fi if test "x$with_ssl" = "xno"; then AC_MSG_RESULT([ WARNING: SSL disabled (This means no Google Talk) ]); else if test "x$have_gpgme" = "xno"; then AC_MSG_RESULT([ WARNING: GPGME disabled (This means no encrypted messages between users) ]); fi if test "x$have_libotr" = "xyes"; then AC_MSG_RESULT([ WARNING: libotr enabled (OTR is not supported yet, use at your own risk) ]); fi if test "x$pthread" = "xno"; then AC_MSG_RESULT([ WARNING: pthreads disabled (No file-transfers in jabber) ]); fi fi AC_MSG_RESULT([ Enjoy!]) centerim-4.22.10/ABOUT-NLS0000644000175000001440000023523411473011427011643 000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your country by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skill are praised more than programming skill, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of June 2006. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ GNUnet | [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] | bash | [] [] [] | batchelor | [] | bfd | | bibshelf | [] | binutils | [] | bison | [] [] | bison-runtime | | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | [] [] | coreutils | [] [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | darkstat | [] () [] | dialog | [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] () [] | fileutils | [] [] | findutils | [] [] [] | flex | [] [] [] | fslint | [] | gas | | gawk | [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] [] [] | gip | [] | gliv | [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | () () [] | gnucash-glossary | [] () | gnuedu | | gnulib | [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | [] [] | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | () () | gramadoir | [] [] | grep | [] [] [] [] [] [] | gretl | | gsasl | | gss | | gst-plugins | [] [] [] [] | gst-plugins-base | [] [] [] | gst-plugins-good | [] [] [] [] [] [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | [] () | gtkam | [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | id-utils | [] [] | impost | | indent | [] [] [] | iso_3166 | [] [] | iso_3166_1 | [] [] [] [] [] | iso_3166_2 | | iso_3166_3 | [] | iso_4217 | [] | iso_639 | [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | | keytouch-editor | | keytouch-keyboa... | | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | | libidn | [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] | make | [] [] | man-db | [] () [] [] | minicom | [] [] [] | mysecretdiary | [] [] | nano | [] [] () [] | nano_1_0 | [] () [] [] | opcodes | [] | parted | | pilot-qof | [] | psmisc | [] | pwdutils | | python | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | silky | | skencil | [] () | sketch | [] () | solfege | | soundtracker | [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | | texinfo | [] [] [] | textutils | [] [] [] | tin | () () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] | xchat | [] [] [] [] [] | xkeyboard-config | | xpad | [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 11 0 1 2 8 20 1 42 43 2 62 97 18 1 16 13 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ GNUnet | | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] [] [] | batchelor | [] [] | bfd | [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | darkstat | [] () [] [] [] | dialog | [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | error | [] [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] [] | findutils | [] [] [] [] | flex | [] [] [] | fslint | [] | gas | [] [] | gawk | [] [] [] [] | gbiff | [] | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] | gip | [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnucash-glossary | [] [] | gnuedu | [] | gnulib | [] [] [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] | gpsdrive | () () [] () | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] [] [] [] [] | gretl | [] [] [] | gsasl | [] | gss | [] | gst-plugins | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gstreamer | [] [] [] | gtick | [] [] [] [] [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] [] | impost | [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_3166 | [] [] [] | iso_3166_1 | [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_3166_3 | [] | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] [] | ld | [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | | libidn | [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] [] | lynx | [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | () | minicom | [] [] [] [] | mysecretdiary | [] [] [] | nano | [] () [] [] [] [] | nano_1_0 | [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | sh-utils | [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | | silky | [] | skencil | [] [] | sketch | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] | textutils | [] [] [] [] [] | tin | [] () | tp-robot | [] [] [] | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | vorbis-tools | [] [] | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 89 21 16 2 41 118 59 14 1 8 1 6 60 30 0 52 ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no +--------------------------------------------------+ GNUnet | | a2ps | () [] [] () | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | | cpplib | [] | cryptonit | [] | darkstat | [] [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | error | [] | fetchmail | [] [] | fileutils | [] [] | findutils | [] | flex | [] [] | fslint | [] [] | gas | | gawk | [] [] | gbiff | [] | gcal | | gcc | | gettext-examples | [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gimp-print | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] | gnubiff | | gnucash | () () | gnucash-glossary | [] | gnuedu | | gnulib | [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | [] | gpe-edit | [] [] | gpe-filemanager | [] | gpe-go | [] [] | gpe-login | [] [] | gpe-ownerinfo | [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] | gpe-today | [] | gpe-todo | | gphoto2 | [] [] | gprof | | gpsdrive | () () () | gramadoir | () | grep | [] [] [] | gretl | | gsasl | [] | gss | | gst-plugins | [] | gst-plugins-base | | gst-plugins-good | [] | gstreamer | [] | gtick | [] | gtkam | [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | | hello | [] [] [] [] [] [] [] [] | id-utils | [] | impost | | indent | [] [] | iso_3166 | [] | iso_3166_1 | [] [] | iso_3166_2 | [] | iso_3166_3 | [] | iso_4217 | [] [] [] | iso_639 | [] [] [] | jpilot | () () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | | keytouch-keyboa... | [] | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | | libidn | [] [] | lifelines | [] | lilypond | | lingoteach | [] | lynx | [] [] | m4 | [] [] | mailutils | | make | [] [] [] | man-db | () | minicom | [] | mysecretdiary | [] | nano | [] [] [] | nano_1_0 | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] | shishi | | silky | [] | skencil | | sketch | | solfege | | soundtracker | | sp | () | stardict | [] [] | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] [] | textutils | [] [] [] | tin | | tp-robot | [] | tuxpaint | [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | vorbis-tools | [] | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +--------------------------------------------------+ ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no 40 24 2 1 1 3 1 2 3 21 0 15 1 102 6 3 nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +------------------------------------------------------+ GNUnet | | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] | bash | [] [] [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | darkstat | [] [] [] [] [] [] | dialog | [] [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] [] [] [] | gas | | gawk | [] [] [] [] | gbiff | [] | gcal | [] | gcc | | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gimp-print | [] [] | gip | [] [] [] [] | gliv | [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () | gnucash | () [] | gnucash-glossary | [] [] [] | gnuedu | | gnulib | [] [] [] [] [] | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] [] [] [] [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] | gretl | [] | gsasl | [] [] | gss | [] [] [] | gst-plugins | [] [] [] [] | gst-plugins-base | [] | gst-plugins-good | [] [] [] [] | gstreamer | [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] | impost | [] | indent | [] [] [] [] [] [] | iso_3166 | [] [] [] [] [] [] | iso_3166_1 | [] [] [] [] | iso_3166_2 | | iso_3166_3 | [] [] [] [] | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] | libgpg-error | [] [] | libgphoto2 | [] | libgphoto2_port | [] [] | libgsasl | [] [] [] [] | libiconv | | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailutils | [] [] [] [] | make | [] [] [] [] | man-db | [] [] | minicom | [] [] [] [] [] | mysecretdiary | [] [] [] [] | nano | [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | [] | psmisc | [] [] | pwdutils | [] [] | python | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sh-utils | [] [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | silky | [] | skencil | [] [] [] | sketch | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | stardict | [] [] [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] | tin | () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] | wastesedge | | wdiff | [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] | xpad | [] [] [] | +------------------------------------------------------+ nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 2 3 58 31 53 5 76 72 5 42 48 12 51 128 2 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ GNUnet | [] | 2 a2ps | [] [] [] | 19 aegis | | 0 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 14 bash | [] | 11 batchelor | [] [] | 9 bfd | | 1 bibshelf | [] | 7 binutils | [] [] [] | 9 bison | [] [] [] | 19 bison-runtime | [] [] [] | 15 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 4 clisp | | 6 console-tools | [] [] | 5 coreutils | [] [] | 17 cpio | [] [] [] | 9 cpplib | [] [] [] [] | 11 cryptonit | | 5 darkstat | [] () () | 15 dialog | [] [] [] [] [] | 30 diffutils | [] [] [] [] | 28 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 error | [] [] [] [] | 18 fetchmail | [] [] | 12 fileutils | [] [] [] | 18 findutils | [] [] [] | 17 flex | [] [] | 15 fslint | [] | 9 gas | [] | 3 gawk | [] [] | 15 gbiff | [] | 5 gcal | [] | 5 gcc | [] [] [] | 5 gettext-examples | [] [] [] [] [] | 24 gettext-runtime | [] [] [] [] [] | 26 gettext-tools | [] [] [] [] [] | 19 gimp-print | [] [] | 12 gip | [] [] | 12 gliv | [] [] | 8 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 15 gnubiff | [] | 1 gnucash | () | 2 gnucash-glossary | [] [] | 9 gnuedu | [] | 2 gnulib | [] [] [] [] [] | 28 gnunet-gtk | | 1 gnutls | | 2 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] [] [] [] | 19 gpe-clock | [] [] [] [] | 20 gpe-conf | [] [] | 14 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] | 19 gpe-filemanager | [] | 5 gpe-go | [] [] | 14 gpe-login | [] [] [] [] [] | 20 gpe-ownerinfo | [] [] [] [] | 20 gpe-package | [] | 5 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] | 19 gpe-taskmanager | [] [] [] | 19 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 20 gpe-todo | [] | 6 gphoto2 | [] [] [] [] | 20 gprof | [] [] | 11 gpsdrive | | 4 gramadoir | [] | 7 grep | [] [] [] [] | 33 gretl | | 4 gsasl | [] [] | 6 gss | [] | 5 gst-plugins | [] [] [] | 15 gst-plugins-base | [] [] [] | 9 gst-plugins-good | [] [] [] | 18 gstreamer | [] [] [] | 17 gtick | [] | 11 gtkam | [] | 13 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 26 gutenprint | | 3 hello | [] [] [] [] [] | 39 id-utils | [] [] | 14 impost | [] | 4 indent | [] [] [] [] | 25 iso_3166 | [] [] [] | 15 iso_3166_1 | [] [] | 20 iso_3166_2 | | 2 iso_3166_3 | [] [] | 9 iso_4217 | [] [] | 14 iso_639 | [] [] | 16 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] | 12 keytouch | [] | 4 keytouch-editor | | 2 keytouch-keyboa... | [] | 4 latrine | [] [] | 8 ld | [] [] [] | 7 leafpad | [] [] [] [] | 23 libc | [] [] [] | 23 libexif | [] | 4 libextractor | [] | 5 libgpewidget | [] [] [] | 19 libgpg-error | [] | 4 libgphoto2 | [] | 7 libgphoto2_port | [] [] [] | 10 libgsasl | [] | 8 libiconv | | 0 libidn | [] [] | 10 lifelines | | 4 lilypond | | 2 lingoteach | [] | 6 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailutils | [] | 8 make | [] [] [] | 20 man-db | [] | 6 minicom | [] | 14 mysecretdiary | [] [] | 12 nano | [] [] | 15 nano_1_0 | [] [] [] | 18 opcodes | [] [] | 10 parted | [] [] [] | 9 pilot-qof | [] | 3 psmisc | [] | 10 pwdutils | [] | 3 python | | 0 qof | [] | 2 radius | [] | 6 recode | [] [] [] | 25 rpm | [] [] [] | 13 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] | 22 sh-utils | [] | 15 shared-mime-info | [] [] [] [] | 23 sharutils | [] [] [] | 23 shishi | | 1 silky | [] | 4 skencil | [] | 7 sketch | | 6 solfege | | 2 soundtracker | [] [] | 9 sp | [] | 3 stardict | [] [] [] [] | 11 system-tools-ba... | [] [] [] [] [] [] [] | 37 tar | [] [] [] [] | 17 texinfo | [] [] [] | 15 textutils | [] [] [] | 17 tin | | 1 tp-robot | [] [] [] | 9 tuxpaint | [] [] [] | 16 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 vorbis-tools | [] [] | 11 wastesedge | | 1 wdiff | [] [] | 22 wget | [] [] [] | 19 xchat | [] [] [] [] | 28 xkeyboard-config | [] [] [] [] | 11 xpad | [] [] [] | 14 +---------------------------------------------------+ 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 172 domains 0 1 1 78 39 0 135 14 1 50 1 52 0 2040 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If June 2006 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. centerim-4.22.10/m4/0000755000175000001440000000000011473011455011004 500000000000000centerim-4.22.10/m4/glibc2.m40000644000175000001440000000135411473011430012324 00000000000000# glibc2.m4 serial 1 dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Test for the GNU C Library, version 2.0 or newer. # From Bruno Haible. AC_DEFUN([gt_GLIBC2], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2 or newer, ac_cv_gnu_library_2, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2=yes, ac_cv_gnu_library_2=no) ] ) AC_SUBST(GLIBC2) GLIBC2="$ac_cv_gnu_library_2" ] ) centerim-4.22.10/m4/intmax.m40000644000175000001440000000174611473011430012467 00000000000000# intmax.m4 serial 2 (gettext-0.14.2) dnl Copyright (C) 2002-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether the system has the 'intmax_t' type, but don't attempt to dnl find a replacement if it is lacking. AC_DEFUN([gt_TYPE_INTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, [AC_TRY_COMPILE([ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif ], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)]) if test $gt_cv_c_intmax_t = yes; then AC_DEFINE(HAVE_INTMAX_T, 1, [Define if you have the 'intmax_t' type in or .]) fi ]) centerim-4.22.10/m4/ulonglong.m40000644000175000001440000000161511473011430013166 00000000000000# ulonglong.m4 serial 4 dnl Copyright (C) 1999-2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works. AC_DEFUN([gl_AC_TYPE_UNSIGNED_LONG_LONG], [ AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, [AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;], [unsigned long long ullmax = (unsigned long long) -1; return ull << i | ull >> i | ullmax / ull | ullmax % ull;], ac_cv_type_unsigned_long_long=yes, ac_cv_type_unsigned_long_long=no)]) if test $ac_cv_type_unsigned_long_long = yes; then AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, [Define if you have the 'unsigned long long' type.]) fi ]) centerim-4.22.10/m4/codeset.m40000644000175000001440000000135111473011430012605 00000000000000# codeset.m4 serial AM1 (gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET);], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) centerim-4.22.10/m4/wchar_t.m40000644000175000001440000000132611473011430012610 00000000000000# wchar_t.m4 serial 1 (gettext-0.12) dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether has the 'wchar_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WCHAR_T], [ AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, [AC_TRY_COMPILE([#include wchar_t foo = (wchar_t)'\0';], , gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) if test $gt_cv_c_wchar_t = yes; then AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) fi ]) centerim-4.22.10/m4/iconv.m40000644000175000001440000000642611473011430012305 00000000000000# iconv.m4 serial AM4 (gettext-0.11.3) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) centerim-4.22.10/m4/inttypes.m40000644000175000001440000000147211473011430013042 00000000000000# inttypes.m4 serial 1 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_INTTYPES_H if exists and doesn't clash with # . AC_DEFUN([gt_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h, [ AC_TRY_COMPILE( [#include #include ], [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no) ]) if test $gt_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, [Define if exists and doesn't clash with .]) fi ]) centerim-4.22.10/m4/isc-posix.m40000644000175000001440000000170611473011430013101 00000000000000# isc-posix.m4 serial 2 (gettext-0.11.2) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # This file is not needed with autoconf-2.53 and newer. Remove it in 2005. # This test replaces the one in autoconf. # Currently this macro should have the same name as the autoconf macro # because gettext's gettext.m4 (distributed in the automake package) # still uses it. Otherwise, the use in gettext.m4 makes autoheader # give these diagnostics: # configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX # configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX undefine([AC_ISC_POSIX]) AC_DEFUN([AC_ISC_POSIX], [ dnl This test replaces the obsolescent AC_ISC_POSIX kludge. AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) ] ) centerim-4.22.10/m4/ax_with_curses.m40000644000175000001440000001203711473007750014223 00000000000000# =========================================================================== # http://www.nongnu.org/autoconf-archive/ax_with_curses.html # =========================================================================== # # SYNOPSIS # # AX_WITH_CURSES # # DESCRIPTION # # Detect SysV compatible curses, such as ncurses. # # Defines HAVE_CURSES_H or HAVE_NCURSES_H if curses is found. CURSES_LIB # is also set with the required library, but is not appended to LIBS # automatically. If no working curses library is found CURSES_LIB will be # left blank. If CURSES_LIB is set in the environment, the supplied value # will be used. # # There are two options: --with-ncurses forces the use of ncurses, and # --with-ncursesw forces the use of ncursesw (wide character ncurses). The # corresponding options --without-ncurses and --without-ncursesw force # those libraries not to be used. By default, ncursesw is preferred to # ncurses, which is preferred to plain curses. # # ax_cv_curses is set to "yes" if any curses is found (including # ncurses!); ax_cv_ncurses is set to "yes" if any ncurses is found, and # ax_cv_ncursesw is set to "yes" if ncursesw is found. # # LICENSE # # Copyright (c) 2009 Mark Pulford # Copyright (c) 2009 Damian Pietras # Copyright (c) 2009 Reuben Thomas # # 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 3 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, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. AU_ALIAS([MP_WITH_CURSES], [AX_WITH_CURSES]) AC_DEFUN([AX_WITH_CURSES], [AC_ARG_WITH(ncurses, [AC_HELP_STRING([--with-ncurses], [Force the use of ncurses over curses])],,) ax_save_LIBS="$LIBS" AC_ARG_WITH(ncursesw, [AC_HELP_STRING([--without-ncursesw], [Don't use ncursesw (wide character support)])],,) if test ! "$CURSES_LIB" -a "$with_ncurses" != no -a "$with_ncursesw" != "no" then AC_CACHE_CHECK([for working ncursesw], ax_cv_ncursesw, [LIBS="$ax_save_LIBS -lncursesw" AC_TRY_LINK( [#include ], [chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ], ax_cv_ncursesw=yes, ax_cv_ncursesw=no)]) if test "$ax_cv_ncursesw" = yes then AC_CHECK_HEADER([ncursesw/cursesw.h], AC_DEFINE(HAVE_NCURSESW_H, 1, [Define if you have ncursesw/cursesw.h])) AC_CHECK_HEADER([ncursesw/curses.h], AC_DEFINE(HAVE_NCURSES_H, 1, [Define if you have ncursesw/curses.h])) AC_DEFINE(HAVE_NCURSESW, 1, [Define if you have libncursesw]) CURSES_LIB="-lncursesw" ax_cv_ncurses=yes ax_cv_curses=yes fi fi if test ! "$CURSES_LIB" -a "$with_ncurses" != no -a "$with_ncursesw" != yes then AC_CACHE_CHECK([for working ncurses], ax_cv_ncurses, [LIBS="$ax_save_LIBS -lncurses" AC_TRY_LINK( [#include ], [chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ], ax_cv_ncurses=yes, ax_cv_ncurses=no)]) if test "$ax_cv_ncurses" = yes then AC_DEFINE([HAVE_NCURSES_H],[1],[Define if you have ncurses.h]) CURSES_LIB="-lncurses" ax_cv_curses=yes fi fi if test "$ax_cv_curses" != yes -a "$with_ncurses" != yes -a "$with_ncursesw" != yes then if test ! "$CURSES_LIB" then CURSES_LIB="-lcurses" fi AC_CACHE_CHECK([for working curses], ax_cv_curses, [LIBS="$ax_save_LIBS $CURSES_LIB" AC_TRY_LINK( [#include ], [chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ], ax_cv_curses=yes, ax_cv_curses=no)]) if test "$ax_cv_curses" = yes then AC_DEFINE([HAVE_CURSES_H],[1],[Define if you have curses.h]) fi fi LIBS="$ax_save_LIBS" ])dnl centerim-4.22.10/m4/size_max.m40000644000175000001440000000364511473011430013006 00000000000000# size_max.m4 serial 2 dnl Copyright (C) 2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gl_SIZE_MAX], [ AC_CHECK_HEADERS(stdint.h) dnl First test whether the system already has SIZE_MAX. AC_MSG_CHECKING([for SIZE_MAX]) result= AC_EGREP_CPP([Found it], [ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif ], result=yes) if test -z "$result"; then dnl Define it ourselves. Here we assume that the type 'size_t' is not wider dnl than the type 'unsigned long'. dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr', dnl which is guaranteed to work from LONG_MIN to LONG_MAX. _AC_COMPUTE_INT([~(size_t)0 / 10], res_hi, [#include ], result=?) _AC_COMPUTE_INT([~(size_t)0 % 10], res_lo, [#include ], result=?) _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint, [#include ], result=?) if test "$fits_in_uint" = 1; then dnl Even though SIZE_MAX fits in an unsigned int, it must be of type dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. AC_TRY_COMPILE([#include extern size_t foo; extern unsigned long foo; ], [], fits_in_uint=0) fi if test -z "$result"; then if test "$fits_in_uint" = 1; then result="$res_hi$res_lo"U else result="$res_hi$res_lo"UL fi else dnl Shouldn't happen, but who knows... result='~(size_t)0' fi fi AC_MSG_RESULT([$result]) if test "$result" != yes; then AC_DEFINE_UNQUOTED([SIZE_MAX], [$result], [Define as the maximum value of type 'size_t', if the system doesn't define it.]) fi ]) centerim-4.22.10/m4/lib-prefix.m40000644000175000001440000001231011473011430013215 00000000000000# lib-prefix.m4 serial 4 (gettext-0.14.2) dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/lib"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) centerim-4.22.10/m4/libcurl.m40000644000175000001440000002175611461606612012637 00000000000000# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], # [ACTION-IF-YES], [ACTION-IF-NO]) # ---------------------------------------------------------- # David Shaw May-09-2006 # # Checks for libcurl. DEFAULT-ACTION is the string yes or no to # specify whether to default to --with-libcurl or --without-libcurl. # If not supplied, DEFAULT-ACTION is yes. MINIMUM-VERSION is the # minimum version of libcurl to accept. Pass the version as a regular # version number like 7.10.1. If not supplied, any version is # accepted. ACTION-IF-YES is a list of shell commands to run if # libcurl was successfully found and passed the various tests. # ACTION-IF-NO is a list of shell commands that are run otherwise. # Note that using --without-libcurl does run ACTION-IF-NO. # # This macro #defines HAVE_LIBCURL if a working libcurl setup is # found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary # values. Other useful defines are LIBCURL_FEATURE_xxx where xxx are # the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy # where yyy are the various protocols supported by libcurl. Both xxx # and yyy are capitalized. See the list of AH_TEMPLATEs at the top of # the macro for the complete list of possible defines. Shell # variables $libcurl_feature_xxx and $libcurl_protocol_yyy are also # defined to 'yes' for those features and protocols that were found. # Note that xxx and yyy keep the same capitalization as in the # curl-config list (e.g. it's "HTTP" and not "http"). # # Users may override the detected values by doing something like: # LIBCURL="-lcurl" LIBCURL_CPPFLAGS="-I/usr/myinclude" ./configure # # For the sake of sanity, this macro assumes that any libcurl that is # found is after version 7.7.2, the first version that included the # curl-config script. Note that it is very important for people # packaging binary versions of libcurl to include this script! # Without curl-config, we can only guess what protocols are available, # or use curl_version_info to figure it out at runtime. AC_DEFUN([LIBCURL_CHECK_CONFIG], [ AH_TEMPLATE([LIBCURL_FEATURE_SSL],[Defined if libcurl supports SSL]) AH_TEMPLATE([LIBCURL_FEATURE_KRB4],[Defined if libcurl supports KRB4]) AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6]) AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz]) AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS]) AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN]) AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI]) AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM]) AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP]) AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS]) AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP]) AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS]) AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE]) AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET]) AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP]) AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT]) AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP]) AC_ARG_WITH(libcurl, AC_HELP_STRING([--with-libcurl=DIR],[look for the curl library in DIR]), [_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])]) if test "$_libcurl_with" != "no" ; then AC_PROG_AWK _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'" _libcurl_try_link=yes if test -d "$_libcurl_with" ; then LIBCURL_CPPFLAGS="-I$withval/include" _libcurl_ldflags="-L$withval/lib" AC_PATH_PROG([_libcurl_config],[curl-config],["$withval/bin"], ["$withval/bin"]) else AC_PATH_PROG([_libcurl_config],[curl-config]) fi if test x$_libcurl_config != "x" ; then AC_CACHE_CHECK([for the version of libcurl], [libcurl_cv_lib_curl_version], [libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $[]2}'`]) _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse` _libcurl_wanted=`echo ifelse([$2],,[0],[$2]) | $_libcurl_version_parse` if test $_libcurl_wanted -gt 0 ; then AC_CACHE_CHECK([for libcurl >= version $2], [libcurl_cv_lib_version_ok], [ if test $_libcurl_version -ge $_libcurl_wanted ; then libcurl_cv_lib_version_ok=yes else libcurl_cv_lib_version_ok=no fi ]) fi if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then if test x"$LIBCURL_CPPFLAGS" = "x" ; then LIBCURL_CPPFLAGS=`$_libcurl_config --cflags` fi if test x"$LIBCURL" = "x" ; then LIBCURL=`$_libcurl_config --libs` # This is so silly, but Apple actually has a bug in their # curl-config script. Fixed in Tiger, but there are still # lots of Panther installs around. case "${host}" in powerpc-apple-darwin7*) LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'` ;; esac fi # All curl-config scripts support --feature _libcurl_features=`$_libcurl_config --feature` # Is it modern enough to have --protocols? (7.12.4) if test $_libcurl_version -ge 461828 ; then _libcurl_protocols=`$_libcurl_config --protocols` fi else _libcurl_try_link=no fi unset _libcurl_wanted fi if test $_libcurl_try_link = yes ; then # we didn't find curl-config, so let's see if the user-supplied # link line (or failing that, "-lcurl") is enough. LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"} AC_CACHE_CHECK([whether libcurl is usable], [libcurl_cv_lib_curl_usable], [ _libcurl_save_cppflags=$CPPFLAGS CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS" _libcurl_save_libs=$LIBS LIBS="$LIBCURL $LIBS" AC_LINK_IFELSE(AC_LANG_PROGRAM([#include ],[ /* Try and use a few common options to force a failure if we are missing symbols or can't link. */ int x; curl_easy_setopt(NULL,CURLOPT_URL,NULL); x=CURL_ERROR_SIZE; x=CURLOPT_WRITEFUNCTION; x=CURLOPT_FILE; x=CURLOPT_ERRORBUFFER; x=CURLOPT_STDERR; x=CURLOPT_VERBOSE; ]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no) CPPFLAGS=$_libcurl_save_cppflags LIBS=$_libcurl_save_libs unset _libcurl_save_cppflags unset _libcurl_save_libs ]) if test $libcurl_cv_lib_curl_usable = yes ; then # Does curl_free() exist in this version of libcurl? # If not, fake it with free() _libcurl_save_cppflags=$CPPFLAGS CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" _libcurl_save_libs=$LIBS LIBS="$LIBS $LIBCURL" AC_CHECK_FUNC(curl_free,, AC_DEFINE(curl_free,free, [Define curl_free() as free() if our version of curl lacks curl_free.])) CPPFLAGS=$_libcurl_save_cppflags LIBS=$_libcurl_save_libs unset _libcurl_save_cppflags unset _libcurl_save_libs AC_DEFINE(HAVE_LIBCURL,1, [Define to 1 if you have a functional curl library.]) AC_SUBST(LIBCURL_CPPFLAGS) AC_SUBST(LIBCURL) for _libcurl_feature in $_libcurl_features ; do AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_feature_$_libcurl_feature),[1]) eval AS_TR_SH(libcurl_feature_$_libcurl_feature)=yes done if test "x$_libcurl_protocols" = "x" ; then # We don't have --protocols, so just assume that all # protocols are available _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT" if test x$libcurl_feature_SSL = xyes ; then _libcurl_protocols="$_libcurl_protocols HTTPS" # FTPS wasn't standards-compliant until version # 7.11.0 if test $_libcurl_version -ge 461568; then _libcurl_protocols="$_libcurl_protocols FTPS" fi fi fi for _libcurl_protocol in $_libcurl_protocols ; do AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_protocol_$_libcurl_protocol),[1]) eval AS_TR_SH(libcurl_protocol_$_libcurl_protocol)=yes done else unset LIBCURL unset LIBCURL_CPPFLAGS fi fi unset _libcurl_try_link unset _libcurl_version_parse unset _libcurl_config unset _libcurl_feature unset _libcurl_features unset _libcurl_protocol unset _libcurl_protocols unset _libcurl_version unset _libcurl_ldflags fi if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then # This is the IF-NO path ifelse([$4],,:,[$4]) else # This is the IF-YES path ifelse([$3],,:,[$3]) fi unset _libcurl_with ])dnl centerim-4.22.10/m4/stdint_h.m40000644000175000001440000000157311473011430013001 00000000000000# stdint_h.m4 serial 5 dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], gl_cv_header_stdint_h=yes, gl_cv_header_stdint_h=no)]) if test $gl_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) centerim-4.22.10/m4/lib-link.m40000644000175000001440000005542611473011430012674 00000000000000# lib-link.m4 serial 6 (gettext-0.14.3) dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ(2.50) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, dnl hardcode_direct, hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib$1-prefix], [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib$1-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) centerim-4.22.10/m4/progtest.m40000644000175000001440000000555011473011430013033 00000000000000# progtest.m4 serial 4 (gettext-0.14.2) dnl Copyright (C) 1996-2003, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. AC_PREREQ(2.50) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) centerim-4.22.10/m4/inttypes_h.m40000644000175000001440000000162311473011430013347 00000000000000# inttypes_h.m4 serial 6 dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], gl_cv_header_inttypes_h=yes, gl_cv_header_inttypes_h=no)]) if test $gl_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) centerim-4.22.10/m4/lib-ld.m40000644000175000001440000000653111473011430012327 00000000000000# lib-ld.m4 serial 3 (gettext-0.13) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) centerim-4.22.10/m4/gettext.m40000644000175000001440000005166711473011430012662 00000000000000# gettext.m4 serial 37 (gettext-0.14.4) dnl Copyright (C) 1995-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], [no], [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AM_NLS ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. dnl Add a version number to the cache macros. define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, [AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")]ifelse([$2], [need-ngettext], [ + * ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no)]) if test "$gt_cv_func_gnugettext_libc" != "yes"; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], gt_cv_func_gnugettext_libintl, [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")]ifelse([$2], [need-ngettext], [ + * ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias ("")], gt_cv_func_gnugettext_libintl=yes, gt_cv_func_gnugettext_libintl=no) dnl Now see whether libintl exists and depends on libiconv. if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")]ifelse([$2], [need-ngettext], [ + * ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext_libintl=yes ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if test "$gt_cv_func_gnugettext_libc" = "yes" \ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext_libintl" = "yes"; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext_libintl" = "yes"; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST(INTLOBJS) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl Checks for all prerequisites of the intl subdirectory, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. AC_DEFUN([AM_INTL_SUBDIR], [ AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([gt_GLIBC2])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([AC_ISC_POSIX])dnl AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_C_CONST])dnl AC_REQUIRE([bh_C_SIGNED])dnl AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_OFF_T])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([gl_AC_TYPE_LONG_LONG])dnl AC_REQUIRE([gt_TYPE_LONGDOUBLE])dnl AC_REQUIRE([gt_TYPE_WCHAR_T])dnl AC_REQUIRE([gt_TYPE_WINT_T])dnl AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_REQUIRE([gt_TYPE_INTMAX_T]) AC_REQUIRE([gt_PRINTF_POSIX]) AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_REQUIRE([gl_GLIBC21])dnl AC_REQUIRE([gt_INTDIV0])dnl AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl AC_REQUIRE([gt_INTTYPES_PRI])dnl AC_REQUIRE([gl_XSIZE])dnl AC_REQUIRE([gt_INTL_MACOSX])dnl AC_CHECK_TYPE([ptrdiff_t], , [AC_DEFINE([ptrdiff_t], [long], [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) ]) AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.h]) AC_CHECK_FUNCS([asprintf fwprintf getcwd getegid geteuid getgid getuid \ mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \ strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \ __fsetlocking]) dnl Use the _snprintf function only if it is declared (because on NetBSD it dnl is defined as a weak alias of snprintf; we prefer to use the latter). gt_CHECK_DECL(_snprintf, [#include ]) gt_CHECK_DECL(_snwprintf, [#include ]) dnl Use the *_unlocked functions only if they are declared. dnl (because some of them were defined without being declared in Solaris dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built dnl on Solaris 2.5.1 to run on Solaris 2.6). dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13. gt_CHECK_DECL(feof_unlocked, [#include ]) gt_CHECK_DECL(fgets_unlocked, [#include ]) gt_CHECK_DECL(getc_unlocked, [#include ]) case $gt_cv_func_printf_posix in *yes) HAVE_POSIX_PRINTF=1 ;; *) HAVE_POSIX_PRINTF=0 ;; esac AC_SUBST([HAVE_POSIX_PRINTF]) if test "$ac_cv_func_asprintf" = yes; then HAVE_ASPRINTF=1 else HAVE_ASPRINTF=0 fi AC_SUBST([HAVE_ASPRINTF]) if test "$ac_cv_func_snprintf" = yes; then HAVE_SNPRINTF=1 else HAVE_SNPRINTF=0 fi AC_SUBST([HAVE_SNPRINTF]) if test "$ac_cv_func_wprintf" = yes; then HAVE_WPRINTF=1 else HAVE_WPRINTF=0 fi AC_SUBST([HAVE_WPRINTF]) AM_ICONV AM_LANGINFO_CODESET if test $ac_cv_header_locale_h = yes; then gt_LC_MESSAGES fi if test -n "$INTL_MACOSX_LIBS"; then CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers" fi dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl because plural.y uses bison specific features. It requires at least dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl compile. dnl bison is only needed for the maintainer (who touches plural.y). But in dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put dnl the rule in general Makefile. Now, some people carelessly touch the dnl files or have a broken "make" program, hence the plural.c rule will dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not dnl present or too old. AC_CHECK_PROGS([INTLBISON], [bison]) if test -z "$INTLBISON"; then ac_verc_fail=yes else dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) changequote([,])dnl ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac AC_MSG_RESULT([$ac_prog_version]) fi if test $ac_verc_fail = yes; then INTLBISON=: fi ]) dnl Checks for special options needed on MacOS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in MacOS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], gt_cv_func_CFPreferencesCopyAppValue, [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers" gt_save_LIBS="$LIBS" LIBS="$LIBS -framework CoreFoundation" AC_TRY_LINK([#include ], [CFPreferencesCopyAppValue(NULL, NULL)], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1, [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in MacOS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent, [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers" gt_save_LIBS="$LIBS" LIBS="$LIBS -framework CoreFoundation" AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1, [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) dnl gt_CHECK_DECL(FUNC, INCLUDES) dnl Check whether a function is declared. AC_DEFUN([gt_CHECK_DECL], [ AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1, [AC_TRY_COMPILE([$2], [ #ifndef $1 char *p = (char *) $1; #endif ], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)]) if test $ac_cv_have_decl_$1 = yes; then gt_value=1 else gt_value=0 fi AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value], [Define to 1 if you have the declaration of `$1', and to 0 if you don't.]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) centerim-4.22.10/m4/lcmessage.m40000644000175000001440000000240411473011430013122 00000000000000# lcmessage.m4 serial 4 (gettext-0.14.2) dnl Copyright (C) 1995-2002, 2004-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995. # Check whether LC_MESSAGES is available in . AC_DEFUN([gt_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], gt_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], gt_cv_val_LC_MESSAGES=yes, gt_cv_val_LC_MESSAGES=no)]) if test $gt_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi ]) centerim-4.22.10/m4/uintmax_t.m40000644000175000001440000000207611473011430013174 00000000000000# uintmax_t.m4 serial 9 dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. AC_PREREQ(2.13) # Define uintmax_t to 'unsigned long' or 'unsigned long long' # if it is not already defined in or . AC_DEFUN([gl_AC_TYPE_UINTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then AC_REQUIRE([gl_AC_TYPE_UNSIGNED_LONG_LONG]) test $ac_cv_type_unsigned_long_long = yes \ && ac_type='unsigned long long' \ || ac_type='unsigned long' AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, [Define to unsigned long or unsigned long long if and don't define.]) else AC_DEFINE(HAVE_UINTMAX_T, 1, [Define if you have the 'uintmax_t' type in or .]) fi ]) centerim-4.22.10/m4/glibc21.m40000644000175000001440000000144511473011430012406 00000000000000# glibc21.m4 serial 3 dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([gl_GLIBC21], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, ac_cv_gnu_library_2_1, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2_1=yes, ac_cv_gnu_library_2_1=no) ] ) AC_SUBST(GLIBC21) GLIBC21="$ac_cv_gnu_library_2_1" ] ) centerim-4.22.10/m4/xsize.m40000644000175000001440000000064511473011430012326 00000000000000# xsize.m4 serial 3 dnl Copyright (C) 2003-2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_XSIZE], [ dnl Prerequisites of lib/xsize.h. AC_REQUIRE([gl_SIZE_MAX]) AC_REQUIRE([AC_C_INLINE]) AC_CHECK_HEADERS(stdint.h) ]) centerim-4.22.10/m4/nls.m40000644000175000001440000000353011473011430011754 00000000000000# nls.m4 serial 2 (gettext-0.14.3) dnl Copyright (C) 1995-2003, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ]) AC_DEFUN([AM_MKINSTALLDIRS], [ dnl Tell automake >= 1.10 to complain if mkinstalldirs is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([mkinstalldirs])]) dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but $(top_srcdir). dnl Try to locate it. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then case "$ac_aux_dir" in /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; esac fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) ]) centerim-4.22.10/m4/signed.m40000644000175000001440000000115411473011430012431 00000000000000# signed.m4 serial 1 (gettext-0.10.40) dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([bh_C_SIGNED], [ AC_CACHE_CHECK([for signed], bh_cv_c_signed, [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)]) if test $bh_cv_c_signed = no; then AC_DEFINE(signed, , [Define to empty if the C compiler doesn't support this keyword.]) fi ]) centerim-4.22.10/m4/longlong.m40000644000175000001440000000141611473011430013000 00000000000000# longlong.m4 serial 5 dnl Copyright (C) 1999-2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_LONG_LONG if 'long long' works. AC_DEFUN([gl_AC_TYPE_LONG_LONG], [ AC_CACHE_CHECK([for long long], ac_cv_type_long_long, [AC_TRY_LINK([long long ll = 1LL; int i = 63;], [long long llmax = (long long) -1; return ll << i | ll >> i | llmax / ll | llmax % ll;], ac_cv_type_long_long=yes, ac_cv_type_long_long=no)]) if test $ac_cv_type_long_long = yes; then AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have the 'long long' type.]) fi ]) centerim-4.22.10/m4/po.m40000644000175000001440000004364311473011430011607 00000000000000# po.m4 serial 7 (gettext-0.14.3) dnl Copyright (C) 1995-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AM_NLS])dnl dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU msgfmt. if test "$GMSGFMT" != ":"; then dnl If it is no GNU msgfmt we define it as : so that the dnl Makefiles still can work. if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` AC_MSG_RESULT( [found $GMSGFMT program is not GNU msgfmt; ignore it]) GMSGFMT=":" fi fi dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is no GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po fi AC_OUTPUT_COMMANDS([ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" < #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); }], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no, [ AC_EGREP_CPP(notposix, [ #if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ notposix #endif ], gt_cv_func_printf_posix="guessing no", gt_cv_func_printf_posix="guessing yes") ]) ]) case $gt_cv_func_printf_posix in *yes) AC_DEFINE(HAVE_POSIX_PRINTF, 1, [Define if your printf() function supports format strings with positions.]) ;; esac ]) centerim-4.22.10/m4/longdouble.m40000644000175000001440000000205311473011430013311 00000000000000# longdouble.m4 serial 1 (gettext-0.12) dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether the compiler supports the 'long double' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_LONGDOUBLE], [ AC_CACHE_CHECK([for long double], gt_cv_c_long_double, [if test "$GCC" = yes; then gt_cv_c_long_double=yes else AC_TRY_COMPILE([ /* The Stardent Vistra knows sizeof(long double), but does not support it. */ long double foo = 0.0; /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ int array [2*(sizeof(long double) >= sizeof(double)) - 1]; ], , gt_cv_c_long_double=yes, gt_cv_c_long_double=no) fi]) if test $gt_cv_c_long_double = yes; then AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.]) fi ]) centerim-4.22.10/m4/wint_t.m40000644000175000001440000000130411473011430012461 00000000000000# wint_t.m4 serial 1 (gettext-0.12) dnl Copyright (C) 2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether has the 'wint_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WINT_T], [ AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, [AC_TRY_COMPILE([#include wint_t foo = (wchar_t)'\0';], , gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) if test $gt_cv_c_wint_t = yes; then AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) fi ]) centerim-4.22.10/m4/intdiv0.m40000644000175000001440000000334011473011430012534 00000000000000# intdiv0.m4 serial 1 (gettext-0.11.3) dnl Copyright (C) 2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gt_INTDIV0], [ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], gt_cv_int_divbyzero_sigfpe, [ AC_TRY_RUN([ #include #include static void #ifdef __cplusplus sigfpe_handler (int sig) #else sigfpe_handler (sig) int sig; #endif { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (1); } ], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, [ # Guess based on the CPU. case "$host_cpu" in alpha* | i[34567]86 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac ]) ]) case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, [Define if integer division by zero raises signal SIGFPE.]) ]) centerim-4.22.10/m4/inttypes-pri.m40000644000175000001440000000200211473011430013620 00000000000000# inttypes-pri.m4 serial 1 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. # Define PRI_MACROS_BROKEN if exists and defines the PRI* # macros to non-string values. This is the case on AIX 4.3.3. AC_DEFUN([gt_INTTYPES_PRI], [ AC_REQUIRE([gt_HEADER_INTTYPES_H]) if test $gt_cv_header_inttypes_h = yes; then AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], gt_cv_inttypes_pri_broken, [ AC_TRY_COMPILE([#include #ifdef PRId32 char *p = PRId32; #endif ], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) ]) fi if test "$gt_cv_inttypes_pri_broken" = yes; then AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, [Define if exists and defines unusable PRI* macros.]) fi ]) centerim-4.22.10/m4/gpgme.m40000644000175000001440000002404111461606612012270 00000000000000# gpgme.m4 - autoconf macro to detect GPGME. # Copyright (C) 2002, 2003, 2004 g10 Code GmbH # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This file is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. AC_DEFUN([_AM_PATH_GPGME_CONFIG], [ AC_ARG_WITH(gpgme-prefix, AS_HELP_STRING([--with-gpgme=[PATH]], [path to gpgme-config (auto)]), gpgme_config_prefix="$withval", gpgme_config_prefix="") if test "x$gpgme_config_prefix" != x ; then GPGME_CONFIG="$gpgme_config_prefix/bin/gpgme-config" fi AC_PATH_PROG(GPGME_CONFIG, gpgme-config, no) if test "$GPGME_CONFIG" != "no" ; then gpgme_version=`$GPGME_CONFIG --version` fi gpgme_version_major=`echo $gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` gpgme_version_minor=`echo $gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` gpgme_version_micro=`echo $gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` ]) dnl AM_PATH_GPGME([MINIMUM-VERSION, dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) dnl Test for libgpgme and define GPGME_CFLAGS and GPGME_LIBS. dnl AC_DEFUN([AM_PATH_GPGME], [ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl tmp=ifelse([$1], ,1:0.4.2,$1) if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` else req_gpgme_api=0 min_gpgme_version="$tmp" fi AC_MSG_CHECKING(for GPGME - version >= $min_gpgme_version) ok=no if test "$GPGME_CONFIG" != "no" ; then req_major=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` req_minor=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` req_micro=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` if test "$gpgme_version_major" -gt "$req_major"; then ok=yes else if test "$gpgme_version_major" -eq "$req_major"; then if test "$gpgme_version_minor" -gt "$req_minor"; then ok=yes else if test "$gpgme_version_minor" -eq "$req_minor"; then if test "$gpgme_version_micro" -ge "$req_micro"; then ok=yes fi fi fi fi fi fi if test $ok = yes; then # If we have a recent GPGME, we should also check that the # API is compatible. if test "$req_gpgme_api" -gt 0 ; then tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0` if test "$tmp" -gt 0 ; then if test "$req_gpgme_api" -ne "$tmp" ; then ok=no fi fi fi fi if test $ok = yes; then GPGME_CFLAGS=`$GPGME_CONFIG --cflags` GPGME_LIBS=`$GPGME_CONFIG --libs` AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else GPGME_CFLAGS="" GPGME_LIBS="" AC_MSG_RESULT(no) ifelse([$3], , :, [$3]) fi AC_SUBST(GPGME_CFLAGS) AC_SUBST(GPGME_LIBS) ]) dnl AM_PATH_GPGME_PTH([MINIMUM-VERSION, dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) dnl Test for libgpgme and define GPGME_PTH_CFLAGS and GPGME_PTH_LIBS. dnl AC_DEFUN([AM_PATH_GPGME_PTH], [ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl tmp=ifelse([$1], ,1:0.4.2,$1) if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` else req_gpgme_api=0 min_gpgme_version="$tmp" fi AC_MSG_CHECKING(for GPGME Pth - version >= $min_gpgme_version) ok=no if test "$GPGME_CONFIG" != "no" ; then if `$GPGME_CONFIG --thread=pth 2> /dev/null` ; then req_major=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` req_minor=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` req_micro=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` if test "$gpgme_version_major" -gt "$req_major"; then ok=yes else if test "$gpgme_version_major" -eq "$req_major"; then if test "$gpgme_version_minor" -gt "$req_minor"; then ok=yes else if test "$gpgme_version_minor" -eq "$req_minor"; then if test "$gpgme_version_micro" -ge "$req_micro"; then ok=yes fi fi fi fi fi fi fi if test $ok = yes; then # If we have a recent GPGME, we should also check that the # API is compatible. if test "$req_gpgme_api" -gt 0 ; then tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0` if test "$tmp" -gt 0 ; then if test "$req_gpgme_api" -ne "$tmp" ; then ok=no fi fi fi fi if test $ok = yes; then GPGME_PTH_CFLAGS=`$GPGME_CONFIG --thread=pth --cflags` GPGME_PTH_LIBS=`$GPGME_CONFIG --thread=pth --libs` AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else GPGME_PTH_CFLAGS="" GPGME_PTH_LIBS="" AC_MSG_RESULT(no) ifelse([$3], , :, [$3]) fi AC_SUBST(GPGME_PTH_CFLAGS) AC_SUBST(GPGME_PTH_LIBS) ]) dnl AM_PATH_GPGME_PTHREAD([MINIMUM-VERSION, dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) dnl Test for libgpgme and define GPGME_PTHREAD_CFLAGS dnl and GPGME_PTHREAD_LIBS. dnl AC_DEFUN([AM_PATH_GPGME_PTHREAD], [ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl tmp=ifelse([$1], ,1:0.4.2,$1) if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` else req_gpgme_api=0 min_gpgme_version="$tmp" fi AC_MSG_CHECKING(for GPGME pthread - version >= $min_gpgme_version) ok=no if test "$GPGME_CONFIG" != "no" ; then if `$GPGME_CONFIG --thread=pthread 2> /dev/null` ; then req_major=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` req_minor=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` req_micro=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` if test "$gpgme_version_major" -gt "$req_major"; then ok=yes else if test "$gpgme_version_major" -eq "$req_major"; then if test "$gpgme_version_minor" -gt "$req_minor"; then ok=yes else if test "$gpgme_version_minor" -eq "$req_minor"; then if test "$gpgme_version_micro" -ge "$req_micro"; then ok=yes fi fi fi fi fi fi fi if test $ok = yes; then # If we have a recent GPGME, we should also check that the # API is compatible. if test "$req_gpgme_api" -gt 0 ; then tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0` if test "$tmp" -gt 0 ; then if test "$req_gpgme_api" -ne "$tmp" ; then ok=no fi fi fi fi if test $ok = yes; then GPGME_PTHREAD_CFLAGS=`$GPGME_CONFIG --thread=pthread --cflags` GPGME_PTHREAD_LIBS=`$GPGME_CONFIG --thread=pthread --libs` AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else GPGME_PTHREAD_CFLAGS="" GPGME_PTHREAD_LIBS="" AC_MSG_RESULT(no) ifelse([$3], , :, [$3]) fi AC_SUBST(GPGME_PTHREAD_CFLAGS) AC_SUBST(GPGME_PTHREAD_LIBS) ]) dnl AM_PATH_GPGME_GLIB([MINIMUM-VERSION, dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) dnl Test for libgpgme-glib and define GPGME_GLIB_CFLAGS and GPGME_GLIB_LIBS. dnl AC_DEFUN([AM_PATH_GPGME_GLIB], [ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl tmp=ifelse([$1], ,1:0.4.2,$1) if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` else req_gpgme_api=0 min_gpgme_version="$tmp" fi AC_MSG_CHECKING(for GPGME - version >= $min_gpgme_version) ok=no if test "$GPGME_CONFIG" != "no" ; then req_major=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` req_minor=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` req_micro=`echo $min_gpgme_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` if test "$gpgme_version_major" -gt "$req_major"; then ok=yes else if test "$gpgme_version_major" -eq "$req_major"; then if test "$gpgme_version_minor" -gt "$req_minor"; then ok=yes else if test "$gpgme_version_minor" -eq "$req_minor"; then if test "$gpgme_version_micro" -ge "$req_micro"; then ok=yes fi fi fi fi fi fi if test $ok = yes; then # If we have a recent GPGME, we should also check that the # API is compatible. if test "$req_gpgme_api" -gt 0 ; then tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0` if test "$tmp" -gt 0 ; then if test "$req_gpgme_api" -ne "$tmp" ; then ok=no fi fi fi fi if test $ok = yes; then GPGME_GLIB_CFLAGS=`$GPGME_CONFIG --glib --cflags` GPGME_GLIB_LIBS=`$GPGME_CONFIG --glib --libs` AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else GPGME_GLIB_CFLAGS="" GPGME_GLIB_LIBS="" AC_MSG_RESULT(no) ifelse([$3], , :, [$3]) fi AC_SUBST(GPGME_GLIB_CFLAGS) AC_SUBST(GPGME_GLIB_LIBS) ]) centerim-4.22.10/Makefile.in0000644000175000001440000007157711473011440012464 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ #AUTOMAKE=@AUTOMAKE@ --add-missing --foreign #ACLOCAL=@ACLOCAL@ -I config VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_MSN_TRUE@am__append_1 = libmsn @BUILD_YAHOO_TRUE@am__append_2 = libyahoo2 @BUILD_FIRETALK_TRUE@am__append_3 = firetalk @BUILD_GADU_TRUE@am__append_4 = libgadu @BUILD_JABBER_TRUE@am__append_5 = libjabber subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure $(top_srcdir)/intl/Makefile.in \ ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS THANKS TODO \ config.guess config.rpath config.sub depcomp install-sh \ ltmain.sh missing mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = intl/Makefile CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = connwrap kkstrtext kksystr kkconsui libicq2000 libmsn \ libyahoo2 firetalk libgadu libjabber intl po misc share src DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(distdir)"; }; } am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ WANTED_PROTOCOLS = $(am__append_1) $(am__append_2) $(am__append_3) \ $(am__append_4) $(am__append_5) SUBDIRS = \ connwrap \ kkstrtext \ kksystr \ kkconsui \ libicq2000 \ $(WANTED_PROTOCOLS) \ intl \ po \ misc \ share \ src EXTRA_DIST = \ config.rpath \ POLICY \ centerim.1 \ FAQ \ NEWS \ TODO \ README \ THANKS \ AUTHORS \ INSTALL \ ABOUT-NLS \ ChangeLog \ COPYING man_MANS = centerim.1 ACLOCAL_AMFLAGS = -I m4 BUILT_SOURCES = $(top_srcdir)/.version all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ --with-included-gettext \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(MANS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ ctags-recursive install install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-hook dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-recursive uninstall uninstall-am uninstall-man \ uninstall-man1 $(top_srcdir)/.version: echo $(VERSION) > $@-t && mv $@-t $@ dist-hook: echo $(VERSION) > $(distdir)/.tarball-version # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/POLICY0000644000175000001440000000725111461606612011335 00000000000000The page is available online at http://thekonst.net/konstware/policy/ The reason you opened this page is probably that you are considering making a donation to one of my free software projects. On this page I will explain what a donation means regarding software I have developed, which you are probably using. I wrote this because of misunderstandings I recently had with some particular users. What a donation IS: 1. An expression of appreciation and gratitude for the work I did in my spare time. This spare time may have been spent earning money working on commercial software, watching TV, playing a computer game or jerking off, but instead I dedicated this time to develop the software you've been using. I made the decision to release it as free software. This may be the reason you are thankful for. 2. Up to you. You do it on your free will. You don't have to donate, but it is nice if you do. Even a small sum multiplied by a large number of users can bring the author some additional comfort just like he did for you by developing this software and releasing it freely. What a donation IS NOT: 1. It is not a guarantee or warranty of any sort. It does not mean I will grant your every wish after you donate. Free software and open source is all about "works for me". One of the reasons I made this software freely available is so that others who have need for the software can use it if it fulfills their needs. I did not release this software so that I could support it like a commercial application. As long as it works for me, and has all the features I need, I am not likely to change it. However, if I feel inspired to hack on the code, or even implement a requested feature, that is my decision. 2. It does not represent an obligation on my part to work on features you request, or to fix bugs you report. Again, I work on this software in my spare time, as I see fit. There are no deadlines or schedules. Please also note that open source means you can modify it on your own. If you have the ability, fix the bugs or implement the feature and send your patch. You may not have enough free time, or the ability to code in C++. This is not my problem. I am a busy man too. What I DO NOT care about: 1. Whether you use this software or not. Free software (and life in general) is about choice. If you don't like it, don't use it. Just because you installed my software on your computer does not necessarily mean that I will celebrate your decision to do so. 2. Your feature requests. This is open source, which means you have the full source code for this program. You can modify, redistribute or even fork another project out of it as long as it is in accordance with the license the software is distributed under. Moreover, I appreciate patches as much as I appreciate the donations. 3. Providing support. Whether or not I answer your messages regarding this software is my own free will. I can simply ignore them for many reasons. Perhaps I do not like what you are asking, or how you are asking it. Maybe I'm in a bad mood and simply don't feel like replying. If you want your problem solved, your best bet would be to post to the mailing list for the program your question is about. You can discuss your problem there with other users who may even be more familiar with the software than myself. What I DO care about: 1. My family, myself, and our collective comfort, health, and happiness. Finally, writing free software is my hobby. As with any hobby, it can be stopped any time, especially if it's no longer fun. There are many other projects and activities much more profitable and rewarding, but for some reason I still maintain the software and make periodic new releases. centerim-4.22.10/install-sh0000755000175000001440000003253711473011436012421 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: centerim-4.22.10/THANKS0000644000175000001440000000233611461606612011325 00000000000000There is a list of people who we want to say thanks for their contributions into the development of CenterIM. Bertram Bourdrez For code contributions. He's the one who implemented collapsable groups. Iulian Ciorascu For the non-blocking SSL connections on Jabber and a bunch of other useful patches. And here are the authors of IM protocols handling code I used. Barnaby Gray ICQ Ian Gulliver AIM and IRC Philip S Tellis the Yahoo! protocol. Mark Rowe MSN Wojtek Kaniewski Robert J. Wony Arkadiusz Mikiewicz Tomasz Chili�ki Piotr Wysocki Dawid Jarosz Gadu-Gadu Norberto Navarro For some hardware related donations to the project. The Jabber Team http://jabber.org/ for their GNU Jabber library. All the donators for their generous contributions. The complete list is here: http://centericq.de/donation/ This is an old list, dated from 2004/06/30 21:17:26. centerim-4.22.10/config.h.in0000644000175000001440000004575711473011435012447 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* build with aim support */ #undef BUILD_AIM /* build with gadu-gadu support */ #undef BUILD_GADU /* build with ICQ support */ #undef BUILD_ICQ /* build with irc support */ #undef BUILD_IRC /* build with jabber support */ #undef BUILD_JABBER /* build the integrated livejournal client */ #undef BUILD_LJ /* build with MSN support */ #undef BUILD_MSN /* build the integrated rss feeds reader */ #undef BUILD_RSS /* build with yahoo support */ #undef BUILD_YAHOO /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define to 1 if you have the header file. */ #undef HAVE_ALGORITHM /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_ARGZ_H /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the `asprintf' function. */ #undef HAVE_ASPRINTF /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define if you have curses.h */ #undef HAVE_CURSES_H /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FEOF_UNLOCKED /* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FGETS_UNLOCKED /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETC_UNLOCKED /* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. */ #undef HAVE_DECL_TZNAME /* Define to 1 if you have the declaration of `_snprintf', and to 0 if you don't. */ #undef HAVE_DECL__SNPRINTF /* Define to 1 if you have the declaration of `_snwprintf', and to 0 if you don't. */ #undef HAVE_DECL__SNWPRINTF /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_EXCEPTION /* Define to 1 if you have the header file. */ #undef HAVE_EXT_HASH_MAP /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* has fribidi library */ #undef HAVE_FRIBIDI /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #undef HAVE_FSEEKO /* Define to 1 if you have the header file. */ #undef HAVE_FSTREAM /* Define to 1 if you have the header file. */ #undef HAVE_FTW_H /* Define to 1 if you have the `fwprintf' function. */ #undef HAVE_FWPRINTF /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `getegid' function. */ #undef HAVE_GETEGID /* Define to 1 if you have the `geteuid' function. */ #undef HAVE_GETEUID /* Define to 1 if you have the `getgid' function. */ #undef HAVE_GETGID /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the `getpass' function. */ #undef HAVE_GETPASS /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `getuid' function. */ #undef HAVE_GETUID /* use gnutls */ #undef HAVE_GNUTLS /* has gpgme library */ #undef HAVE_GPGME /* Define to 1 if you have the header file. */ #undef HAVE_HASH_MAP /* Define if you have the iconv() function. */ #undef HAVE_ICONV /* Define to 1 if you have the `inet_aton' function. */ #undef HAVE_INET_ATON /* Define to 1 if you have the `inet_ntoa' function. */ #undef HAVE_INET_NTOA /* Define if you have the 'intmax_t' type in or . */ #undef HAVE_INTMAX_T /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_INTTYPES_H_WITH_UINTMAX /* Define to 1 if you have the header file. */ #undef HAVE_IOSTREAM /* Define to 1 if you have the header file. */ #undef HAVE_ITERATOR /* Define to 1 if you have the header file. */ #undef HAVE_JPEGLIB_H /* Define if you have and nl_langinfo(CODESET). */ #undef HAVE_LANGINFO_CODESET /* Define to 1 if you have the header file. */ #undef HAVE_LANGINFO_H /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Define to 1 if you have the `crypto' library (-lcrypto). */ #undef HAVE_LIBCRYPTO /* Define to 1 if you have a functional curl library. */ #undef HAVE_LIBCURL /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* define if you have libjpeg */ #undef HAVE_LIBJPEG /* Define to 1 if you have the `nsl' library (-lnsl). */ #undef HAVE_LIBNSL /* define if you have libotr */ #undef HAVE_LIBOTR /* Define to 1 if you have the header file. */ #undef HAVE_LIBOTR_CONTEXT_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBOTR_USERSTATE_H /* Define to 1 if you have the `socket' library (-lsocket). */ #undef HAVE_LIBSOCKET /* Define to 1 if you have the `ssl' library (-lssl). */ #undef HAVE_LIBSSL /* define if you have Xss */ #undef HAVE_LIBXSS /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LIST /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define if you have the 'long double' type. */ #undef HAVE_LONG_DOUBLE /* Define if you have the 'long long' type. */ #undef HAVE_LONG_LONG /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mempcpy' function. */ #undef HAVE_MEMPCPY /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the `munmap' function. */ #undef HAVE_MUNMAP /* Define if you have libncursesw */ #undef HAVE_NCURSESW /* Define if you have ncursesw/cursesw.h */ #undef HAVE_NCURSESW_H /* Define if you have ncurses.h */ #undef HAVE_NCURSES_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_NL_TYPES_H /* use nss_compat */ #undef HAVE_NSS_COMPAT /* use openssl */ #undef HAVE_OPENSSL /* Define if your printf() function supports format strings with positions. */ #undef HAVE_POSIX_PRINTF /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* ssl is available */ #undef HAVE_SSL /* use SSLeay */ #undef HAVE_SSLEAY /* Define to 1 if you have the header file. */ #undef HAVE_SSTREAM /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_STDINT_H_WITH_UINTMAX /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_EXT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `stpcpy' function. */ #undef HAVE_STPCPY /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRING /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_STRSTREAM /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if `tm_zone' is a member of `struct tm'. */ #undef HAVE_STRUCT_TM_TM_ZONE /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MOUNT_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STATVFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_VFS_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* pthread library is available */ #undef HAVE_THREAD /* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use `HAVE_STRUCT_TM_TM_ZONE' instead. */ #undef HAVE_TM_ZONE /* Define to 1 if you have the `tsearch' function. */ #undef HAVE_TSEARCH /* Define to 1 if you don't have `tm_zone' but do have the external array `tzname'. */ #undef HAVE_TZNAME /* Define if you have the 'uintmax_t' type in or . */ #undef HAVE_UINTMAX_T /* check uname function */ #undef HAVE_UNAME /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define if you have the 'unsigned long long' type. */ #undef HAVE_UNSIGNED_LONG_LONG /* Define to 1 if you have the header file. */ #undef HAVE_UTILITY /* Define to 1 if you have the header file. */ #undef HAVE_UTMP_H /* Define to 1 if you have the header file. */ #undef HAVE_VECTOR /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define if you have the 'wchar_t' type. */ #undef HAVE_WCHAR_T /* Define to 1 if you have the `wcslen' function. */ #undef HAVE_WCSLEN /* Define if you have the 'wint_t' type. */ #undef HAVE_WINT_T /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if you have the <_G_config.h> header file. */ #undef HAVE__G_CONFIG_H /* Define to 1 if you have the `__argz_count' function. */ #undef HAVE___ARGZ_COUNT /* Define to 1 if you have the `__argz_next' function. */ #undef HAVE___ARGZ_NEXT /* Define to 1 if you have the `__argz_stringify' function. */ #undef HAVE___ARGZ_STRINGIFY /* Define to 1 if you have the `__fsetlocking' function. */ #undef HAVE___FSETLOCKING /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST /* Define if integer division by zero raises signal SIGFPE. */ #undef INTDIV0_RAISES_SIGFPE /* use fribidi in ktools */ #undef KTOOL_USE_FRIBIDI /* Defined if libcurl supports AsynchDNS */ #undef LIBCURL_FEATURE_ASYNCHDNS /* Defined if libcurl supports IDN */ #undef LIBCURL_FEATURE_IDN /* Defined if libcurl supports IPv6 */ #undef LIBCURL_FEATURE_IPV6 /* Defined if libcurl supports KRB4 */ #undef LIBCURL_FEATURE_KRB4 /* Defined if libcurl supports libz */ #undef LIBCURL_FEATURE_LIBZ /* Defined if libcurl supports NTLM */ #undef LIBCURL_FEATURE_NTLM /* Defined if libcurl supports SSL */ #undef LIBCURL_FEATURE_SSL /* Defined if libcurl supports SSPI */ #undef LIBCURL_FEATURE_SSPI /* Defined if libcurl supports DICT */ #undef LIBCURL_PROTOCOL_DICT /* Defined if libcurl supports FILE */ #undef LIBCURL_PROTOCOL_FILE /* Defined if libcurl supports FTP */ #undef LIBCURL_PROTOCOL_FTP /* Defined if libcurl supports FTPS */ #undef LIBCURL_PROTOCOL_FTPS /* Defined if libcurl supports HTTP */ #undef LIBCURL_PROTOCOL_HTTP /* Defined if libcurl supports HTTPS */ #undef LIBCURL_PROTOCOL_HTTPS /* Defined if libcurl supports LDAP */ #undef LIBCURL_PROTOCOL_LDAP /* Defined if libcurl supports TELNET */ #undef LIBCURL_PROTOCOL_TELNET /* Defined if libcurl supports TFTP */ #undef LIBCURL_PROTOCOL_TFTP /* enables workaround for broken locales */ #undef LOCALES_HACK /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define if exists and defines unusable PRI* macros. */ #undef PRI_MACROS_BROKEN /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* Define as the maximum value of type 'size_t', if the system doesn't define it. */ #undef SIZE_MAX /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #undef _LARGEFILE_SOURCE /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define curl_free() as free() if our version of curl lacks curl_free. */ #undef curl_free /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `long int' if does not define. */ #undef off_t /* Define as the type of the result of subtracting two pointers, if the system doesn't define it. */ #undef ptrdiff_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif /* Define to empty if the C compiler doesn't support this keyword. */ #undef signed /* Define to `unsigned int' if does not define. */ #undef size_t /* Define type of socklen_t for systems missing it */ #undef socklen_t /* Define to unsigned long or unsigned long long if and don't define. */ #undef uintmax_t /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile centerim-4.22.10/ltmain.sh0000755000175000001440000105017111473011431012226 00000000000000 # libtool (GNU libtool) 2.4 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4 TIMESTAMP="" package_revision=1.3293 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${EGREP="grep -E"} : ${FGREP="grep -F"} : ${GREP="grep"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SED="sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=: for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -e 's/\([\\"]\)/\\\1/g' \ -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_apped perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 centerim-4.22.10/connwrap/0000755000175000001440000000000011473011455012313 500000000000000centerim-4.22.10/connwrap/connwrap.c0000644000175000001440000002674311473007750014245 00000000000000#include "connwrap.h" #include #include #include #include #include #include #include #include #include #include #include #define PROXY_TIMEOUT 10 // HTTP proxy timeout in seconds (for the CONNECT method) #ifdef HAVE_OPENSSL #define OPENSSL_NO_KRB5 1 #include #include #elif HAVE_GNUTLS #include #elif HAVE_NSS_COMPAT #include #endif static int in_http_connect = 0; #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) static SSL_CTX *ctx = NULL; typedef struct { int fd; SSL *ssl; } sslsock; #elif HAVE_GNUTLS typedef struct { int fd; gnutls_session_t session; } sslsock; #endif #ifdef HAVE_SSL static sslsock *socks = 0; static int sockcount = 0; static sslsock *getsock(int fd) { int i; for(i = 0; i < sockcount; i++) if(socks[i].fd == fd) return &socks[i]; return 0; } static sslsock *addsock(int fd) { sslsock *p; #ifdef HAVE_GNUTLS gnutls_certificate_credentials_t xcred; #endif if (socks) socks = (sslsock *) realloc(socks, sizeof(sslsock)*++sockcount); else socks = (sslsock *) malloc(sizeof(sslsock)*++sockcount); p = &socks[sockcount-1]; #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if(!ctx) { SSL_library_init(); SSL_load_error_strings(); #ifdef HAVE_SSLEAY SSLeay_add_all_algorithms(); #elif HAVE_OPENSSL OpenSSL_add_all_algorithms(); #endif ctx = SSL_CTX_new(SSLv23_client_method()); } p->ssl = SSL_new(ctx); SSL_set_fd(p->ssl, p->fd = fd); #elif defined(HAVE_GNUTLS) gnutls_global_init (); gnutls_certificate_allocate_credentials (&xcred); gnutls_init (&(p->session), GNUTLS_CLIENT); gnutls_set_default_priority (p->session); gnutls_credentials_set (p->session, GNUTLS_CRD_CERTIFICATE, xcred); p->fd = fd; gnutls_transport_set_ptr(p->session,(gnutls_transport_ptr_t)fd); #endif return p; } static void delsock(int fd) { int i, nsockcount; sslsock *nsocks; if (sockcount > 0) { nsockcount = 0; for(i = 0; i < sockcount; i++) { if(socks[i].fd != fd) { socks[nsockcount++] = socks[i]; } #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) else { SSL_free(socks[i].ssl); } #elif HAVE_GNUTLS else { gnutls_bye( socks[i].session, GNUTLS_SHUT_WR); gnutls_deinit(socks[i].session); } #endif } socks = realloc(socks, sizeof(sslsock)*(nsockcount)); sockcount = nsockcount; } } #endif static char *bindaddr = 0, *proxyhost = 0, *proxyuser = 0, *proxypass = 0; static int proxyport = 3128; static int proxy_ssl = 0; #define SOCKOUT(s) write(sockfd, s, strlen(s)) int cw_http_connect(int sockfd, const struct sockaddr *serv_addr, int addrlen) { int err, pos, fl; struct hostent *server; struct sockaddr_in paddr; char buf[512]; fd_set rfds; err = 0; in_http_connect = 1; if(!(server = gethostbyname(proxyhost))) { errno = h_errno; err = -1; } if(!err) { memset(&paddr, 0, sizeof(paddr)); paddr.sin_family = AF_INET; memcpy(&paddr.sin_addr.s_addr, *server->h_addr_list, server->h_length); paddr.sin_port = htons(proxyport); fl = fcntl(sockfd, F_GETFL); fcntl(sockfd, F_SETFL, fl & ~O_NONBLOCK); buf[0] = 0; err = cw_connect(sockfd, (struct sockaddr *) &paddr, sizeof(paddr), proxy_ssl); } errno = ECONNREFUSED; if(!err) { struct sockaddr_in *sin = (struct sockaddr_in *) serv_addr; char *ip = inet_ntoa(sin->sin_addr), c; struct timeval tv; sprintf(buf, "%d", ntohs(sin->sin_port)); SOCKOUT("CONNECT "); SOCKOUT(ip); SOCKOUT(":"); SOCKOUT(buf); SOCKOUT(" HTTP/1.0\r\n"); if(proxyuser) { char *b; SOCKOUT("Proxy-Authorization: Basic "); sprintf(buf, "%s:%s", proxyuser, proxypass); b = cw_base64_encode(buf); SOCKOUT(b); free(b); SOCKOUT("\r\n"); } SOCKOUT("\r\n"); buf[0] = 0; while(err != -1) { FD_ZERO(&rfds); FD_SET(sockfd, &rfds); tv.tv_sec = PROXY_TIMEOUT; tv.tv_usec = 0; err = select(sockfd+1, &rfds, 0, 0, &tv); if(err < 1) err = -1; if(err != -1 && FD_ISSET(sockfd, &rfds)) { err = read(sockfd, &c, 1); if(!err) err = -1; if(err != -1) { pos = strlen(buf); buf[pos] = c; buf[pos+1] = 0; if(strlen(buf) > 4) if(!strcmp(buf+strlen(buf)-4, "\r\n\r\n")) break; } } } } if(err != -1 && strlen(buf)) { char *p = strstr(buf, " "); err = -1; if(p) if(atoi(++p) == 200) err = 0; fcntl(sockfd, F_SETFL, fl); if(fl & O_NONBLOCK) { errno = EINPROGRESS; err = -1; } } in_http_connect = 0; return err; } int cw_connect(int sockfd, const struct sockaddr *serv_addr, int addrlen, int ssl) { int rc; struct sockaddr_in ba; if(bindaddr) if(strlen(bindaddr)) { #ifdef HAVE_INET_ATON struct in_addr addr; rc = inet_aton(bindaddr, &addr); ba.sin_addr.s_addr = addr.s_addr; #else rc = inet_pton(AF_INET, bindaddr, &ba); #endif if(rc) { ba.sin_port = 0; rc = bind(sockfd, (struct sockaddr *) &ba, sizeof(ba)); if ((rc==-1) && (errno == EINVAL)) rc=0; } else { rc = -1; } if(rc) return rc; } if(proxyhost && !in_http_connect) { rc = cw_http_connect(sockfd, serv_addr, addrlen); } else{ rc = connect(sockfd, serv_addr, addrlen); } #ifdef HAVE_SSL if(ssl && !rc) { sslsock *p = addsock(sockfd); #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if(SSL_connect(p->ssl) != 1){ //fprintf(stderr, "cw_connect(%d) - cannot connect to SSL\n", sockfd); return -1; } #elif defined(HAVE_GNUTLS) int ret; do { ret = gnutls_handshake(p->session); } while ((ret == GNUTLS_E_AGAIN) || (ret == GNUTLS_E_INTERRUPTED)); if (ret < 0) { gnutls_perror (ret); return -1; } #endif } #endif return rc; } int cw_nb_connect(int sockfd, const struct sockaddr *serv_addr, int addrlen, int ssl, int *state) { int rc = 0; int ret; struct sockaddr_in ba; if(bindaddr) if(strlen(bindaddr)) { #ifdef HAVE_INET_ATON struct in_addr addr; rc = inet_aton(bindaddr, &addr); ba.sin_addr.s_addr = addr.s_addr; #else rc = inet_pton(AF_INET, bindaddr, &ba); #endif if(rc) { ba.sin_port = 0; rc = bind(sockfd, (struct sockaddr *) &ba, sizeof(ba)); if ((rc==-1) && (errno == EINVAL)) rc=0; } else { rc = -1; } if(rc) return rc; } #ifdef HAVE_SSL if(ssl) { if ( !(*state & CW_CONNECT_WANT_SOMETHING)){ rc = cw_connect(sockfd, serv_addr, addrlen, 0); } else{ /* check if the socket is connected correctly */ int optlen = sizeof(int), optval; if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &optval, &optlen) || optval){ /* Look for a better solution to print errors */ //fprintf(stderr,"cw_nb_connect(%d): getsockopt error!!\n", sockfd); return -1; } } if(!rc) { sslsock *p; if (*state & CW_CONNECT_SSL) p = getsock(sockfd); else p = addsock(sockfd); #ifdef HAVE_GNUTLS ret = gnutls_handshake(p->session); switch (ret) { case GNUTLS_E_SUCCESS: *state = 0; return 0; case GNUTLS_E_INTERRUPTED: case GNUTLS_E_AGAIN: if (gnutls_record_get_direction(p->session)) { *state = CW_CONNECT_SSL | CW_CONNECT_WANT_READ; } else { *state = CW_CONNECT_SSL | CW_CONNECT_WANT_WRITE; } return 0; default: /* gnutls_deinit(p->session); will be dealt with in delsock() */ gnutls_perror (ret); return -1; } #elif defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) rc = SSL_connect(p->ssl); switch(rc){ case 1: *state = 0; return 0; case 0: return -1; default: switch (SSL_get_error(p->ssl, rc)){ case SSL_ERROR_WANT_READ: *state = CW_CONNECT_SSL | CW_CONNECT_WANT_READ; return 0; case SSL_ERROR_WANT_WRITE: *state = CW_CONNECT_SSL | CW_CONNECT_WANT_WRITE; return 0; default: return -1; } } #endif } else { // catch EINPROGRESS error from the connect call if (errno == EINPROGRESS){ *state = CW_CONNECT_STARTED | CW_CONNECT_WANT_WRITE; return 0; } } return rc; } #endif if ( !(*state & CW_CONNECT_WANT_SOMETHING)){ rc = connect(sockfd, serv_addr, addrlen); } else{ /* check if the socket is connected correctly */ int optlen = sizeof(int), optval; if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &optval, &optlen) || optval) { //fprintf(stderr,"getsockopt error!!"); return -1; } *state = 0; return 0; } if (rc) if (errno == EINPROGRESS){ *state = CW_CONNECT_STARTED | CW_CONNECT_WANT_WRITE; return 0; } return rc; } int cw_accept(int s, struct sockaddr *addr, int *addrlen, int ssl) { #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) int rc; if(ssl) { rc = accept(s, addr, addrlen); if(!rc) { sslsock *p = addsock(s); if(SSL_accept(p->ssl) != 1) return -1; } return rc; } #endif return accept(s, addr, addrlen); } int cw_write(int fd, const void *buf, int count, int ssl) { #ifdef HAVE_SSL sslsock *p; int ret; if(ssl) #endif #ifdef HAVE_GNUTLS if(p = getsock(fd)){ ret = gnutls_record_send( p->session, buf, count); return ret; } #elif defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if(p = getsock(fd)) return SSL_write(p->ssl, buf, count); #endif return write(fd, buf, count); } int cw_read(int fd, void *buf, int count, int ssl) { #ifdef HAVE_SSL sslsock *p; int ret; if(ssl) #endif #ifdef HAVE_GNUTLS if(p = getsock(fd)){ do { ret = gnutls_record_recv(p->session, buf, count); } while ( ret < 0 && (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) ); return ret; } #elif defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if(p = getsock(fd)) return SSL_read(p->ssl, buf, count); #endif return read(fd, buf, count); } int cw_close(int fd) { #ifdef HAVE_SSL delsock(fd); #endif return close(fd); } #define FREEVAR(v) if(v) free(v), v = 0; void cw_setbind(const char *abindaddr) { FREEVAR(bindaddr); bindaddr = strdup(abindaddr); } void cw_setproxy(const char *aproxyhost, int aproxyport, const char *aproxyuser, const char *aproxypass) { FREEVAR(proxyhost); FREEVAR(proxyuser); FREEVAR(proxypass); if(aproxyhost && strlen(aproxyhost)) proxyhost = strdup(aproxyhost); if(aproxyuser && strlen(aproxyuser)) proxyuser = strdup(aproxyuser); if(aproxypass && strlen(aproxypass)) proxypass = strdup(aproxypass); proxyport = aproxyport; } char *cw_base64_encode(const char *in) { static char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._"; int j = 0; int inlen = strlen(in); char *out = (char *) malloc(inlen*4+1), c; for(out[0] = 0; inlen >= 3; inlen -= 3) { strncat(out, &base64digits[ in[j] >> 2 ], 1); strncat(out, &base64digits[ ((in[j] << 4) & 0x30) | (in[j+1] >> 4) ], 1); strncat(out, &base64digits[ ((in[j+1] << 2) & 0x3c) | (in[j+2] >> 6) ], 1); strncat(out, &base64digits[ in[j+2] & 0x3f ], 1); j += 3; } if(inlen > 0) { unsigned char fragment; strncat(out, &base64digits[in[j] >> 2], 1); fragment = (in[j] << 4) & 0x30; if(inlen > 1) fragment |= in[j+1] >> 4; strncat(out, &base64digits[fragment], 1); c = (inlen < 2) ? '-' : base64digits[ (in[j+1] << 2) & 0x3c ]; strncat(out, &c, 1); c = '-'; strncat(out, &c, 1); } return out; } centerim-4.22.10/connwrap/md5.c0000644000175000001440000003022211461606612013065 00000000000000/* Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. 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. L. Peter Deutsch ghost@aladdin.com */ /* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.c is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order either statically or dynamically; added missing #include in library. 2002-03-11 lpd Corrected argument list for main(), and added int return type, in test program and T value program. 2002-02-21 lpd Added missing #include in test program. 2000-07-03 lpd Patched to eliminate warnings about "constant is unsigned in ANSI C, signed in traditional"; made test program self-checking. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). 1999-05-03 lpd Original version. */ #include "md5.h" #include #undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ #ifdef ARCH_IS_BIG_ENDIAN # define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) #else # define BYTE_ORDER 0 #endif #define T_MASK ((md5_word_t)~0) #define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) #define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) #define T3 0x242070db #define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) #define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) #define T6 0x4787c62a #define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) #define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) #define T9 0x698098d8 #define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) #define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) #define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) #define T13 0x6b901122 #define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) #define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) #define T16 0x49b40821 #define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) #define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) #define T19 0x265e5a51 #define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) #define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) #define T22 0x02441453 #define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) #define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) #define T25 0x21e1cde6 #define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) #define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) #define T28 0x455a14ed #define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) #define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) #define T31 0x676f02d9 #define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) #define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) #define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) #define T35 0x6d9d6122 #define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) #define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) #define T38 0x4bdecfa9 #define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) #define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) #define T41 0x289b7ec6 #define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) #define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) #define T44 0x04881d05 #define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) #define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) #define T47 0x1fa27cf8 #define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) #define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) #define T50 0x432aff97 #define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) #define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) #define T53 0x655b59c3 #define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) #define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) #define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) #define T57 0x6fa87e4f #define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) #define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) #define T60 0x4e0811a1 #define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) #define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) #define T63 0x2ad7d2bb #define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) static void md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) { md5_word_t a = pms->abcd[0], b = pms->abcd[1], c = pms->abcd[2], d = pms->abcd[3]; md5_word_t t; #if BYTE_ORDER > 0 /* Define storage only for big-endian CPUs. */ md5_word_t X[16]; #else /* Define storage for little-endian or both types of CPUs. */ md5_word_t xbuf[16]; const md5_word_t *X; #endif { #if BYTE_ORDER == 0 /* * Determine dynamically whether this is a big-endian or * little-endian machine, since we can use a more efficient * algorithm on the latter. */ static const int w = 1; if (*((const md5_byte_t *)&w)) /* dynamic little-endian */ #endif #if BYTE_ORDER <= 0 /* little-endian */ { /* * On little-endian machines, we can process properly aligned * data without copying it. */ if (!((data - (const md5_byte_t *)0) & 3)) { /* data are properly aligned */ X = (const md5_word_t *)data; } else { /* not aligned */ memcpy(xbuf, data, 64); X = xbuf; } } #endif #if BYTE_ORDER == 0 else /* dynamic big-endian */ #endif #if BYTE_ORDER >= 0 /* big-endian */ { /* * On big-endian machines, we must arrange the bytes in the * right order. */ const md5_byte_t *xp = data; int i; # if BYTE_ORDER == 0 X = xbuf; /* (dynamic only) */ # else # define xbuf X /* (static only) */ # endif for (i = 0; i < 16; ++i, xp += 4) xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); } #endif } #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) /* Round 1. */ /* Let [abcd k s i] denote the operation a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + F(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 7, T1); SET(d, a, b, c, 1, 12, T2); SET(c, d, a, b, 2, 17, T3); SET(b, c, d, a, 3, 22, T4); SET(a, b, c, d, 4, 7, T5); SET(d, a, b, c, 5, 12, T6); SET(c, d, a, b, 6, 17, T7); SET(b, c, d, a, 7, 22, T8); SET(a, b, c, d, 8, 7, T9); SET(d, a, b, c, 9, 12, T10); SET(c, d, a, b, 10, 17, T11); SET(b, c, d, a, 11, 22, T12); SET(a, b, c, d, 12, 7, T13); SET(d, a, b, c, 13, 12, T14); SET(c, d, a, b, 14, 17, T15); SET(b, c, d, a, 15, 22, T16); #undef SET /* Round 2. */ /* Let [abcd k s i] denote the operation a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + G(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 1, 5, T17); SET(d, a, b, c, 6, 9, T18); SET(c, d, a, b, 11, 14, T19); SET(b, c, d, a, 0, 20, T20); SET(a, b, c, d, 5, 5, T21); SET(d, a, b, c, 10, 9, T22); SET(c, d, a, b, 15, 14, T23); SET(b, c, d, a, 4, 20, T24); SET(a, b, c, d, 9, 5, T25); SET(d, a, b, c, 14, 9, T26); SET(c, d, a, b, 3, 14, T27); SET(b, c, d, a, 8, 20, T28); SET(a, b, c, d, 13, 5, T29); SET(d, a, b, c, 2, 9, T30); SET(c, d, a, b, 7, 14, T31); SET(b, c, d, a, 12, 20, T32); #undef SET /* Round 3. */ /* Let [abcd k s t] denote the operation a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ #define H(x, y, z) ((x) ^ (y) ^ (z)) #define SET(a, b, c, d, k, s, Ti)\ t = a + H(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 5, 4, T33); SET(d, a, b, c, 8, 11, T34); SET(c, d, a, b, 11, 16, T35); SET(b, c, d, a, 14, 23, T36); SET(a, b, c, d, 1, 4, T37); SET(d, a, b, c, 4, 11, T38); SET(c, d, a, b, 7, 16, T39); SET(b, c, d, a, 10, 23, T40); SET(a, b, c, d, 13, 4, T41); SET(d, a, b, c, 0, 11, T42); SET(c, d, a, b, 3, 16, T43); SET(b, c, d, a, 6, 23, T44); SET(a, b, c, d, 9, 4, T45); SET(d, a, b, c, 12, 11, T46); SET(c, d, a, b, 15, 16, T47); SET(b, c, d, a, 2, 23, T48); #undef SET /* Round 4. */ /* Let [abcd k s t] denote the operation a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ #define I(x, y, z) ((y) ^ ((x) | ~(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + I(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 6, T49); SET(d, a, b, c, 7, 10, T50); SET(c, d, a, b, 14, 15, T51); SET(b, c, d, a, 5, 21, T52); SET(a, b, c, d, 12, 6, T53); SET(d, a, b, c, 3, 10, T54); SET(c, d, a, b, 10, 15, T55); SET(b, c, d, a, 1, 21, T56); SET(a, b, c, d, 8, 6, T57); SET(d, a, b, c, 15, 10, T58); SET(c, d, a, b, 6, 15, T59); SET(b, c, d, a, 13, 21, T60); SET(a, b, c, d, 4, 6, T61); SET(d, a, b, c, 11, 10, T62); SET(c, d, a, b, 2, 15, T63); SET(b, c, d, a, 9, 21, T64); #undef SET /* Then perform the following additions. (That is increment each of the four registers by the value it had before this block was started.) */ pms->abcd[0] += a; pms->abcd[1] += b; pms->abcd[2] += c; pms->abcd[3] += d; } void md5_init(md5_state_t *pms) { pms->count[0] = pms->count[1] = 0; pms->abcd[0] = 0x67452301; pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; pms->abcd[3] = 0x10325476; } void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) { const md5_byte_t *p = data; int left = nbytes; int offset = (pms->count[0] >> 3) & 63; md5_word_t nbits = (md5_word_t)(nbytes << 3); if (nbytes <= 0) return; /* Update the message length. */ pms->count[1] += nbytes >> 29; pms->count[0] += nbits; if (pms->count[0] < nbits) pms->count[1]++; /* Process an initial partial block. */ if (offset) { int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); memcpy(pms->buf + offset, p, copy); if (offset + copy < 64) return; p += copy; left -= copy; md5_process(pms, pms->buf); } /* Process full blocks. */ for (; left >= 64; p += 64, left -= 64) md5_process(pms, p); /* Process a final partial block. */ if (left) memcpy(pms->buf, p, left); } void md5_finish(md5_state_t *pms, md5_byte_t digest[16]) { static const md5_byte_t pad[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; md5_byte_t data[8]; int i; /* Save the length before padding. */ for (i = 0; i < 8; ++i) data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); /* Pad to 56 bytes mod 64. */ md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); /* Append the length. */ md5_append(pms, data, 8); for (i = 0; i < 16; ++i) digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); } centerim-4.22.10/connwrap/connwrap.h0000644000175000001440000000224111461606612014234 00000000000000#ifndef __CONNWRAP_H__ #define __CONNWRAP_H__ #ifdef __cplusplus extern "C" { #endif #include #include int cw_connect(int sockfd, const struct sockaddr *serv_addr, int addrlen, int ssl); #define CW_CONNECT_STARTED 0x1 #define CW_CONNECT_SSL 0x2 #define CW_CONNECT_WANT_READ 0x4 #define CW_CONNECT_WANT_WRITE 0x8 #define CW_CONNECT_WANT_SOMETHING 0xC #define CW_CONNECT_BLOCKING 0x10 /* non-blocking socket state should be initialized with 0, subsequent calls should keep the modified state (state is a bitwise OR between CW_CONNECT_XXX) returns 0 for OK, or if it wants subsequent calls -1 for a fatal error */ int cw_nb_connect(int sockfd, const struct sockaddr *serv_addr, int addrlen, int ssl, int *state); int cw_accept(int s, struct sockaddr *addr, int *addrlen, int ssl); int cw_write(int fd, const void *buf, int count, int ssl); int cw_read(int fd, void *buf, int count, int ssl); int cw_close(int fd); void cw_setproxy(const char *aproxyhost, int aproxyport, const char *aproxyuser, const char *aproxypass); void cw_setbind(const char *abindaddr); char *cw_base64_encode(const char *in); #ifdef __cplusplus } #endif #endif centerim-4.22.10/connwrap/Makefile.in0000644000175000001440000003610711473011437014307 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = connwrap DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libconnwrap_a_AR = $(AR) $(ARFLAGS) libconnwrap_a_LIBADD = am_libconnwrap_a_OBJECTS = connwrap.$(OBJEXT) md5.$(OBJEXT) libconnwrap_a_OBJECTS = $(am_libconnwrap_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libconnwrap_a_SOURCES) DIST_SOURCES = $(libconnwrap_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libconnwrap.a libconnwrap_a_SOURCES = connwrap.c md5.c noinst_HEADERS = connwrap.h md5.h all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu connwrap/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu connwrap/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libconnwrap.a: $(libconnwrap_a_OBJECTS) $(libconnwrap_a_DEPENDENCIES) -rm -f libconnwrap.a $(libconnwrap_a_AR) libconnwrap.a $(libconnwrap_a_OBJECTS) $(libconnwrap_a_LIBADD) $(RANLIB) libconnwrap.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connwrap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/connwrap/Makefile.am0000644000175000001440000000016611461606612014274 00000000000000noinst_LIBRARIES = libconnwrap.a libconnwrap_a_SOURCES = connwrap.c md5.c noinst_HEADERS = connwrap.h md5.h centerim-4.22.10/connwrap/md5.h0000644000175000001440000000650011461606612013074 00000000000000/* Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. 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. L. Peter Deutsch ghost@aladdin.com */ /* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.h is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Removed support for non-ANSI compilers; removed references to Ghostscript; clarified derivation from RFC 1321; now handles byte order either statically or dynamically. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); added conditionalization for C++ compilation from Martin Purschke . 1999-05-03 lpd Original version. */ #ifndef md5_INCLUDED # define md5_INCLUDED /* * This package supports both compile-time and run-time determination of CPU * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is * defined as non-zero, the code will be compiled to run only on big-endian * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to * run on either big- or little-endian CPUs, but will run slightly less * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. */ typedef unsigned char md5_byte_t; /* 8-bit byte */ typedef unsigned int md5_word_t; /* 32-bit word */ /* Define the state of the MD5 Algorithm. */ typedef struct md5_state_s { md5_word_t count[2]; /* message length in bits, lsw first */ md5_word_t abcd[4]; /* digest buffer */ md5_byte_t buf[64]; /* accumulate block */ } md5_state_t; #ifdef __cplusplus extern "C" { #endif /* Initialize the algorithm. */ void md5_init(md5_state_t *pms); /* Append a string to the message. */ void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); /* Finish the message and return the digest. */ void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); #ifdef __cplusplus } /* end extern "C" */ #endif #endif /* md5_INCLUDED */ centerim-4.22.10/COPYING0000644000175000001440000004307011461606612011445 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. centerim-4.22.10/FAQ0000644000175000001440000001470211461606612010744 00000000000000/* * * The CenterIM FAQ (frequently asked questions) * originally by Konstantin Klyagin * currently maintained by the CenterIM community. * read the up-to-date version at http://www.centerim.org/index.php/FAQ * */ /* *** */ Q: What about implementing such a neat feature in centerim? A: Hey, centerim is GPL and opensource, so feel free to contribute. Don't wait for the maintainers to implement it, just do it yourself and send a patch. /* *** */ Q: Can't build it under FreeBSD.. A: Use gmake instead of make /* *** */ Q: (by Paonia Ezrine, paonia@home.welcomehome.org) When I run centerim in a xterm or from the console it is fine but when I run it in a gnome terminal windows the screen does not update correctly. Specificly the right side of the screen does not get cleared after I send a message or other similar events. A: (by Jakub Travnik, j.travnik@sh.cvut.cz) It happens only with the gnome-terminal. centerim works fine on linux-console and eterm (enlightenment) so it is problem with gnome-terminal. It does not support all xterm sequences. /usr/share/terminfo/g/gnome file could correct that (gnome users should have it), so that ncurses will not use such a extended sequences for gnome-terminal. Workaround: For me it worked setting TERM variable to gnome and then running centerim without problems. (gnome-terminal) $ export TERM=gnome $ centerim and it is ok /* *** */ Q: How do I authorize someone's request with centerim? A: You'll see as soon as someone requests it. /* *** */ Q: I can't use Ctrl-O to view history and Ctrl-Y to delete a line under FreeBSD A: Execute the following before starting centerim: stty dsusp undef stty discard undef /* *** */ Q: I can't get out from a dialog or a menu. When I press ESC, nothing happens. A: Have you ever used mc (Midnight commander)? It requires users to press ESC twice to close a dialog, menu, etc. It's not a problem, but just a terminal specific issue. /* *** */ Q: How do I enable logging the protocol info, etc? A: Run centerim with --debug flag. /* *** */ Q: CenterIM compiles way too slow on my box. What's wrong? A: C++ compiler optimization being a rather slow thing is on by default. To turn it off, do the following. [konst@morgue]$ CXXFLAGS=-O0 ./configure && make /* *** */ Q: From: jeff covey if i understand the faq correctly, centerim makes esc into escesc because some terminals don't map esc properly. could the use of esc or escesc be made a configuration choice? for me, hitting escape twice is reallyreally annoyingannoying, especially if i'm two menus in, and to get out, i have to hit escape four times in a rowrowrowrow. A: From: lanzz@lanzz.org it's a limitation of the console. keys like f1..f12, the arrows, etc, generate sequences of characters starting with esc. if the application was to handle esc as cancel unconditionally, you'll have arrows cancelling your dialogs. so the app must do one of these things to avoid that: 1. require esc-esc instead of single esc, as that disambiguates it from the function keys 2. have a certain timeout and accepting the esc as a cancel only if there wasn't a function sequence after the esc during the timeout 3. switch keyboard to raw or medium-raw mode and do keycode mapping internally as 2. is annoying and sluggish (at least to me) and 3. is too much work for too little gain, i think the current situation with double esc is the best choice. centerim was using timeout esc in the past (i think it's the default way ncurses handles esc) and at least i'm happy with the change :) perhaps there could be a configurable choice between double-esc and timeout, if that doesn't complicate the input routines too much. /* *** */ Q: From: staale@lorentzen.org > + [icq] connecting to the server > + [icq] disconnected, turboing > Msn works fine. > I've tried different icq-servers, with no luck. Anyone with a > clue to what this can be? A: It means exactly "turboing". You're loggin in and out too fast, so that the server turns on DoS attack protection. All you can do is to try again in half an hour. /* *** */ Q: WTF?! My centerim binary is more than 20Mb. SOS! HELP! Virus? Aliens? A: There are three steps you need to take. 1. Look at other applications written in C++ compiled in your system. 2. Read the install(1) and strip(1) man-pages. 3. Type "strip -s centerim; ls -l centerim" /* *** */ Q: I need a program for sending messages on IM networks from the command line. Is it possible to write a program that would use the centerim libraries, or maybe there is a special batch mode in the program? A: Batch mode like you described is not possible to be implemented, because due to frequent logons followed by disconnections the servers will turn on their DoS attacks protection. So there is the only decent way which consists in sending messages in batch mode through an already running centerim instance. If you want to run it like a "daemon", use screen(1). More details on the batch mode usage can be found in the README, chapter 9.2. /* *** */ Q: ICQ new UINs registration doesn't work! It just sends a request and then after 30 seconds reports a timeout. A: It does work. Though, the ICQ server doesn't report the "password is too simple" situaion. Try to enter another one, more complicated. Also, as far as I know, "xxx123" is complicated enough to be accepted by the server software. /* *** */ Q: What about storing passwords in some kind of an encrypted mode in the config file? A: It doesn't make much sense, because in many cases they're transferred unencrypted. And also the program must first decrypt them before sending, so the one who really wants to find out them anyway will make it quite easily. But if you still think that such a crypting will help, please consult homepage of the program which was made especially for ones like you: http://thekonst.net/en/kripp/ /* *** */ Q: When $HOME/.centerim/config gets created, you should set it mode 0600 so only the user can read it. It contains passwords in clear text which other users on a system could read. A: Your filesystem permissions knowledge is very sound, but please just try to access the config file before making any affirmations. You'll see that the .centerim directiory permissions do not allow others to read your configuration data. centerim-4.22.10/Makefile.am0000644000175000001440000000211111461606612012435 00000000000000#AUTOMAKE=@AUTOMAKE@ --add-missing --foreign #ACLOCAL=@ACLOCAL@ -I config WANTED_PROTOCOLS = if BUILD_MSN WANTED_PROTOCOLS += libmsn endif if BUILD_YAHOO WANTED_PROTOCOLS += libyahoo2 endif if BUILD_FIRETALK WANTED_PROTOCOLS += firetalk endif if BUILD_GADU WANTED_PROTOCOLS += libgadu endif if BUILD_JABBER WANTED_PROTOCOLS += libjabber endif SUBDIRS = \ connwrap \ kkstrtext \ kksystr \ kkconsui \ libicq2000 \ $(WANTED_PROTOCOLS) \ intl \ po \ misc \ share \ src EXTRA_DIST = \ config.rpath \ POLICY \ centerim.1 \ FAQ \ NEWS \ TODO \ README \ THANKS \ AUTHORS \ INSTALL \ ABOUT-NLS \ ChangeLog \ COPYING man_MANS = centerim.1 ACLOCAL_AMFLAGS = -I m4 BUILT_SOURCES = $(top_srcdir)/.version $(top_srcdir)/.version: echo $(VERSION) > $@-t && mv $@-t $@ dist-hook: echo $(VERSION) > $(distdir)/.tarball-version centerim-4.22.10/config.sub0000755000175000001440000010450011473011436012366 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. timestamp='2010-05-21' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx | dvp \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile-* | tilegx-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsEE* | ee | ps2) basic_machine=mips64r5900el-scei case $os in -linux*) ;; *) os=-elf ;; esac ;; iop) basic_machine=mipsel-scei os=-irx ;; dvp) basic_machine=dvp-scei os=-elf ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; # This must be matched before tile*. tilegx*) basic_machine=tilegx-unknown os=-linux-gnu ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -irx* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: centerim-4.22.10/ChangeLog0000644000175000001440000035164311473007750012175 000000000000002010-10-26 Roger Disable standard printf() redefinition in yahoo_util.h Should fix #165 2010-10-23 Boris Petersen Fix for CVE-2009-3720 in libjabber's xml parser 2010-10-19 Roger Updated po files Merge branch 'mob' of git+ssh://repo.or.cz:22/srv/git/centerim into mob Yahoo - disable conference and file transfer support (it doesn't work anyway) Propper authorization and buzz events 2010-10-19 Boris Petersen updated po files 2010-10-19 Roger Yahoo - add buddy authentication 2010-10-11 Roger Add missing initialization to get rid of some valgrind warnings 2010-10-07 Boris Petersen updated po files 2010-10-07 Roger Yahoo - implement missing callback stubs 2010-10-05 Boris Petersen updated po files 2010-10-05 Roger Yahoo - implement missing callbacks 2010-10-04 Roger fix GNUTLS connection 2010-10-02 Roger connwrap - initialize gnutls session in cw_connect connwrap - don't deinit gnutls session in cw_nb_connect on error, it's done in delsock 2010-09-16 Roger Add missing sources to libyahoo2 makefile 2010-09-16 Boris Petersen updated po files ignore .version file 2010-09-16 Roger Port Yahoo to new libyahoo2-1.0.1 Disables file transfer (at least for now) Fix SSL context leak in connwrap 2010-08-27 Boris Petersen Added gettext-devel test to autogen.sh 2010-08-27 Sven Putteneers display received time if different from sent time Added script to extract a part of a chatlog history and pretty-print it. Run without parameters for usage info. 2010-07-31 Boris Petersen adding new script for history formating. initial script by Ilya Sukhanov 2010-06-19 Roger Add missing initialization to perm/deny SNAC and don't overwrite its id in SBL parsing 2010-04-24 Boris Petersen Merge git-version-gen with gnulib 2010-02-25 Damyan Yordanov bulgarian translation updated 2010-02-25 Boris Petersen updated po files 2010-02-21 Boris Petersen refresh index before checking for dirty versions 2010-02-21 Damyan Yordanov bulgarian translation updated 2010-02-18 Lubomir Rintel Use RAND_add() with nss_compat_openssl It does not provide RAND_seed(). 2010-02-18 Boris Petersen updated po files 2010-02-17 Roger Better jabber presence handling 2010-02-05 Boris Petersen Merge branch 'versioning' into mob 2010-02-05 أحمد المحمودي (Ahmed El-Mahmoudy) Check for FriBidi using pkg-config New upstream releases of FriBidi don't provide fribidi-config anymore, so using pkg-config instead to check for FriBidi. 2010-01-31 Boris Petersen new packaging friendlier versioning This basically omits the 4 hash digits at the end of the version string. so e.g.: centerim-4.22.9.12-3be3.tar.gz will end up centerim-4.22.9.12.tar.gz This makes it easier to package mobshot in gentoo for example. Updated po files 2010-01-29 Hakan Kvist Fixed compiler warnings in kkiproc.cc Removed unused function in kkiproc.cc and fixed compilewarnings regarding xprintf. stringstream << should be used instead of sprintf, and cout << instead of printf. Beacause: int64_t foo = 0xffffffffffffffff; printf (%lx, foo); printf will behave as expected on a 64 bit platform, but not on a 32 bit platform (only ffffffff will be printed). 2010-01-28 Hakan Kvist Cleanup of "extra protection" for ~/.centerim directory. Reverted some parts of the commits: e0ab4eeb52cdba438aa2834c4223881ab006b854 deb0cbaa7c385d2656229ac366071c090c55f597 See the discussion here: http://centerim.org/pipermail/centerim-devel/2009-June/000678.html If the ~/.centerim directory got the proper protection, then there is no need for bloating the code with a lot of extra verifications. No one else than the owner can access the files in ~/centerim anyway. Removal of unused variables Removed a couple of unused variables. There is still a lot to do if we want to be able to use -Wall for detecting real errors (currently there are too many warnings in the output, so -Wall isn't really useful). Ncurses RTFM. remove ugly prototypes for FreeBSD and OSX When reading the ncurses man page you find that _XOPEN_SOURCE_EXTENDED must be defined when using wide character functions when including ncurses.h. 2010-01-26 Hakan Kvist Try to fix FreeBSD ncurses compile errors. Tested on Ubuntu 9.04 and FreeBSD 7.2. Try to fix FreeBSD ncurses compile errors. Tested on Ubuntu 9.04 and FreeBSD 7.2. Try to fix FreeBSD ncurses compile errors. 2010-01-25 Hakan Kvist configure: check for ncurses/ncursesw. Only curses is not enough. Some platforms (i.e Solaris 11), still ships ancient curses. However centerim requires ncurses in order to compile. Adapted configure.ac to only check for ncurses(w) instead of (n)curses(w). Cleaned up #ifdefs in conscommon.h 2010-01-19 Hakan Kvist Fixed compiler error with FreeBSD. Also fixed link error against curseslib. FreeBSD do not want to be included. However utmp is only used in linux, so we do not need to include utmp.h for non linux systems. Also bug in configure script was fixed. The curses-lib was not properly included in the $LIBS-variable in the configure.ac file. 2010-01-19 Boris Petersen Better check for ncurses/ncursesw With many thanks to the autoconf archive for the macro and Stéphane "kjir" Bisinger for the pointers and hints ;) 2009-12-14 Boris Petersen Updating Changelog for 4.22.9 2009-12-13 Boris Petersen New taging model. To be up to date with gnulib's git-version-gen. WARNING: This breaks compatibility with non v* tags. For us that means everything before 4.22.9 won't work anymore. 2009-12-12 Remko van der Vossen quick patch to use MSNP8 instead of MSNP9 2009-12-10 Stéphane Bisinger Merge branch 'mob' of git+ssh://repo.or.cz/srv/git/centerim into mob 2009-12-06 Boris Petersen adjustment to german translation 2009-11-19 Boris Petersen Updated German translation 2009-11-10 Stéphane Bisinger Added -lgnutls when linking with GNUTLS When linking with the --no-add-needed option, the linker complains of undefined references because no -lgnutls is directly specified to the linker itself. This commit adds -lgnutls to the libraries when using GNUTLS 2009-10-26 Petr Písař Fix typo in Czech translation (4.22.8) Oops, I used bad old source and thus I omitted changes in commit 66e06036a07e20e22604a43d38ab607b703116d0. Czech translation updated for 4.22.8 2009-09-28 Johannes Ott aka Oetzi icqface.cc: Added Typing noticed to opened chat titles 2009-09-26 Roger Fix #94: don't disconnect() in impgp, check for errors in jabberhook GPGME: add missing initialization 2009-09-25 Roger Bug #8: Log dropped auth to log file Fix #31: better checks for rss items repetition (based on patch by Spiro) 2009-09-24 Roger ICQ: use protocol Online time Fix Online time Don't reset Online time on status change 2009-09-22 Roger ICQ: offline people don't type 2009-09-19 Roger Fix build (bad diff) 2009-09-18 Roger ICQ: display typing notifications 2009-09-09 Roger ICQ display idle times 2009-09-03 Frank Altpeter Fix fribidi to build on freebsd 2009-08-30 Kumar Appaiah Detect gnutls using AC_CHECK_LIB for gnutls >= 2.7.x Since gnutls 2.7.x, gnutls does not ship the libgnutls-config and libgnutls-extra-config scripts. Since the current autoconf method AM_PATH_LIBGNUTLS_EXTRA uses these scripts to detect the presence of gnutls, the centerim build fails with gnutls >= 2.7.x. This patch, instead, uses AM_CHECK_LIB to check for the presence of the gnutls_global_init_extra function, thereby ensuring that the gnutls detection works for 2.7.x, and across all earlier supported versions. 2009-08-27 Roger Better handling of unknown IQ stanzas (more XMPP compliant). Fixes s 2009-08-18 Boris Petersen Revert "Patch to detect gnutls properly." This reverts commit 519c100e53acfa78271932f090c58d9d990cc037. Sorry for blindly commiting without testing. It doesn't work. Maybe it work's for Debian. 2009-08-18 Kumar Appaiah Patch to detect gnutls properly. Patch from Debian by Kumar Appaiah 2009-08-09 Boris Petersen Updated ChangeLog for 4.22.8 release 2009-08-08 Boris Petersen update po-files for release 2009-08-08 Sven Wegener This fixes CVE-2008-4776 Patch from gentoo by Sven Wegener 2009-07-11 Robin Kreis Cleanup (functionality should remain unchanged) Only gives warnings about unused parameters now, even when used with -Wall -Wextra -pedantic. Mostly, initializer lists were reordered, default: were added and tabs were converted to spaces. 2009-07-07 Roger Yahoo fix 2009-06-27 Roger Doc says long, so long it is. Fix yahoo initialization Option to disable yahoo CA certificate validation Yahoo: encode login parameters Improve yahoo login verbosity 2009-06-24 Roger fix to be able to compile on osx by eyda|mon Bug #117 - don't allocate memory in signal handler Add missing yahoo cleanups 2009-06-23 Roger Fix yahoo authentication 2009-06-19 Hakan Kvist Small update (uses S_IRWXG instead of S_IRGRP|S_IWGRP|S_IXGRP etc). Changed indentation so it is consitent with what atleast one other person indents code like. Updated comments a little bit. 2009-06-18 Hakan Kvist Merge commit 'origin/mob' Make sure that the ~/.centerim directory got the right umask when created When the ~/.centerim (or ~/.centericq) directory allready exists, the permissions of the directory will be checked. If necessary, the directory itself and the files placed directly below will have their permissions set to sane values. 2009-06-14 Roger Disable previous commit Make Invisible less visible 2009-06-07 Roger Fix incorrect online time calculation 2009-05-27 Frank Altpeter Updated ChangeLog manually (based on "git log") 2009-05-27 Mehturt Quicksearching withing the contact list searches starting anywhere in the name. 2009-05-26 Mehturt Added functionality to report idle time by X, based on libXss. Fixes bug http://bugzilla.centerim.org/show_bug.cgi?id=7. 2009-05-02 Boris Petersen Merge branch 'mob' of git+ssh://transacid@repo.or.cz/srv/git/centerim into mob Exchanged play with aplay. This should fix some problems with play not being installed. aplay comes with alsa so it should be on every system. 2009-04-29 Lubomir Rintel Fix libgadu and libicq NSS cryptography support Fixes needed to get it compile with Fedora's nss_ossl_compat library. 2009-04-26 Stéphane Bisinger Fixed bug #137: Compilation fails under OpenBSD Moved the #include "libxode.h" to the top of jabber.h since in that header there is and include to "config.h" which defines all the macros detected by the configure script 2009-04-21 Roger Fix bug #118 - move cursor when it should 2009-04-11 friedmag Merge branch 'newlines' into mob Fixes #110 Added conversion for to appropriate ASCII 2009-03-24 Roger Don't duplicate nicks in jabber conferencies and sort them. Patch by Andrei Vereha 2009-03-07 Roger Don't log unnecessary jabber errors 2009-02-25 Stéphane Bisinger Fix for nagios issue (corrected) Fixed nagios issue 2009-02-23 Roger AIM contact names are space-insensitive Disable captcha on IRC 2009-02-23 Petr Písař Fix typo in Czech translation 2009-02-22 Petr Písař Czech translation for 4.22.7 2009-02-22 Roger AIM contact names are case-insensitive Add missing ids for IQ stanzas (bug #119) 2009-02-22 Boris Petersen Updated Changelog for 4.22.7 2009-02-20 Roger Fix AIM logon. 2009-02-16 Roger Fix ICQ protocol change, patch by Alexandr Zeinalov 2009-01-26 Boris Petersen Updated po files Updated german translation 2009-01-19 Frank Altpeter Same thing - change run path from /usr/bin/perl to /usr/bin/env perl to comply to operating systems which don't have perl in /usr/bin (like FreeBSD) Changed #! path to comply to common rules of having no hardcoded path to python Required for example for being run on FreeBSD (which has python in /usr/local/bin instead of /usr/bin) 2009-01-18 Jan Stancek Added possibility to turn on PGP for ICQ If turned on, it encrypts all outgoing messages with gpgme by adding PGP BEGIN/END headers around all encrypted data. Received messages are then scanned PGP BEGIN/END and message is extracted if possible. Messages, which can not be decrypted, e.g. messsages, which don't fit the format or for which decrypt fails are dispalyed as they are. 2009-01-17 Jan Stancek fix for: output modified by imexternal not saved to history imeventmanager::store() creates a copy of imevent, which is later processed by imexternal, where it can be modified. But when it comes to saving this event to history original version is saved. It is assumed, that user wants to see and log the actual text he sent, even if text is modified by external script. 2009-01-12 Petr Písař Czech translation update for 4.22.6. 2009-01-10 David Riebenbauer can't say if we're building shared libs we don't use libtool anymore so we can't say if we're building shared and/or static libs 2009-01-09 Roger Deal with OpenSSL redistribution problem. Lubomir Rintel 2009-01-05 Roger Fix incorrect snprintf() use See http://lists.debian.org/debian-devel/2008/12/msg01079.html 2008-12-03 Libor Capak rss Atom support 2008-10-31 Max Soares This commit fix the bug reported in Bugzilla as "Bug 105 cursor jumps when typing multiline messages". The problem happen when the texteditor try to merge 2 lines 'cause some caracter are excluded in first line. The merge is: move the first word from second line to end of first line. 2008-10-31 Pavol Rusnak fix method return value (caused error - function returns random data) 2008-10-26 Boris Petersen Updated Changelog 2008-09-22 Pavol Rusnak fix buffer overflow in kkstrtext.cc 2008-09-21 Boris Petersen Revert "Fixed version-gen bug with old git version which don't support update-index option" This reverts commit 283697d5a77225ae49546dd9c176652d2d062076. 2008-09-20 Glazunov Vadim Fixed version-gen bug with old git version which don't support update-index option Adding some code to set external status in jabber protocol, now easy to add external statuses in other protocol, such as icq(?). To set jabber external status, select primary status an go to jabber accounts options and set external status 2008-09-17 Stéphane Bisinger Included some checks for LargeFile support Added those checks according to the GPGME info page 2008-09-10 Glazunov Vadim first fix broke linux compilation, now will be ok Fixes to compile on FreeBSD 7 and others 2008-09-08 Boris Petersen include web addres to FAQ Updated TODO to give a hint for CIM5 Some changes to the README 2008-09-04 Boris Petersen This shold fix an issue with -dirty builds with git 1.6.0 2008-09-03 me Fixed otr. Didn't compile. 2008-09-03 Glazunov Vadim Fixed small bug with jabber nick names in higher register 2008-08-22 Matthias Nieuwenhuisen fixed some compile errors (conf is a pointer and setDefaultAuthMessage should be used instead of setchatpanelgeight) 2008-08-22 Matthias Richter Lets you set the default authorization request message 2008-08-20 Matthias Nieuwenhuisen another small code style correction corrected code style fixed a small indentation bug introduced by the former commit mark messages for which receipts were sent and corrected indentation of marked messages in chat window 2008-08-18 Boris Petersen More clear eplanation when away msg can't be fetched 2008-08-12 Glazunov Vadim This must help on system which have ncursesw/curses.h instead of ncursesw/cursesw.h 2008-08-12 Matthias Nieuwenhuisen including both, curses.h and cursesw.h doesn't work, because of same ifdefs. Hope this doesn't break anything on other systems 2008-08-12 Glazunov Vadim Fixes to ncursesw 2008-08-11 Boris Petersen Fixed small typo in configure.ac 2008-08-11 Glazunov Vadim Added some ifdefs to compile without widechar support(on systems which don't have ncursesw) Addings to previous commit 2008-08-10 Glazunov Vadim Fixed bug #20 and #72 - Broken russian(and other multibyte?) languages when linking with ncursesw. Really fucking problem, please check if I don't broke other locales 2008-08-05 Matthias Nieuwenhuisen Added marker for acknowledged messages to the history window Don't mark incoming messages as acknowledged, if the id is the same as an acknowldedged outgoing message 2008-08-04 Glazunov Vadim Fixed funny bug with asterisks in input filename field, shown only on first start after editing password field, thnx to Boris 2008-08-04 Matthias Nieuwenhuisen Added some translations for DE and added NL translation for message receipts config option 2008-08-03 Matthias Nieuwenhuisen Do a service discovery if a contact comes online and request only for message receipts, if the contacts client supports XEP-0184. 2008-08-03 Glazunov Vadim Added minor configure checks to jabber protocol. Added option to show/hide information about OS Fixed read away message with non-latin characters Jabber file-sending support(xep-0066).Port range for outgoing connection got from Communications options or auto 2008-08-01 Matthias Nieuwenhuisen Added the ability to request receipts, a + char is shown, if a message is acknowledged. 2008-07-29 J.R. Mauro Merge branch 'mob' of git+ssh://mob@repo.or.cz/srv/git/centerim into mob 2008-07-26 Boris Petersen Reapplied patches by Sven Wegener. Please pull before commiting, thanks. 2008-07-25 J.R. Mauro icqconf is now a Singleton; 'conf' is now a pointer and members must now be accessed with -> 2008-07-22 Glazunov Vadim Basic jabber file-transfer implementation(only recieving files, file sending will be in next commit). Partially xep-0066, xep-0065 (socks5 bytestreams and http), now no proxy support. 2008-07-22 Sven Wegener Fix indentation in configure.ac libotr check Fix configure.ac libotr error This fixes the following error: checking for otrl_init in -lotr... yes checking libotr/context.h usability... yes checking libotr/context.h presence... yes checking for libotr/context.h... yes ./configure: line 15006: libotr/userstate.h: No such file or directory 2008-07-21 Matthias Nieuwenhuisen Added basic support for sending Jabber message receipts (XEP-0184) and service discovery (XEP-0030). 2008-07-21 Glazunov Vadim Jabber avatar get/set patch 2008-07-20 Glazunov Vadim Gtalk got vcard fix. Get jabber version fix. Added send centerim version in jabber. Some addings for latest patches 2008-07-05 Lubomir Rintel Allow using el5 gettext. Successfully tested. Actually replace the sound files Replaced the sound files of unknown origin with ones that are certainly free. 2008-07-03 Boris Petersen Fixed small typo in configure.ac 2008-06-30 Boris Petersen Forgot to add CenterIMLog2HTML.py to bin_SCRIPTS in Makefile.am now it gets installed 2008-06-18 Boris Petersen Added script by Luar Roji to the misc folder. This script converts CenterIM history files to html 2008-06-10 Stéphane Bisinger Removed binary which should not be included 2008-05-28 Stéphane Bisinger Added a test directory to make some tests 2008-05-08 David Riebenbauer Revert "fix a small compiler warning in libicq200" This reverts commit 9b3cd99b2083e1af6312868d9983681230c7e0d5. Revert "replace obsolte macros in configure.ac" This reverts commit 1a596632e5b3cf54eef1b607f880d785c6930513. I thought that AC_USE_SYSTEM_EXTENSIONS would be a cleaner approach here, but it broke the build with some versions of autotools. So I'm reverting that. 2008-05-07 David Riebenbauer add a replacement setenv to icqcommon.cc That should only have to be used on systems that don't provide a setenv implementation themselves. irix for example. use statvfs on IRIX too guard the inclusion of stdint.h reduce checks for functions to strictly needed most of the checks actually came in shortly after taking over from centericq. I think by doing something like autoupdate or such. Problem is that AC_FUNC_NALLOC and AC_FUNC_REALLOC cause problems on IRIX if we don't actually act on the test results. fix a small compiler warning in libicq200 basically it complained 'cause we were comparing between unsigned shor and unsigned int, which was quite easy to fix add -Wno-write-string to AM_CXXFLAGS this does away with the various depreceated conversion from string constant to char* warnings in various places. See gcc(1) if you want details. replace obsolte macros in configure.ac replace the obsolete AC_ISC_POSIX and AC_GNU_SOURCE with AC_USE_SYSTEM_EXTENSIONS don't check for more programs then we actually use Checking for iconv once is enough 2008-05-06 Stéphane Bisinger Moved sha.h from SOURCES to HEADERS 2008-05-05 David Riebenbauer small fixes in Makefile.am Replace ':=' assignments with '='. This also fixes a warning by automake/autoconf.. Quote variables in the git-version comparison. use config.h a bit more Include config.h in kkstrtext/conf.h and kkconsui/include/conf.h. These two subdirectories previously had the configure results passed as compiler arguments in previous versions. But now taht all configure.ac's and configure.in's are merged into one we explicitely have to include config.h in some places. 2008-04-29 Boris Petersen added sha.h to libyahoo2/Makefile.am otherwise it won't get included in the tarball. 2008-04-26 David Riebenbauer fix build failure in connwrap.c, when building with openssl with_ssl is only set if ssl gets explcitely disabled or when there is no openssl, so we check for "not no", instead of checking for "yes" 2008-04-25 David Riebenbauer eliminate libyahoo2/configure.ac eliminate libmsn/configure.ac eliminate libjabber/configure.ac eliminate libicq2000/configure.ac eliminate libgadu/configure.ac eliminate kksystr/configure.ac eliminate kkstrtext/configure.ac eliminate kkconsui/configure.ac eliminate firetalk/configure.ac 2008-04-25 David Riebenbauer integrate connwrap magic into $top_srcdir move connwrap's configure into main configure.ac and Makefile.am 2008-04-25 David Riebenbauer don't overwrite $CXXFLAGS with $CFLAGS in configure.ac 2008-04-24 Roger Merge branch 'mob' of git+ssh://mob@repo.or.cz/srv/git/centerim into mob Bug #98 - Disable message conversion from/to HTML 2008-04-24 Stéphane Bisinger Merge branch 'mob' of git+ssh://repo.or.cz/srv/git/centerim into mob 2008-04-24 Stephane Bisinger Fixed ICONV detection; see bug #81 Updated line numbers in po files 2008-04-20 Boris Petersen Removing spec and motor files properly 2008-04-17 Boris Petersen Revert "got rid of *.spec and *.motor files, which dun relly belong to the actual source" This reverts commit ceec34a496196954b68e878cc051c83460284c11. 2008-04-17 Roger Bug #91 - Restore history position on return to event-list Bug #89 - Fix IRC/NickServ password handling Bug #66 - Fix regression from newer firetalk lib 2008-04-15 Boris Petersen Changed warning display condition for libotr. Now only a warning is given if you build --with-libotr, sine it's not supported yet 2008-04-15 David Riebenbauer Merge branch 'mob' of git+ssh://mob@repo.or.cz/srv/git/centerim into mob 2008-04-15 Boris Petersen Merge branch 'mob' of git+ssh://transacid@repo.or.cz/srv/git/centerim into mob 2008-04-15 David Riebenbauer correct the node number for the vi keys setting 2008-04-15 Boris Petersen got rid of *.spec and *.motor files, which dun relly belong to the actual source 2008-04-14 Roger More support for old GCC, now in irchook Improve GCC 2.95 support in libyahoo2 2008-04-12 David Riebenbauer only use order-only targets if we have a GNU make that supports it Adds a test to configure.ac that checks if make supports order-only targets. Change the "|" in src/Makefile.am to $(ORDER_ONLY which is empty if they're not supported. This should fix the problem that centerim would only compile with GNU make 3.80 and higher. Merge branch 'mob' of git://repo.or.cz/centerim into mob 2008-04-12 Jayjay Corrected typo in menu: offile to offline. Also corrected this typo in the language files. 2008-04-08 Boris Petersen Updated Changelog 2008-04-07 Roger Bug #93 - Don't call unimplemented buddyicon callbacks (thanks Derek) Bug #88 - Correctly end loop (thx Anibal and Lenny) 2008-04-04 Mehturt I've implemented (sort of) vi keybindings for moving up/down in contact list and some other windows using 'j' and 'k' keys. The patch also contains configuration. Tested on Ubuntu 7.10 with ncurses 5.6. 2008-04-03 Roger Bug #88 - Check if user is created before setting attributes 2008-03-31 Roger Yahoo (val)grinding 2008-03-31 Johannes Ott aka Oetzi German translation for new config option moved new option to the right topic User Interface Added config-option for the enhancement Charlie did this day: showing opened chats. Shortened *Auth*-Tag to "!A" Merge branch 'mob' of git+ssh://mob@repo.or.cz/srv/git/centerim into mob 2008-03-31 Charlie Added feature to display all opened chats. 2008-03-31 Johannes Ott aka Oetzi Added a tag *Auth* to the usernames at contact-list which are on status Awaiting Authorization. Issues: Showing flag for all users, while connecting to server until list is syncronized with server (2-4 seconds) 2008-03-30 Sven Wegener Use browser from config file When loading the config file use the value from the file instead of setting our current value again. 2008-03-29 Boris Petersen Updated Changelog 2008-03-27 Roger Bug #85 - Split multiline messages before processing YIM - Support authorization 2008-03-26 Roger Bug #78 - YIM, contact-list managing, new list parsing YIM: Comment out another unimplemented callback 2008-03-24 Roger YIM: Accept v15 status messages 2008-03-23 Roger Bug #78 - Change YIM protocol version 2008-03-20 Roger Bug #83 - Better and tested fix Bug #83 - Single-quote passed URL and encode single-quotes in it 2008-03-19 Roger Bug #82 - NetBSD #ifdefs, patch by Ed Ravin 2008-03-17 Petr Písař Czech translation: Public keys in OTR configuration fix 2008-03-17 Pavel Krush add new color to the colorschemer for unread messages 2008-03-14 Sascha Vogt Commented out callback of non-implemented method to prevent a segfault while logging into Yahoo! 2008-03-13 Roger Backport yahoo login from libpurple. Merge changes from libyahoo2 SVN trunk. 2008-03-13 Petr Písař Czech translation synced with POT POT update Usage help message typo and i18n fix Czech translation update Content-Type charset= header fix (real charset and header mismatched) 2008-03-11 Boris Petersen Added zh_CN to po files in configure.ac Updated Changelog Sorry, forgot pl. and some moving Changed po files to utf-8 2008-03-02 Petr Písař Czech translation spelling correction Czech translation update (spelling corrections) 2008-02-29 Roger Bug #74: Move cursor back when merging piece of line to previous one. 2008-02-13 Stephane Bisinger Re-added v2 constant Re-added v5 constant Merge commit 'origin/mob' into mob Conflicts: libicq2000/src/Client.cpp libicq2000/src/SNAC-GEN.cpp 2008-01-28 Andy Stanford Further fixes as with preceeding patches. ref bug# 67 Amendment to previous edit. Edit to RSS Parse to prevent infinite looping when parsing
tags. 2008-01-27 Boris Petersen moved the old Changelog, which only contained log from the old centericq to ChangeLog.old and added our own new ChangeLog generated from git log. Fix for Fribidi from gentoo see http://bugs.gentoo.org/show_bug.cgi?id=200900 2008-01-24 Roger ICQ: Send authorization replies via SSI. ICQ: Update sent capabilities (SSI). ICQ: Parse additional SNAC TLVs (version) 2008-01-23 Roger ICQ: Update login packet sequence. 2008-01-22 Roger ICQ: Rebuild master group when adding/removing group. ICQ: Show authorization awaiting info about contacts. Preliminary support for ICQ contacts state reporting. Respect tag IDs of non-contact SBL entries. 2008-01-21 Roger Improve ICQ SBL/SSI handling (user removal, disconnection etc.). 2008-01-19 Roger Bug #70 - Improve Jabber presence handling for multiple resources with and one contact. Implement contacts and groups removal for ICQ SSI. 2008-01-18 Roger Port fix for bug #51 to new SSI infrastructure. 2008-01-17 Roger Fix disconnecting with ICQ caused by my previous patch. 2008-01-15 Jayjay Corrected bugzilla.org typo in configure. Reverted part of patch of Apr2007. - in configure.ac, I made a typo of bugzilla.centerim.org, corrected that - I was mistaken by thinking this is incorrect: 'if (c = ....)' But C allows this and the code needed it. Now user details are fetched correctly again. 2008-01-14 Roger First part of SSI/SBL support for libicq2000. Implements adding of users and groups. 2008-01-11 Roger Bug #67 - don't loop in ruscase() infinitely. 2008-01-09 Roger Bug #51 - Use groups from previous packets when importing contacts from server. 2008-01-04 Jayjay Rolled back wrong renames to lists.sourceforge.net. Changed sourceforge bug-reporting project to our new bugzilla site. 2008-01-02 Stephane Bisinger Merge commit 'origin/mob' into mob 2008-01-01 Roger Parse incoming auth. messages sent via SBL/SSI. 2008-01-01 Stephane Bisinger Use family 0x0013 (Server Stored Information) to add users to list 2007-12-31 Stephane Bisinger Added request types to rate classes Added parsing of Rate limits. Rate limits where completely skipped during parsing. Now they are saved in a map so that in future we may use these to make some controls. Adding interpretation and saving of server capabilities. Commented out sending CL at login. Formerly the server capabilities were just ignored. Now they are saved in a vector so that we may re-use them to prevent the sending of unrecognized commands. Also commented out the sending of the Contact List to server at login time since it is not part of the login steps and the server responds with an error. 2007-12-29 Stephane Bisinger Update translation files Resolved a couple of bugs introduced by the latest commits Updated translation line references Added error handling and logging of error codes and messages Fixed incomplete parsing of incoming packet Added an error log when receiving error messages from server Corrected the parsing of SSI Rights Reply 2007-12-26 Roger Rename "Unicode" to "German UTF-8", as it is source encoding specific. Don't un-idle-auto-away when screen is reattached (revert to auto-idle status via previous online). 2007-12-23 Stephane Bisinger Merge branch 'bug24' into mob Conflicts: po/cs.po Fix for bug #24 2007-12-21 Stephane Bisinger Updated translation lines 2007-12-20 Petr PísaÅ™ "Request an authorization" fix and other updates 2007-12-19 Martin Nepivoda Bug #56 - better initialisation of editor. 2007-12-16 Johannes Ott aka Oetzi added new conversion rule iso-8859-15 to utf-8 named Unicode 2007-12-14 Roger Make valgrind happy. 2007-12-13 David Riebenbauer Merge branch 'mob' of git+ssh://davrieb2@repo.or.cz/srv/git/centerim into mob add GPGME_LIBS to LIBS. (fixes Bug54) 2007-12-13 Pavol Rusnak Setting all test checks to form "x$string" = "xvalue" http://bugzilla.centerim.org/show_bug.cgi?id=54#c9 2007-12-11 David Riebenbauer Re-add gnutls_record_send in connwrap.c The fix to bug 40 removed one if-clause to much, which caused SSL connections to time out. Re-adding the statement fixes that 2007-12-10 Boris Petersen Typo in GPGME check, Patch by Michael Tatarinov 2007-12-08 Stéphane Bisinger Added a missing format specifier Started update of Italian translation Corrected bugs introduced by previous commit Fixed bug #40 Removed printf and fprintf from connwrap which messed the output of centerim Fixed bug #52 Fixed a bug that prevented to insert a user in your contact list if you had no groups in your list, MSN protocol. Also fixed a bug when removing users that where in no group which incurred in error 224 2007-12-08 Mehturt Fixed bug #47 Fixed bug which made centerim crash when built with libotr support. This is a quick workaround until we refactor some code 2007-12-08 Stéphane Bisinger Updated translation references 2007-12-07 Stéphane Bisinger Displayed CXXFLAGS instead of CPPFLAGS at the end of the configure 2007-12-03 Pavol Rusnak Allow connecting with more instances of centerim to jabber server by adding random hex number after "/centerim" resource identifier. (At least that is the way libpurple does ...) 2007-11-30 David Riebenbauer Merge branch 'master' into mob replace the libcurl tests with libcurl.m4 Add m4 macros to check for libgnutls to the repository libssl users who check out git shouldn't need libgnutls Change pgpme.m4 to use the old commandline option and help string replace configure check for gpgme with the m4 provided by gpgme This also has the advantage that we now check for the correct minimum gpgme version. 2007-11-29 David Riebenbauer replace occurences of VERSION with centerim::version This patch adds a new file git-version.cc, which intializes static variable centerim::version. This helps in cutting down the compile time penalty of generating the version string on every make run. Instead of every file that uses config.h only one file has to be recompiled. The rest of the work is done by the linker. Add an autogenerated header git_version.h This information is partly redundant, as config.h contains the version information too. But git_version.h gets updated on every make run in src. Care is taken to only touch the file when it's version number differs from the one generated by git-version-gen. 2007-11-25 David Riebenbauer remove superfluous include of string.h seems this was produced by a mis-merge Merge branch 'master' into mob 2007-11-25 Roger Bug #39: Ack SBL to get status notifications Bug #39: Ack SBL to get status notifications 2007-11-24 David Riebenbauer Merge branch 'master' of git+ssh://davrieb2@repo.or.cz/srv/git/centerim into mob 2007-11-23 Iulian Ciorascu custom contact sorting patch You'll find attached a patch for custom contact sorting. Currently (and the default value in the patch) they are sorted by status and activity. Other possibilities are: by status and nickname by activity by nickname chat out keybinding patch Here's a small patch to a direct keybinding from a chat to the contact list. I put it to Ctrl-v keybinding by default. 2007-11-23 David Riebenbauer Merge branch 'da_master' into mob Conflicts: libicq2000/src/ICQ.cpp libicq2000/src/socket.cpp libmsn/msn/connection.cpp libmsn/msn/filetransfer.cpp libmsn/msn/notificationserver.cpp libmsn/msn/util.cpp Merge branch 'master' into mob add vims swp files to gitignore add various includes of cstring to fix compilation with gcc-4.3 Merge branch 'master' into da_master 2007-11-23 Pavol Rusnak comparison with string literal 2007-11-19 Boris Petersen adding missing includes; trivial fix - comparison with string literal. by Pavol Rusnak 2007-11-18 David Riebenbauer little TODO update 2007-11-13 Stephan Schulz Not only change the terminals window title but also the icon name I found it annoying that (at least on my system), centerims title changes were only visible in the title of the xterm window itself but not in the taskbar. It has nothing todo with the xterm settings as midnight commanders title changes appeared in the taskbar (I'm speaking of a gnome desktop right now). I traced the source for title changing function und changed the following line: icqface.cc:3648 in tarball centerim-20071022.tar.gz from: cout << "\x1b]1;\x07\x1b]2;" << [cutted] to: cout << "\x1b]1;\x07\x1b]0;" << [cutted] The change from 2 to 0 has the effect of not only changing the window title but also the icon name. 2007-11-12 David Riebenbauer add .deps to .gitignore also fix the entry for /src/centerim to only be used from the git tree's root commit newly generated po files remove AM_MAINTAINER_MODE Maintainer mode has annoyed me more and more over time. I forget to pass --enable-maintainer-mode to configure far too often. So I am disabling it now. I think any problems this might cause, an be solved by either unpacking the damn tarball again or installing autotools. 2007-11-11 David Riebenbauer Generate the version info from git Until now the version info was set from configure.ac. From this commit on it is generated by info from git and a script I shamelessly lend from the GNU coreutils source. Changes in the version number should be done by adding a signed tag in git. 2007-11-09 Roger SF request #1811713: Add nickname to event term title notification 2007-11-05 Boris Petersen adding Chinese translation and updated Taiwanese translation by Ying-Chieh Liao 2007-11-03 Stéphane Bisinger Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git#mob Changed the optional build of libotr 2007-10-28 Boris Petersen minor changes in the german translation again. 2007-10-27 Chris Donoghue Segfaults instead of connecting to Yahoo! on AMD64 arch 2007-10-26 Roger ICQ: Handle incoming UCS-2BE messages. 2007-10-25 Roger Fix config dialogue mismatch for captcha/ask quit items 2007-10-25 Petr PísaÅ™ Czech translation update (mainly about OTR) Revert "Czech translation update (mainly about OTR)" This reverts commit b0664c09c4400361ed5b077896b5bd97b4640caa. Czech translation update (mainly about OTR) 2007-10-22 Stephane Bisinger Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git#mob 2007-10-22 Stéphane Bisinger Changed client version reported to server Ignored NOT messages by notification Server in libmsn 2007-10-20 Stéphane Bisinger Move getmd5 back in abstracthook, made it static and public so that it may be used by HTTPClient Substituted sizeof() with a more readable macro 2007-10-16 Stephane Bisinger Fixed indentation 2007-10-13 Boris Petersen minor changes in the german translation. 2007-10-10 Ranyus BUG # 1760159: Commented fprintf of message "getsockopt error" 2007-10-09 Roger Notify if stored IP isn't current 2007-10-06 Iulian Ciorascu fixed library inclusion order 2007-10-06 Sascha updated the ChangeLog 2007-10-04 Andreas Krennmair numberous snprintf cleanups; removed code duplication 2007-10-04 aavelar Feature enhancement, adds configurable dialog window that asks before quit Another lj functionality enhancement Adds support for lj tags, functionality Security patch to fix the CVE-2007-3713 report Just removes some unnecessary code on libyahoo2 2007-10-03 Boris Petersen made libotr support optional, because it's still buggy 2007-10-02 Andreas Krennmair add missing ifdef's for libotr patch. 2007-08-24 Jörg Böhnel Adding --with-libotr to configure; using _(...) for translateable strings 2007-08-20 Anibal Avelar Delete to clean the source. Unused file Updating with firetalk library coming from naim project. This fixed many bugs relates with AIM and IRC protocols Patch to fix a FTBFS with GCC 4.3, reported by the Debian BTS 2007-08-19 Jörg Böhnel Added OTR support for jabber - you need to have libotr installed. 2007-08-17 Boris Petersen moved cicqconv to cimconv. Wasn't aware that you had to do it with cg mv Changed cicqconv to cimconv globaly update, sorry for the inconvenience Changed cicqconv to cimconv globaly 2007-08-16 Roger Fix --bind: unrecognized re-bind() on reconnect. 2007-08-10 Roger Change status description handling for jabber and undo asking for message for Online/FFC 2007-08-09 MichaÅ‚ (Kazik) Kazior Away messages fix (jabber) I think, that most of today's im protocols support setting a description/away message for available/freeforchat statuses. Also, jabber may be not supporting saving a description/away message for a contanct whose offline, but some of it's transports (Gadu-Gadu for example) do. 2007-08-02 Anibal Avelar Support for lzo2 for gnutls (check for lzo1 and lzo2) 2007-07-24 Stéphane Bisinger Recoded russian messages to UTF-8 Corrected ordering of contacts by status by placing out for lunch contacts at the bottom 2007-07-23 Stephane Bisinger Updated MSNP to version 9 2007-07-21 Stephane Bisinger Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git#mob Changed Content encoding to utf8 Added a couple of frees 2007-07-13 Stéphane Bisinger Added a couple of frees to prevent memory leaking 2007-07-10 Roger Fixes for patch 4187752098e87ce0e8bfeffa9e6e1f6030549ffa (cursor position after merge, wrapping whitespace...). 2007-07-09 Boris Petersen Minor changes to german translation. Spaces basically 2007-07-07 Roger Fix for sf.net bug #1710218. Adds "paragraphs", wrapping and merging neighbour lines on deletes and inserts. 2007-07-01 Roger Fix missing jabber group conversions - bug #1740881 2007-06-30 Boris Petersen wrong coded blanks in German translation updated 2007-06-26 Roger Discover services on connect. Find conference and user-search ones. Find dialogue fixes, presence error handling. 2007-06-25 Roger Initialize services iterator when reopening the Join dialogue. (fixes crash) Fix use of unitialized pointer, usually just skipping config reloads. 2007-06-25 Stéphane Bisinger Corrected some errors related to the format specifiers Corrected other format specifier errors Added missing placeholders in translated string Recoded German translation to UTF-8, otherwise it would prevent centerim from compiling Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git#mob 2007-06-23 Boris Petersen German translation update 2007-06-23 Stéphane Bisinger Added the man page for centerim to the Makefile so that it is installed. Updated version number 2007-06-23 Dmitry E. Oboukhov In case when user's coding and irc's coding do not match each other messages on user's logout and channels' subjets are converted incorrectly. This patch will cure that defect. 2007-06-22 Roger Changes to JID handling, avoid adding random hostnames and duplicating contacts and display at least hostname for transports. 2007-06-21 Stephane Bisinger Merge with locmob 2007-06-21 Andrey J. Melnikoff fixed building when using separate build directories. 2007-06-21 Stéphane Bisinger Fix for bug #1724170: removed carriage returns from the string to be signed in the jabber status Added an Out for Lunch status Changed the mapping of the not available state on MSN In the MSN protocol the "Not Available" state of centerim was mapped to "Out for Lunch". Now it is mapped to Away. 2007-06-18 Petr PísaÅ™ Czech translation update 2007-06-14 Stéphane Bisinger Fixed bug #1707708 which showed error 501 in the log console when adding contact in Jabber connected to GTalk. Error 501 is a Feature Not Implemented error code and it should not be reported to the user. It informs the client that the operation it attempted is not supported by the server. Fixed bug #1734670: when logging off of MSN it did not hide the contacts that were online Some calls to the functions to hide the contacts were missing during the logout process. I added them to the hook so that the contacts are now hidden on signout. 2007-06-13 Anibal Avelar Fixed support for GnuTLS for Jabber and GaduGadu protocols 2007-06-13 Andrey J. Melnikoff This patch simple move setting xterm title, avoid changing title when auth request dropped due to antispam settings. 2007-06-13 Stéphane Bisinger Revert "This patch simple move setting xterm title, avoid changing title when auth" This reverts commit 1a55b206ef400415708ddb5696e7e141581236ba. This patch simple move setting xterm title, avoid changing title when auth request dropped due to antispam settings. 2007-06-13 Andrey J. Melnikoff This patch add spk6 sound - simple bell. There is at least two stuppid xterm terminal emulator (xfce-terminal and gnome-terminal) which don't filter timer tunine escape sequences. 2007-06-13 Stéphane Bisinger Incremented version number 2007-06-12 Stéphane Bisinger Fixed bug #1719847 which prevented a user from logging in msn if the contact list is empty. The libmsn library made the wrong assumption that after the group list there is always a user list, which is not true if there are no users. This prevented from setting the correct variable used to check if list synchronization is complete 2007-05-06 z35 [Stephen Stegall] Fixed a couple bugs in chat resizing 2007-05-04 z35 [Stephen Stegall] Chat size is now limited by the MinPanelHeight Value, though there is now a bug for when you are at the limits and one resizes the panel, it exits instead of staying in the chat 2007-05-03 z35 [Stephen Stegall] Chat panel fixes: redraws chat panel when the history panel is resized keeps the editor the same size on resize events Todo: redraw when the window is resized change the .1 and .9 to MinPanelHeight based values 2007-05-02 z35 [Stephen Stegall] Fixed the history updating when resizing various panels 2007-04-26 Stéphane Bisinger Git wants to commit nothing, so here it goes :S 2007-04-26 J. Koster Color contact by status bug solved In the config options, when Color contacts according to: status was selected, every contact displayed a short protocol name between the brackets [i] instead of the status [o]. This patch makes it more consistent, but the disadvantage is that in the color-by-status mode, you can't see the protocol used by the contact. Solves bug: [1707935] wrong status of buddies in contact list http://sourceforge.net/tracker/index.php?func=detail&aid=1707935&group_id=190480&atid=933528 2007-04-26 Jayjay Clean up code, remove some warnings I walked through the code using "CXXFLAGS="-pedantic -Wall ./configure" and removed some warnings. Mostly, just code corrections.CG: ----------------------------------------------------------------------- 2007-04-24 Stéphane Bisinger Reinserted the check for openssl on the value specified by the user Resolved a conflict Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git#mob Partly fixed the issue about closing panels. Now the minimum size for a panel is 4. Also fixed automatic detection of the size if the lines on screen are too small. Don't know if ti works as it should, though Changed the function mktemp to the safer mkstemp 2007-04-22 Mark Pustjens Alows you to disable the ICQ plugin. Yes, that means it is now possible to build centerim withouth any plugin enabled. 2007-04-22 Jayjay Renamed old information to reflect current project status. More little stuff. I searched for several old information, such as web addresses and mail addresses and replaced it. I also made some minor changes to several files. Here is a summary: - Renamed every occurrence of Konst's old email address to the current one: konst@konst.org.ua to k@thekonst.net - bug report location renamed in icqconf.cc to http://sourceforge.net/projects/centerim - /po files: CenterICQ List renamed to CenterIM SourceForge project; http://sourceforge.net/projects/centerim - /po files: renamed every centericq-bugs@konst.org.ua to http://sourceforge.net/projects/centerim - Updated .gitignore: added mkinstalldirs, changed /src/centericq to /src/centerim - Updated po/.gitignore: centericq.pot to centerim.pot - Changed the --help: added program name and version. Added status options at --statusCG: ----------------------------------------------------------------------- 2007-04-21 Mark Pustjens Cleaned up some debug messages which got into the main branch. 2007-04-20 Jayjay Renamed CICQ to CenterIM at various locations etc - Renamed konst.org.ua to thekonst.net - Fixed some typos: .CenterIM to .centerim - Changed the configure.ac script to show warnings (-Wall) - removed the cicqsync script, since we don't use CVS - mentioned our current developers mailing list (do I break the PO files now?) 2007-04-18 Stéphane Bisinger Cleaned the checks for OpenSSL The configure scripts in the subdirectories (connwrap and libgadu) tested again to find OpenSSL. The code has been cleaned as to leave the checks only in the main configure script. Cleaned the checks for OpenSSL The configure scripts in the subdirectories (connwrap and libgadu) tested again to find OpenSSL. The code has been cleaned as to leave the checks only in the main configure script. 2007-04-17 Stéphane Bisinger Remove useless dummy file: m4 directory is created by the autogen.sh script Corrected some entries 2007-04-17 Mark Pustjens Modified configure.ac to make sure that if ssl is enabled automatically libjabber and others are configured with the flag enabled. 2007-04-16 Stéphane Bisinger Improved SSL checking. Enabled SSL by default Cleaned SSL detection Inserted a couple of fixes from the master branch. Corrected a centericq.h in centerim.h Fixed a bug that prevented from changing the browser. Added a check for lzo The configure script was not checking for lzo when ssl support is enabled. I added a check for the library Fixed the checking for gpgme Detecting gpgme was broken because it always defined HAVE_GPGME, thus making it mandatory. Now HAVE_GPGME will only be defined if gpgme is available 2007-04-16 Mark Pustjens This adds automatic testing for openssl Needed for the ssl patch to function properly in more situations Changed the default for --with-ssl to auto detect. Without ssl enabled no GPG support will be compiled into libjabber, which breaks Google Talk support. When ssl is disabled the configure script will warn the user about this fact. This patch needs testing to verify that it works for everyone. 2007-04-15 Stéphane Bisinger Added a check for lzo The configure script was not checking for lzo when ssl support is enabled. I added a check for the library Fixed the checking for gpgme Detecting gpgme was broken because it always defined HAVE_GPGME, thus making it mandatory. Now HAVE_GPGME will only be defined if gpgme is available 2007-04-14 Stephane Bisinger Corrected a centericq.h in a centerim.h Revert "Port/rewrite of the captcha patch for centericq [1]" This reverts commit c14521f605ba4c854a989a3f31c045262783da10. Revert "Fix to src/Makefile.am for the captcha patch" This reverts commit 16a5ccc2d6a0a97cbd3b9c2c96a2b8269bc06573. Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git 2007-04-04 Pavol Rusnak Fixed GCC warnings/errors 2007-04-04 Stéphane Bisinger Fixed issue #1693244 2007-04-03 Stéphane Bisinger Corrected a bug that prevented the changing of the browser from the options Merge with master Corrected a possible buffer owerflow in src/centerim.cc Improved the checking for .centerim and .centericq folders in src/icqconf.cc 2007-04-02 Mark Pustjens Fix to src/Makefile.am for the captcha patch Merge with git+ssh://mob@repo.or.cz/srv/git/centerim.git#mob Port/rewrite of the captcha patch for centericq [1] [1] http://forum.centericq.de/viewtopic.php?t=793 2007-04-01 Jayjay Updated several documentation files to reflect current status. 2007-03-28 Stéphane Bisinger Reverted status log messages to something a little more verbose. Made the package compile against ncursesw when available 2007-03-28 Pavol Rusnak 2007-03-27 Stéphane Bisinger reduced the text when changing status, according to Feature Request [ 1688383 ]. This text should be made configurable. 2007-03-25 Stéphane Bisinger Modified Makefile to use centerim as filename 2007-03-24 Mark Pustjens Fixed the drop icq requests issues, and fixed the panel resizing. 2007-03-23 Stéphane Bisinger Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git 2007-03-22 Oliver Hohlfeld I started changing some names from CENTERICQ to CENTERIM yesterday. So far I only pushed icqface.cc into the repository. This change will modify the most visible name to CENTERIM ;-) 2007-03-22 David Riebenbauer quick and dirty hack to still support ~/.centericq/ as basedir besides ~/.centerim/ 2007-03-21 Mark Pustjens Added a dummy file to make sure the m4 directory exists. If it is not there, it can cause problems running autogen.sh (it does for me) Changed modified: + Option to drop all icq authorisation requests, configurable using the configuration dialog under anti-spam options * You can now change the width/height of the dialog windows using { } [ and * ]. This is not yet pefect as no redraw is done when a size is changed 2007-03-21 Oliver Hohlfeld Partial history loading refinement Author: Oliver Hohlfeld Email: centerim@ohohlfeld.com 2007-03-21 Thomas Graf Some missing renames... I hope it compiles now... Some renaming 2007-03-21 Julien LEMOINE Fix potential segfault (output of strstr is not checked) 2007-03-21 Julien Lemoine Fix buffer overflow in livejournal support For details : http://lists.grok.org.uk/pipermail/full-disclosure/2007-January/051663.html 2007-03-21 Oliver Hohlfeld Partial history loading in chat mode - cleanup II Partial history loading in chat mode - cleanup Partial history loading in chat mode 2007-03-20 Thomas Graf Some missing renames... I hope it compiles now... 2007-03-20 Thomas Graf Some renaming 2007-03-20 Oliver Hohlfeld 2007-03-19 Oliver Hohlfeld 2007-03-16 Stéphane Bisinger Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git Applied Hakan's patch 2007-03-16 David Riebenbauer Merge with /home/davrieb/git-wc/centerim Merge with /home/davrieb/git-wc/centerim commit 70742bd896fdf89a5866b61bf85893d794b4244b Author: HÃ¥kan Kvist Date: Fri Mar 9 22:02:29 2007 +0100 patch, getting rid of some compiler errors This patch is just for decreasing the number of gcc warnings. Changed initialization order for some classes, variables should be initializated in the same order as they are defined. Changed some destructors to be virtual, since the classes contained some functions that are defined as virtual. Some unused variables removed. Some functions that was declared as having a return value did not return a value. Dumping the output (stdin and stdout) of make before my changes generated a file with 4433 lines. After these changes the log file with 2329 lines. Flags used when compiling was: CXXFLAGS="-O0 -pedantic -Wall" CFLAGS="-O0 -pedantic -Wall" commit 893475d4cb775a38771354686ff5630af3725c3e Merge: 08a16b1ac65408bfc658ab18ba03c34005b70cd6 32c5d537b7a6d999782a31027d1c6753c9264a7b Author: David Riebenbauer Date: Thu Mar 15 20:11:34 2007 +0100 Merge with git://repo.or.cz/centerim.git commit 32c5d537b7a6d999782a31027d1c6753c9264a7b Author: Stéphane Bisinger Date: Tue Mar 13 19:10:06 2007 +0000 Made link flags variable depending on selected protocols, eliminated some warnings commit 08a16b1ac65408bfc658ab18ba03c34005b70cd6 Author: David Riebenbauer Date: Tue Mar 13 16:59:54 2007 +0100 configure.ac: compare with test rather than without commit 827ea51d89fa903afc4f394803bfd35ae03bf872 Author: David Riebenbauer Date: Tue Mar 13 16:42:55 2007 +0100 only display message about checking for gpgme if we really do don't fail if no gpgme-config is found commit 56d56722693aba24c966b08b02edacfe193c4b06 Author: David Riebenbauer Date: Tue Mar 13 15:32:27 2007 +0100 make it possible to disable gpgme commit d3cf844d0a883aecb9ac6cefc0ba75e31e3c6a9f Author: Stéphane Bisinger Date: Mon Mar 12 23:45:32 2007 +0000 Corrected order of subdirs which prevented a correct build commit f762c548b817eff7b53c1b6a6071b17b14c8586f Author: Stéphane Bisinger Date: Mon Mar 12 23:12:53 2007 +0000 Reverted some changes commit ffe847a9ebb5dfe981680fe7a8d9e5cc7f127059 Author: Stéphane Bisinger Date: Mon Mar 12 22:35:39 2007 +0000 Made build of subdirectories conditional 2007-03-16 HÃ¥kan Kvist patch, getting rid of some compiler errors This patch is just for decreasing the number of gcc warnings. Changed initialization order for some classes, variables should be initializated in the same order as they are defined. Changed some destructors to be virtual, since the classes contained some functions that are defined as virtual. Some unused variables removed. Some functions that was declared as having a return value did not return a value. Dumping the output (stdin and stdout) of make before my changes generated a file with 4433 lines. After these changes the log file with 2329 lines. Flags used when compiling was: CXXFLAGS="-O0 -pedantic -Wall" CFLAGS="-O0 -pedantic -Wall" 2007-03-15 David Riebenbauer Merge with git://repo.or.cz/centerim.git 2007-03-13 Stéphane Bisinger Added header files First attempt to correct visualization of UTF-8 characters Made link flags variable depending on selected protocols, eliminated some warnings 2007-03-13 David Riebenbauer configure.ac: compare with test rather than without only display message about checking for gpgme if we really do don't fail if no gpgme-config is found make it possible to disable gpgme 2007-03-13 Stéphane Bisinger Corrected order of subdirs which prevented a correct build Reverted some changes 2007-03-12 Stéphane Bisinger Made build of subdirectories conditional 2007-03-09 centerim-dev Changed initialization order for some classes, variables should be initializated in the same order as they are defined. Changed some destructors to be virtual, since the classes contained some functions that are defined as virtual. Some unused variables removed. Some functions that was declared as having a return value did not return a value. Dumping the output (stdin and stdout) of make before my changes generated a file with 4433 lines. After these changes the log file with 2329 lines. Flags used when compiling was: CXXFLAGS="-O0 -pedantic -Wall" CFLAGS="-O0 -pedantic -Wall" 2007-03-02 David Riebenbauer change the project and executable name to centerim 2007-02-25 HÃ¥kan Kvist Compiler warnings when compiling centericq Hello I think that centericq would benefit of getting the number of compiler warnings minimized when compiling with the options -Wall -pedantic (with gcc/g++). This would hopefully improve the quality of the code, and hopefully get rid of some memory leaks. Enabling these today will print out ALOT of thingies that gcc could be improved. I have created a small patch wich makes it possible to compile with the -pedantic flag (attatched). regards HÃ¥kan Patch attempting to take care of some memory errors David found an error in my patch (you shouldn't do delete on a void*), and have allready reverted that particular change in the repositry. Attatched patch registers a callback for objects of type icqcontact, so that elemnts of this type gets properly deallocated (wtih delete). 2007-02-25 David Riebenbauer Revert the change to delete in this one place. It triggers a compiler warning and doesn't seem to make a difference anyway. add dummy.c to sources to avoid failure when attempting to build without libmsn 2007-02-24 HÃ¥kan Kvist Checked couplig of malloc with free, new with delete and new[] with delete[] 2007-02-23 Stéphane Bisinger Fixed failure when build with aim and irc disabled. Updated the md5 library Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git 2007-02-23 Andreas Niederl Patched make dist, not it works 2007-02-21 David Riebenbauer remove EXTRA_DIST from kkconsui/Makefile.am this should stop make dist from failing 2007-02-21 Stéphane Bisinger Merge with git+ssh://sb@repo.or.cz/srv/git/centerim.git 2007-02-21 David Riebenbauer make git ignore "some" generated files rename all configure.in to configure.ac This avoids some odditties on Debian which chooses the autoconf version by looking at each filename 2007-02-21 Andreas Niederl Fix build problems with openssl. I found the source of my ssl-related problems: --with-openssl had 'no' as default value in the top configure.ac, so --with-ssl chose gnutls but the other configure scripts in connwrap and libgadu wanted to build with openssl. I've attached a patch which fixes this by removing the default 'no' to with-openssl. Additional changes: * --with-gpgme typo * reordered ssl output * with_ssl=no as default for connwrap and libgadu, so consistent behaviour is guaranteed * unconditional AC_PROG_CXX in libgadu, libjabber and libyahoo2 for fixing the conditional errors when built without one of those libs 2007-02-19 Stéphane Bisinger Updated help strings, corrected a spelling error 2007-02-17 Stéphane Bisinger Updated kkstrtext/configure.in to newer syntax. Moved it to kkstrtext/configure.ac . Added a line that copies config.rpath from the main directory in kkstrtext, needed for the AM_ICONV_LINK macro 2007-02-15 David Riebenbauer update the changelog with my changes commit po files with updated line numbers add md5.h to the distributed files use cd and cd - instead of pushd and popd pushd and popd don't seem to be available in all shells 2007-02-14 David Riebenbauer don't distribute mkinstalldirs any more b ecause a current automake doesn't need it any more 2007-02-13 David Riebenbauer bump version to 4.22.0 Merge branch 'master' of /home/davrieb/src/centericq/git/centericq Merge with external-patches seconds_in_timestamps by Sebastien Delafond Add user setting to display timestamps up to the second. 2007-02-12 David Riebenbauer jabber_503.dpatch.dpatch by Charles Plessy copied from http://forum.centericq.de/viewtopic.php?p=2295&sid=74c3dc27a23192ccc07a8af8b0a4a758 which says "While connecting to server, centericq requests agents list, but due to this feature is deprected, recieves 503 error, thus breaking connection. " 2006-12-31 David Riebenbauer apply patch to fix segv in "MSG" recv in msn 2006-12-28 David Riebenbauer applied patch from to fix segv in libjabber when registering new account fix buffer overflow in VGETSTRING macro by replacing vsprintf by vsnprintf apply patch from "Steve Langasek" to fix remotely segfaultable DOS apply patch from "Steve Langasek" to fix memory handling clean-ups Use sys/statfs.h instead of sys/mount.h on Hurd Fix endianess errors (may allow remote attackers to cause a denial of service), CAN-2005-2448 Fix memory alignment errors (may allows remote attackers to cause a denial of service (bus error) on certain architectures such as SPARC via an incoming message, CAN-2005-2370 Fix Multiple integer signedness errors (may allow remote attackers to cause a denial of service or execute arbitrary code.), CAN-2005-2369 apply patch to fix search/add segfault on amd64 apply patch from Andreas Jochens to fix amd64 buid problem replace 'esc' msg by 'esc-esc' Fix typo in --help command 2006-12-28 Julien LEMOINE Allow user to select HTTP browser 2006-12-28 Romain FRANCOIS add more emacs bindings (c-u, c-k, ...) 2006-12-28 David Riebenbauer This patch makes centericq not close the connection when it receives a failure unrelated to authentication. show info about the protocol in the contact list. show the protocol as in [p] nickname instead of the status [s] nickname apply centericq-libmsn.patch which updates the included version of libmsn 2006-12-26 David Riebenbauer Merge with external-patches 2006-12-24 David Riebenbauer Merge with external-patches 2006-12-23 David Riebenbauer some fixes to make autotools work 2006-12-16 David Riebenbauer fixes some automake related files new configure.ac rm configure.in add an autogen.sh Patch © 2006 Mark Pustjens remove another round of autogenerated files remoce superfluous Makefile.in remove some autogenerated files from libmsn 2006-12-15 David Riebenbauer Merge with /home/davrieb/src/centericq/git/libyahoo2 prepare merge with centericq Merge with /home/davrieb/src/centericq/git/libmsn Prepare merge with centericq Merge with /home/davrieb/src/centericq/git/libjabber prepare to merge with centericq 2006-12-15 David Riebenbauer Merge with /home/davrieb/src/centericq/git/libicq2000/ prepare merge with centericq Merge with /home/davrieb/src/centericq/git/libgadu prepare merge with centericq Merge with /home/davrieb/src/centericq/git/kksystr prepare to merge with centericq 2006-12-14 David Riebenbauer Merge with /home/davrieb/src/centericq/git/kkstrtext prepare merge to centericq Merge with /home/davrieb/src/centericq/git/kkconsui prepare merge with centericq Merge with /home/davrieb/src/centericq/git/firetalk prepare merge with centericq Merge with /home/davrieb/src/centericq/git/connwrap prepare merge mv all files to the connwrap dir 2006-01-02 konst amd64 jab auth patch 2005-09-02 konst *** empty log message *** 2005-08-31 konst "" 2005-08-29 konst "" "" "" "" 2005-08-28 konst *** empty log message *** *** empty log message *** 2005-08-26 konst *** empty log message *** "" "" "" "" "" 2005-08-25 konst logs in after the protocol change 2005-07-08 konst *** empty log message *** 2005-05-23 konst *** empty log message *** *** empty log message *** 2005-05-20 iulica fix double free bug 2005-05-09 konst *** empty log message *** 2005-05-06 konst *** empty log message *** 2005-05-02 konst *** empty log message *** 2005-04-14 konst *** empty log message *** 2005-02-19 konst "" "" 2005-02-14 iulica removed the chat cycle hotkeys fix for chat cycle 2005-02-13 iulica Chat cycling fixed inconsistency about close fullscreen event view hotkey undo changes 2005-02-12 konst "" 2005-02-10 konst "" "" "" "" *** empty log message *** 2005-02-03 konst *** empty log message *** 2005-02-01 konst "" "" 2005-01-31 konst "" "" 2005-01-30 konst "" "" "" 2005-01-28 konst "" 2005-01-27 konst "" "" "" "" "" 2005-01-26 konst *** empty log message *** "" "" "" 2005-01-25 konst "" "" "" "" "" 2005-01-24 konst "" "" 2005-01-23 konst "" "" "" "" 2005-01-19 konst *** empty log message *** 2005-01-07 konst "" "" 2004-12-26 konst "" "" 2004-12-25 konst "" "" "" "" 2004-12-24 konst "" "" "" 2004-12-21 konst "" "" "" "" "" "" "" *** empty log message *** 2004-12-20 konst *** empty log message *** 2004-11-12 konst "" "" 2004-11-11 konst "" 2004-11-10 konst "" "" "" "" "" "" "" '' '' '' 2004-11-09 konst *** empty log message *** 2004-10-07 konst *** empty log message *** 2004-09-28 konst *** empty log message *** "" "" 2004-08-10 konst "" "" "" "" 2004-08-05 konst *** empty log message *** "" "" "" "" 2004-08-04 konst "" "" "" "" *** empty log message *** *** empty log message *** *** empty log message *** 2004-07-31 konst "" "" "" "" "" "" "" 2004-07-30 konst *** empty log message *** 2004-07-29 konst "" 2004-07-27 konst "" 2004-07-21 konst "" 2004-07-20 konst "" 2004-07-19 konst "" "" 2004-07-18 konst "" 2004-07-09 konst "" 2004-07-03 konst "" 2004-06-30 konst *** empty log message *** 2004-06-29 konst "" "" "" "" "" "" *** empty log message *** 2004-06-28 konst "" "" "" *** empty log message *** "" "" 2004-06-24 konst "" "" "" "" 2004-06-21 konst "" "" "" 2004-06-19 konst "" "" 2004-06-18 konst "" "" "" "" "" "" 2004-06-17 konst "" "" 2004-06-14 konst *** empty log message *** 2004-06-12 konst "" "" 2004-06-11 konst "" 2004-06-10 konst *** empty log message *** "" "" "" "" "" "" "" Initial revision 2004-04-13 konst *** empty log message *** "" "" "" "" "" 2004-04-11 konst "" "" 2004-04-10 konst *** empty log message *** 2004-04-04 konst "" 2004-04-01 konst "" 2004-03-31 konst *** empty log message *** 2004-03-28 konst "" "" 2004-03-27 konst "" 2004-03-22 konst "" "" "" 2004-03-20 konst "" 2004-03-17 konst "" 2004-03-15 konst *** empty log message *** *** empty log message *** 2004-03-13 konst "" 2004-03-10 konst "" 2004-03-09 konst "" 2004-03-07 konst "" "" 2004-03-03 konst *** empty log message *** 2004-02-26 konst "" 2004-02-22 konst "" 2004-02-21 konst *** empty log message *** 2004-02-20 konst "" 2004-02-19 konst *** empty log message *** 2004-02-17 konst "" 2004-02-15 konst "" "" *** empty log message *** 2004-02-11 konst *** empty log message *** "" *** empty log message *** Initial revision 2004-02-08 konst "" 2004-02-04 konst *** empty log message *** *** empty log message *** msn is back 2004-02-01 konst "" "" 2004-01-31 konst *** empty log message *** 2004-01-30 konst "" "" 2004-01-27 konst "" "" *** empty log message *** *** empty log message *** Initial revision 2004-01-16 konst *** empty log message *** *** empty log message *** 2004-01-15 konst *** empty log message *** *** empty log message *** *** empty log message *** "" "" "" "" *** empty log message *** 2003-12-11 konst "" "" "" 2003-12-05 konst "" "" 2003-11-26 konst "" 2003-11-24 konst "" "" 2003-11-23 konst "" "" "" 2003-11-22 konst "" "" 2003-11-21 konst "" "" 2003-11-07 konst "" "" 2003-11-06 konst "" "" 2003-11-05 konst yahoo search and groups operations reflection yahoo search and groups operations reflection *** empty log message *** "" "" "" "" 2003-10-31 konst "" 2003-10-26 konst *** empty log message *** 2003-10-21 konst "" "" "" 2003-10-20 konst '' "" "" "" "" 2003-10-16 konst '' 2003-10-15 konst '' 2003-10-14 konst '' '' 2003-10-13 konst '' '' 2003-10-12 konst '' 2003-10-11 konst aim buddy-list, lj friends add/remove 2003-10-06 konst *** empty log message *** 2003-10-05 konst '' '' '' '' '' '' 2003-10-03 konst *** empty log message *** 2003-10-02 konst *** empty log message *** "" 2003-10-01 konst *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** livejournal plus some yahoo hacks 2003-09-30 konst "" "" "" "" *** empty log message *** 2003-09-28 konst *** empty log message *** yahoo is back new auth mechanism 2003-09-26 konst ljhook.cc *** empty log message *** *** empty log message *** 2003-09-12 konst '' 2003-09-11 konst '' '' 2003-08-28 konst *** empty log message *** 2003-08-21 konst "" 2003-07-25 konst *** empty log message *** 2003-07-24 konst *** empty log message *** *** empty log message *** *** empty log message *** "" 2003-07-22 konst "" "" 2003-07-20 konst *** empty log message *** 2003-07-19 konst *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** "" 2003-07-18 konst "" *** empty log message *** 2003-07-17 konst *** empty log message *** "" "" 2003-07-16 konst 4.9.5 released 2003-07-13 konst *** empty log message *** "" 2003-07-12 konst RSS related stuff was added "" 2003-07-07 konst "" "" "" "" 2003-07-05 konst *** empty log message *** *** empty log message *** 2003-06-26 konst "" "" 2003-06-25 konst *** empty log message *** 2003-06-24 konst "" "" 2003-06-20 konst "" 2003-06-19 konst *** empty log message *** 2003-06-02 konst some fixes were made *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** 2003-05-21 konst *** empty log message *** 2003-05-14 konst *** empty log message *** 2003-05-12 konst *** empty log message *** *** empty log message *** 2003-05-11 konst *** empty log message *** 2003-05-10 konst *** empty log message *** 2003-05-09 konst *** empty log message *** the find/add problem was fixed 2003-05-08 konst *** empty log message *** 2003-05-07 konst *** empty log message *** *** empty log message *** 2003-05-06 konst *** empty log message *** *** empty log message *** *** empty log message *** 2003-05-05 konst *** empty log message *** msn nicknames find/add problem fixed Mark Verboom's patch and Jabber users read 2003-04-23 konst *** empty log message *** *** empty log message *** 2003-04-22 konst *** empty log message *** *** empty log message *** 2003-04-21 konst *** empty log message *** *** empty log message *** 2003-04-20 konst *** empty log message *** 2003-04-19 konst *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** 2003-04-18 konst irc reporting improved *** empty log message *** IP binding works now for all the IMs *** empty log message *** *** empty log message *** 2003-04-17 konst a small build fix *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** a long awaited commit after a long time of inactivity 2003-04-02 konst ported to cygwin ported to cygwin ported to cygwin ported to cygwin 2003-01-31 konst "" 2003-01-28 konst '' 2003-01-27 konst "" "" '' 2003-01-22 konst "" '' 2003-01-20 konst "" "" '' 2003-01-19 konst '' '' '' '' 2003-01-18 konst "" "" '' '' '' 2003-01-16 konst "" "" 2003-01-15 konst "" *** empty log message *** *** empty log message *** 2003-01-10 konst *** empty log message *** 2003-01-06 konst *** empty log message *** "" '' 2003-01-05 konst '' '' '' 2003-01-04 konst *** empty log message *** 2002-12-30 konst '' '' 2002-12-29 konst '' 2002-12-28 konst *** empty log message *** 2002-12-27 konst '' "" "" 2002-12-26 konst '' 2002-12-23 konst "" "" "" 2002-12-20 konst "" 2002-12-19 konst '' *** empty log message *** "" 2002-12-18 konst "" 2002-12-17 konst "" 2002-12-16 konst "" 2002-12-15 konst '' "" "" 2002-12-14 konst '' '' 2002-12-13 konst "" "" "" "" '' 2002-12-12 konst "" "" "" "" "" "" 2002-12-11 konst '' '' '' "" "" "" "" "" "" '' 2002-12-10 konst '' '' "" "" "" 2002-12-09 konst "" "" "" "" "" "" 2002-12-07 konst *** empty log message *** 2002-12-06 konst groupchat now works just like it should 2002-12-05 konst '' jabber groupchat is almost ready channel manager was removed; the channels stuff is unified now 2002-12-04 konst "" 2002-12-03 konst "" "" "" 2002-12-02 konst "" *** empty log message *** 2002-12-01 konst *** empty log message *** '' '' '' '' 2002-11-30 konst '' '' '' Initial revision '' *** empty log message *** 2002-11-29 konst "" "" 2002-11-28 konst "" "" "" *** empty log message *** 2002-11-27 konst "" 2002-11-26 konst '' "" "" "" 2002-11-25 konst '' '' "" "" *** empty log message *** *** empty log message *** 2002-11-24 konst '' 2002-11-23 konst '' '' '' '' '' '' 2002-11-22 konst "" "" "" "" "" "" "" *** empty log message *** 2002-11-21 konst "" 2002-11-20 konst *** empty log message *** *** empty log message *** "" *** empty log message *** 2002-11-19 konst "" "" "" Initial revision 2002-11-18 konst "" "" "" "" "" 2002-11-15 konst "" 2002-11-14 konst "" 2002-11-12 konst "" '' 2002-11-11 konst "" "" 2002-11-02 konst '' 2002-11-01 konst '' '' 2002-10-31 konst '' '' 2002-10-30 konst '' 2002-10-29 konst '' '' '' 2002-10-28 konst '' '' '' '' 2002-10-27 konst '' 2002-10-24 konst '' '' 2002-10-23 konst '' '' 2002-10-22 konst '' 2002-10-17 konst '' '' '' '' 2002-10-16 konst '' '' '' '' *** empty log message *** 2002-10-15 konst '' '' 2002-10-09 konst '' 2002-10-08 konst '' 2002-10-07 konst '' 2002-10-06 konst '' *** empty log message *** '' '' '' '' 2002-10-04 konst '' '' '' '' '' '' 2002-09-30 konst '' '' 2002-09-26 konst '' 2002-09-24 konst '' '' 2002-09-23 konst '' '' '' '' 2002-09-20 konst '' '' 2002-09-19 konst '' '' 2002-09-17 konst '' 2002-09-13 konst '' '' 2002-09-12 konst '' '' 2002-09-11 konst '' 2002-09-10 konst '' '' 2002-09-09 konst '' '' '' 2002-09-06 konst '' 2002-09-05 konst '' 2002-09-04 konst '' '' 2002-09-03 konst '' '' '' '' '' "" 2002-09-02 konst '' '' '' '' '' 2002-09-01 konst "" "" "" 2002-08-30 konst "" '' '' 2002-08-29 konst *** empty log message *** '' "" 2002-08-28 konst '' '' 2002-08-27 konst '' 2002-08-26 konst '' '' '' '' 2002-08-25 konst '' 2002-08-24 konst '' "" "" 2002-08-22 konst "" "" "" 2002-08-21 konst "" "" "" "" "" 2002-08-20 konst "" "" "" *** empty log message *** 2002-08-19 konst *** empty log message *** *** empty log message *** "" "" "" 2002-08-18 konst "" "" "" 2002-08-17 konst "" "" 2002-08-16 konst "" "" "" "" "" 2002-08-15 konst "" "" "" *** empty log message *** 2002-08-14 konst *** empty log message *** "" "" "" "" 2002-08-11 konst "" 2002-08-10 konst "" 2002-08-09 konst "" "" 2002-08-08 konst "" "" 2002-08-06 konst "" 2002-08-05 konst "" "" 2002-08-02 konst "" 2002-07-31 konst "" "" 2002-07-30 konst "" 2002-07-29 konst "" 2002-07-18 konst "" 2002-07-17 konst "" "" 2002-07-16 konst "" "" "" Fixed a thingie which caused the old gcc to bail out *** empty log message *** "" 2002-07-15 konst "" "" "" "" "" "" 2002-07-14 konst "" 2002-07-13 konst "" "" "" 2002-07-12 konst The new Yahoo! engine was integrated to get the changed protocol work. Initial revision 2002-07-10 konst "" "" 2002-07-09 konst "" "" "" "" Ported to Sun Solaris finally 2002-07-08 konst "" "" 2002-07-06 konst "" "" "" 2002-07-05 konst "" 2002-07-04 konst "" 2002-07-03 konst "" Now compiles with GCC 3.1 without problems. Now compiles with GCC 3.1 without problems. Now compiles with GCC 3.1 without problems. Now compiles with GCC 3.1 without problems. "" "" Fixed a Yahoo bug resulted into adding some crazy nicknames. 2002-07-01 konst "" 2002-06-29 konst *** empty log message *** 2002-06-28 konst "" Some mess in the CVS was taken to order. Hopefully. check for the cvs version was added *** empty log message *** remote occupied and dnd modes fixed "" 2002-06-27 konst Almost finished the support for talking on IRC channels and issuing of irc commands. 2002-06-25 konst The ESC key didn't work correctly in the save find profile action. Fixed a bug with forwarding messages in chat mode. Fixed a bug with forwarding messages in chat mode. 2002-06-21 konst Added a bug instead of fixing an issue. Fixed finally (hope so) :) 2002-06-20 konst The "nicks fetched" flags is cleared now as soon as the IRC adapter is disconnected. 2002-06-17 konst "" 2002-06-13 konst "" 2002-06-11 konst "" 2002-06-09 konst "" 2002-06-05 konst "" "" 2002-06-04 konst "" 2002-06-03 konst Added a whole-irc-net e-mail search function. Implemented the whole-irc-net e-mail search feature. 2002-05-30 konst "" 2002-05-28 konst "" 2002-05-27 konst "" 2002-05-26 konst Fixed a bug in the birthday reminder feature. 2002-05-24 konst "" 2002-05-23 konst Birthday reminders were added. 2002-05-22 konst Added to copy constructor so that title params get copied. *** empty log message *** 2002-05-19 konst "" "" 2002-05-17 konst "" *** empty log message *** 2002-05-15 konst "" 2002-05-14 konst "" 2002-05-13 konst "" 2002-05-11 konst Fixed a small segfault in IRC search results. 2002-05-10 konst "" 2002-05-09 konst Mass-sending of the first message in chat mode was implemented. Chinese translation was updated. IRC name substring search was added. 2002-05-08 konst "" "" "" 2002-05-02 konst *** empty log message *** Migrated to the new and nice colorschemer :) the colorschemer class was added "" 2002-05-01 konst Chat window now doesn't get screwed up because of special characters in messages. Fixed the disk space eating issue. IRC nicks lookup little weirdness was fixed. Optimized the chat mode. Now should work faster. 2002-04-26 konst Chat mode has been implemented. 2002-04-25 konst "" *** empty log message *** 2002-04-24 konst "" 2002-04-23 konst "" *** empty log message *** French and Malaysian translations were added. 2002-04-22 konst Fixed the problem with incorrect CRLF's in ICQ messages. "" Fixed an incorrect STL usage. "" 2002-04-21 konst 4.7.1 release was built 2002-04-20 konst The broken pipe bug was fixed. Fixed the broken pipe thing, and did some other stuff. 2002-04-19 konst Documented the -b parameter. Incorrect STL usage was fixed. 2002-04-18 konst *** empty log message *** CPU hogging in auto-away/na seems to be fixed. 2002-04-17 konst Fixed a message sending from the find results dialog segfault bug. The quick find feature is now available also in multiple contacts selection and find results modes. Made it possible to send messages directly from the find results dialog. Groups moving up and down in the group manager was implemented. 2002-04-16 konst Fixed the IP not showing bug. AIM connection failed messages are now more informative *** empty log message *** 2002-04-15 konst The collapsable groups patch was applied. Sending SMS to oneself bug was fixed. 2002-04-13 konst "" 2002-04-12 konst "" *** empty log message *** Away message request log message was detalized. 2002-04-11 konst "" 2002-04-10 konst IRC away messages reporting was added. IRC away messages are now possible to be fetched. 2002-04-09 konst When an icq contact was re-added after deleting it in the same session, its status wasn't updated and remained offline all the time. Fixed. "" "" 2002-04-08 konst "" "" The "Edit away messages on status change" configuration option was added. Changing status from the command line was implemented. 2002-04-07 konst "" "" "" "" Highlighting items in ignore, visible and invisible lists was implemented. *** empty log message *** Migrated to the new libicq2000, and fixed up some thin places. ICQ visible and invisible lists finally work. Not a big deal, in fact. irc channels load/save was implemented 2002-04-06 konst Channel manager was added, and channel related things such as finding users was re-written. "" 2002-04-05 konst A channel list fetching callback was added. IRC support was improved. Now it's able to show list of channels a user is currently on, as well as splits their info into the e-mail address and about fields. 2002-04-04 konst *** empty log message *** Some fixes against IRC segfaults were made. IRC support was improved. Fixed a bug in the console inactivity time detection. Fixed a bug in the console inactivity time detection. IRC support was improved dramatically. *** empty log message *** 2002-04-03 konst IRC support, an autoaway/autona bugfix. "" 2002-04-02 konst "" 2002-04-01 konst "" "" 2002-03-30 konst "" "" "" 2002-03-28 konst Work zip code is now possible to be edited in the details update dialog. It was also made possible to wrap lines in the actions file with backslashes. 2002-03-27 konst *** empty log message *** 2002-03-26 konst *** empty log message *** Fixed another little and weird resize segfault. ChangeLog was updated, preparing to a new release. "" Configuration and account manager dialogs' incorrect behaviour, AIM hook's logged in incorrect reporting, and wrong disk space checking were fixed. 2002-03-25 konst "" "" 2002-03-24 konst SMTP server's address not saving bug was fixed. TODO was extended with some problems experienced at home :) 2002-03-23 konst Yahoo and MSN details get updated now with "Retrieve". Find/add and Edit user's details dialogs' bugs were fixed. 2002-03-22 konst Fixed the yahoo library's inability to report the invalid username/password situation. Cleared out the unused timer_reconnect variables. Rolled back to older version. *** empty log message *** 2002-03-21 konst *** empty log message *** Relaxed re-connect timing was introduced to avoid the turboing problem when centericq is left alone trying to connect over and over again. 2002-03-20 konst "" "" 2002-03-19 konst "" 2002-03-18 konst Ukrainian translation was added. A bug with LF symbols in user info was fixed. 2002-03-17 konst *** empty log message *** 2002-03-15 konst "" A little away msgs reading bug fix. HD access reduced with moving away msgs reading to another routine. Fixed the disk space checking routine, so that FreeBSD users can be happy now. "" Some additional checks were added to aimhook to avoid segfaults. 2002-03-14 konst Added port numbers and servers addresses to README. "Dropped in" users are now added to Yahoo or AIM contact list temporary now, so that we can see their actual status. Updated README, and added a check for freebsd used to determine whether it's needed or not to include *bsd systems lack. *** empty log message *** a little bug in the script *** empty log message *** Minor changes. Added automatic resolve for newly added contacts. Removed some unused crap, and added the cuthtml function. Started implementing support for the AIM TOC protocol. First commit of the stuff. Initial revision "" 2002-03-12 konst *** empty log message *** 2002-03-11 konst *** empty log message *** iconv() wrapper was added. Translation between CP1251 and KOI8-R is now done with iconv() if present. Incorrect displaying of contact list in group mode 2 was fixed. Disk space check was added. *** empty log message *** 2002-03-10 konst *** empty log message *** 2002-03-09 konst *** empty log message *** Added a configure check for libiconv, if any :) 2002-03-08 konst all your base ;) *** empty log message *** 2002-03-07 konst *** empty log message *** *** empty log message *** ifstream::attach() call removed. damn the standard. A display area in textbrowser became one char wider :) MSN friendly get unmimed now. *** empty log message *** *** empty log message *** *** empty log message *** 2002-03-06 konst *** empty log message *** *** empty log message *** *** empty log message *** "" "" 2002-03-05 konst *** empty log message *** *** empty log message *** breakintolines() fix. *** empty log message *** *** empty log message *** *** empty log message *** 2002-03-04 konst *** empty log message *** *** empty log message *** *** empty log message *** Some "string" type passing speed-ups were made. "" "" 2002-03-03 konst "" "" "" 2002-03-01 konst *** empty log message *** History leaks problem seems to be fixed now ;) *** empty log message *** *** empty log message *** *** empty log message *** 2002-02-28 konst *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** Now the status bar and log window contents are saved during the terminal window resize. *** empty log message *** "" 2002-02-27 konst *** empty log message *** Segfault on xterm resize event was fixed. Contact list and log window sizes now depend on the terminal window size. 100% CPU load on registration errors was fixed. 2002-02-26 konst "" "" "" 2002-02-25 konst Updated ChangeLog, README and the man page. *** empty log message *** Applied the patch for transparency and "all protocols". Commented out the line that seems to cause problems with reading incoming events. 2002-02-24 konst "" "" 2002-02-23 konst "" "" "" *** empty log message *** Passing online events to external actions works well now. Added URL sending from the command line and color schemes descriptions to the README. New mail messages timestamping added. 2002-02-22 konst "" "" Implemented command line events queuing. Updated README. Fixed some auto-respond issues. *** empty log message *** 2002-02-21 konst *** empty log message *** *** empty log message *** 2002-02-20 konst *** empty log message *** Feature to auto-respond and process incoming events with external programs was added. todo: implement external actions 2002-02-19 konst *** empty log message *** Finally applied the patch for Cyrillic in MSN. Fixed the problem with sockets left unclosed. 2002-02-18 konst Tried to speed up incoming messages reading. Probably managed. "" 2002-02-16 konst "" *** empty log message *** 2002-02-15 konst Fixed a possibility to update ICQ nicknames. 2002-02-14 konst "" 2002-02-13 konst Self details and our contact on the list issue was fixed. Updated TODO and README. "https://" URLs are now fetched from the context as well. 2002-02-08 konst '' logging problem got fixed once again 2002-02-07 konst '' Fixed the one-line-away-message-storing bug. 2002-02-06 konst Fixed some away messages issues. It's getting closer to being perfect :) Setting and fetching away messages was finally implemented. 2002-02-05 konst *** empty log message *** Age range search parameter now works fine. Login processes were taken in account too in the lastkeypress() routine. Zip code incorrect update/show was fixed. Online sound didn't work. Fixed. 2002-02-04 konst *** empty log message *** Fixed a minor issue in the logger related to statuses written in inverse order. 2002-02-01 konst *** empty log message *** *** empty log message *** Fixed the RH62 segfault. Dammit. '' 2002-01-31 konst Fixed some kind of a minor issue. 2002-01-30 konst Some changes of more or less cosmetic kind were made. *** empty log message *** Support for "You were added" messages was added. Authorization request packets parsing was fixed. 2002-01-29 konst E-mail express messages support was added. 2002-01-28 konst Fixed the RH62 STL incompatibility issue. *** empty log message *** 2002-01-27 konst Some pre-release actions were taken. 2002-01-26 konst *** empty log message *** Users' local time is now displayed correctly. 2002-01-25 konst *** empty log message *** 2002-01-24 konst Russian PO translation was updated. Empty authorization request messages bug in libicq2000 was fixed. *** empty log message *** Quickfind segfault was fixed. 2002-01-23 konst Authorization messages showing up on history was fixed. It only displayed empty lines before. 2002-01-22 konst Fixed a minor bug in groups mode 2. Group modes 1 and 2 were implemented. 2002-01-21 konst Fixed a minor quickfind bug. It couldn't point to the last item in the contact list. *** empty log message *** Timezone displaying was added. Tried to speed up events reading, updated ChangeLog and README. 2002-01-19 konst User info is displayed in a more detailed way now, with interest categories and background names. Personal details update now works. 2002-01-18 konst *** empty log message *** Some small fixes were made. Event log was implemented. 2002-01-17 konst Fixed a little icq.mirabilis.com issue :) Languages are now displayed on the user info dialog. White pages search was implemented. Now it's possible to specify another server for ICQ. Invisible mode was fixed. FAQ was updated. 2002-01-14 konst '' 2001-12-27 konst *** empty log message *** 2001-12-23 konst '' 2001-12-20 konst MSN connection establishing code was a bit tweaken. Can fix the segfaults :) *** empty log message *** Background and interests information is now displayed. 2001-12-19 konst *** empty log message *** Login parameters are now re-read on exit from the account manager dialog. Details and gender are now fetched well, lastseen and lastIP parameters are now being set correctly as well. 2001-12-18 konst "" 2001-12-17 konst "" 2001-12-14 konst "" "" Now works well with Barnaby's recent ickle modifications. Had to extend the set of descriptors being select()'ed. '' 2001-12-13 konst "" "" "" "" 2001-12-12 konst "" "" "" 2001-12-11 konst "" "" Yahoo! empty messages bug was fixed. sms.wav was added. 2001-12-10 konst Status change bugs were fixed. 2001-12-09 konst '' '' *** empty log message *** '' *** empty log message *** '' 2001-12-08 konst *** empty log message *** *** empty log message *** *** empty log message *** 2001-12-07 konst Two methods were marked "const" SMS support was added. History search now works well. "" "" "" "" "" 2001-12-06 konst Authorization mechanism seems to work now. Russian win->koi translation has been re-implemented in yahoo hook. Event system was completely rewritten. Now I'm quite proud of the C++ design I made instead of an ugly previous implementation. Though gotta test this stuff a lot. 2001-12-05 konst *** empty log message *** *** empty log message *** *** empty log message *** 2001-12-04 konst *** empty log message *** Events dynamic pointers issue was taken in account. 2001-12-03 konst '' Started migrating to icq2000 protocol. Goes well. 2001-12-01 konst '' 2001-11-30 konst *** empty log message *** Two bugs were fixed. One with segfault on attempt to browse history, and second was related to passwords remembering. 4.2.0 release preparations. 2001-11-29 konst '' 2001-11-28 konst "" refresh() call was added to textinputline class so that screen contents are up-to-date. Fixed a textinputline bug. 2001-11-27 konst Color hightlight for different IM protocols in multi selection box was implemented. Sounds for every protocol and every contact were repaired. KOI8-win1251 conversion was added to MSN and Yahoo protocols. Connections initialization messages were added to MSN protocol module. Adding info cards was moved to the find/add dialog. Context menu was repaired so that now "Remove contact" item does exist on it. Info cards are now possible to put to any group. *** empty log message *** '' *** empty log message *** 2001-11-26 konst Fixed a segfault on adding a yahoo contact. MSN support now works more or less stable. Status bar looks better, showing statuses for all of three supported IM networks. 2001-11-25 konst added msnhook 2001-11-24 konst *** empty log message *** 2001-11-23 konst MSN engine segfaults. It's natural. MSN messenger support added. Untested. Reorganized icq hook code. 2001-11-22 konst *** empty log message *** 2001-11-21 konst *** empty log message *** Removed some more "::" *** empty log message *** 2001-11-20 konst Restructured the hooks code. ICQ reconnect now seems to work fine. Fixed redraw() being disabled in texteditor. And removed "::" from calls to tolower and toupper from dialogbox. 2001-11-19 konst started the abstract class implementation 2001-11-16 konst '' '' '' 2001-11-15 konst '' '' '' '' '' *** empty log message *** 2001-11-14 konst '' Find/add users improved. now it can add yahoo users. *** empty log message *** *** empty log message *** Still working on multiple IM protocols support. 2001-11-13 konst '' '' 2001-11-12 konst Started implementing yahoo support. Goes very well so far. 2001-11-11 konst '' 2001-11-09 konst insert() now works correctly with blocks containing tab chars. *** empty log message *** 2001-11-08 konst '' Replaced uin and nonicq pair with one descriptive structure everywhere. A lot of bugs appearing is expected. 2001-11-07 konst *** empty log message *** 2001-11-06 konst Smart check for direct or through server mode added. 2001-11-04 konst *** empty log message *** *** empty log message *** *** empty log message *** *** empty log message *** 2001-11-01 konst *** empty log message *** 2001-10-31 konst *** empty log message *** *** empty log message *** *** empty log message *** 2001-10-30 konst '' '' '' 2001-10-29 konst *** empty log message *** *** empty log message *** 2001-10-26 konst CVS sync script was updated. The "already on the list while on not-in-list folder" bug was fixed. 2001-10-25 konst cvs sync script was added *** empty log message *** Fixed some problems. 2001-10-24 konst '' *** empty log message *** Highlight issues fixed once again :) Highlight issues fixed once again :) fixed a lot of quotes related issues. now should work excellent :) fixed a lot of quotes related issues. now should work excellent :) '' 2001-10-23 konst '' '' '' 2001-10-22 konst '' '' '' 2001-10-19 konst *** empty log message *** Made some updates to menu related code and to the new implementations of textinputline and fileselector. Moved the UI code to the new implementations of textinputline and fileselector classes. 2001-10-18 konst At last wrote new implementations of textinputline and fileselector classes. Started migrating to the new implementation of textinputline and fileselector. Updated the doc. 2001-10-17 konst Fixed a bug with a contact that had unknown status spoiled all the look of contact list with groups. Finalized the first very draft version of README :) 2001-10-16 konst Applied patch from Kapuzin which added dialogbox::addautokeys() method. A check for ncurses lib was added to configure.in. Patch from kapuzin was applied, so now all the dialogs have hot keys. Fixed the bug with "update details" dialog popping up over others. 2001-10-15 konst *** empty log message *** 2001-10-12 konst filefind() added. *** empty log message *** 2001-10-09 konst kxicq2 and gnomeicu added to the list of icq client data formats supported by the cicqconv script. "Send contacts" item added to the context menu. The "Update user's details" dialog was fixed. Now Enter can be pressed any number of times without any bad effects. Now "add to contact list" function asks to select a group, if the corresponding facility is enabled. 2001-10-08 konst *** empty log message *** Some segfaults caused by missing checks for open files were fixed. 2001-10-07 konst *** empty log message *** Added Makefile.am's. Updated man page and ChangeLog for releasing the 4.0.0 version. 2001-10-05 konst *** empty log message *** Romanian PO updated (thanks, Ovidiu :). The first version of contact list conversion script has been added. 2001-10-04 konst Configuration dialog was re-arranged a bit. *** empty log message *** 2001-10-03 konst Russian PO file updated. icqhook::disconnect() was fixed a little bit. *** empty log message *** *** empty log message *** Fixed FreeBSD related problems. At least I hope so. It worked just great with my gettext 0.10.35. Timezones support added. Update and display functions. *** empty log message *** 2001-10-02 konst groups, quick hide/show offline switch, and much more.. 2001-10-01 konst Bug with the reconnect timer seems now to be fixed. *** empty log message *** *** empty log message *** The contact groups facility is almost done. 2001-09-30 konst Continued implementing the groups. Basic internal logic support for groups was implemented. 2001-09-27 konst *** empty log message *** Contacts sending feature was added. 2001-09-26 konst *** empty log message *** *** empty log message *** A minor interface change was made. It now checks if we're online before asking whether user should be notified about being added or not. Polish PO updated. Invisible list support was added. 2001-09-25 konst FAQ and TODO documents were updated. Started implementing the invisible list feature. Added Spanish docs. 2001-09-24 konst A lot of brand new changes, such as whitepages search, and work section update possibility. 2001-09-18 konst string2key() function was fixed. It worked absolutely incorrectly. 2001-09-14 konst Some minor GCC3 related changes were made, I guess :) Some minor GCC3 related changes were made, I guess :) Some minor GCC3 related changes were made, I guess :) 2001-09-03 konst Minor bug in kkconsui has been fixed. It allowed control chars to be displayed. 2001-08-23 konst *** empty log message *** removed from vcs control 2001-08-21 konst Unificated the message sending function. Fixed some known problems, such as not installing the man page, added basic support for screen resize in xterm. Some cosmetic changes were also made. *** empty log message *** 2001-08-20 konst removed from vcs control removed from vcs control 2001-08-19 konst Some updates were made. internal update :) 2001-08-18 konst Some iscntrl() fix related things were modified. removed from vcs control Updated some namespaces related issues. Some updates were made. ktool:: namespace prefix was removed, particulary so that the library compiles well with C++ without namespaces support. Some updates were made. ktool:: namespace prefix was removed, particulary so that the library compiles well with C++ without namespaces support. Some updates were made. ktool:: namespace prefix was removed, particulary so that the library compiles well with C++ without namespaces support. 2001-08-17 konst lots of pre-release changes were made 2001-08-14 konst removed from vcs control *** empty log message *** removed from vcs control 2001-08-09 konst there is no need to pass strdupped file ids to texteditor::load anymore 2001-08-06 konst Some updates were made. 2001-08-03 konst Initial revision basic bidi support basic bidi support basic bidi support 2001-07-03 konst *** empty log message *** *** empty log message *** 2001-06-30 konst Mail checking setting. ncurses raw() mode *** empty log message *** *** empty log message *** *** empty log message *** 2001-06-27 konst The raw() ncurses library call was added to kinterface() so that now all the shit like Ctrl-Z, Ctrl-C and other are now blocked. A bunch of small changes. 2001-06-07 konst Snapshot release ChangeLog updates were done. Manual page has been added. *** empty log message *** Fixed a bug with some messages' not going to history, being lost, etc.. 2001-06-04 konst *** empty log message *** removed include/common.h removed src/common.cc 2001-06-03 konst GNU copyright notice was added to every source file. GNU copyright notice was added to every source file. GNU copyright notice was added to every source file. Some syntax (comments) highlight problems were fixed. *** empty log message *** Migrated to the new incarnation of ktools :) Initial revision Initial revision Initial revision 2001-06-02 konst *** empty log message *** GNU copyright notice was added to every source file as the FSF Vice President requested. 2001-05-15 konst *** empty log message *** *** empty log message *** 2001-05-14 konst 3.29.12 major feature improvement release 2001-05-12 konst quickfind feature invoked with alt-s was improved now it performs case insensitive search also it's possible to use it in multiple contact selection mode 2001-05-11 konst changes include facility to display both real and intranet IPs of a user message postponing on ESC searching for substrings in events history date/time representation taking from locale visible list is now works great. because of being fixed. 2001-05-05 konst *** empty log message *** Lotta useful changes, such as URL view, msg split, etc. 2001-04-17 konst 3.22.8 release 2001-04-15 konst Settings sclerosis and empty msg segfault were fixed. Search on "/" has been added. Czech translation has been added. Sort order changed. Now the contact list is sorted by lastread. 2001-04-12 konst removed po/Makefile.am 2001-04-08 konst *** empty log message *** 2001-04-07 konst *** empty log message *** Initial revision centerim-4.22.10/config.guess0000755000175000001440000013033211473011436012725 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. timestamp='2010-07-29' # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' HUP INT TERM # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU/*) eval $set_cc_for_build cat <<-EOF > $dummy.c #include #ifdef __UCLIBC__ # ifdef __UCLIBC_CONFIG_VERSION__ LIBC=uclibc __UCLIBC_CONFIG_VERSION__ # else LIBC=uclibc # endif #else # ifdef __dietlibc__ LIBC=dietlibc # else LIBC=gnu # endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo cris-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo frv-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: centerim-4.22.10/missing0000755000175000001440000002623311473011436012010 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: centerim-4.22.10/README0000644000175000001440000017137211461606612011301 00000000000000CenterIM documentation. This document was originally written by Konstantin Klyagin . 2001-2005 Currently modified by the CenterIM community. 2007, version 1.0 Contents -------- 1. Introduction 1.1. Creation history 1.2. Features overview 1.3. Requirements 1.4. First time start 2. IM accounts registration 2.1. ICQ accounts 2.2. Yahoo! accounts 2.3. AIM accounts 2.4. IRC accounts 2.4.1. IRC channels 2.5. Jabber accounts 2.5.1. Jabber groupchat conferences 2.6. LiveJournal 2.7. Gadu-gadu 2.8. MSN 2.9. Updating details 3. User interface 3.1. The ESC key 3.2. The main screen 3.3. Menus 3.4. Dialogs 3.5. Hotkeys in dialogs 3.6. Some UI tips 4. Configuration 4.1. Migrating from other ICQ software 4.2. Event sounds 4.3. Color schemes 4.4. Key bindings 4.5. URL open action (web browser support) 4.6. Hostnames and port numbers (for crazy firewall admins) 4.6.1. ICQ 4.6.2. Yahoo! 4.6.3. AIM TOC 4.6.4. IRC 4.6.5. Jabber 4.6.6. LiveJournal 4.6.7. Gadu-gadu 4.6.8. MSN 4.7. Binding to various IP addresses 5. Online status 5.1. "Auto Away" and "Auto N/A" 6. Contact list 6.1. Finding and adding users 6.1.1. Some useful hints 6.1.2. ICQ search specific modes 6.2. Removing users 6.3. Users' details 6.4. Groups of contacts 7. Sending and receiving events 7.1. Messages 7.2. URLs 7.3. SMSes 7.4. Contacts 7.5. Files 7.6. E-mail express messages 7.7. WebPager messages 7.8. Away messages 7.9. Events history 8. Ignore, visible and invisible lists 8.1. Ignore list 8.2. Visible list 8.3. Invisible list 9. Advanced features 9.1. Arabic and Hebrew languages support 9.2. Command line facilities 9.2.1. Sending events 9.2.2. Changing current IM status 9.3. External actions and auto-responses 9.3.1. IM answering machine 9.3.2. Elizatalk: making fun with your friends 9.3.3. Remote control with external actions 9.3.4. Forwarding events 9.3.5. Hiding from scary ones 9.3.6. "Manual" external actions 9.4. Internal RSS reader 9.5. Protocol debug mode 9.6. "Friendly" logging 9.7. Custom base directories 9.8. Latest CVS snapshots 10. Lynx 10.1. The program homepage 10.1.1. CenterIM mailing list 10.1.2. German fan-club of the program :-) 10.2. IM protocols 11. Help to the project I would appreciate 11.1. Feedback 11.2. Patches 1. Introduction --------------- CenterIM is a text mode menu- and window-driven IM interface. ICQ, Yahoo!, AIM TOC, IRC, MSN, Gadu-Gadu and Jabber protocols are currently supported. It allows you to send, receive, and forward messages, URLs, SMSes and, contacts, mass message send, search for users (including extended "whitepages search"), view users' details, maintain your contact list directly from the program (including non-icq contacts), view the messages history, register a new UIN and update your details, be informed on receiving email messages, automatically set away after the defined period of inactivity (on any console), and have your own ignore, visible and invisible lists. It can also associate events with sounds, has support for Hebrew and Arabic languages and allows to arrange contacts into groups. There is also an internal RSS reader and even a LiveJournal client! CenterIM is known to build and work well under Linux, FreeBSD, OpenBSD, NetBSD, Sun Solaris, MacOS X/Darwin and Microsoft Windows (built with cygwin). 1.1. Creation history --------------------- This program was written because of a very simple cause. I just couldn't find any console based ICQ clients with really useful user interface. When I started it I had quite a slow computer at home. Having X window running on it took incredibly a lot of resources making whole the system really slow. I didn't like an idea of launching it just to be on ICQ, but there were several good programs only for X. For console they had only mICQ and zicq. The former was ok, but its interface made me cry. I know, it's of quite a UNIX style, and I don't have anything against command line, but typing nicks and uins all the time was terrible. The second thing, zicq, was an attempt to implement menus and windows for ICQ in text-mode, but its author couldn't go further than just splitting the screen into two windows, one with contact list and another with usual mICQ output :) Actually it was all based on mICQ code. I don't wanna say mICQ was bad, for it was the first ICQ client for Linux, and its author made a great job exploring and sniffing the protocol. After looking at freshmeat and some "icq for linux" pages the hope to find something worth was finally lost. I decided to put some effort into making a program which would be really useful for me. It took me about two weeks to write and then 1 week to test before releasing the first version. Since that time the software suffered a lot of changes, including rewrite resulted into the version 3.0.0, and then adding more IM protocols since 4.1.0. Now I'm continuing to develop it, going the standard way of adding new features and fixing bugs. And feedback from users helps me a lot in it. 1.2. Features overview ---------------------- CenterIM's ICQ module has almost all the functionality including extended issues that Mirabilis client has. Speaking of other protocols, it has quite full support for features of Yahoo!, AIM, IRC and Jabber. Beside simple things like sending and receiving messages, changing online status and basic user information, CenterIM advanced features such as "White pages" and keyword search, an ability to update almost all the fields in user's details, send URLs and SMSes, etc. I hope you enjoy it a lot :) 1.3. Requirements ----------------- In order to build the software the following libraries are required: ncurses (at least 4.2 version) A CRT screen handling and optimization package. http://dickey.his.com/ncurses/ncurses.html openssl The secure communications library. Optional, but you will require if you want SSL support for Jabber. Previous versions of the library called SSLeay will work with CenterIM too. http://www.openssl.org/ gnutls The secure communications library. Optional. An alternative to OpenSSL distributed under the GNU Public License. http://www.gnutls.org/ gpgme This is for PGP support in Jabber. Optional also. http://www.gnupg.org/(en)/download/index.html#gpgme Please note that in order to compile CenterIM from source on Redhat based systems you should have *-devel RPM packages of the above mentioned libraries installed. For more information on the software requirements, take a look at: - http://www.centerim.org/index.php/Requirements It's possible to disable support of various protocols during the build phase. Just take a look at the --disable-xxx parameters for configure. You can invoke the scripts command line help with the following command: $ ./configure --help 1.4. First time start --------------------- Upon the first execution, the program shows its configuration screen and then gets to the next stage, the account manager dialog. All the configuration dialog items are self-descriptive, so there must be no problems to customize your CenterIM. As soon as you're finished with it, using the right allow key, move cursor to the "Done" button and press Enter. Russian speaking users should pay attention to the "Russian translation" item of the registration dialog. It's vital to set its value to "yes" to be able to use cyrillic. In most cases. Unless you use win1251 as a default charset, about what I doubt a lot :) Unfortunately we have two different encodings for our language, koi8-r is default for UNIX like systems and win1251 is used in Windows. Since ICQ comes from Windows we need to recode every sent and received message in order for it to be readable. 2. IM accounts registration --------------------------- This section says a bit about registering new and entering existing accounts' details into configuration of your CenterIM. Everything that CenterIM can do about it is available through the "Accounts" dialog displayed at the start and then residing under the f4->Accounts.. menu item. 2.1. ICQ accounts ----------------- To be able to use the ICQ IM service you should have a UIN (I think it stands for something like "user identification number"). You can either use an already existing UIN or register a new one selecting appropriate items in the "Account manager" dialog. Some attention should only be paid to the "server address" field. The default value will be substituted unless something is set there, i.e. empty "server" field is quite ok. In the majority of cases you do not need to change it. The only exception is if you have your own ICQ server on LAN. 2.2. Yahoo! accounts -------------------- CenterIM doesn't support registering new Yahoo! IDs, so if you don't have one yet, just visit the homepage Yahoo! messenger at http://messenger.yahoo.com/ and select the "Acct info" link in the top right corner. 2.3. AIM accounts ----------------- AIM accounts can be created with the AOL's web interface at http://my.screenname.aol.com/ by clicking on the "Get a Screen Name" link. Don't also forget to set your profile information with "Update your details" item in the Account manager dialog. 2.4. IRC accounts ----------------- This service is completely different from others supported by CenterIM. You don't need to register to connect to irc. All you need is just choose a nick which is not used by anyone else. Otherwise it'll be reported as soon as you try to log in. So set any nick and a host name of the server you want to chat on, and go ahead! For the advanced IRC users there can be a need for so-called NickServ authentication using a password to identify himself. Sometimes it's used to protect your nickname from overtaking on a specific IRC network. CenterIM does support this too, providing a non-obligatory password field. 2.4.1. IRC channels ------------------- IRC channels behave theirselves like usual contacts, though the set of actions possible to perform upon them is different. Using the F2-menu and hotkeys it's possible to join or leave a channel, view the list of users, etc. Please note, in order to stay on a channel you should have it on your contact list. As soon as a channel is deleted, you leave it automatically. 2.5. Jabber accounts -------------------- Jabber is the most advanced open source and free instant messaging solution. Since the version 4.8.8 it's been supported by CenterIM. Due to its being open and developed by the wide community, CenterIM can register new nicknames in it very easily. 2.5.1. Jabber groupchat conferences ----------------------------------- Like IRC channels, they're controlled like usual contacts, too. 2.6. LiveJournal ---------------- Though LiveJournal is not actually an IM service, but I hope you forgive me for that. LiveJournal is a weblogs community. Its URL is http://www.livejournal.com/. CenterIM makes use of their open source and well-documented client-server protocol, and makes it possible to post items and read friends' RSS feeds directly from its interface. So if you want an account, go to http://www.livejournal.com/ and see how to get it. If you don't like the rules, you can always download their server software and install it on your own. Long live open source! 2.7. Gadu-gadu -------------- If you have libjpeg installed in your system and the configure script does find it, CenterIM can register a UIN on this network for you. Otherwise you can only register one with the official client that can be downloaded from the official site at http://www.gadu-gadu.pl/ 2.8. MSN -------- An account for MSN can also be registered through a web interface at http://chat.msn.com/ though it seems that they block access from Linux based web browsers. 2.9. Updating details --------------------- If you have just registered on the ICQ network only basic fields of your details were set. Now, if you want to provide the world with more information about yourself, you should invoke the "Update ICQ details" dialog. First go to the "Accounts" dialog which can be accessed through the global menu, and there in the ICQ node select "Update user details". You can fill in information that will be visible to other ICQ users. They also will be able to find you with specifying what you filled in their "find users" requests. It's possible to update your ICQ and AIM details any time you're online with the dialog. Details within other networks are possible to be updated with respective web interfaces, I believe. 3. User interface ----------------- The text UI CenterIM has, as well as UI of other programs for console I have written, is very simple. There are menus, windows, menus and input lines. In the bottom line of the screen there is a status bar. It usually contains hints about what to press to invoke various menus, dialogs, and perform various actions. 3.1. The ESC key ---------------- This key is used for termination of input, if you wanna cancel the operation you wanted to perform. Say, if "send message" operation is chosen (invoked just with a press of "Enter" on a contact), an editor window appears. As status bar says, you can use "Ctrl-X" to send it, and ESC to cancel. The only hint is that you have to press the ESC key twice. It's a common practice for console based UNIX programs (Midnight commander is a good example), because checking for only one ESC would spoil arrow key processing. The point is that they have correspond sequences that start with an ASCII#27 character which is actually ESC. If you still want to press a simple key combination to close a dialog or cancel something, try Alt-ESC. Though it's not guaranteed to work on all terminals. The ESC key can also help you to issue shortcuts and key combinations such as Alt-? or F. The former, if Alt-Shift-/ doesn't work can be produced by first pressing ESC and then Shift-/ (i.e. "?"). And instead of any F-key the ESC and then a number can be used. 3.2. The main screen -------------------- The main screen of CenterIM consists of three parts. First is contact list which is situated to the left. Next is information window which is used to show received events, users' details, and also to edit events that are going to be sent. And the smallest one is a log window in which you can see messages about what CenterIM is doing right now. 3.3. Menus ---------- No need to say, menus are a common way to provide a user with an ability to select one (or several) items from a certain list. To make a difference between single and multiple choice menu you gotta just have a look at the items. If square brackets stand next to items text in every line, a multiple selection is requested. Otherwise you can only select one item. To do it, just press "Enter" on it. To make a multiple selection, press "Space" on items and use "Enter" to finish the selection. ESC does also work in all menus to cancel the selection. I will mention two menus below. They are global menu and contact context menu, invoked with F4 and F2 correspondingly. The former allows to execute various actions of global kind, such as find and add users, manage ignore, visible and invisible lists, change settings, etc. With the context menu you can do various current contact specific things. 3.4. Dialogs ------------ Every dialog in CenterIM has a tree-like view. When I was about to write classes for form-based input, I remembered that there was a "treeview" class written by me before. So, I decided to use it for dialogs and was right. There was no need to re-design the whole form in case I need to add some controls, or so. I just add it as a node or a leaf it scrolls, and nothing gets spoiled. Everything really nice is always simple :) 3.5. Hotkeys in dialogs ----------------------- Dialogs of CenterIM usually have a bar with buttons. To access a button without moving the highlighted bar over it with the arrow keys you can use shortcuts. It's enough to press the first capital letter of a button name to access the function behind it. 3.6. Some UI tips ----------------- There at some quite standard key combinations supported by CenterIM I wanna tell you about. Here they go. Ctrl-L Redraws the screen in any place of program execution. If output of some kind of background programs or system messages spoil your screen just press it so CenterIM display is refreshed. Ctrl-Y In a message writing mode removes entire current line. Ctrl-K Single line edit mode. Kills entire content. Ctrl-U Single line edit mode. Kills a part of line to the left from cursor. Alt-H Single line edit mode. Invokes history of recently entered lines. 4. Configuration ---------------- The majority of CenterIM settings can be found in the "Configuration" dialog which can be invoked by selecting an appropriate items in the global menu (the one you see on pressing F4). There are only three things you should setup from outside the program with modifying the program's configuration files. They are event sounds, actions (see below) and color schemes. With the "Configuration" dialog you can turn on and off various features, as well as change the ICQ server address and adjust network settings. All the items there are self-explanatory and their meaning is quite obvious. I suppose the program users are usually not dumb :) so I won't cover all of the items here in the documentation. 4.1. Migrating from other ICQ software -------------------------------------- If you decided to migrate to CenterIM from another ICQ software or have a need to you something else in parallel, there is a way to convert the contact list. This means you can migrate without loosing your contacts and history. How to do it? There is a Perl script named cicqconv. It's usually installed on "make install" under @prefix@/bin (/usr/local/bin in the majority of cases). Its usage is very simple. You should only pass one parameter to it, telling from what kind of ICQ software it's to convert your data. To see the list of supported software, run the script without parameters. 4.2. Event sounds ----------------- As it was said before, CenterIM can play sounds on various events. It's done the following way. Upon, say, receiving a message, CenterIM executes an external command. Actually it can be whatever you want, but original idea is to execute a command line WAV player. There are three WAV sound files which CenterIM has by default. They are sounds taken from Mirabilis ICQ. When you set "Change sound device to" item to "sound card", the program generates a file named sounds in the .centerim/ directory in your home folder. The default file has commands to execute a "play" utility (from sox package) with a name of a file to play, one of the default ones. If you wanna change the player or a sound simply edit ~/.centerim/sounds. If you use ESD (Enlightenment Sound Daemon) to have some extra sound facilities such as mixing streams, or playing on another computer, you might wish to change the "play" command to "esdplay". 4.3. Color schemes ------------------ It's possible to customize colors in the CenterIM's user interface. It's done with the ~/.centerim/colorscheme configuration file. Its contents are self-descriptive, and parameter names mean exactly that they're named after. Please note, that among the standard color names it's possible to specify "transparent" which is useful when the program is used in terminals with background images set. Started for the first time, CenterIM creates the default colorscheme file filled in with settings of one of default schemes that the Configuration dialog proposes. Also its contents are re-written every time you change color scheme from the dialog. To define your own color scheme, feel free to modify the default colors configuration file or choose one of contributed ones that can be found under the contrib/ directory of the source tarball. More "visual" explanation can be found here at the CenterIM.de: http://centericq.de/misc/colorscheme_helper.png 4.4. Key bindings ----------------- Key bindings are also configurable in CenterIM. On the first start it creates a file called keybindings in your ~/.centerim/ directory. You can use its initial contents for reference. If you want to change something, well, it's all there. 4.5. URL open action (web browser support) ------------------------------------------ CenterIM can extract URLs from messages and user information records for you. And it also can launch your preferred web browser to view them. No need to have a big attention to notice "F2 to URLs" text in the status bar when you view either a message or user's details. The "open URL" action starts right after you make a selection in the menu invoked. The ~/.centerim/actions file is responsible for this. By default it has a command to execute netscape, but you can change to whatever you want. Please only note that you cannot put lynx or any other text mode based browser starting in the same console there. The commands from "actions" run in parallel with CenterIM, so please only pass your URLs to scripts or to X based browsers, but to nothing interactive. Though, if you're using CenterIM under screen(1) there is a solution. Jochen Sprickerhof advised it having read the statement in the previous paragraph. He proposes to define open URL action the following way: "openurl screen lynx $url$", in order to open lynx in a new screen window as soon as an URL to browse it chosen. 4.6. Hostnames and port numbers (for crazy firewall admins) ----------------------------------------------------------- I'm frequently asked what ports and hostnames CenterIM uses to connect to various IM services. To avoid further buzz, I just include them here. 4.6.1. ICQ ---------- Hostname: login.icq.com Port: 5190 Here a small note is needed. To a great displeasure of network admins, the ICQ main server listens on all the TCP ports, from 1 to 65535. So if in your network the 5190 is blocked, don't be upset, set it to 80 or to 21 or whatever is not restricted by firewall and it will work :) 4.6.2. Yahoo! ------------- Hostname: scs.msg.yahoo.com Port: 5050 4.6.3. AIM TOC -------------- Hostname: toc.oscar.aol.com Port: 9898 4.6.4. IRC ---------- For this network you gotta choose a server yourself, because the auditory of people you chat with and other things depend exactly on this choice. However, by default, CenterIM sets the following parameters: Hostname: irc.freenode.net Port: 6667 4.6.5. Jabber ------------- There are many Jabber servers in the world, also the solution is widely used for in-house communications inside various companies, so you can choose the server yourself. At the other hand, the default server open to the public is the following: Hostname: jabber.com Port: 5222 4.6.6. LiveJournal ------------------ Since LiveJournal, despite of its being not an IM network, is also a completely open source and free (in the "free speech" sense) solution, you can find LiveJournal servers installed anywhere. You can even install one on your own. Just in case, here I'm giving you parameters of their main server: Hostname: livejournal.com Port: 80 4.6.7. Gadu-gadu ---------------- Hostname: appmsg.gadu-gadu.pl Port: 80 4.6.8. MSN ---------- Hostname: messenger.hotmail.com Port: 1863 4.7. Binding to various IP addresses ------------------------------------ If the box you're running CenterIM on has several IPs and you would like to use a certain one of them for IM connections, there is a command line parameter made especially for you, --bind or shortly, -B . 5. Online status ---------------- With CenterIM you can be either on or off the ICQ network. The status can be changed with the "Status" menu invoked either with F3 or "S" key or from the global menu. It provides you with a choice to switch between online statuses along with an ability to go offline. If one of online statuses if selected when you're offline, CenterIM will connect and switch the status to what was chosen. With an online status you can indicate to those who are in touch with you your being away, occupied, free for chat, not available, etc. 5.1. "Auto Away" and "Auto N/A" ------------------------------- Also there is a way to switch status to Away and N/A (not available) after a certain period of inactivity, to show your friends or colleagues you're somewhere away from computer. The very useful thing about is that CenterIM detects inactivity for all the consoles if you use it locally. So it won't change your status if you're just working in another console and only don't tweak it. The auto periods can be changed with the "Configuration" dialog. Zero value means the feature is off. 6. Contact list --------------- The list of your contacts is displayed to the left on the CenterIM main screen, and has a tree-like structure. There are "Online" and, unless the "Hide offline users" options is on, "Offline" nodes, groups (if switched on). If a user has a birthday today, a smiley face ":)" is shown next to his or her nickname. If a contact is online, a status letter in square brackets is shown for him. Though, the brackets kind can vary. Besides the square ones, there can be {x} and items. The former means a contact is on your invisible list, and the latter represents your "always visible" status for a contact. Finally, if there is an unfinished (postponed) message for a certain contact, the ">" character will appear between status and nickname. 6.1. Finding and adding users ----------------------------- The most common way to add an IM contact to your list is to use the "find/add user(s)" dialog invoked from the global menu. First you have to find the contact you wanna add. CenterIM allows you to search for users with various parameters in various networks. In ICQ, you can add a user knowing his UIN, or see a list of people matching your criteria. In fact, ICQ server sends only first 40 matching UINs, but usually it's quite enough. Note that in ICQ search requests you can use simple wildcards in the text input fields. It's possible to put "*" there. For example, you don't remember my last name exactly, but know only several first letters. Then just type in a first name ("Konstantin") and fill in the "last name" field with "Klyag*". The same trick can be done with other fields: "city", "nickname", "company", etc.. The Yahoo!, AIM, IRC and Jabber networks support in CenterIM does only allow to add users by nicknames. With IRC it's possible to get users from channels. For more info on channels and other IRC related stuff, please refer to http://www.irc.org/. So, with CenterIM you can either fetch a list of users for a specified channel, or (sic!) find users that stay on several channels simultaneously. To perform the latter, just put several channel names separated with spaces. For example, the "#CenterIM #linux" query will show a list of users that are currently talking on both channels. 6.1.1. Some useful hints ------------------------ You can skip the finding step by issuing one of the following shell commands to add a user (depends on an IM type): $ mkdir ~/.centerim/ This one is for ICQ $ mkdir ~/.centerim/y For Yahoo! $ mkdir ~/.centerim/a For AIM $ mkdir ~/.centerim/i For IRC $ mkdir ~/.centerim/j For Jabber $ mkdir ~/.centerim/i For MSN Don't forget to restart CenterIM so that it re-reads the contact list. Though, it's better anyway to follow the usual find/add procedure. Another intresting ICQ related trick I wanna share with you. Because of a natural curiosity, sometimes names of people get me interested in finding out about their ethnical origin. Once I saw a last name, Aslam, which seemed like a Muslim one, but I had no idea which country the guy originated from. I decided to use ICQ to find out. Opened the "find/add" dialog and typed that in. After looking at several matched contacts I noticed the majority of people were from Pakistan, so I realized where the guy was from and my curiosity was satisfied. I go the same way to find out in which country a certain city is located, and so on. This makes ICQ extremely useful for me. Just use your imagination to find other ways to use such a great statistics database :) 6.1.2. ICQ search specific modes -------------------------------- The "find/add users" dialog for ICQ besides the obvious parameters does also contain two interesting items such as "Random chat group" and "Keywords". With the help of the former you can easily look for chat partners from standard 10 groups, if you're bored or just feel like chatting with someone. You never know who can be there. Also, you can make yourself available for others so that they can find you in random chat groups. Just set the corresponding parameter in the "Update your details" dialog for ICQ. The keyword search feature allows to search for contacts by specified keywords that are taken from interests, geographical location and other places, and indexed somehow by the Mirabilis guys. Quite an interesting feature too. 6.2. Removing users ------------------- Removing users is a very simple procedure. You can either hit DEL on a certain contact or select an appropriate item in the context menu. After confirmation the contact is removed. 6.3. Users' details ------------------- On the ICQ network, every user has a set of details that can be browsed and used in search queries by others. To browse details of a specific user on the contact list it's enough just to press '?' on a corresponding to a contact item. Please don't hesitate to do it before asking people who they are. It takes time to explain, though it can be looked up so easily. 6.4. Groups of contacts ----------------------- In case you have a lot of people on contact list, you might wish to be able to visually arrange them into groups. Choose any criteria. Geography, companies, activities, interests.. Anything. CenterIM supports it. To turn the feature on invoke the configuration dialog and switch the "arrange contacts into groups" option value to "yes". By default, all of your contacts will appear on standard "Global" group from which you can move them to other groups creating them "on fly". There is an item in the context menu named "Move to group.." which allows you to do it. It's also possible to collapse and expand groups by pressing the Enter key on them. Remove, add and rename operations on groups can be done with the group manager dialog invoked from the global menu item named "Organize contact groups". 7. Sending and receiving events ------------------------------- Sending and receiving events is what ICQ and all the instant messaging are all about. The concept itself means an ability to stay in touch by delivering messages of various kind immediately. 7.1. Messages ------------- The most common type of events. It takes the ICQ network about one second to deliver one. Messages can be sent either through server or directly through a TCP link. Size of a message sent through server cannot exceed 450 characters, while size of direct messages is unlimited. In case CenterIM cannot establish a direct link or you have the "sent all events through server" option enabled, a message is automatically split into several parts. To send a message just press "Enter" on a contact. Then type and press "Ctrl-X" to send it. To cancel the message press ESC (twice). 7.2. URLs --------- Though you can send URLs with regular messages the Mirabilis guys decided to make a separate event for it. No problem, CenterIM supports URL events. An URL message consists of two parts, they're an URL itself and a description. Well, nothing else to say about it. Except maybe a wish for future version of the protocol to support e-mail addresses and host names as separate events :) 7.3. SMSes ---------- ICQ has a server-side mechanism which allows its users to send and receive short text messages to cellular phones. There is an item visible in the context menu for ICQ contacts, named "Send an SMS" which is be chosen. Then if a user does not have any cellular number on his details, CenterIM will ask you to provide one. This number can be changed any time with the "Edit details" item of the same menu. CenterIM allows sending SMS messages to contacts of any kind on your list with the only restriction that they will only be sent as soon as you log in with your ICQ account. When you type in a phone number don't forget to include all the international and regional prefixes. If an SMS you sent is rejected, the appropriate message is displayed in the log window. This usually happens because ICQ does not support some cellular networks. To see the list of supported ones use the following links: http://www.icq.com/sms/smsnetworks.html http://www.icq.com/sms/eg_networks.html Both ways of sending SMSes are supported by libicq2000, and this means CenterIM does so too. 7.4. Contacts ------------- Sharing parts of your contact list with other users on the instant messaging network is a feature supported only by ICQ so far. CenterIM does support it, thus you can easily send contacts from your contact list or receive contacts from someone else using the program's interface. Much easier than typing or cut'n'pasting UINs. 7.5. Files ---------- It's only possible to send files to your remote buddies within the IRC network so far. In order to do it, it's enough to choose the "Send file(s)" item from the context menu (the one invoked with F2), and point out the files you want to send. In order to receive files you should press the "Accept" button in the dialog you'll see as soon as someone sends a file to you. 7.6. E-mail express messages ---------------------------- This kind of events is ICQ specific. There is no way to receive them with Yahoo! or other protocols. E-mail express is a service provided by Mirabilis to make it possible to send messages through e-mail to logged in ICQ users. A gate, indeed. The principle is simple. To send such a message you use an e-mail client application, and you receive one with an ICQ client. The destination e-mail address looks like this @pager.icq.com, where UIN is the receiver's ICQ number. If a person is not online, they'll get the message as soon as connect to the ICQ network. Please also note that with some SMTPs it won't work, since the pager server has a protection which tries to make a connection to the sender SMTP. If it's behind a firewall you have no chance to get your message delivered. 7.7. WebPager messages ---------------------- ICQ network does also allow sending messages to icq clients from their web sites. The so-called "Web panel" makes it possible. You can access your own by the URL of the following look: http://web.icq.com/wwp?Uin= Messages are delivered to the contact list immediately. And if a user is not online he's supposed to received them as soon as he logs in. 7.8. Away messages ------------------ Another feature of IM networks supported by CenterIM is away messages. It's quite a useful way to explain to everybody why you're away from your box right now. To read your reason for being away they just have to use the feature to fetch an away message in their ICQ client application. It's possible to set such a message from the account manager dialog invoked from the global menu. There is a "Set away message" item for IM engines that support such a feature. With CenterIM you can also read away messages of others. To fetch someone's away message (it's possible even when a person has the "available/online" status) just select the respective item in the "current user" context menu (invoked with F2 or "m"). It's impossible to fetch away messages of users that are offline. 7.9. Events history ------------------- All of events sent and received with CenterIM are held in its database. It's very simple to access history of events you exchanged with a particular user. You should only select the "Events history" item of the context menu. Then, if at least one event is there, you'll be shown a list every item of which can be read, replied or forwarded to someone. 8. Ignore, visible and invisible lists -------------------------------------- ICQ provides an easy way to have lists of users you want to be visible or invisible to, if you're online. Also there is a place to move all the annoying ones so that they don't disturb you with their stupid messages. Modification operation with the lists can be performed with appropriate dialogs invoked from the global menu. 8.1. Ignore list ---------------- List for worst ones. If you find someone on (or outside) your contact list too annoying, you can just add him or her to the ignore list. After this simple operation you will never receive events from this user, until the contact is removed from this list of yours. 8.2. Visible list ----------------- ICQ has the "invisible" option among its online status modes. When you switch to it, no one is able to see your online presence. But there can be a handful of people you would like to keep in touch, and you also feel like remaining visible for them. That's what this feature is all about. 8.3. Invisible list ------------------- Invisible list has an opposite aim to the previous one. People who you have on this list are unable to see your presence all the time. Either you're online or offline, or occupied.. whatever, they see your status as "offline". 9. Advanced features -------------------- CenterIM has some advanced features that you may need, though they're not so easy to turn on for novice users. In this chapter I explain how to do it. 9.1. Arabic and Hebrew languages support ---------------------------------------- There is a basic support for bidirectional languages in CenterIM. It allows not to type, but only read messages in Hebrew and Arabic. It's possible to enable only on the ./configure stage, because the program needs to be linked against FriBiDi library. This means first you need to have the latter installed. The library homepage is located at http://fribidi.sourceforge.net/ Once you have successfully installed FriBiDi, you need to execute CenterIM's ./configure script with "--with-fribidi" parameter. If it fails to find the library (you'll be reported), try "--with-fribidi=". Common "make" and "make install" steps should follow, and finally "shalom" or "selam" can be seen well on your monitor :) So don't fight there, guys. 9.2. Command line facilities ---------------------------- CenterIM has a bunch of command line options that make it possible to queue IM events and change your status in various IM networks. 9.2.1. Sending events --------------------- In fact, it's not really sending. CenterIM just allows you to put an event to the outgoing queue from another process with command line options. To have the event sent immediately CenterIM must be running, otherwise all of your queued events will be sent as soon as the program is launched and connected to the corresponding IM network. The following command line options are used to put an event to the outgoing queue: -s or --send This parameter specifies the type of event you want to send. Currently only "msg", "url" and "sms" are supported. -p or --proto This one specifies to which IM network the destination contact belongs to. Can be either "icq", "yahoo", "aim", "irc", "jab" or "lj". -t or --to With this one you specify nickname or UIN of the destination contact. For icq it's possible to specify 0 to send events to yourself. Only SMSes are known to be possible to be sent to oneself though. -n or --number Using this parameter you can send SMSes to any mobile numbers through the ICQ network. The message text is read from the standard input, so use pipes in shell to pass it. For example, you can say "hi" to me through the ICQ network with the following command: $ echo "hi" | centerim -s msg -p icq -t 17502151 In case you want to send an URL, the URL itself and its description are separated with a newline character the following way: $ echo -e "http://thekonst.net/\nMy modest homepage." \ | CenterIM -s url -p icq -t 17502151 Finally, a small example of sending SMSes: $ echo "sms test" | centerim -s sms -n 1234567890 Please note, that all three parameters are required in order to queue an event. 9.2.2. Changing current IM status --------------------------------- Changing status is done with a pair of parameters. They're -S and -p. The former is used to specify the status itself, and -p points which IM engine is to be affected. -S or --status The argument parameter is a letter which indicates which status is to be set: o (Online) _ (Offline) a (Away) d (Don't disturb) n (N/A) c (Occupied) f (Free for chat) i (Invisible) -p or --protocol This one specifies to which IM network the destination contact belongs to. Can be either "icq", "yahoo", "aim", "msn", "irc", "jab" or "lj". Examples: $ centerim -S _ -p icq This will set the icq status to offline. In other words, it'll be disconnected immediately. $ centerim -S a -p yahoo And this command will switch your yahoo status to away. 9.3. External actions and auto-responses ---------------------------------------- It is possible to make CenterIM run external programs, scripts and whatever to answer and/or process incoming events. Though, some extra setup is needed. Let me introduce you with another configuration file, named "external" which should reside under the .centerim/ directory in your home. Here is an example which demonstrates its options. It's recommended just cut'n'paste the following text. [ - $HOME/.centerim/external ---------------------------------------------- ] # # External actions # ---------------- # # Every section starts with a line containing the "%action ", # "%pre-send ", "%pre-receive " or "%manual " text. # Please note that the of any kind is necessary. It mustn't be # empty. Inside it the following parameters can be used: # # event # ----- # Can be "msg", "sms", "url", "online", "offline", "auth", # "contacts" or "notification". # # The latter means CenterIM's own notifications, such as birthday reminders, # away messages, and other stuff. Specifying several event types is # also allowed. "all" stands for all the event types. # # proto # ----- # Can be "icq", "yahoo", "aim", "irc", "msn", "lj", "rss" or "jab". Or # combination of these words. "all" can be used as a synonym for all of # them. # # status # ------ # Can be "online", "away", "dnd", "na", "occupied", "ffc" or "invisible". # Specifying several ones is possible. "all" stands for all of possible # status modes. # # options # ------- # Possible options for an action are: # # stdin The incoming message text is to be passed to # stdin of the script to be executed. # # stdout The script output is to be sent as a reply # message (if not empty). # # nowait Don't wait for the script to finish. Obviously, the # stdout option won't make sense if this one is used. # # Then, the section named "%exec" should follow. It contains a piece of # script to be executed being copied to a file first. # %action Simple auto-responder event msg # Reacts only on events of message type .. proto icq yahoo # .. only for icq and yahoo protocols status away na # .. when we are in away or n/a status options stdin stdout # .. the external commands text (below) reads the message from # stdin, then its stdout output is sent as a response to a # remote user. %exec msg=`cat` echo "hello. this is auto-responder. your message was: $msg" [ -------------------------------------------------------------------------- ] With this simple external actions configuration file CenterIM will perform a simple auto-respond action. You can have as many sections as you need. You can call any kind of external scripts and programs. Please note that the message text (when "stdin" option is specified for an action) can be read with cat command or something similar. Please also note it's possible to define actions that get invoked before the event is written to the history (and delivered to the contact list) as well as before it gets sent. Such kind of actions are defined with the %pre-send and %pre-receive directives. Using them, an event can be modified or even prevented from further processing, i.e. from showing on the contact list or actual sending. The latter is done with returning a non-zero return code in the %exec section. Every time something is to be executed the "%exec" section's contents are copied to a temporary file, and the latter is processed with the default shell. But it doesn't mean those code parts are default shell dependent. You can easily specify your favourite one with the first line like this: #!/usr/bin/perl for example. Though, anyway this code piece's aim is just to perpare arguments, perform initial checks, and then execute something for further processing. Another point to be explained is multiple actions with the same or similar parameters (event, proto, and status). If an event matches several actions, all of them are executed. If there is a need only in one, you can always perform necessary checks in "%exec" so that only one sends a reply. Also, the script from the %exec section when executed has the following environment variables imported by CenterIM: EVENT_TYPE The type of the received event. Can be "msg", "sms", "url", "online", "offline", "auth", "contacts" or "notification". EVENT_NETWORK The IM network name through which the event was received. Can be "icq", "yahoo", "aim", "irc", "msn", "lj" or "jab". CONTACT_UIN If an event is received through ICQ equals to the other party's UIN. Otherwise empty. CONTACT_NICK Set to other party's real nickname. Real means that even if you renamed the user in your contact list, this parameter will be equal to the original one, and not to what you set. CONTACT_INFODIR The most intresting parameter. Using it, you can access further information about the user. Every time an external action is executed it is set to the user's information directory under your ~/.centerim/ directory. It makes it easier to access "about" and "info" files under it. Fetching lines from certain positions of the latter allows to get details. It's enough to take a look at an "info" file of any user to find out what lines mean. Here I'll describe the most useful ones: - the 2nd and 3rd lines contain user's first and last names respectively; - the 4th one contains user's e-mail address; - the 7th has the home city; - the 8th is used for the home state name; - the 9th is used for the home phone number; - the user's home country resides in the 14th line; - etc; To read a certain line from the info file I recommend to use the following shell command: "head -n $CONTACT_INFODIR/info | tail -n 1", where N is the line number. Below the real examples go. fname=`head -n 2 $CONTACT_INFODIR/info | tail -n 1` # to fetch contact's first name lname=`head -n 3 $CONTACT_INFODIR/info | tail -n 1` # to fetch contact's last name The example from the next section demonstrates usage of the environment variables on an example of a simple answering machine :) 9.3.1. IM answering machine --------------------------- This simple setup will answer on incoming messages automatically when you're away from your computer and your IM mode is set to Away or N/A. [ - cut (CenterIM external actions setup for an IM answering machine) ----- ] %action Answering machine event msg proto all status away na options stdout %exec #!/bin/sh fname=`head -n 2 $CONTACT_INFODIR/info | tail -n 1` lname=`head -n 3 $CONTACT_INFODIR/info | tail -n 1` cat <" 9.8. Latest snapshots ------------------------- If you wanna always have the recent version of the program, there is an anonymous GIT repository available to get the code. You can find documentation at our website to get the latest (development) source code, using the GIT at: http://repo.or.cz/w/centerim.git At our website is a description how to get it. - http://www.centerim.org/index.php/Contribute_Code You can also get complete packages from: - http://www.centerim.org/download/ - ftp://ftp.centerim.org/ 10. Lynx -------- This section contains links and references that may be of interest for you. 10.1. The program homepage -------------------------- The CenterIM homepage can be found at http://www.centerim.org/ 10.1.1. CenterIM mailing list ------------------------------ There are two mailing lists for CenterIM, one is used by program users and the other is used by developers to discuss their ideas, bug reports, fixes, and other stuff. To subscribe go to the CenterIM home page and fill out the appropriate form. For CenterIM users - http://centerim.org/mailman/listinfo/centerim-users For CenterIM developers - http://centerim.org/mailman/listinfo/centerim-devel 10.2. IM protocols ------------------ Here we want to say thanks to authors of libraries CenterIM uses to support various IM protocols. Barnaby Gray , who wrote a great library for icq2000 protocol and a GTK+ based ICQ client for UNIX. http://ickle.sourceforge.net/ The whole team of Mark Spencer , Adam Fritzler , Rob Flynn , Eric Warmenhoven , Brian Macke , Anand Biligiri S , Valdis Kletnieks, Sean Egan , Toby Gray for the library implementing the Yahoo! protocol. Ian Gulliver for the nice Firetalk library used by CenterIM to provide the AIM and IRC services. The Jabber Team http://jabber.org/ for their GNU Jabber library. Since CenterIM contains support for the ICQ protocol taken from the original software made by Israeli company named "Mirabilis", you might wish to know more about it. So, visit the ICQ website at http://www.icq.com/ It provides information about the company itself along with a lot of community services including SMS messaging, web directory, and so on. 11. Help to the project is appreciated ------------------------------------------ What if you think that CenterIM is the best text console based instant messaging program around? What if CenterIM is the application you'd been waiting whole of your life, and want to express your appreciation somehow? Helping the authors, you help the project itself to keep rolling. It's not something vital we require to keep on writing and improving CenterIM, neither you have to do it. 11.1. Feedback -------------- You can write some feedback saying what you liked and what is missing in the program. Also, don't be silent if you notice bugs. Just check everything attentively and put a detailed bug-report on http://bugzilla.centerim.org/ or drop a detailed email on our developers mailing list if you think you've found a bug. If you have questions about how CenterIM works, you can also say hallo on our irc channel #centerim on freenode. 11.2. Patches ------------- Don't wait for us to implement a feature you'd like to have in CenterIM. Please have in mind that whole the source code is available and you can modify it yourself, then make a patch and send it to us. At our website is written how to get the code and how you can contribute patches. We'd like you to follow our style of formatting the code. Please don't make any changes not related to the feature you implement, it makes your patch difficult to commit. centerim-4.22.10/libgadu/0000755000175000001440000000000011473011456012074 500000000000000centerim-4.22.10/libgadu/compat.h0000644000175000001440000000171611461606612013456 00000000000000/* $Id: compat.h,v 1.1 2004/01/26 23:49:47 konst Exp $ */ /* * (C) Copyright 2001-2002 Wojtek Kaniewski * Robert J. Wo¼ny * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __COMPAT_H #define __COMPAT_H #ifdef sun # define INADDR_NONE ((in_addr_t) 0xffffffff) #endif #endif centerim-4.22.10/libgadu/common.c0000644000175000001440000003716511461606612013465 00000000000000/* $Id: common.c,v 1.3 2004/07/31 10:47:20 konst Exp $ */ /* * (C) Copyright 2001-2002 Wojtek Kaniewski * Robert J. Wo¼ny * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #ifdef sun # include #endif #include #include #include #include #include #include #include #include #include "libgadu.h" FILE *gg_debug_file = NULL; #ifndef GG_DEBUG_DISABLE /* * gg_debug() // funkcja wewnêtrzna * * wy¶wietla komunikat o danym poziomie, o ile u¿ytkownik sobie tego ¿yczy. * * - level - poziom wiadomo¶ci * - format... - tre¶æ wiadomo¶ci (kompatybilna z printf()) */ void gg_debug(int level, const char *format, ...) { va_list ap; int old_errno = errno; if (gg_debug_handler) { va_start(ap, format); (*gg_debug_handler)(level, format, ap); va_end(ap); goto cleanup; } if ((gg_debug_level & level)) { va_start(ap, format); vfprintf((gg_debug_file) ? gg_debug_file : stderr, format, ap); va_end(ap); } cleanup: errno = old_errno; } #endif /* * gg_vsaprintf() // funkcja pomocnicza * * robi dok³adnie to samo, co vsprintf(), tyle ¿e alokuje sobie wcze¶niej * miejsce na dane. powinno dzia³aæ na tych maszynach, które maj± funkcjê * vsnprintf() zgodn± z C99, jak i na wcze¶niejszych. * * - format - opis wy¶wietlanego tekstu jak dla printf() * - ap - lista argumentów dla printf() * * zaalokowany bufor, który nale¿y pó¼niej zwolniæ, lub NULL * je¶li nie uda³o siê wykonaæ zadania. */ char *gg_vsaprintf(const char *format, va_list ap) { int size = 0; const char *start; char *buf = NULL; #ifdef __GG_LIBGADU_HAVE_VA_COPY va_list aq; va_copy(aq, ap); #else # ifdef __GG_LIBGADU_HAVE___VA_COPY va_list aq; __va_copy(aq, ap); # endif #endif start = format; #ifndef __GG_LIBGADU_HAVE_C99_VSNPRINTF { int res; char *tmp; size = 256; do { size *= 2; if (!(tmp = realloc(buf, size))) { free(buf); return NULL; } buf = tmp; res = vsnprintf(buf, size, format, ap); } while (res == size - 1 || res == -1); } #else { char tmp[2]; /* libce Solarisa przy buforze NULL zawsze zwracaj± -1, wiêc * musimy podaæ co¶ istniej±cego jako cel printf()owania. */ size = vsnprintf(tmp, sizeof(tmp), format, ap); if (!(buf = malloc(size + 1))) return NULL; } #endif format = start; #ifdef __GG_LIBGADU_HAVE_VA_COPY vsnprintf(buf, size + 1, format, aq); va_end(aq); #else # ifdef __GG_LIBGADU_HAVE___VA_COPY vsnprintf(buf, size + 1, format, aq); va_end(aq); # else vsnprintf(buf, size + 1, format, ap); # endif #endif return buf; } /* * gg_saprintf() // funkcja pomocnicza * * robi dok³adnie to samo, co sprintf(), tyle ¿e alokuje sobie wcze¶niej * miejsce na dane. powinno dzia³aæ na tych maszynach, które maj± funkcjê * vsnprintf() zgodn± z C99, jak i na wcze¶niejszych. * * - format... - tre¶æ taka sama jak w funkcji printf() * * zaalokowany bufor, który nale¿y pó¼niej zwolniæ, lub NULL * je¶li nie uda³o siê wykonaæ zadania. */ char *gg_saprintf(const char *format, ...) { va_list ap; char *res; va_start(ap, format); res = gg_vsaprintf(format, ap); va_end(ap); return res; } /* * gg_get_line() // funkcja pomocnicza * * podaje kolejn± liniê z bufora tekstowego. niszczy go bezpowrotnie, dziel±c * na kolejne stringi. zdarza siê, nie ma potrzeby pisania funkcji dubluj±cej * bufor ¿eby tylko mieæ nieruszone dane wej¶ciowe, skoro i tak nie bêd± nam * po¼niej potrzebne. obcina `\r\n'. * * - ptr - wska¼nik do zmiennej, która przechowuje aktualn± pozycjê * w przemiatanym buforze * * wska¼nik do kolejnej linii tekstu lub NULL, je¶li to ju¿ koniec bufora. */ char *gg_get_line(char **ptr) { char *foo, *res; if (!ptr || !*ptr || !strcmp(*ptr, "")) return NULL; res = *ptr; if (!(foo = strchr(*ptr, '\n'))) *ptr += strlen(*ptr); else { *ptr = foo + 1; *foo = 0; if (strlen(res) > 1 && res[strlen(res) - 1] == '\r') res[strlen(res) - 1] = 0; } return res; } /* * gg_connect() // funkcja pomocnicza * * ³±czy siê z serwerem. pierwszy argument jest typu (void *), ¿eby nie * musieæ niczego inkludowaæ w libgadu.h i nie psuæ jaki¶ g³upich zale¿no¶ci * na dziwnych systemach. * * - addr - adres serwera (struct in_addr *) * - port - port serwera * - async - asynchroniczne po³±czenie * * deskryptor gniazda lub -1 w przypadku b³êdu (kod b³êdu w zmiennej errno). */ int gg_connect(void *addr, int port, int async) { int sock, one = 1; struct sockaddr_in sin; struct in_addr *a = addr; gg_debug(GG_DEBUG_FUNCTION, "** gg_connect(%s, %d, %d);\n", inet_ntoa(*a), port, async); if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_connect() socket() failed (errno=%d, %s)\n", errno, strerror(errno)); return -1; } #ifdef ASSIGN_SOCKETS_TO_THREADS gg_win32_thread_socket(0, sock); #endif if (async) { #ifdef FIONBIO if (ioctl(sock, FIONBIO, &one) == -1) { #else if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) { #endif gg_debug(GG_DEBUG_MISC, "// gg_connect() ioctl() failed (errno=%d, %s)\n", errno, strerror(errno)); close(sock); return -1; } } sin.sin_port = htons(port); sin.sin_family = AF_INET; sin.sin_addr.s_addr = a->s_addr; if(cw_connect(sock, (struct sockaddr*) &sin, sizeof(sin), 0) == -1) { if (errno && (!async || errno != EINPROGRESS)) { gg_debug(GG_DEBUG_MISC, "// gg_connect() connect() failed (errno=%d, %s)\n", errno, strerror(errno)); close(sock); return -1; } gg_debug(GG_DEBUG_MISC, "// gg_connect() connect() in progress\n"); } return sock; } /* * gg_read_line() // funkcja pomocnicza * * czyta jedn± liniê tekstu z gniazda. * * - sock - deskryptor gniazda * - buf - wska¼nik do bufora * - length - d³ugo¶æ bufora * * je¶li trafi na b³±d odczytu, zwraca NULL. inaczej zwraca buf. */ char *gg_read_line(int sock, char *buf, int length) { int ret; if (!buf || length < 0) return NULL; for (; length > 1; buf++, length--) { do { if ((ret = read(sock, buf, 1)) == -1 && errno != EINTR) { gg_debug(GG_DEBUG_MISC, "// gg_read_line() error on read (errno=%d, %s)\n", errno, strerror(errno)); *buf = 0; return NULL; } else if (ret == 0) { gg_debug(GG_DEBUG_MISC, "// gg_read_line() eof reached\n"); *buf = 0; return NULL; } } while (ret == -1 && errno == EINTR); if (*buf == '\n') { buf++; break; } } *buf = 0; return buf; } /* * gg_chomp() // funkcja pomocnicza * * ucina "\r\n" lub "\n" z koñca linii. * * - line - linia do przyciêcia */ void gg_chomp(char *line) { if (!line || strlen(line) < 1) return; if (line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = 0; if (line[strlen(line) - 1] == '\r') line[strlen(line) - 1] = 0; } /* * gg_urlencode() // funkcja wewnêtrzna * * zamienia podany tekst na ci±g znaków do formularza http. przydaje siê * przy ró¿nych us³ugach katalogu publicznego. * * - str - ci±g znaków do zakodowania * * zaalokowany bufor, który nale¿y pó¼niej zwolniæ albo NULL * w przypadku b³êdu. */ char *gg_urlencode(const char *str) { char *q, *buf, hex[] = "0123456789abcdef"; const char *p; unsigned int size = 0; if (!str && !(str = strdup(""))) return NULL; for (p = str; *p; p++, size++) { if (!((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || *p == ' ') || (*p == '@') || (*p == '.') || (*p == '-')) size += 2; } if (!(buf = malloc(size + 1))) return NULL; for (p = str, q = buf; *p; p++, q++) { if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || (*p == '@') || (*p == '.') || (*p == '-')) *q = *p; else { if (*p == ' ') *q = '+'; else { *q++ = '%'; *q++ = hex[*p >> 4 & 15]; *q = hex[*p & 15]; } } } *q = 0; return buf; } /* * gg_http_hash() // funkcja wewnêtrzna * * funkcja licz±ca hash dla adresu e-mail, has³a i paru innych. * * - format... - format kolejnych parametrów ('s' je¶li dany parametr jest * ci±giem znaków lub 'u' je¶li numerem GG) * * hash wykorzystywany przy rejestracji i wszelkich manipulacjach w³asnego * wpisu w katalogu publicznym. */ int gg_http_hash(const char *format, ...) { unsigned int a, c, i, j; va_list ap; int b = -1; va_start(ap, format); for (j = 0; j < strlen(format); j++) { char *arg, buf[16]; if (format[j] == 'u') { snprintf(buf, sizeof(buf), "%d", va_arg(ap, uin_t)); arg = buf; } else { if (!(arg = va_arg(ap, char*))) arg = ""; } i = 0; while ((c = (unsigned char) arg[i++]) != 0) { a = (c ^ b) + (c << 8); b = (a >> 24) | (a << 8); } } va_end(ap); return (b < 0 ? -b : b); } /* * gg_gethostbyname() // funkcja pomocnicza * * odpowiednik gethostbyname() u¿ywaj±cy gethostbyname_r(), gdy potrzebna * jest wielobie¿no¶æ. chwilowo korzysta ze zwyk³ego gethostbyname(). * * - hostname - nazwa serwera * * zaalokowany bufor, który nale¿y zwolniæ lub NULL w przypadku b³êdu. */ struct hostent *gg_gethostbyname(const char *hostname) { /* XXX u¿yæ gethostbyname_r() */ struct hostent *hp, *hp2; if (!(hp = gethostbyname(hostname))) return NULL; if (!(hp2 = calloc(1, sizeof(*hp)))) return NULL; memcpy(hp2, hp, sizeof(*hp)); return hp2; } #ifdef ASSIGN_SOCKETS_TO_THREADS typedef struct gg_win32_thread { int id; int socket; struct gg_win32_thread *next; } gg_win32_thread; struct gg_win32_thread *gg_win32_threads = 0; /* * gg_win32_thread_socket() // funkcja pomocnicza, tylko dla win32 * * zwraca deskryptor gniazda, które by³o ostatnio tworzone dla w±tku * o podanym identyfikatorze. * * je¶li na win32 przy po³±czeniach synchronicznych zapamiêtamy w jakim * w±tku uruchomili¶my funkcjê, która siê z czymkolwiek ³±czy, to z osobnego * w±tku mo¿emy anulowaæ po³±czenie poprzez gg_win32_thread_socket(watek, -1); * * - thread_id - id w±tku. je¶li jest równe 0, brany jest aktualny w±tek, * je¶li równe -1, usuwa wpis o podanym sockecie. * - socket - deskryptor gniazda. je¶li równe 0, zwraca deskryptor gniazda * dla podanego w±tku, je¶li równe -1, usuwa wpis, je¶li co¶ * innego, ustawia dla podanego w±tku dany numer deskryptora. * * je¶li socket jest równe 0, zwraca deskryptor gniazda dla podanego w±tku. */ int gg_win32_thread_socket(int thread_id, int socket) { char close = (thread_id == -1) || socket == -1; gg_win32_thread *wsk = gg_win32_threads; gg_win32_thread **p_wsk = &gg_win32_threads; if (!thread_id) thread_id = GetCurrentThreadId(); while (wsk) { if ((thread_id == -1 && wsk->socket == socket) || wsk->id == thread_id) { if (close) { /* socket zostaje usuniety */ closesocket(wsk->socket); *p_wsk = wsk->next; free(wsk); return 1; } else if (!socket) { /* socket zostaje zwrocony */ return wsk->socket; } else { /* socket zostaje ustawiony */ wsk->socket = socket; return socket; } } p_wsk = &(wsk->next); wsk = wsk->next; } if (close && socket != -1) closesocket(socket); if (close || !socket) return 0; /* Dodaje nowy element */ wsk = malloc(sizeof(gg_win32_thread)); wsk->id = thread_id; wsk->socket = socket; wsk->next = 0; *p_wsk = wsk; return socket; } #endif /* ASSIGN_SOCKETS_TO_THREADS */ static char gg_base64_charset[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /* * gg_base64_encode() * * zapisuje ci±g znaków w base64. * * - buf - ci±g znaków. * * zaalokowany bufor. */ char *gg_base64_encode(const char *buf) { char *out, *res; unsigned int i = 0, j = 0, k = 0, len = strlen(buf); res = out = malloc((len / 3 + 1) * 4 + 2); if (!res) return NULL; while (j <= len) { switch (i % 4) { case 0: k = (buf[j] & 252) >> 2; break; case 1: if (j < len) k = ((buf[j] & 3) << 4) | ((buf[j + 1] & 240) >> 4); else k = (buf[j] & 3) << 4; j++; break; case 2: if (j < len) k = ((buf[j] & 15) << 2) | ((buf[j + 1] & 192) >> 6); else k = (buf[j] & 15) << 2; j++; break; case 3: k = buf[j++] & 63; break; } *out++ = gg_base64_charset[k]; i++; } if (i % 4) for (j = 0; j < 4 - (i % 4); j++, out++) *out = '='; *out = 0; return res; } /* * gg_base64_decode() * * dekoduje ci±g znaków z base64. * * - buf - ci±g znaków. * * zaalokowany bufor. */ char *gg_base64_decode(const char *buf) { char *res, *save, *foo, val; const char *end; unsigned int index = 0; if (!buf) return NULL; save = res = calloc(1, (strlen(buf) / 4 + 1) * 3 + 2); if (!save) return NULL; end = buf + strlen(buf); while (*buf && buf < end) { if (*buf == '\r' || *buf == '\n') { buf++; continue; } if (!(foo = strchr(gg_base64_charset, *buf))) foo = gg_base64_charset; val = (int)(foo - gg_base64_charset); buf++; switch (index) { case 0: *res |= val << 2; break; case 1: *res++ |= val >> 4; *res |= val << 4; break; case 2: *res++ |= val >> 2; *res |= val << 6; break; case 3: *res++ |= val; break; } index++; index %= 4; } *res = 0; return save; } /* * gg_proxy_auth() // funkcja wewnêtrzna * * tworzy nag³ówek autoryzacji dla proxy. * * zaalokowany tekst lub NULL, je¶li proxy nie jest w³±czone lub nie wymaga * autoryzacji. */ char *gg_proxy_auth() { char *tmp, *enc, *out; unsigned int tmp_size; if (!gg_proxy_enabled || !gg_proxy_username || !gg_proxy_password) return NULL; if (!(tmp = malloc((tmp_size = strlen(gg_proxy_username) + strlen(gg_proxy_password) + 2)))) return NULL; snprintf(tmp, tmp_size, "%s:%s", gg_proxy_username, gg_proxy_password); if (!(enc = gg_base64_encode(tmp))) { free(tmp); return NULL; } free(tmp); if (!(out = malloc(strlen(enc) + 40))) { free(enc); return NULL; } snprintf(out, strlen(enc) + 40, "Proxy-Authorization: Basic %s\r\n", enc); free(enc); return out; } static uint32_t gg_crc32_table[256]; static int gg_crc32_initialized = 0; /* * gg_crc32_make_table() // funkcja wewnêtrzna */ static void gg_crc32_make_table() { uint32_t h = 0; unsigned int i, j; memset(gg_crc32_table, 0, sizeof(gg_crc32_table)); for (i = 128; i; i >>= 1) { h = (h >> 1) ^ ((h & 1) ? 0xedb88320L : 0); for (j = 0; j < 256; j += 2 * i) gg_crc32_table[i + j] = gg_crc32_table[j] ^ h; } gg_crc32_initialized = 1; } /* * gg_crc32() * * wyznacza sumê kontroln± CRC32 danego bloku danych. * * - crc - suma kontrola poprzedniego bloku danych lub 0 je¶li pierwszy * - buf - bufor danych * - size - ilo¶æ danych * * suma kontrolna CRC32. */ uint32_t gg_crc32(uint32_t crc, const unsigned char *buf, int len) { if (!gg_crc32_initialized) gg_crc32_make_table(); if (!buf || len < 0) return crc; crc ^= 0xffffffffL; while (len--) crc = (crc >> 8) ^ gg_crc32_table[(crc ^ *buf++) & 0xff]; return crc ^ 0xffffffffL; } /* * Local variables: * c-indentation-style: k&r * c-basic-offset: 8 * indent-tabs-mode: notnil * End: * * vim: shiftwidth=8: */ centerim-4.22.10/libgadu/pubdir50.c0000644000175000001440000002336611461606612013625 00000000000000/* $Id: pubdir50.c,v 1.1 2004/01/26 23:49:54 konst Exp $ */ /* * (C) Copyright 2003 Wojtek Kaniewski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include "libgadu.h" /* * gg_pubdir50_new() * * tworzy now± zmienn± typu gg_pubdir50_t. * * zaalokowana zmienna lub NULL w przypadku braku pamiêci. */ gg_pubdir50_t gg_pubdir50_new(int type) { gg_pubdir50_t res = malloc(sizeof(struct gg_pubdir50_s)); gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_new(%d);\n", type); if (!res) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_new() out of memory\n"); return NULL; } memset(res, 0, sizeof(struct gg_pubdir50_s)); res->type = type; return res; } /* * gg_pubdir50_add_n() // funkcja wewnêtrzna * * funkcja dodaje lub zastêpuje istniej±ce pole do zapytania lub odpowiedzi. * * - req - wska¼nik opisu zapytania, * - num - numer wyniku (0 dla zapytania), * - field - nazwa pola, * - value - warto¶æ pola, * * 0/-1 */ int gg_pubdir50_add_n(gg_pubdir50_t req, int num, const char *field, const char *value) { struct gg_pubdir50_entry *tmp = NULL, *entry; char *dupfield, *dupvalue; int i; gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_add_n(%p, %d, \"%s\", \"%s\");\n", req, num, field, value); if (!(dupvalue = strdup(value))) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_add_n() out of memory\n"); return -1; } for (i = 0; i < req->entries_count; i++) { if (req->entries[i].num != num || strcmp(req->entries[i].field, field)) continue; free(req->entries[i].value); req->entries[i].value = dupvalue; return 0; } if (!(dupfield = strdup(field))) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_add_n() out of memory\n"); free(dupvalue); return -1; } if (!(tmp = realloc(req->entries, sizeof(struct gg_pubdir50_entry) * (req->entries_count + 1)))) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_add_n() out of memory\n"); free(dupfield); free(dupvalue); return -1; } req->entries = tmp; entry = &req->entries[req->entries_count]; entry->num = num; entry->field = dupfield; entry->value = dupvalue; req->entries_count++; return 0; } /* * gg_pubdir50_add() * * funkcja dodaje pole do zapytania. * * - req - wska¼nik opisu zapytania, * - field - nazwa pola, * - value - warto¶æ pola, * * 0/-1 */ int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value) { return gg_pubdir50_add_n(req, 0, field, value); } /* * gg_pubdir50_seq_set() * * ustawia numer sekwencyjny zapytania. * * - req - zapytanie, * - seq - nowy numer sekwencyjny. * * 0/-1. */ int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq) { gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_seq_set(%p, %d);\n", req, seq); if (!req) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_seq_set() invalid arguments\n"); errno = EFAULT; return -1; } req->seq = seq; return 0; } /* * gg_pubdir50_free() * * zwalnia pamiêæ po zapytaniu lub rezultacie szukania u¿ytkownika. * * - s - zwalniana zmienna, */ void gg_pubdir50_free(gg_pubdir50_t s) { int i; if (!s) return; for (i = 0; i < s->entries_count; i++) { free(s->entries[i].field); free(s->entries[i].value); } free(s->entries); free(s); } /* * gg_pubdir50() * * wysy³a zapytanie katalogu publicznego do serwera. * * - sess - sesja, * - req - zapytanie. * * numer sekwencyjny wyszukiwania lub 0 w przypadku b³êdu. */ uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req) { int i, size = 5; uint32_t res; char *buf, *p; struct gg_pubdir50_request *r; gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50(%p, %p);\n", sess, req); if (!sess || !req) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50() invalid arguments\n"); errno = EFAULT; return 0; } if (sess->state != GG_STATE_CONNECTED) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50() not connected\n"); errno = ENOTCONN; return 0; } for (i = 0; i < req->entries_count; i++) { /* wyszukiwanie bierze tylko pierwszy wpis */ if (req->entries[i].num) continue; size += strlen(req->entries[i].field) + 1; size += strlen(req->entries[i].value) + 1; } if (!(buf = malloc(size))) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50() out of memory (%d bytes)\n", size); return 0; } r = (struct gg_pubdir50_request*) buf; res = time(NULL); r->type = req->type; r->seq = (req->seq) ? gg_fix32(req->seq) : gg_fix32(time(NULL)); req->seq = gg_fix32(r->seq); for (i = 0, p = buf + 5; i < req->entries_count; i++) { if (req->entries[i].num) continue; strcpy(p, req->entries[i].field); p += strlen(p) + 1; strcpy(p, req->entries[i].value); p += strlen(p) + 1; } if (gg_send_packet(sess, GG_PUBDIR50_REQUEST, buf, size, NULL, 0) == -1) res = 0; free(buf); return res; } /* * gg_pubdir50_handle_reply() // funkcja wewnêtrzna * * analizuje przychodz±cy pakiet odpowiedzi i zapisuje wynik w struct gg_event. * * - e - opis zdarzenia * - packet - zawarto¶æ pakietu odpowiedzi * - length - d³ugo¶æ pakietu odpowiedzi * * 0/-1 */ int gg_pubdir50_handle_reply(struct gg_event *e, const char *packet, int length) { const char *end = packet + length, *p; struct gg_pubdir50_reply *r = (struct gg_pubdir50_reply*) packet; gg_pubdir50_t res; int num = 0; gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_handle_reply(%p, %p, %d);\n", e, packet, length); if (!e || !packet) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() invalid arguments\n"); errno = EINVAL; return -1; } if (length < 5) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() packet too short\n"); errno = EINVAL; return -1; } if (!(res = gg_pubdir50_new(r->type))) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() unable to allocate reply\n"); return -1; } e->event.pubdir50 = res; res->seq = gg_fix32(r->seq); switch (res->type) { case GG_PUBDIR50_READ: e->type = GG_EVENT_PUBDIR50_READ; break; case GG_PUBDIR50_WRITE: e->type = GG_EVENT_PUBDIR50_WRITE; break; default: e->type = GG_EVENT_PUBDIR50_SEARCH_REPLY; break; } /* brak wyników? */ if (length == 5) return 0; /* pomiñ pocz±tek odpowiedzi */ p = packet + 5; while (p < end) { const char *field, *value; field = p; /* sprawd¼, czy nie mamy podzia³u na kolejne pole */ if (!*field) { num++; field++; } value = NULL; for (p = field; p < end; p++) { /* je¶li mamy koniec tekstu... */ if (!*p) { /* ...i jeszcze nie mieli¶my warto¶ci pola to * wiemy, ¿e po tym zerze jest warto¶æ... */ if (!value) value = p + 1; else /* ...w przeciwym wypadku koniec * warto¶ci i mo¿emy wychodziæ * grzecznie z pêtli */ break; } } /* sprawd¼my, czy pole nie wychodzi poza pakiet, ¿eby nie * mieæ segfaultów, je¶li serwer przestanie zakañczaæ pakietów * przez \0 */ if (p == end) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() premature end of packet\n"); goto failure; } p++; /* je¶li dostali¶my namier na nastêpne wyniki, to znaczy ¿e * mamy koniec wyników i nie jest to kolejna osoba. */ if (!strcasecmp(field, "nextstart")) { res->next = atoi(value); num--; } else { if (gg_pubdir50_add_n(res, num, field, value) == -1) goto failure; } } res->count = num + 1; return 0; failure: gg_pubdir50_free(res); return -1; } /* * gg_pubdir50_get() * * pobiera informacjê z rezultatu wyszukiwania. * * - res - rezultat wyszukiwania, * - num - numer odpowiedzi, * - field - nazwa pola (wielko¶æ liter nie ma znaczenia). * * warto¶æ pola lub NULL, je¶li nie znaleziono. */ const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field) { char *value = NULL; int i; gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_get(%p, %d, \"%s\");\n", res, num, field); if (!res || num < 0 || !field) { gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_get() invalid arguments\n"); errno = EINVAL; return NULL; } for (i = 0; i < res->entries_count; i++) { if (res->entries[i].num == num && !strcasecmp(res->entries[i].field, field)) { value = res->entries[i].value; break; } } return value; } /* * gg_pubdir50_count() * * zwraca ilo¶æ wyników danego zapytania. * * - res - odpowied¼ * * ilo¶æ lub -1 w przypadku b³êdu. */ int gg_pubdir50_count(gg_pubdir50_t res) { return (!res) ? -1 : res->count; } /* * gg_pubdir50_type() * * zwraca rodzaj zapytania lub odpowiedzi. * * - res - zapytanie lub odpowied¼ * * ilo¶æ lub -1 w przypadku b³êdu. */ int gg_pubdir50_type(gg_pubdir50_t res) { return (!res) ? -1 : res->type; } /* * gg_pubdir50_next() * * zwraca numer, od którego nale¿y rozpocz±æ kolejne wyszukiwanie, je¶li * zale¿y nam na kolejnych wynikach. * * - res - odpowied¼ * * numer lub -1 w przypadku b³êdu. */ uin_t gg_pubdir50_next(gg_pubdir50_t res) { return (!res) ? (unsigned) -1 : res->next; } /* * gg_pubdir50_seq() * * zwraca numer sekwencyjny zapytania lub odpowiedzi. * * - res - zapytanie lub odpowied¼ * * numer lub -1 w przypadku b³êdu. */ uint32_t gg_pubdir50_seq(gg_pubdir50_t res) { return (!res) ? (unsigned) -1 : res->seq; } /* * Local variables: * c-indentation-style: k&r * c-basic-offset: 8 * indent-tabs-mode: notnil * End: * * vim: shiftwidth=8: */ centerim-4.22.10/libgadu/events.c0000644000175000001440000012342611461606612013475 00000000000000/* $Id: events.c,v 1.2 2004/06/10 19:20:08 konst Exp $ */ /* * (C) Copyright 2001-2003 Wojtek Kaniewski * Robert J. Wo¼ny * Arkadiusz Mi¶kiewicz * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include "libgadu-config.h" #include "libgadu.h" #include #ifdef __GG_LIBGADU_HAVE_PTHREAD # include #endif #include #include #include #include #include #if defined(HAVE_OPENSSL) # include # include #elif defined(HAVE_NSS_COMPAT) # include #elif HAVE_GNUTLS # include #endif #include "compat.h" #include "libgadu.h" /* * gg_event_free() * * zwalnia pamiêæ zajmowan± przez informacjê o zdarzeniu. * * - e - wska¼nik do informacji o zdarzeniu */ void gg_event_free(struct gg_event *e) { gg_debug(GG_DEBUG_FUNCTION, "** gg_event_free(%p);\n", e); if (!e) return; if (e->type == GG_EVENT_MSG) { free(e->event.msg.message); free(e->event.msg.formats); free(e->event.msg.recipients); } if (e->type == GG_EVENT_NOTIFY) free(e->event.notify); if (e->type == GG_EVENT_NOTIFY60) { int i; for (i = 0; e->event.notify60[i].uin; i++) free(e->event.notify60[i].descr); free(e->event.notify60); } if (e->type == GG_EVENT_STATUS60) free(e->event.status60.descr); if (e->type == GG_EVENT_STATUS) free(e->event.status.descr); if (e->type == GG_EVENT_NOTIFY_DESCR) { free(e->event.notify_descr.notify); free(e->event.notify_descr.descr); } if (e->type == GG_EVENT_DCC_VOICE_DATA) free(e->event.dcc_voice_data.data); if (e->type == GG_EVENT_PUBDIR50_SEARCH_REPLY || e->type == GG_EVENT_PUBDIR50_READ || e->type == GG_EVENT_PUBDIR50_WRITE) gg_pubdir50_free(e->event.pubdir50); if (e->type == GG_EVENT_USERLIST) free(e->event.userlist.reply); if (e->type == GG_EVENT_IMAGE_REPLY) { free(e->event.image_reply.filename); free(e->event.image_reply.image); } free(e); } /* * gg_image_queue_remove() * * usuwa z kolejki dany wpis. * * - s - sesja * - q - kolejka * - freeq - czy zwolniæ kolejkê * * 0/-1 */ int gg_image_queue_remove(struct gg_session *s, struct gg_image_queue *q, int freeq) { if (!s || !q) { errno = EINVAL; return -1; } if (s->images == q) s->images = q->next; else { struct gg_image_queue *qq; for (qq = s->images; qq; qq = qq->next) { if (qq->next == q) { qq->next = q->next; break; } } } if (freeq) { free(q->image); free(q->filename); free(q); } return 0; } /* * gg_image_queue_parse() // funkcja wewnêtrzna * * parsuje przychodz±cy pakiet z obrazkiem. * * - e - opis zdarzenia * - */ static void gg_image_queue_parse(struct gg_event *e, char *p, unsigned int len, struct gg_session *sess, uin_t sender) { struct gg_msg_image_reply *i = (void*) p; struct gg_image_queue *q, *qq; if (!p || !sess || !e) return; /* znajd¼ dany obrazek w kolejce danej sesji */ for (qq = sess->images, q = NULL; qq; qq = qq->next) { if (sender == qq->sender && i->size == qq->size && i->crc32 == qq->crc32) { q = qq; break; } } if (!q) { gg_debug(GG_DEBUG_MISC, "// gg_image_queue_parse() unknown image from %d, size=%d, crc32=%.8x\n", sender, i->size, i->crc32); return; } if (p[0] == 0x05) { int i, ok = 0; q->done = 0; len -= sizeof(struct gg_msg_image_reply); p += sizeof(struct gg_msg_image_reply); /* sprawd¼, czy mamy tekst zakoñczony \0 */ for (i = 0; i < len; i++) { if (!p[i]) { ok = 1; break; } } if (!ok) { gg_debug(GG_DEBUG_MISC, "// gg_image_queue_parse() malformed packet from %d, unlimited filename\n", sender); return; } if (!(q->filename = strdup(p))) { gg_debug(GG_DEBUG_MISC, "// gg_image_queue_parse() not enough memory for filename\n"); return; } len -= strlen(p) + 1; p += strlen(p) + 1; } else { len -= sizeof(struct gg_msg_image_reply); p += sizeof(struct gg_msg_image_reply); } if (q->done + len > q->size) len = q->size - q->done; memcpy(q->image + q->done, p, len); q->done += len; /* je¶li skoñczono odbieraæ obrazek, wygeneruj zdarzenie */ if (q->done >= q->size) { e->type = GG_EVENT_IMAGE_REPLY; e->event.image_reply.sender = sender; e->event.image_reply.size = q->size; e->event.image_reply.crc32 = q->crc32; e->event.image_reply.filename = q->filename; e->event.image_reply.image = q->image; gg_image_queue_remove(sess, q, 0); free(q); } } /* * gg_handle_recv_msg() // funkcja wewnêtrzna * * obs³uguje pakiet z przychodz±c± wiadomo¶ci±, rozbijaj±c go na dodatkowe * struktury (konferencje, kolorki) w razie potrzeby. * * - h - nag³ówek pakietu * - e - opis zdarzenia * * 0, -1. */ static int gg_handle_recv_msg(struct gg_header *h, struct gg_event *e, struct gg_session *sess) { struct gg_recv_msg *r = (struct gg_recv_msg*) ((char*) h + sizeof(struct gg_header)); char *p, *packet_end = (char*) r + h->length; gg_debug(GG_DEBUG_FUNCTION, "** gg_handle_recv_msg(%p, %p);\n", h, e); if (!r->seq && !r->msgclass) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() oops, silently ignoring the bait\n"); e->type = GG_EVENT_NONE; return 0; } for (p = (char*) r + sizeof(*r); *p; p++) { if (*p == 0x02 && p == packet_end - 1) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() received ctcp packet\n"); break; } if (p >= packet_end) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() malformed packet, message out of bounds (0)\n"); goto malformed; } } p++; /* przeanalizuj dodatkowe opcje */ while (p < packet_end) { switch (*p) { case 0x01: /* konferencja */ { struct gg_msg_recipients *m = (void*) p; uint32_t i, count; p += sizeof(*m); if (p > packet_end) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (1)\n"); goto malformed; } count = gg_fix32(m->count); if (p + count * sizeof(uin_t) > packet_end || p + count * sizeof(uin_t) < p || count > 0xffff) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (1.5)\n"); goto malformed; } if (!(e->event.msg.recipients = (void*) malloc(count * sizeof(uin_t)))) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() not enough memory for recipients data\n"); errno = ENOMEM; goto fail; } for (i = 0; i < count; i++, p += sizeof(uint32_t)) { uint32_t u; memcpy(&u, p, sizeof(uint32_t)); e->event.msg.recipients[i] = gg_fix32(u); } e->event.msg.recipients_count = count; break; } case 0x02: /* richtext */ { uint16_t len; char *buf; if (p + 3 > packet_end) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (2)\n"); goto malformed; } memcpy(&len, p + 1, sizeof(uint16_t)); len = gg_fix16(len); if (!(buf = malloc(len))) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() not enough memory for richtext data\n"); errno = ENOMEM; goto fail; } p += 3; if (p + len > packet_end) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (3)\n"); free(buf); goto malformed; } memcpy(buf, p, len); e->event.msg.formats = buf; e->event.msg.formats_length = len; p += len; break; } case 0x04: /* image_request */ { struct gg_msg_image_request *i = (void*) p; if (p + sizeof(*i) > packet_end) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (3)\n"); goto malformed; } e->event.image_request.sender = gg_fix32(r->sender); e->event.image_request.size = gg_fix32(i->size); e->event.image_request.crc32 = gg_fix32(i->crc32); e->type = GG_EVENT_IMAGE_REQUEST; return 0; } case 0x05: /* image_reply */ case 0x06: { struct gg_msg_image_reply *rep = (void*)p; if (p + sizeof(struct gg_msg_image_reply) == packet_end) { e->type = GG_EVENT_IMAGE_REPLY; e->event.image_reply.sender = gg_fix32(r->sender); e->event.image_reply.size = 0; e->event.image_reply.crc32 = gg_fix32(rep->crc32); e->event.image_reply.filename = NULL; e->event.image_reply.image = NULL; } else if (p + sizeof(struct gg_msg_image_reply) + 1 > packet_end) { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() packet out of bounds (4)\n"); goto malformed; } rep->size = gg_fix32(rep->size); rep->crc32 = gg_fix32(rep->crc32); gg_image_queue_parse(e, p, (unsigned int)(packet_end - p), sess, gg_fix32(r->sender)); return 0; } default: { gg_debug(GG_DEBUG_MISC, "// gg_handle_recv_msg() unknown payload 0x%.2x\n", *p); p = packet_end; } } } e->type = GG_EVENT_MSG; e->event.msg.msgclass = gg_fix32(r->msgclass); e->event.msg.sender = gg_fix32(r->sender); e->event.msg.time = gg_fix32(r->time); e->event.msg.message = strdup((char*) r + sizeof(*r)); return 0; malformed: e->type = GG_EVENT_NONE; free(e->event.msg.recipients); free(e->event.msg.formats); return 0; fail: free(e->event.msg.recipients); free(e->event.msg.formats); return -1; } /* * gg_watch_fd_connected() // funkcja wewnêtrzna * * patrzy na gniazdo, odbiera pakiet i wype³nia strukturê zdarzenia. * * - sess - struktura opisuj±ca sesjê * - e - opis zdarzenia * * 0, -1. */ static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e) { struct gg_header *h = NULL; char *p; gg_debug(GG_DEBUG_FUNCTION, "** gg_watch_fd_connected(%p, %p);\n", sess, e); if (!sess) { errno = EFAULT; return -1; } if (!(h = gg_recv_packet(sess))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() gg_recv_packet failed (errno=%d, %s)\n", errno, strerror(errno)); goto fail; } p = (char*) h + sizeof(struct gg_header); switch (h->type) { case GG_RECV_MSG: { if (h->length >= sizeof(struct gg_recv_msg)) if (gg_handle_recv_msg(h, e, sess)) goto fail; break; } case GG_NOTIFY_REPLY: { struct gg_notify_reply *n = (void*) p; unsigned int count, i; char *tmp; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a notify reply\n"); if (h->length < sizeof(*n)) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() incomplete packet\n"); errno = EINVAL; goto fail; } if (gg_fix32(n->status) == GG_STATUS_BUSY_DESCR || gg_fix32(n->status) == GG_STATUS_NOT_AVAIL_DESCR || gg_fix32(n->status) == GG_STATUS_AVAIL_DESCR) { e->type = GG_EVENT_NOTIFY_DESCR; if (!(e->event.notify_descr.notify = (void*) malloc(sizeof(*n) * 2))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); errno = ENOMEM; goto fail; } e->event.notify_descr.notify[1].uin = 0; memcpy(e->event.notify_descr.notify, p, sizeof(*n)); e->event.notify_descr.notify[0].uin = gg_fix32(e->event.notify_descr.notify[0].uin); e->event.notify_descr.notify[0].status = gg_fix32(e->event.notify_descr.notify[0].status); e->event.notify_descr.notify[0].remote_port = gg_fix16(e->event.notify_descr.notify[0].remote_port); count = h->length - sizeof(*n); if (!(tmp = malloc(count + 1))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); errno = ENOMEM; goto fail; } memcpy(tmp, p + sizeof(*n), count); tmp[count] = 0; e->event.notify_descr.descr = tmp; } else { e->type = GG_EVENT_NOTIFY; if (!(e->event.notify = (void*) malloc(h->length + 2 * sizeof(*n)))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); errno = ENOMEM; goto fail; } memcpy(e->event.notify, p, h->length); count = h->length / sizeof(*n); e->event.notify[count].uin = 0; for (i = 0; i < count; i++) { e->event.notify[i].uin = gg_fix32(e->event.notify[i].uin); e->event.notify[i].status = gg_fix32(e->event.notify[i].status); e->event.notify[i].remote_port = gg_fix16(e->event.notify[i].remote_port); } } break; } case GG_STATUS: { struct gg_status *s = (void*) p; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a status change\n"); if (h->length >= sizeof(*s)) { e->type = GG_EVENT_STATUS; memcpy(&e->event.status, p, sizeof(*s)); e->event.status.uin = gg_fix32(e->event.status.uin); e->event.status.status = gg_fix32(e->event.status.status); if (h->length > sizeof(*s)) { int len = h->length - sizeof(*s); char *buf = malloc(len + 1); if (buf) { memcpy(buf, p + sizeof(*s), len); buf[len] = 0; } e->event.status.descr = buf; } else e->event.status.descr = NULL; } break; } case GG_NOTIFY_REPLY60: { struct gg_notify_reply60 *n = (void*) p; unsigned int length = h->length, i = 0; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a notify reply\n"); e->type = GG_EVENT_NOTIFY60; e->event.notify60 = malloc(sizeof(*e->event.notify60)); if (!e->event.notify60) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); goto fail; } e->event.notify60[0].uin = 0; while (length >= sizeof(struct gg_notify_reply60)) { uin_t uin = gg_fix32(n->uin); char *tmp; e->event.notify60[i].uin = uin & 0x00ffffff; e->event.notify60[i].status = n->status; e->event.notify60[i].remote_ip = n->remote_ip; e->event.notify60[i].remote_port = gg_fix16(n->remote_port); e->event.notify60[i].version = n->version; e->event.notify60[i].image_size = n->image_size; e->event.notify60[i].descr = NULL; e->event.notify60[i].time = 0; if (uin & 0x40000000) e->event.notify60[i].version |= GG_HAS_AUDIO_MASK; if (GG_S_D(n->status)) { unsigned char descr_len = *((char*) n + sizeof(struct gg_notify_reply60)); if (sizeof(struct gg_notify_reply60) + descr_len < length) { if (!(e->event.notify60[i].descr = malloc(descr_len + 1))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); goto fail; } memcpy(e->event.notify60[i].descr, (char*) n + sizeof(struct gg_notify_reply60) + 1, descr_len); e->event.notify60[i].descr[descr_len] = 0; /* XXX czas */ } length -= sizeof(struct gg_notify_reply60) + descr_len + 1; n = (void*) ((char*) n + sizeof(struct gg_notify_reply60) + descr_len + 1); } else { length -= sizeof(struct gg_notify_reply60); n = (void*) ((char*) n + sizeof(struct gg_notify_reply60)); } if (!(tmp = realloc(e->event.notify60, (i + 2) * sizeof(*e->event.notify60)))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n"); free(e->event.notify60); goto fail; } e->event.notify60 = (void*) tmp; e->event.notify60[++i].uin = 0; } break; } case GG_STATUS60: { struct gg_status60 *s = (void*) p; uint32_t uin; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a status change\n"); if (h->length < sizeof(*s)) break; uin = gg_fix32(s->uin); e->type = GG_EVENT_STATUS60; e->event.status60.uin = uin & 0x00ffffff; e->event.status60.status = s->status; e->event.status60.remote_ip = s->remote_ip; e->event.status60.remote_port = gg_fix16(s->remote_port); e->event.status60.version = s->version; e->event.status60.image_size = s->image_size; e->event.status60.descr = NULL; e->event.status60.time = 0; if (uin & 0x40000000) e->event.status60.version |= GG_HAS_AUDIO_MASK; if (h->length > sizeof(*s)) { int len = h->length - sizeof(*s); char *buf = malloc(len + 1); if (buf) { memcpy(buf, (char*) p + sizeof(*s), len); buf[len] = 0; } e->event.status60.descr = buf; if (len > 4 && p[h->length - 5] == 0) { uint32_t t; memcpy(&t, p + h->length - 4, sizeof(uint32_t)); e->event.status60.time = gg_fix32(t); } } break; } case GG_SEND_MSG_ACK: { struct gg_send_msg_ack *s = (void*) p; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a message ack\n"); if (h->length < sizeof(*s)) break; e->type = GG_EVENT_ACK; e->event.ack.status = gg_fix32(s->status); e->event.ack.recipient = gg_fix32(s->recipient); e->event.ack.seq = gg_fix32(s->seq); break; } case GG_PONG: { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received a pong\n"); e->type = GG_EVENT_PONG; sess->last_pong = time(NULL); break; } case GG_DISCONNECTING: { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received disconnection warning\n"); e->type = GG_EVENT_DISCONNECT; break; } case GG_PUBDIR50_REPLY: { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received pubdir/search reply\n"); if (gg_pubdir50_handle_reply(e, p, h->length) == -1) goto fail; break; } case GG_USERLIST_REPLY: { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received userlist reply\n"); if (h->length < 1) break; /* je¶li odpowied¼ na eksport, wywo³aj zdarzenie tylko * gdy otrzymano wszystkie odpowiedzi */ if (p[0] == GG_USERLIST_PUT_REPLY || p[0] == GG_USERLIST_PUT_MORE_REPLY) { if (--sess->userlist_blocks) break; p[0] = GG_USERLIST_PUT_REPLY; } if (h->length > 1) { char *tmp; unsigned int len = (sess->userlist_reply) ? strlen(sess->userlist_reply) : 0; gg_debug(GG_DEBUG_MISC, "userlist_reply=%p, len=%d\n", sess->userlist_reply, len); if (!(tmp = realloc(sess->userlist_reply, len + h->length))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for userlist reply\n"); free(sess->userlist_reply); sess->userlist_reply = NULL; goto fail; } sess->userlist_reply = tmp; sess->userlist_reply[len + h->length - 1] = 0; memcpy(sess->userlist_reply + len, p + 1, h->length - 1); } if (p[0] == GG_USERLIST_GET_MORE_REPLY) break; e->type = GG_EVENT_USERLIST; e->event.userlist.type = p[0]; e->event.userlist.reply = sess->userlist_reply; sess->userlist_reply = NULL; break; } default: gg_debug(GG_DEBUG_MISC, "// gg_watch_fd_connected() received unknown packet 0x%.2x\n", h->type); } free(h); return 0; fail: free(h); return -1; } /* * gg_watch_fd() * * funkcja, któr± nale¿y wywo³aæ, gdy co¶ siê stanie z obserwowanym * deskryptorem. zwraca klientowi informacjê o tym, co siê dzieje. * * - sess - opis sesji * * wska¼nik do struktury gg_event, któr± trzeba zwolniæ pó¼niej * za pomoc± gg_event_free(). jesli rodzaj zdarzenia jest równy * GG_EVENT_NONE, nale¿y je zignorowaæ. je¶li zwróci³o NULL, * sta³o siê co¶ niedobrego -- albo zabrak³o pamiêci albo zerwa³o * po³±czenie. */ struct gg_event *gg_watch_fd(struct gg_session *sess) { struct gg_event *e; int res = 0; int port = 0; gg_debug(GG_DEBUG_FUNCTION, "** gg_watch_fd(%p);\n", sess); if (!sess) { errno = EFAULT; return NULL; } if (!(e = (void*) calloc(1, sizeof(*e)))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() not enough memory for event data\n"); return NULL; } e->type = GG_EVENT_NONE; switch (sess->state) { case GG_STATE_RESOLVING: { struct in_addr addr; int failed = 0; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_RESOLVING\n"); if (read(sess->fd, &addr, sizeof(addr)) < (signed)sizeof(addr) || addr.s_addr == INADDR_NONE) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() resolving failed\n"); failed = 1; } close(sess->fd); sess->fd = -1; #ifndef __GG_LIBGADU_HAVE_PTHREAD waitpid(sess->pid, NULL, 0); sess->pid = -1; #else if (sess->resolver) { pthread_cancel(*((pthread_t*) sess->resolver)); free(sess->resolver); sess->resolver = NULL; } #endif if (failed) goto fail_resolving; /* je¶li jeste¶my w resolverze i mamy ustawiony port * proxy, znaczy, ¿e resolvowali¶my proxy. zatem * wpiszmy jego adres. */ if (sess->proxy_port) sess->proxy_addr = addr.s_addr; /* zapiszmy sobie adres huba i adres serwera (do * bezpo¶redniego po³±czenia, je¶li hub le¿y) * z resolvera. */ if (sess->proxy_addr && sess->proxy_port) port = sess->proxy_port; else { sess->server_addr = sess->hub_addr = addr.s_addr; port = GG_APPMSG_PORT; } gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() resolved, connecting to %s:%d\n", inet_ntoa(addr), port); /* ³±czymy siê albo z hubem, albo z proxy, zale¿nie * od tego, co resolvowali¶my. */ if ((sess->fd = gg_connect(&addr, port, sess->async)) == -1) { /* je¶li w trybie asynchronicznym gg_connect() * zwróci b³±d, nie ma sensu próbowaæ dalej. */ gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s), critical\n", errno, strerror(errno)); goto fail_connecting; } /* je¶li podano serwer i ³±czmy siê przez proxy, * jest to bezpo¶rednie po³±czenie, inaczej jest * do huba. */ sess->state = (sess->proxy_addr && sess->proxy_port && sess->server_addr) ? GG_STATE_CONNECTING_GG : GG_STATE_CONNECTING_HUB; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; break; } case GG_STATE_CONNECTING_HUB: { char buf[1024], *client; int res = 0, res_size = sizeof(res); const char *host, *appmsg; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_CONNECTING_HUB\n"); /* je¶li asynchroniczne, sprawdzamy, czy nie wyst±pi³ * przypadkiem jaki¶ b³±d. */ if (sess->async && (getsockopt(sess->fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res)) { /* no tak, nie uda³o siê po³±czyæ z proxy. nawet * nie próbujemy dalej. */ if (sess->proxy_addr && sess->proxy_port) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to proxy failed (errno=%d, %s)\n", res, strerror(res)); goto fail_connecting; } gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to hub failed (errno=%d, %s), trying direct connection\n", res, strerror(res)); close(sess->fd); if ((sess->fd = gg_connect(&sess->hub_addr, GG_DEFAULT_PORT, sess->async)) == -1) { /* przy asynchronicznych, gg_connect() * zwraca -1 przy b³êdach socket(), * ioctl(), braku routingu itd. dlatego * nawet nie próbujemy dalej. */ gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() direct connection failed (errno=%d, %s), critical\n", errno, strerror(errno)); goto fail_connecting; } sess->state = GG_STATE_CONNECTING_GG; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; break; } gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connected to hub, sending query\n"); if (!(client = gg_urlencode((sess->client_version) ? sess->client_version : GG_DEFAULT_CLIENT_VERSION))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() out of memory for client version\n"); goto fail_connecting; } if (!gg_proxy_http_only && sess->proxy_addr && sess->proxy_port) host = "http://" GG_APPMSG_HOST; else host = ""; #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if (sess->ssl) appmsg = "appmsg3.asp"; else #elif HAVE_GNUTLS if (sess->session) appmsg = "appmsg3.asp"; else #endif appmsg = "appmsg2.asp"; snprintf(buf, sizeof(buf) - 1, "GET %s/appsvc/%s?fmnumber=%u&version=%s&lastmsg=%d HTTP/1.0\r\n" "Host: " GG_APPMSG_HOST "\r\n" "User-Agent: " GG_HTTP_USERAGENT "\r\n" "Pragma: no-cache\r\n" "\r\n", host, appmsg, sess->uin, client, sess->last_sysmsg); free(client); /* zwolnij pamiêæ po wersji klienta. */ if (sess->client_version) { free(sess->client_version); sess->client_version = NULL; } gg_debug(GG_DEBUG_MISC, "=> -----BEGIN-HTTP-QUERY-----\n%s\n=> -----END-HTTP-QUERY-----\n", buf); /* zapytanie jest krótkie, wiêc zawsze zmie¶ci siê * do bufora gniazda. je¶li write() zwróci mniej, * sta³o siê co¶ z³ego. */ if (write(sess->fd, buf, strlen(buf)) < (signed)strlen(buf)) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() sending query failed\n"); e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_WRITING; sess->state = GG_STATE_IDLE; close(sess->fd); sess->fd = -1; break; } sess->state = GG_STATE_READING_DATA; sess->check = GG_CHECK_READ; sess->timeout = GG_DEFAULT_TIMEOUT; break; } case GG_STATE_READING_DATA: { char buf[1024], *tmp, *host; int port = GG_DEFAULT_PORT; struct in_addr addr; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_READING_DATA\n"); /* czytamy liniê z gniazda i obcinamy \r\n. */ gg_read_line(sess->fd, buf, sizeof(buf) - 1); gg_chomp(buf); gg_debug(GG_DEBUG_TRAFFIC, "// gg_watch_fd() received http header (%s)\n", buf); /* sprawdzamy, czy wszystko w porz±dku. */ if (strncmp(buf, "HTTP/1.", 7) || strncmp(buf + 9, "200", 3)) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() that's not what we've expected, trying direct connection\n"); close(sess->fd); /* je¶li otrzymali¶my jakie¶ dziwne informacje, * próbujemy siê ³±czyæ z pominiêciem huba. */ if (sess->proxy_addr && sess->proxy_port) { if ((sess->fd = gg_connect(&sess->proxy_addr, sess->proxy_port, sess->async)) == -1) { /* trudno. nie wysz³o. */ gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to proxy failed (errno=%d, %s)\n", errno, strerror(errno)); goto fail_connecting; } sess->state = GG_STATE_CONNECTING_GG; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; break; } sess->port = GG_DEFAULT_PORT; /* ³±czymy siê na port 8074 huba. */ if ((sess->fd = gg_connect(&sess->hub_addr, sess->port, sess->async)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s), trying https\n", errno, strerror(errno)); sess->port = GG_HTTPS_PORT; /* ³±czymy siê na port 443. */ if ((sess->fd = gg_connect(&sess->hub_addr, sess->port, sess->async)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s)\n", errno, strerror(errno)); goto fail_connecting; } } sess->state = GG_STATE_CONNECTING_GG; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; break; } /* ignorujemy resztê nag³ówka. */ while (strcmp(buf, "\r\n") && strcmp(buf, "")) gg_read_line(sess->fd, buf, sizeof(buf) - 1); /* czytamy pierwsz± liniê danych. */ gg_read_line(sess->fd, buf, sizeof(buf) - 1); gg_chomp(buf); /* je¶li pierwsza liczba w linii nie jest równa zeru, * oznacza to, ¿e mamy wiadomo¶æ systemow±. */ if (atoi(buf)) { char tmp[1024], *foo, *sysmsg_buf = NULL; int len = 0; while (gg_read_line(sess->fd, tmp, sizeof(tmp) - 1)) { if (!(foo = realloc(sysmsg_buf, len + strlen(tmp) + 2))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() out of memory for system message, ignoring\n"); break; } sysmsg_buf = foo; if (!len) strcpy(sysmsg_buf, tmp); else strcat(sysmsg_buf, tmp); len += strlen(tmp); } e->type = GG_EVENT_MSG; e->event.msg.msgclass = atoi(buf); e->event.msg.sender = 0; e->event.msg.message = sysmsg_buf; } close(sess->fd); gg_debug(GG_DEBUG_TRAFFIC, "// gg_watch_fd() received http data (%s)\n", buf); /* analizujemy otrzymane dane. */ tmp = buf; while (*tmp && *tmp != ' ') tmp++; while (*tmp && *tmp == ' ') tmp++; host = tmp; while (*tmp && *tmp != ' ') tmp++; *tmp = 0; if ((tmp = strchr(host, ':'))) { *tmp = 0; port = atoi(tmp+1); } addr.s_addr = inet_addr(host); sess->server_addr = addr.s_addr; if (!gg_proxy_http_only && sess->proxy_addr && sess->proxy_port) { /* je¶li mamy proxy, ³±czymy siê z nim. */ if ((sess->fd = gg_connect(&sess->proxy_addr, sess->proxy_port, sess->async)) == -1) { /* nie wysz³o? trudno. */ gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to proxy failed (errno=%d, %s)\n", errno, strerror(errno)); goto fail_connecting; } sess->state = GG_STATE_CONNECTING_GG; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; break; } sess->port = port; /* ³±czymy siê z w³a¶ciwym serwerem. */ if ((sess->fd = gg_connect(&addr, sess->port, sess->async)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s), trying https\n", errno, strerror(errno)); sess->port = GG_HTTPS_PORT; /* nie wysz³o? próbujemy portu 443. */ if ((sess->fd = gg_connect(&addr, GG_HTTPS_PORT, sess->async)) == -1) { /* ostatnia deska ratunku zawiod³a? * w takim razie zwijamy manatki. */ gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s)\n", errno, strerror(errno)); goto fail_connecting; } } sess->state = GG_STATE_CONNECTING_GG; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; break; } case GG_STATE_CONNECTING_GG: { int res = 0, res_size = sizeof(res); gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_CONNECTING_GG\n"); /* je¶li wyst±pi³ b³±d podczas ³±czenia siê... */ if (sess->async && (sess->timeout == 0 || getsockopt(sess->fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res)) { /* je¶li nie uda³o siê po³±czenie z proxy, * nie mamy czego próbowaæ wiêcej. */ if (sess->proxy_addr && sess->proxy_port) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection to proxy failed (errno=%d, %s)\n", res, strerror(res)); goto fail_connecting; } close(sess->fd); sess->fd = -1; #ifdef ETIMEDOUT if (sess->timeout == 0) errno = ETIMEDOUT; #endif #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) /* je¶li logujemy siê po TLS, nie próbujemy * siê ³±czyæ ju¿ z niczym innym w przypadku * b³êdu. nie do¶æ, ¿e nie ma sensu, to i * trzeba by siê bawiæ w tworzenie na nowo * SSL i SSL_CTX. */ if (sess->ssl) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s)\n", res, strerror(res)); goto fail_connecting; } #elif HAVE_GNUTLS if (sess->session) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s)\n", res, strerror(res)); goto fail_connecting; } #endif gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s), trying https\n", res, strerror(res)); sess->port = GG_HTTPS_PORT; /* próbujemy na port 443. */ if ((sess->fd = gg_connect(&sess->server_addr, sess->port, sess->async)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connection failed (errno=%d, %s)\n", errno, strerror(errno)); goto fail_connecting; } } gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() connected\n"); if (gg_proxy_http_only) sess->proxy_port = 0; /* je¶li mamy proxy, wy¶lijmy zapytanie. */ if (sess->proxy_addr && sess->proxy_port) { char buf[100], *auth = gg_proxy_auth(); snprintf(buf, sizeof(buf), "CONNECT %s:%d HTTP/1.0\r\n", inet_ntoa(*((struct in_addr*) &sess->server_addr)), sess->port); gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() proxy request:\n// %s", buf); /* wysy³amy zapytanie. jest ono na tyle krótkie, * ¿e musi siê zmie¶ciæ w buforze gniazda. je¶li * write() zawiedzie, sta³o siê co¶ z³ego. */ if (write(sess->fd, buf, strlen(buf)) < (signed)strlen(buf)) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() can't send proxy request\n"); goto fail_connecting; } if (auth) { gg_debug(GG_DEBUG_MISC, "// %s", auth); if (write(sess->fd, auth, strlen(auth)) < (signed)strlen(auth)) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() can't send proxy request\n"); goto fail_connecting; } free(auth); } if (write(sess->fd, "\r\n", 2) < 2) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() can't send proxy request\n"); goto fail_connecting; } } #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if (sess->ssl) { SSL_set_fd(sess->ssl, sess->fd); sess->state = GG_STATE_TLS_NEGOTIATION; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; break; } #elif HAVE_GNUTLS if (sess->session) { gnutls_transport_set_ptr(sess->session,(gnutls_transport_ptr_t)sess->fd); sess->state = GG_STATE_TLS_NEGOTIATION; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; break; } #endif sess->state = GG_STATE_READING_KEY; sess->check = GG_CHECK_READ; sess->timeout = GG_DEFAULT_TIMEOUT; break; } #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) case GG_STATE_TLS_NEGOTIATION: { int res; X509 *peer; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_TLS_NEGOTIATION\n"); if ((res = SSL_connect(sess->ssl)) <= 0) { int err = SSL_get_error(sess->ssl, res); if (res == 0) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() disconnected during TLS negotiation\n"); e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_TLS; sess->state = GG_STATE_IDLE; close(sess->fd); sess->fd = -1; break; } if (err == SSL_ERROR_WANT_READ) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() SSL_connect() wants to read\n"); sess->state = GG_STATE_TLS_NEGOTIATION; sess->check = GG_CHECK_READ; sess->timeout = GG_DEFAULT_TIMEOUT; break; } else if (err == SSL_ERROR_WANT_WRITE) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() SSL_connect() wants to write\n"); sess->state = GG_STATE_TLS_NEGOTIATION; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; break; } else { char buf[1024]; ERR_error_string_n(ERR_get_error(), buf, sizeof(buf)); gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() SSL_connect() bailed out: %s\n", buf); e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_TLS; sess->state = GG_STATE_IDLE; close(sess->fd); sess->fd = -1; break; } } gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() TLS negotiation succeded:\n// cipher: %s\n", SSL_get_cipher_name(sess->ssl)); peer = SSL_get_peer_certificate(sess->ssl); if (!peer) gg_debug(GG_DEBUG_MISC, "// WARNING! unable to get peer certificate!\n"); else { char buf[1024]; X509_NAME_oneline(X509_get_subject_name(peer), buf, sizeof(buf)); gg_debug(GG_DEBUG_MISC, "// cert subject: %s\n", buf); X509_NAME_oneline(X509_get_issuer_name(peer), buf, sizeof(buf)); gg_debug(GG_DEBUG_MISC, "// cert issuer: %s\n", buf); } sess->state = GG_STATE_READING_KEY; sess->check = GG_CHECK_READ; sess->timeout = GG_DEFAULT_TIMEOUT; break; } #elif HAVE_GNUTLS case GG_STATE_TLS_NEGOTIATION: { int res; do{ res = gnutls_handshake(sess->session); }while ((res == GNUTLS_E_AGAIN) || (res == GNUTLS_E_INTERRUPTED)); if (res < 0) { gnutls_deinit(sess->session); gnutls_perror (res); e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_TLS; sess->state = GG_STATE_IDLE; close(sess->fd); sess->fd = -1; break; } sess->state = GG_STATE_READING_KEY; sess->check = GG_CHECK_READ; sess->timeout = GG_DEFAULT_TIMEOUT; break; } #endif case GG_STATE_READING_KEY: { struct gg_header *h; struct gg_welcome *w; struct gg_login60 l; unsigned int hash; unsigned char *password = sess->password; int ret; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_READING_KEY\n"); memset(&l, 0, sizeof(l)); l.dunno2 = 0xbe; /* XXX bardzo, bardzo, bardzo g³upi pomys³ na pozbycie * siê tekstu wrzucanego przez proxy. */ if (sess->proxy_addr && sess->proxy_port) { char buf[100]; strcpy(buf, ""); gg_read_line(sess->fd, buf, sizeof(buf) - 1); gg_chomp(buf); gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() proxy response:\n// %s\n", buf); while (strcmp(buf, "")) { gg_read_line(sess->fd, buf, sizeof(buf) - 1); gg_chomp(buf); if (strcmp(buf, "")) gg_debug(GG_DEBUG_MISC, "// %s\n", buf); } /* XXX niech czeka jeszcze raz w tej samej * fazie. g³upio, ale dzia³a. */ sess->proxy_port = 0; break; } /* czytaj pierwszy pakiet. */ if (!(h = gg_recv_packet(sess))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() didn't receive packet (errno=%d, %s)\n", errno, strerror(errno)); e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_READING; sess->state = GG_STATE_IDLE; close(sess->fd); sess->fd = -1; break; } if (h->type != GG_WELCOME) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() invalid packet received\n"); free(h); close(sess->fd); sess->fd = -1; errno = EINVAL; e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_INVALID; sess->state = GG_STATE_IDLE; break; } w = (struct gg_welcome*) ((char*) h + sizeof(struct gg_header)); w->key = gg_fix32(w->key); hash = gg_login_hash(password, w->key); gg_debug(GG_DEBUG_DUMP, "// gg_watch_fd() challenge %.4x --> hash %.8x\n", w->key, hash); free(h); free(sess->password); sess->password = NULL; { struct in_addr dcc_ip; dcc_ip.s_addr = gg_dcc_ip; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() gg_dcc_ip = %s\n", inet_ntoa(dcc_ip)); } if (gg_dcc_ip == (unsigned long) inet_addr("255.255.255.255")) { struct sockaddr_in sin; int sin_len = sizeof(sin); gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() detecting address\n"); if (!getsockname(sess->fd, (struct sockaddr*) &sin, &sin_len)) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() detected address to %s\n", inet_ntoa(sin.sin_addr)); l.local_ip = sin.sin_addr.s_addr; } else { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() unable to detect address\n"); l.local_ip = 0; } } else l.local_ip = gg_dcc_ip; l.uin = gg_fix32(sess->uin); l.hash = gg_fix32(hash); l.status = gg_fix32(sess->initial_status ? sess->initial_status : GG_STATUS_AVAIL); l.version = gg_fix32(sess->protocol_version); l.local_port = gg_fix16(gg_dcc_port); l.image_size = sess->image_size; if (sess->external_addr && sess->external_port > 1023) { l.external_ip = sess->external_addr; l.external_port = gg_fix16(sess->external_port); } gg_debug(GG_DEBUG_TRAFFIC, "// gg_watch_fd() sending GG_LOGIN60 packet\n"); ret = gg_send_packet(sess, GG_LOGIN60, &l, sizeof(l), sess->initial_descr, (sess->initial_descr) ? strlen(sess->initial_descr) : 0, NULL); free(sess->initial_descr); sess->initial_descr = NULL; if (ret == -1) { gg_debug(GG_DEBUG_TRAFFIC, "// gg_watch_fd() sending packet failed. (errno=%d, %s)\n", errno, strerror(errno)); close(sess->fd); sess->fd = -1; e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_WRITING; sess->state = GG_STATE_IDLE; break; } sess->state = GG_STATE_READING_REPLY; break; } case GG_STATE_READING_REPLY: { struct gg_header *h; gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_READING_REPLY\n"); if (!(h = gg_recv_packet(sess))) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() didn't receive packet (errno=%d, %s)\n", errno, strerror(errno)); e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_READING; sess->state = GG_STATE_IDLE; close(sess->fd); sess->fd = -1; break; } if (h->type == GG_LOGIN_OK) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() login succeded\n"); e->type = GG_EVENT_CONN_SUCCESS; sess->state = GG_STATE_CONNECTED; sess->timeout = -1; sess->status = (sess->initial_status) ? sess->initial_status : GG_STATUS_AVAIL; free(h); break; } if (h->type == GG_LOGIN_FAILED) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() login failed\n"); e->event.failure = GG_FAILURE_PASSWORD; errno = EACCES; } else if (h->type == GG_NEED_EMAIL) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() email change needed\n"); e->event.failure = GG_FAILURE_NEED_EMAIL; errno = EACCES; } else { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() invalid packet\n"); e->event.failure = GG_FAILURE_INVALID; errno = EINVAL; } e->type = GG_EVENT_CONN_FAILED; sess->state = GG_STATE_IDLE; close(sess->fd); sess->fd = -1; free(h); break; } case GG_STATE_CONNECTED: { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() GG_STATE_CONNECTED\n"); sess->last_event = time(NULL); if ((res = gg_watch_fd_connected(sess, e)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() watch_fd_connected failed (errno=%d, %s)\n", errno, strerror(errno)); if (errno == EAGAIN) { e->type = GG_EVENT_NONE; res = 0; } else res = -1; } break; } } done: if (res == -1) { free(e); e = NULL; } return e; fail_connecting: if (sess->fd != -1) { close(sess->fd); sess->fd = -1; } e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_CONNECTING; sess->state = GG_STATE_IDLE; goto done; fail_resolving: e->type = GG_EVENT_CONN_FAILED; e->event.failure = GG_FAILURE_RESOLVING; sess->state = GG_STATE_IDLE; goto done; } /* * Local variables: * c-indentation-style: k&r * c-basic-offset: 8 * indent-tabs-mode: notnil * End: * * vim: shiftwidth=8: */ centerim-4.22.10/libgadu/Makefile.in0000644000175000001440000003726611473011437014076 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libgadu DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in COPYING install-sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru liblibgadu_a_AR = $(AR) $(ARFLAGS) liblibgadu_a_LIBADD = am_liblibgadu_a_OBJECTS = libgadu.$(OBJEXT) pubdir.$(OBJEXT) \ dcc.$(OBJEXT) obsolete.$(OBJEXT) common.$(OBJEXT) \ http.$(OBJEXT) events.$(OBJEXT) pubdir50.$(OBJEXT) liblibgadu_a_OBJECTS = $(am_liblibgadu_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(liblibgadu_a_SOURCES) DIST_SOURCES = $(liblibgadu_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = liblibgadu.a liblibgadu_a_SOURCES = libgadu.c pubdir.c dcc.c obsolete.c common.c http.c events.c pubdir50.c noinst_HEADERS = libgadu.h libgadu-config.h compat.h EXTRA_DIST = COPYING all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libgadu/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu libgadu/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) liblibgadu.a: $(liblibgadu_a_OBJECTS) $(liblibgadu_a_DEPENDENCIES) -rm -f liblibgadu.a $(liblibgadu_a_AR) liblibgadu.a $(liblibgadu_a_OBJECTS) $(liblibgadu_a_LIBADD) $(RANLIB) liblibgadu.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dcc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/events.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgadu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/obsolete.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubdir.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubdir50.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/libgadu/install-sh0000755000175000001440000001273611461606612014032 00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 centerim-4.22.10/libgadu/COPYING0000644000175000001440000006347511461606612013067 00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! centerim-4.22.10/libgadu/Makefile.am0000644000175000001440000000031211461606612014045 00000000000000noinst_LIBRARIES = liblibgadu.a liblibgadu_a_SOURCES = libgadu.c pubdir.c dcc.c obsolete.c common.c http.c events.c pubdir50.c noinst_HEADERS = libgadu.h libgadu-config.h compat.h EXTRA_DIST = COPYING centerim-4.22.10/libgadu/dcc.c0000644000175000001440000010151311461606612012713 00000000000000/* $Id: dcc.c,v 1.1 2004/01/26 23:49:33 konst Exp $ */ /* * (C) Copyright 2001-2002 Wojtek Kaniewski * Tomasz Chiliñski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #ifdef sun # include #endif #include #include #include #include #include #include #include #include #include "compat.h" #include "libgadu.h" #ifndef GG_DEBUG_DISABLE /* * gg_dcc_debug_data() // funkcja wewnêtrzna * * wy¶wietla zrzut pakietu w hexie. * * - prefix - prefiks zrzutu pakietu * - fd - deskryptor gniazda * - buf - bufor z danymi * - size - rozmiar danych */ static void gg_dcc_debug_data(const char *prefix, int fd, const void *buf, unsigned int size) { unsigned int i; gg_debug(GG_DEBUG_MISC, "++ gg_dcc %s (fd=%d,len=%d)", prefix, fd, size); for (i = 0; i < size; i++) gg_debug(GG_DEBUG_MISC, " %.2x", ((unsigned char*) buf)[i]); gg_debug(GG_DEBUG_MISC, "\n"); } #else #define gg_dcc_debug_data(a,b,c,d) do { } while (0) #endif /* * gg_dcc_request() * * wysy³a informacjê o tym, ¿e dany klient powinien siê z nami po³±czyæ. * wykorzystywane, kiedy druga strona, której chcemy co¶ wys³aæ jest za * maskarad±. * * - sess - struktura opisuj±ca sesjê GG * - uin - numerek odbiorcy * * patrz gg_send_message_ctcp(). */ int gg_dcc_request(struct gg_session *sess, uin_t uin) { return gg_send_message_ctcp(sess, GG_CLASS_CTCP, uin, "\002", 1); } /* * gg_dcc_fill_filetime() // funkcja wewnêtrzna * * zamienia czas w postaci unixowej na windowsowy. * * - unix - czas w postaci unixowej * - filetime - czas w postaci windowsowej */ void gg_dcc_fill_filetime(uint32_t ut, uint32_t *ft) { #ifdef __GG_LIBGADU_HAVE_LONG_LONG unsigned long long tmp; tmp = ut; tmp += 11644473600LL; tmp *= 10000000LL; #ifndef __GG_LIBGADU_BIGENDIAN ft[0] = (uint32_t) tmp; ft[1] = (uint32_t) (tmp >> 32); #else ft[0] = gg_fix32((uint32_t) (tmp >> 32)); ft[1] = gg_fix32((uint32_t) tmp); #endif #endif } /* * gg_dcc_fill_file_info() * * wype³nia pola struct gg_dcc niezbêdne do wys³ania pliku. * * - d - struktura opisuj±ca po³±czenie DCC * - filename - nazwa pliku * * 0, -1. */ int gg_dcc_fill_file_info(struct gg_dcc *d, const char *filename) { struct stat st; const char *name, *ext, *p; int i, j; gg_debug(GG_DEBUG_FUNCTION, "** gg_dcc_fill_file_info(%p, \"%s\");\n", d, filename); if (!d || d->type != GG_SESSION_DCC_SEND) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_fill_file_info() invalid arguments\n"); errno = EINVAL; return -1; } if (stat(filename, &st) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_fill_file_info() stat() failed (%s)\n", strerror(errno)); return -1; } if ((st.st_mode & S_IFDIR)) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_fill_file_info() that's a directory\n"); errno = EINVAL; return -1; } if ((d->file_fd = open(filename, O_RDONLY)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_fill_file_info() open() failed (%s)\n", strerror(errno)); return -1; } memset(&d->file_info, 0, sizeof(d->file_info)); if (!(st.st_mode & S_IWUSR)) d->file_info.mode |= gg_fix32(GG_DCC_FILEATTR_READONLY); gg_dcc_fill_filetime(st.st_atime, d->file_info.atime); gg_dcc_fill_filetime(st.st_mtime, d->file_info.mtime); gg_dcc_fill_filetime(st.st_ctime, d->file_info.ctime); d->file_info.size = gg_fix32(st.st_size); d->file_info.mode = gg_fix32(0x20); /* FILE_ATTRIBUTE_ARCHIVE */ if (!(name = strrchr(filename, '/'))) name = filename; else name++; if (!(ext = strrchr(name, '.'))) ext = name + strlen(name); for (i = 0, p = name; i < 8 && p < ext; i++, p++) d->file_info.short_filename[i] = toupper(name[i]); if (strlen(ext) > 0) { for (j = 0; *ext && j < 4; j++, p++) d->file_info.short_filename[i + j] = toupper(ext[j]); } gg_debug(GG_DEBUG_MISC, "// gg_dcc_fill_file_info() short name \"%s\", dos name \"%s\"\n", name, d->file_info.short_filename); strncpy(d->file_info.filename, name, sizeof(d->file_info.filename) - 1); return 0; } /* * gg_dcc_transfer() // funkcja wewnêtrzna * * inicjuje proces wymiany pliku z danym klientem. * * - ip - adres ip odbiorcy * - port - port odbiorcy * - my_uin - w³asny numer * - peer_uin - numer obiorcy * - type - rodzaj wymiany (GG_SESSION_DCC_SEND lub GG_SESSION_DCC_GET) * * zaalokowana struct gg_dcc lub NULL je¶li wyst±pi³ b³±d. */ static struct gg_dcc *gg_dcc_transfer(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin, int type) { struct gg_dcc *d = NULL; struct in_addr addr; addr.s_addr = ip; gg_debug(GG_DEBUG_FUNCTION, "** gg_dcc_transfer(%s, %d, %ld, %ld, %s);\n", inet_ntoa(addr), port, my_uin, peer_uin, (type == GG_SESSION_DCC_SEND) ? "SEND" : "GET"); if (!ip || ip == INADDR_NONE || !port || !my_uin || !peer_uin) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_transfer() invalid arguments\n"); errno = EINVAL; return NULL; } if (!(d = (void*) calloc(1, sizeof(*d)))) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_transfer() not enough memory\n"); return NULL; } d->check = GG_CHECK_WRITE; d->state = GG_STATE_CONNECTING; d->type = type; d->timeout = GG_DEFAULT_TIMEOUT; d->file_fd = -1; d->active = 1; d->fd = -1; d->uin = my_uin; d->peer_uin = peer_uin; if ((d->fd = gg_connect(&addr, port, 1)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_transfer() connection failed\n"); free(d); return NULL; } return d; } /* * gg_dcc_get_file() * * inicjuje proces odbierania pliku od danego klienta, gdy ten wys³a³ do * nas ¿±danie po³±czenia. * * - ip - adres ip odbiorcy * - port - port odbiorcy * - my_uin - w³asny numer * - peer_uin - numer obiorcy * * zaalokowana struct gg_dcc lub NULL je¶li wyst±pi³ b³±d. */ struct gg_dcc *gg_dcc_get_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_get_file() handing over to gg_dcc_transfer()\n"); return gg_dcc_transfer(ip, port, my_uin, peer_uin, GG_SESSION_DCC_GET); } /* * gg_dcc_send_file() * * inicjuje proces wysy³ania pliku do danego klienta. * * - ip - adres ip odbiorcy * - port - port odbiorcy * - my_uin - w³asny numer * - peer_uin - numer obiorcy * * zaalokowana struct gg_dcc lub NULL je¶li wyst±pi³ b³±d. */ struct gg_dcc *gg_dcc_send_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_send_file() handing over to gg_dcc_transfer()\n"); return gg_dcc_transfer(ip, port, my_uin, peer_uin, GG_SESSION_DCC_SEND); } /* * gg_dcc_voice_chat() * * próbuje nawi±zaæ po³±czenie g³osowe. * * - ip - adres ip odbiorcy * - port - port odbiorcy * - my_uin - w³asny numer * - peer_uin - numer obiorcy * * zaalokowana struct gg_dcc lub NULL je¶li wyst±pi³ b³±d. */ struct gg_dcc *gg_dcc_voice_chat(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_voice_chat() handing over to gg_dcc_transfer()\n"); return gg_dcc_transfer(ip, port, my_uin, peer_uin, GG_SESSION_DCC_VOICE); } /* * gg_dcc_set_type() * * po zdarzeniu GG_EVENT_DCC_CALLBACK nale¿y ustawiæ typ po³±czenia za * pomoc± tej funkcji. * * - d - struktura opisuj±ca po³±czenie * - type - typ po³±czenia (GG_SESSION_DCC_SEND lub GG_SESSION_DCC_VOICE) */ void gg_dcc_set_type(struct gg_dcc *d, int type) { d->type = type; d->state = (type == GG_SESSION_DCC_SEND) ? GG_STATE_SENDING_FILE_INFO : GG_STATE_SENDING_VOICE_REQUEST; } /* * gg_dcc_callback() // funkcja wewnêtrzna * * wywo³ywana z struct gg_dcc->callback, odpala gg_dcc_watch_fd i umieszcza * rezultat w struct gg_dcc->event. * * - d - structura opisuj±ca po³±czenie * * 0, -1. */ static int gg_dcc_callback(struct gg_dcc *d) { struct gg_event *e = gg_dcc_watch_fd(d); d->event = e; return (e != NULL) ? 0 : -1; } /* * gg_dcc_socket_create() * * tworzy gniazdo dla bezpo¶redniej komunikacji miêdzy klientami. * * - uin - w³asny numer * - port - preferowany port, je¶li równy 0 lub -1, próbuje domy¶lnego * * zaalokowana struct gg_dcc, któr± po¼niej nale¿y zwolniæ funkcj± * gg_dcc_free(), albo NULL je¶li wyst±pi³ b³±d. */ struct gg_dcc *gg_dcc_socket_create(uin_t uin, uint16_t port) { struct gg_dcc *c; struct sockaddr_in sin; int sock, bound = 0; gg_debug(GG_DEBUG_FUNCTION, "** gg_create_dcc_socket(%d, %d);\n", uin, port); if (!uin) { gg_debug(GG_DEBUG_MISC, "// gg_create_dcc_socket() invalid arguments\n"); errno = EINVAL; return NULL; } if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_create_dcc_socket() can't create socket (%s)\n", strerror(errno)); return NULL; } if (!port) port = GG_DEFAULT_DCC_PORT; while (!bound) { sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(port); gg_debug(GG_DEBUG_MISC, "// gg_create_dcc_socket() trying port %d\n", port); if (!bind(sock, (struct sockaddr*) &sin, sizeof(sin))) bound = 1; else { if (++port == 65535) { gg_debug(GG_DEBUG_MISC, "// gg_create_dcc_socket() no free port found\n"); return NULL; } } } if (listen(sock, 10)) { gg_debug(GG_DEBUG_MISC, "// gg_create_dcc_socket() unable to listen (%s)\n", strerror(errno)); return NULL; } gg_debug(GG_DEBUG_MISC, "// gg_create_dcc_socket() bound to port %d\n", port); if (!(c = malloc(sizeof(*c)))) { gg_debug(GG_DEBUG_MISC, "// gg_create_dcc_socket() not enough memory for struct\n"); close(sock); return NULL; } memset(c, 0, sizeof(*c)); c->port = c->id = port; c->fd = sock; c->type = GG_SESSION_DCC_SOCKET; c->uin = uin; c->timeout = -1; c->state = GG_STATE_LISTENING; c->check = GG_CHECK_READ; c->callback = gg_dcc_callback; c->destroy = gg_dcc_free; gg_dcc_ip = INADDR_ANY; return c; } /* * gg_dcc_voice_send() * * wysy³a ramkê danych dla rozmowy g³osowej. * * - d - struktura opisuj±ca po³±czenie dcc * - buf - bufor z danymi * - length - rozmiar ramki * * 0, -1. */ int gg_dcc_voice_send(struct gg_dcc *d, char *buf, int length) { struct packet_s { uint8_t type; uint32_t length; } GG_PACKED; struct packet_s packet; gg_debug(GG_DEBUG_FUNCTION, "++ gg_dcc_voice_send(%p, %p, %d);\n", d, buf, length); if (!d || !buf || length < 0 || d->type != GG_SESSION_DCC_VOICE) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_voice_send() invalid argument\n"); return -1; } packet.type = 0x03; /* XXX */ packet.length = gg_fix32(length); if (write(d->fd, &packet, sizeof(packet)) < (signed)sizeof(packet)) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_voice_send() write() failed\n"); return -1; } gg_dcc_debug_data("write", d->fd, &packet, sizeof(packet)); if (write(d->fd, buf, length) < length) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_voice_send() write() failed\n"); return -1; } gg_dcc_debug_data("write", d->fd, buf, length); return 0; } #define gg_read(fd, buf, size) \ { \ int tmp = read(fd, buf, size); \ \ if (tmp < (int) size) { \ if (tmp == -1) { \ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() failed (errno=%d, %s)\n", errno, strerror(errno)); \ } else if (tmp == 0) { \ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() failed, connection broken\n"); \ } else { \ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() failed (%d bytes, %d needed)\n", tmp, size); \ } \ e->type = GG_EVENT_DCC_ERROR; \ e->event.dcc_error = GG_ERROR_DCC_HANDSHAKE; \ return e; \ } \ gg_dcc_debug_data("read", fd, buf, size); \ } #define gg_write(fd, buf, size) \ { \ int tmp; \ gg_dcc_debug_data("write", fd, buf, size); \ tmp = write(fd, buf, size); \ if (tmp < (int) size) { \ if (tmp == -1) { \ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() write() failed (errno=%d, %s)\n", errno, strerror(errno)); \ } else { \ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() write() failed (%d needed, %d done)\n", size, tmp); \ } \ e->type = GG_EVENT_DCC_ERROR; \ e->event.dcc_error = GG_ERROR_DCC_HANDSHAKE; \ return e; \ } \ } /* * gg_dcc_watch_fd() * * funkcja, któr± nale¿y wywo³aæ, gdy co¶ siê zmieni na gg_dcc->fd. * * - h - struktura zwrócona przez gg_create_dcc_socket() * * zaalokowana struct gg_event lub NULL, je¶li zabrak³o pamiêci na ni±. */ struct gg_event *gg_dcc_watch_fd(struct gg_dcc *h) { struct gg_event *e; int foo; gg_debug(GG_DEBUG_FUNCTION, "** gg_dcc_watch_fd(%p);\n", h); if (!h || (h->type != GG_SESSION_DCC && h->type != GG_SESSION_DCC_SOCKET && h->type != GG_SESSION_DCC_SEND && h->type != GG_SESSION_DCC_GET && h->type != GG_SESSION_DCC_VOICE)) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() invalid argument\n"); errno = EINVAL; return NULL; } if (!(e = (void*) calloc(1, sizeof(*e)))) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() not enough memory\n"); return NULL; } e->type = GG_EVENT_NONE; if (h->type == GG_SESSION_DCC_SOCKET) { struct sockaddr_in sin; struct gg_dcc *c; int fd, sin_len = sizeof(sin), one = 1; if ((fd = accept(h->fd, (struct sockaddr*) &sin, &sin_len)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() can't accept() new connection (errno=%d, %s)\n", errno, strerror(errno)); return e; } gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() new direct connection from %s:%d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port)); #ifdef FIONBIO if (ioctl(fd, FIONBIO, &one) == -1) { #else if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) { #endif gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() can't set nonblocking (errno=%d, %s)\n", errno, strerror(errno)); close(fd); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_HANDSHAKE; return e; } if (!(c = (void*) calloc(1, sizeof(*c)))) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() not enough memory for client data\n"); free(e); close(fd); return NULL; } c->fd = fd; c->check = GG_CHECK_READ; c->state = GG_STATE_READING_UIN_1; c->type = GG_SESSION_DCC; c->timeout = GG_DEFAULT_TIMEOUT; c->file_fd = -1; c->remote_addr = sin.sin_addr.s_addr; c->remote_port = ntohs(sin.sin_port); e->type = GG_EVENT_DCC_NEW; e->event.dcc_new = c; return e; } else { struct gg_dcc_tiny_packet tiny; struct gg_dcc_small_packet small; struct gg_dcc_big_packet big; int size, tmp, res, res_size = sizeof(res); unsigned int utmp; char buf[1024], ack[] = "UDAG"; struct gg_dcc_file_info_packet { struct gg_dcc_big_packet big; struct gg_file_info file_info; } GG_PACKED; struct gg_dcc_file_info_packet file_info_packet; switch (h->state) { case GG_STATE_READING_UIN_1: case GG_STATE_READING_UIN_2: { uin_t uin; gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_READING_UIN_%d\n", (h->state == GG_STATE_READING_UIN_1) ? 1 : 2); gg_read(h->fd, &uin, sizeof(uin)); if (h->state == GG_STATE_READING_UIN_1) { h->state = GG_STATE_READING_UIN_2; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; h->peer_uin = gg_fix32(uin); } else { h->state = GG_STATE_SENDING_ACK; h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; h->uin = gg_fix32(uin); e->type = GG_EVENT_DCC_CLIENT_ACCEPT; } return e; } case GG_STATE_SENDING_ACK: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_SENDING_ACK\n"); gg_write(h->fd, ack, 4); h->state = GG_STATE_READING_TYPE; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; return e; case GG_STATE_READING_TYPE: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_TYPE\n"); gg_read(h->fd, &small, sizeof(small)); small.type = gg_fix32(small.type); switch (small.type) { case 0x0003: /* XXX */ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() callback\n"); h->type = GG_SESSION_DCC_SEND; h->state = GG_STATE_SENDING_FILE_INFO; h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; e->type = GG_EVENT_DCC_CALLBACK; break; case 0x0002: /* XXX */ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() dialin\n"); h->type = GG_SESSION_DCC_GET; h->state = GG_STATE_READING_REQUEST; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; h->incoming = 1; break; default: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() unknown dcc type (%.4x) from %ld\n", small.type, h->peer_uin); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_HANDSHAKE; } return e; case GG_STATE_READING_REQUEST: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_REQUEST\n"); gg_read(h->fd, &small, sizeof(small)); small.type = gg_fix32(small.type); switch (small.type) { case 0x0001: /* XXX */ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() file transfer request\n"); h->state = GG_STATE_READING_FILE_INFO; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; break; case 0x0003: /* XXX */ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() voice chat request\n"); h->state = GG_STATE_SENDING_VOICE_ACK; h->check = GG_CHECK_WRITE; h->timeout = GG_DCC_TIMEOUT_VOICE_ACK; h->type = GG_SESSION_DCC_VOICE; e->type = GG_EVENT_DCC_NEED_VOICE_ACK; break; default: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() unknown dcc request (%.4x) from %ld\n", small.type, h->peer_uin); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_HANDSHAKE; } return e; case GG_STATE_READING_FILE_INFO: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_FILE_INFO\n"); gg_read(h->fd, &file_info_packet, sizeof(file_info_packet)); memcpy(&h->file_info, &file_info_packet.file_info, sizeof(h->file_info)); h->file_info.mode = gg_fix32(h->file_info.mode); h->file_info.size = gg_fix32(h->file_info.size); h->state = GG_STATE_SENDING_FILE_ACK; h->check = GG_CHECK_WRITE; h->timeout = GG_DCC_TIMEOUT_FILE_ACK; e->type = GG_EVENT_DCC_NEED_FILE_ACK; return e; case GG_STATE_SENDING_FILE_ACK: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_SENDING_FILE_ACK\n"); big.type = gg_fix32(0x0006); /* XXX */ big.dunno1 = gg_fix32(h->offset); big.dunno2 = 0; gg_write(h->fd, &big, sizeof(big)); h->state = GG_STATE_READING_FILE_HEADER; h->chunk_size = sizeof(big); h->chunk_offset = 0; if (!(h->chunk_buf = malloc(sizeof(big)))) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() out of memory\n"); free(e); return NULL; } h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; return e; case GG_STATE_SENDING_VOICE_ACK: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_SENDING_VOICE_ACK\n"); tiny.type = 0x01; /* XXX */ gg_write(h->fd, &tiny, sizeof(tiny)); h->state = GG_STATE_READING_VOICE_HEADER; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; h->offset = 0; return e; case GG_STATE_READING_FILE_HEADER: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_FILE_HEADER\n"); tmp = read(h->fd, h->chunk_buf + h->chunk_offset, h->chunk_size - h->chunk_offset); if (tmp == -1) { gg_debug(GG_DEBUG_MISC, "// gg_watch_fd() read() failed (errno=%d, %s)\n", errno, strerror(errno)); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_NET; return e; } gg_dcc_debug_data("read", h->fd, h->chunk_buf + h->chunk_offset, h->chunk_size - h->chunk_offset); h->chunk_offset += tmp; if (h->chunk_offset < h->chunk_size) return e; memcpy(&big, h->chunk_buf, sizeof(big)); free(h->chunk_buf); h->chunk_buf = NULL; big.type = gg_fix32(big.type); h->chunk_size = gg_fix32(big.dunno1); h->chunk_offset = 0; if (big.type == 0x0005) { /* XXX */ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() transfer refused\n"); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_REFUSED; return e; } if (h->chunk_size == 0) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() empty chunk, EOF\n"); e->type = GG_EVENT_DCC_DONE; return e; } h->state = GG_STATE_GETTING_FILE; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; h->established = 1; return e; case GG_STATE_READING_VOICE_HEADER: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_VOICE_HEADER\n"); gg_read(h->fd, &tiny, sizeof(tiny)); switch (tiny.type) { case 0x03: /* XXX */ h->state = GG_STATE_READING_VOICE_SIZE; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; h->established = 1; break; case 0x04: /* XXX */ gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() peer breaking connection\n"); /* XXX zwracaæ odpowiedni event */ default: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() unknown request (%.2x)\n", tiny.type); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_HANDSHAKE; } return e; case GG_STATE_READING_VOICE_SIZE: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_VOICE_SIZE\n"); gg_read(h->fd, &small, sizeof(small)); small.type = gg_fix32(small.type); if (small.type < 16 || small.type > sizeof(buf)) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() invalid voice frame size (%d)\n", small.type); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_NET; return e; } h->chunk_size = small.type; h->chunk_offset = 0; if (!(h->voice_buf = malloc(h->chunk_size))) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() out of memory for voice frame\n"); return NULL; } h->state = GG_STATE_READING_VOICE_DATA; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; return e; case GG_STATE_READING_VOICE_DATA: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_VOICE_DATA\n"); tmp = read(h->fd, h->voice_buf + h->chunk_offset, h->chunk_size - h->chunk_offset); if (tmp < 1) { if (tmp == -1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() failed (errno=%d, %s)\n", errno, strerror(errno)); } else { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() failed, connection broken\n"); } e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_NET; return e; } gg_dcc_debug_data("read", h->fd, h->voice_buf + h->chunk_offset, tmp); h->chunk_offset += tmp; if (h->chunk_offset >= h->chunk_size) { e->type = GG_EVENT_DCC_VOICE_DATA; e->event.dcc_voice_data.data = h->voice_buf; e->event.dcc_voice_data.length = h->chunk_size; h->state = GG_STATE_READING_VOICE_HEADER; h->voice_buf = NULL; } h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; return e; case GG_STATE_CONNECTING: { uin_t uins[2]; gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_CONNECTING\n"); res = 0; if ((foo = getsockopt(h->fd, SOL_SOCKET, SO_ERROR, &res, &res_size)) || res) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() connection failed (fd=%d,errno=%d(%s),foo=%d,res=%d(%s))\n", h->fd, errno, strerror(errno), foo, res, strerror(res)); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_HANDSHAKE; return e; } gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() connected, sending uins\n"); uins[0] = gg_fix32(h->uin); uins[1] = gg_fix32(h->peer_uin); gg_write(h->fd, uins, sizeof(uins)); h->state = GG_STATE_READING_ACK; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; return e; } case GG_STATE_READING_ACK: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_ACK\n"); gg_read(h->fd, buf, 4); if (strncmp(buf, ack, 4)) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() did't get ack\n"); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_HANDSHAKE; return e; } h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; h->state = GG_STATE_SENDING_REQUEST; return e; case GG_STATE_SENDING_VOICE_REQUEST: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_SENDING_VOICE_REQUEST\n"); small.type = gg_fix32(0x0003); gg_write(h->fd, &small, sizeof(small)); h->state = GG_STATE_READING_VOICE_ACK; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; return e; case GG_STATE_SENDING_REQUEST: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_SENDING_REQUEST\n"); small.type = (h->type == GG_SESSION_DCC_GET) ? gg_fix32(0x0003) : gg_fix32(0x0002); /* XXX */ gg_write(h->fd, &small, sizeof(small)); switch (h->type) { case GG_SESSION_DCC_GET: h->state = GG_STATE_READING_REQUEST; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; break; case GG_SESSION_DCC_SEND: h->state = GG_STATE_SENDING_FILE_INFO; h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; if (h->file_fd == -1) e->type = GG_EVENT_DCC_NEED_FILE_INFO; break; case GG_SESSION_DCC_VOICE: h->state = GG_STATE_SENDING_VOICE_REQUEST; h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; break; } return e; case GG_STATE_SENDING_FILE_INFO: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_SENDING_FILE_INFO\n"); if (h->file_fd == -1) { e->type = GG_EVENT_DCC_NEED_FILE_INFO; return e; } small.type = gg_fix32(0x0001); /* XXX */ gg_write(h->fd, &small, sizeof(small)); file_info_packet.big.type = gg_fix32(0x0003); /* XXX */ file_info_packet.big.dunno1 = 0; file_info_packet.big.dunno2 = 0; memcpy(&file_info_packet.file_info, &h->file_info, sizeof(h->file_info)); /* zostaj± teraz u nas, wiêc odwracamy z powrotem */ h->file_info.size = gg_fix32(h->file_info.size); h->file_info.mode = gg_fix32(h->file_info.mode); gg_write(h->fd, &file_info_packet, sizeof(file_info_packet)); h->state = GG_STATE_READING_FILE_ACK; h->check = GG_CHECK_READ; h->timeout = GG_DCC_TIMEOUT_FILE_ACK; return e; case GG_STATE_READING_FILE_ACK: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_FILE_ACK\n"); gg_read(h->fd, &big, sizeof(big)); /* XXX sprawdzaæ wynik */ h->offset = gg_fix32(big.dunno1); h->state = GG_STATE_SENDING_FILE_HEADER; h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; e->type = GG_EVENT_DCC_ACK; return e; case GG_STATE_READING_VOICE_ACK: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_READING_VOICE_ACK\n"); gg_read(h->fd, &tiny, sizeof(tiny)); if (tiny.type != 0x01) { gg_debug(GG_DEBUG_MISC, "// invalid reply (%.2x), connection refused\n", tiny.type); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_REFUSED; return e; } h->state = GG_STATE_READING_VOICE_HEADER; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; e->type = GG_EVENT_DCC_ACK; return e; case GG_STATE_SENDING_FILE_HEADER: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_SENDING_FILE_HEADER\n"); h->chunk_offset = 0; if ((h->chunk_size = h->file_info.size - h->offset) > 4096) { h->chunk_size = 4096; big.type = gg_fix32(0x0003); /* XXX */ } else big.type = gg_fix32(0x0002); /* XXX */ big.dunno1 = gg_fix32(h->chunk_size); big.dunno2 = 0; gg_write(h->fd, &big, sizeof(big)); h->state = GG_STATE_SENDING_FILE; h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; h->established = 1; return e; case GG_STATE_SENDING_FILE: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_SENDING_FILE\n"); if ((utmp = h->chunk_size - h->chunk_offset) > sizeof(buf)) utmp = sizeof(buf); gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() offset=%d, size=%d\n", h->offset, h->file_info.size); lseek(h->file_fd, h->offset, SEEK_SET); size = read(h->file_fd, buf, utmp); /* b³±d */ if (size == -1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() failed. (errno=%d, %s)\n", errno, strerror(errno)); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_FILE; return e; } /* koniec pliku? */ if (size == 0) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() reached eof\n"); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_EOF; return e; } /* je¶li wczytali¶my wiêcej, utnijmy. */ if (h->offset + size > h->file_info.size) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() too much (read=%d, ofs=%d, size=%d)\n", size, h->offset, h->file_info.size); size = h->file_info.size - h->offset; if (size < 1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() reached EOF after cutting\n"); e->type = GG_EVENT_DCC_DONE; return e; } } tmp = write(h->fd, buf, size); if (tmp == -1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() write() failed (%s)\n", strerror(errno)); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_NET; return e; } h->offset += size; if (h->offset >= h->file_info.size) { e->type = GG_EVENT_DCC_DONE; return e; } h->chunk_offset += size; if (h->chunk_offset >= h->chunk_size) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() chunk finished\n"); h->state = GG_STATE_SENDING_FILE_HEADER; h->timeout = GG_DEFAULT_TIMEOUT; } else { h->state = GG_STATE_SENDING_FILE; h->timeout = GG_DCC_TIMEOUT_SEND; } h->check = GG_CHECK_WRITE; return e; case GG_STATE_GETTING_FILE: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_GETTING_FILE\n"); if ((utmp = h->chunk_size - h->chunk_offset) > sizeof(buf)) utmp = sizeof(buf); size = read(h->fd, buf, utmp); gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() ofs=%d, size=%d, read()=%d\n", h->offset, h->file_info.size, size); /* b³±d */ if (size == -1) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() failed. (errno=%d, %s)\n", errno, strerror(errno)); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_NET; return e; } /* koniec? */ if (size == 0) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() read() reached eof\n"); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_EOF; return e; } tmp = write(h->file_fd, buf, size); if (tmp == -1 || tmp < size) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() write() failed (%d:fd=%d:res=%d:%s)\n", tmp, h->file_fd, size, strerror(errno)); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_NET; return e; } h->offset += size; if (h->offset >= h->file_info.size) { e->type = GG_EVENT_DCC_DONE; return e; } h->chunk_offset += size; if (h->chunk_offset >= h->chunk_size) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() chunk finished\n"); h->state = GG_STATE_READING_FILE_HEADER; h->timeout = GG_DEFAULT_TIMEOUT; h->chunk_offset = 0; h->chunk_size = sizeof(big); if (!(h->chunk_buf = malloc(sizeof(big)))) { gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() out of memory\n"); free(e); return NULL; } } else { h->state = GG_STATE_GETTING_FILE; h->timeout = GG_DCC_TIMEOUT_GET; } h->check = GG_CHECK_READ; return e; default: gg_debug(GG_DEBUG_MISC, "// gg_dcc_watch_fd() GG_STATE_???\n"); e->type = GG_EVENT_DCC_ERROR; e->event.dcc_error = GG_ERROR_DCC_HANDSHAKE; return e; } } return e; } #undef gg_read #undef gg_write /* * gg_dcc_free() * * zwalnia pamiêæ po strukturze po³±czenia dcc. * * - d - zwalniana struktura */ void gg_dcc_free(struct gg_dcc *d) { gg_debug(GG_DEBUG_FUNCTION, "** gg_dcc_free(%p);\n", d); if (!d) return; if (d->fd != -1) close(d->fd); if (d->chunk_buf) { free(d->chunk_buf); d->chunk_buf = NULL; } free(d); } /* * Local variables: * c-indentation-style: k&r * c-basic-offset: 8 * indent-tabs-mode: notnil * End: * * vim: shiftwidth=8: */ centerim-4.22.10/libgadu/libgadu.c0000644000175000001440000011650711473007750013603 00000000000000/* $Id: libgadu.c,v 1.2 2004/03/30 22:44:07 konst Exp $ */ /* * (C) Copyright 2001-2003 Wojtek Kaniewski * Robert J. Wo¼ny * Arkadiusz Mi¶kiewicz * Tomasz Chiliñski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #ifdef sun # include #endif #include "libgadu-config.h" #include #include #ifdef __GG_LIBGADU_HAVE_PTHREAD # include #endif #include #include #include #include #include #if defined(HAVE_OPENSSL) #define OPENSSL_NO_KRB5 1 # include # include #elif defined(HAVE_NSS_COMPAT) # include #elif HAVE_GNUTLS #include #endif #include "compat.h" #include "libgadu.h" int gg_debug_level = 0; void (*gg_debug_handler)(int level, const char *format, va_list ap) = NULL; int gg_dcc_port = 0; unsigned long gg_dcc_ip = 0; /* * zmienne opisuj±ce parametry proxy http. */ char *gg_proxy_host = NULL; int gg_proxy_port = 0; int gg_proxy_enabled = 0; int gg_proxy_http_only = 0; char *gg_proxy_username = NULL; char *gg_proxy_password = NULL; #ifndef lint static char rcsid[] #ifdef __GNUC__ __attribute__ ((unused)) #endif = "$Id: libgadu.c,v 1.2 2004/03/30 22:44:07 konst Exp $"; #endif /* * gg_libgadu_version() * * zwraca wersjê libgadu. * * - brak * * wersja libgadu. */ const char *gg_libgadu_version() { return GG_LIBGADU_VERSION; } /* * gg_fix32() * * zamienia kolejno¶æ bajtów w liczbie 32-bitowej tak, by odpowiada³a * kolejno¶ci bajtów w protokole GG. ze wzglêdu na LE-owo¶æ serwera, * zamienia tylko na maszynach BE-wych. * * - x - liczba do zamiany * * liczba z odpowiedni± kolejno¶ci± bajtów. */ uint32_t gg_fix32(uint32_t x) { #ifndef __GG_LIBGADU_BIGENDIAN return x; #else return (uint32_t) (((x & (uint32_t) 0x000000ffU) << 24) | ((x & (uint32_t) 0x0000ff00U) << 8) | ((x & (uint32_t) 0x00ff0000U) >> 8) | ((x & (uint32_t) 0xff000000U) >> 24)); #endif } /* * gg_fix16() * * zamienia kolejno¶æ bajtów w liczbie 16-bitowej tak, by odpowiada³a * kolejno¶ci bajtów w protokole GG. ze wzglêdu na LE-owo¶æ serwera, * zamienia tylko na maszynach BE-wych. * * - x - liczba do zamiany * * liczba z odpowiedni± kolejno¶ci± bajtów. */ uint16_t gg_fix16(uint16_t x) { #ifndef __GG_LIBGADU_BIGENDIAN return x; #else return (uint16_t) (((x & (uint16_t) 0x00ffU) << 8) | ((x & (uint16_t) 0xff00U) >> 8)); #endif } /* * gg_login_hash() // funkcja wewnêtrzna * * liczy hash z has³a i danego seeda. * * - password - has³o do hashowania * - seed - warto¶æ podana przez serwer * * hash. */ unsigned int gg_login_hash(const unsigned char *password, unsigned int seed) { unsigned int x, y, z; y = seed; for (x = 0; *password; password++) { x = (x & 0xffffff00) | *password; y ^= x; y += x; x <<= 8; y ^= x; x <<= 8; y -= x; x <<= 8; y ^= x; z = y & 0x1F; y = (y << z) | (y >> (32 - z)); } return y; } /* * gg_resolve() // funkcja wewnêtrzna * * tworzy potok, forkuje siê i w drugim procesie zaczyna resolvowaæ * podanego hosta. zapisuje w sesji deskryptor potoku. je¶li co¶ tam * bêdzie gotowego, znaczy, ¿e mo¿na wczytaæ struct in_addr. je¶li * nie znajdzie, zwraca INADDR_NONE. * * - fd - wska¼nik gdzie wrzuciæ deskryptor * - pid - gdzie wrzuciæ pid procesu potomnego * - hostname - nazwa hosta do zresolvowania * * 0, -1. */ int gg_resolve(int *fd, int *pid, const char *hostname) { int pipes[2], res; struct in_addr a; gg_debug(GG_DEBUG_FUNCTION, "** gg_resolve(%p, %p, \"%s\");\n", fd, pid, hostname); if (!fd || !pid) { errno = EFAULT; return -1; } if (pipe(pipes) == -1) return -1; if ((res = fork()) == -1) return -1; if (!res) { if ((a.s_addr = inet_addr(hostname)) == INADDR_NONE) { struct hostent *he; if (!(he = gg_gethostbyname(hostname))) a.s_addr = INADDR_NONE; else { memcpy((char*) &a, he->h_addr, sizeof(a)); free(he); } } write(pipes[1], &a, sizeof(a)); _exit(0); } close(pipes[1]); *fd = pipes[0]; *pid = res; return 0; } #ifdef __GG_LIBGADU_HAVE_PTHREAD struct gg_resolve_pthread_data { char *hostname; int fd; }; static void *gg_resolve_pthread_thread(void *arg) { struct gg_resolve_pthread_data *d = arg; struct in_addr a; if ((a.s_addr = inet_addr(d->hostname)) == INADDR_NONE) { struct hostent *he; if (!(he = gg_gethostbyname(d->hostname))) a.s_addr = INADDR_NONE; else { memcpy((char*) &a, he->h_addr, sizeof(a)); free(he); } } write(d->fd, &a, sizeof(a)); close(d->fd); free(d->hostname); d->hostname = NULL; free(d); pthread_exit(NULL); return NULL; /* ¿eby kompilator nie marudzi³ */ } /* * gg_resolve_pthread() // funkcja wewnêtrzna * * tworzy potok, nowy w±tek i w nim zaczyna resolvowaæ podanego hosta. * zapisuje w sesji deskryptor potoku. je¶li co¶ tam bêdzie gotowego, * znaczy, ¿e mo¿na wczytaæ struct in_addr. je¶li nie znajdzie, zwraca * INADDR_NONE. * * - fd - wska¼nik do zmiennej przechowuj±cej desktyptor resolvera * - resolver - wska¼nik do wska¼nika resolvera * - hostname - nazwa hosta do zresolvowania * * 0, -1. */ int gg_resolve_pthread(int *fd, void **resolver, const char *hostname) { struct gg_resolve_pthread_data *d; pthread_t *tmp; int pipes[2]; gg_debug(GG_DEBUG_FUNCTION, "** gg_resolve_pthread(%p, %p, \"%s\");\n", fd, resolver, hostname); if (!resolver || !fd || !hostname) { gg_debug(GG_DEBUG_MISC, "// gg_resolve_pthread() invalid arguments\n"); errno = EFAULT; return -1; } if (!(tmp = malloc(sizeof(pthread_t)))) { gg_debug(GG_DEBUG_MISC, "// gg_resolve_pthread() out of memory for pthread id\n"); return -1; } if (pipe(pipes) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_resolve_pthread() unable to create pipes (errno=%d, %s)\n", errno, strerror(errno)); free(tmp); return -1; } if (!(d = malloc(sizeof(*d))) || !(d->hostname = strdup(hostname))) { gg_debug(GG_DEBUG_MISC, "// gg_resolve_pthread() out of memory\n"); free(tmp); return -1; } d->fd = pipes[1]; if (pthread_create(tmp, NULL, gg_resolve_pthread_thread, d)) { gg_debug(GG_DEBUG_MISC, "// gg_resolve_phread() unable to create thread\n"); close(pipes[0]); close(pipes[1]); free(tmp); return -1; } gg_debug(GG_DEBUG_MISC, "// gg_resolve_pthread() %p\n", tmp); *resolver = tmp; *fd = pipes[0]; return 0; } #endif /* * gg_read() // funkcja pomocnicza * * czyta z gniazda okre¶lon± ilo¶æ bajtów. bierze pod uwagê, czy mamy * po³±czenie zwyk³e czy TLS. * * - sess - sesja, * - buf - bufor, * - length - ilo¶æ bajtów, * * takie same warto¶ci jak read(). */ int gg_read(struct gg_session *sess, char *buf, int length) { int res; #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if (sess->ssl) { int err; res = SSL_read(sess->ssl, buf, length); if (res < 0) { err = SSL_get_error(sess->ssl, res); if (err == SSL_ERROR_WANT_READ) errno = EAGAIN; return -1; } } else #elif HAVE_GNUTLS if (sess->session) { do { res = gnutls_record_recv(sess->session, buf, length); } while ( res < 0 && (res == GNUTLS_E_INTERRUPTED || res == GNUTLS_E_AGAIN) ); } else #endif res = read(sess->fd, buf, length); return res; } /* * gg_write() // funkcja pomocnicza * * zapisuje do gniazda okre¶lon± ilo¶æ bajtów. bierze pod uwagê, czy mamy * po³±czenie zwyk³e czy TLS. * * - sess - sesja, * - buf - bufor, * - length - ilo¶æ bajtów, * * takie same warto¶ci jak write(). */ int gg_write(struct gg_session *sess, const char *buf, int length) { int res = 0; #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if (sess->ssl) { int err; res = SSL_write(sess->ssl, buf, length); if (res < 0) { err = SSL_get_error(sess->ssl, res); if (err == SSL_ERROR_WANT_WRITE) errno = EAGAIN; return -1; } } else #elif HAVE_GNUTLS if (sess->session) { if(res = gnutls_record_send( sess->session, buf, length) < 0) fprintf(stderr,"Can't write to server"); } else #endif res = write(sess->fd, buf, length); return res; } /* * gg_recv_packet() // funkcja wewnêtrzna * * odbiera jeden pakiet i zwraca wska¼nik do niego. pamiêæ po nim * nale¿y zwolniæ za pomoc± free(). * * - sess - opis sesji * * w przypadku b³êdu NULL, kod b³êdu w errno. */ void *gg_recv_packet(struct gg_session *sess) { struct gg_header h; char *buf = NULL; int ret = 0; unsigned int offset, size = 0; gg_debug(GG_DEBUG_FUNCTION, "** gg_recv_packet(%p);\n", sess); if (!sess) { errno = EFAULT; return NULL; } if (sess->recv_left < 1) { if (sess->header_buf) { memcpy(&h, sess->header_buf, sess->header_done); gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() header recv: resuming last read (%d bytes left)\n", sizeof(h) - sess->header_done); free(sess->header_buf); sess->header_buf = NULL; } else sess->header_done = 0; while (sess->header_done < sizeof(h)) { ret = gg_read(sess, (char*) &h + sess->header_done, sizeof(h) - sess->header_done); gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() header recv(%d,%p,%d) = %d\n", sess->fd, &h + sess->header_done, sizeof(h) - sess->header_done, ret); if (!ret) { gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() header recv() failed: connection broken\n"); return NULL; } if (ret == -1) { if (errno == EINTR) { gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() header recv() interrupted system call, resuming\n"); continue; } if (errno == EAGAIN) { gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() header recv() incomplete header received\n"); if (!(sess->header_buf = malloc(sess->header_done))) { gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() header recv() not enough memory\n"); return NULL; } memcpy(sess->header_buf, &h, sess->header_done); return NULL; } gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() header recv() failed: errno=%d, %s\n", errno, strerror(errno)); return NULL; } sess->header_done += ret; } h.type = gg_fix32(h.type); h.length = gg_fix32(h.length); } else memcpy(&h, sess->recv_buf, sizeof(h)); /* jakie¶ sensowne limity na rozmiar pakietu */ if (h.length > 65535) { gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() invalid packet length (%d)\n", h.length); errno = ERANGE; return NULL; } if (sess->recv_left > 0) { gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() resuming last gg_recv_packet()\n"); size = sess->recv_left; offset = sess->recv_done; buf = sess->recv_buf; } else { if (!(buf = malloc(sizeof(h) + h.length + 1))) { gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() not enough memory for packet data\n"); return NULL; } memcpy(buf, &h, sizeof(h)); offset = 0; size = h.length; } while (size > 0) { ret = gg_read(sess, buf + sizeof(h) + offset, size); gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() body recv(%d,%p,%d) = %d\n", sess->fd, buf + sizeof(h) + offset, size, ret); if (!ret) { gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() failed: connection broken\n"); errno = ECONNRESET; return NULL; } if (ret > -1 && ret <= size) { offset += ret; size -= ret; } else if (ret == -1) { int errno2 = errno; gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() body recv() failed (errno=%d, %s)\n", errno, strerror(errno)); errno = errno2; if (errno == EAGAIN) { gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() %d bytes received, %d left\n", offset, size); sess->recv_buf = buf; sess->recv_left = size; sess->recv_done = offset; return NULL; } if (errno != EINTR) { free(buf); return NULL; } } } sess->recv_left = 0; if ((gg_debug_level & GG_DEBUG_DUMP)) { unsigned int i; gg_debug(GG_DEBUG_DUMP, "// gg_recv_packet(%.2x)", h.type); for (i = 0; i < sizeof(h) + h.length; i++) gg_debug(GG_DEBUG_DUMP, " %.2x", (unsigned char) buf[i]); gg_debug(GG_DEBUG_DUMP, "\n"); } return buf; } /* * gg_send_packet() // funkcja wewnêtrzna * * konstruuje pakiet i wysy³a go do serwera. * * - sock - deskryptor gniazda * - type - typ pakietu * - payload_1 - pierwsza czê¶æ pakietu * - payload_length_1 - d³ugo¶æ pierwszej czê¶ci * - payload_2 - druga czê¶æ pakietu * - payload_length_2 - d³ugo¶æ drugiej czê¶ci * - ... - kolejne czê¶ci pakietu i ich d³ugo¶ci * - NULL - koñcowym parametr (konieczny!) * * je¶li siê powiod³o, zwraca 0, w przypadku b³êdu -1. je¶li errno == ENOMEM, * zabrak³o pamiêci. inaczej by³ b³±d przy wysy³aniu pakietu. dla errno == 0 * nie wys³ano ca³ego pakietu. */ int gg_send_packet(struct gg_session *sess, int type, ...) { struct gg_header *h; char *tmp; unsigned int tmp_length; void *payload; unsigned int payload_length; va_list ap; int res; gg_debug(GG_DEBUG_FUNCTION, "** gg_send_packet(%p, 0x%.2x, ...)\n", sess, type); tmp_length = 0; if (!(tmp = malloc(sizeof(struct gg_header)))) { gg_debug(GG_DEBUG_MISC, "// gg_send_packet() not enough memory for packet header\n"); return -1; } h = (struct gg_header*) tmp; h->type = gg_fix32(type); h->length = gg_fix32(0); va_start(ap, type); payload = va_arg(ap, void *); while (payload) { char *tmp2; if (payload_length < 0) gg_debug(GG_DEBUG_MISC, "// gg_send_packet() invalid payload length (%d)\n", payload_length); payload_length = va_arg(ap, unsigned int); if (payload_length < 0) gg_debug(GG_DEBUG_MISC, "// gg_send_packet() invalid payload length (%d)\n", payload_length); if (!(tmp2 = realloc(tmp, sizeof(struct gg_header) + tmp_length + payload_length))) { gg_debug(GG_DEBUG_MISC, "// gg_send_packet() not enough memory for payload\n"); free(tmp); va_end(ap); return -1; } tmp = tmp2; memcpy(tmp + sizeof(struct gg_header) + tmp_length, payload, payload_length); tmp_length += payload_length; payload = va_arg(ap, void *); } va_end(ap); h = (struct gg_header*) tmp; h->length = gg_fix32(tmp_length); if ((gg_debug_level & GG_DEBUG_DUMP)) { unsigned int i; gg_debug(GG_DEBUG_DUMP, "// gg_send_packet(0x%.2x)", gg_fix32(h->type)); for (i = 0; i < sizeof(struct gg_header) + gg_fix32(h->length); i++) gg_debug(GG_DEBUG_DUMP, " %.2x", (unsigned char) tmp[i]); gg_debug(GG_DEBUG_DUMP, "\n"); } tmp_length += sizeof(struct gg_header); if ((res = gg_write(sess, tmp, tmp_length)) < tmp_length) { gg_debug(GG_DEBUG_MISC, "// gg_send_packet() write() failed. res = %d, errno = %d (%s)\n", res, errno, strerror(errno)); free(tmp); return -1; } free(tmp); return 0; } /* * gg_session_callback() // funkcja wewnêtrzna * * wywo³ywany z gg_session->callback, wykonuje gg_watch_fd() i pakuje * do gg_session->event jego wynik. */ static int gg_session_callback(struct gg_session *s) { if (!s) { errno = EINVAL; return -1; } return ((s->event = gg_watch_fd(s)) != NULL) ? 0 : -1; } /* * gg_login() * * rozpoczyna procedurê ³±czenia siê z serwerem. resztê obs³uguje siê przez * gg_watch_fd(). * * UWAGA! program musi obs³u¿yæ SIGCHLD, je¶li ³±czy siê asynchronicznie, * ¿eby poprawnie zamkn±æ proces resolvera. * * - p - struktura opisuj±ca pocz±tkowy stan. wymagane pola: uin, * password * * w przypadku b³êdu NULL, je¶li idzie dobrze (async) albo posz³o * dobrze (sync), zwróci wska¼nik do zaalokowanej struct gg_session. */ struct gg_session *gg_login(const struct gg_login_params *p) { struct gg_session *sess = NULL; char *hostname; int port; if (!p) { gg_debug(GG_DEBUG_FUNCTION, "** gg_login(%p);\n", p); errno = EINVAL; return NULL; } gg_debug(GG_DEBUG_FUNCTION, "** gg_login(%p: [uin=%u, async=%d, ...]);\n", p, p->uin, p->async); if (!(sess = malloc(sizeof(struct gg_session)))) { gg_debug(GG_DEBUG_MISC, "// gg_login() not enough memory for session data\n"); goto fail; } memset(sess, 0, sizeof(struct gg_session)); if (!p->password || !p->uin) { gg_debug(GG_DEBUG_MISC, "// gg_login() invalid arguments. uin and password needed\n"); errno = EINVAL; goto fail; } if (!(sess->password = strdup(p->password))) { gg_debug(GG_DEBUG_MISC, "// gg_login() not enough memory for password\n"); goto fail; } if (p->status_descr && !(sess->initial_descr = strdup(p->status_descr))) { gg_debug(GG_DEBUG_MISC, "// gg_login() not enough memory for status\n"); goto fail; } sess->uin = p->uin; sess->state = GG_STATE_RESOLVING; sess->check = GG_CHECK_READ; sess->timeout = GG_DEFAULT_TIMEOUT; sess->async = p->async; sess->type = GG_SESSION_GG; sess->initial_status = p->status; sess->callback = gg_session_callback; sess->destroy = gg_free_session; sess->port = (p->server_port) ? p->server_port : GG_DEFAULT_PORT; sess->server_addr = p->server_addr; sess->external_port = p->external_port; sess->external_addr = p->external_addr; sess->protocol_version = (p->protocol_version) ? p->protocol_version : GG_DEFAULT_PROTOCOL_VERSION; if (p->has_audio) sess->protocol_version |= GG_HAS_AUDIO_MASK; sess->client_version = (p->client_version) ? strdup(p->client_version) : NULL; sess->last_sysmsg = p->last_sysmsg; sess->image_size = p->image_size; sess->pid = -1; if (p->tls == 1) { #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) char buf[1024]; OpenSSL_add_ssl_algorithms(); if (!RAND_status()) { char rdata[1024]; struct { time_t time; void *ptr; } rstruct; time(&rstruct.time); rstruct.ptr = (void *) &rstruct; #ifdef HAVE_NSS_COMPAT /* nss compat ossl doesn't implement that, despite * having a definition in header */ RAND_add((void *) rdata, sizeof(rdata), sizeof(rdata)); RAND_add((void *) &rstruct, sizeof(rstruct), sizeof(rstruct)); #else RAND_seed((void *) rdata, sizeof(rdata)); RAND_seed((void *) &rstruct, sizeof(rstruct)); #endif } sess->ssl_ctx = SSL_CTX_new(TLSv1_client_method()); if (!sess->ssl_ctx) { ERR_error_string_n(ERR_get_error(), buf, sizeof(buf)); gg_debug(GG_DEBUG_MISC, "// gg_login() SSL_CTX_new() failed: %s\n", buf); goto fail; } SSL_CTX_set_verify(sess->ssl_ctx, SSL_VERIFY_NONE, NULL); sess->ssl = SSL_new(sess->ssl_ctx); if (!sess->ssl) { ERR_error_string_n(ERR_get_error(), buf, sizeof(buf)); gg_debug(GG_DEBUG_MISC, "// gg_login() SSL_new() failed: %s\n", buf); goto fail; } #elif HAVE_GNUTLS gnutls_global_init (); gnutls_certificate_allocate_credentials (&sess->xcred); gnutls_init (&(sess->session), GNUTLS_CLIENT); gnutls_set_default_priority (sess->session); gnutls_credentials_set (sess->session, GNUTLS_CRD_CERTIFICATE, sess->xcred); #endif } if (gg_proxy_enabled) { hostname = gg_proxy_host; sess->proxy_port = port = gg_proxy_port; } else { hostname = GG_APPMSG_HOST; port = GG_APPMSG_PORT; } if (!p->async) { struct in_addr a; if (!p->server_addr || !p->server_port) { if ((a.s_addr = inet_addr(hostname)) == INADDR_NONE) { struct hostent *he; if (!(he = gg_gethostbyname(hostname))) { gg_debug(GG_DEBUG_MISC, "// gg_login() host \"%s\" not found\n", hostname); goto fail; } else { memcpy((char*) &a, he->h_addr, sizeof(a)); free(he); } } } else { a.s_addr = p->server_addr; port = p->server_port; } sess->hub_addr = a.s_addr; if ((sess->fd = gg_connect(&a, port, 0)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_login() connection failed (errno=%d, %s)\n", errno, strerror(errno)); goto fail; } if (p->server_addr && p->server_port) sess->state = GG_STATE_CONNECTING_GG; else sess->state = GG_STATE_CONNECTING_HUB; while (sess->state != GG_STATE_CONNECTED) { struct gg_event *e; if (!(e = gg_watch_fd(sess))) { gg_debug(GG_DEBUG_MISC, "// gg_login() critical error in gg_watch_fd()\n"); goto fail; } if (e->type == GG_EVENT_CONN_FAILED) { errno = EACCES; gg_debug(GG_DEBUG_MISC, "// gg_login() could not login\n"); gg_event_free(e); goto fail; } gg_event_free(e); } return sess; } if (!sess->server_addr || gg_proxy_enabled) { #ifndef __GG_LIBGADU_HAVE_PTHREAD if (gg_resolve(&sess->fd, &sess->pid, hostname)) { #else if (gg_resolve_pthread(&sess->fd, &sess->resolver, hostname)) { #endif gg_debug(GG_DEBUG_MISC, "// gg_login() resolving failed (errno=%d, %s)\n", errno, strerror(errno)); goto fail; } } else { if ((sess->fd = gg_connect(&sess->server_addr, sess->port, sess->async)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_login() direct connection failed (errno=%d, %s)\n", errno, strerror(errno)); goto fail; } sess->state = GG_STATE_CONNECTING_HUB; sess->check = GG_CHECK_WRITE; sess->timeout = GG_DEFAULT_TIMEOUT; } return sess; fail: if (sess) { if (sess->password) free(sess->password); if (sess->initial_descr) free(sess->initial_descr); free(sess); } return NULL; } /* * gg_free_session() * * próbuje zamkn±æ po³±czenia i zwalnia pamiêæ zajmowan± przez sesjê. * * - sess - opis sesji */ void gg_free_session(struct gg_session *sess) { if (!sess) return; /* XXX dopisaæ zwalnianie i zamykanie wszystkiego, co mog³o zostaæ */ if (sess->password) free(sess->password); if (sess->initial_descr) free(sess->initial_descr); if (sess->client_version) free(sess->client_version); if (sess->header_buf) free(sess->header_buf); #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if (sess->ssl) SSL_free(sess->ssl); if (sess->ssl_ctx) SSL_CTX_free(sess->ssl_ctx); #elif HAVE_GNUTLS if (sess->session){ gnutls_bye(sess->session, GNUTLS_SHUT_WR); gnutls_deinit(sess->session); } #endif #ifdef __GG_LIBGADU_HAVE_PTHREAD if (sess->resolver) { pthread_cancel(*((pthread_t*) sess->resolver)); free(sess->resolver); sess->resolver = NULL; } #else if (sess->pid != -1) waitpid(sess->pid, NULL, WNOHANG); #endif if (sess->fd != -1) close(sess->fd); while (sess->images) gg_image_queue_remove(sess, sess->images, 1); free(sess); } /* * gg_change_status() * * zmienia status u¿ytkownika. przydatne do /away i /busy oraz /quit. * * - sess - opis sesji * - status - nowy status u¿ytkownika * * 0, -1. */ int gg_change_status(struct gg_session *sess, int status) { struct gg_new_status p; gg_debug(GG_DEBUG_FUNCTION, "** gg_change_status(%p, %d);\n", sess, status); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } p.status = gg_fix32(status); sess->status = status; return gg_send_packet(sess, GG_NEW_STATUS, &p, sizeof(p), NULL); } /* * gg_change_status_descr() * * zmienia status u¿ytkownika na opisowy. * * - sess - opis sesji * - status - nowy status u¿ytkownika * - descr - opis statusu * * 0, -1. */ int gg_change_status_descr(struct gg_session *sess, int status, const char *descr) { struct gg_new_status p; gg_debug(GG_DEBUG_FUNCTION, "** gg_change_status_descr(%p, %d, \"%s\");\n", sess, status, descr); if (!sess || !descr) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } p.status = gg_fix32(status); sess->status = status; return gg_send_packet(sess, GG_NEW_STATUS, &p, sizeof(p), descr, (strlen(descr) > GG_STATUS_DESCR_MAXSIZE) ? GG_STATUS_DESCR_MAXSIZE : strlen(descr), NULL); } /* * gg_change_status_descr_time() * * zmienia status u¿ytkownika na opisowy z godzin± powrotu. * * - sess - opis sesji * - status - nowy status u¿ytkownika * - descr - opis statusu * - time - czas w formacie uniksowym * * 0, -1. */ int gg_change_status_descr_time(struct gg_session *sess, int status, const char *descr, int time) { struct gg_new_status p; uint32_t newtime; gg_debug(GG_DEBUG_FUNCTION, "** gg_change_status_descr_time(%p, %d, \"%s\", %d);\n", sess, status, descr, time); if (!sess || !descr || !time) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } p.status = gg_fix32(status); sess->status = status; newtime = gg_fix32(time); return gg_send_packet(sess, GG_NEW_STATUS, &p, sizeof(p), descr, (strlen(descr) > GG_STATUS_DESCR_MAXSIZE) ? GG_STATUS_DESCR_MAXSIZE : strlen(descr), &newtime, sizeof(newtime), NULL); } /* * gg_logoff() * * wylogowuje u¿ytkownika i zamyka po³±czenie, ale nie zwalnia pamiêci. * * - sess - opis sesji */ void gg_logoff(struct gg_session *sess) { if (!sess) return; gg_debug(GG_DEBUG_FUNCTION, "** gg_logoff(%p);\n", sess); if (GG_S_NA(sess->status & ~GG_STATUS_FRIENDS_MASK)) gg_change_status(sess, GG_STATUS_NOT_AVAIL); #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) if (sess->ssl) SSL_shutdown(sess->ssl); #elif HAVE_GNUTLS if (sess->session){ gnutls_bye(sess->session, GNUTLS_SHUT_WR); gnutls_deinit(sess->session); } #endif #ifdef __GG_LIBGADU_HAVE_PTHREAD if (sess->resolver) { pthread_cancel(*((pthread_t*) sess->resolver)); free(sess->resolver); sess->resolver = NULL; } #else if (sess->pid != -1) { waitpid(sess->pid, NULL, WNOHANG); sess->pid = -1; } #endif if (sess->fd != -1) { shutdown(sess->fd, 2); close(sess->fd); sess->fd = -1; } } /* * gg_image_request() * * wysy³a ¿±danie wys³ania obrazka o podanych parametrach. * * - sess - opis sesji * - recipient - numer adresata * - size - rozmiar obrazka * - crc32 - suma kontrolna obrazka * * 0/-1 */ int gg_image_request(struct gg_session *sess, uin_t recipient, int size, uint32_t crc32) { struct gg_send_msg s; struct gg_msg_image_request r; char dummy = 0; int res; gg_debug(GG_DEBUG_FUNCTION, "** gg_image_request(%p, %d, %u, 0x%.4x);\n", sess, recipient, size, crc32); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } s.recipient = gg_fix32(recipient); s.seq = gg_fix32(0); s.msgclass = gg_fix32(GG_CLASS_MSG); r.flag = 0x04; r.size = gg_fix32(size); r.crc32 = gg_fix32(crc32); res = gg_send_packet(sess, GG_SEND_MSG, &s, sizeof(s), &dummy, 1, &r, sizeof(r), NULL); if (!res) { struct gg_image_queue *q = malloc(sizeof(*q)); char *buf = malloc(size); if (!q) { gg_debug(GG_DEBUG_MISC, "// gg_image_request() not enough memory for image queue\n"); free(buf); errno = ENOMEM; return -1; } memset(q, 0, sizeof(*q)); q->sender = recipient; q->size = size; q->crc32 = crc32; q->image = buf; if (!sess->images) sess->images = q; else { struct gg_image_queue *qq; for (qq = sess->images; qq->next; qq = qq->next) ; qq->next = q; } } return res; } /* * gg_image_reply() * * wysy³a ¿±dany obrazek. * * - sess - opis sesji * - recipient - numer adresata * - filename - nazwa pliku * - image - bufor z obrazkiem * - size - rozmiar obrazka * * 0/-1 */ int gg_image_reply(struct gg_session *sess, uin_t recipient, const char *filename, const char *image, int size) { struct gg_msg_image_reply *r; struct gg_send_msg s; const char *tmp; char buf[1910]; int res = -1; gg_debug(GG_DEBUG_FUNCTION, "** gg_image_reply(%p, %d, \"%s\", %p, %d);\n", sess, recipient, filename, image, size); if (!sess || !filename || !image) { errno = EFAULT; return -1; } /* wytnij ¶cie¿ki, zostaw tylko nazwê pliku */ while ((tmp = rindex(filename, '/')) || (tmp = rindex(filename, '\\'))) filename = tmp + 1; if (strlen(filename) < 1 || strlen(filename) > 1024) { errno = EINVAL; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } s.recipient = gg_fix32(recipient); s.seq = gg_fix32(0); s.msgclass = gg_fix32(GG_CLASS_MSG); buf[0] = 0; r = (void*) &buf[1]; r->flag = 0x05; r->size = gg_fix32(size); r->crc32 = gg_fix32(gg_crc32(0, image, size)); while (size > 0) { int buflen, chunklen; /* \0 + struct gg_msg_image_reply */ buflen = sizeof(struct gg_msg_image_reply) + 1; /* w pierwszym kawa³ku jest nazwa pliku */ if (r->flag == 0x05) { strcpy(buf + buflen, filename); buflen += strlen(filename) + 1; } chunklen = (size >= sizeof(buf) - buflen) ? (sizeof(buf) - buflen) : size; memcpy(buf + buflen, image, chunklen); size -= chunklen; image += chunklen; res = gg_send_packet(sess, GG_SEND_MSG, &s, sizeof(s), buf, buflen + chunklen, NULL); if (res == -1) break; r->flag = 0x06; } return res; } /* * gg_send_message_ctcp() * * wysy³a wiadomo¶æ do innego u¿ytkownika. zwraca losowy numer * sekwencyjny, który mo¿na zignorowaæ albo wykorzystaæ do potwierdzenia. * * - sess - opis sesji * - msgclass - rodzaj wiadomo¶ci * - recipient - numer adresata * - message - tre¶æ wiadomo¶ci * - message_len - d³ugo¶æ * * numer sekwencyjny wiadomo¶ci lub -1 w przypadku b³êdu. */ int gg_send_message_ctcp(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, int message_len) { struct gg_send_msg s; gg_debug(GG_DEBUG_FUNCTION, "** gg_send_message_ctcp(%p, %d, %u, ...);\n", sess, msgclass, recipient); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } s.recipient = gg_fix32(recipient); s.seq = gg_fix32(0); s.msgclass = gg_fix32(msgclass); return gg_send_packet(sess, GG_SEND_MSG, &s, sizeof(s), message, message_len, NULL); } /* * gg_send_message() * * wysy³a wiadomo¶æ do innego u¿ytkownika. zwraca losowy numer * sekwencyjny, który mo¿na zignorowaæ albo wykorzystaæ do potwierdzenia. * * - sess - opis sesji * - msgclass - rodzaj wiadomo¶ci * - recipient - numer adresata * - message - tre¶æ wiadomo¶ci * * numer sekwencyjny wiadomo¶ci lub -1 w przypadku b³êdu. */ int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message) { gg_debug(GG_DEBUG_FUNCTION, "** gg_send_message(%p, %d, %u, %p)\n", sess, msgclass, recipient, message); return gg_send_message_richtext(sess, msgclass, recipient, message, NULL, 0); } /* * gg_send_message_richtext() * * wysy³a kolorow± wiadomo¶æ do innego u¿ytkownika. zwraca losowy numer * sekwencyjny, który mo¿na zignorowaæ albo wykorzystaæ do potwierdzenia. * * - sess - opis sesji * - msgclass - rodzaj wiadomo¶ci * - recipient - numer adresata * - message - tre¶æ wiadomo¶ci * - format - informacje o formatowaniu * - formatlen - d³ugo¶æ informacji o formatowaniu * * numer sekwencyjny wiadomo¶ci lub -1 w przypadku b³êdu. */ int gg_send_message_richtext(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, const unsigned char *format, int formatlen) { struct gg_send_msg s; gg_debug(GG_DEBUG_FUNCTION, "** gg_send_message_richtext(%p, %d, %u, %p, %p, %d);\n", sess, msgclass, recipient, message, format, formatlen); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } s.recipient = gg_fix32(recipient); if (!sess->seq) sess->seq = 0x01740000 | (rand() & 0xffff); s.seq = gg_fix32(sess->seq); s.msgclass = gg_fix32(msgclass); sess->seq += (rand() % 0x300) + 0x300; if (gg_send_packet(sess, GG_SEND_MSG, &s, sizeof(s), message, strlen(message) + 1, format, formatlen, NULL) == -1) return -1; return gg_fix32(s.seq); } /* * gg_send_message_confer() * * wysy³a wiadomo¶æ do kilku u¿ytkownikow (konferencja). zwraca losowy numer * sekwencyjny, który mo¿na zignorowaæ albo wykorzystaæ do potwierdzenia. * * - sess - opis sesji * - msgclass - rodzaj wiadomo¶ci * - recipients_count - ilo¶æ adresatów * - recipients - numerki adresatów * - message - tre¶æ wiadomo¶ci * * numer sekwencyjny wiadomo¶ci lub -1 w przypadku b³êdu. */ int gg_send_message_confer(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message) { gg_debug(GG_DEBUG_FUNCTION, "** gg_send_message_confer(%p, %d, %d, %p, %p);\n", sess, msgclass, recipients_count, recipients, message); return gg_send_message_confer_richtext(sess, msgclass, recipients_count, recipients, message, NULL, 0); } /* * gg_send_message_confer_richtext() * * wysy³a kolorow± wiadomo¶æ do kilku u¿ytkownikow (konferencja). zwraca * losowy numer sekwencyjny, który mo¿na zignorowaæ albo wykorzystaæ do * potwierdzenia. * * - sess - opis sesji * - msgclass - rodzaj wiadomo¶ci * - recipients_count - ilo¶æ adresatów * - recipients - numerki adresatów * - message - tre¶æ wiadomo¶ci * - format - informacje o formatowaniu * - formatlen - d³ugo¶æ informacji o formatowaniu * * numer sekwencyjny wiadomo¶ci lub -1 w przypadku b³êdu. */ int gg_send_message_confer_richtext(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message, const unsigned char *format, int formatlen) { struct gg_send_msg s; struct gg_msg_recipients r; int i, j, k; uin_t *recps; gg_debug(GG_DEBUG_FUNCTION, "** gg_send_message_confer_richtext(%p, %d, %d, %p, %p, %p, %d);\n", sess, msgclass, recipients_count, recipients, message, format, formatlen); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } r.flag = 0x01; r.count = gg_fix32(recipients_count - 1); if (!sess->seq) sess->seq = 0x01740000 | (rand() & 0xffff); s.seq = gg_fix32(sess->seq); s.msgclass = gg_fix32(msgclass); recps = malloc(sizeof(uin_t) * recipients_count); for (i = 0; i < recipients_count; i++) { s.recipient = gg_fix32(recipients[i]); for (j = 0, k = 0; j < recipients_count; j++) if (recipients[j] != recipients[i]) { recps[k] = gg_fix32(recipients[j]); k++; } if (!i) sess->seq += (rand() % 0x300) + 0x300; if (gg_send_packet(sess, GG_SEND_MSG, &s, sizeof(s), message, strlen(message) + 1, &r, sizeof(r), recps, (recipients_count - 1) * sizeof(uin_t), format, formatlen, NULL) == -1) { free(recps); return -1; } } free(recps); return gg_fix32(s.seq); } /* * gg_ping() * * wysy³a do serwera pakiet ping. * * - sess - opis sesji * * 0, -1. */ int gg_ping(struct gg_session *sess) { gg_debug(GG_DEBUG_FUNCTION, "** gg_ping(%p);\n", sess); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } return gg_send_packet(sess, GG_PING, NULL); } /* * gg_notify_ex() * * wysy³a serwerowi listê kontaktów (wraz z odpowiadaj±cymi im typami userów), * dziêki czemu wie, czyj stan nas interesuje. * * - sess - opis sesji * - userlist - wska¼nik do tablicy numerów * - types - wska¼nik do tablicy typów u¿ytkowników * - count - ilo¶æ numerków * * 0, -1. */ int gg_notify_ex(struct gg_session *sess, uin_t *userlist, char *types, int count) { struct gg_notify *n; uin_t *u; char *t; int i, res = 0; gg_debug(GG_DEBUG_FUNCTION, "** gg_notify_ex(%p, %p, %p, %d);\n", sess, userlist, types, count); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } if (!userlist || !count) return gg_send_packet(sess, GG_LIST_EMPTY, NULL); if (!(n = (struct gg_notify*) malloc(sizeof(*n) * count))) return -1; for (u = userlist, t = types, i = 0; i < count; u++, t++, i++) { n[i].uin = gg_fix32(*u); n[i].dunno1 = *t; } if (gg_send_packet(sess, GG_NOTIFY, n, sizeof(*n) * count, NULL) == -1) res = -1; free(n); return res; } /* * gg_notify() * * wysy³a serwerowi listê kontaktów, dziêki czemu wie, czyj stan nas * interesuje. * * - sess - opis sesji * - userlist - wska¼nik do tablicy numerów * - count - ilo¶æ numerków * * 0, -1. */ int gg_notify(struct gg_session *sess, uin_t *userlist, int count) { struct gg_notify *n; uin_t *u; int i, res = 0; gg_debug(GG_DEBUG_FUNCTION, "** gg_notify(%p, %p, %d);\n", sess, userlist, count); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } if (!userlist || !count) return 0; if (!(n = (struct gg_notify*) malloc(sizeof(*n) * count))) return -1; for (u = userlist, i = 0; i < count; u++, i++) { n[i].uin = gg_fix32(*u); n[i].dunno1 = GG_USER_NORMAL; } if (gg_send_packet(sess, GG_NOTIFY, n, sizeof(*n) * count, NULL) == -1) res = -1; free(n); return res; } /* * gg_add_notify_ex() * * dodaje do listy kontaktów dany numer w trakcie po³±czenia. * dodawanemu u¿ytkownikowi okre¶lamy jego typ (patrz protocol.html) * * - sess - opis sesji * - uin - numer * - type - typ * * 0, -1. */ int gg_add_notify_ex(struct gg_session *sess, uin_t uin, char type) { struct gg_add_remove a; gg_debug(GG_DEBUG_FUNCTION, "** gg_add_notify_ex(%p, %u, %d);\n", sess, uin, type); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } a.uin = gg_fix32(uin); a.dunno1 = type; return gg_send_packet(sess, GG_ADD_NOTIFY, &a, sizeof(a), NULL); } /* * gg_add_notify() * * dodaje do listy kontaktów dany numer w trakcie po³±czenia. * * - sess - opis sesji * - uin - numer * * 0, -1. */ int gg_add_notify(struct gg_session *sess, uin_t uin) { return gg_add_notify_ex(sess, uin, GG_USER_NORMAL); } /* * gg_remove_notify_ex() * * usuwa z listy kontaktów w trakcie po³±czenia. * usuwanemu u¿ytkownikowi okre¶lamy jego typ (patrz protocol.html) * * - sess - opis sesji * - uin - numer * - type - typ * * 0, -1. */ int gg_remove_notify_ex(struct gg_session *sess, uin_t uin, char type) { struct gg_add_remove a; gg_debug(GG_DEBUG_FUNCTION, "** gg_remove_notify_ex(%p, %u, %d);\n", sess, uin, type); if (!sess) { errno = EFAULT; return -1; } if (sess->state != GG_STATE_CONNECTED) { errno = ENOTCONN; return -1; } a.uin = gg_fix32(uin); a.dunno1 = type; return gg_send_packet(sess, GG_REMOVE_NOTIFY, &a, sizeof(a), NULL); } /* * gg_remove_notify() * * usuwa z listy kontaktów w trakcie po³±czenia. * * - sess - opis sesji * - uin - numer * * 0, -1. */ int gg_remove_notify(struct gg_session *sess, uin_t uin) { return gg_remove_notify_ex(sess, uin, GG_USER_NORMAL); } /* * gg_userlist_request() * * wysy³a ¿±danie/zapytanie listy kontaktów na serwerze. * * - sess - opis sesji * - type - rodzaj zapytania/¿±dania * - request - tre¶æ zapytania/¿±dania (mo¿e byæ NULL) * * 0, -1 */ int gg_userlist_request(struct gg_session *sess, char type, const char *request) { int len; if (!sess) { errno = EINVAL; return -1; } if (!request) { sess->userlist_blocks = 1; return gg_send_packet(sess, GG_USERLIST_REQUEST, &type, sizeof(type), NULL); } len = strlen(request); sess->userlist_blocks = 0; while (len > 2047) { sess->userlist_blocks++; if (gg_send_packet(sess, GG_USERLIST_REQUEST, &type, sizeof(type), request, 2047, NULL) == -1) return -1; if (type == GG_USERLIST_PUT) type = GG_USERLIST_PUT_MORE; request += 2047; len -= 2047; } sess->userlist_blocks++; return gg_send_packet(sess, GG_USERLIST_REQUEST, &type, sizeof(type), request, len, NULL); } /* * Local variables: * c-indentation-style: k&r * c-basic-offset: 8 * indent-tabs-mode: notnil * End: * * vim: shiftwidth=8: */ centerim-4.22.10/libgadu/obsolete.c0000644000175000001440000001237511461606612014005 00000000000000/* $Id: obsolete.c,v 1.1 2004/01/26 23:49:45 konst Exp $ */ /* * (C) Copyright 2001-2003 Wojtek Kaniewski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Plik zawiera deklaracje funkcji, które s± ju¿ nieaktualne ze wzglêdu * na zmiany w protokole, ale s± wymagane przez aplikacje linkowane ze * starszymi wersjami bibliotek. */ #include #include "libgadu.h" struct gg_http *gg_userlist_get(uin_t uin, const char *passwd, int async) { gg_debug(GG_DEBUG_MISC, "// gg_userlist_get() is obsolete. use gg_userlist_request() instead!\n"); errno = EINVAL; return NULL; } int gg_userlist_get_watch_fd(struct gg_http *h) { errno = EINVAL; return -1; } void gg_userlist_get_free(struct gg_http *h) { } struct gg_http *gg_userlist_put(uin_t uin, const char *password, const char *contacts, int async) { gg_debug(GG_DEBUG_MISC, "// gg_userlist_put() is obsolete. use gg_userlist_request() instead!\n"); errno = EINVAL; return NULL; } int gg_userlist_put_watch_fd(struct gg_http *h) { errno = EINVAL; return -1; } void gg_userlist_put_free(struct gg_http *h) { } struct gg_http *gg_userlist_remove(uin_t uin, const char *passwd, int async) { gg_debug(GG_DEBUG_MISC, "// gg_userlist_remove() is obsolete. use gg_userlist_request() instead!\n"); errno = EINVAL; return NULL; } int gg_userlist_remove_watch_fd(struct gg_http *h) { errno = EINVAL; return -1; } void gg_userlist_remove_free(struct gg_http *h) { } struct gg_http *gg_search(const struct gg_search_request *r, int async) { gg_debug(GG_DEBUG_MISC, "// gg_search() is obsolete. use gg_search50() instead!\n"); errno = EINVAL; return NULL; } int gg_search_watch_fd(struct gg_http *h) { errno = EINVAL; return -1; } void gg_search_free(struct gg_http *h) { } const struct gg_search_request *gg_search_request_mode_0(char *nickname, char *first_name, char *last_name, char *city, int gender, int min_birth, int max_birth, int active, int start) { return NULL; } const struct gg_search_request *gg_search_request_mode_1(char *email, int active, int start) { return NULL; } const struct gg_search_request *gg_search_request_mode_2(char *phone, int active, int start) { return NULL; } const struct gg_search_request *gg_search_request_mode_3(uin_t uin, int active, int start) { return NULL; } void gg_search_request_free(struct gg_search_request *r) { } struct gg_http *gg_register(const char *email, const char *password, int async) { gg_debug(GG_DEBUG_MISC, "// gg_register() is obsolete. use gg_register3() instead!\n"); errno = EINVAL; return NULL; } struct gg_http *gg_register2(const char *email, const char *password, const char *qa, int async) { gg_debug(GG_DEBUG_MISC, "// gg_register2() is obsolete. use gg_register3() instead!\n"); errno = EINVAL; return NULL; } struct gg_http *gg_unregister(uin_t uin, const char *password, const char *email, int async) { gg_debug(GG_DEBUG_MISC, "// gg_unregister() is obsolete. use gg_unregister3() instead!\n"); errno = EINVAL; return NULL; } struct gg_http *gg_unregister2(uin_t uin, const char *password, const char *qa, int async) { gg_debug(GG_DEBUG_MISC, "// gg_unregister2() is obsolete. use gg_unregister3() instead!\n"); errno = EINVAL; return NULL; } struct gg_http *gg_change_passwd(uin_t uin, const char *passwd, const char *newpasswd, const char *newemail, int async) { gg_debug(GG_DEBUG_MISC, "// gg_change_passwd() is obsolete. use gg_change_passwd4() instead!\n"); errno = EINVAL; return NULL; } struct gg_http *gg_change_passwd2(uin_t uin, const char *passwd, const char *newpasswd, const char *email, const char *newemail, int async) { gg_debug(GG_DEBUG_MISC, "// gg_change_passwd2() is obsolete. use gg_change_passwd4() instead!\n"); errno = EINVAL; return NULL; } struct gg_http *gg_change_passwd3(uin_t uin, const char *passwd, const char *newpasswd, const char *qa, int async) { gg_debug(GG_DEBUG_MISC, "// gg_change_passwd3() is obsolete. use gg_change_passwd4() instead!\n"); errno = EINVAL; return NULL; } struct gg_http *gg_remind_passwd(uin_t uin, int async) { gg_debug(GG_DEBUG_MISC, "// gg_remind_passwd() is obsolete. use gg_remind_passwd2() instead!\n"); errno = EINVAL; return NULL; } struct gg_http *gg_change_info(uin_t uin, const char *passwd, const struct gg_change_info_request *request, int async) { gg_debug(GG_DEBUG_MISC, "// gg_change_info() is obsolete. use gg_pubdir50() instead\n"); errno = EINVAL; return NULL; } struct gg_change_info_request *gg_change_info_request_new(const char *first_name, const char *last_name, const char *nickname, const char *email, int born, int gender, const char *city) { return NULL; } void gg_change_info_request_free(struct gg_change_info_request *r) { } centerim-4.22.10/libgadu/http.c0000644000175000001440000003217411461606612013147 00000000000000/* $Id: http.c,v 1.3 2005/01/23 13:22:37 konst Exp $ */ /* * (C) Copyright 2001-2002 Wojtek Kaniewski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include "libgadu-config.h" #include #include #include #ifdef __GG_LIBGADU_HAVE_PTHREAD # include #endif #include #include #include #include #include #include "compat.h" #include "libgadu.h" #define gg_http_error(x) \ close(h->fd); \ h->fd = -1; \ h->state = GG_STATE_ERROR; \ h->error = x; \ return 0; /* * gg_http_connect() // funkcja pomocnicza * * rozpoczyna po³±czenie po http. * * - hostname - adres serwera * - port - port serwera * - async - asynchroniczne po³±czenie * - method - metoda http (GET, POST, cokolwiek) * - path - ¶cie¿ka do zasobu (musi byæ poprzedzona ,,/'') * - header - nag³ówek zapytania plus ewentualne dane dla POST * * zaalokowana struct gg_http, któr± po¼niej nale¿y * zwolniæ funkcj± gg_http_free(), albo NULL je¶li wyst±pi³ b³±d. */ struct gg_http *gg_http_connect(const char *hostname, int port, int async, const char *method, const char *path, const char *header) { struct gg_http *h; if (!hostname || !port || !method || !path || !header) { gg_debug(GG_DEBUG_MISC, "// gg_http_connect() invalid arguments\n"); errno = EINVAL; return NULL; } if (!(h = malloc(sizeof(*h)))) return NULL; memset(h, 0, sizeof(*h)); h->async = async; h->port = port; h->fd = -1; h->type = GG_SESSION_HTTP; if (gg_proxy_enabled) { char *auth = gg_proxy_auth(); h->query = gg_saprintf("%s http://%s:%d%s HTTP/1.0\r\n%s%s", method, hostname, port, path, (auth) ? auth : "", header); hostname = gg_proxy_host; h->port = port = gg_proxy_port; if (auth) free(auth); } else { h->query = gg_saprintf("%s %s HTTP/1.0\r\n%s", method, path, header); } if (!h->query) { gg_debug(GG_DEBUG_MISC, "// gg_http_connect() not enough memory for query\n"); free(h); errno = ENOMEM; return NULL; } gg_debug(GG_DEBUG_MISC, "=> -----BEGIN-HTTP-QUERY-----\n%s\n=> -----END-HTTP-QUERY-----\n", h->query); if (async) { struct hostent *he; struct in_addr a; if (!(he = gg_gethostbyname(hostname))) { gg_http_free(h); errno = ENOENT; return NULL; } else { memcpy((char*) &a, he->h_addr, sizeof(a)); free(he); } /* #ifndef __GG_LIBGADU_HAVE_PTHREAD if (gg_resolve(&h->fd, &h->pid, hostname)) { #else if (gg_resolve_pthread(&h->fd, &h->resolver, hostname)) { #endif gg_debug(GG_DEBUG_MISC, "// gg_http_connect() resolver failed\n"); gg_http_free(h); errno = ENOENT; return NULL; } gg_debug(GG_DEBUG_MISC, "// gg_http_connect() resolver = %p\n", h->resolver); h->state = GG_STATE_RESOLVING; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; */ if ((h->fd = gg_connect(&a, h->port, h->async)) == -1) { gg_debug(GG_DEBUG_MISC, "=> http, connection failed (errno=%d, %s)\n", errno, strerror(errno)); gg_http_error(GG_ERROR_CONNECTING); } h->state = GG_STATE_CONNECTING; h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; } else { struct hostent *he; struct in_addr a; if (!(he = gg_gethostbyname(hostname))) { gg_debug(GG_DEBUG_MISC, "// gg_http_connect() host not found\n"); gg_http_free(h); errno = ENOENT; return NULL; } else { memcpy((char*) &a, he->h_addr, sizeof(a)); free(he); } if (!(h->fd = gg_connect(&a, port, 0)) == -1) { gg_debug(GG_DEBUG_MISC, "// gg_http_connect() connection failed (errno=%d, %s)\n", errno, strerror(errno)); gg_http_free(h); return NULL; } h->state = GG_STATE_CONNECTING; while (h->state != GG_STATE_ERROR && h->state != GG_STATE_PARSING) { if (gg_http_watch_fd(h) == -1) break; } if (h->state != GG_STATE_PARSING) { gg_debug(GG_DEBUG_MISC, "// gg_http_connect() some strange error\n"); gg_http_free(h); return NULL; } } h->callback = gg_http_watch_fd; h->destroy = gg_http_free; return h; } /* * gg_http_watch_fd() * * przy asynchronicznej obs³udze HTTP funkcjê t± nale¿y wywo³aæ, je¶li * zmieni³o siê co¶ na obserwowanym deskryptorze. * * - h - struktura opisuj±ca po³±czenie * * je¶li wszystko posz³o dobrze to 0, inaczej -1. po³±czenie bêdzie * zakoñczone, je¶li h->state == GG_STATE_PARSING. je¶li wyst±pi jaki¶ * b³±d, to bêdzie tam GG_STATE_ERROR i odpowiedni kod b³êdu w h->error. */ int gg_http_watch_fd(struct gg_http *h) { gg_debug(GG_DEBUG_FUNCTION, "** gg_http_watch_fd(%p);\n", h); if (!h) { gg_debug(GG_DEBUG_MISC, "// gg_http_watch_fd() invalid arguments\n"); errno = EINVAL; return -1; } if (h->state == GG_STATE_RESOLVING) { struct in_addr a; gg_debug(GG_DEBUG_MISC, "=> http, resolving done\n"); if (read(h->fd, &a, sizeof(a)) < (signed)sizeof(a) || a.s_addr == INADDR_NONE) { gg_debug(GG_DEBUG_MISC, "=> http, resolver thread failed\n"); gg_http_error(GG_ERROR_RESOLVING); } close(h->fd); h->fd = -1; #ifndef __GG_LIBGADU_HAVE_PTHREAD waitpid(h->pid, NULL, 0); #else if (h->resolver) { pthread_cancel(*((pthread_t *) h->resolver)); free(h->resolver); h->resolver = NULL; } #endif gg_debug(GG_DEBUG_MISC, "=> http, connecting to %s:%d\n", inet_ntoa(a), h->port); if ((h->fd = gg_connect(&a, h->port, h->async)) == -1) { gg_debug(GG_DEBUG_MISC, "=> http, connection failed (errno=%d, %s)\n", errno, strerror(errno)); gg_http_error(GG_ERROR_CONNECTING); } h->state = GG_STATE_CONNECTING; h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; return 0; } if (h->state == GG_STATE_CONNECTING) { int res = 0; unsigned int res_size = sizeof(res); if (h->async && (getsockopt(h->fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res)) { gg_debug(GG_DEBUG_MISC, "=> http, async connection failed (errno=%d, %s)\n", (res) ? res : errno , strerror((res) ? res : errno)); close(h->fd); h->fd = -1; h->state = GG_STATE_ERROR; h->error = GG_ERROR_CONNECTING; if (res) errno = res; return 0; } gg_debug(GG_DEBUG_MISC, "=> http, connected, sending request\n"); h->state = GG_STATE_SENDING_QUERY; } if (h->state == GG_STATE_SENDING_QUERY) { int res; if ((res = write(h->fd, h->query, strlen(h->query))) < 1) { gg_debug(GG_DEBUG_MISC, "=> http, write() failed (len=%d, res=%d, errno=%d)\n", strlen(h->query), res, errno); gg_http_error(GG_ERROR_WRITING); } if (res < strlen(h->query)) { gg_debug(GG_DEBUG_MISC, "=> http, partial header sent (led=%d, sent=%d)\n", strlen(h->query), res); memmove(h->query, h->query + res, strlen(h->query) - res + 1); h->state = GG_STATE_SENDING_QUERY; h->check = GG_CHECK_WRITE; h->timeout = GG_DEFAULT_TIMEOUT; } else { gg_debug(GG_DEBUG_MISC, "=> http, request sent (len=%d)\n", strlen(h->query)); free(h->query); h->query = NULL; h->state = GG_STATE_READING_HEADER; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; } return 0; } if (h->state == GG_STATE_READING_HEADER) { char buf[1024], *tmp; int res; if ((res = read(h->fd, buf, sizeof(buf))) == -1) { gg_debug(GG_DEBUG_MISC, "=> http, reading header failed (errno=%d)\n", errno); if (h->header) { free(h->header); h->header = NULL; } gg_http_error(GG_ERROR_READING); } if (!res) { gg_debug(GG_DEBUG_MISC, "=> http, connection reset by peer\n"); if (h->header) { free(h->header); h->header = NULL; } gg_http_error(GG_ERROR_READING); } gg_debug(GG_DEBUG_MISC, "=> http, read %d bytes of header\n", res); if (!(tmp = realloc(h->header, h->header_size + res + 1))) { gg_debug(GG_DEBUG_MISC, "=> http, not enough memory for header\n"); free(h->header); h->header = NULL; gg_http_error(GG_ERROR_READING); } h->header = tmp; memcpy(h->header + h->header_size, buf, res); h->header_size += res; gg_debug(GG_DEBUG_MISC, "=> http, header_buf=%p, header_size=%d\n", h->header, h->header_size); h->header[h->header_size] = 0; if ((tmp = strstr(h->header, "\r\n\r\n")) || (tmp = strstr(h->header, "\n\n"))) { int sep_len = (*tmp == '\r') ? 4 : 2; unsigned int left; char *line; left = h->header_size - ((long)(tmp) - (long)(h->header) + sep_len); gg_debug(GG_DEBUG_MISC, "=> http, got all header (%d bytes, %d left)\n", h->header_size - left, left); /* HTTP/1.1 200 OK */ if (strlen(h->header) < 16 || strncmp(h->header + 9, "200", 3)) { gg_debug(GG_DEBUG_MISC, "=> -----BEGIN-HTTP-HEADER-----\n%s\n=> -----END-HTTP-HEADER-----\n", h->header); gg_debug(GG_DEBUG_MISC, "=> http, didn't get 200 OK -- no results\n"); free(h->header); h->header = NULL; gg_http_error(GG_ERROR_CONNECTING); } h->body_size = 0; line = h->header; *tmp = 0; gg_debug(GG_DEBUG_MISC, "=> -----BEGIN-HTTP-HEADER-----\n%s\n=> -----END-HTTP-HEADER-----\n", h->header); while (line) { if (!strncasecmp(line, "Content-length: ", 16)) { h->body_size = atoi(line + 16); } line = strchr(line, '\n'); if (line) line++; } if (h->body_size <= 0) { gg_debug(GG_DEBUG_MISC, "=> http, content-length not found\n"); h->body_size = left; } if (left > h->body_size) { gg_debug(GG_DEBUG_MISC, "=> http, oversized reply (%d bytes needed, %d bytes left)\n", h->body_size, left); h->body_size = left; } gg_debug(GG_DEBUG_MISC, "=> http, body_size=%d\n", h->body_size); if (!(h->body = malloc(h->body_size + 1))) { gg_debug(GG_DEBUG_MISC, "=> http, not enough memory (%d bytes for body_buf)\n", h->body_size + 1); free(h->header); h->header = NULL; gg_http_error(GG_ERROR_READING); } if (left) { memcpy(h->body, tmp + sep_len, left); h->body_done = left; } h->body[left] = 0; h->state = GG_STATE_READING_DATA; h->check = GG_CHECK_READ; h->timeout = GG_DEFAULT_TIMEOUT; } return 0; } if (h->state == GG_STATE_READING_DATA) { char buf[1024]; int res; if ((res = read(h->fd, buf, sizeof(buf))) == -1) { gg_debug(GG_DEBUG_MISC, "=> http, reading body failed (errno=%d)\n", errno); if (h->body) { free(h->body); h->body = NULL; } gg_http_error(GG_ERROR_READING); } if (!res) { if (h->body_done >= h->body_size) { gg_debug(GG_DEBUG_MISC, "=> http, we're done, closing socket\n"); h->state = GG_STATE_PARSING; close(h->fd); h->fd = -1; } else { gg_debug(GG_DEBUG_MISC, "=> http, connection closed while reading (have %d, need %d)\n", h->body_done, h->body_size); if (h->body) { free(h->body); h->body = NULL; } gg_http_error(GG_ERROR_READING); } return 0; } gg_debug(GG_DEBUG_MISC, "=> http, read %d bytes of body\n", res); if (h->body_done + res > h->body_size) { char *tmp; gg_debug(GG_DEBUG_MISC, "=> http, too much data (%d bytes, %d needed), enlarging buffer\n", h->body_done + res, h->body_size); if (!(tmp = realloc(h->body, h->body_done + res + 1))) { gg_debug(GG_DEBUG_MISC, "=> http, not enough memory for data (%d needed)\n", h->body_done + res + 1); free(h->body); h->body = NULL; gg_http_error(GG_ERROR_READING); } h->body = tmp; h->body_size = h->body_done + res; } h->body[h->body_done + res] = 0; memcpy(h->body + h->body_done, buf, res); h->body_done += res; gg_debug(GG_DEBUG_MISC, "=> body_done=%d, body_size=%d\n", h->body_done, h->body_size); return 0; } if (h->fd != -1) close(h->fd); h->fd = -1; h->state = GG_STATE_ERROR; h->error = 0; return -1; } #undef gg_http_error /* * gg_http_stop() * * je¶li po³±czenie jest w trakcie, przerywa je. nie zwalnia h->data. * * - h - struktura opisuj±ca po³±czenie */ void gg_http_stop(struct gg_http *h) { if (!h) return; if (h->state == GG_STATE_ERROR || h->state == GG_STATE_DONE) return; if (h->fd != -1) close(h->fd); h->fd = -1; } /* * gg_http_free_fields() // funkcja wewnêtrzna * * zwalnia pola struct gg_http, ale nie zwalnia samej struktury. */ void gg_http_free_fields(struct gg_http *h) { if (!h) return; if (h->body) { free(h->body); h->body = NULL; } if (h->query) { free(h->query); h->query = NULL; } if (h->header) { free(h->header); h->header = NULL; } } /* * gg_http_free() * * próbuje zamkn±æ po³±czenie i zwalnia pamiêæ po nim. * * - h - struktura, któr± nale¿y zlikwidowaæ */ void gg_http_free(struct gg_http *h) { if (!h) return; gg_http_stop(h); gg_http_free_fields(h); free(h); } /* * Local variables: * c-indentation-style: k&r * c-basic-offset: 8 * indent-tabs-mode: notnil * End: * * vim: shiftwidth=8: */ centerim-4.22.10/libgadu/pubdir.c0000644000175000001440000003702511461606612013455 00000000000000/* $Id: pubdir.c,v 1.2 2004/04/11 16:35:02 konst Exp $ */ /* * (C) Copyright 2001-2002 Wojtek Kaniewski * Dawid Jarosz * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include "libgadu.h" /* * gg_register3() * * rozpoczyna rejestracjê u¿ytkownika protoko³em GG 6.0. wymaga wcze¶niejszego * pobrania tokenu za pomoc± funkcji gg_token(). * * - email - adres e-mail klienta * - password - has³o klienta * - tokenid - identyfikator tokenu * - tokenval - warto¶æ tokenu * - async - po³±czenie asynchroniczne * * zaalokowana struct gg_http, któr± po¼niej nale¿y zwolniæ * funkcj± gg_register_free(), albo NULL je¶li wyst±pi³ b³±d. */ struct gg_http *gg_register3(const char *email, const char *password, const char *tokenid, const char *tokenval, int async) { struct gg_http *h; char *__pwd, *__email, *__tokenid, *__tokenval, *form, *query; if (!email | !password | !tokenid | !tokenval) { gg_debug(GG_DEBUG_MISC, "=> register, NULL parameter\n"); errno = EINVAL; return NULL; } __pwd = gg_urlencode(password); __email = gg_urlencode(email); __tokenid = gg_urlencode(tokenid); __tokenval = gg_urlencode(tokenval); if (!__pwd || !__email || !__tokenid || !__tokenval) { gg_debug(GG_DEBUG_MISC, "=> register, not enough memory for form fields\n"); free(__pwd); free(__email); free(__tokenid); free(__tokenval); errno = ENOMEM; return NULL; } form = gg_saprintf("pwd=%s&email=%s&tokenid=%s&tokenval=%s&code=%u", __pwd, __email, __tokenid, __tokenval, gg_http_hash("ss", email, password)); free(__pwd); free(__email); free(__tokenid); free(__tokenval); if (!form) { gg_debug(GG_DEBUG_MISC, "=> register, not enough memory for form query\n"); errno = ENOMEM; return NULL; } gg_debug(GG_DEBUG_MISC, "=> register, %s\n", form); query = gg_saprintf( "Host: " GG_REGISTER_HOST "\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "User-Agent: " GG_HTTP_USERAGENT "\r\n" "Content-Length: %d\r\n" "Pragma: no-cache\r\n" "\r\n" "%s", (int) strlen(form), form); free(form); if (!(h = gg_http_connect(GG_REGISTER_HOST, GG_REGISTER_PORT, async, "POST", "/appsvc/fmregister3.asp", query))) { gg_debug(GG_DEBUG_MISC, "=> register, gg_http_connect() failed mysteriously\n"); free(query); return NULL; } h->type = GG_SESSION_REGISTER; free(query); h->callback = gg_pubdir_watch_fd; h->destroy = gg_pubdir_free; if (!async) gg_pubdir_watch_fd(h); return h; } /* * gg_unregister3() * * usuwa konto u¿ytkownika z serwera protoko³em GG 6.0 * * - uin - numerek GG * - password - has³o klienta * - tokenid - identyfikator tokenu * - tokenval - warto¶æ tokenu * - async - po³±czenie asynchroniczne * * zaalokowana struct gg_http, któr± po¼niej nale¿y zwolniæ * funkcj± gg_unregister_free(), albo NULL je¶li wyst±pi³ b³±d. */ struct gg_http *gg_unregister3(uin_t uin, const char *password, const char *tokenid, const char *tokenval, int async) { struct gg_http *h; char *__fmpwd, *__pwd, *__tokenid, *__tokenval, *form, *query; if (!password || !tokenid || !tokenval) { gg_debug(GG_DEBUG_MISC, "=> unregister, NULL parameter\n"); errno = EINVAL; return NULL; } __pwd = gg_saprintf("%ld", random()); __fmpwd = gg_urlencode(password); __tokenid = gg_urlencode(tokenid); __tokenval = gg_urlencode(tokenval); if (!__fmpwd || !__pwd || !__tokenid || !__tokenval) { gg_debug(GG_DEBUG_MISC, "=> unregister, not enough memory for form fields\n"); free(__pwd); free(__fmpwd); free(__tokenid); free(__tokenval); errno = ENOMEM; return NULL; } form = gg_saprintf("fmnumber=%d&fmpwd=%s&delete=1&pwd=%s&email=deletedaccount@gadu-gadu.pl&tokenid=%s&tokenval=%s&code=%u", uin, __fmpwd, __pwd, __tokenid, __tokenval, gg_http_hash("ss", "deletedaccount@gadu-gadu.pl", __pwd)); free(__fmpwd); free(__pwd); free(__tokenid); free(__tokenval); if (!form) { gg_debug(GG_DEBUG_MISC, "=> unregister, not enough memory for form query\n"); errno = ENOMEM; return NULL; } gg_debug(GG_DEBUG_MISC, "=> unregister, %s\n", form); query = gg_saprintf( "Host: " GG_REGISTER_HOST "\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "User-Agent: " GG_HTTP_USERAGENT "\r\n" "Content-Length: %d\r\n" "Pragma: no-cache\r\n" "\r\n" "%s", (int) strlen(form), form); free(form); if (!(h = gg_http_connect(GG_REGISTER_HOST, GG_REGISTER_PORT, async, "POST", "/appsvc/fmregister3.asp", query))) { gg_debug(GG_DEBUG_MISC, "=> unregister, gg_http_connect() failed mysteriously\n"); free(query); return NULL; } h->type = GG_SESSION_UNREGISTER; free(query); h->callback = gg_pubdir_watch_fd; h->destroy = gg_pubdir_free; if (!async) gg_pubdir_watch_fd(h); return h; } /* * gg_change_passwd4() * * wysy³a ¿±danie zmiany has³a zgodnie z protoko³em GG 6.0. wymaga * wcze¶niejszego pobrania tokenu za pomoc± funkcji gg_token(). * * - uin - numer * - email - adres e-mail * - passwd - stare has³o * - newpasswd - nowe has³o * - tokenid - identyfikator tokenu * - tokenval - warto¶æ tokenu * - async - po³±czenie asynchroniczne * * zaalokowana struct gg_http, któr± po¼niej nale¿y zwolniæ * funkcj± gg_change_passwd_free(), albo NULL je¶li wyst±pi³ b³±d. */ struct gg_http *gg_change_passwd4(uin_t uin, const char *email, const char *passwd, const char *newpasswd, const char *tokenid, const char *tokenval, int async) { struct gg_http *h; char *form, *query, *__email, *__fmpwd, *__pwd, *__tokenid, *__tokenval; if (!uin || !email || !passwd || !newpasswd || !tokenid || !tokenval) { gg_debug(GG_DEBUG_MISC, "=> change, NULL parameter\n"); errno = EINVAL; return NULL; } __fmpwd = gg_urlencode(passwd); __pwd = gg_urlencode(newpasswd); __email = gg_urlencode(email); __tokenid = gg_urlencode(tokenid); __tokenval = gg_urlencode(tokenval); if (!__fmpwd || !__pwd || !__email || !__tokenid || !__tokenval) { gg_debug(GG_DEBUG_MISC, "=> change, not enough memory for form fields\n"); free(__fmpwd); free(__pwd); free(__email); free(__tokenid); free(__tokenval); errno = ENOMEM; return NULL; } if (!(form = gg_saprintf("fmnumber=%d&fmpwd=%s&pwd=%s&email=%s&tokenid=%s&tokenval=%s&code=%u", uin, __fmpwd, __pwd, __email, __tokenid, __tokenval, gg_http_hash("ss", email, newpasswd)))) { gg_debug(GG_DEBUG_MISC, "=> change, not enough memory for form fields\n"); free(__fmpwd); free(__pwd); free(__email); free(__tokenid); free(__tokenval); errno = ENOMEM; return NULL; } free(__fmpwd); free(__pwd); free(__email); free(__tokenid); free(__tokenval); gg_debug(GG_DEBUG_MISC, "=> change, %s\n", form); query = gg_saprintf( "Host: " GG_REGISTER_HOST "\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "User-Agent: " GG_HTTP_USERAGENT "\r\n" "Content-Length: %d\r\n" "Pragma: no-cache\r\n" "\r\n" "%s", (int) strlen(form), form); free(form); if (!(h = gg_http_connect(GG_REGISTER_HOST, GG_REGISTER_PORT, async, "POST", "/appsvc/fmregister3.asp", query))) { gg_debug(GG_DEBUG_MISC, "=> change, gg_http_connect() failed mysteriously\n"); free(query); return NULL; } h->type = GG_SESSION_PASSWD; free(query); h->callback = gg_pubdir_watch_fd; h->destroy = gg_pubdir_free; if (!async) gg_pubdir_watch_fd(h); return h; } /* * gg_remind_passwd() * * wysy³a ¿±danie przypomnienia has³a e-mailem. * * - uin - numer * - async - po³±czenie asynchroniczne * - tokenid - identyfikator tokenu * - tokenval - warto¶æ tokenu * * zaalokowana struct gg_http, któr± po¼niej nale¿y zwolniæ * funkcj± gg_remind_passwd_free(), albo NULL je¶li wyst±pi³ b³±d. */ struct gg_http *gg_remind_passwd2(uin_t uin, const char *tokenid, const char *tokenval, int async) { struct gg_http *h; char *form, *query, *__tokenid, *__tokenval; if (!tokenid || !tokenval) { gg_debug(GG_DEBUG_MISC, "=> remind, NULL parameter\n"); errno = EINVAL; return NULL; } __tokenid = gg_urlencode(tokenid); __tokenval = gg_urlencode(tokenval); if (!__tokenid || !__tokenval) { gg_debug(GG_DEBUG_MISC, "=> remind, not enough memory for form fields\n"); free(__tokenid); free(__tokenval); errno = ENOMEM; return NULL; } if (!(form = gg_saprintf("userid=%d&code=%u&tokenid=%s&tokenval=%s", uin, gg_http_hash("u", uin), __tokenid, __tokenval))) { gg_debug(GG_DEBUG_MISC, "=> remind, not enough memory for form fields\n"); errno = ENOMEM; free(__tokenid); free(__tokenval); return NULL; } free(__tokenid); free(__tokenval); gg_debug(GG_DEBUG_MISC, "=> remind, %s\n", form); query = gg_saprintf( "Host: " GG_REMIND_HOST "\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "User-Agent: " GG_HTTP_USERAGENT "\r\n" "Content-Length: %d\r\n" "Pragma: no-cache\r\n" "\r\n" "%s", (int) strlen(form), form); free(form); if (!(h = gg_http_connect(GG_REMIND_HOST, GG_REMIND_PORT, async, "POST", "/appsvc/fmsendpwd3.asp", query))) { gg_debug(GG_DEBUG_MISC, "=> remind, gg_http_connect() failed mysteriously\n"); free(query); return NULL; } h->type = GG_SESSION_REMIND; free(query); h->callback = gg_pubdir_watch_fd; h->destroy = gg_pubdir_free; if (!async) gg_pubdir_watch_fd(h); return h; } /* * gg_pubdir_watch_fd() * * przy asynchronicznych operacjach na katalogu publicznym nale¿y wywo³ywaæ * tê funkcjê przy zmianach na obserwowanym deskryptorze. * * - h - struktura opisuj±ca po³±czenie * * je¶li wszystko posz³o dobrze to 0, inaczej -1. operacja bêdzie * zakoñczona, je¶li h->state == GG_STATE_DONE. je¶li wyst±pi jaki¶ * b³±d, to bêdzie tam GG_STATE_ERROR i odpowiedni kod b³êdu w h->error. */ int gg_pubdir_watch_fd(struct gg_http *h) { struct gg_pubdir *p; char *tmp; if (!h) { errno = EINVAL; return -1; } if (h->state == GG_STATE_ERROR) { gg_debug(GG_DEBUG_MISC, "=> pubdir, watch_fd issued on failed session\n"); errno = EINVAL; return -1; } if (h->state != GG_STATE_PARSING) { if (gg_http_watch_fd(h) == -1) { gg_debug(GG_DEBUG_MISC, "=> pubdir, http failure\n"); errno = EINVAL; return -1; } } if (h->state != GG_STATE_PARSING) return 0; h->state = GG_STATE_DONE; if (!(h->data = p = malloc(sizeof(struct gg_pubdir)))) { gg_debug(GG_DEBUG_MISC, "=> pubdir, not enough memory for results\n"); return -1; } p->success = 0; p->uin = 0; gg_debug(GG_DEBUG_MISC, "=> pubdir, let's parse \"%s\"\n", h->body); if ((tmp = strstr(h->body, "success")) || (tmp = strstr(h->body, "results"))) { p->success = 1; if (tmp[7] == ':') p->uin = strtol(tmp + 8, NULL, 0); gg_debug(GG_DEBUG_MISC, "=> pubdir, success (uin=%d)\n", p->uin); } else gg_debug(GG_DEBUG_MISC, "=> pubdir, error.\n"); return 0; } /* * gg_pubdir_free() * * zwalnia pamiêæ po efektach operacji na katalogu publicznym. * * - h - zwalniana struktura */ void gg_pubdir_free(struct gg_http *h) { if (!h) return; free(h->data); gg_http_free(h); } /* * gg_token() * * pobiera z serwera token do autoryzacji zak³adania konta, usuwania * konta i zmiany has³a. * * zaalokowana struct gg_http, któr± po¼niej nale¿y zwolniæ * funkcj± gg_token_free(), albo NULL je¶li wyst±pi³ b³±d. */ struct gg_http *gg_token(int async) { struct gg_http *h; const char *query; query = "Host: " GG_REGISTER_HOST "\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "User-Agent: " GG_HTTP_USERAGENT "\r\n" "Content-Length: 0\r\n" "Pragma: no-cache\r\n" "\r\n"; if (!(h = gg_http_connect(GG_APPMSG_HOST, GG_APPMSG_PORT, async, "POST", "/appsvc/regtoken.asp", query))) { gg_debug(GG_DEBUG_MISC, "=> token, gg_http_connect() failed mysteriously\n"); return NULL; } h->type = GG_SESSION_TOKEN; h->callback = gg_token_watch_fd; h->destroy = gg_token_free; if (!async) gg_token_watch_fd(h); return h; } /* * gg_token_watch_fd() * * przy asynchronicznych operacjach zwi±zanych z tokenem nale¿y wywo³ywaæ * tê funkcjê przy zmianach na obserwowanym deskryptorze. * * - h - struktura opisuj±ca po³±czenie * * je¶li wszystko posz³o dobrze to 0, inaczej -1. operacja bêdzie * zakoñczona, je¶li h->state == GG_STATE_DONE. je¶li wyst±pi jaki¶ * b³±d, to bêdzie tam GG_STATE_ERROR i odpowiedni kod b³êdu w h->error. */ int gg_token_watch_fd(struct gg_http *h) { if (!h) { errno = EINVAL; return -1; } if (h->state == GG_STATE_ERROR) { gg_debug(GG_DEBUG_MISC, "=> token, watch_fd issued on failed session\n"); errno = EINVAL; return -1; } if (h->state != GG_STATE_PARSING) { if (gg_http_watch_fd(h) == -1) { gg_debug(GG_DEBUG_MISC, "=> token, http failure\n"); errno = EINVAL; return -1; } } if (h->state != GG_STATE_PARSING) return 0; /* je¶li h->data jest puste, to ¶ci±gali¶my tokenid i url do niego, * ale je¶li co¶ tam jest, to znaczy, ¿e mamy drugi etap polegaj±cy * na pobieraniu tokenu. */ if (!h->data) { int width, height, length; char *url = NULL, *tokenid = NULL, *path; struct gg_http *h2; struct gg_token *t; gg_debug(GG_DEBUG_MISC, "=> token body \"%s\"\n", h->body); if (h->body && (!(url = malloc(strlen(h->body))) || !(tokenid = malloc(strlen(h->body))))) { gg_debug(GG_DEBUG_MISC, "=> token, not enough memory for results\n"); free(url); return -1; } if (!h->body || sscanf(h->body, "%d %d %d\r\n%s\r\n%s", &width, &height, &length, tokenid, url) != 5) { gg_debug(GG_DEBUG_MISC, "=> token, parsing failed\n"); free(url); free(tokenid); return -1; } /* dostali¶my tokenid i wszystkie niezbêdne informacje, * wiêc pobierzmy obrazek z tokenem */ if (!(path = gg_saprintf("%s?tokenid=%s", url, tokenid))) { gg_debug(GG_DEBUG_MISC, "=> token, not enough memory for token url\n"); free(url); free(tokenid); return -1; } free(url); if (!(h2 = gg_http_connect(GG_APPMSG_HOST, GG_APPMSG_PORT, h->async, "GET", path, "Host: " GG_APPMSG_HOST "\r\nUser-Agent: " GG_HTTP_USERAGENT "\r\n\r\n"))) { gg_debug(GG_DEBUG_MISC, "=> token, gg_http_connect() failed mysteriously\n"); free(path); free(tokenid); return -1; } free(path); memcpy(h, h2, sizeof(struct gg_http)); free(h2); h->type = GG_SESSION_TOKEN; h->callback = gg_token_watch_fd; h->destroy = gg_token_free; if (!h->async) gg_token_watch_fd(h); if (!(h->data = t = malloc(sizeof(struct gg_token)))) { gg_debug(GG_DEBUG_MISC, "=> token, not enough memory for token data\n"); free(tokenid); return -1; } t->width = width; t->height = height; t->length = length; t->tokenid = tokenid; } else { /* obrazek mamy w h->body */ h->state = GG_STATE_DONE; } return 0; } /* * gg_token_free() * * zwalnia pamiêæ po efektach pobierania tokenu. * * - h - zwalniana struktura */ void gg_token_free(struct gg_http *h) { struct gg_token *t; if (!h) return; if ((t = h->data)) free(t->tokenid); free(h->data); gg_http_free(h); } /* * Local variables: * c-indentation-style: k&r * c-basic-offset: 8 * indent-tabs-mode: notnil * End: * * vim: shiftwidth=8: */ centerim-4.22.10/libgadu/libgadu-config.h0000644000175000001440000000061111461606612015036 00000000000000#ifndef __GG_LIBGADU_CONFIG_H #define __GG_LIBGADU_CONFIG_H #include #ifdef WORDS_BIGENDIAN #define __GG_LIBGADU_BIGENDIAN #endif #if defined(HAVE_OPENSSL) || defined(HAVE_GNUTLS) || defined(HAVE_NSS_COMPAT) #define __GG_LIBGADU_HAVE_OPENSSL #endif #ifdef HAVE_STDINT_H #include #else #ifdef HAVE_SYS_TYPES_H #include #endif #endif #endif centerim-4.22.10/libgadu/libgadu.h0000644000175000001440000013177411461606612013612 00000000000000/* $Id: libgadu.h,v 1.3 2004/06/10 19:20:08 konst Exp $ */ /* * (C) Copyright 2001-2003 Wojtek Kaniewski * Robert J. Wo¼ny * Arkadiusz Mi¶kiewicz * Tomasz Chiliñski * Piotr Wysocki * Dawid Jarosz * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License Version * 2.1 as published by the Free Software Foundation. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __GG_LIBGADU_H #define __GG_LIBGADU_H #ifdef __cplusplus #ifdef _WIN32 #pragma pack(push, 1) #endif extern "C" { #endif #include #include #include #include #if defined(HAVE_OPENSSL) #ifndef OPENSSL_NO_KRB5 #define OPENSSL_NO_KRB5 1 #endif #include #elif defined(HAVE_NSS_COMPAT) #include #elif HAVE_GNUTLS #include #endif /* * typedef uin_t * * typ reprezentuj±cy numer osoby. */ typedef uint32_t uin_t; /* * ogólna struktura opisuj±ca ró¿ne sesje. przydatna w klientach. */ #define gg_common_head(x) \ int fd; /* podgl±dany deskryptor */ \ int check; /* sprawdzamy zapis czy odczyt */ \ int state; /* aktualny stan maszynki */ \ int error; /* kod b³êdu dla GG_STATE_ERROR */ \ int type; /* rodzaj sesji */ \ int id; /* identyfikator */ \ int timeout; /* sugerowany timeout w sekundach */ \ int (*callback)(x*); /* callback przy zmianach */ \ void (*destroy)(x*); /* funkcja niszczenia */ struct gg_common { gg_common_head(struct gg_common) }; struct gg_image_queue; /* * struct gg_session * * struktura opisuj±ca dan± sesjê. tworzona przez gg_login(), zwalniana * przez gg_free_session(). */ struct gg_session { gg_common_head(struct gg_session) int async; /* czy po³±czenie jest asynchroniczne */ int pid; /* pid procesu resolvera */ int port; /* port, z którym siê ³±czymy */ int seq; /* numer sekwencyjny ostatniej wiadomo¶ci */ int last_pong; /* czas otrzymania ostatniego ping/pong */ int last_event; /* czas otrzymania ostatniego pakietu */ struct gg_event *event; /* zdarzenie po ->callback() */ uint32_t proxy_addr; /* adres proxy, keszowany */ uint16_t proxy_port; /* port proxy */ uint32_t hub_addr; /* adres huba po resolvniêciu */ uint32_t server_addr; /* adres serwera, od huba */ uint32_t client_addr; /* adres klienta */ uint16_t client_port; /* port, na którym klient s³ucha */ uint32_t external_addr; /* adres zewnetrzny klienta */ uint16_t external_port; /* port zewnetrzny klienta */ uin_t uin; /* numerek klienta */ char *password; /* i jego has³o. zwalniane automagicznie */ int initial_status; /* pocz±tkowy stan klienta */ int status; /* aktualny stan klienta */ char *recv_buf; /* bufor na otrzymywane pakiety */ int recv_done; /* ile ju¿ wczytano do bufora */ int recv_left; /* i ile jeszcze trzeba wczytaæ */ int protocol_version; /* wersja u¿ywanego protoko³u */ char *client_version; /* wersja u¿ywanego klienta */ int last_sysmsg; /* ostatnia wiadomo¶æ systemowa */ char *initial_descr; /* pocz±tkowy opis stanu klienta */ void *resolver; /* wska¼nik na informacje resolvera */ char *header_buf; /* bufor na pocz±tek nag³ówka */ unsigned int header_done;/* ile ju¿ mamy */ #if defined(HAVE_OPENSSL) || defined(HAVE_NSS_COMPAT) SSL *ssl; /* sesja TLS */ SSL_CTX *ssl_ctx; /* kontekst sesji? */ #elif HAVE_GNUTLS gnutls_session_t session; /* TLS session */ gnutls_certificate_credentials_t xcred; /*Credentials*/ #endif int image_size; /* maksymalny rozmiar obrazków w KiB */ char *userlist_reply; /* fragment odpowiedzi listy kontaktów */ int userlist_blocks; /* na ile kawa³ków podzielono listê kontaktów */ struct gg_image_queue *images; /* aktualnie wczytywane obrazki */ }; /* * struct gg_http * * ogólna struktura opisuj±ca stan wszystkich operacji HTTP. tworzona * przez gg_http_connect(), zwalniana przez gg_http_free(). */ struct gg_http { gg_common_head(struct gg_http) int async; /* czy po³±czenie asynchroniczne */ int pid; /* pid procesu resolvera */ int port; /* port, z którym siê ³±czymy */ char *query; /* bufor zapytania http */ char *header; /* bufor nag³ówka */ int header_size; /* rozmiar wczytanego nag³ówka */ char *body; /* bufor otrzymanych informacji */ unsigned int body_size; /* oczekiwana ilo¶æ informacji */ void *data; /* dane danej operacji http */ char *user_data; /* dane u¿ytkownika, nie s± zwalniane przez gg_http_free() */ void *resolver; /* wska¼nik na informacje resolvera */ unsigned int body_done; /* ile ju¿ tre¶ci odebrano? */ }; #ifdef __GNUC__ #define GG_PACKED __attribute__ ((packed)) #else #define GG_PACKED #endif #define GG_MAX_PATH 276 /* * struct gg_file_info * * odpowiednik windowsowej struktury WIN32_FIND_DATA niezbêdnej przy * wysy³aniu plików. */ struct gg_file_info { uint32_t mode; /* dwFileAttributes */ uint32_t ctime[2]; /* ftCreationTime */ uint32_t atime[2]; /* ftLastAccessTime */ uint32_t mtime[2]; /* ftLastWriteTime */ uint32_t size_hi; /* nFileSizeHigh */ uint32_t size; /* nFileSizeLow */ uint32_t reserved0; /* dwReserved0 */ uint32_t reserved1; /* dwReserved1 */ unsigned char filename[GG_MAX_PATH - 14]; /* cFileName */ unsigned char short_filename[14]; /* cAlternateFileName */ } GG_PACKED; /* * struct gg_dcc * * struktura opisuj±ca nas³uchuj±ce gniazdo po³±czeñ miêdzy klientami. * tworzona przez gg_dcc_socket_create(), zwalniana przez gg_dcc_free(). */ struct gg_dcc { gg_common_head(struct gg_dcc) struct gg_event *event; /* opis zdarzenia */ int active; /* czy to my siê ³±czymy? */ int port; /* port, na którym siedzi */ uin_t uin; /* uin klienta */ uin_t peer_uin; /* uin drugiej strony */ int file_fd; /* deskryptor pliku */ unsigned int offset; /* offset w pliku */ unsigned int chunk_size;/* rozmiar kawa³ka */ unsigned int chunk_offset;/* offset w aktualnym kawa³ku */ struct gg_file_info file_info; /* informacje o pliku */ int established; /* po³±czenie ustanowione */ char *voice_buf; /* bufor na pakiet po³±czenia g³osowego */ int incoming; /* po³±czenie przychodz±ce */ char *chunk_buf; /* bufor na kawa³ek danych */ uint32_t remote_addr; /* adres drugiej strony */ uint16_t remote_port; /* port drugiej strony */ }; /* * enum gg_session_t * * rodzaje sesji. */ enum gg_session_t { GG_SESSION_GG = 1, /* po³±czenie z serwerem gg */ GG_SESSION_HTTP, /* ogólna sesja http */ GG_SESSION_SEARCH, /* szukanie */ GG_SESSION_REGISTER, /* rejestrowanie */ GG_SESSION_REMIND, /* przypominanie has³a */ GG_SESSION_PASSWD, /* zmiana has³a */ GG_SESSION_CHANGE, /* zmiana informacji o sobie */ GG_SESSION_DCC, /* ogólne po³±czenie DCC */ GG_SESSION_DCC_SOCKET, /* nas³uchuj±cy socket */ GG_SESSION_DCC_SEND, /* wysy³anie pliku */ GG_SESSION_DCC_GET, /* odbieranie pliku */ GG_SESSION_DCC_VOICE, /* rozmowa g³osowa */ GG_SESSION_USERLIST_GET, /* pobieranie userlisty */ GG_SESSION_USERLIST_PUT, /* wysy³anie userlisty */ GG_SESSION_UNREGISTER, /* usuwanie konta */ GG_SESSION_USERLIST_REMOVE, /* usuwanie userlisty */ GG_SESSION_TOKEN, /* pobieranie tokenu */ GG_SESSION_USER0 = 256, /* zdefiniowana dla u¿ytkownika */ GG_SESSION_USER1, /* j.w. */ GG_SESSION_USER2, /* j.w. */ GG_SESSION_USER3, /* j.w. */ GG_SESSION_USER4, /* j.w. */ GG_SESSION_USER5, /* j.w. */ GG_SESSION_USER6, /* j.w. */ GG_SESSION_USER7 /* j.w. */ }; /* * enum gg_state_t * * opisuje stan asynchronicznej maszyny. */ enum gg_state_t { /* wspólne */ GG_STATE_IDLE = 0, /* nie powinno wyst±piæ. */ GG_STATE_RESOLVING, /* wywo³a³ gethostbyname() */ GG_STATE_CONNECTING, /* wywo³a³ connect() */ GG_STATE_READING_DATA, /* czeka na dane http */ GG_STATE_ERROR, /* wyst±pi³ b³±d. kod w x->error */ /* gg_session */ GG_STATE_CONNECTING_HUB, /* wywo³a³ connect() na huba */ GG_STATE_CONNECTING_GG, /* wywo³a³ connect() na serwer */ GG_STATE_READING_KEY, /* czeka na klucz */ GG_STATE_READING_REPLY, /* czeka na odpowied¼ */ GG_STATE_CONNECTED, /* po³±czy³ siê */ /* gg_http */ GG_STATE_SENDING_QUERY, /* wysy³a zapytanie http */ GG_STATE_READING_HEADER, /* czeka na nag³ówek http */ GG_STATE_PARSING, /* przetwarza dane */ GG_STATE_DONE, /* skoñczy³ */ /* gg_dcc */ GG_STATE_LISTENING, /* czeka na po³±czenia */ GG_STATE_READING_UIN_1, /* czeka na uin peera */ GG_STATE_READING_UIN_2, /* czeka na swój uin */ GG_STATE_SENDING_ACK, /* wysy³a potwierdzenie dcc */ GG_STATE_READING_ACK, /* czeka na potwierdzenie dcc */ GG_STATE_READING_REQUEST, /* czeka na komendê */ GG_STATE_SENDING_REQUEST, /* wysy³a komendê */ GG_STATE_SENDING_FILE_INFO, /* wysy³a informacje o pliku */ GG_STATE_READING_PRE_FILE_INFO, /* czeka na pakiet przed file_info */ GG_STATE_READING_FILE_INFO, /* czeka na informacje o pliku */ GG_STATE_SENDING_FILE_ACK, /* wysy³a potwierdzenie pliku */ GG_STATE_READING_FILE_ACK, /* czeka na potwierdzenie pliku */ GG_STATE_SENDING_FILE_HEADER, /* wysy³a nag³ówek pliku */ GG_STATE_READING_FILE_HEADER, /* czeka na nag³ówek */ GG_STATE_GETTING_FILE, /* odbiera plik */ GG_STATE_SENDING_FILE, /* wysy³a plik */ GG_STATE_READING_VOICE_ACK, /* czeka na potwierdzenie voip */ GG_STATE_READING_VOICE_HEADER, /* czeka na rodzaj bloku voip */ GG_STATE_READING_VOICE_SIZE, /* czeka na rozmiar bloku voip */ GG_STATE_READING_VOICE_DATA, /* czeka na dane voip */ GG_STATE_SENDING_VOICE_ACK, /* wysy³a potwierdzenie voip */ GG_STATE_SENDING_VOICE_REQUEST, /* wysy³a ¿±danie voip */ GG_STATE_READING_TYPE, /* czeka na typ po³±czenia */ /* nowe. bez sensu jest to API. */ GG_STATE_TLS_NEGOTIATION /* negocjuje po³±czenie TLS */ }; /* * enum gg_check_t * * informuje, co proces klienta powinien sprawdziæ na deskryptorze danego * po³±czenia. */ enum gg_check_t { GG_CHECK_NONE = 0, /* nic. nie powinno wyst±piæ */ GG_CHECK_WRITE = 1, /* sprawdzamy mo¿liwo¶æ zapisu */ GG_CHECK_READ = 2 /* sprawdzamy mo¿liwo¶æ odczytu */ }; /* * struct gg_login_params * * parametry gg_login(). przeniesiono do struktury, ¿eby unikn±æ problemów * z ci±g³ymi zmianami API, gdy dodano co¶ nowego do protoko³u. */ struct gg_login_params { uin_t uin; /* numerek */ char *password; /* has³o */ int async; /* asynchroniczne sockety? */ int status; /* pocz±tkowy status klienta */ char *status_descr; /* opis statusu */ uint32_t server_addr; /* adres serwera gg */ uint16_t server_port; /* port serwera gg */ uint32_t client_addr; /* adres dcc klienta */ uint16_t client_port; /* port dcc klienta */ int protocol_version; /* wersja protoko³u */ char *client_version; /* wersja klienta */ int has_audio; /* czy ma d¼wiêk? */ int last_sysmsg; /* ostatnia wiadomo¶æ systemowa */ uint32_t external_addr; /* adres widziany na zewnatrz */ uint16_t external_port; /* port widziany na zewnatrz */ int tls; /* czy ³±czymy po TLS? */ int image_size; /* maksymalny rozmiar obrazka w KiB */ char dummy[6 * sizeof(int)]; /* miejsce na kolejnych 8 zmiennych, * ¿eby z dodaniem parametru nie * zmienia³ siê rozmiar struktury */ }; struct gg_session *gg_login(const struct gg_login_params *p); void gg_free_session(struct gg_session *sess); void gg_logoff(struct gg_session *sess); int gg_change_status(struct gg_session *sess, int status); int gg_change_status_descr(struct gg_session *sess, int status, const char *descr); int gg_change_status_descr_time(struct gg_session *sess, int status, const char *descr, int time); int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message); int gg_send_message_richtext(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, const unsigned char *format, int formatlen); int gg_send_message_confer(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message); int gg_send_message_confer_richtext(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message, const unsigned char *format, int formatlen); int gg_send_message_ctcp(struct gg_session *sess, int msgclass, uin_t recipient, const unsigned char *message, int message_len); int gg_ping(struct gg_session *sess); int gg_userlist_request(struct gg_session *sess, char type, const char *request); int gg_image_request(struct gg_session *sess, uin_t recipient, int size, uint32_t crc32); int gg_image_reply(struct gg_session *sess, uin_t recipient, const char *filename, const char *image, int size); uint32_t gg_crc32(uint32_t crc, const unsigned char *buf, int len); struct gg_image_queue { uin_t sender; /* nadawca obrazka */ uint32_t size; /* rozmiar */ uint32_t crc32; /* suma kontrolna */ char *filename; /* nazwa pliku */ char *image; /* bufor z obrazem */ uint32_t done; /* ile ju¿ wczytano */ struct gg_image_queue *next; /* nastêpny na li¶cie */ }; /* * enum gg_event_t * * rodzaje zdarzeñ. */ enum gg_event_t { GG_EVENT_NONE = 0, /* nic siê nie wydarzy³o */ GG_EVENT_MSG, /* otrzymano wiadomo¶æ */ GG_EVENT_NOTIFY, /* kto¶ siê pojawi³ */ GG_EVENT_NOTIFY_DESCR, /* kto¶ siê pojawi³ z opisem */ GG_EVENT_STATUS, /* kto¶ zmieni³ stan */ GG_EVENT_ACK, /* potwierdzenie wys³ania wiadomo¶ci */ GG_EVENT_PONG, /* pakiet pong */ GG_EVENT_CONN_FAILED, /* po³±czenie siê nie uda³o */ GG_EVENT_CONN_SUCCESS, /* po³±czenie siê powiod³o */ GG_EVENT_DISCONNECT, /* serwer zrywa po³±czenie */ GG_EVENT_DCC_NEW, /* nowe po³±czenie miêdzy klientami */ GG_EVENT_DCC_ERROR, /* b³±d po³±czenia miêdzy klientami */ GG_EVENT_DCC_DONE, /* zakoñczono po³±czenie */ GG_EVENT_DCC_CLIENT_ACCEPT, /* moment akceptacji klienta */ GG_EVENT_DCC_CALLBACK, /* klient siê po³±czy³ na ¿±danie */ GG_EVENT_DCC_NEED_FILE_INFO, /* nale¿y wype³niæ file_info */ GG_EVENT_DCC_NEED_FILE_ACK, /* czeka na potwierdzenie pliku */ GG_EVENT_DCC_NEED_VOICE_ACK, /* czeka na potwierdzenie rozmowy */ GG_EVENT_DCC_VOICE_DATA, /* ramka danych rozmowy g³osowej */ GG_EVENT_PUBDIR50_SEARCH_REPLY, /* odpowiedz wyszukiwania */ GG_EVENT_PUBDIR50_READ, /* odczytano w³asne dane z katalogu */ GG_EVENT_PUBDIR50_WRITE, /* wpisano w³asne dane do katalogu */ GG_EVENT_STATUS60, /* kto¶ zmieni³ stan w GG 6.0 */ GG_EVENT_NOTIFY60, /* kto¶ siê pojawi³ w GG 6.0 */ GG_EVENT_USERLIST, /* odpowied¼ listy kontaktów w GG 6.0 */ GG_EVENT_IMAGE_REQUEST, /* pro¶ba o wys³anie obrazka GG 6.0 */ GG_EVENT_IMAGE_REPLY, /* podes³any obrazek GG 6.0 */ GG_EVENT_DCC_ACK /* potwierdzenie transmisji */ }; #define GG_EVENT_SEARCH50_REPLY GG_EVENT_PUBDIR50_SEARCH_REPLY /* * enum gg_failure_t * * okre¶la powód nieudanego po³±czenia. */ enum gg_failure_t { GG_FAILURE_RESOLVING = 1, /* nie znaleziono serwera */ GG_FAILURE_CONNECTING, /* nie mo¿na siê po³±czyæ */ GG_FAILURE_INVALID, /* serwer zwróci³ nieprawid³owe dane */ GG_FAILURE_READING, /* zerwano po³±czenie podczas odczytu */ GG_FAILURE_WRITING, /* zerwano po³±czenie podczas zapisu */ GG_FAILURE_PASSWORD, /* nieprawid³owe has³o */ GG_FAILURE_404, /* XXX nieu¿ywane */ GG_FAILURE_TLS, /* b³±d negocjacji TLS */ GG_FAILURE_NEED_EMAIL /* serwer roz³±czy³ nas z pro¶b± o zmianê emaila */ }; /* * enum gg_error_t * * okre¶la rodzaj b³êdu wywo³anego przez dan± operacjê. nie zawiera * przesadnie szczegó³owych informacji o powodzie b³êdu, by nie komplikowaæ * obs³ugi b³êdów. je¶li wymagana jest wiêksza dok³adno¶æ, nale¿y sprawdziæ * zawarto¶æ zmiennej errno. */ enum gg_error_t { GG_ERROR_RESOLVING = 1, /* b³±d znajdowania hosta */ GG_ERROR_CONNECTING, /* b³±d ³aczenia siê */ GG_ERROR_READING, /* b³±d odczytu */ GG_ERROR_WRITING, /* b³±d wysy³ania */ GG_ERROR_DCC_HANDSHAKE, /* b³±d negocjacji */ GG_ERROR_DCC_FILE, /* b³±d odczytu/zapisu pliku */ GG_ERROR_DCC_EOF, /* plik siê skoñczy³? */ GG_ERROR_DCC_NET, /* b³±d wysy³ania/odbierania */ GG_ERROR_DCC_REFUSED /* po³±czenie odrzucone przez usera */ }; /* * struktury dotycz±ce wyszukiwania w GG 5.0. NIE NALE¯Y SIÊ DO NICH * ODWO£YWAÆ BEZPO¦REDNIO! do dostêpu do nich s³u¿± funkcje gg_pubdir50_*() */ struct gg_pubdir50_entry { int num; char *field; char *value; }; struct gg_pubdir50_s { int count; uin_t next; int type; uint32_t seq; struct gg_pubdir50_entry *entries; int entries_count; }; /* * typedef gg_pubdir_50_t * * typ opisuj±cy zapytanie lub wynik zapytania katalogu publicznego * z protoko³u GG 5.0. nie nale¿y siê odwo³ywaæ bezpo¶rednio do jego * pól -- s³u¿± do tego funkcje gg_pubdir50_*() */ typedef struct gg_pubdir50_s *gg_pubdir50_t; /* * struct gg_event * * struktura opisuj±ca rodzaj zdarzenia. wychodzi z gg_watch_fd() lub * z gg_dcc_watch_fd() */ struct gg_event { int type; /* rodzaj zdarzenia -- gg_event_t */ union { /* @event */ struct gg_notify_reply *notify; /* informacje o li¶cie kontaktów -- GG_EVENT_NOTIFY */ enum gg_failure_t failure; /* b³±d po³±czenia -- GG_EVENT_FAILURE */ struct gg_dcc *dcc_new; /* nowe po³±czenie bezpo¶rednie -- GG_EVENT_DCC_NEW */ int dcc_error; /* b³±d po³±czenia bezpo¶redniego -- GG_EVENT_DCC_ERROR */ gg_pubdir50_t pubdir50; /* wynik operacji zwi±zanej z katalogiem publicznym -- GG_EVENT_PUBDIR50_* */ struct { /* @msg odebrano wiadomo¶æ -- GG_EVENT_MSG */ uin_t sender; /* numer nadawcy */ int msgclass; /* klasa wiadomo¶ci */ time_t time; /* czas nadania */ unsigned char *message; /* tre¶æ wiadomo¶ci */ int recipients_count; /* ilo¶æ odbiorców konferencji */ uin_t *recipients; /* odbiorcy konferencji */ int formats_length; /* d³ugo¶æ informacji o formatowaniu tekstu */ void *formats; /* informacje o formatowaniu tekstu */ } msg; struct { /* @notify_descr informacje o li¶cie kontaktów z opisami stanu -- GG_EVENT_NOTIFY_DESCR */ struct gg_notify_reply *notify; /* informacje o li¶cie kontaktów */ char *descr; /* opis stanu */ } notify_descr; struct { /* @status zmiana stanu -- GG_EVENT_STATUS */ uin_t uin; /* numer */ uint32_t status; /* nowy stan */ char *descr; /* opis stanu */ } status; struct { /* @status60 zmiana stanu -- GG_EVENT_STATUS60 */ uin_t uin; /* numer */ int status; /* nowy stan */ uint32_t remote_ip; /* adres ip */ uint16_t remote_port; /* port */ int version; /* wersja klienta */ int image_size; /* maksymalny rozmiar grafiki w KiB */ char *descr; /* opis stanu */ time_t time; /* czas powrotu */ } status60; struct { /* @notify60 informacja o li¶cie kontaktów -- GG_EVENT_NOTIFY60 */ uin_t uin; /* numer */ int status; /* stan */ uint32_t remote_ip; /* adres ip */ uint16_t remote_port; /* port */ int version; /* wersja klienta */ int image_size; /* maksymalny rozmiar grafiki w KiB */ char *descr; /* opis stanu */ time_t time; /* czas powrotu */ } *notify60; struct { /* @ack potwierdzenie wiadomo¶ci -- GG_EVENT_ACK */ uin_t recipient; /* numer odbiorcy */ int status; /* stan dorêczenia wiadomo¶ci */ int seq; /* numer sekwencyjny wiadomo¶ci */ } ack; struct { /* @dcc_voice_data otrzymano dane d¼wiêkowe -- GG_EVENT_DCC_VOICE_DATA */ uint8_t *data; /* dane d¼wiêkowe */ int length; /* ilo¶æ danych d¼wiêkowych */ } dcc_voice_data; struct { /* @userlist odpowied¼ listy kontaktów serwera */ char type; /* rodzaj odpowiedzi */ char *reply; /* tre¶æ odpowiedzi */ } userlist; struct { /* @image_request pro¶ba o obrazek */ uin_t sender; /* nadawca pro¶by */ uint32_t size; /* rozmiar obrazka */ uint32_t crc32; /* suma kontrolna */ } image_request; struct { /* @image_reply odpowied¼ z obrazkiem */ uin_t sender; /* nadawca odpowiedzi */ uint32_t size; /* rozmiar obrazka */ uint32_t crc32; /* suma kontrolna */ char *filename; /* nazwa pliku */ char *image; /* bufor z obrazkiem */ } image_reply; } event; }; struct gg_event *gg_watch_fd(struct gg_session *sess); void gg_event_free(struct gg_event *e); #define gg_free_event gg_event_free /* * funkcje obs³ugi listy kontaktów. */ int gg_notify_ex(struct gg_session *sess, uin_t *userlist, char *types, int count); int gg_notify(struct gg_session *sess, uin_t *userlist, int count); int gg_add_notify_ex(struct gg_session *sess, uin_t uin, char type); int gg_add_notify(struct gg_session *sess, uin_t uin); int gg_remove_notify_ex(struct gg_session *sess, uin_t uin, char type); int gg_remove_notify(struct gg_session *sess, uin_t uin); /* * funkcje obs³ugi http. */ struct gg_http *gg_http_connect(const char *hostname, int port, int async, const char *method, const char *path, const char *header); int gg_http_watch_fd(struct gg_http *h); void gg_http_stop(struct gg_http *h); void gg_http_free(struct gg_http *h); void gg_http_free_fields(struct gg_http *h); #define gg_free_http gg_http_free /* * struktury opisuj±ca kryteria wyszukiwania dla gg_search(). nieaktualne, * zast±pione przez gg_pubdir50_t. pozostawiono je dla zachowania ABI. */ struct gg_search_request { int active; unsigned int start; char *nickname; char *first_name; char *last_name; char *city; int gender; int min_birth; int max_birth; char *email; char *phone; uin_t uin; }; struct gg_search { int count; struct gg_search_result *results; }; struct gg_search_result { uin_t uin; char *first_name; char *last_name; char *nickname; int born; int gender; char *city; int active; }; #define GG_GENDER_NONE 0 #define GG_GENDER_FEMALE 1 #define GG_GENDER_MALE 2 /* * funkcje wyszukiwania. */ struct gg_http *gg_search(const struct gg_search_request *r, int async); int gg_search_watch_fd(struct gg_http *f); void gg_free_search(struct gg_http *f); #define gg_search_free gg_free_search const struct gg_search_request *gg_search_request_mode_0(char *nickname, char *first_name, char *last_name, char *city, int gender, int min_birth, int max_birth, int active, int start); const struct gg_search_request *gg_search_request_mode_1(char *email, int active, int start); const struct gg_search_request *gg_search_request_mode_2(char *phone, int active, int start); const struct gg_search_request *gg_search_request_mode_3(uin_t uin, int active, int start); void gg_search_request_free(struct gg_search_request *r); /* * funkcje obs³ugi katalogu publicznego zgodne z GG 5.0. tym razem funkcje * zachowuj± pewien poziom abstrakcji, ¿eby unikn±æ zmian ABI przy zmianach * w protokole. * * NIE NALE¯Y SIÊ ODWO£YWAÆ DO PÓL gg_pubdir50_t BEZPO¦REDNIO! */ uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req); gg_pubdir50_t gg_pubdir50_new(int type); int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value); int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq); const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field); int gg_pubdir50_type(gg_pubdir50_t res); int gg_pubdir50_count(gg_pubdir50_t res); uin_t gg_pubdir50_next(gg_pubdir50_t res); uint32_t gg_pubdir50_seq(gg_pubdir50_t res); void gg_pubdir50_free(gg_pubdir50_t res); #define GG_PUBDIR50_UIN "FmNumber" #define GG_PUBDIR50_STATUS "FmStatus" #define GG_PUBDIR50_FIRSTNAME "firstname" #define GG_PUBDIR50_LASTNAME "lastname" #define GG_PUBDIR50_NICKNAME "nickname" #define GG_PUBDIR50_BIRTHYEAR "birthyear" #define GG_PUBDIR50_CITY "city" #define GG_PUBDIR50_GENDER "gender" #define GG_PUBDIR50_GENDER_FEMALE "1" #define GG_PUBDIR50_GENDER_MALE "2" #define GG_PUBDIR50_GENDER_SET_FEMALE "2" #define GG_PUBDIR50_GENDER_SET_MALE "1" #define GG_PUBDIR50_ACTIVE "ActiveOnly" #define GG_PUBDIR50_ACTIVE_TRUE "1" #define GG_PUBDIR50_START "fmstart" #define GG_PUBDIR50_FAMILYNAME "familyname" #define GG_PUBDIR50_FAMILYCITY "familycity" int gg_pubdir50_handle_reply(struct gg_event *e, const char *packet, int length); /* * struct gg_pubdir * * operacje na katalogu publicznym. */ struct gg_pubdir { int success; /* czy siê uda³o */ uin_t uin; /* otrzymany numerek. 0 je¶li b³±d */ }; /* ogólne funkcje, nie powinny byæ u¿ywane */ int gg_pubdir_watch_fd(struct gg_http *f); void gg_pubdir_free(struct gg_http *f); #define gg_free_pubdir gg_pubdir_free struct gg_token { int width; /* szeroko¶æ obrazka */ int height; /* wysoko¶æ obrazka */ int length; /* ilo¶æ znaków w tokenie */ char *tokenid; /* id tokenu */ }; /* funkcje dotycz±ce tokenów */ struct gg_http *gg_token(int async); int gg_token_watch_fd(struct gg_http *h); void gg_token_free(struct gg_http *h); /* rejestracja nowego numerka */ struct gg_http *gg_register(const char *email, const char *password, int async); struct gg_http *gg_register2(const char *email, const char *password, const char *qa, int async); struct gg_http *gg_register3(const char *email, const char *password, const char *tokenid, const char *tokenval, int async); #define gg_register_watch_fd gg_pubdir_watch_fd #define gg_register_free gg_pubdir_free #define gg_free_register gg_pubdir_free struct gg_http *gg_unregister(uin_t uin, const char *password, const char *email, int async); struct gg_http *gg_unregister2(uin_t uin, const char *password, const char *qa, int async); struct gg_http *gg_unregister3(uin_t uin, const char *password, const char *tokenid, const char *tokenval, int async); #define gg_unregister_watch_fd gg_pubdir_watch_fd #define gg_unregister_free gg_pubdir_free /* przypomnienie has³a e-mailem */ struct gg_http *gg_remind_passwd(uin_t uin, int async); struct gg_http *gg_remind_passwd2(uin_t uin, const char *tokenid, const char *tokenval, int async); #define gg_remind_passwd_watch_fd gg_pubdir_watch_fd #define gg_remind_passwd_free gg_pubdir_free #define gg_free_remind_passwd gg_pubdir_free /* zmiana has³a */ struct gg_http *gg_change_passwd(uin_t uin, const char *passwd, const char *newpasswd, const char *newemail, int async); struct gg_http *gg_change_passwd2(uin_t uin, const char *passwd, const char *newpasswd, const char *email, const char *newemail, int async); struct gg_http *gg_change_passwd3(uin_t uin, const char *passwd, const char *newpasswd, const char *qa, int async); struct gg_http *gg_change_passwd4(uin_t uin, const char *email, const char *passwd, const char *newpasswd, const char *tokenid, const char *tokenval, int async); #define gg_change_passwd_free gg_pubdir_free #define gg_free_change_passwd gg_pubdir_free /* * struct gg_change_info_request * * opis ¿±dania zmiany informacji w katalogu publicznym. */ struct gg_change_info_request { char *first_name; /* imiê */ char *last_name; /* nazwisko */ char *nickname; /* pseudonim */ char *email; /* email */ int born; /* rok urodzenia */ int gender; /* p³eæ */ char *city; /* miasto */ }; struct gg_change_info_request *gg_change_info_request_new(const char *first_name, const char *last_name, const char *nickname, const char *email, int born, int gender, const char *city); void gg_change_info_request_free(struct gg_change_info_request *r); struct gg_http *gg_change_info(uin_t uin, const char *passwd, const struct gg_change_info_request *request, int async); #define gg_change_pubdir_watch_fd gg_pubdir_watch_fd #define gg_change_pubdir_free gg_pubdir_free #define gg_free_change_pubdir gg_pubdir_free /* * funkcje dotycz±ce listy kontaktów na serwerze. */ struct gg_http *gg_userlist_get(uin_t uin, const char *password, int async); int gg_userlist_get_watch_fd(struct gg_http *f); void gg_userlist_get_free(struct gg_http *f); struct gg_http *gg_userlist_put(uin_t uin, const char *password, const char *contacts, int async); int gg_userlist_put_watch_fd(struct gg_http *f); void gg_userlist_put_free(struct gg_http *f); struct gg_http *gg_userlist_remove(uin_t uin, const char *password, int async); int gg_userlist_remove_watch_fd(struct gg_http *f); void gg_userlist_remove_free(struct gg_http *f); /* * funkcje dotycz±ce komunikacji miêdzy klientami. */ extern int gg_dcc_port; /* port, na którym nas³uchuje klient */ extern unsigned long gg_dcc_ip; /* adres, na którym nas³uchuje klient */ int gg_dcc_request(struct gg_session *sess, uin_t uin); struct gg_dcc *gg_dcc_send_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin); struct gg_dcc *gg_dcc_get_file(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin); struct gg_dcc *gg_dcc_voice_chat(uint32_t ip, uint16_t port, uin_t my_uin, uin_t peer_uin); void gg_dcc_set_type(struct gg_dcc *d, int type); int gg_dcc_fill_file_info(struct gg_dcc *d, const char *filename); int gg_dcc_voice_send(struct gg_dcc *d, char *buf, int length); #define GG_DCC_VOICE_FRAME_LENGTH 195 #define GG_DCC_VOICE_FRAME_LENGTH_505 326 struct gg_dcc *gg_dcc_socket_create(uin_t uin, uint16_t port); #define gg_dcc_socket_free gg_free_dcc #define gg_dcc_socket_watch_fd gg_dcc_watch_fd struct gg_event *gg_dcc_watch_fd(struct gg_dcc *d); void gg_dcc_free(struct gg_dcc *c); #define gg_free_dcc gg_dcc_free /* * je¶li chcemy sobie podebugowaæ, wystarczy ustawiæ `gg_debug_level'. * niestety w miarê przybywania wpisów `gg_debug(...)' nie chcia³o mi * siê ustawiaæ odpowiednich leveli, wiêc wiêkszo¶æ sz³a do _MISC. */ extern int gg_debug_level; /* poziom debugowania. mapa bitowa sta³ych GG_DEBUG_* */ /* * mo¿na podaæ wska¼nik do funkcji obs³uguj±cej wywo³ania gg_debug(). * nieoficjalne, nieudokumentowane, mo¿e siê zmieniæ. je¶li kto¶ jest * zainteresowany, niech da znaæ na ekg-devel. */ extern void (*gg_debug_handler)(int level, const char *format, va_list ap); /* * mo¿na podaæ plik, do którego bêd± zapisywane teksty z gg_debug(). */ extern FILE *gg_debug_file; #define GG_DEBUG_NET 1 #define GG_DEBUG_TRAFFIC 2 #define GG_DEBUG_DUMP 4 #define GG_DEBUG_FUNCTION 8 #define GG_DEBUG_MISC 16 #ifdef GG_DEBUG_DISABLE #define gg_debug(x, y...) do { } while(0) #else void gg_debug(int level, const char *format, ...); #endif const char *gg_libgadu_version(void); /* * konfiguracja http proxy. */ extern int gg_proxy_enabled; /* w³±cza obs³ugê proxy */ extern char *gg_proxy_host; /* okre¶la adres serwera proxy */ extern int gg_proxy_port; /* okre¶la port serwera proxy */ extern char *gg_proxy_username; /* okre¶la nazwê u¿ytkownika przy autoryzacji serwera proxy */ extern char *gg_proxy_password; /* okre¶la has³o u¿ytkownika przy autoryzacji serwera proxy */ extern int gg_proxy_http_only; /* w³±cza obs³ugê proxy wy³±cznie dla us³ug HTTP */ /* * ------------------------------------------------------------------------- * poni¿ej znajduj± siê wewnêtrzne sprawy biblioteki. zwyk³y klient nie * powinien ich w ogóle ruszaæ, bo i nie ma po co. wszystko mo¿na za³atwiæ * procedurami wy¿szego poziomu, których definicje znajduj± siê na pocz±tku * tego pliku. * ------------------------------------------------------------------------- */ #ifdef __GG_LIBGADU_HAVE_PTHREAD int gg_resolve_pthread(int *fd, void **resolver, const char *hostname); #endif #ifdef _WIN32 int gg_thread_socket(int thread_id, int socket); #endif int gg_resolve(int *fd, int *pid, const char *hostname); #ifdef __GNUC__ char *gg_saprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2))); #else char *gg_saprintf(const char *format, ...); #endif char *gg_vsaprintf(const char *format, va_list ap); #define gg_alloc_sprintf gg_saprintf char *gg_get_line(char **ptr); int gg_connect(void *addr, int port, int async); struct hostent *gg_gethostbyname(const char *hostname); char *gg_read_line(int sock, char *buf, int length); void gg_chomp(char *line); char *gg_urlencode(const char *str); int gg_http_hash(const char *format, ...); int gg_read(struct gg_session *sess, char *buf, int length); int gg_write(struct gg_session *sess, const char *buf, int length); void *gg_recv_packet(struct gg_session *sess); int gg_send_packet(struct gg_session *sess, int type, ...); unsigned int gg_login_hash(const unsigned char *password, unsigned int seed); uint32_t gg_fix32(uint32_t x); uint16_t gg_fix16(uint16_t x); #define fix16 gg_fix16 #define fix32 gg_fix32 char *gg_proxy_auth(void); char *gg_base64_encode(const char *buf); char *gg_base64_decode(const char *buf); int gg_image_queue_remove(struct gg_session *s, struct gg_image_queue *q, int freeq); #define GG_APPMSG_HOST "appmsg.gadu-gadu.pl" #define GG_APPMSG_PORT 80 #define GG_PUBDIR_HOST "pubdir.gadu-gadu.pl" #define GG_PUBDIR_PORT 80 #define GG_REGISTER_HOST "register.gadu-gadu.pl" #define GG_REGISTER_PORT 80 #define GG_REMIND_HOST "retr.gadu-gadu.pl" #define GG_REMIND_PORT 80 #define GG_DEFAULT_PORT 8074 #define GG_HTTPS_PORT 443 #define GG_HTTP_USERAGENT "Mozilla/4.7 [en] (Win98; I)" #define GG_DEFAULT_CLIENT_VERSION "6, 0, 0, 132" #define GG_DEFAULT_PROTOCOL_VERSION 0x20 #define GG_DEFAULT_TIMEOUT 30 #define GG_HAS_AUDIO_MASK 0x40000000 #define GG_LIBGADU_VERSION "20040117" #define GG_DEFAULT_DCC_PORT 1550 struct gg_header { uint32_t type; /* typ pakietu */ uint32_t length; /* d³ugo¶æ reszty pakietu */ } GG_PACKED; #define GG_WELCOME 0x0001 #define GG_NEED_EMAIL 0x0014 struct gg_welcome { uint32_t key; /* klucz szyfrowania has³a */ } GG_PACKED; #define GG_LOGIN 0x000c struct gg_login { uint32_t uin; /* mój numerek */ uint32_t hash; /* hash has³a */ uint32_t status; /* status na dzieñ dobry */ uint32_t version; /* moja wersja klienta */ uint32_t local_ip; /* mój adres ip */ uint16_t local_port; /* port, na którym s³ucham */ } GG_PACKED; #define GG_LOGIN_EXT 0x0013 struct gg_login_ext { uint32_t uin; /* mój numerek */ uint32_t hash; /* hash has³a */ uint32_t status; /* status na dzieñ dobry */ uint32_t version; /* moja wersja klienta */ uint32_t local_ip; /* mój adres ip */ uint16_t local_port; /* port, na którym s³ucham */ uint32_t external_ip; /* zewnêtrzny adres ip */ uint16_t external_port; /* zewnêtrzny port */ } GG_PACKED; #define GG_LOGIN60 0x0015 struct gg_login60 { uint32_t uin; /* mój numerek */ uint32_t hash; /* hash has³a */ uint32_t status; /* status na dzieñ dobry */ uint32_t version; /* moja wersja klienta */ uint8_t dunno1; /* 0x00 */ uint32_t local_ip; /* mój adres ip */ uint16_t local_port; /* port, na którym s³ucham */ uint32_t external_ip; /* zewnêtrzny adres ip */ uint16_t external_port; /* zewnêtrzny port */ uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */ uint8_t dunno2; /* 0xbe */ } GG_PACKED; #define GG_LOGIN_OK 0x0003 #define GG_LOGIN_FAILED 0x0009 #define GG_PUBDIR50_REQUEST 0x0014 #define GG_PUBDIR50_WRITE 0x01 #define GG_PUBDIR50_READ 0x02 #define GG_PUBDIR50_SEARCH 0x03 #define GG_PUBDIR50_SEARCH_REQUEST GG_PUBDIR50_SEARCH #define GG_PUBDIR50_SEARCH_REPLY 0x05 struct gg_pubdir50_request { uint8_t type; /* GG_PUBDIR50_* */ uint32_t seq; /* czas wys³ania zapytania */ } GG_PACKED; #define GG_PUBDIR50_REPLY 0x000e struct gg_pubdir50_reply { uint8_t type; /* GG_PUBDIR50_* */ uint32_t seq; /* czas wys³ania zapytania */ } GG_PACKED; #define GG_NEW_STATUS 0x0002 #define GG_STATUS_NOT_AVAIL 0x0001 /* niedostêpny */ #define GG_STATUS_NOT_AVAIL_DESCR 0x0015 /* niedostêpny z opisem (4.8) */ #define GG_STATUS_AVAIL 0x0002 /* dostêpny */ #define GG_STATUS_AVAIL_DESCR 0x0004 /* dostêpny z opisem (4.9) */ #define GG_STATUS_BUSY 0x0003 /* zajêty */ #define GG_STATUS_BUSY_DESCR 0x0005 /* zajêty z opisem (4.8) */ #define GG_STATUS_INVISIBLE 0x0014 /* niewidoczny (4.6) */ #define GG_STATUS_INVISIBLE_DESCR 0x0016 /* niewidoczny z opisem (4.9) */ #define GG_STATUS_BLOCKED 0x0006 /* zablokowany */ #define GG_STATUS_FRIENDS_MASK 0x8000 /* tylko dla znajomych (4.6) */ #define GG_STATUS_DESCR_MAXSIZE 70 /* * makra do ³atwego i szybkiego sprawdzania stanu. */ /* GG_S_F() tryb tylko dla znajomych */ #define GG_S_F(x) (((x) & GG_STATUS_FRIENDS_MASK) != 0) /* GG_S() stan bez uwzglêdnienia trybu tylko dla znajomych */ #define GG_S(x) ((x) & ~GG_STATUS_FRIENDS_MASK) /* GG_S_A() dostêpny */ #define GG_S_A(x) (GG_S(x) == GG_STATUS_AVAIL || GG_S(x) == GG_STATUS_AVAIL_DESCR) /* GG_S_NA() niedostêpny */ #define GG_S_NA(x) (GG_S(x) == GG_STATUS_NOT_AVAIL || GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR) /* GG_S_B() zajêty */ #define GG_S_B(x) (GG_S(x) == GG_STATUS_BUSY || GG_S(x) == GG_STATUS_BUSY_DESCR) /* GG_S_I() niewidoczny */ #define GG_S_I(x) (GG_S(x) == GG_STATUS_INVISIBLE || GG_S(x) == GG_STATUS_INVISIBLE_DESCR) /* GG_S_D() stan opisowy */ #define GG_S_D(x) (GG_S(x) == GG_STATUS_NOT_AVAIL_DESCR || GG_S(x) == GG_STATUS_AVAIL_DESCR || GG_S(x) == GG_STATUS_BUSY_DESCR || GG_S(x) == GG_STATUS_INVISIBLE_DESCR) /* GG_S_BL() blokowany lub blokuj±cy */ #define GG_S_BL(x) (GG_S(x) == GG_STATUS_BLOCKED) struct gg_new_status { uint32_t status; /* na jaki zmieniæ? */ } GG_PACKED; #define GG_NOTIFY 0x0010 struct gg_notify { uint32_t uin; /* numerek danej osoby */ uint8_t dunno1; /* rodzaj wpisu w li¶cie */ } GG_PACKED; #define GG_USER_OFFLINE 0x01 /* bêdziemy niewidoczni dla u¿ytkownika */ #define GG_USER_NORMAL 0x03 /* zwyk³y u¿ytkownik */ #define GG_USER_BLOCKED 0x04 /* zablokowany u¿ytkownik */ #define GG_LIST_EMPTY 0x0012 #define GG_NOTIFY_REPLY 0x000c /* tak, to samo co GG_LOGIN */ struct gg_notify_reply { uint32_t uin; /* numerek */ uint32_t status; /* status danej osoby */ uint32_t remote_ip; /* adres ip delikwenta */ uint16_t remote_port; /* port, na którym s³ucha klient */ uint32_t version; /* wersja klienta */ uint16_t dunno2; /* znowu port? */ } GG_PACKED; #define GG_NOTIFY_REPLY60 0x0011 struct gg_notify_reply60 { uint32_t uin; /* numerek plus flagi w MSB */ uint8_t status; /* status danej osoby */ uint32_t remote_ip; /* adres ip delikwenta */ uint16_t remote_port; /* port, na którym s³ucha klient */ uint8_t version; /* wersja klienta */ uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */ uint8_t dunno1; /* 0x00 */ } GG_PACKED; #define GG_STATUS60 0x000f struct gg_status60 { uint32_t uin; /* numerek plus flagi w MSB */ uint8_t status; /* status danej osoby */ uint32_t remote_ip; /* adres ip delikwenta */ uint16_t remote_port; /* port, na którym s³ucha klient */ uint8_t version; /* wersja klienta */ uint8_t image_size; /* maksymalny rozmiar grafiki w KiB */ uint8_t dunno1; /* 0x00 */ } GG_PACKED; #define GG_ADD_NOTIFY 0x000d #define GG_REMOVE_NOTIFY 0x000e struct gg_add_remove { uint32_t uin; /* numerek */ uint8_t dunno1; /* bitmapa */ } GG_PACKED; #define GG_STATUS 0x0002 struct gg_status { uint32_t uin; /* numerek */ uint32_t status; /* nowy stan */ } GG_PACKED; #define GG_SEND_MSG 0x000b #define GG_CLASS_QUEUED 0x0001 #define GG_CLASS_OFFLINE GG_CLASS_QUEUED #define GG_CLASS_MSG 0x0004 #define GG_CLASS_CHAT 0x0008 #define GG_CLASS_CTCP 0x0010 #define GG_CLASS_ACK 0x0020 #define GG_CLASS_EXT GG_CLASS_ACK /* kompatybilno¶æ wstecz */ #define GG_MSG_MAXSIZE 2000 struct gg_send_msg { uint32_t recipient; uint32_t seq; uint32_t msgclass; } GG_PACKED; struct gg_msg_richtext { uint8_t flag; uint16_t length; } GG_PACKED; struct gg_msg_richtext_format { uint16_t position; uint8_t font; } GG_PACKED; struct gg_msg_richtext_image { uint16_t unknown1; uint32_t size; uint32_t crc32; } GG_PACKED; #define GG_FONT_BOLD 0x01 #define GG_FONT_ITALIC 0x02 #define GG_FONT_UNDERLINE 0x04 #define GG_FONT_COLOR 0x08 #define GG_FONT_IMAGE 0x80 struct gg_msg_richtext_color { uint8_t red; uint8_t green; uint8_t blue; } GG_PACKED; struct gg_msg_recipients { uint8_t flag; uint32_t count; } GG_PACKED; struct gg_msg_image_request { uint8_t flag; uint32_t size; uint32_t crc32; } GG_PACKED; struct gg_msg_image_reply { uint8_t flag; uint32_t size; uint32_t crc32; /* char filename[]; */ /* char image[]; */ } GG_PACKED; #define GG_SEND_MSG_ACK 0x0005 #define GG_ACK_DELIVERED 0x0002 #define GG_ACK_QUEUED 0x0003 #define GG_ACK_NOT_DELIVERED 0x0006 struct gg_send_msg_ack { uint32_t status; uint32_t recipient; uint32_t seq; } GG_PACKED; #define GG_RECV_MSG 0x000a struct gg_recv_msg { uint32_t sender; uint32_t seq; uint32_t time; uint32_t msgclass; } GG_PACKED; #define GG_PING 0x0008 #define GG_PONG 0x0007 #define GG_DISCONNECTING 0x000b #define GG_USERLIST_REQUEST 0x0016 #define GG_USERLIST_PUT 0x00 #define GG_USERLIST_PUT_MORE 0x01 #define GG_USERLIST_GET 0x02 struct gg_userlist_request { uint8_t type; } GG_PACKED; #define GG_USERLIST_REPLY 0x0010 #define GG_USERLIST_PUT_REPLY 0x00 #define GG_USERLIST_PUT_MORE_REPLY 0x02 #define GG_USERLIST_GET_REPLY 0x06 #define GG_USERLIST_GET_MORE_REPLY 0x04 struct gg_userlist_reply { uint8_t type; } GG_PACKED; /* * pakiety, sta³e, struktury dla DCC */ struct gg_dcc_tiny_packet { uint8_t type; /* rodzaj pakietu */ } GG_PACKED; struct gg_dcc_small_packet { uint32_t type; /* rodzaj pakietu */ } GG_PACKED; struct gg_dcc_big_packet { uint32_t type; /* rodzaj pakietu */ uint32_t dunno1; /* niewiadoma */ uint32_t dunno2; /* niewiadoma */ } GG_PACKED; /* * póki co, nie znamy dok³adnie protoko³u. nie wiemy, co czemu odpowiada. * nazwy s± niepowa¿ne i tymczasowe. */ #define GG_DCC_WANT_FILE 0x0003 /* peer chce plik */ #define GG_DCC_HAVE_FILE 0x0001 /* wiêc mu damy */ #define GG_DCC_HAVE_FILEINFO 0x0003 /* niech ma informacje o pliku */ #define GG_DCC_GIMME_FILE 0x0006 /* peer jest pewny */ #define GG_DCC_CATCH_FILE 0x0002 /* wysy³amy plik */ #define GG_DCC_FILEATTR_READONLY 0x0020 #define GG_DCC_TIMEOUT_SEND 1800 /* 30 minut */ #define GG_DCC_TIMEOUT_GET 1800 /* 30 minut */ #define GG_DCC_TIMEOUT_FILE_ACK 300 /* 5 minut */ #define GG_DCC_TIMEOUT_VOICE_ACK 300 /* 5 minut */ #ifdef __cplusplus } #ifdef _WIN32 #pragma pack(pop) #endif #endif #endif /* __GG_LIBGADU_H */ /* * Local variables: * c-indentation-style: k&r * c-basic-offset: 8 * indent-tabs-mode: notnil * End: * * vim: shiftwidth=8: */ centerim-4.22.10/libyahoo2/0000755000175000001440000000000011473011456012355 500000000000000centerim-4.22.10/libyahoo2/sha1.h0000644000175000001440000000415011473007750013304 00000000000000/*- * Copyright (c) 2001-2003 Allan Saddi * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY ALLAN SADDI AND HIS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL ALLAN SADDI OR HIS CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef _SHA1_H #define _SHA1_H #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #define SHA1_HASH_SIZE 20 /* Hash size in 32-bit words */ #define SHA1_HASH_WORDS 5 struct _SHA1Context { uint64_t totalLength; uint32_t hash[SHA1_HASH_WORDS]; uint32_t bufferLength; union { uint32_t words[16]; uint8_t bytes[64]; } buffer; #ifdef RUNTIME_ENDIAN int littleEndian; #endif /* RUNTIME_ENDIAN */ }; typedef struct _SHA1Context SHA1Context; #ifdef __cplusplus extern "C" { #endif void SHA1Init(SHA1Context *sc); void SHA1Update(SHA1Context *sc, const void *data, uint32_t len); void SHA1Final(SHA1Context *sc, uint8_t hash[SHA1_HASH_SIZE]); #ifdef __cplusplus } #endif #endif /* _SHA1_H */ centerim-4.22.10/libyahoo2/yahoo2_types.h0000644000175000001440000002454511473007750015107 00000000000000/* * libyahoo2: yahoo2_types.h * * Copyright (C) 2002-2004, Philip S Tellis * * 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 YAHOO2_TYPES_H #define YAHOO2_TYPES_H #include "yahoo_list.h" #ifdef __cplusplus extern "C" { #endif enum yahoo_service { /* these are easier to see in hex */ YAHOO_SERVICE_LOGON = 1, YAHOO_SERVICE_LOGOFF, YAHOO_SERVICE_ISAWAY, YAHOO_SERVICE_ISBACK, YAHOO_SERVICE_IDLE, /* 5 (placemarker) */ YAHOO_SERVICE_MESSAGE, YAHOO_SERVICE_IDACT, YAHOO_SERVICE_IDDEACT, YAHOO_SERVICE_MAILSTAT, YAHOO_SERVICE_USERSTAT, /* 0xa */ YAHOO_SERVICE_NEWMAIL, YAHOO_SERVICE_CHATINVITE, YAHOO_SERVICE_CALENDAR, YAHOO_SERVICE_NEWPERSONALMAIL, YAHOO_SERVICE_NEWCONTACT, YAHOO_SERVICE_ADDIDENT, /* 0x10 */ YAHOO_SERVICE_ADDIGNORE, YAHOO_SERVICE_PING, YAHOO_SERVICE_GOTGROUPRENAME, /* < 1, 36(old), 37(new) */ YAHOO_SERVICE_SYSMESSAGE = 0x14, YAHOO_SERVICE_SKINNAME = 0x15, YAHOO_SERVICE_PASSTHROUGH2 = 0x16, YAHOO_SERVICE_CONFINVITE = 0x18, YAHOO_SERVICE_CONFLOGON, YAHOO_SERVICE_CONFDECLINE, YAHOO_SERVICE_CONFLOGOFF, YAHOO_SERVICE_CONFADDINVITE, YAHOO_SERVICE_CONFMSG, YAHOO_SERVICE_CHATLOGON, YAHOO_SERVICE_CHATLOGOFF, YAHOO_SERVICE_CHATMSG = 0x20, YAHOO_SERVICE_GAMELOGON = 0x28, YAHOO_SERVICE_GAMELOGOFF, YAHOO_SERVICE_GAMEMSG = 0x2a, YAHOO_SERVICE_FILETRANSFER = 0x46, YAHOO_SERVICE_VOICECHAT = 0x4A, YAHOO_SERVICE_NOTIFY, YAHOO_SERVICE_VERIFY, YAHOO_SERVICE_P2PFILEXFER, YAHOO_SERVICE_PEERTOPEER = 0x4F, /* Checks if P2P possible */ YAHOO_SERVICE_WEBCAM, YAHOO_SERVICE_AUTHRESP = 0x54, YAHOO_SERVICE_LIST, YAHOO_SERVICE_AUTH = 0x57, YAHOO_SERVICE_AUTHBUDDY = 0x6d, YAHOO_SERVICE_ADDBUDDY = 0x83, YAHOO_SERVICE_REMBUDDY, YAHOO_SERVICE_IGNORECONTACT, /* > 1, 7, 13 < 1, 66, 13, 0 */ YAHOO_SERVICE_REJECTCONTACT, YAHOO_SERVICE_GROUPRENAME = 0x89, /* > 1, 65(new), 66(0), 67(old) */ YAHOO_SERVICE_Y7_PING = 0x8A, YAHOO_SERVICE_CHATONLINE = 0x96, /* > 109(id), 1, 6(abcde) < 0,1 */ YAHOO_SERVICE_CHATGOTO, YAHOO_SERVICE_CHATJOIN, /* > 1 104-room 129-1600326591 62-2 */ YAHOO_SERVICE_CHATLEAVE, YAHOO_SERVICE_CHATEXIT = 0x9b, YAHOO_SERVICE_CHATADDINVITE = 0x9d, YAHOO_SERVICE_CHATLOGOUT = 0xa0, YAHOO_SERVICE_CHATPING, YAHOO_SERVICE_COMMENT = 0xa8, YAHOO_SERVICE_GAME_INVITE = 0xb7, YAHOO_SERVICE_STEALTH_PERM = 0xb9, YAHOO_SERVICE_STEALTH_SESSION = 0xba, YAHOO_SERVICE_AVATAR = 0xbc, YAHOO_SERVICE_PICTURE_CHECKSUM = 0xbd, YAHOO_SERVICE_PICTURE = 0xbe, YAHOO_SERVICE_PICTURE_UPDATE = 0xc1, YAHOO_SERVICE_PICTURE_UPLOAD = 0xc2, YAHOO_SERVICE_YAB_UPDATE = 0xc4, YAHOO_SERVICE_Y6_VISIBLE_TOGGLE = 0xc5, /* YMSG13, key 13: 2 = invisible, 1 = visible */ YAHOO_SERVICE_Y6_STATUS_UPDATE = 0xc6, /* YMSG13 */ YAHOO_SERVICE_PICTURE_STATUS = 0xc7, /* YMSG13, key 213: 0 = none, 1 = avatar, 2 = picture */ YAHOO_SERVICE_VERIFY_ID_EXISTS = 0xc8, YAHOO_SERVICE_AUDIBLE = 0xd0, YAHOO_SERVICE_Y7_PHOTO_SHARING = 0xd2, YAHOO_SERVICE_Y7_CONTACT_DETAILS = 0xd3, /* YMSG13 */ YAHOO_SERVICE_Y7_CHAT_SESSION = 0xd4, YAHOO_SERVICE_Y7_AUTHORIZATION = 0xd6, /* YMSG13 */ YAHOO_SERVICE_Y7_FILETRANSFER = 0xdc, /* YMSG13 */ YAHOO_SERVICE_Y7_FILETRANSFERINFO, /* YMSG13 */ YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, /* YMSG13 */ YAHOO_SERVICE_Y7_MINGLE = 0xe1, /* YMSG13 */ YAHOO_SERVICE_Y7_CHANGE_GROUP = 0xe7, /* YMSG13 */ YAHOO_SERVICE_MYSTERY = 0xef, /* Don't know what this is for */ YAHOO_SERVICE_Y8_STATUS = 0xf0, /* YMSG15 */ YAHOO_SERVICE_Y8_LIST = 0Xf1, /* YMSG15 */ YAHOO_SERVICE_MESSAGE_CONFIRM = 0xfb, YAHOO_SERVICE_WEBLOGIN = 0x0226, YAHOO_SERVICE_SMS_MSG = 0x02ea }; enum yahoo_status { YAHOO_STATUS_AVAILABLE = 0, YAHOO_STATUS_BRB, YAHOO_STATUS_BUSY, YAHOO_STATUS_NOTATHOME, YAHOO_STATUS_NOTATDESK, YAHOO_STATUS_NOTINOFFICE, YAHOO_STATUS_ONPHONE, YAHOO_STATUS_ONVACATION, YAHOO_STATUS_OUTTOLUNCH, YAHOO_STATUS_STEPPEDOUT, YAHOO_STATUS_INVISIBLE = 12, YAHOO_STATUS_CUSTOM = 99, YAHOO_STATUS_IDLE = 999, YAHOO_STATUS_OFFLINE = 0x5a55aa56 /* don't ask */ }; enum ypacket_status { YPACKET_STATUS_DISCONNECTED = -1, YPACKET_STATUS_DEFAULT = 0, YPACKET_STATUS_SERVERACK = 1, YPACKET_STATUS_GAME = 0x2, YPACKET_STATUS_AWAY = 0x4, YPACKET_STATUS_CONTINUED = 0x5, YPACKET_STATUS_INVISIBLE = 12, YPACKET_STATUS_NOTIFY = 0x16, /* TYPING */ YPACKET_STATUS_WEBLOGIN = 0x5a55aa55, YPACKET_STATUS_OFFLINE = 0x5a55aa56 }; #define YAHOO_STATUS_GAME 0x2 /* Games don't fit into the regular status model */ enum yahoo_login_status { YAHOO_LOGIN_OK = 0, YAHOO_LOGIN_LOGOFF = 1, YAHOO_LOGIN_UNAME = 3, YAHOO_LOGIN_PASSWD = 13, YAHOO_LOGIN_LOCK = 14, YAHOO_LOGIN_DUPL = 99, YAHOO_LOGIN_SOCK = -1, YAHOO_LOGIN_UNKNOWN = 999 }; enum yahoo_error { E_UNKNOWN = -1, E_CONNECTION = -2, E_SYSTEM = -3, E_CUSTOM = 0, /* responses from ignore buddy */ E_IGNOREDUP = 2, E_IGNORENONE = 3, E_IGNORECONF = 12, /* conference */ E_CONFNOTAVAIL = 20 }; enum yahoo_log_level { YAHOO_LOG_NONE = 0, YAHOO_LOG_FATAL, YAHOO_LOG_ERR, YAHOO_LOG_WARNING, YAHOO_LOG_NOTICE, YAHOO_LOG_INFO, YAHOO_LOG_DEBUG }; enum yahoo_file_transfer { YAHOO_FILE_TRANSFER_INIT = 1, YAHOO_FILE_TRANSFER_ACCEPT = 3, YAHOO_FILE_TRANSFER_REJECT = 4, YAHOO_FILE_TRANSFER_DONE = 5, YAHOO_FILE_TRANSFER_RELAY, YAHOO_FILE_TRANSFER_FAILED, YAHOO_FILE_TRANSFER_UNKNOWN }; #define YAHOO_PROTO_VER 0x0010 /* Yahoo style/color directives */ #define YAHOO_COLOR_BLACK "\033[30m" #define YAHOO_COLOR_BLUE "\033[31m" #define YAHOO_COLOR_LIGHTBLUE "\033[32m" #define YAHOO_COLOR_GRAY "\033[33m" #define YAHOO_COLOR_GREEN "\033[34m" #define YAHOO_COLOR_PINK "\033[35m" #define YAHOO_COLOR_PURPLE "\033[36m" #define YAHOO_COLOR_ORANGE "\033[37m" #define YAHOO_COLOR_RED "\033[38m" #define YAHOO_COLOR_OLIVE "\033[39m" #define YAHOO_COLOR_ANY "\033[#" #define YAHOO_STYLE_ITALICON "\033[2m" #define YAHOO_STYLE_ITALICOFF "\033[x2m" #define YAHOO_STYLE_BOLDON "\033[1m" #define YAHOO_STYLE_BOLDOFF "\033[x1m" #define YAHOO_STYLE_UNDERLINEON "\033[4m" #define YAHOO_STYLE_UNDERLINEOFF "\033[x4m" #define YAHOO_STYLE_URLON "\033[lm" #define YAHOO_STYLE_URLOFF "\033[xlm" enum yahoo_connection_type { YAHOO_CONNECTION_PAGER = 0, YAHOO_CONNECTION_FT, YAHOO_CONNECTION_YAB, YAHOO_CONNECTION_WEBCAM_MASTER, YAHOO_CONNECTION_WEBCAM, YAHOO_CONNECTION_CHATCAT, YAHOO_CONNECTION_SEARCH, YAHOO_CONNECTION_AUTH }; enum yahoo_webcam_direction_type { YAHOO_WEBCAM_DOWNLOAD = 0, YAHOO_WEBCAM_UPLOAD }; enum yahoo_stealth_visibility_type { YAHOO_STEALTH_DEFAULT = 0, YAHOO_STEALTH_ONLINE, YAHOO_STEALTH_PERM_OFFLINE }; /* chat member attribs */ #define YAHOO_CHAT_MALE 0x8000 #define YAHOO_CHAT_FEMALE 0x10000 #define YAHOO_CHAT_FEMALE 0x10000 #define YAHOO_CHAT_DUNNO 0x400 #define YAHOO_CHAT_WEBCAM 0x10 enum yahoo_webcam_conn_type { Y_WCM_DIALUP, Y_WCM_DSL, Y_WCM_T1 }; struct yahoo_webcam { int direction; /* Uploading or downloading */ int conn_type; /* 0=Dialup, 1=DSL/Cable, 2=T1/Lan */ char *user; /* user we are viewing */ char *server; /* webcam server to connect to */ int port; /* webcam port to connect on */ char *key; /* key to connect to the server with */ char *description; /* webcam description */ char *my_ip; /* own ip number */ }; struct yahoo_webcam_data { unsigned int data_size; unsigned int to_read; unsigned int timestamp; unsigned char packet_type; }; struct yahoo_data { char *user; char *password; char *cookie_y; char *cookie_t; char *cookie_c; char *cookie_b; char *login_cookie; char *crumb; char *seed; YList *buddies; YList *ignore; YList *identities; char *login_id; int current_status; int initial_status; int logged_in; int session_id; int client_id; char *rawbuddylist; char *ignorelist; void *server_settings; struct yahoo_process_status_entry *half_user; }; struct yab { int yid; char *id; char *fname; char *lname; char *nname; char *email; char *hphone; char *wphone; char *mphone; int dbid; }; struct yahoo_buddy { char *group; char *id; char *real_name; struct yab *yab_entry; }; enum yahoo_search_type { YAHOO_SEARCH_KEYWORD = 0, YAHOO_SEARCH_YID, YAHOO_SEARCH_NAME }; enum yahoo_search_gender { YAHOO_GENDER_NONE = 0, YAHOO_GENDER_MALE, YAHOO_GENDER_FEMALE }; enum yahoo_search_agerange { YAHOO_AGERANGE_NONE = 0 }; struct yahoo_found_contact { char *id; char *gender; char *location; int age; int online; }; /* * Function pointer to be passed to http get/post and send file */ typedef void (*yahoo_get_fd_callback) (int id, void *fd, int error, void *data); /* * Function pointer to be passed to yahoo_get_url_handle */ typedef void (*yahoo_get_url_handle_callback) (int id, void *fd, int error, const char *filename, unsigned long size, void *data); struct yahoo_chat_member { char *id; int age; int attribs; char *alias; char *location; }; struct yahoo_process_status_entry { char *name; /* 7 name */ int state; /* 10 state */ int flags; /* 13 flags, bit 0 = pager, bit 1 = chat, bit 2 = game */ int mobile; /* 60 mobile */ char *msg; /* 19 custom status message */ int away; /* 47 away (or invisible) */ int buddy_session; /* 11 state */ int f17; /* 17 in chat? then what about flags? */ int idle; /* 137 seconds idle */ int f138; /* 138 state */ char *f184; /* 184 state */ int f192; /* 192 state */ int f10001; /* 10001 state */ int f10002; /* 10002 state */ int f198; /* 198 state */ char *f197; /* 197 state */ char *f205; /* 205 state */ int f213; /* 213 state */ }; #ifdef __cplusplus } #endif #endif centerim-4.22.10/libyahoo2/yahoo2_callbacks.h0000644000175000001440000006156511473007750015665 00000000000000/* * libyahoo2: yahoo2_callbacks.h * * Copyright (C) 2002-2004, Philip S Tellis * * 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 functions in this file *must* be defined in your client program * If you want to use a callback structure instead of direct functions, * then you must define USE_STRUCT_CALLBACKS in all files that #include * this one. * * Register the callback structure by calling yahoo_register_callbacks - * declared in this file and defined in libyahoo2.c */ #ifndef YAHOO2_CALLBACKS_H #define YAHOO2_CALLBACKS_H #ifdef __cplusplus extern "C" { #endif #include "yahoo2_types.h" /* * yahoo2_callbacks.h * * Callback interface for libyahoo2 */ typedef enum { YAHOO_INPUT_READ = 1 << 0, YAHOO_INPUT_WRITE = 1 << 1, YAHOO_INPUT_EXCEPTION = 1 << 2 } yahoo_input_condition; /* * A callback function called when an asynchronous connect completes. * * Params: * fd - The file descriptor object that has been connected, or NULL on * error * error - The value of errno set by the call to connect or 0 if no error * Set both fd and error to 0 if the connect was cancelled by the * user * callback_data - the callback_data passed to the ext_yahoo_connect_async * function */ typedef void (*yahoo_connect_callback) (void *fd, int error, void *callback_data); /* * The following functions need to be implemented in the client * interface. They will be called by the library when each * event occurs. */ /* * should we use a callback structure or directly call functions * if you want the structure, you *must* define USE_STRUCT_CALLBACKS * both when you compile the library, and when you compile your code * that uses the library */ #define YAHOO_CALLBACK_TYPE(x) (*x) struct yahoo_callbacks { /* * Name: ext_yahoo_login_response * Called when the login process is complete * Params: * id - the id that identifies the server connection * succ - enum yahoo_login_status * url - url to reactivate account if locked */ void YAHOO_CALLBACK_TYPE(ext_yahoo_login_response) (int id, int succ, const char *url); /* * Name: ext_yahoo_got_buddies * Called when the contact list is got from the server * Params: * id - the id that identifies the server connection * buds - the buddy list */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddies) (int id, YList *buds); /* * Name: ext_yahoo_got_ignore * Called when the ignore list is got from the server * Params: * id - the id that identifies the server connection * igns - the ignore list */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ignore) (int id, YList *igns); /* * Name: ext_yahoo_got_identities * Called when the contact list is got from the server * Params: * id - the id that identifies the server connection * ids - the identity list */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_identities) (int id, YList *ids); /* * Name: ext_yahoo_got_cookies * Called when the cookie list is got from the server * Params: * id - the id that identifies the server connection */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_cookies) (int id); /* * Name: ext_yahoo_got_ping * Called when the ping packet is received from the server * Params: * id - the id that identifies the server connection * errormsg - optional error message */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ping) (int id, const char *errormsg); /* * Name: ext_yahoo_status_changed * Called when remote user's status changes. * Params: * id - the id that identifies the server connection * who - the handle of the remote user * stat - status code (enum yahoo_status) * msg - the message if stat == YAHOO_STATUS_CUSTOM * away - whether the contact is away or not (YAHOO_STATUS_CUSTOM) * idle - this is the number of seconds he is idle [if he is idle] * mobile - this is set for mobile users/buddies * TODO: add support for pager, chat, and game states */ void YAHOO_CALLBACK_TYPE(ext_yahoo_status_changed) (int id, const char *who, int stat, const char *msg, int away, int idle, int mobile); /* * Name: ext_yahoo_got_buzz * Called when remote user sends you a buzz. * Params: * id - the id that identifies the server connection * me - the identity the message was sent to * who - the handle of the remote user * tm - timestamp of message if offline */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buzz) (int id, const char *me, const char *who, long tm); /* * Name: ext_yahoo_got_im * Called when remote user sends you a message. * Params: * id - the id that identifies the server connection * me - the identity the message was sent to * who - the handle of the remote user * msg - the message - NULL if stat == 2 * tm - timestamp of message if offline * stat - message status - 0 * 1 * 2 == error sending message * 5 * utf8 - whether the message is encoded as utf8 or not */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_im) (int id, const char *me, const char *who, const char *msg, long tm, int stat, int utf8); /* * Name: ext_yahoo_got_conf_invite * Called when remote user sends you a conference invitation. * Params: * id - the id that identifies the server connection * me - the identity the invitation was sent to * who - the user inviting you * room - the room to join * msg - the message * members - the initial members of the conference (null terminated list) */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_conf_invite) (int id, const char *me, const char *who, const char *room, const char *msg, YList *members); /* * Name: ext_yahoo_conf_userdecline * Called when someone declines to join the conference. * Params: * id - the id that identifies the server connection * me - the identity in the conference * who - the user who has declined * room - the room * msg - the declining message */ void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_userdecline) (int id, const char *me, const char *who, const char *room, const char *msg); /* * Name: ext_yahoo_conf_userjoin * Called when someone joins the conference. * Params: * id - the id that identifies the server connection * me - the identity in the conference * who - the user who has joined * room - the room joined */ void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_userjoin) (int id, const char *me, const char *who, const char *room); /* * Name: ext_yahoo_conf_userleave * Called when someone leaves the conference. * Params: * id - the id that identifies the server connection * me - the identity in the conference * who - the user who has left * room - the room left */ void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_userleave) (int id, const char *me, const char *who, const char *room); /* * Name: ext_yahoo_chat_cat_xml * Called when ? * Params: * id - the id that identifies the server connection * xml - ? */ void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_cat_xml) (int id, const char *xml); /* * Name: ext_yahoo_chat_join * Called when joining the chatroom. * Params: * id - the id that identifies the server connection * me - the identity in the chatroom * room - the room joined, used in all other chat calls, freed by * library after call * topic - the topic of the room, freed by library after call * members - the initial members of the chatroom (null terminated YList * of yahoo_chat_member's) Must be freed by the client * fd - the object where the connection is coming from (for tracking) */ void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_join) (int id, const char *me, const char *room, const char *topic, YList *members, void *fd); /* * Name: ext_yahoo_chat_userjoin * Called when someone joins the chatroom. * Params: * id - the id that identifies the server connection * me - the identity in the chatroom * room - the room joined * who - the user who has joined, Must be freed by the client */ void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_userjoin) (int id, const char *me, const char *room, struct yahoo_chat_member *who); /* * Name: ext_yahoo_chat_userleave * Called when someone leaves the chatroom. * Params: * id - the id that identifies the server connection * me - the identity in the chatroom * room - the room left * who - the user who has left (Just the User ID) */ void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_userleave) (int id, const char *me, const char *room, const char *who); /* * Name: ext_yahoo_chat_message * Called when someone messages in the chatroom. * Params: * id - the id that identifies the server connection * me - the identity in the chatroom * room - the room * who - the user who messaged (Just the user id) * msg - the message * msgtype - 1 = Normal message * 2 = /me type message * utf8 - whether the message is utf8 encoded or not */ void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_message) (int id, const char *me, const char *who, const char *room, const char *msg, int msgtype, int utf8); /* * * Name: ext_yahoo_chat_yahoologout * called when yahoo disconnects your chat session * Note this is called whenver a disconnect happens, client or server * requested. Care should be taken to make sure you know the origin * of the disconnect request before doing anything here (auto-join's etc) * Params: * id - the id that identifies this connection * me - the identity in the chatroom * Returns: * nothing. */ void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_yahoologout) (int id, const char *me); /* * * Name: ext_yahoo_chat_yahooerror * called when yahoo sends back an error to you * Note this is called whenver chat message is sent into a room * in error (fd not connected, room doesn't exists etc) * Care should be taken to make sure you know the origin * of the error before doing anything about it. * Params: * id - the id that identifies this connection * me - the identity in the chatroom * Returns: * nothing. */ void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_yahooerror) (int id, const char *me); /* * Name: ext_yahoo_conf_message * Called when someone messages in the conference. * Params: * id - the id that identifies the server connection * me - the identity the conf message was sent to * who - the user who messaged * room - the room * msg - the message * utf8 - whether the message is utf8 encoded or not */ void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_message) (int id, const char *me, const char *who, const char *room, const char *msg, int utf8); /* * Name: ext_yahoo_got_file * Called when someone sends you a file * Params: * id - the id that identifies the server connection * me - the identity the file was sent to * who - the user who sent the file * msg - the message * fname- the file name if direct transfer * fsize- the file size if direct transfer * trid - transfer id. Unique for this transfer * * NOTE: Subsequent callbacks for file transfer do not send all of this * information again since it is wasteful. Implementations are expected to * save this information and supply it as callback data when the file or * confirmation is sent */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_file) (int id, const char *me, const char *who, const char *msg, const char *fname, unsigned long fesize, char *trid); /* * Name: ext_yahoo_got_ft_data * Called multiple times when parts of the file are received * Params: * id - the id that identifies the server connection * in - The data * len - Length of the data * data - callback data */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ft_data) (int id, const unsigned char *in, int len, void *data); /* * Name: ext_yahoo_file_transfer_done * File transfer is done * Params: * id - the id that identifies the server connection * result - To notify if it finished successfully or with a failure * data - callback data */ void YAHOO_CALLBACK_TYPE(ext_yahoo_file_transfer_done) (int id, int result, void *data); /* * Name: ext_yahoo_contact_added * Called when a contact is added to your list * Params: * id - the id that identifies the server connection * myid - the identity he was added to * who - who was added * msg - any message sent */ void YAHOO_CALLBACK_TYPE(ext_yahoo_contact_added) (int id, const char *myid, const char *who, const char *msg); /* * Name: ext_yahoo_auth_request * Called when a contact tries to add us to their list * Params: * id - the id that identifies the server connection * who - who tried to add us * msg - any message sent */ void YAHOO_CALLBACK_TYPE(ext_yahoo_auth_request) (int id, const char *who, const char *msg); /* * Name: ext_yahoo_rejected * Called when a contact rejects your add * Params: * id - the id that identifies the server connection * who - who rejected you * msg - any message sent */ void YAHOO_CALLBACK_TYPE(ext_yahoo_rejected) (int id, const char *who, const char *msg); /* * Name: ext_yahoo_typing_notify * Called when remote user starts or stops typing. * Params: * id - the id that identifies the server connection * me - the handle of the identity the notification is sent to * who - the handle of the remote user * stat - 1 if typing, 0 if stopped typing */ void YAHOO_CALLBACK_TYPE(ext_yahoo_typing_notify) (int id, const char *me, const char *who, int stat); /* * Name: ext_yahoo_game_notify * Called when remote user starts or stops a game. * Params: * id - the id that identifies the server connection * me - the handle of the identity the notification is sent to * who - the handle of the remote user * stat - 1 if game, 0 if stopped gaming * msg - game description and/or other text */ void YAHOO_CALLBACK_TYPE(ext_yahoo_game_notify) (int id, const char *me, const char *who, int stat, const char *msg); /* * Name: ext_yahoo_mail_notify * Called when you receive mail, or with number of messages * Params: * id - the id that identifies the server connection * from - who the mail is from - NULL if only mail count * subj - the subject of the mail - NULL if only mail count * cnt - mail count - 0 if new mail notification */ void YAHOO_CALLBACK_TYPE(ext_yahoo_mail_notify) (int id, const char *from, const char *subj, int cnt); /* * Name: ext_yahoo_system_message * System message * Params: * id - the id that identifies the server connection * me - the handle of the identity the notification is sent to * who - the source of the system message (there are different types) * msg - the message */ void YAHOO_CALLBACK_TYPE(ext_yahoo_system_message) (int id, const char *me, const char *who, const char *msg); /* * Name: ext_yahoo_got_buddyicon * Buddy icon received * Params: * id - the id that identifies the server connection * me - the handle of the identity the notification is sent to * who - the person the buddy icon is for * url - the url to use to load the icon * checksum - the checksum of the icon content */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddyicon) (int id, const char *me, const char *who, const char *url, int checksum); /* * Name: ext_yahoo_got_buddyicon_checksum * Buddy icon checksum received * Params: * id - the id that identifies the server connection * me - the handle of the identity the notification is sent to * who - the yahoo id of the buddy icon checksum is for * checksum - the checksum of the icon content */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddyicon_checksum) (int id, const char *me, const char *who, int checksum); /* * Name: ext_yahoo_got_buddyicon_request * Buddy icon request received * Params: * id - the id that identifies the server connection * me - the handle of the identity the notification is sent to * who - the yahoo id of the buddy that requested the buddy icon */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddyicon_request) (int id, const char *me, const char *who); /* * Name: ext_yahoo_got_buddyicon_request * Buddy icon request received * Params: * id - the id that identifies the server connection * url - remote url, the uploaded buddy icon can be fetched from */ void YAHOO_CALLBACK_TYPE(ext_yahoo_buddyicon_uploaded) (int id, const char *url); /* * Name: ext_yahoo_got_webcam_image * Called when you get a webcam update * An update can either be receiving an image, a part of an image or * just an update with a timestamp * Params: * id - the id that identifies the server connection * who - the user who's webcam we're viewing * image - image data * image_size - length of the image in bytes * real_size - actual length of image data * timestamp - milliseconds since the webcam started * * If the real_size is smaller then the image_size then only part of * the image has been read. This function will keep being called till * the total amount of bytes in image_size has been read. The image * received is in JPEG-2000 Code Stream Syntax (ISO/IEC 15444-1). * The size of the image will be either 160x120 or 320x240. * Each webcam image contains a timestamp. This timestamp should be * used to keep the image in sync since some images can take longer * to transport then others. When image_size is 0 we can still receive * a timestamp to stay in sync */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_webcam_image) (int id, const char *who, const unsigned char *image, unsigned int image_size, unsigned int real_size, unsigned int timestamp); /* * Name: ext_yahoo_webcam_invite * Called when you get a webcam invitation * Params: * id - the id that identifies the server connection * me - identity the invitation is to * from - who the invitation is from */ void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_invite) (int id, const char *me, const char *from); /* * Name: ext_yahoo_webcam_invite_reply * Called when you get a response to a webcam invitation * Params: * id - the id that identifies the server connection * me - identity the invitation response is to * from - who the invitation response is from * accept - 0 (decline), 1 (accept) */ void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_invite_reply) (int id, const char *me, const char *from, int accept); /* * Name: ext_yahoo_webcam_closed * Called when the webcam connection closed * Params: * id - the id that identifies the server connection * who - the user who we where connected to * reason - reason why the connection closed * 1 = user stopped broadcasting * 2 = user cancelled viewing permission * 3 = user declines permission * 4 = user does not have webcam online */ void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_closed) (int id, const char *who, int reason); /* * Name: ext_yahoo_got_search_result * Called when the search result received from server * Params: * id - the id that identifies the server connection * found - total number of results returned in the current result set * start - offset from where the current result set starts * total - total number of results available (start + found <= total) * contacts - the list of results as a YList of yahoo_found_contact * these will be freed after this function returns, so * if you need to use the information, make a copy */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_search_result) (int id, int found, int start, int total, YList *contacts); /* * Name: ext_yahoo_error * Called on error. * Params: * id - the id that identifies the server connection * err - the error message * fatal- whether this error is fatal to the connection or not * num - Which error is this */ void YAHOO_CALLBACK_TYPE(ext_yahoo_error) (int id, const char *err, int fatal, int num); /* * Name: ext_yahoo_webcam_viewer * Called when a viewer disconnects/connects/requests to connect * Params: * id - the id that identifies the server connection * who - the viewer * connect - 0=disconnect 1=connect 2=request */ void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_viewer) (int id, const char *who, int connect); /* * Name: ext_yahoo_webcam_data_request * Called when you get a request for webcam images * Params: * id - the id that identifies the server connection * send - whether to send images or not */ void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_data_request) (int id, int send); /* * Name: ext_yahoo_log * Called to log a message. * Params: * fmt - the printf formatted message * Returns: * 0 */ int YAHOO_CALLBACK_TYPE(ext_yahoo_log) (const char *fmt, ...); /* * Name: ext_yahoo_add_handler * Add a listener for the fd. Must call yahoo_read_ready * when a YAHOO_INPUT_READ fd is ready and yahoo_write_ready * when a YAHOO_INPUT_WRITE fd is ready. * Params: * id - the id that identifies the server connection * fd - the fd object on which to listen * cond - the condition on which to call the callback * data - callback data to pass to yahoo_*_ready * * Returns: a tag to be used when removing the handler */ int YAHOO_CALLBACK_TYPE(ext_yahoo_add_handler) (int id, void *fd, yahoo_input_condition cond, void *data); /* * Name: ext_yahoo_remove_handler * Remove the listener for the fd. * Params: * id - the id that identifies the connection * tag - the handler tag to remove */ void YAHOO_CALLBACK_TYPE(ext_yahoo_remove_handler) (int id, int tag); /* * Name: ext_yahoo_connect * Connect to a host:port * Params: * host - the host to connect to * port - the port to connect on * Returns: * a unix file descriptor to the socket */ int YAHOO_CALLBACK_TYPE(ext_yahoo_connect) (const char *host, int port); /* * Name: ext_yahoo_connect_async * Connect to a host:port asynchronously. This function should return * immediately returing a tag used to identify the connection handler, * or a pre-connect error (eg: host name lookup failure). * Once the connect completes (successfully or unsuccessfully), callback * should be called (see the signature for yahoo_connect_callback). * The callback may safely be called before this function returns, but * it should not be called twice. * Params: * id - the id that identifies this connection * host - the host to connect to * port - the port to connect on * callback - function to call when connect completes * callback_data - data to pass to the callback function * use_ssl - Whether we need an SSL connection * Returns: * a tag signifying the connection attempt */ int YAHOO_CALLBACK_TYPE(ext_yahoo_connect_async) (int id, const char *host, int port, yahoo_connect_callback callback, void *callback_data, int use_ssl); /* * Name: ext_yahoo_get_ip_addr * get IP Address for a domain name * Params: * domain - Domain name * Returns: * Newly allocated string containing the IP Address in IPv4 notation */ char *YAHOO_CALLBACK_TYPE(ext_yahoo_get_ip_addr) (const char *domain); /* * Name: ext_yahoo_write * Write data from the buffer into the socket for the specified connection * Params: * fd - the file descriptor object that identifies this connection * buf - Buffer to write the data from * len - Length of the data * Returns: * Number of bytes written or -1 for error */ int YAHOO_CALLBACK_TYPE(ext_yahoo_write) (void *fd, char *buf, int len); /* * Name: ext_yahoo_read * Read data into a buffer from socket for the specified connection * Params: * fd - the file descriptor object that identifies this connection * buf - Buffer to read the data into * len - Max length to read * Returns: * Number of bytes read or -1 for error */ int YAHOO_CALLBACK_TYPE(ext_yahoo_read) (void *fd, char *buf, int len); /* * Name: ext_yahoo_close * Close the file descriptor object and free its resources. Libyahoo2 will not * use this object again. * Params: * fd - the file descriptor object that identifies this connection * Returns: * Nothing */ void YAHOO_CALLBACK_TYPE(ext_yahoo_close) (void *fd); /* * Name: ext_yahoo_got_buddy_change_group * Acknowledgement of buddy changing group * Params: * id: client id * me: The user * who: Buddy name * old_group: Old group name * new_group: New group name * Returns: * Nothing */ void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddy_change_group) (int id, const char *me, const char *who, const char *old_group, const char *new_group); }; /* * if using a callback structure, call yahoo_register_callbacks * before doing anything else */ void yahoo_register_callbacks(struct yahoo_callbacks *tyc); #undef YAHOO_CALLBACK_TYPE #ifdef __cplusplus } #endif #endif centerim-4.22.10/libyahoo2/yahoo_fn.c0000644000175000001440000061271011473007750014254 00000000000000/* * libyahoo2 - originally from gaim patches by Amatus * * Copyright (C) 2003-2004 * * Some code copyright (C) 1998-1999, Mark Spencer * libfaim code copyright 1998, 1999 Adam Fritzler * * 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 "yahoo_fn.h" unsigned char table_0[256] = { 0x5A, 0x41, 0x11, 0x77, 0x29, 0x9C, 0x31, 0xAD, 0x4A, 0x32, 0x1A, 0x6D, 0x56, 0x9F, 0x39, 0xA6, 0x0C, 0xE8, 0x49, 0x40, 0xA4, 0x21, 0xE9, 0x01, 0x91, 0x86, 0x2F, 0xB9, 0xED, 0x80, 0x51, 0xAB, 0x7F, 0x92, 0xF2, 0x73, 0xCD, 0xD9, 0x75, 0x2A, 0x70, 0x34, 0x35, 0x8D, 0xA8, 0x72, 0x7D, 0x9B, 0x2E, 0xC5, 0x2D, 0x76, 0x1E, 0xBB, 0xE7, 0x37, 0xBA, 0xB7, 0xB2, 0x03, 0x20, 0x17, 0x8A, 0x07, 0xD6, 0x96, 0x13, 0x95, 0xE5, 0xF1, 0x18, 0x3B, 0xA5, 0x62, 0x33, 0xC1, 0x44, 0x3D, 0x6C, 0xA7, 0xBF, 0x1C, 0x60, 0xFF, 0x5B, 0xF5, 0x8E, 0xE6, 0x5C, 0xCC, 0xF7, 0x69, 0x15, 0x0F, 0x0B, 0xBD, 0x12, 0x9D, 0xB3, 0x65, 0x53, 0xB1, 0x14, 0xF4, 0x19, 0x3E, 0xB6, 0x45, 0xCB, 0xA2, 0x7A, 0xD3, 0xF8, 0xD1, 0x61, 0xEE, 0xBC, 0xC6, 0xB0, 0x5D, 0x4B, 0x09, 0x26, 0xE1, 0x1D, 0x6E, 0xC3, 0xFB, 0x68, 0x4C, 0x42, 0x52, 0x5F, 0xDE, 0xFD, 0xEF, 0x81, 0x04, 0x6F, 0xE0, 0xF0, 0x1F, 0x0D, 0x7C, 0x58, 0x4F, 0x1B, 0x30, 0xCF, 0x9A, 0x2B, 0x05, 0xF6, 0x3F, 0x78, 0xAC, 0xD8, 0xEC, 0xE2, 0x25, 0x93, 0xDA, 0x84, 0x8C, 0x4E, 0xD5, 0x38, 0x0A, 0x06, 0x7E, 0xD4, 0x59, 0x98, 0xE3, 0x36, 0xC2, 0xD2, 0xA3, 0x10, 0x79, 0xFA, 0xC9, 0x16, 0x27, 0x66, 0x89, 0xFE, 0x57, 0xF3, 0x83, 0xB8, 0x28, 0x3C, 0xC7, 0xCE, 0x71, 0xC8, 0xDB, 0x22, 0xE4, 0xDD, 0xDF, 0x02, 0x8F, 0x5E, 0xEB, 0x48, 0x2C, 0x08, 0xC4, 0x43, 0xEA, 0x50, 0x55, 0x90, 0x54, 0x87, 0xCA, 0x00, 0x24, 0x6B, 0x85, 0x97, 0xD7, 0xDC, 0x6A, 0x67, 0xD0, 0x88, 0xA1, 0x9E, 0xC0, 0x46, 0xAE, 0x64, 0x74, 0x4D, 0xA0, 0x99, 0xB5, 0x0E, 0x8B, 0xAA, 0x3A, 0xB4, 0xFC, 0xA9, 0x94, 0x7B, 0xBE, 0xF9, 0xAF, 0x82, 0x63, 0x47, 0x23 }; unsigned char table_1[256] = { 0x08, 0xCB, 0x54, 0xCF, 0x97, 0x53, 0x59, 0xF1, 0x66, 0xEC, 0xDB, 0x1B, 0xB1, 0xE2, 0x36, 0xEB, 0xB3, 0x8F, 0x71, 0xA8, 0x90, 0x7D, 0xDA, 0xDC, 0x2C, 0x2F, 0xE8, 0x6A, 0x73, 0x37, 0xAE, 0xCC, 0xA1, 0x16, 0xE6, 0xFC, 0x9C, 0xA9, 0x2A, 0x3F, 0x58, 0xFD, 0x56, 0x4C, 0xA5, 0xF2, 0x33, 0x99, 0x1A, 0xB7, 0xFE, 0xA6, 0x1E, 0x32, 0x9E, 0x48, 0x03, 0x4A, 0x78, 0xEE, 0xCA, 0xC3, 0x88, 0x7A, 0xAC, 0x23, 0xAA, 0xBD, 0xDE, 0xD3, 0x67, 0x43, 0xFF, 0x64, 0x8A, 0xF9, 0x04, 0xD0, 0x7B, 0xC2, 0xBC, 0xF3, 0x89, 0x0E, 0xDD, 0xAB, 0x9D, 0x84, 0x5A, 0x62, 0x7F, 0x6D, 0x82, 0x68, 0xA3, 0xED, 0x2E, 0x07, 0x41, 0xEF, 0x2D, 0x70, 0x4F, 0x69, 0x8E, 0xE7, 0x0F, 0x11, 0x19, 0xAF, 0x31, 0xFB, 0x8D, 0x4B, 0x5F, 0x96, 0x75, 0x42, 0x6C, 0x46, 0xE4, 0x55, 0xD6, 0x3B, 0xE1, 0xD1, 0xB0, 0xB5, 0x45, 0x29, 0xC0, 0x94, 0x9F, 0xD4, 0x15, 0x17, 0x3C, 0x47, 0xC8, 0xD9, 0xC6, 0x76, 0xB9, 0x02, 0xE0, 0xC9, 0xB2, 0x01, 0xC1, 0x5D, 0x4E, 0x14, 0xF4, 0xAD, 0xB6, 0x00, 0x72, 0xF0, 0x49, 0x0D, 0xD8, 0x5E, 0x6F, 0x2B, 0x8C, 0x51, 0x83, 0xC5, 0x0A, 0x85, 0xE5, 0x38, 0x7E, 0x26, 0xEA, 0x22, 0x6B, 0x06, 0xD5, 0x8B, 0xBF, 0xC7, 0x35, 0x1D, 0xF6, 0x24, 0x28, 0xCE, 0x9B, 0x77, 0x20, 0x60, 0xF5, 0x87, 0x3D, 0x65, 0x86, 0x0C, 0xDF, 0xBA, 0x12, 0xA4, 0x3A, 0x34, 0xD7, 0xA0, 0xF8, 0x63, 0x52, 0x27, 0xB8, 0x18, 0xA7, 0x13, 0x91, 0x09, 0x93, 0x5C, 0x10, 0x9A, 0xB4, 0xE9, 0x44, 0xC4, 0x21, 0x57, 0x1C, 0x0B, 0xA2, 0x74, 0x4D, 0xBE, 0xD2, 0x1F, 0xCD, 0xE3, 0x6E, 0x7C, 0x40, 0x50, 0x39, 0x80, 0x98, 0xFA, 0x25, 0x92, 0x30, 0x5B, 0x05, 0x95, 0xBB, 0x79, 0x61, 0x3E, 0x81, 0xF7 }; unsigned char table_2[32] = { 0x19, 0x05, 0x09, 0x1C, 0x0B, 0x1A, 0x12, 0x03, 0x06, 0x04, 0x0D, 0x1D, 0x15, 0x0E, 0x1B, 0x18, 0x00, 0x07, 0x08, 0x02, 0x13, 0x1F, 0x0C, 0x1E, 0x16, 0x0A, 0x10, 0x0F, 0x01, 0x14, 0x11, 0x17 }; unsigned char table_3[256] = { 0xBC, 0x1B, 0xCC, 0x1E, 0x5B, 0x59, 0x4F, 0xA8, 0x62, 0xC6, 0xC1, 0xBB, 0x83, 0x2D, 0xA3, 0xA6, 0x5A, 0xDC, 0xE5, 0x93, 0xFB, 0x5C, 0xD6, 0x2A, 0x97, 0xC7, 0x1C, 0x73, 0x08, 0x45, 0xD2, 0x89, 0x4A, 0xD4, 0xCF, 0x0C, 0x1D, 0xD8, 0xCD, 0x26, 0x8F, 0x11, 0x55, 0x8B, 0xD3, 0x53, 0xCE, 0x00, 0xB5, 0x3B, 0x2E, 0x39, 0x88, 0x7B, 0x85, 0x46, 0x54, 0xA5, 0x31, 0x40, 0x3E, 0x0A, 0x4C, 0x68, 0x70, 0x0F, 0xBA, 0x0E, 0x75, 0x8A, 0xEB, 0x44, 0x60, 0x6C, 0x05, 0xC9, 0xF0, 0xDD, 0x0D, 0x66, 0xAB, 0xA1, 0xAD, 0xF2, 0x12, 0x6A, 0xE6, 0x27, 0xF6, 0x9F, 0xDB, 0xB8, 0xF4, 0x56, 0x5E, 0x2C, 0xDA, 0xFE, 0x34, 0x86, 0xF5, 0xC2, 0xB0, 0xF1, 0xCB, 0xF3, 0x78, 0x9B, 0x7F, 0xB4, 0xD7, 0x58, 0x74, 0x07, 0x72, 0x96, 0x02, 0xCA, 0xAC, 0xE8, 0x5D, 0xA7, 0x32, 0xBD, 0x81, 0x43, 0x18, 0xF8, 0x15, 0x0B, 0xE9, 0x76, 0x30, 0xBF, 0x3A, 0x22, 0x9E, 0xD1, 0x79, 0x37, 0xBE, 0x8C, 0x7A, 0x98, 0x21, 0x95, 0x10, 0x8D, 0xDF, 0xC0, 0x69, 0xC8, 0x03, 0x6E, 0x4B, 0x36, 0xFC, 0x6F, 0xA9, 0x48, 0x63, 0xE1, 0xB9, 0x24, 0x87, 0x13, 0xB2, 0xA4, 0x84, 0x06, 0x14, 0x61, 0x3D, 0x92, 0xB1, 0x41, 0xE2, 0x71, 0xAF, 0x16, 0xDE, 0x25, 0x82, 0xD9, 0x2B, 0x33, 0x51, 0xA2, 0x4E, 0x7D, 0x94, 0xFF, 0xFD, 0x5F, 0x80, 0xED, 0x64, 0xE7, 0x50, 0x6D, 0xD0, 0x3C, 0x6B, 0x65, 0x77, 0x17, 0x1A, 0xEC, 0xD5, 0xAA, 0xF9, 0xC4, 0x9C, 0x35, 0xE3, 0x42, 0xE4, 0x19, 0x52, 0x67, 0xB7, 0x9D, 0x28, 0xC5, 0x47, 0x38, 0x91, 0x57, 0xAE, 0x3F, 0x29, 0x9A, 0x2F, 0xF7, 0x90, 0x04, 0xEE, 0xFA, 0x20, 0xB6, 0xEA, 0x49, 0x23, 0x4D, 0xB3, 0x8E, 0xC3, 0x1F, 0x7C, 0xEF, 0xE0, 0x99, 0x09, 0xA0, 0x01, 0x7E }; unsigned char table_4[32] = { 0x1F, 0x0B, 0x00, 0x1E, 0x03, 0x0E, 0x15, 0x01, 0x1A, 0x17, 0x1D, 0x1B, 0x11, 0x0F, 0x0A, 0x12, 0x13, 0x18, 0x02, 0x04, 0x09, 0x06, 0x0D, 0x07, 0x08, 0x05, 0x10, 0x19, 0x0C, 0x14, 0x16, 0x1C }; unsigned char table_5[256] = { 0x9A, 0xAB, 0x61, 0x28, 0x0A, 0x23, 0xFC, 0xBA, 0x90, 0x22, 0xB7, 0x62, 0xD9, 0x09, 0x91, 0xF4, 0x7B, 0x5D, 0x6B, 0x80, 0xAC, 0x9E, 0x21, 0x72, 0x64, 0x2D, 0xFF, 0x66, 0xEB, 0x5B, 0x05, 0xC8, 0x1B, 0xD1, 0x55, 0xF5, 0x97, 0x08, 0xAE, 0xC7, 0x00, 0xDE, 0xE1, 0x78, 0xD8, 0xB6, 0xF0, 0x17, 0xE4, 0x32, 0xCD, 0x76, 0x07, 0x14, 0x7F, 0x7A, 0xBF, 0xB4, 0x1D, 0x94, 0x48, 0x75, 0xFA, 0xA7, 0x99, 0x7E, 0x65, 0x38, 0x29, 0x51, 0xC3, 0x83, 0x7C, 0x0D, 0xA0, 0xCC, 0xF1, 0xDD, 0xE2, 0x49, 0xF8, 0xD2, 0x25, 0x54, 0x9B, 0x0E, 0xB9, 0xFE, 0x67, 0xC4, 0xCE, 0x13, 0xD4, 0xE7, 0xB8, 0x41, 0x77, 0xDB, 0xA6, 0xB0, 0x11, 0x6A, 0x5E, 0x68, 0x8D, 0xF9, 0x36, 0xD3, 0xC2, 0x3A, 0xAA, 0x59, 0x03, 0xE0, 0xE3, 0xF3, 0x42, 0x2C, 0x04, 0x47, 0xE6, 0x93, 0xCB, 0x6E, 0x20, 0xCA, 0x01, 0xA1, 0x40, 0x2B, 0x2F, 0x5F, 0x87, 0xD0, 0xEC, 0x88, 0x27, 0x58, 0xC6, 0x3E, 0xDF, 0x26, 0x5C, 0xE9, 0x1F, 0x0F, 0x95, 0x1C, 0xFB, 0xA5, 0x12, 0x39, 0x1E, 0x3C, 0x33, 0x43, 0x56, 0xE8, 0x82, 0xF7, 0x7D, 0x89, 0xF2, 0xD7, 0x50, 0x92, 0x60, 0x4C, 0x2A, 0x86, 0x16, 0x6C, 0x37, 0xC0, 0xAD, 0xB3, 0x24, 0x45, 0xB1, 0xA2, 0x71, 0xA4, 0xA3, 0xED, 0xC9, 0x5A, 0x4D, 0x84, 0x0C, 0x3F, 0xC5, 0x9D, 0x63, 0x19, 0x79, 0x57, 0x96, 0x30, 0x74, 0xBB, 0xDA, 0x1A, 0x9F, 0x44, 0xC1, 0x98, 0xE5, 0x81, 0xD6, 0x18, 0x8F, 0xFD, 0x8E, 0x06, 0x6F, 0xF6, 0x2E, 0x3B, 0xB5, 0x85, 0x8A, 0x9C, 0x53, 0x4A, 0xA9, 0x52, 0x3D, 0x4E, 0xBE, 0xAF, 0xBC, 0xA8, 0x4F, 0x6D, 0x15, 0x35, 0x8C, 0xBD, 0x34, 0x8B, 0xDC, 0x0B, 0xCF, 0x31, 0xEA, 0xB2, 0x70, 0x4B, 0x46, 0x73, 0x69, 0xD5, 0x10, 0xEE, 0x02, 0xEF }; unsigned char table_6[32] = { 0x1A, 0x1C, 0x0F, 0x0C, 0x00, 0x02, 0x13, 0x09, 0x11, 0x05, 0x0D, 0x12, 0x18, 0x0B, 0x04, 0x10, 0x14, 0x1B, 0x1E, 0x16, 0x07, 0x08, 0x03, 0x17, 0x19, 0x1F, 0x01, 0x0E, 0x15, 0x06, 0x0A, 0x1D }; unsigned char table_7[256] = { 0x52, 0x11, 0x72, 0xD0, 0x76, 0xD7, 0xAE, 0x03, 0x7F, 0x19, 0xF4, 0xB8, 0xB3, 0x5D, 0xCA, 0x2D, 0x5C, 0x30, 0x53, 0x1A, 0x57, 0xF6, 0xAD, 0x83, 0x29, 0x79, 0xD5, 0xF0, 0x0F, 0xC3, 0x8B, 0xD3, 0x8E, 0x37, 0x01, 0xA6, 0xF1, 0x10, 0x04, 0x71, 0xCC, 0xC6, 0xE7, 0xC2, 0x85, 0x94, 0xBD, 0x6F, 0xCB, 0xEA, 0xFC, 0xA1, 0x38, 0x5E, 0x08, 0x2E, 0x35, 0x42, 0x67, 0xD4, 0x56, 0x6D, 0x7C, 0xE5, 0x0E, 0x7D, 0x12, 0x65, 0xF5, 0x33, 0x82, 0xC4, 0x1D, 0xD2, 0x16, 0x58, 0xEC, 0xCD, 0xA8, 0xBF, 0xAB, 0x07, 0x45, 0x55, 0xB7, 0x6A, 0x70, 0xF2, 0xBE, 0x05, 0x6B, 0x9D, 0xEB, 0x13, 0x0D, 0x9F, 0xE8, 0xA7, 0xC8, 0x31, 0x3C, 0xB6, 0x21, 0xC0, 0x20, 0x60, 0x6C, 0xE2, 0xCE, 0x8C, 0xFD, 0x95, 0xE3, 0x4A, 0xB5, 0xB2, 0x40, 0xB1, 0xF3, 0x17, 0xF9, 0x24, 0x06, 0x22, 0x2F, 0x25, 0x93, 0x8A, 0x2A, 0x7E, 0x28, 0x3D, 0x47, 0xF8, 0x89, 0xA5, 0x7B, 0x9B, 0xC5, 0x84, 0x59, 0x46, 0x90, 0x74, 0x69, 0xC7, 0xAA, 0xEE, 0x6E, 0xD6, 0xB0, 0x18, 0x66, 0xA0, 0x7A, 0x1E, 0xFB, 0xDB, 0x4E, 0x51, 0x92, 0xE4, 0xE0, 0x3E, 0xB4, 0xD8, 0x23, 0x3B, 0xC1, 0x5F, 0xFE, 0x98, 0x99, 0x73, 0x09, 0xA9, 0xA3, 0xDF, 0x14, 0x5A, 0x26, 0x8F, 0x0B, 0xAF, 0x4C, 0x97, 0x54, 0xE1, 0x63, 0x48, 0xED, 0xBA, 0xCF, 0xBB, 0x1F, 0xDC, 0xA4, 0xFA, 0x64, 0x75, 0xDE, 0x81, 0x9A, 0xFF, 0x49, 0x41, 0x27, 0x62, 0x02, 0x15, 0xD9, 0x86, 0xAC, 0x3F, 0x0C, 0x61, 0xD1, 0x77, 0x2B, 0x1B, 0x96, 0xDA, 0x68, 0x1C, 0x44, 0x32, 0xBC, 0xA2, 0x87, 0xF7, 0x91, 0x8D, 0x80, 0xDD, 0x0A, 0x50, 0x34, 0x4B, 0x00, 0xB9, 0x36, 0xE6, 0x78, 0x4F, 0xC9, 0xE9, 0x2C, 0x43, 0x88, 0x9E, 0x9C, 0x5B, 0x4D, 0x3A, 0x39, 0xEF }; unsigned char table_8[32] = { 0x13, 0x08, 0x1E, 0x1D, 0x17, 0x16, 0x07, 0x1F, 0x0E, 0x03, 0x1A, 0x19, 0x01, 0x12, 0x11, 0x10, 0x09, 0x0C, 0x0F, 0x14, 0x0B, 0x05, 0x00, 0x04, 0x1C, 0x18, 0x0A, 0x15, 0x02, 0x1B, 0x06, 0x0D }; unsigned char table_9[256] = { 0x20, 0x2A, 0xDA, 0xFE, 0x76, 0x0D, 0xED, 0x39, 0x51, 0x4C, 0x46, 0x9A, 0xF1, 0xB0, 0x10, 0xC7, 0xD1, 0x6F, 0x18, 0x24, 0xB9, 0x7A, 0x4F, 0x47, 0xE0, 0x4E, 0x88, 0x09, 0x8A, 0xBA, 0x60, 0xBD, 0xC2, 0x27, 0x93, 0x7D, 0x94, 0x40, 0xCB, 0x80, 0xB8, 0x41, 0x84, 0x5D, 0xC1, 0x0F, 0x5E, 0x78, 0x2B, 0x48, 0x28, 0x29, 0xEE, 0x81, 0x90, 0x86, 0x50, 0x9C, 0xF3, 0xB2, 0x35, 0x52, 0x0C, 0x9D, 0xFC, 0x69, 0xD6, 0xA6, 0x06, 0xD7, 0xC6, 0xFF, 0x1C, 0x14, 0x57, 0x33, 0xE2, 0x1F, 0x83, 0xA8, 0xF7, 0x99, 0xC5, 0xDC, 0x70, 0x9E, 0xF4, 0x6B, 0x0A, 0x77, 0x95, 0x4A, 0x2E, 0x53, 0xF2, 0x62, 0x98, 0xF8, 0x96, 0xDB, 0xE6, 0x32, 0x3C, 0x58, 0xD5, 0x6D, 0xE7, 0x4B, 0xCE, 0x91, 0x43, 0xD8, 0xFA, 0xE3, 0x4D, 0xD9, 0x68, 0xDE, 0xEC, 0x01, 0x08, 0xD3, 0x8F, 0x19, 0xC4, 0xA7, 0x6E, 0x3E, 0x63, 0x12, 0x72, 0x42, 0x9F, 0xB4, 0x04, 0x1B, 0x7E, 0x11, 0x17, 0x73, 0xB5, 0x22, 0x56, 0xA1, 0x89, 0xDD, 0xF5, 0x3F, 0x49, 0x26, 0x8D, 0x15, 0x85, 0x75, 0x5F, 0x65, 0x82, 0xB6, 0xF6, 0xD2, 0xA4, 0x55, 0x37, 0xC8, 0xA0, 0xCC, 0x66, 0x5C, 0xC9, 0x25, 0x36, 0x67, 0x7C, 0xE1, 0xA3, 0xCF, 0xA9, 0x59, 0x2F, 0xFB, 0xBB, 0x07, 0x87, 0xA2, 0x44, 0x92, 0x13, 0x00, 0x16, 0x61, 0x38, 0xEB, 0xAE, 0xD4, 0x1E, 0x64, 0x6A, 0xE4, 0xCA, 0x1D, 0x6C, 0xDF, 0xAB, 0x5B, 0x03, 0x7B, 0x9B, 0x8C, 0x5A, 0xFD, 0xC3, 0xB3, 0x0B, 0xAA, 0xAC, 0x8B, 0xBE, 0xBC, 0x3D, 0x97, 0xCD, 0x05, 0x21, 0x8E, 0xAD, 0xEA, 0x54, 0x30, 0xAF, 0x02, 0xB1, 0x34, 0x0E, 0xA5, 0x3B, 0x45, 0x1A, 0x23, 0xE8, 0x7F, 0xEF, 0xB7, 0x31, 0xD0, 0xBF, 0x3A, 0x79, 0xE5, 0xF9, 0xF0, 0x2C, 0x74, 0xE9, 0x71, 0xC0, 0x2D }; unsigned char table_10[32] = { 0x1D, 0x12, 0x11, 0x0D, 0x1E, 0x19, 0x16, 0x1B, 0x18, 0x13, 0x07, 0x17, 0x0C, 0x02, 0x00, 0x15, 0x0E, 0x08, 0x05, 0x01, 0x10, 0x06, 0x04, 0x0F, 0x1F, 0x1A, 0x0B, 0x09, 0x0A, 0x14, 0x1C, 0x03 }; unsigned char table_11[256] = { 0x6B, 0x1D, 0xC6, 0x0A, 0xB7, 0xAC, 0xB2, 0x11, 0x29, 0xD3, 0xA2, 0x4D, 0xCB, 0x03, 0xEF, 0xA6, 0xC1, 0x5D, 0x75, 0x48, 0x35, 0x6C, 0xE2, 0x84, 0xAB, 0xAA, 0xD8, 0x2C, 0x0E, 0x95, 0x25, 0x27, 0x7D, 0x0B, 0xD0, 0xFB, 0x14, 0xE5, 0xF2, 0x4E, 0x7F, 0x2A, 0x63, 0x3C, 0xC9, 0xF6, 0xDC, 0x07, 0x26, 0x55, 0xCF, 0x2B, 0xCD, 0xA7, 0x17, 0xD2, 0x9A, 0x7B, 0x93, 0x78, 0x9E, 0xE6, 0x2F, 0x49, 0x1E, 0xFD, 0xF0, 0xFE, 0x7C, 0x33, 0x92, 0xA3, 0xC8, 0xA0, 0xA9, 0xC4, 0xA1, 0x94, 0x6D, 0x44, 0x0C, 0x90, 0x3A, 0x8C, 0x8E, 0x85, 0xAF, 0x40, 0x36, 0xA4, 0xD1, 0xB9, 0x19, 0x6F, 0xF4, 0xBA, 0x1A, 0x73, 0xD9, 0xB5, 0xB4, 0x7A, 0xF9, 0x83, 0x58, 0xAD, 0xCE, 0x60, 0x98, 0xDB, 0x1C, 0x1B, 0x52, 0xB8, 0xF3, 0x96, 0xED, 0xDE, 0xB3, 0xEE, 0x4F, 0xBD, 0x10, 0xD4, 0x43, 0xEA, 0xE7, 0x37, 0x12, 0x3D, 0xA8, 0x22, 0x65, 0xEC, 0x5B, 0x08, 0x9D, 0x0D, 0x5C, 0xB6, 0x8A, 0x79, 0x3F, 0x04, 0xD6, 0x01, 0xE1, 0xBE, 0xDD, 0x50, 0xFA, 0x41, 0x13, 0x91, 0xF7, 0xDA, 0x18, 0xB0, 0x45, 0x81, 0x4C, 0xF5, 0x32, 0x23, 0x56, 0x5A, 0xEB, 0x97, 0x34, 0x00, 0x77, 0x71, 0x4B, 0x70, 0xD5, 0x31, 0x72, 0x05, 0xDF, 0xE8, 0x15, 0x3B, 0x54, 0x16, 0x89, 0xE4, 0xF1, 0xD7, 0x80, 0x82, 0x4A, 0xE3, 0x39, 0x06, 0x47, 0x28, 0xC2, 0x86, 0x87, 0xB1, 0x62, 0x74, 0x53, 0x21, 0x67, 0x38, 0x42, 0xCA, 0x9B, 0xC3, 0x51, 0x99, 0x8B, 0x1F, 0x24, 0x8D, 0xF8, 0x68, 0x3E, 0x59, 0xBB, 0x61, 0x5F, 0xBC, 0x09, 0x6E, 0x8F, 0x0F, 0x2D, 0xC0, 0xE0, 0x46, 0x66, 0x69, 0xA5, 0xE9, 0x30, 0x9C, 0x5E, 0xAE, 0xBF, 0xC7, 0x20, 0x7E, 0x6A, 0xC5, 0x88, 0xFC, 0x64, 0x76, 0xFF, 0x9F, 0x2E, 0x02, 0xCC, 0x57 }; unsigned char table_12[32] = { 0x14, 0x1B, 0x18, 0x00, 0x1F, 0x15, 0x17, 0x07, 0x11, 0x1A, 0x0E, 0x13, 0x12, 0x06, 0x01, 0x03, 0x1C, 0x0C, 0x0B, 0x1D, 0x10, 0x0F, 0x09, 0x19, 0x0D, 0x1E, 0x04, 0x05, 0x08, 0x16, 0x0A, 0x02 }; unsigned char table_13[256] = { 0x37, 0x8A, 0x1B, 0x91, 0xA5, 0x2B, 0x2D, 0x88, 0x8E, 0xFE, 0x0E, 0xD3, 0xF3, 0xE9, 0x7D, 0xD1, 0x24, 0xEA, 0xB1, 0x8B, 0x5C, 0xA4, 0x44, 0x7E, 0x8C, 0x2C, 0x73, 0xD5, 0x50, 0x3E, 0xD7, 0x18, 0xB9, 0xD6, 0xBA, 0x94, 0x0C, 0xFC, 0xCB, 0xB4, 0x0D, 0x63, 0x4C, 0xDE, 0x77, 0x16, 0xFD, 0x81, 0x3C, 0x11, 0x45, 0x36, 0xF6, 0x67, 0x95, 0x6D, 0x6A, 0x1A, 0xA3, 0xC5, 0x92, 0x10, 0x28, 0x84, 0x48, 0xA6, 0x23, 0xE3, 0x4B, 0xE1, 0xF5, 0x19, 0xE0, 0x2E, 0x00, 0x61, 0x74, 0xCC, 0xF7, 0xB0, 0x68, 0xC8, 0x40, 0x6F, 0x59, 0x52, 0x26, 0x99, 0xC9, 0xF9, 0xC4, 0x53, 0x9B, 0xEC, 0x03, 0x17, 0xE2, 0x06, 0x30, 0x7B, 0xBE, 0xCD, 0x1D, 0x3B, 0xD2, 0x5B, 0x65, 0x21, 0x49, 0xB7, 0x79, 0xCF, 0x82, 0x86, 0xC7, 0x62, 0xEE, 0x8D, 0xFF, 0xD4, 0xC3, 0x85, 0xA7, 0xFA, 0xA9, 0x6B, 0xF2, 0x69, 0x9C, 0x38, 0x78, 0xBD, 0x7F, 0xDD, 0xCE, 0xA1, 0x33, 0xC2, 0x43, 0xEB, 0xD8, 0xE6, 0x2A, 0xE4, 0x76, 0x6C, 0xAA, 0x46, 0x05, 0xE7, 0xA0, 0x0A, 0x71, 0x98, 0x41, 0x5F, 0x0F, 0xEF, 0x51, 0xAD, 0xF0, 0xED, 0x96, 0x5A, 0x42, 0x3F, 0xBF, 0x6E, 0xBC, 0x5D, 0xC1, 0x15, 0x70, 0x54, 0x4D, 0x14, 0xB5, 0xCA, 0x27, 0x80, 0x87, 0x39, 0x60, 0x47, 0x9D, 0x2F, 0x56, 0x1F, 0xBB, 0x31, 0xF1, 0xE8, 0xB3, 0x9E, 0x5E, 0x7C, 0xD0, 0xC6, 0xB2, 0x57, 0x83, 0xAC, 0x09, 0x8F, 0xA2, 0x90, 0x13, 0x25, 0x01, 0x08, 0x64, 0xB6, 0x02, 0xDB, 0x55, 0x32, 0xAF, 0x9A, 0xC0, 0x1C, 0x12, 0x29, 0x0B, 0x72, 0x4F, 0xDA, 0xAB, 0x35, 0xF8, 0x22, 0xD9, 0x4E, 0x3D, 0x1E, 0xDC, 0x58, 0x20, 0x34, 0xAE, 0x66, 0x75, 0x93, 0x9F, 0x3A, 0x07, 0xE5, 0x89, 0xDF, 0x97, 0x4A, 0xB8, 0x7A, 0xF4, 0xFB, 0x04, 0xA8 }; unsigned char table_14[32] = { 0x04, 0x14, 0x13, 0x15, 0x1A, 0x1B, 0x0F, 0x16, 0x02, 0x0D, 0x0C, 0x06, 0x10, 0x17, 0x01, 0x0B, 0x1E, 0x08, 0x1C, 0x18, 0x19, 0x0A, 0x1F, 0x05, 0x11, 0x09, 0x1D, 0x07, 0x0E, 0x12, 0x03, 0x00 }; unsigned char table_15[256] = { 0x61, 0x48, 0x58, 0x41, 0x7F, 0x88, 0x43, 0x42, 0xD9, 0x80, 0x81, 0xFE, 0xC6, 0x49, 0xD7, 0x2C, 0xE6, 0x5B, 0xEE, 0xFF, 0x2A, 0x6F, 0xBF, 0x98, 0xD6, 0x20, 0xB9, 0xB1, 0x5D, 0x95, 0x72, 0x1E, 0x82, 0x96, 0xDE, 0xC1, 0x40, 0xD8, 0x70, 0xA3, 0xD1, 0x1F, 0xF0, 0x9F, 0x2D, 0xDC, 0x3F, 0xF9, 0x5E, 0x0D, 0x15, 0x2F, 0x67, 0x31, 0x9D, 0x84, 0x97, 0x0C, 0xF6, 0x79, 0xC2, 0xA7, 0xC0, 0x32, 0xB3, 0xEB, 0xED, 0x71, 0x30, 0xCC, 0x4B, 0xA0, 0xF5, 0xC4, 0xCD, 0x27, 0xFA, 0x11, 0x25, 0xDB, 0x4F, 0xE2, 0x7E, 0xA6, 0xAF, 0x34, 0x69, 0x63, 0x8F, 0x08, 0x1C, 0x85, 0xF1, 0x57, 0x78, 0xC8, 0xA2, 0x83, 0xB5, 0x68, 0xF7, 0x64, 0x45, 0x26, 0x3B, 0x03, 0xAD, 0x3C, 0x50, 0xD5, 0x77, 0xFC, 0xFB, 0x18, 0xC9, 0xD2, 0x9C, 0xBB, 0xBA, 0x76, 0x23, 0x55, 0xD3, 0x5A, 0x01, 0xE9, 0x87, 0x07, 0x19, 0x09, 0x39, 0x8A, 0x91, 0x93, 0x12, 0xDF, 0x22, 0xA8, 0xCF, 0x4E, 0x4D, 0x65, 0xB0, 0x0F, 0x13, 0x53, 0x21, 0x8C, 0xE5, 0xB7, 0x0B, 0x0E, 0x6C, 0x44, 0xCA, 0x7B, 0xC5, 0x6E, 0xCE, 0xE3, 0x14, 0x29, 0xAC, 0x2E, 0xE7, 0x59, 0xE8, 0x0A, 0xEA, 0x66, 0x7C, 0x94, 0x6D, 0x05, 0x9E, 0x9A, 0x2B, 0x38, 0x6A, 0xCB, 0x51, 0xEF, 0x06, 0xDA, 0xFD, 0x47, 0x92, 0x1D, 0xA5, 0x37, 0x33, 0xEC, 0xB4, 0x52, 0x56, 0xC3, 0xF4, 0xF8, 0x8B, 0xD0, 0xA4, 0x5F, 0x28, 0x89, 0x75, 0xC7, 0x04, 0x00, 0xE4, 0x86, 0x36, 0x3A, 0x99, 0x16, 0x7D, 0xE0, 0x7A, 0x4C, 0x54, 0x46, 0x73, 0xB2, 0xF3, 0xE1, 0x62, 0xBE, 0x90, 0x4A, 0x24, 0x6B, 0x3E, 0xAA, 0x1B, 0xF2, 0x60, 0xD4, 0xA9, 0x9B, 0x1A, 0xB8, 0xA1, 0x35, 0xAE, 0xB6, 0x10, 0x5C, 0x17, 0xBC, 0xAB, 0x8D, 0x02, 0x74, 0xBD, 0x3D, 0x8E, 0xDD }; unsigned char table_16[256] = { 0x3F, 0x9C, 0x17, 0xC1, 0x59, 0xC6, 0x23, 0x93, 0x4B, 0xDF, 0xCB, 0x55, 0x2B, 0xDE, 0xCD, 0xAD, 0xB3, 0xE7, 0x42, 0x2F, 0x02, 0x5A, 0x7B, 0x5C, 0x8F, 0xD1, 0x11, 0xCE, 0xEC, 0xF6, 0xA4, 0xE6, 0x58, 0x98, 0x6A, 0x99, 0xFB, 0x9B, 0x53, 0x21, 0x8A, 0x09, 0x2E, 0x3C, 0x22, 0x38, 0xAC, 0x07, 0x91, 0x46, 0xA9, 0x95, 0xC3, 0x14, 0x84, 0xDB, 0x36, 0x68, 0x1D, 0xDD, 0xF9, 0x12, 0xE0, 0x3D, 0x8D, 0x4D, 0x05, 0x86, 0x69, 0xC0, 0xD3, 0xD5, 0xA5, 0xC9, 0xE5, 0x67, 0x6D, 0xE2, 0x7F, 0xFE, 0xB2, 0x0F, 0x62, 0xCF, 0x37, 0x35, 0xF3, 0x28, 0x16, 0xA6, 0x50, 0x76, 0x80, 0x00, 0x31, 0x97, 0x39, 0x7C, 0x25, 0x0C, 0x64, 0xF2, 0x52, 0x1A, 0x92, 0x4F, 0x2A, 0x56, 0x03, 0x4C, 0xBD, 0x10, 0xB7, 0x2C, 0x8C, 0xAE, 0x73, 0xB9, 0xE9, 0xF7, 0xA7, 0xE1, 0x75, 0xBC, 0xC5, 0x1C, 0x3A, 0x63, 0x7A, 0x4A, 0x29, 0xD2, 0x71, 0xE8, 0x08, 0xA1, 0xD4, 0xFD, 0x13, 0xFA, 0xA0, 0x27, 0x41, 0x72, 0x82, 0x18, 0x51, 0x60, 0x5E, 0x66, 0x0D, 0xAA, 0xD8, 0x1F, 0xAF, 0x45, 0xD0, 0xF1, 0x9F, 0x6B, 0xE4, 0x44, 0x89, 0xEE, 0xC4, 0x0B, 0x6C, 0xCC, 0x83, 0x77, 0xA2, 0x87, 0x0A, 0xA8, 0xED, 0x90, 0x74, 0x6E, 0xF5, 0xAB, 0xA3, 0xB6, 0x5F, 0x0E, 0x04, 0x9A, 0xB4, 0x8E, 0xF0, 0xFF, 0x88, 0xB5, 0xF8, 0xBF, 0x8B, 0x6F, 0x4E, 0x79, 0x40, 0xCA, 0x24, 0x26, 0xDC, 0x33, 0xEB, 0x2D, 0x5B, 0x1B, 0x9D, 0xC7, 0x49, 0x48, 0x54, 0x85, 0xEF, 0xD7, 0xC2, 0xB8, 0xC8, 0x5D, 0xD9, 0x3B, 0x15, 0xBB, 0x65, 0xE3, 0xD6, 0x30, 0x3E, 0x1E, 0x32, 0x9E, 0x57, 0x81, 0x34, 0x06, 0xFC, 0xBA, 0x7D, 0x20, 0x70, 0xDA, 0x7E, 0x47, 0x94, 0x61, 0xB0, 0x78, 0xF4, 0xBE, 0xEA, 0x19, 0x43, 0x01, 0xB1, 0x96 }; unsigned char table_17[256] = { 0x7E, 0xF1, 0xD3, 0x75, 0x87, 0xA6, 0xED, 0x9E, 0xA9, 0xD5, 0xC6, 0xBF, 0xE6, 0x6A, 0xEE, 0x4B, 0x34, 0xDF, 0x4C, 0x7D, 0xDD, 0xFE, 0x3F, 0xAF, 0x66, 0x2D, 0x74, 0x6F, 0xFC, 0x4F, 0x5F, 0x88, 0x29, 0x7B, 0xC7, 0x2A, 0x70, 0xE8, 0x1D, 0xDE, 0xD0, 0x55, 0x71, 0x81, 0xC4, 0x0D, 0x50, 0x4E, 0x58, 0x00, 0x96, 0x97, 0xBB, 0xD7, 0x53, 0x15, 0x6C, 0x40, 0x17, 0xC9, 0xFF, 0x8F, 0x94, 0xFB, 0x19, 0x9A, 0x3E, 0xB5, 0x5A, 0x5E, 0x86, 0x24, 0xB8, 0x77, 0xBA, 0x85, 0x51, 0x18, 0xBE, 0x59, 0x79, 0xF3, 0xD4, 0xC3, 0xAB, 0x28, 0xFD, 0x25, 0x41, 0x91, 0x07, 0x8D, 0xAE, 0x49, 0xF5, 0x80, 0x35, 0xA1, 0x9C, 0x3C, 0xE2, 0x65, 0xB3, 0xE0, 0x16, 0xCB, 0x12, 0x6B, 0xF7, 0xB1, 0x93, 0x8A, 0xCE, 0x54, 0x4D, 0xF8, 0x13, 0xA2, 0x95, 0x46, 0xEA, 0x61, 0x57, 0x9D, 0x27, 0x8B, 0x3D, 0x60, 0x36, 0x68, 0x06, 0x56, 0xB6, 0x1B, 0xD2, 0x89, 0x10, 0xA7, 0xC5, 0x1A, 0x0B, 0x2C, 0xBD, 0x14, 0x0A, 0xDC, 0x23, 0xA8, 0xE1, 0x04, 0x02, 0xC0, 0xB2, 0x9B, 0xE3, 0x2E, 0x33, 0x7C, 0x32, 0xAC, 0x7A, 0x39, 0xB0, 0xF9, 0x98, 0x5B, 0x3A, 0x48, 0x21, 0x90, 0xB9, 0x20, 0xF0, 0xA0, 0x09, 0x1F, 0x2F, 0xEF, 0xEB, 0x22, 0x78, 0x82, 0x37, 0xD6, 0xD1, 0x84, 0x76, 0x01, 0xDB, 0x43, 0xC2, 0xB7, 0x7F, 0xA4, 0xE5, 0xC1, 0x1C, 0x69, 0x05, 0xEC, 0xD8, 0x38, 0x67, 0x42, 0x72, 0xBC, 0x73, 0xAD, 0xA3, 0xE9, 0x4A, 0x8E, 0x47, 0x1E, 0xC8, 0x6E, 0xDA, 0x5D, 0x2B, 0xF6, 0x30, 0x63, 0xCC, 0xF4, 0xCD, 0x8C, 0x0F, 0x3B, 0xE7, 0xD9, 0xCF, 0xB4, 0x03, 0x92, 0x0E, 0x31, 0xE4, 0x08, 0xF2, 0x45, 0xCA, 0x83, 0x26, 0x5C, 0xA5, 0x44, 0x64, 0x6D, 0x9F, 0x99, 0x62, 0xAA, 0xFA, 0x11, 0x0C, 0x52 }; unsigned char table_18[256] = { 0x0F, 0x42, 0x3D, 0x86, 0x3E, 0x66, 0xFE, 0x5C, 0x52, 0xE2, 0xA3, 0xB3, 0xCE, 0x16, 0xCC, 0x95, 0xB0, 0x8B, 0x82, 0x3B, 0x93, 0x7D, 0x62, 0x08, 0x1C, 0x6E, 0xBB, 0xCB, 0x1D, 0x88, 0x69, 0xD4, 0xC9, 0x40, 0x1F, 0xBE, 0x27, 0xBC, 0xDB, 0x38, 0xE5, 0xA1, 0x71, 0xBA, 0x8A, 0x5E, 0xFD, 0x36, 0x8F, 0x26, 0x6B, 0xE4, 0x20, 0x6D, 0xC5, 0xDE, 0xE0, 0x83, 0x7C, 0xD5, 0xD9, 0x4D, 0xDC, 0xE3, 0x0D, 0x32, 0xED, 0x0E, 0x2F, 0x21, 0xA7, 0x79, 0xA0, 0xD3, 0x8C, 0x14, 0x6F, 0xB7, 0xF8, 0x85, 0x5D, 0x37, 0x24, 0xD6, 0x25, 0xD2, 0x8E, 0xA5, 0xB8, 0xCD, 0x5A, 0x9F, 0x05, 0xAD, 0x65, 0x9E, 0x4F, 0x5B, 0x56, 0xF0, 0xAA, 0xC2, 0x28, 0xA8, 0x6A, 0x01, 0x99, 0x2E, 0xA6, 0x77, 0x74, 0x64, 0x76, 0x15, 0x90, 0x75, 0xAF, 0xE8, 0x39, 0x48, 0x09, 0x11, 0xE1, 0x2D, 0xEC, 0xB5, 0x7A, 0xB1, 0x94, 0x13, 0x41, 0x4C, 0x02, 0xA9, 0x97, 0xDF, 0xC3, 0x8D, 0xEA, 0x3A, 0x9C, 0xD1, 0xA2, 0x9A, 0xD7, 0x59, 0xD8, 0x18, 0xDA, 0x47, 0x89, 0x81, 0xC7, 0xF5, 0xFC, 0x98, 0xCA, 0x91, 0x06, 0x68, 0xC8, 0x07, 0x4A, 0x84, 0x0A, 0xE7, 0x33, 0x2C, 0xEB, 0xDD, 0x5F, 0xAC, 0x23, 0x1A, 0x35, 0x70, 0x43, 0x80, 0x61, 0xAE, 0xC1, 0xD0, 0x7B, 0x92, 0x49, 0x51, 0x53, 0xC4, 0x34, 0x30, 0x0C, 0x4B, 0x00, 0x04, 0x10, 0xFF, 0x63, 0x44, 0xB4, 0x0B, 0x57, 0x72, 0xF1, 0x9D, 0x19, 0xF6, 0xB2, 0x87, 0x1B, 0xEE, 0x46, 0x2A, 0xF3, 0xBF, 0x12, 0x96, 0x58, 0x2B, 0xF9, 0xB6, 0xCF, 0x22, 0x3C, 0xAB, 0x1E, 0x6C, 0x31, 0xC6, 0xF7, 0x78, 0x45, 0x17, 0xE9, 0x7E, 0x73, 0xF2, 0x55, 0xFB, 0x3F, 0x9B, 0xF4, 0xBD, 0xA4, 0x29, 0x60, 0x03, 0xB9, 0x50, 0xFA, 0x4E, 0xEF, 0x54, 0xE6, 0x7F, 0xC0, 0x67 }; unsigned char table_19[256] = { 0xEA, 0xE7, 0x13, 0x14, 0xB9, 0xC0, 0xC4, 0x42, 0x49, 0x6E, 0x2A, 0xA6, 0x65, 0x3C, 0x6A, 0x40, 0x07, 0xCD, 0x4F, 0xFE, 0xF2, 0x2D, 0xC8, 0x30, 0x9D, 0xBE, 0x1B, 0x9B, 0x4A, 0x7E, 0x9F, 0xA7, 0x78, 0xAB, 0x4D, 0x1D, 0xF1, 0x96, 0x32, 0x84, 0xFB, 0x80, 0x88, 0xE8, 0x41, 0x97, 0xDC, 0xD0, 0x4E, 0x33, 0xA4, 0x3B, 0xE0, 0xDD, 0x36, 0xC9, 0x72, 0x48, 0x8A, 0x2F, 0x35, 0xF0, 0xDF, 0x21, 0xE1, 0xE5, 0x6C, 0x9A, 0x60, 0x8F, 0xB7, 0x24, 0xE4, 0x9E, 0x8C, 0x0F, 0x3D, 0x28, 0xBB, 0xD6, 0x69, 0xA0, 0x66, 0xC7, 0xE3, 0xD8, 0x11, 0x27, 0xD9, 0x37, 0xF4, 0xF5, 0x8E, 0xD4, 0x76, 0xE2, 0xDB, 0x15, 0xA2, 0x5C, 0x9C, 0xEE, 0x44, 0xED, 0x2B, 0xB3, 0x75, 0x74, 0x71, 0x8B, 0x3A, 0x91, 0x06, 0x19, 0xC1, 0x57, 0x89, 0xCC, 0x82, 0x10, 0x17, 0xB2, 0x08, 0x70, 0x39, 0xCA, 0xBA, 0xB5, 0xAA, 0xBF, 0x02, 0xBD, 0x26, 0x58, 0x04, 0x54, 0x23, 0x4B, 0x90, 0x51, 0x6D, 0x98, 0xD5, 0xB0, 0xAF, 0x22, 0xDA, 0xB4, 0x87, 0xFC, 0x7D, 0x18, 0x6F, 0x64, 0x59, 0x09, 0x0C, 0xA5, 0x5D, 0x03, 0x0A, 0xD3, 0xCE, 0x99, 0x8D, 0xC2, 0xC3, 0x62, 0xD2, 0x83, 0x1A, 0xAC, 0x7C, 0x93, 0xD7, 0xA9, 0x16, 0xF7, 0x77, 0xE6, 0x3E, 0x05, 0x73, 0x55, 0x43, 0x95, 0x7A, 0x6B, 0x38, 0x67, 0x3F, 0xC6, 0xAD, 0x0E, 0x29, 0x46, 0x45, 0xFA, 0xBC, 0xEC, 0x5B, 0x7F, 0x0B, 0x1C, 0x01, 0x12, 0x85, 0x50, 0xF9, 0xEF, 0x25, 0x34, 0x79, 0x2E, 0xEB, 0x00, 0x5F, 0x86, 0xF8, 0x4C, 0xA8, 0x56, 0xB6, 0x5A, 0xF3, 0x31, 0x94, 0x92, 0xB1, 0xB8, 0x52, 0xD1, 0xCF, 0xCB, 0xA1, 0x81, 0x68, 0x47, 0xFF, 0xC5, 0xFD, 0x1F, 0xDE, 0x53, 0xA3, 0x2C, 0x20, 0xF6, 0x1E, 0x0D, 0xAE, 0x7B, 0x5E, 0x61, 0xE9, 0x63 }; unsigned char table_20[32] = { 0x0D, 0x0B, 0x11, 0x02, 0x05, 0x1B, 0x08, 0x1D, 0x04, 0x14, 0x01, 0x09, 0x00, 0x19, 0x1E, 0x15, 0x1F, 0x0A, 0x0F, 0x1C, 0x10, 0x16, 0x0C, 0x07, 0x13, 0x1A, 0x06, 0x17, 0x0E, 0x12, 0x18, 0x03 }; unsigned char table_21[256] = { 0x4C, 0x94, 0xAD, 0x66, 0x9E, 0x69, 0x04, 0xA8, 0x61, 0xE0, 0xE1, 0x3D, 0xFD, 0x9C, 0xFB, 0x19, 0x1E, 0x80, 0x8C, 0xA0, 0xFC, 0x27, 0x26, 0x3B, 0x48, 0x6D, 0x07, 0xE4, 0xEA, 0x17, 0x64, 0x9B, 0xD0, 0xE2, 0xD1, 0x13, 0x39, 0xF5, 0x73, 0xD3, 0x0C, 0x3A, 0x6E, 0x77, 0xFA, 0xE3, 0x2F, 0x44, 0x7E, 0x72, 0x30, 0x43, 0xD4, 0x7F, 0x36, 0xD9, 0xBD, 0x3E, 0x3F, 0x91, 0xBE, 0x54, 0x79, 0xA6, 0x7C, 0x0E, 0xC5, 0x7A, 0x70, 0xC4, 0xD7, 0xCE, 0xDA, 0xAA, 0x68, 0x8F, 0xBC, 0x96, 0x1B, 0x16, 0xA2, 0xC6, 0x67, 0x09, 0x45, 0x9F, 0xCF, 0x41, 0xC8, 0x60, 0x74, 0x99, 0x5D, 0x85, 0x5F, 0x50, 0x33, 0x52, 0x22, 0xA9, 0xB5, 0x2D, 0x98, 0x87, 0x15, 0x9A, 0xAC, 0x2C, 0xDE, 0xC0, 0xB8, 0x37, 0x88, 0x1F, 0xC1, 0x4F, 0x65, 0x0F, 0x3C, 0x84, 0x4B, 0x1A, 0xAB, 0xA4, 0x23, 0xCB, 0xB1, 0xC7, 0xDB, 0xEF, 0x40, 0x0D, 0x46, 0xE8, 0xF4, 0x71, 0x38, 0x01, 0x5C, 0x0B, 0x5E, 0xC9, 0xAF, 0xC3, 0xF6, 0xB6, 0x10, 0x1D, 0xE5, 0x8A, 0x90, 0xA7, 0xA3, 0x05, 0x4E, 0x14, 0x63, 0x25, 0x34, 0xEC, 0x6B, 0x95, 0x21, 0x55, 0xF2, 0xF0, 0x47, 0x9D, 0xF8, 0x8E, 0x02, 0x0A, 0xED, 0x97, 0xAE, 0x00, 0x2A, 0xEB, 0xB2, 0xA5, 0x32, 0x06, 0x2E, 0xFE, 0x8D, 0x7B, 0x7D, 0x35, 0x5A, 0xD2, 0xF1, 0xE9, 0xF9, 0x62, 0xB7, 0xB9, 0x53, 0x75, 0x5B, 0x8B, 0xCC, 0x6C, 0x18, 0x49, 0x89, 0x31, 0xB0, 0x92, 0x6F, 0xDF, 0x03, 0x57, 0xF3, 0x58, 0xCA, 0x2B, 0x93, 0xA1, 0xD6, 0x24, 0x29, 0xCD, 0x59, 0x1C, 0x83, 0xB3, 0x42, 0xBF, 0x82, 0xB4, 0x11, 0x4A, 0x08, 0xEE, 0x76, 0x4D, 0x12, 0xDC, 0xE6, 0xC2, 0x56, 0xBA, 0x86, 0x28, 0x6A, 0x20, 0x51, 0xF7, 0xFF, 0xD8, 0xE7, 0xDD, 0xBB, 0x78, 0xD5, 0x81 }; unsigned char table_22[32] = { 0x0B, 0x15, 0x1C, 0x0C, 0x06, 0x0A, 0x1D, 0x16, 0x12, 0x0E, 0x04, 0x11, 0x1F, 0x0F, 0x07, 0x02, 0x17, 0x13, 0x19, 0x18, 0x0D, 0x10, 0x1A, 0x05, 0x03, 0x00, 0x01, 0x08, 0x09, 0x14, 0x1B, 0x1E }; unsigned char table_23[256] = { 0x36, 0x53, 0x2D, 0xD0, 0x7A, 0xF0, 0xD5, 0x1C, 0x50, 0x61, 0x9A, 0x90, 0x0B, 0x29, 0x20, 0x77, 0xF1, 0x82, 0xFE, 0xC1, 0xA7, 0xB6, 0x78, 0x87, 0x02, 0x05, 0xCB, 0x28, 0xAE, 0xD6, 0x17, 0x1A, 0x91, 0x5D, 0xB9, 0xE2, 0xDE, 0x6A, 0x4E, 0x07, 0xAC, 0x38, 0x13, 0x3B, 0x46, 0xFD, 0xB7, 0xD1, 0x79, 0xFB, 0x58, 0x76, 0x08, 0x47, 0x95, 0xA6, 0x99, 0x9E, 0x12, 0x67, 0xC2, 0xED, 0x9C, 0x1B, 0x89, 0x71, 0xB5, 0x4A, 0xAA, 0x5F, 0x34, 0x85, 0x40, 0x2B, 0x9F, 0x37, 0x7C, 0x0F, 0xD4, 0x75, 0x48, 0x27, 0x2E, 0xC9, 0xEB, 0x06, 0xDF, 0x8C, 0x14, 0xAF, 0xEE, 0xA2, 0x74, 0x45, 0x8D, 0x70, 0x6B, 0xD7, 0x56, 0xCF, 0xBC, 0x7B, 0x01, 0xC8, 0x54, 0xB0, 0x3C, 0x39, 0xFA, 0x81, 0xDC, 0xBB, 0x0D, 0xB2, 0xAD, 0x93, 0xC7, 0x8A, 0x73, 0x6C, 0xC3, 0x04, 0x2F, 0xEF, 0x52, 0x33, 0x9D, 0x1E, 0xC5, 0x65, 0x23, 0xD8, 0xB1, 0xD2, 0xE5, 0x25, 0x2C, 0xE6, 0x92, 0xB4, 0xF7, 0xF4, 0x8F, 0x6E, 0xE8, 0x5A, 0x8E, 0x7D, 0x4C, 0xB3, 0xFF, 0x41, 0x26, 0xE3, 0x30, 0x69, 0xF8, 0x80, 0x57, 0x4F, 0xA0, 0x7F, 0x66, 0x68, 0xE1, 0x7E, 0x0E, 0x31, 0xE7, 0xEA, 0x3E, 0x8B, 0x4B, 0x94, 0xE9, 0xCD, 0x19, 0x35, 0xA3, 0x98, 0xD9, 0x5B, 0x44, 0x2A, 0xE0, 0x6D, 0xF3, 0xE4, 0x72, 0x18, 0x03, 0x59, 0x84, 0x09, 0xA1, 0x9B, 0xBD, 0xDA, 0x4D, 0x63, 0xCC, 0x3A, 0x10, 0xFC, 0x3F, 0x0A, 0x88, 0x24, 0xF5, 0x21, 0xC4, 0x6F, 0x1F, 0x42, 0x62, 0x64, 0x51, 0xDD, 0xCA, 0xF9, 0x22, 0xCE, 0xA8, 0x86, 0xBA, 0xB8, 0x5C, 0xAB, 0x32, 0x00, 0x0C, 0xF2, 0x83, 0xDB, 0xF6, 0x60, 0x3D, 0x16, 0xEC, 0x11, 0xA4, 0xBE, 0x96, 0x5E, 0x97, 0xD3, 0xA5, 0x55, 0x1D, 0x15, 0xC6, 0xBF, 0xA9, 0x43, 0xC0, 0x49 }; unsigned char table_24[256] = { 0xDC, 0x5A, 0xE6, 0x59, 0x64, 0xDA, 0x58, 0x40, 0x95, 0xF8, 0x2A, 0xE0, 0x39, 0x7E, 0x32, 0x89, 0x09, 0x93, 0xED, 0x55, 0xC3, 0x5B, 0x1A, 0xD1, 0xA5, 0x8B, 0x0F, 0x13, 0xC9, 0xE1, 0x34, 0xD0, 0xB6, 0xA2, 0xD9, 0x52, 0x57, 0x83, 0xFD, 0xE9, 0xAC, 0x73, 0x6E, 0x21, 0xF1, 0x0E, 0x25, 0xCC, 0x36, 0xFB, 0xF7, 0x92, 0x15, 0x30, 0x54, 0x91, 0xD6, 0x9E, 0xAA, 0x35, 0x70, 0xB2, 0xC0, 0x27, 0xFE, 0x04, 0xBC, 0xC7, 0x02, 0xFA, 0x7D, 0xE3, 0xBE, 0x62, 0x79, 0x2B, 0x31, 0x6A, 0x8F, 0x7F, 0x56, 0xF0, 0xB4, 0x0C, 0x1F, 0x68, 0xB7, 0xB9, 0x0B, 0x14, 0x3E, 0xA9, 0x4B, 0x03, 0x10, 0xEE, 0x2C, 0xAB, 0x8A, 0x77, 0xB1, 0xE7, 0xCA, 0xD4, 0x98, 0x01, 0xAD, 0x1E, 0x50, 0x26, 0x82, 0x44, 0xF3, 0xBF, 0xD3, 0x6B, 0x33, 0x0A, 0x3C, 0x5D, 0xCE, 0x81, 0xC5, 0x78, 0x9F, 0xB8, 0x23, 0xDB, 0x4E, 0xA1, 0x41, 0x76, 0xAE, 0x51, 0x86, 0x06, 0x7A, 0x66, 0xA0, 0x5E, 0x29, 0x17, 0x84, 0x4A, 0xB0, 0x3B, 0x3D, 0x71, 0x07, 0x7B, 0x0D, 0x9A, 0x6F, 0x9B, 0x5C, 0x88, 0xB3, 0xD7, 0x24, 0xD5, 0x48, 0xF5, 0xE8, 0xE4, 0xCF, 0x16, 0xA4, 0xC8, 0xEF, 0x42, 0x22, 0xEC, 0x47, 0x69, 0x90, 0x63, 0xE2, 0x1B, 0x87, 0x85, 0x3F, 0xDE, 0x8C, 0x60, 0x99, 0xE5, 0x8E, 0x4F, 0xF4, 0xBA, 0xB5, 0x9C, 0x37, 0x67, 0xBD, 0xA6, 0x97, 0xDD, 0xCB, 0x43, 0x45, 0x19, 0x49, 0x1C, 0x75, 0xC1, 0xBB, 0xF2, 0x46, 0xFC, 0x53, 0x9D, 0xD8, 0xA3, 0xDF, 0x2F, 0xEB, 0x72, 0x94, 0xA8, 0x6D, 0xC6, 0x28, 0x4C, 0x00, 0x38, 0xC2, 0x65, 0x05, 0x2E, 0xD2, 0x12, 0xFF, 0x18, 0x61, 0x6C, 0x7C, 0x11, 0xAF, 0x96, 0xCD, 0x20, 0x74, 0x08, 0x1D, 0xC4, 0xF9, 0x4D, 0xEA, 0x8D, 0x2D, 0x5F, 0xF6, 0xA7, 0x80, 0x3A }; unsigned char table_25[32] = { 0x0A, 0x11, 0x17, 0x03, 0x05, 0x0B, 0x18, 0x13, 0x09, 0x02, 0x00, 0x1C, 0x0C, 0x08, 0x1B, 0x14, 0x06, 0x0E, 0x01, 0x0D, 0x16, 0x1E, 0x1D, 0x19, 0x0F, 0x1A, 0x10, 0x04, 0x12, 0x15, 0x07, 0x1F }; unsigned char table_26[32] = { 0x19, 0x13, 0x1B, 0x01, 0x1C, 0x0D, 0x0C, 0x15, 0x0B, 0x00, 0x1A, 0x0F, 0x12, 0x16, 0x08, 0x0A, 0x03, 0x06, 0x14, 0x10, 0x18, 0x04, 0x11, 0x1D, 0x1F, 0x07, 0x17, 0x05, 0x02, 0x0E, 0x1E, 0x09 }; unsigned char table_27[256] = { 0x72, 0xF0, 0x14, 0xCB, 0x61, 0xA5, 0xB2, 0x02, 0x75, 0x22, 0xC3, 0x9D, 0x5A, 0x63, 0xFA, 0x5F, 0xD9, 0x55, 0x58, 0x43, 0x24, 0x7D, 0x77, 0x93, 0xBA, 0x50, 0x1D, 0xF7, 0x49, 0x18, 0xB0, 0x42, 0xBB, 0xEC, 0x52, 0x38, 0xDC, 0xC8, 0x16, 0x54, 0x17, 0x19, 0x89, 0x67, 0x33, 0x3C, 0x0A, 0xAD, 0xC9, 0xDE, 0x81, 0xED, 0xBD, 0x0E, 0x0B, 0x6D, 0x46, 0x30, 0x35, 0x2B, 0x8C, 0xA0, 0x1C, 0x0D, 0xFD, 0xA1, 0x70, 0xC6, 0xD8, 0x41, 0xB3, 0xC0, 0x44, 0xEB, 0x92, 0xBE, 0x6B, 0x98, 0x1A, 0x76, 0x71, 0xC5, 0x51, 0x56, 0x80, 0xFC, 0x01, 0x53, 0x4B, 0xD0, 0x8B, 0xD2, 0x7B, 0xE7, 0x15, 0x5D, 0xE5, 0xA6, 0x8A, 0xD3, 0x9B, 0xF4, 0x69, 0x23, 0xE8, 0xB6, 0xC7, 0xE2, 0x73, 0x9F, 0x88, 0xDF, 0xB4, 0x28, 0xEE, 0xC2, 0x94, 0xB8, 0xF9, 0x7F, 0x4A, 0x57, 0x06, 0xF6, 0xBF, 0xC1, 0xAB, 0xFB, 0xA4, 0x8E, 0xD1, 0xD7, 0xF5, 0x7C, 0xA3, 0x1E, 0x3B, 0x32, 0x03, 0xAA, 0x90, 0x5C, 0x48, 0xE0, 0xE3, 0xCF, 0xD4, 0xEF, 0x59, 0xD5, 0x1B, 0x34, 0x1F, 0x95, 0xCE, 0x7A, 0x20, 0x26, 0x87, 0xB7, 0x78, 0x9C, 0x4F, 0xA2, 0x12, 0x97, 0x27, 0x3F, 0xFF, 0x07, 0x84, 0x96, 0x04, 0xAF, 0xA8, 0xEA, 0x2C, 0x6C, 0xAE, 0x37, 0x91, 0xA9, 0x10, 0xDB, 0xCD, 0xDA, 0x08, 0x99, 0xF1, 0x4D, 0xCC, 0x68, 0x79, 0x2E, 0xB1, 0x39, 0x9E, 0xE9, 0x2F, 0x6A, 0x3D, 0x0F, 0x85, 0x8D, 0xCA, 0x29, 0x86, 0xD6, 0xDD, 0x05, 0x25, 0x3A, 0x40, 0x21, 0x45, 0xAC, 0x11, 0xF3, 0xA7, 0x09, 0x2A, 0x31, 0xE4, 0x0C, 0xF8, 0x6E, 0x3E, 0xB5, 0x82, 0xFE, 0x74, 0x13, 0x65, 0xE1, 0x2D, 0x8F, 0xE6, 0xC4, 0x00, 0x5B, 0x4E, 0xB9, 0x66, 0xF2, 0x62, 0x36, 0x4C, 0x83, 0x5E, 0x6F, 0x47, 0x64, 0xBC, 0x9A, 0x60, 0x7E }; unsigned char table_28[32] = { 0x15, 0x05, 0x08, 0x19, 0x02, 0x18, 0x1E, 0x07, 0x0D, 0x0C, 0x1A, 0x06, 0x17, 0x03, 0x10, 0x09, 0x01, 0x11, 0x1C, 0x04, 0x0F, 0x1F, 0x12, 0x0B, 0x1B, 0x13, 0x0A, 0x16, 0x0E, 0x00, 0x1D, 0x14 }; unsigned char table_29[256] = { 0x34, 0x59, 0x05, 0x13, 0x09, 0x1D, 0xDF, 0x77, 0x11, 0xA5, 0x92, 0x27, 0xCD, 0x7B, 0x5E, 0x80, 0xF9, 0x50, 0x18, 0x24, 0xD4, 0x70, 0x4A, 0x39, 0x66, 0xA4, 0xDB, 0xE9, 0xED, 0x48, 0xD9, 0xE7, 0x32, 0xDA, 0x53, 0x8F, 0x72, 0xE1, 0xF6, 0xFE, 0xD3, 0xAD, 0xA6, 0x1F, 0xB9, 0xD1, 0x0F, 0x4C, 0x23, 0x90, 0x68, 0xBC, 0x4B, 0x9B, 0x3D, 0xAB, 0xF0, 0x94, 0x4F, 0x1C, 0x07, 0x65, 0x7F, 0x01, 0x5C, 0xD7, 0x21, 0x8C, 0xBF, 0x8E, 0xB8, 0x86, 0x6C, 0x33, 0x36, 0xC1, 0x06, 0x74, 0x37, 0x84, 0x41, 0xAE, 0x67, 0x29, 0xB4, 0x85, 0xCE, 0x2A, 0xCB, 0x1E, 0x61, 0x9E, 0x7A, 0x44, 0x3E, 0x89, 0x14, 0x20, 0x19, 0xBB, 0xE0, 0xAA, 0xCF, 0x83, 0xA8, 0x93, 0x43, 0xF2, 0xAC, 0x0E, 0xD2, 0xCC, 0xDD, 0x47, 0x58, 0xC9, 0xCA, 0x1B, 0x54, 0x6E, 0x8A, 0x79, 0xF8, 0xC4, 0xFB, 0xD5, 0x91, 0xDE, 0x12, 0x31, 0x99, 0xFA, 0x6D, 0xC8, 0x57, 0xEC, 0xB7, 0x28, 0x0C, 0x52, 0xF1, 0x0D, 0xB1, 0x9A, 0x26, 0x98, 0x16, 0x7D, 0xD0, 0x2E, 0x8B, 0xD8, 0xE6, 0xE8, 0x30, 0xFD, 0x7C, 0x64, 0x5A, 0xBD, 0x87, 0xE2, 0xA1, 0x3F, 0xC3, 0x38, 0x96, 0xA3, 0x2D, 0xF3, 0x3A, 0xEE, 0xC0, 0x10, 0xEA, 0x6F, 0x8D, 0x03, 0xF4, 0x51, 0x97, 0x7E, 0x56, 0x42, 0x3C, 0x5D, 0x5F, 0xF5, 0x6A, 0xAF, 0xE4, 0xBE, 0xBA, 0x78, 0xA0, 0x5B, 0x49, 0xA7, 0xC7, 0x9C, 0x63, 0x6B, 0x00, 0x17, 0x69, 0x75, 0x3B, 0x40, 0xEF, 0x45, 0xB5, 0x2B, 0x2F, 0x02, 0xC6, 0x22, 0x9F, 0xFC, 0x73, 0x08, 0x81, 0xB2, 0x2C, 0x71, 0x35, 0xA2, 0xE3, 0xB3, 0x9D, 0xC5, 0x0A, 0xC2, 0x25, 0x82, 0xDC, 0x88, 0xA9, 0xE5, 0xF7, 0xEB, 0xD6, 0x60, 0x76, 0x55, 0x0B, 0x4E, 0xFF, 0x1A, 0x46, 0x62, 0xB6, 0xB0, 0x15, 0x04, 0x95, 0x4D }; unsigned char table_30[32] = { 0x00, 0x1C, 0x0E, 0x0C, 0x06, 0x16, 0x09, 0x12, 0x01, 0x13, 0x0B, 0x14, 0x11, 0x08, 0x04, 0x18, 0x10, 0x1B, 0x15, 0x03, 0x02, 0x19, 0x1A, 0x17, 0x1E, 0x1F, 0x0F, 0x07, 0x0D, 0x05, 0x1D, 0x0A }; unsigned char table_31[256] = { 0xDF, 0xD8, 0x3F, 0xBC, 0x5F, 0xC9, 0x8E, 0x4C, 0x0B, 0x3C, 0xE5, 0xBF, 0x39, 0xD5, 0x30, 0xDD, 0x23, 0xC7, 0x72, 0x63, 0x1F, 0xF8, 0x96, 0x31, 0x70, 0xD6, 0x9E, 0xE8, 0x9D, 0xF5, 0xEF, 0x65, 0xC2, 0x50, 0x62, 0x77, 0xD3, 0x6C, 0x1A, 0x91, 0xBB, 0xFF, 0xCD, 0x9B, 0xB6, 0xBA, 0xB8, 0x7A, 0x14, 0xA7, 0x74, 0x89, 0xD4, 0x6E, 0x19, 0x69, 0xAB, 0x01, 0x15, 0x0E, 0x87, 0x55, 0x79, 0x1C, 0x18, 0xBE, 0xA8, 0xDB, 0x52, 0xD2, 0x8F, 0x7E, 0x81, 0xAF, 0xFD, 0x5C, 0x3E, 0x1B, 0xB9, 0xB2, 0xB7, 0x51, 0x57, 0x8C, 0xCF, 0x5B, 0xA4, 0x75, 0xDE, 0x22, 0x8B, 0x10, 0x12, 0xC8, 0x35, 0x2D, 0x45, 0xB5, 0xF0, 0x47, 0x88, 0x16, 0xEB, 0x67, 0xD9, 0x0C, 0xF1, 0xC1, 0x34, 0x33, 0xC6, 0x78, 0xB3, 0x26, 0xE3, 0xBD, 0x5D, 0x4E, 0x66, 0xE4, 0xD7, 0xC4, 0xE6, 0xA1, 0xB0, 0x95, 0x2B, 0x9A, 0x4A, 0x3A, 0xCB, 0x40, 0xE1, 0x60, 0x49, 0xCC, 0x03, 0xAC, 0xF4, 0x97, 0x32, 0x0F, 0x38, 0x17, 0xF9, 0xE0, 0xD1, 0xFB, 0x04, 0x5E, 0x68, 0x06, 0xAE, 0xFA, 0xAA, 0xED, 0x24, 0x0D, 0x00, 0x61, 0x20, 0xA3, 0x7B, 0x6B, 0x76, 0x27, 0xEA, 0xCE, 0x6A, 0x82, 0x9F, 0x6D, 0x9C, 0x64, 0xA2, 0x11, 0x37, 0x2A, 0xCA, 0x84, 0x25, 0x7C, 0x2F, 0x8D, 0x90, 0xE7, 0x09, 0x93, 0xF3, 0x43, 0x71, 0xEC, 0xA9, 0x7D, 0x94, 0xA6, 0x3D, 0x7F, 0x54, 0x44, 0x99, 0x80, 0x41, 0xC0, 0xA0, 0x8A, 0x1E, 0xDC, 0x08, 0xD0, 0x2E, 0x42, 0x05, 0x85, 0x86, 0xFE, 0x3B, 0x59, 0xC3, 0x58, 0x13, 0xB4, 0x36, 0xA5, 0x73, 0x28, 0x29, 0xDA, 0x4F, 0x1D, 0xB1, 0x53, 0x46, 0x2C, 0xF2, 0x4D, 0xAD, 0xFC, 0x83, 0x02, 0x6F, 0x07, 0xE9, 0xEE, 0x21, 0x98, 0x5A, 0xC5, 0x92, 0x48, 0xF7, 0x0A, 0xF6, 0xE2, 0x4B, 0x56 }; unsigned char table_32[256] = { 0x7B, 0x0F, 0x56, 0x2F, 0x1E, 0x2A, 0x7A, 0xD1, 0x02, 0x91, 0x4E, 0x37, 0x6C, 0x10, 0xA7, 0xF2, 0x38, 0xAC, 0x9E, 0x2B, 0x5E, 0x23, 0xE3, 0x19, 0x9B, 0xF6, 0xB0, 0x59, 0x14, 0xB9, 0xA9, 0x46, 0x84, 0x1D, 0xC0, 0x98, 0xF3, 0xE1, 0xE8, 0x94, 0x52, 0x35, 0xBA, 0xD8, 0x07, 0xEF, 0x31, 0xF8, 0x03, 0x76, 0x9C, 0xD7, 0xE4, 0x8B, 0xAF, 0x60, 0xDD, 0x51, 0x00, 0xDF, 0x11, 0x7F, 0x1C, 0xED, 0x49, 0xC9, 0xF4, 0x87, 0x64, 0xFC, 0x5D, 0xAD, 0x88, 0x85, 0xF7, 0x5A, 0x92, 0xDB, 0x72, 0x1A, 0x83, 0x15, 0x30, 0x24, 0x9F, 0xFF, 0x5B, 0xF1, 0xD2, 0xFD, 0xC2, 0xB5, 0x25, 0x22, 0x18, 0x3D, 0xCD, 0x97, 0x8C, 0xCC, 0x78, 0x90, 0xAA, 0x5F, 0x0A, 0x57, 0x05, 0x61, 0xD4, 0xA0, 0x3A, 0xDE, 0x3B, 0xF9, 0x65, 0x68, 0x4F, 0x28, 0xFA, 0xEB, 0x63, 0x2D, 0x8D, 0xD0, 0xA1, 0xFE, 0x12, 0x96, 0x3C, 0x42, 0x29, 0xD6, 0xA4, 0x34, 0xBD, 0x70, 0x89, 0xBE, 0xF5, 0x79, 0xAB, 0x8F, 0x32, 0xB4, 0xEE, 0xE7, 0x2C, 0x04, 0x4B, 0xD5, 0xB1, 0x54, 0xF0, 0xDA, 0x16, 0x77, 0xA6, 0x53, 0xB2, 0xE2, 0x73, 0xBF, 0x17, 0xA8, 0x75, 0x26, 0xE0, 0xBC, 0x0C, 0x71, 0xFB, 0x6D, 0x7E, 0xC5, 0xEA, 0x21, 0x9D, 0x95, 0x8E, 0xA5, 0x48, 0xB8, 0x7D, 0xCB, 0x01, 0x99, 0xE5, 0xBB, 0x82, 0xC4, 0xCA, 0xC1, 0x58, 0x6E, 0x5C, 0x7C, 0xDC, 0x33, 0xB6, 0xC3, 0x09, 0xC7, 0x1F, 0x0D, 0x43, 0x6F, 0xE9, 0x86, 0x27, 0xC8, 0x44, 0xB3, 0xD3, 0xCF, 0x08, 0x66, 0x1B, 0x20, 0x4D, 0xD9, 0xC6, 0x36, 0x40, 0x74, 0x62, 0x6A, 0x55, 0xEC, 0x06, 0x2E, 0xE6, 0x80, 0x13, 0x93, 0x50, 0xCE, 0x69, 0x3E, 0x67, 0x4A, 0x81, 0x4C, 0x0B, 0x3F, 0xB7, 0x0E, 0x39, 0xAE, 0x47, 0x6B, 0x8A, 0xA2, 0x9A, 0xA3, 0x45, 0x41 }; unsigned char table_33[256] = { 0xDE, 0xD3, 0x79, 0x67, 0x13, 0x5C, 0x04, 0xF2, 0xD9, 0x9F, 0x65, 0x56, 0xCC, 0x3B, 0xA4, 0x9A, 0x08, 0xBF, 0x26, 0xB2, 0xA7, 0x5E, 0xAA, 0xCA, 0xBB, 0x2B, 0x38, 0x3F, 0xD8, 0x87, 0xFA, 0x5D, 0x73, 0x8E, 0x1E, 0x93, 0x05, 0xAF, 0x3E, 0x4E, 0x90, 0xDB, 0x0B, 0x33, 0x0D, 0x2F, 0x86, 0x4F, 0xFD, 0xD0, 0x39, 0xB1, 0x8A, 0x1A, 0x20, 0xE6, 0xCF, 0xA2, 0x82, 0xDF, 0x42, 0x9C, 0x30, 0x40, 0xE3, 0xB0, 0x88, 0x5A, 0xEC, 0x25, 0xE2, 0xC4, 0x12, 0x54, 0x50, 0x97, 0x96, 0x21, 0x23, 0x7B, 0x1D, 0x61, 0x52, 0x34, 0x7D, 0x69, 0x16, 0xC3, 0x31, 0xF8, 0x48, 0x19, 0x95, 0x01, 0x29, 0x8C, 0x15, 0xAC, 0x84, 0x74, 0xAB, 0x70, 0xDA, 0x36, 0xD6, 0x8F, 0xFE, 0x35, 0xD7, 0x2E, 0x89, 0x07, 0x62, 0x17, 0xDC, 0x92, 0x45, 0x83, 0xB5, 0xE5, 0x8B, 0xC0, 0x27, 0x85, 0x7C, 0x9D, 0x55, 0x81, 0x71, 0xCD, 0xC9, 0x00, 0x02, 0xC1, 0x0A, 0x37, 0xED, 0xEA, 0xC2, 0x98, 0x49, 0x06, 0x1C, 0x78, 0x64, 0xCE, 0x9E, 0x4C, 0x7A, 0xB4, 0x43, 0x0F, 0xE0, 0x7E, 0xBC, 0x5B, 0x51, 0xE7, 0x18, 0xF9, 0x11, 0xA1, 0xF5, 0xC7, 0xCB, 0x4D, 0x6A, 0x0E, 0x57, 0xF1, 0xFB, 0xB3, 0x99, 0xF0, 0x32, 0xD5, 0xA9, 0x4B, 0x6F, 0x6D, 0xA8, 0xC5, 0xDD, 0x7F, 0xEB, 0xBE, 0xFC, 0x2C, 0x22, 0x58, 0x03, 0x9B, 0x77, 0xF7, 0xBD, 0xBA, 0xD2, 0x6B, 0xAD, 0x5F, 0x10, 0x6E, 0x09, 0xD1, 0x1B, 0x24, 0xEF, 0x72, 0x3D, 0x59, 0x28, 0xE1, 0xB7, 0x44, 0x8D, 0xB8, 0xAE, 0x2D, 0x60, 0xA6, 0xC8, 0x0C, 0xF4, 0x41, 0xA3, 0x68, 0x46, 0x6C, 0x76, 0xA0, 0xB6, 0x66, 0xE4, 0x1F, 0x75, 0x4A, 0xFF, 0x2A, 0x94, 0xD4, 0xF3, 0xE9, 0x91, 0x63, 0xA5, 0xB9, 0xE8, 0x14, 0x80, 0x3C, 0xEE, 0x47, 0xC6, 0x3A, 0x53, 0xF6 }; unsigned char table_34[256] = { 0xF0, 0xE9, 0x3E, 0xD6, 0x89, 0xC8, 0xC7, 0x23, 0x75, 0x26, 0x5F, 0x9C, 0x57, 0xB8, 0x2A, 0x29, 0xE5, 0xB5, 0x68, 0xA4, 0x92, 0x46, 0x40, 0x7F, 0xF2, 0xBC, 0x6A, 0xE0, 0x8F, 0x0F, 0xE4, 0x3A, 0xE1, 0x30, 0x84, 0x6E, 0x82, 0x8E, 0x56, 0xC5, 0x32, 0x85, 0xFB, 0x59, 0x43, 0x41, 0xC2, 0xF6, 0x67, 0x5A, 0x7C, 0x34, 0xA1, 0xD0, 0x4B, 0xAC, 0x61, 0x72, 0x6B, 0xAF, 0xC4, 0x20, 0x9A, 0xD4, 0x74, 0x8D, 0x87, 0x83, 0xE2, 0x62, 0x6D, 0xE6, 0xE7, 0xF9, 0x76, 0xCB, 0x18, 0x90, 0x4F, 0xFF, 0xD3, 0x3C, 0x08, 0x79, 0x93, 0x2D, 0x95, 0xA3, 0xDD, 0x5B, 0xDA, 0x7A, 0x39, 0x4D, 0xC1, 0x2E, 0xCC, 0x53, 0xE8, 0xA2, 0xCF, 0x15, 0x78, 0x1C, 0xEB, 0x9B, 0x7B, 0xAD, 0x31, 0x2F, 0xE3, 0xC9, 0x3B, 0xEC, 0x2C, 0x49, 0x02, 0x52, 0x28, 0xBA, 0x0C, 0x19, 0x24, 0xF7, 0x97, 0x09, 0xA6, 0xA0, 0xDF, 0xD1, 0xD2, 0xDC, 0x51, 0xA5, 0x94, 0xFD, 0x71, 0xF5, 0x50, 0x0A, 0x69, 0x25, 0x88, 0x5C, 0x91, 0xD5, 0x47, 0x0B, 0x27, 0x13, 0x96, 0xD9, 0xF1, 0xA9, 0x70, 0xC3, 0xBE, 0x42, 0x4E, 0x4A, 0xB1, 0x07, 0xA7, 0x54, 0xFE, 0x48, 0x9F, 0x63, 0x17, 0xAE, 0xB9, 0x58, 0x21, 0x35, 0xED, 0x5D, 0x9D, 0x3D, 0xB4, 0xFC, 0xEA, 0x8C, 0x80, 0xA8, 0x1E, 0xB0, 0xDE, 0x0D, 0x11, 0x6F, 0x04, 0x12, 0xF4, 0x10, 0x64, 0x0E, 0xD7, 0x2B, 0xB3, 0x8B, 0xB7, 0x01, 0x86, 0xCA, 0xFA, 0x9E, 0xEE, 0x66, 0x37, 0x65, 0x81, 0x38, 0x1F, 0xAA, 0x73, 0xAB, 0xBD, 0xDB, 0x14, 0xCD, 0x00, 0xBB, 0x98, 0x44, 0x45, 0xB6, 0x99, 0x5E, 0xD8, 0x1D, 0x36, 0xF8, 0x55, 0x6C, 0x16, 0x7E, 0x77, 0x3F, 0x22, 0xEF, 0xF3, 0x7D, 0xC6, 0xCE, 0x8A, 0xB2, 0x33, 0x4C, 0x03, 0x05, 0xBF, 0x06, 0x1B, 0xC0, 0x1A, 0x60 }; unsigned char table_35[256] = { 0xCC, 0x40, 0xEF, 0x1F, 0xDB, 0xE5, 0x71, 0x51, 0x3B, 0x0F, 0x7D, 0x9C, 0x83, 0x17, 0x6F, 0x8F, 0x13, 0xDC, 0x7F, 0xA9, 0xA5, 0xA2, 0x9D, 0xDF, 0xE7, 0x97, 0x2A, 0x30, 0xF2, 0x73, 0xCF, 0x87, 0x29, 0xB3, 0x86, 0x43, 0x09, 0xB0, 0x2E, 0x10, 0x8E, 0xBC, 0x57, 0xBA, 0x68, 0xF5, 0xCB, 0x89, 0x32, 0xC1, 0x6B, 0x1E, 0xAC, 0xB2, 0x2D, 0x6A, 0x50, 0xEB, 0x18, 0x06, 0xD8, 0xC7, 0x36, 0x31, 0xC5, 0xAF, 0x12, 0x15, 0xB7, 0x37, 0x4E, 0x01, 0x14, 0x21, 0x44, 0x5E, 0xF4, 0xB4, 0xE4, 0x65, 0xFE, 0x8A, 0xEA, 0x0D, 0xBB, 0x45, 0x8B, 0x25, 0x80, 0x35, 0x61, 0xA8, 0x4A, 0x47, 0xAB, 0x91, 0x1B, 0x1C, 0x05, 0x4D, 0x5A, 0xD4, 0xF1, 0x9B, 0x0E, 0x98, 0xCA, 0x96, 0x42, 0x7E, 0x03, 0x5F, 0xE2, 0x90, 0xBF, 0x82, 0xC9, 0x3D, 0xE0, 0x5C, 0xFA, 0x3E, 0x41, 0x11, 0x79, 0x58, 0x24, 0x2C, 0xC0, 0x28, 0x5D, 0xA3, 0xDE, 0x67, 0xFF, 0xA4, 0x63, 0xB1, 0x22, 0x04, 0xFD, 0x70, 0x39, 0x46, 0xAA, 0x0A, 0x34, 0x6C, 0xD7, 0x92, 0xA1, 0x3C, 0x19, 0xD5, 0xFC, 0xAD, 0x85, 0x07, 0x00, 0x23, 0xF8, 0x69, 0x56, 0x53, 0x55, 0x7A, 0xB8, 0xC8, 0xDA, 0xCE, 0xF3, 0x5B, 0x49, 0xE1, 0xBE, 0xEC, 0x1A, 0x88, 0x02, 0xBD, 0xF7, 0x1D, 0x64, 0xA0, 0x4F, 0xD9, 0xE3, 0x95, 0xC6, 0x48, 0x2B, 0xED, 0x9A, 0x9E, 0x26, 0x6E, 0xD1, 0x94, 0xB9, 0x93, 0xDD, 0xF6, 0xA6, 0xFB, 0xC2, 0xB6, 0x0C, 0xE9, 0x77, 0xF9, 0xCD, 0x08, 0xEE, 0x3F, 0xE6, 0x75, 0xD6, 0x84, 0x76, 0x8C, 0xF0, 0xAE, 0xD2, 0x78, 0x2F, 0x4B, 0x16, 0x4C, 0x27, 0x81, 0x6D, 0x99, 0x38, 0xD3, 0x54, 0x62, 0x74, 0x20, 0x60, 0xC3, 0x7C, 0x8D, 0x72, 0x0B, 0x52, 0xE8, 0xA7, 0x3A, 0x59, 0xC4, 0x9F, 0xD0, 0x66, 0x7B, 0x33, 0xB5 }; unsigned char table_36[256] = { 0xDB, 0x6F, 0xFE, 0xB3, 0x5C, 0x1F, 0xB8, 0xBF, 0xA3, 0x71, 0x11, 0x56, 0x90, 0xE2, 0x63, 0x18, 0x83, 0x51, 0x21, 0xEB, 0x66, 0x08, 0xA6, 0xA5, 0x1C, 0xF5, 0x14, 0x24, 0x41, 0x33, 0xA7, 0xB5, 0xC7, 0x79, 0x57, 0x50, 0x85, 0xE1, 0x6D, 0xF7, 0x0E, 0xDE, 0x67, 0xAB, 0xA1, 0x0B, 0xD9, 0x4A, 0xCA, 0x36, 0xEA, 0xDA, 0x16, 0xEF, 0x9F, 0x0A, 0x09, 0x9A, 0x1D, 0xC5, 0xD7, 0x5F, 0x19, 0xDC, 0x15, 0x06, 0xE8, 0x94, 0x0C, 0x0D, 0xC9, 0x7C, 0xD6, 0x62, 0xBB, 0x49, 0xF9, 0x61, 0x07, 0x9B, 0x28, 0xC3, 0x9E, 0xF4, 0x38, 0x78, 0x20, 0x03, 0xA2, 0x7F, 0xC2, 0x9D, 0x5E, 0x65, 0x52, 0x17, 0x2E, 0x1B, 0xB0, 0x42, 0xBC, 0xFD, 0xF1, 0xD2, 0xF6, 0x60, 0xD3, 0x29, 0x97, 0x3D, 0x0F, 0xB1, 0x2F, 0x22, 0xDD, 0x80, 0x32, 0xF8, 0xAD, 0x70, 0xB9, 0x8F, 0x37, 0xCE, 0x46, 0x58, 0xB7, 0x30, 0xED, 0x7A, 0xE9, 0xC0, 0x7D, 0x13, 0x64, 0x23, 0x4E, 0xC8, 0xF0, 0xCC, 0x3B, 0x45, 0x68, 0x8D, 0xBE, 0x8B, 0xD8, 0x43, 0x02, 0x27, 0xE4, 0xAA, 0x10, 0xF2, 0x59, 0x72, 0x40, 0x26, 0x69, 0xE5, 0x05, 0x84, 0x4F, 0xE0, 0x6B, 0xC1, 0xAC, 0x4C, 0xFB, 0x31, 0x77, 0x8E, 0xD4, 0x12, 0xA9, 0xB4, 0xEC, 0x00, 0x76, 0x1E, 0x25, 0xAE, 0xE7, 0x3C, 0x35, 0x93, 0x9C, 0xC4, 0xFC, 0x2D, 0x91, 0x04, 0xAF, 0x53, 0x3F, 0xE6, 0xA4, 0xD0, 0x1A, 0xDF, 0x3A, 0x55, 0x99, 0x01, 0xCB, 0x6C, 0x82, 0x3E, 0x5D, 0xA8, 0x88, 0x54, 0x5B, 0x95, 0xCD, 0x8C, 0x81, 0x34, 0xD1, 0x39, 0xFF, 0xEE, 0xFA, 0x8A, 0x6E, 0x86, 0x92, 0x89, 0xF3, 0x6A, 0xBA, 0x2C, 0xD5, 0x44, 0xC6, 0x96, 0xBD, 0xB2, 0x2B, 0x87, 0x74, 0xA0, 0x73, 0x5A, 0x2A, 0x98, 0x75, 0x47, 0x4B, 0xB6, 0x7B, 0x4D, 0xCF, 0x7E, 0x48, 0xE3 }; unsigned char table_37[256] = { 0x1F, 0xD6, 0xB1, 0xB3, 0x40, 0xAD, 0xDE, 0xB7, 0x19, 0xB4, 0xE7, 0x0B, 0x9C, 0x2D, 0xE0, 0xF5, 0xCF, 0x2C, 0x30, 0x65, 0x2F, 0xCD, 0x02, 0x91, 0xCE, 0x2B, 0xBF, 0x78, 0xE6, 0xFA, 0x51, 0x48, 0xFB, 0x4D, 0xBE, 0x71, 0x1A, 0x56, 0xFD, 0x81, 0x33, 0x75, 0x89, 0x96, 0x37, 0x82, 0x9E, 0x93, 0x41, 0x18, 0x5B, 0x2E, 0x22, 0x0F, 0xAF, 0x4B, 0xB9, 0xD5, 0xEE, 0x6C, 0xE4, 0x05, 0xCC, 0x99, 0xE5, 0x3B, 0x62, 0xBD, 0x7B, 0xAA, 0x4A, 0xE2, 0x34, 0x43, 0xF7, 0x39, 0xFE, 0x14, 0x1D, 0xE3, 0xF0, 0xA7, 0x77, 0xDF, 0xA0, 0xD3, 0xAC, 0xD9, 0xEA, 0x76, 0xDD, 0xA4, 0xC5, 0xC9, 0x61, 0xF3, 0xA8, 0xB0, 0x35, 0xE8, 0x68, 0xD4, 0x15, 0xF9, 0x97, 0xED, 0x25, 0x0A, 0x88, 0x8F, 0x06, 0xA3, 0x16, 0x36, 0x32, 0xA2, 0xC6, 0x64, 0xD7, 0x94, 0xD2, 0x6D, 0x74, 0xFC, 0x44, 0x27, 0x5C, 0xFF, 0x60, 0x1E, 0x58, 0x8B, 0x5E, 0xC7, 0x90, 0x17, 0x63, 0xAE, 0xC3, 0x12, 0x13, 0x84, 0xEC, 0x49, 0xA5, 0x9B, 0x31, 0x8D, 0xE1, 0x79, 0xF1, 0x00, 0x28, 0x3D, 0xC2, 0x55, 0x20, 0x52, 0x95, 0x7E, 0x42, 0x1C, 0x66, 0x92, 0x7D, 0xB6, 0xC4, 0xF4, 0x80, 0xB2, 0x72, 0x6E, 0x11, 0xF6, 0x0D, 0x5A, 0xEF, 0x9D, 0x69, 0x9A, 0x45, 0x67, 0x3F, 0xDA, 0x8E, 0x57, 0x09, 0x7C, 0x38, 0xA6, 0x83, 0x87, 0x7A, 0x08, 0x4C, 0x5F, 0x85, 0x7F, 0xD0, 0x04, 0x50, 0xCB, 0xB8, 0x07, 0x24, 0x26, 0x29, 0x46, 0x01, 0x03, 0xC1, 0xD8, 0xDC, 0x0E, 0x3C, 0x4F, 0x53, 0x4E, 0xB5, 0xF8, 0xC0, 0x8A, 0xF2, 0xBB, 0xE9, 0x5D, 0x2A, 0xBA, 0x0C, 0x1B, 0x3A, 0xA9, 0x21, 0x6A, 0x70, 0xBC, 0xEB, 0xA1, 0x54, 0x10, 0x98, 0x9F, 0x23, 0xD1, 0x6B, 0x59, 0x3E, 0xCA, 0x73, 0xC8, 0x86, 0x47, 0xDB, 0xAB, 0x6F, 0x8C }; unsigned char table_38[256] = { 0xAA, 0x8D, 0x37, 0x94, 0x99, 0xDD, 0x70, 0x77, 0x78, 0xC9, 0x0F, 0xFA, 0xE2, 0x05, 0xC2, 0x16, 0x02, 0x4D, 0x44, 0x65, 0xAC, 0xB0, 0x39, 0xF8, 0x06, 0x60, 0xD8, 0xE1, 0x19, 0xB4, 0x36, 0x20, 0x59, 0x1D, 0xAD, 0xE4, 0xE8, 0xFF, 0x9D, 0x0D, 0x51, 0x28, 0xE7, 0x8C, 0x0E, 0x97, 0xE3, 0xAE, 0x6A, 0x27, 0x98, 0xDB, 0x26, 0xF6, 0xEC, 0xC6, 0xC0, 0xBD, 0x68, 0x61, 0x83, 0x86, 0xE0, 0x2C, 0xEE, 0x47, 0xF9, 0x5F, 0x6D, 0xBA, 0xE9, 0x72, 0x8A, 0xBB, 0x08, 0x29, 0xAF, 0x1C, 0xD3, 0x5D, 0xF7, 0x87, 0x6F, 0x9A, 0x2F, 0x11, 0xD9, 0x90, 0x66, 0x8E, 0xEB, 0xB1, 0x2E, 0xEA, 0xA3, 0x55, 0x2B, 0xCC, 0x4C, 0x4B, 0x48, 0x71, 0x3B, 0xFC, 0xA4, 0x45, 0x0A, 0x8F, 0x7A, 0x13, 0x01, 0x22, 0xC1, 0xF1, 0xA2, 0xB8, 0x7C, 0xF4, 0xB3, 0xB7, 0x5B, 0xE5, 0x07, 0x50, 0x7E, 0x18, 0xEF, 0x91, 0x5C, 0x15, 0x69, 0xBE, 0x0C, 0x93, 0x56, 0x35, 0x7B, 0xCF, 0x34, 0x74, 0x3E, 0x5E, 0x31, 0x21, 0x12, 0x63, 0x7F, 0x2A, 0x9B, 0xD4, 0x6B, 0xBC, 0x33, 0x62, 0x30, 0x75, 0x17, 0x23, 0xB2, 0xF0, 0x57, 0x67, 0x95, 0x3D, 0xCD, 0x10, 0xE6, 0xC8, 0x8B, 0xA9, 0x73, 0xC4, 0x43, 0xBF, 0xA7, 0xCA, 0xB5, 0xD5, 0xD6, 0x3F, 0x1A, 0x7D, 0x82, 0xA8, 0x40, 0x64, 0xAB, 0x04, 0xC3, 0x1F, 0xA0, 0x5A, 0x85, 0xF3, 0xDE, 0xFE, 0xDA, 0x1E, 0x81, 0x92, 0x9C, 0x2D, 0x9F, 0x32, 0xB9, 0xA1, 0x96, 0xD0, 0x4F, 0x38, 0x80, 0xCB, 0x6C, 0x14, 0x84, 0x1B, 0xD7, 0xC5, 0xED, 0xD2, 0x3A, 0x0B, 0x88, 0xFD, 0xDC, 0x49, 0x9E, 0xF5, 0xF2, 0x52, 0xA6, 0x24, 0xC7, 0xB6, 0x03, 0x3C, 0xD1, 0x54, 0x41, 0xDF, 0x89, 0x58, 0x79, 0xFB, 0x6E, 0xA5, 0x42, 0x25, 0x09, 0x76, 0x00, 0x46, 0x4E, 0x53, 0xCE, 0x4A }; unsigned char table_39[32] = { 0x12, 0x18, 0x0E, 0x08, 0x16, 0x05, 0x06, 0x00, 0x11, 0x17, 0x15, 0x1B, 0x14, 0x01, 0x1F, 0x19, 0x04, 0x0D, 0x0A, 0x0F, 0x10, 0x07, 0x1D, 0x03, 0x0B, 0x13, 0x0C, 0x09, 0x1E, 0x02, 0x1A, 0x1C }; unsigned char table_40[32] = { 0x16, 0x02, 0x06, 0x0E, 0x0D, 0x1C, 0x08, 0x0A, 0x0F, 0x13, 0x0B, 0x18, 0x07, 0x04, 0x14, 0x01, 0x1B, 0x05, 0x17, 0x1E, 0x11, 0x1A, 0x10, 0x1F, 0x12, 0x19, 0x1D, 0x03, 0x0C, 0x00, 0x09, 0x15 }; unsigned char table_41[32] = { 0x13, 0x18, 0x04, 0x1F, 0x1D, 0x11, 0x03, 0x00, 0x10, 0x12, 0x06, 0x0A, 0x1C, 0x07, 0x15, 0x0E, 0x08, 0x05, 0x0C, 0x09, 0x01, 0x02, 0x16, 0x0B, 0x1A, 0x17, 0x14, 0x1E, 0x0D, 0x0F, 0x19, 0x1B }; unsigned char table_42[32] = { 0x00, 0x08, 0x15, 0x1D, 0x05, 0x18, 0x06, 0x07, 0x1F, 0x01, 0x0B, 0x03, 0x19, 0x13, 0x02, 0x1C, 0x17, 0x11, 0x0E, 0x1E, 0x0C, 0x0F, 0x09, 0x1A, 0x1B, 0x16, 0x10, 0x0D, 0x0A, 0x14, 0x12, 0x04 }; unsigned char table_43[256] = { 0x34, 0xB7, 0x36, 0x85, 0x5F, 0x93, 0x98, 0x70, 0x1E, 0x59, 0x83, 0x60, 0x6F, 0xBF, 0xF9, 0xD0, 0xB3, 0x22, 0x12, 0x38, 0xF5, 0x01, 0xC9, 0x5B, 0xEF, 0x1D, 0x81, 0x64, 0xFA, 0x8F, 0x7F, 0xBC, 0x05, 0x08, 0xE0, 0x8B, 0xE8, 0x86, 0x95, 0xCB, 0xCA, 0x5A, 0xEB, 0x10, 0x92, 0xE2, 0x7E, 0x28, 0xD9, 0xC7, 0x0D, 0x24, 0xA7, 0x02, 0x0B, 0xF1, 0x7B, 0xD3, 0xFE, 0x2B, 0x89, 0x0E, 0xAE, 0xAD, 0xC8, 0x82, 0x79, 0x43, 0x96, 0xDE, 0x0C, 0x9A, 0x57, 0x84, 0xB4, 0x19, 0xF8, 0xF0, 0xAF, 0xBE, 0x99, 0x9F, 0x46, 0xE4, 0x31, 0xDF, 0x30, 0x51, 0xD4, 0xE5, 0xFC, 0x32, 0x04, 0x56, 0x7D, 0x33, 0xF7, 0x18, 0x23, 0x4E, 0xC2, 0x7C, 0x6C, 0xD2, 0xB1, 0x9B, 0x40, 0xA2, 0x88, 0x00, 0xA1, 0xAB, 0xC6, 0x5C, 0x87, 0x3B, 0xD7, 0x27, 0x2E, 0x45, 0xDA, 0x8E, 0x61, 0x5E, 0xFB, 0x09, 0x5D, 0x6B, 0xA3, 0x29, 0x4F, 0xAC, 0xD1, 0x77, 0x4A, 0xA9, 0xC4, 0x7A, 0x15, 0xD8, 0xAA, 0x17, 0xB9, 0x2D, 0xE7, 0xBD, 0x2C, 0x62, 0x2F, 0xB2, 0xED, 0x3F, 0x48, 0x26, 0x1B, 0x35, 0x20, 0x72, 0x4D, 0xFF, 0xBB, 0x78, 0x1F, 0xCC, 0xEC, 0xA8, 0x9D, 0x90, 0x4B, 0x13, 0xE1, 0xBA, 0xF3, 0x3C, 0x42, 0x65, 0x14, 0xDD, 0x75, 0xE3, 0x4C, 0x74, 0x94, 0xCD, 0xF2, 0x66, 0x06, 0xE9, 0x49, 0xB8, 0x71, 0x41, 0xA0, 0x25, 0x55, 0x47, 0x97, 0x9E, 0x11, 0x54, 0x1A, 0xB0, 0x3E, 0x37, 0x39, 0x1C, 0x8D, 0x03, 0x6E, 0xF6, 0x80, 0x6D, 0x8C, 0x9C, 0xB6, 0xCF, 0xC3, 0x91, 0x63, 0xC0, 0x07, 0x67, 0xE6, 0xF4, 0xCE, 0x3D, 0xDB, 0x16, 0xFD, 0xEA, 0xD6, 0x68, 0xD5, 0xA6, 0x0F, 0x58, 0x44, 0x52, 0xB5, 0xDC, 0x0A, 0x69, 0xC5, 0xA5, 0xC1, 0x8A, 0x2A, 0xEE, 0x73, 0x76, 0x3A, 0x21, 0x53, 0xA4, 0x50, 0x6A }; unsigned char table_44[32] = { 0x1A, 0x0E, 0x0A, 0x17, 0x1F, 0x08, 0x10, 0x14, 0x0C, 0x0F, 0x09, 0x1C, 0x06, 0x18, 0x1E, 0x12, 0x15, 0x00, 0x11, 0x13, 0x0D, 0x01, 0x0B, 0x03, 0x16, 0x19, 0x05, 0x1D, 0x02, 0x07, 0x04, 0x1B }; unsigned char table_45[256] = { 0x5E, 0xD6, 0xE2, 0x54, 0x35, 0xC2, 0xAC, 0x9D, 0x92, 0x64, 0x57, 0x65, 0xC8, 0xAE, 0x21, 0xA9, 0x89, 0x48, 0x12, 0x59, 0xEC, 0xEF, 0x9F, 0xF7, 0x19, 0x03, 0x83, 0xC0, 0x79, 0x5D, 0x4A, 0x10, 0x8C, 0xEB, 0xFF, 0xB5, 0x3B, 0x51, 0x2D, 0xD1, 0x6B, 0xC5, 0x24, 0x5C, 0xE6, 0x11, 0x94, 0x3F, 0xD0, 0x2F, 0x0E, 0x95, 0x3C, 0xFE, 0x5B, 0x20, 0x23, 0xE0, 0x91, 0x6F, 0xCA, 0x56, 0x0C, 0x73, 0xDA, 0x67, 0x37, 0xA3, 0xA5, 0x70, 0x93, 0x1C, 0x18, 0xD9, 0x42, 0x5F, 0x44, 0xF0, 0xF2, 0x14, 0x58, 0x8A, 0x1D, 0x40, 0x4E, 0x0B, 0x74, 0x84, 0x52, 0xCB, 0x60, 0xED, 0xAD, 0x66, 0x43, 0x6C, 0x81, 0xA1, 0x27, 0xB9, 0xBA, 0x4D, 0xF5, 0x04, 0xB8, 0x96, 0xA6, 0xA2, 0x7D, 0xD4, 0xEA, 0x45, 0x4F, 0x55, 0xD3, 0x3E, 0x8E, 0x4C, 0xBF, 0x8B, 0x9A, 0x06, 0x7A, 0xF4, 0x02, 0x88, 0x80, 0x22, 0xF3, 0xBD, 0x78, 0xEE, 0xAF, 0xF8, 0x15, 0x09, 0x0F, 0xB0, 0xDD, 0x99, 0x72, 0xE7, 0x90, 0xE1, 0x25, 0x62, 0x8D, 0x9C, 0x13, 0x08, 0xC9, 0x28, 0x2A, 0x47, 0x69, 0xDE, 0x77, 0x87, 0xBB, 0xE9, 0xAA, 0x33, 0x05, 0x29, 0x34, 0x97, 0xFD, 0xA0, 0x1E, 0xFC, 0xBE, 0xB1, 0x71, 0x9B, 0x50, 0xDC, 0xB7, 0x31, 0x63, 0x3A, 0xDF, 0xC3, 0x1B, 0x7C, 0x0A, 0xD7, 0xF6, 0xDB, 0x49, 0x53, 0x7F, 0xD2, 0x30, 0xA4, 0xB3, 0x6E, 0xB2, 0x6D, 0xCD, 0x7E, 0x26, 0xE8, 0x76, 0xCF, 0xE5, 0xCE, 0x16, 0xF1, 0xC6, 0x68, 0x36, 0x46, 0x1F, 0x38, 0x0D, 0x41, 0x17, 0xBC, 0x86, 0x9E, 0x6A, 0x7B, 0xB4, 0x01, 0xCC, 0x2C, 0xE3, 0x5A, 0xB6, 0xFA, 0x00, 0x75, 0x39, 0xA7, 0xC1, 0xD5, 0x98, 0xAB, 0x1A, 0x85, 0xD8, 0xE4, 0xC4, 0xA8, 0x4B, 0x61, 0x2E, 0x3D, 0xF9, 0x2B, 0x32, 0x8F, 0xFB, 0xC7, 0x07, 0x82 }; unsigned char table_46[256] = { 0x85, 0x78, 0xFE, 0x6C, 0x61, 0xA0, 0x71, 0xCC, 0x45, 0x54, 0x7A, 0xE6, 0x82, 0x1D, 0xA6, 0x02, 0x47, 0xD0, 0x23, 0x55, 0x62, 0xFA, 0x76, 0x3E, 0xE3, 0x66, 0x74, 0x10, 0x5D, 0x49, 0x69, 0x0B, 0x75, 0x12, 0x8D, 0x9F, 0xEE, 0x93, 0x50, 0x70, 0x32, 0xBC, 0x1E, 0xD3, 0xEF, 0x7B, 0xB4, 0x92, 0xFD, 0x16, 0xC2, 0xD8, 0xDE, 0x68, 0xD1, 0x64, 0xC3, 0xA3, 0xB3, 0xC9, 0x08, 0xFB, 0x84, 0xC1, 0x28, 0x53, 0xCF, 0xD2, 0x35, 0xD7, 0x4A, 0x01, 0x44, 0xA4, 0x07, 0xAC, 0x98, 0xF1, 0xB2, 0x9A, 0x94, 0x2D, 0xD4, 0x34, 0x27, 0x60, 0x1A, 0xB9, 0xAF, 0x89, 0xEB, 0x8F, 0x6A, 0x13, 0x05, 0xF0, 0x77, 0x5F, 0x4F, 0x58, 0x2C, 0xE7, 0xCE, 0xED, 0xC0, 0x0D, 0x3A, 0xA7, 0xE2, 0x38, 0x5B, 0xE9, 0x3D, 0xF2, 0xDF, 0x86, 0xE0, 0x72, 0xF7, 0x88, 0xAD, 0xB7, 0x11, 0xDB, 0x73, 0x87, 0xC5, 0x22, 0xE1, 0x5C, 0xD6, 0x57, 0x7E, 0x7D, 0xA2, 0xF9, 0xF5, 0x9C, 0x25, 0x6F, 0x26, 0x51, 0xC8, 0x80, 0x2B, 0xA8, 0x19, 0xD9, 0x65, 0xCD, 0x97, 0xEA, 0xFF, 0x5E, 0x24, 0x3B, 0x4D, 0xB1, 0x1C, 0x79, 0x39, 0x6B, 0xA5, 0x2A, 0x09, 0xCA, 0x04, 0xEC, 0xBA, 0x18, 0x31, 0x46, 0x20, 0xBE, 0x1F, 0x3C, 0x6D, 0xAA, 0xF6, 0xDD, 0xF4, 0x96, 0x03, 0x0A, 0x9E, 0x83, 0xA1, 0x9D, 0xD5, 0xB0, 0x17, 0xBF, 0x56, 0xAB, 0xAE, 0x1B, 0x52, 0xC6, 0x81, 0x4B, 0xDC, 0x90, 0x5A, 0x9B, 0xB6, 0x0F, 0xF3, 0x67, 0x30, 0x63, 0x7C, 0x40, 0x0E, 0x7F, 0x95, 0x36, 0xC4, 0x4E, 0x43, 0xCB, 0x15, 0xB8, 0x00, 0x91, 0x8A, 0x4C, 0x8E, 0x14, 0x06, 0x6E, 0xA9, 0x2E, 0x3F, 0x48, 0x2F, 0x0C, 0xB5, 0x21, 0xBB, 0xDA, 0x8B, 0x42, 0x29, 0x8C, 0x33, 0x59, 0xE8, 0xF8, 0xC7, 0xE4, 0x37, 0xE5, 0xFC, 0xBD, 0x99, 0x41 }; unsigned char table_47[32] = { 0x18, 0x1D, 0x16, 0x10, 0x11, 0x04, 0x1E, 0x08, 0x19, 0x0E, 0x0F, 0x02, 0x14, 0x1C, 0x07, 0x17, 0x0D, 0x09, 0x12, 0x1A, 0x05, 0x01, 0x0B, 0x0A, 0x13, 0x15, 0x0C, 0x00, 0x06, 0x1F, 0x03, 0x1B }; unsigned char table_48[32] = { 0x13, 0x08, 0x15, 0x01, 0x17, 0x10, 0x0F, 0x1F, 0x1D, 0x0D, 0x12, 0x03, 0x06, 0x0A, 0x1C, 0x19, 0x1A, 0x04, 0x1B, 0x02, 0x16, 0x1E, 0x11, 0x00, 0x14, 0x09, 0x0C, 0x18, 0x05, 0x07, 0x0E, 0x0B }; unsigned char table_49[32] = { 0x1F, 0x0F, 0x19, 0x07, 0x18, 0x05, 0x1E, 0x1D, 0x15, 0x08, 0x17, 0x10, 0x0A, 0x0E, 0x0C, 0x1B, 0x02, 0x13, 0x03, 0x0D, 0x04, 0x1A, 0x06, 0x09, 0x12, 0x1C, 0x0B, 0x16, 0x14, 0x01, 0x11, 0x00 }; unsigned char table_50[32] = { 0x16, 0x18, 0x1C, 0x0E, 0x12, 0x00, 0x04, 0x1B, 0x1F, 0x13, 0x17, 0x0A, 0x1E, 0x03, 0x0C, 0x01, 0x0F, 0x10, 0x02, 0x08, 0x14, 0x09, 0x19, 0x15, 0x06, 0x0D, 0x0B, 0x1D, 0x05, 0x07, 0x11, 0x1A }; unsigned char table_51[32] = { 0x1C, 0x0D, 0x1B, 0x07, 0x17, 0x0E, 0x06, 0x01, 0x12, 0x19, 0x03, 0x0B, 0x10, 0x08, 0x00, 0x1E, 0x0A, 0x04, 0x1A, 0x1D, 0x0C, 0x18, 0x02, 0x13, 0x0F, 0x11, 0x05, 0x09, 0x15, 0x16, 0x1F, 0x14 }; unsigned char table_52[256] = { 0x34, 0x0B, 0x47, 0xA3, 0x56, 0x30, 0x73, 0xD4, 0x4B, 0xF6, 0xA6, 0x80, 0x22, 0x95, 0xA5, 0xBB, 0xFE, 0xCD, 0x27, 0x88, 0x87, 0x18, 0x86, 0x6E, 0xB9, 0x07, 0x37, 0x52, 0x0A, 0x28, 0x2C, 0xC4, 0x75, 0xA1, 0x29, 0x54, 0x84, 0x08, 0x72, 0x51, 0xDD, 0xF1, 0x4E, 0x1A, 0x90, 0x57, 0x20, 0xAD, 0x68, 0x61, 0xAF, 0x50, 0x6B, 0x1B, 0x71, 0xEB, 0x63, 0xC9, 0xB0, 0x58, 0x26, 0x40, 0xC7, 0xD9, 0x70, 0xA2, 0x9A, 0x09, 0x3F, 0x92, 0x0D, 0x8C, 0xC1, 0x96, 0x9F, 0x77, 0x4D, 0x5A, 0xEA, 0x11, 0xD7, 0xF3, 0x33, 0x93, 0x10, 0xF2, 0x9D, 0x83, 0xFF, 0x7E, 0xD2, 0x41, 0x24, 0xB4, 0x8D, 0x5C, 0xCF, 0xEF, 0xE9, 0x64, 0x76, 0xD1, 0xDE, 0xE4, 0x91, 0x35, 0x89, 0x19, 0x02, 0x0E, 0xF4, 0x2A, 0x0F, 0xE1, 0xA8, 0x2D, 0x21, 0x23, 0xAA, 0x7C, 0x78, 0x45, 0xA9, 0xDC, 0x06, 0xF9, 0xDF, 0xF7, 0x03, 0xAB, 0xB5, 0x1C, 0x36, 0x7B, 0x97, 0xFA, 0xE5, 0x3B, 0x2F, 0x1F, 0x9E, 0xED, 0xA7, 0x55, 0x42, 0x6F, 0x1E, 0xB7, 0xE6, 0xFB, 0x12, 0xD5, 0x99, 0xC6, 0x66, 0x4A, 0xE8, 0x48, 0x60, 0xB1, 0x05, 0x53, 0x8A, 0xB6, 0x25, 0x8F, 0xA4, 0xD8, 0x9C, 0xC0, 0x59, 0x3A, 0xBD, 0xDB, 0x44, 0x5E, 0xE3, 0xDA, 0x1D, 0x32, 0xF5, 0xBA, 0x43, 0x13, 0x82, 0x4C, 0xE7, 0x17, 0x15, 0x3E, 0x69, 0x2E, 0xC3, 0xF0, 0x5F, 0xFD, 0xCE, 0xD3, 0xCA, 0x39, 0xD6, 0x79, 0x3D, 0xC8, 0x67, 0x8B, 0x31, 0x4F, 0xB3, 0xBC, 0x65, 0x00, 0x7A, 0x98, 0xC5, 0x6C, 0x2B, 0x94, 0x6D, 0x74, 0x14, 0xAC, 0xCC, 0xA0, 0x5B, 0xF8, 0xCB, 0x7F, 0xB2, 0xEC, 0xBF, 0x3C, 0xE0, 0xAE, 0xFC, 0x62, 0x04, 0x8E, 0x85, 0x49, 0x9B, 0xC2, 0x38, 0xD0, 0xEE, 0x81, 0x46, 0xE2, 0x01, 0x0C, 0x5D, 0x7D, 0xB8, 0xBE, 0x6A, 0x16 }; unsigned char table_53[256] = { 0xE3, 0xF4, 0x8D, 0x72, 0x45, 0x32, 0x9D, 0xCE, 0x1F, 0x6B, 0xBC, 0xDC, 0xF1, 0xEC, 0x5A, 0x3B, 0xA5, 0xA2, 0x2B, 0xDD, 0x8A, 0xA3, 0x76, 0xE4, 0xAF, 0xE9, 0xE1, 0x21, 0xDB, 0x9F, 0x19, 0xD3, 0x26, 0x80, 0x15, 0xC2, 0x46, 0xB8, 0x17, 0x56, 0x99, 0x81, 0x08, 0xD7, 0xEF, 0x8E, 0x04, 0x05, 0x97, 0x2F, 0x78, 0xAD, 0xA1, 0x52, 0x36, 0x58, 0x53, 0x68, 0x22, 0x70, 0x0B, 0x79, 0xE6, 0xFA, 0xC3, 0x91, 0xE2, 0xF7, 0xF6, 0x75, 0x2D, 0x0A, 0x90, 0xEB, 0xA6, 0x35, 0xA7, 0x10, 0xB5, 0xFB, 0xE7, 0xAA, 0x1E, 0x43, 0xBB, 0x3C, 0x65, 0x25, 0x2C, 0x59, 0x62, 0x2A, 0xF9, 0x4B, 0x95, 0x5E, 0x20, 0x11, 0x42, 0x27, 0x44, 0xE8, 0x14, 0x6F, 0xD1, 0xD8, 0x00, 0x3A, 0x5B, 0x18, 0x89, 0x02, 0x61, 0xD6, 0xC5, 0x98, 0xD0, 0x5F, 0x34, 0x29, 0xFD, 0x31, 0x1A, 0xCD, 0x0F, 0x9E, 0xCA, 0x7B, 0xEA, 0x93, 0x71, 0x5C, 0x0E, 0x57, 0x33, 0xC4, 0x37, 0xF5, 0x83, 0xB0, 0xDF, 0x49, 0x74, 0x54, 0x1D, 0x24, 0xB9, 0x16, 0x1C, 0x28, 0xDE, 0x4A, 0xF0, 0x01, 0x86, 0x82, 0xCC, 0x12, 0x8C, 0x06, 0x30, 0xA8, 0x7A, 0x73, 0x66, 0x7C, 0xC6, 0xB6, 0xF2, 0x13, 0xBF, 0x40, 0x85, 0x77, 0x09, 0x3D, 0x67, 0x63, 0x3F, 0x7F, 0xF3, 0x87, 0x8F, 0xFF, 0x92, 0xC7, 0x4C, 0x23, 0xBA, 0xCB, 0xB1, 0xED, 0x0C, 0x60, 0x47, 0xFE, 0x38, 0x5D, 0xCF, 0x8B, 0x4D, 0xA9, 0x2E, 0xE5, 0xA4, 0x1B, 0x88, 0x3E, 0x7D, 0xF8, 0xC0, 0xD5, 0x6D, 0x6C, 0x48, 0xAC, 0x9B, 0x51, 0x7E, 0x6E, 0x50, 0x0D, 0x9A, 0xB3, 0xEE, 0x07, 0x4F, 0x69, 0x9C, 0x03, 0xD9, 0xD4, 0xB4, 0xD2, 0xAE, 0x4E, 0x55, 0xB7, 0xC9, 0x41, 0x39, 0x6A, 0xC8, 0xA0, 0xB2, 0xC1, 0x84, 0xFC, 0xAB, 0x64, 0xE0, 0xBE, 0xDA, 0xBD, 0x96, 0x94 }; unsigned char table_54[32] = { 0x01, 0x02, 0x1D, 0x10, 0x0E, 0x11, 0x08, 0x14, 0x12, 0x09, 0x15, 0x17, 0x16, 0x04, 0x06, 0x1B, 0x07, 0x1A, 0x18, 0x13, 0x0A, 0x1E, 0x1C, 0x1F, 0x0C, 0x0B, 0x0D, 0x05, 0x0F, 0x00, 0x19, 0x03 }; unsigned char table_55[32] = { 0x01, 0x12, 0x13, 0x09, 0x0B, 0x19, 0x03, 0x0E, 0x02, 0x1F, 0x1D, 0x1B, 0x1E, 0x11, 0x06, 0x05, 0x00, 0x16, 0x07, 0x0C, 0x15, 0x0D, 0x1A, 0x08, 0x18, 0x10, 0x0F, 0x17, 0x1C, 0x0A, 0x04, 0x14 }; unsigned char table_56[256] = { 0xEF, 0x06, 0x5F, 0x11, 0x4B, 0x60, 0x13, 0xBB, 0x79, 0xD7, 0xE4, 0x6D, 0x22, 0xB4, 0x15, 0x50, 0x29, 0x17, 0xD2, 0xE3, 0x37, 0x8C, 0x46, 0x7C, 0xA2, 0xF5, 0x65, 0x16, 0xCB, 0x04, 0x3E, 0xDF, 0x8E, 0xDE, 0x53, 0xF1, 0xF4, 0xD1, 0x3B, 0xEE, 0x9A, 0x09, 0x9B, 0x6C, 0xF6, 0xCC, 0xFB, 0x40, 0xE0, 0xFD, 0x2B, 0x1D, 0x73, 0x18, 0xCD, 0x31, 0x3F, 0x9E, 0xAD, 0xC9, 0x43, 0x4E, 0x99, 0x3A, 0x8F, 0x92, 0x85, 0xFC, 0x12, 0x41, 0x20, 0xE8, 0x2A, 0xC0, 0x1C, 0x38, 0x74, 0x0B, 0xF3, 0x05, 0x0D, 0x1F, 0x94, 0x9C, 0xAC, 0x00, 0x59, 0x0C, 0xB3, 0x8D, 0xA8, 0x75, 0xB7, 0x68, 0x2F, 0x27, 0x6F, 0x69, 0x76, 0xD8, 0xEC, 0xA5, 0xB2, 0x6A, 0x19, 0x72, 0x1A, 0xB6, 0xE5, 0x77, 0xC6, 0x44, 0x9D, 0xCA, 0x82, 0x35, 0x36, 0x5E, 0xA9, 0x25, 0xFA, 0x5C, 0x24, 0x30, 0x39, 0x0E, 0x2C, 0x7D, 0xE6, 0x88, 0xA0, 0x63, 0xB8, 0x6B, 0x01, 0xDD, 0xDA, 0x9F, 0x45, 0x83, 0xE2, 0x7F, 0x1B, 0x56, 0xAF, 0x14, 0xC3, 0x49, 0xBF, 0x78, 0x70, 0x58, 0x23, 0xA3, 0xBD, 0x34, 0x47, 0x2D, 0x0A, 0xD4, 0x33, 0x03, 0x1E, 0xC1, 0x87, 0xAE, 0x3C, 0x95, 0xB0, 0x42, 0x91, 0xB9, 0x5A, 0x61, 0xAA, 0xCF, 0xF2, 0x51, 0xA6, 0xF8, 0xDC, 0x71, 0xAB, 0x48, 0x66, 0x90, 0x97, 0xC4, 0x08, 0xF9, 0xD0, 0x7B, 0xDB, 0xBA, 0x8B, 0xC2, 0xC5, 0x2E, 0xF7, 0x5B, 0xFF, 0x21, 0x81, 0x54, 0xD3, 0x62, 0x57, 0x4C, 0x6E, 0x02, 0x98, 0xFE, 0x7E, 0xE7, 0xBC, 0x07, 0x28, 0x5D, 0x86, 0xCE, 0xEA, 0x84, 0xF0, 0xE1, 0x93, 0x80, 0xE9, 0xC7, 0x4A, 0xED, 0xB1, 0x26, 0x89, 0x3D, 0x4F, 0xA7, 0xA1, 0xD6, 0xB5, 0x4D, 0x67, 0xA4, 0x55, 0x10, 0x0F, 0xD9, 0x52, 0x32, 0x96, 0xD5, 0xEB, 0x64, 0x8A, 0xC8, 0x7A, 0xBE }; unsigned char table_57[256] = { 0xD1, 0x9B, 0x15, 0x06, 0xB4, 0xF6, 0x97, 0xF0, 0xC6, 0x5B, 0x88, 0x12, 0x25, 0xFA, 0x7B, 0x79, 0xD6, 0xAB, 0xDC, 0x47, 0x85, 0x61, 0x67, 0x0B, 0xF3, 0x20, 0x44, 0x53, 0x2A, 0x3B, 0x2D, 0xE8, 0x17, 0x71, 0xC3, 0xB7, 0x7F, 0x35, 0xEB, 0x10, 0x03, 0x0D, 0x60, 0x96, 0x27, 0xBB, 0x39, 0x50, 0x95, 0x55, 0xCC, 0xD4, 0x2F, 0x51, 0xB3, 0x05, 0xA5, 0xAD, 0xBC, 0x18, 0xE2, 0xAE, 0x07, 0x87, 0xC4, 0x8D, 0xBE, 0x77, 0xC2, 0x16, 0xFC, 0x33, 0x4C, 0x4F, 0xE6, 0xA6, 0x57, 0x9F, 0x37, 0x91, 0xED, 0x4A, 0xF7, 0xB5, 0x52, 0x7C, 0xBD, 0x30, 0xA0, 0x2C, 0x8C, 0xB0, 0x0C, 0xDA, 0x6F, 0x9E, 0xEE, 0x43, 0x40, 0x8F, 0x8B, 0x76, 0xA4, 0x68, 0xFF, 0x6D, 0x58, 0xC9, 0xF9, 0x6E, 0x3F, 0x56, 0xCA, 0x49, 0xC8, 0x5D, 0xCD, 0xC7, 0x99, 0xEC, 0x72, 0x38, 0x0A, 0xA9, 0xC5, 0x04, 0x64, 0xBF, 0xB6, 0x29, 0x80, 0x2E, 0x19, 0x0E, 0x82, 0x45, 0xBA, 0xD7, 0x1E, 0x86, 0xA8, 0xD8, 0x24, 0xDB, 0xCF, 0xE1, 0x54, 0xB2, 0x3E, 0x4D, 0x90, 0x42, 0x5F, 0x59, 0x0F, 0xCE, 0x8E, 0xA2, 0xA7, 0x1D, 0x22, 0xFD, 0x81, 0x63, 0xE5, 0x6A, 0xE7, 0x93, 0x41, 0x46, 0x66, 0x89, 0x13, 0xEA, 0x69, 0x1C, 0x83, 0xF2, 0x08, 0xB8, 0x01, 0x23, 0x26, 0xFB, 0x78, 0xAA, 0x31, 0x11, 0x1B, 0x98, 0xDD, 0xAC, 0xB9, 0xFE, 0x94, 0x74, 0xAF, 0x32, 0xD0, 0x5A, 0xA1, 0xF4, 0x6B, 0x8A, 0xE3, 0x65, 0xDE, 0xCB, 0x73, 0x3D, 0xA3, 0x7E, 0xDF, 0xD2, 0x6C, 0x7A, 0x36, 0xD9, 0x62, 0x4B, 0xEF, 0xC1, 0x1F, 0x00, 0x34, 0xB1, 0xF8, 0xE4, 0xD5, 0x09, 0x1A, 0x9A, 0x70, 0x48, 0x9D, 0xF1, 0xE0, 0x9C, 0xD3, 0x5C, 0x75, 0x02, 0x2B, 0x92, 0x21, 0x7D, 0xF5, 0x5E, 0x4E, 0x3C, 0x84, 0x14, 0x28, 0x3A, 0xE9, 0xC0 }; unsigned char table_58[256] = { 0xE9, 0x81, 0x60, 0xA7, 0x18, 0xA0, 0x0F, 0x55, 0x2B, 0x52, 0xE0, 0x8B, 0x9D, 0x85, 0xD2, 0xA3, 0x3F, 0x6E, 0xB1, 0xAF, 0xE3, 0x36, 0xE2, 0x19, 0x56, 0xB0, 0x09, 0xB5, 0x79, 0x43, 0xE1, 0x06, 0x45, 0xB6, 0xC0, 0x22, 0xEE, 0x41, 0xEC, 0x01, 0x66, 0x2D, 0x87, 0x38, 0x16, 0x37, 0xFA, 0x29, 0x96, 0xA4, 0xC3, 0x23, 0x59, 0x7E, 0x92, 0x78, 0x10, 0x2A, 0x4C, 0x0E, 0x9B, 0x4A, 0x35, 0xF4, 0x42, 0x0C, 0xD8, 0xD7, 0x24, 0x2C, 0xDD, 0x8E, 0x5B, 0xF5, 0x33, 0x48, 0xEF, 0xDE, 0x4B, 0xBC, 0x51, 0xAB, 0x7C, 0xE4, 0x63, 0x70, 0x9A, 0xAC, 0x54, 0x1D, 0x25, 0xC5, 0xEA, 0xB3, 0x05, 0xF7, 0xC1, 0x1F, 0xE8, 0x97, 0xBB, 0x32, 0x6D, 0xC7, 0x28, 0x61, 0xDB, 0x4D, 0x77, 0x72, 0x65, 0x8C, 0x80, 0x3A, 0x76, 0x47, 0xA8, 0x03, 0x04, 0x12, 0xCE, 0xA9, 0x75, 0x3C, 0x49, 0xF8, 0x64, 0xDF, 0x57, 0xA2, 0x69, 0x44, 0xAD, 0x3E, 0x4F, 0x0B, 0x74, 0x67, 0xC9, 0x1A, 0x17, 0xAA, 0x02, 0x6F, 0xDA, 0xF2, 0xC6, 0x27, 0x53, 0xD6, 0xFD, 0xCA, 0x8D, 0x93, 0x89, 0xD5, 0x6B, 0x4E, 0x90, 0x82, 0x30, 0xE7, 0xC4, 0xD9, 0x8A, 0x7F, 0xB4, 0xFC, 0xCF, 0xA1, 0xAE, 0x1C, 0x39, 0x1B, 0x7B, 0x5E, 0x88, 0x7D, 0xD3, 0x71, 0x2E, 0x98, 0x13, 0x8F, 0xCC, 0x84, 0x73, 0xCD, 0x21, 0x0D, 0x5C, 0xA5, 0x3D, 0x9E, 0x99, 0xC2, 0xF3, 0x34, 0x14, 0x62, 0x46, 0x0A, 0x07, 0x08, 0xFF, 0xFB, 0xB7, 0xBF, 0x5D, 0x91, 0xB8, 0x83, 0xBE, 0x94, 0xBA, 0xF9, 0xEB, 0xE5, 0xCB, 0x95, 0x40, 0x31, 0xE6, 0x86, 0xD4, 0xFE, 0xD0, 0x7A, 0x26, 0xB9, 0xDC, 0x2F, 0xBD, 0xF0, 0x5F, 0x00, 0x9C, 0x6A, 0x5A, 0x3B, 0xF1, 0xC8, 0x9F, 0xED, 0x50, 0x20, 0x15, 0x11, 0x68, 0x1E, 0xF6, 0xA6, 0x6C, 0xB2, 0xD1, 0x58 }; unsigned char table_59[256] = { 0x4C, 0x85, 0x2B, 0x14, 0xCC, 0x4D, 0x5F, 0xD7, 0xCE, 0x28, 0xC5, 0x0B, 0xA1, 0x99, 0x08, 0xDE, 0x42, 0xD1, 0x82, 0x5C, 0xC9, 0x8F, 0x72, 0x12, 0xCB, 0x0D, 0x04, 0xFA, 0xCD, 0xE5, 0x9A, 0x6F, 0xCF, 0x92, 0xB5, 0x88, 0x87, 0xBF, 0x90, 0x7C, 0xAC, 0xBE, 0x36, 0x21, 0x7D, 0x7F, 0xC7, 0x9F, 0x75, 0xBB, 0x61, 0x16, 0x17, 0x63, 0xAE, 0xC4, 0x23, 0x89, 0xE0, 0x37, 0x91, 0x5E, 0xC8, 0xE4, 0xFD, 0xD5, 0xA2, 0xC6, 0x5A, 0xEF, 0x9B, 0xD6, 0x27, 0xEE, 0x60, 0x1C, 0xDF, 0xDA, 0xF1, 0xD2, 0x1E, 0x01, 0x9D, 0x44, 0x03, 0xD8, 0x11, 0x53, 0x4F, 0x6C, 0x8B, 0xB7, 0x40, 0xF2, 0x79, 0x20, 0x74, 0x97, 0x3E, 0x3D, 0x05, 0xD4, 0x70, 0x30, 0x54, 0x59, 0xE7, 0x15, 0xE1, 0xEB, 0x71, 0x83, 0xFE, 0x66, 0xB1, 0xA6, 0xF7, 0x8E, 0x6A, 0xEA, 0x65, 0x7E, 0xA3, 0xCA, 0x2D, 0x4B, 0xB8, 0x9C, 0x35, 0xC3, 0xB6, 0x49, 0x32, 0x25, 0xB3, 0xB0, 0x76, 0xC0, 0xF5, 0x00, 0x8A, 0xAF, 0x19, 0xDB, 0xDD, 0x47, 0xDC, 0x07, 0xB2, 0x4A, 0x55, 0xE6, 0x69, 0xEC, 0xED, 0x06, 0x94, 0xB9, 0xA7, 0x56, 0x2C, 0xAA, 0xE3, 0x22, 0x3B, 0x98, 0x77, 0x52, 0x3C, 0x64, 0xF8, 0x13, 0x78, 0xFC, 0xFB, 0xF3, 0xD3, 0xF9, 0x29, 0x45, 0x51, 0x8C, 0xA0, 0x38, 0xD9, 0xA5, 0x62, 0x3A, 0x6E, 0xD0, 0xE8, 0x7A, 0x33, 0x1D, 0xB4, 0x73, 0x02, 0xFF, 0x10, 0x80, 0x6B, 0xF0, 0xA4, 0xBA, 0xF6, 0xC2, 0x0E, 0xE2, 0x81, 0x43, 0x84, 0x86, 0x1F, 0x31, 0x2F, 0xA9, 0x1B, 0x2A, 0x4E, 0xF4, 0x95, 0x5B, 0x3F, 0x34, 0x39, 0x7B, 0x0A, 0x26, 0x6D, 0x57, 0x50, 0x09, 0x9E, 0xA8, 0xBC, 0x24, 0x93, 0x67, 0x41, 0x96, 0x0C, 0x46, 0xBD, 0xE9, 0x68, 0x18, 0xAB, 0x2E, 0x5D, 0x1A, 0x8D, 0xC1, 0x58, 0x48, 0xAD, 0x0F }; unsigned char table_60[32] = { 0x1C, 0x06, 0x1E, 0x10, 0x1D, 0x05, 0x00, 0x0E, 0x0C, 0x02, 0x11, 0x19, 0x15, 0x18, 0x16, 0x07, 0x1F, 0x0B, 0x14, 0x01, 0x0F, 0x09, 0x0D, 0x13, 0x03, 0x08, 0x12, 0x04, 0x1B, 0x0A, 0x17, 0x1A }; unsigned char table_61[256] = { 0xC5, 0xA6, 0xF2, 0x6B, 0x4B, 0x58, 0xE0, 0x41, 0xC6, 0x2F, 0x13, 0xFE, 0xC1, 0x34, 0x3F, 0x24, 0x10, 0xBF, 0x8B, 0xC9, 0x26, 0x2E, 0x68, 0xBE, 0x28, 0x54, 0x93, 0x11, 0x21, 0x03, 0xFF, 0x50, 0x31, 0x71, 0x2C, 0x6C, 0x91, 0x8F, 0x3B, 0x40, 0x3E, 0xE5, 0xA5, 0x80, 0xEA, 0x7C, 0x9D, 0x18, 0x84, 0x5A, 0x73, 0x3A, 0x33, 0x43, 0xA1, 0x47, 0xB1, 0xEE, 0xFB, 0x79, 0x5E, 0xAF, 0xB9, 0x48, 0x0F, 0x88, 0x65, 0x67, 0x6F, 0xDB, 0x25, 0xE4, 0xB0, 0x87, 0xD0, 0x46, 0xB5, 0xB7, 0x53, 0xD4, 0x1E, 0x76, 0xB4, 0x90, 0xDD, 0xA3, 0xF7, 0x57, 0xD2, 0xCC, 0x5D, 0xE3, 0xB3, 0xD8, 0x5F, 0x2B, 0x69, 0x4A, 0x9B, 0x39, 0x1A, 0x8D, 0x05, 0x8A, 0x44, 0x15, 0xAE, 0xF3, 0xA8, 0x92, 0x02, 0xAB, 0xB8, 0xDA, 0x0A, 0x0C, 0xED, 0xD7, 0x77, 0x98, 0x3D, 0x19, 0x95, 0x36, 0xE7, 0x7F, 0x66, 0xEF, 0x86, 0xDC, 0xCB, 0x9C, 0x63, 0xE6, 0x1D, 0x14, 0x9A, 0x22, 0xBD, 0xD6, 0x89, 0x2D, 0xD1, 0xF9, 0xA2, 0xDE, 0xF5, 0x5C, 0x8E, 0x2A, 0x29, 0xCA, 0x7A, 0x8C, 0x38, 0x9F, 0xBB, 0xDF, 0xEC, 0x30, 0x00, 0xFC, 0xAC, 0x81, 0xB2, 0xE8, 0xC0, 0xA7, 0x7B, 0x07, 0x52, 0x74, 0x70, 0x0E, 0x51, 0x6A, 0x62, 0x0D, 0x85, 0x1B, 0x4F, 0x96, 0x55, 0x1C, 0x32, 0x6E, 0x01, 0xF6, 0x08, 0xFD, 0x17, 0x35, 0xF0, 0x16, 0xC8, 0x23, 0xE9, 0x59, 0x3C, 0x37, 0x5B, 0x42, 0xD3, 0x49, 0x7D, 0x83, 0x78, 0xAD, 0x94, 0x9E, 0x56, 0xB6, 0xF1, 0xC3, 0x75, 0xF8, 0xFA, 0x09, 0x4C, 0xD9, 0x97, 0xF4, 0x7E, 0x6D, 0xBC, 0x4D, 0x64, 0xCD, 0x12, 0x99, 0x45, 0xCE, 0x61, 0x20, 0x0B, 0xA0, 0x82, 0xD5, 0xE1, 0x72, 0xA9, 0x1F, 0x06, 0x27, 0xC7, 0x04, 0xE2, 0xBA, 0xCF, 0x60, 0xAA, 0xA4, 0xEB, 0xC4, 0x4E, 0xC2 }; unsigned char table_62[256] = { 0x01, 0x59, 0xEC, 0xFC, 0x51, 0xD2, 0xE4, 0x9D, 0xAA, 0x61, 0xD5, 0xCA, 0x63, 0x5D, 0xCE, 0x36, 0xB9, 0x49, 0x76, 0xA9, 0x14, 0x4C, 0x90, 0x28, 0x66, 0x17, 0x4F, 0x1E, 0x1A, 0x47, 0x30, 0xE8, 0xFD, 0x86, 0x2E, 0x7B, 0x7E, 0xCC, 0x34, 0x13, 0x94, 0x45, 0x38, 0x74, 0x29, 0xB0, 0x37, 0xC3, 0x26, 0x6C, 0x39, 0xA3, 0x89, 0xEB, 0xA2, 0x20, 0x00, 0xE0, 0x73, 0xE7, 0xB5, 0xCB, 0xED, 0x3E, 0x79, 0x09, 0xFA, 0x32, 0x54, 0xBA, 0x05, 0x96, 0xDE, 0x23, 0xD0, 0xA1, 0xAB, 0xFE, 0xF2, 0x22, 0xB2, 0x9B, 0x7D, 0x44, 0x12, 0x3D, 0x40, 0x82, 0xA0, 0xA8, 0x33, 0xDC, 0xF7, 0xFB, 0xAC, 0x41, 0x8A, 0x9C, 0x60, 0x11, 0xC8, 0xF0, 0xEA, 0x57, 0x3A, 0x42, 0xCD, 0x1D, 0x3C, 0xC6, 0x97, 0x62, 0x55, 0x9F, 0xF3, 0x93, 0x91, 0xDA, 0x6A, 0xE5, 0x27, 0x8E, 0x4E, 0xFF, 0xA4, 0x80, 0x04, 0xE1, 0x2B, 0x5E, 0xC0, 0x64, 0xC2, 0xD8, 0x46, 0x8C, 0xD4, 0x0F, 0xC4, 0x43, 0xD9, 0x9E, 0x4B, 0x5C, 0x0A, 0x8B, 0xBF, 0xD7, 0x7A, 0x81, 0x3B, 0x4A, 0x58, 0xB6, 0x21, 0x1F, 0xC1, 0xBD, 0xB1, 0x77, 0x72, 0x1C, 0x4D, 0xBC, 0xA5, 0x65, 0xC7, 0xF5, 0xB4, 0x2D, 0x69, 0x71, 0xE6, 0x8F, 0xBB, 0x03, 0xAF, 0xD6, 0x08, 0x75, 0xB7, 0x31, 0xF4, 0x2A, 0x48, 0x70, 0x0C, 0x8D, 0xD1, 0x87, 0x2F, 0x16, 0x5A, 0x5B, 0x98, 0xA6, 0xC5, 0x99, 0x50, 0x07, 0xDD, 0x92, 0x25, 0x68, 0x0D, 0xBE, 0x78, 0x0B, 0xAD, 0x84, 0x6B, 0x19, 0x52, 0x7C, 0xF6, 0xB3, 0x56, 0x83, 0x88, 0xEE, 0x2C, 0x1B, 0x6E, 0x53, 0x67, 0xE2, 0x6F, 0x15, 0x06, 0x10, 0x18, 0x85, 0xF1, 0x6D, 0xF9, 0xC9, 0xAE, 0x3F, 0xB8, 0x95, 0x35, 0xDF, 0xEF, 0xA7, 0x7F, 0x24, 0xF8, 0xE3, 0xCF, 0xE9, 0xDB, 0xD3, 0x02, 0x9A, 0x0E, 0x5F }; unsigned char table_63[256] = { 0x0C, 0x02, 0xEE, 0x94, 0x2D, 0x76, 0x96, 0x75, 0x21, 0xDC, 0x37, 0x03, 0xC0, 0xF7, 0xDF, 0xEF, 0xB1, 0x1D, 0xCF, 0x15, 0x5A, 0xB4, 0xCC, 0x81, 0x89, 0x6B, 0xA5, 0x2E, 0x6D, 0xD4, 0x08, 0x44, 0x2A, 0x60, 0x50, 0xBF, 0x40, 0x7D, 0x5F, 0x64, 0x93, 0x70, 0xA4, 0x7F, 0xC9, 0xEB, 0x0A, 0xF8, 0x9F, 0xA8, 0xBC, 0x25, 0xE5, 0xF3, 0x1B, 0xD7, 0x29, 0x13, 0x0D, 0x69, 0x20, 0x5C, 0x0F, 0x91, 0x4F, 0x62, 0x06, 0x26, 0x41, 0xED, 0xDA, 0x53, 0x65, 0xFF, 0xCD, 0x3F, 0xF6, 0x01, 0xCE, 0xA2, 0x04, 0xDE, 0x27, 0x87, 0xBA, 0x86, 0x24, 0x78, 0xAF, 0xE1, 0x3D, 0xD0, 0xC8, 0x1F, 0x4A, 0x2C, 0x9A, 0xF0, 0xCB, 0xAD, 0x0B, 0x59, 0xC5, 0x58, 0xEA, 0x8A, 0xA1, 0x45, 0xB7, 0x5D, 0xB5, 0x77, 0x2B, 0x47, 0x05, 0x00, 0xAC, 0x61, 0xFA, 0x33, 0x74, 0x31, 0xCA, 0x22, 0x42, 0x8B, 0xFE, 0x09, 0xB2, 0x6E, 0x1A, 0xBE, 0xAA, 0x7B, 0xEC, 0xF4, 0x51, 0x66, 0x28, 0x12, 0xFC, 0x5E, 0x67, 0xF5, 0xB9, 0x82, 0x90, 0x8E, 0x8D, 0x17, 0xE7, 0xE8, 0xB0, 0xC3, 0x16, 0xA0, 0x4B, 0xB6, 0xFB, 0x7E, 0xC4, 0x85, 0x4C, 0x1E, 0xC7, 0x39, 0x4E, 0xA9, 0xE3, 0x4D, 0x32, 0x72, 0x35, 0x80, 0xE0, 0x34, 0xB8, 0x73, 0x98, 0x49, 0x92, 0x30, 0xD5, 0xD2, 0xA3, 0x54, 0x7A, 0x84, 0x8F, 0x6C, 0xFD, 0x43, 0x3A, 0x36, 0x3B, 0xD9, 0x48, 0x6A, 0x14, 0x79, 0xD1, 0x57, 0x88, 0xDB, 0xE4, 0x9B, 0xF9, 0x99, 0x10, 0x71, 0xC1, 0x68, 0x9E, 0x11, 0xAB, 0xBD, 0x7C, 0x3E, 0x3C, 0x18, 0x9D, 0x97, 0xF2, 0xE6, 0xA6, 0xF1, 0x46, 0xC2, 0x19, 0xBB, 0x52, 0xD8, 0x95, 0xD3, 0x23, 0xAE, 0x07, 0x2F, 0xE9, 0x63, 0x1C, 0x55, 0x6F, 0x9C, 0x56, 0x38, 0xC6, 0x5B, 0x8C, 0xE2, 0x83, 0xA7, 0xD6, 0x0E, 0xB3, 0xDD }; unsigned char table_64[32] = { 0x03, 0x05, 0x0D, 0x09, 0x1A, 0x16, 0x08, 0x10, 0x06, 0x1E, 0x1C, 0x15, 0x02, 0x04, 0x17, 0x0C, 0x18, 0x0B, 0x19, 0x11, 0x1B, 0x14, 0x13, 0x0A, 0x0E, 0x00, 0x1D, 0x1F, 0x01, 0x0F, 0x07, 0x12 }; unsigned char table_65[32] = { 0x01, 0x0A, 0x1E, 0x14, 0x10, 0x1D, 0x0D, 0x17, 0x0E, 0x0C, 0x0F, 0x12, 0x04, 0x1A, 0x05, 0x02, 0x08, 0x1C, 0x09, 0x1F, 0x0B, 0x13, 0x19, 0x1B, 0x11, 0x00, 0x16, 0x06, 0x03, 0x18, 0x15, 0x07 }; unsigned char table_66[32] = { 0x1C, 0x18, 0x0C, 0x09, 0x05, 0x03, 0x15, 0x12, 0x0D, 0x02, 0x08, 0x0E, 0x19, 0x07, 0x13, 0x17, 0x1E, 0x1D, 0x1F, 0x11, 0x06, 0x0A, 0x0B, 0x14, 0x0F, 0x10, 0x01, 0x1B, 0x00, 0x04, 0x1A, 0x16 }; unsigned char table_67[256] = { 0x6B, 0x49, 0xC8, 0x86, 0xFF, 0xC0, 0x5D, 0xEF, 0xF7, 0x06, 0xE0, 0x98, 0xA9, 0x72, 0x71, 0xD5, 0xBA, 0x7F, 0x10, 0xD1, 0xBE, 0x41, 0x9C, 0x40, 0x28, 0x8E, 0xE5, 0x74, 0x47, 0x9E, 0x3E, 0x7C, 0xB5, 0xCD, 0x3F, 0x20, 0xF2, 0xA6, 0xDC, 0x97, 0x32, 0x6D, 0x52, 0xF5, 0x16, 0x05, 0xFE, 0x04, 0x3D, 0x53, 0x50, 0x23, 0x39, 0x77, 0x08, 0x60, 0x75, 0x18, 0x4A, 0xC6, 0xBB, 0xE7, 0xF1, 0xAB, 0xEB, 0x88, 0xB6, 0x82, 0x6E, 0x91, 0xF3, 0x34, 0x3A, 0x42, 0x1A, 0xDF, 0xA1, 0xB3, 0x92, 0xBF, 0xB7, 0x00, 0xD4, 0xDE, 0x31, 0xF0, 0x1C, 0xDA, 0x4F, 0x61, 0x67, 0x2C, 0x07, 0xF9, 0x15, 0xA4, 0x7A, 0x26, 0x45, 0x2A, 0x12, 0x9F, 0xF4, 0x14, 0x8C, 0x90, 0xFC, 0xC5, 0x4B, 0x87, 0xE2, 0xC7, 0xD0, 0x8A, 0xE8, 0xDD, 0xEE, 0x3C, 0x2F, 0x22, 0x6A, 0x54, 0x37, 0x9B, 0x84, 0x25, 0x8F, 0xE3, 0xD7, 0xD8, 0x4E, 0xAD, 0x0F, 0x4C, 0x56, 0xA2, 0xD3, 0xB0, 0x73, 0x0B, 0xAE, 0xEA, 0x1D, 0x01, 0x36, 0xB4, 0x2D, 0xC4, 0x19, 0x58, 0x1E, 0x62, 0xE9, 0xB2, 0x5B, 0x5A, 0xBD, 0xD6, 0x65, 0x94, 0x9A, 0x55, 0xCC, 0x99, 0x1B, 0x85, 0x2B, 0xBC, 0x8D, 0x46, 0x81, 0xB8, 0xA3, 0x29, 0x5F, 0x35, 0x5C, 0xB1, 0x1F, 0x13, 0x17, 0xCB, 0x51, 0x02, 0x09, 0x7E, 0xA7, 0x69, 0x6F, 0x95, 0x30, 0x7B, 0xCA, 0x48, 0xAF, 0xAA, 0x0E, 0x44, 0x38, 0xB9, 0x0D, 0x11, 0xA0, 0xD9, 0x0C, 0xDB, 0xF8, 0x68, 0x33, 0x79, 0x59, 0x66, 0x4D, 0x03, 0xE1, 0x89, 0xE4, 0x3B, 0x78, 0xC2, 0x64, 0x6C, 0x27, 0xC9, 0xCF, 0xAC, 0xED, 0xFA, 0x5E, 0x2E, 0x76, 0x57, 0x93, 0xEC, 0x80, 0xA8, 0xE6, 0xCE, 0xC1, 0xA5, 0x9D, 0xD2, 0xC3, 0x0A, 0x7D, 0x70, 0xF6, 0x63, 0x24, 0x43, 0x21, 0x83, 0xFB, 0xFD, 0x8B, 0x96 }; unsigned char table_68[256] = { 0x93, 0xFF, 0x83, 0x70, 0x12, 0x2D, 0x1C, 0xD6, 0xF9, 0xEE, 0xCF, 0x94, 0x7B, 0xB5, 0xA4, 0x84, 0x99, 0xF7, 0x67, 0x32, 0xFC, 0x8A, 0xE3, 0xE4, 0xCE, 0xC6, 0x77, 0x7E, 0xDA, 0x42, 0x85, 0xF0, 0x7D, 0x48, 0x28, 0x79, 0xDE, 0x5B, 0xE2, 0x0F, 0x75, 0xC5, 0x2C, 0x4F, 0xF3, 0xEC, 0x14, 0x10, 0x9C, 0x6E, 0x59, 0x4A, 0x20, 0x34, 0xA3, 0x89, 0xE0, 0x4E, 0x52, 0x88, 0x81, 0x5F, 0x6F, 0x71, 0x17, 0x3B, 0x21, 0xB4, 0xCB, 0x9B, 0x18, 0x13, 0xE8, 0xE1, 0x02, 0x2E, 0xED, 0x00, 0xA7, 0x1B, 0x06, 0xF4, 0x27, 0xDC, 0x35, 0x2F, 0x08, 0x9D, 0x7C, 0xC0, 0x36, 0xA6, 0x6B, 0xDF, 0x4C, 0xBC, 0xFE, 0xDB, 0xA5, 0xA8, 0x8D, 0x73, 0x7F, 0xC7, 0x8E, 0x60, 0x31, 0x61, 0x4B, 0x29, 0xD7, 0xE9, 0xBD, 0xAB, 0xCC, 0xFA, 0xD9, 0xEF, 0xC2, 0xD4, 0x19, 0x11, 0x15, 0xC9, 0xB1, 0xD5, 0x64, 0x97, 0xE7, 0x8F, 0x05, 0x44, 0xF8, 0xF1, 0x58, 0x47, 0x2A, 0x03, 0x1F, 0xAF, 0x0D, 0x04, 0x23, 0xB8, 0x24, 0x51, 0xB2, 0x54, 0x41, 0x53, 0x5C, 0xAE, 0xB7, 0xB3, 0xB6, 0x3D, 0x37, 0x39, 0x55, 0xBF, 0x0B, 0x7A, 0x57, 0x3C, 0x0E, 0x40, 0x6A, 0xF5, 0x72, 0xDD, 0xBB, 0x8B, 0xAA, 0x46, 0xA0, 0x30, 0x56, 0x78, 0x38, 0xBA, 0x9E, 0x92, 0x87, 0xFB, 0x66, 0x90, 0x1E, 0xB9, 0x96, 0x65, 0xA2, 0x50, 0x1D, 0xC3, 0x26, 0x22, 0xD0, 0x0A, 0x43, 0xF2, 0xB0, 0xEB, 0xAC, 0x62, 0x98, 0x3F, 0xD3, 0x69, 0xA1, 0x9F, 0x16, 0x95, 0xE6, 0xF6, 0x2B, 0x25, 0x1A, 0xD2, 0xBE, 0x09, 0x5D, 0x45, 0xC4, 0xFD, 0x5A, 0x07, 0x0C, 0x82, 0x3E, 0x49, 0x74, 0x6C, 0x68, 0x5E, 0xCA, 0xEA, 0xCD, 0x9A, 0xAD, 0xD1, 0x33, 0x86, 0x76, 0x80, 0xE5, 0xC8, 0xD8, 0xA9, 0x8C, 0x6D, 0x91, 0x63, 0x3A, 0x4D, 0xC1, 0x01 }; unsigned char table_69[256] = { 0x21, 0x6B, 0x9B, 0xAE, 0x11, 0x5A, 0x91, 0xC2, 0x47, 0x8E, 0x87, 0x86, 0x4F, 0xFC, 0x8F, 0x66, 0x97, 0x2F, 0x61, 0x9C, 0x5B, 0x4C, 0xB3, 0x14, 0x77, 0x48, 0x62, 0xE1, 0x54, 0x64, 0xDD, 0xCD, 0x30, 0xB7, 0x2D, 0xD2, 0xC3, 0xC0, 0x0B, 0xD8, 0x53, 0x98, 0x16, 0x56, 0x7A, 0x35, 0x50, 0xD9, 0xE8, 0x2C, 0x32, 0x55, 0x17, 0x5D, 0x79, 0xEB, 0xC8, 0x75, 0x67, 0xE2, 0x4B, 0xBA, 0xFE, 0x57, 0x10, 0xF4, 0x70, 0x2A, 0xBB, 0xA6, 0x72, 0x36, 0xAF, 0x8D, 0xAB, 0x90, 0xE3, 0x2B, 0xB2, 0x26, 0x93, 0x01, 0xBD, 0x71, 0xF9, 0x05, 0xC7, 0x80, 0x29, 0xCC, 0x3B, 0x22, 0xF2, 0x12, 0x81, 0x34, 0xF6, 0x1A, 0x8B, 0xDF, 0x28, 0x46, 0x9E, 0x6A, 0x23, 0x85, 0x74, 0xE7, 0xE6, 0x52, 0xA0, 0x49, 0xF0, 0x19, 0x25, 0xAC, 0x78, 0x42, 0xD6, 0xA2, 0x37, 0x65, 0x4D, 0x94, 0x02, 0x6F, 0xB4, 0xC6, 0x99, 0xD3, 0x9A, 0x33, 0xB8, 0x00, 0xCA, 0xE4, 0x45, 0xAD, 0x1B, 0x6C, 0x03, 0xA8, 0x07, 0x8A, 0x60, 0x69, 0xFF, 0xF7, 0xA7, 0x27, 0x95, 0xF5, 0x82, 0xCB, 0xEC, 0xED, 0x4E, 0xFB, 0xA4, 0x59, 0xDA, 0xCF, 0x2E, 0x20, 0xFA, 0x31, 0xD1, 0xEA, 0x4A, 0xE9, 0x5E, 0xA9, 0xA1, 0x08, 0x1C, 0x96, 0x38, 0xB9, 0xEE, 0x7F, 0xAA, 0xF1, 0x7D, 0x3A, 0xA5, 0x43, 0xC5, 0xE0, 0x24, 0x39, 0x0D, 0xDE, 0xB0, 0xF8, 0xBE, 0x58, 0x7E, 0x51, 0xD4, 0x89, 0x15, 0x40, 0x3E, 0xB1, 0x1F, 0x5F, 0x68, 0x63, 0x84, 0x3D, 0x88, 0xBC, 0x41, 0xEF, 0xB5, 0xBF, 0x06, 0x6E, 0x9D, 0x3F, 0x0E, 0x76, 0x5C, 0xDC, 0x13, 0xF3, 0xE5, 0x8C, 0x7C, 0x04, 0x0A, 0xD5, 0x18, 0xC4, 0x44, 0x09, 0xC9, 0x1D, 0x9F, 0xFD, 0xD0, 0x0F, 0x6D, 0xD7, 0x92, 0x7B, 0x0C, 0xA3, 0x73, 0xDB, 0xB6, 0x83, 0xCE, 0x1E, 0xC1, 0x3C }; unsigned char table_70[256] = { 0x54, 0x23, 0xF1, 0x09, 0x9D, 0xEB, 0x26, 0xD9, 0x6C, 0xC1, 0xBC, 0x3D, 0x6E, 0xB0, 0x5F, 0xE2, 0x59, 0x4D, 0x95, 0xFA, 0xD8, 0x29, 0xAA, 0x8E, 0xF5, 0xEF, 0x43, 0x76, 0xFD, 0x0D, 0x4F, 0xAD, 0xB7, 0xFC, 0xA8, 0x9F, 0x62, 0xC2, 0x7B, 0x10, 0x0B, 0xF2, 0x73, 0xA9, 0x46, 0x4C, 0x53, 0xD7, 0x0A, 0x50, 0x89, 0x63, 0x48, 0xD6, 0xA2, 0x44, 0xE6, 0x8D, 0x69, 0x2C, 0xF9, 0xC0, 0x35, 0x06, 0x66, 0x21, 0x9E, 0xD2, 0x98, 0xF7, 0x9B, 0xE7, 0x12, 0xB8, 0xA5, 0xBA, 0xE0, 0x79, 0x71, 0x7E, 0x8C, 0x24, 0xED, 0x7C, 0x60, 0x81, 0xC3, 0x5C, 0x2B, 0xE5, 0xEE, 0xB5, 0xA4, 0x05, 0x03, 0x34, 0x16, 0x2A, 0xA3, 0x2D, 0x3F, 0xDF, 0x07, 0x5B, 0xAE, 0x47, 0x61, 0x08, 0x18, 0xDB, 0x6D, 0x3C, 0x96, 0xD5, 0xAB, 0x78, 0x94, 0x45, 0x20, 0x9A, 0xE4, 0x13, 0x68, 0xDD, 0xDE, 0x31, 0x14, 0x57, 0x02, 0x52, 0x56, 0x1C, 0x1B, 0xE9, 0xD0, 0xA1, 0x22, 0x64, 0xB2, 0x7A, 0xCF, 0x5D, 0x00, 0x0F, 0xF8, 0x5E, 0x36, 0x58, 0x40, 0xAF, 0x19, 0x32, 0x2E, 0xB3, 0x72, 0xBE, 0xB9, 0xD3, 0xCD, 0x7D, 0x4A, 0x1D, 0x33, 0x2F, 0xAC, 0x27, 0x41, 0xE8, 0x55, 0xCB, 0x0E, 0x5A, 0x77, 0xFB, 0x8B, 0x86, 0x75, 0x8A, 0x51, 0xEC, 0xDA, 0xC6, 0xA6, 0xCC, 0x91, 0x4B, 0x11, 0xF6, 0xEA, 0xD1, 0xB6, 0x4E, 0x82, 0x04, 0x92, 0x30, 0xF4, 0x25, 0x88, 0x1E, 0x9C, 0xA0, 0xC8, 0x6A, 0x93, 0x87, 0x1F, 0xB4, 0xB1, 0x8F, 0x65, 0xCA, 0xFE, 0xFF, 0x97, 0x15, 0x99, 0x28, 0x80, 0x42, 0x70, 0x85, 0x0C, 0x3B, 0xBD, 0xE1, 0xA7, 0x17, 0xC9, 0x3A, 0xBB, 0x6B, 0x37, 0xF0, 0xC5, 0x39, 0x6F, 0x01, 0x83, 0x67, 0x74, 0xCE, 0xDC, 0x90, 0x3E, 0xF3, 0x7F, 0xC4, 0x49, 0x84, 0x38, 0xC7, 0xE3, 0xD4, 0x1A, 0xBF }; unsigned char table_71[32] = { 0x17, 0x13, 0x0E, 0x1A, 0x0D, 0x18, 0x19, 0x10, 0x14, 0x11, 0x16, 0x05, 0x04, 0x00, 0x12, 0x0A, 0x02, 0x07, 0x03, 0x0B, 0x09, 0x1F, 0x1C, 0x0F, 0x0C, 0x06, 0x1B, 0x08, 0x1D, 0x01, 0x15, 0x1E }; unsigned char table_72[256] = { 0xC9, 0xA7, 0x1B, 0xEC, 0x2B, 0x8B, 0xB0, 0xEB, 0x7F, 0x39, 0x25, 0xD9, 0x1D, 0xD5, 0x67, 0xA0, 0xB3, 0xAC, 0x3B, 0xC8, 0x82, 0xC0, 0xE3, 0x9E, 0x4C, 0x9B, 0xAF, 0xFD, 0x91, 0x86, 0x5F, 0x92, 0xB4, 0x42, 0x3C, 0x45, 0x12, 0xC4, 0xE2, 0xE1, 0x6C, 0x1F, 0xC6, 0x40, 0x93, 0x2A, 0xC2, 0x72, 0x2E, 0x14, 0x51, 0xA5, 0x70, 0xBD, 0xA2, 0xC7, 0x7D, 0xF1, 0x9F, 0x64, 0xC1, 0xF7, 0x80, 0xFF, 0x50, 0x49, 0x8C, 0x66, 0x13, 0x48, 0x6A, 0x0A, 0x26, 0x94, 0x83, 0x1E, 0x84, 0xBB, 0x57, 0x27, 0x44, 0x5B, 0x62, 0xF6, 0x09, 0x4F, 0x77, 0x76, 0x2D, 0x7E, 0xCD, 0x0B, 0x24, 0xFE, 0x81, 0xB8, 0x21, 0x85, 0xCF, 0xA8, 0x75, 0x56, 0x37, 0x17, 0xAA, 0x23, 0xE5, 0xE8, 0x9A, 0x9D, 0x2F, 0x04, 0x31, 0x4A, 0x7C, 0xFC, 0xD6, 0xE4, 0x29, 0xC3, 0xFB, 0x36, 0x1C, 0x0C, 0xCE, 0xEE, 0x0D, 0xF3, 0x46, 0xF8, 0x41, 0x0E, 0x68, 0xAB, 0x2C, 0x69, 0x96, 0x90, 0x28, 0xED, 0x02, 0x63, 0x07, 0xAD, 0xB2, 0xDC, 0x05, 0xE6, 0x78, 0x03, 0xA4, 0x7A, 0x5C, 0x52, 0x95, 0x5D, 0x88, 0x01, 0xDF, 0x35, 0x5E, 0xB6, 0x06, 0x4D, 0x15, 0x89, 0x59, 0x3F, 0xF0, 0xA1, 0xA3, 0x99, 0x19, 0xEA, 0xDB, 0xE0, 0x6B, 0x71, 0x6E, 0xB7, 0x65, 0x54, 0x9C, 0xBC, 0x98, 0xDD, 0x4B, 0x60, 0x3D, 0xBF, 0xF5, 0xD1, 0xD7, 0xF9, 0x55, 0x61, 0xA9, 0xB1, 0x6D, 0xDE, 0x79, 0xAE, 0x1A, 0x34, 0x3A, 0x4E, 0xCB, 0x38, 0xBA, 0x97, 0x00, 0x74, 0xEF, 0xD8, 0x18, 0x33, 0x7B, 0xFA, 0x22, 0x32, 0x20, 0xCA, 0x8A, 0xBE, 0xA6, 0x43, 0x11, 0x10, 0xD0, 0xD3, 0x87, 0x73, 0x6F, 0xF4, 0x8D, 0xCC, 0x30, 0x0F, 0x16, 0xDA, 0xB5, 0xC5, 0xD4, 0x47, 0x8E, 0xE7, 0x58, 0x8F, 0x08, 0x53, 0xF2, 0xB9, 0x5A, 0x3E, 0xE9, 0xD2 }; unsigned char table_73[256] = { 0x36, 0x37, 0xED, 0xD8, 0xBF, 0xD7, 0x12, 0xB7, 0x40, 0x32, 0x19, 0x4A, 0x44, 0x2A, 0xCE, 0xA5, 0x29, 0x13, 0x43, 0x51, 0x5C, 0xD0, 0x76, 0x6E, 0x41, 0xD6, 0xE2, 0x4F, 0xB8, 0x27, 0x2E, 0xCF, 0xD9, 0xE0, 0x69, 0xC0, 0x59, 0x77, 0x62, 0x6F, 0x53, 0xE7, 0x93, 0xD4, 0xAD, 0xC8, 0x4C, 0xC2, 0x2C, 0xBE, 0xAA, 0xA0, 0x22, 0x78, 0x14, 0xB3, 0xB0, 0xEA, 0xBA, 0x9A, 0x33, 0x1B, 0x31, 0x6C, 0xFC, 0x0A, 0x0B, 0xA1, 0xE4, 0x75, 0x7C, 0xE3, 0x65, 0x21, 0xA9, 0xA4, 0x4E, 0x3C, 0x5F, 0x39, 0x74, 0xA2, 0x9E, 0x03, 0x70, 0xD2, 0xFD, 0x1D, 0x25, 0x72, 0x73, 0x8E, 0x7B, 0xB2, 0x6A, 0x92, 0x81, 0xF3, 0xF0, 0x46, 0x08, 0x85, 0xE6, 0x30, 0x05, 0x7E, 0xEC, 0x0D, 0xDD, 0x42, 0x2F, 0x5B, 0xB9, 0xCB, 0x84, 0x0C, 0x16, 0xC7, 0x24, 0xFA, 0xF9, 0x8F, 0x20, 0xAC, 0x10, 0x55, 0xC3, 0x1A, 0x8B, 0x94, 0x3D, 0xDB, 0xC9, 0x04, 0xB5, 0xCC, 0xC6, 0x98, 0xB6, 0x8D, 0x0F, 0x3A, 0x06, 0x4B, 0xEF, 0x35, 0x68, 0x3F, 0xEE, 0xE5, 0x63, 0xC5, 0x60, 0x88, 0x52, 0x2D, 0x6D, 0xAB, 0xCD, 0xC4, 0x1F, 0xF4, 0xCA, 0x67, 0x7D, 0x1C, 0xDA, 0x34, 0xDE, 0x86, 0xAE, 0xF1, 0x61, 0x09, 0xF5, 0xF6, 0x49, 0xE9, 0xF2, 0x48, 0x1E, 0xD3, 0x56, 0x18, 0x9B, 0xB1, 0x57, 0x9D, 0xBB, 0x5E, 0xAF, 0x87, 0x9F, 0x8A, 0xC1, 0x79, 0xA7, 0xA8, 0xFB, 0xDC, 0x47, 0x3E, 0x97, 0x80, 0x91, 0xA6, 0x7A, 0xA3, 0x9C, 0x11, 0x02, 0x2B, 0x58, 0xD1, 0xF7, 0x00, 0x83, 0x01, 0xE8, 0xFE, 0x50, 0x23, 0x66, 0x4D, 0xD5, 0x82, 0x89, 0x3B, 0xEB, 0xE1, 0xF8, 0x5A, 0x15, 0x7F, 0x8C, 0x17, 0x96, 0x28, 0x5D, 0x64, 0x26, 0x38, 0x71, 0x0E, 0x45, 0xDF, 0xB4, 0x99, 0xFF, 0x90, 0x6B, 0xBC, 0x54, 0x95, 0xBD, 0x07 }; unsigned char table_74[256] = { 0xA7, 0xCF, 0x99, 0x1A, 0x13, 0xC7, 0xE9, 0xC4, 0xB6, 0x0E, 0x15, 0x09, 0xFF, 0xDF, 0xBE, 0x03, 0xAD, 0xF1, 0xB0, 0x3C, 0x4A, 0x9B, 0xF5, 0x12, 0xA1, 0x2C, 0xDB, 0x51, 0x5E, 0x6F, 0xE6, 0x49, 0x27, 0xBB, 0xAE, 0x56, 0xC0, 0x0C, 0x77, 0x60, 0x5B, 0x69, 0xA2, 0xF0, 0x24, 0x8E, 0xE1, 0xA4, 0xBC, 0x9F, 0x50, 0xD4, 0x61, 0x19, 0x67, 0x00, 0x7B, 0xAB, 0xDD, 0x26, 0xCD, 0x6C, 0xE8, 0xA8, 0x7A, 0x93, 0xEF, 0x20, 0x52, 0x1F, 0x1B, 0x46, 0x25, 0x3B, 0x1E, 0x65, 0xC2, 0xF9, 0x10, 0xB2, 0xB3, 0xD9, 0x21, 0xD2, 0x11, 0x94, 0xE2, 0xFC, 0x38, 0x9E, 0x36, 0x87, 0xAA, 0x53, 0x45, 0x68, 0x2B, 0xE7, 0x07, 0xFA, 0xD3, 0x8D, 0x3F, 0x17, 0xC1, 0x06, 0x72, 0x62, 0x8C, 0x55, 0x73, 0x8A, 0xC9, 0x2E, 0x5A, 0x7D, 0x02, 0x6D, 0xF8, 0x4B, 0xE4, 0xBF, 0xEC, 0xB7, 0x31, 0xDC, 0xF4, 0xB8, 0x47, 0x64, 0x0A, 0x33, 0x48, 0xAC, 0xFB, 0x05, 0x3E, 0x34, 0x1C, 0x97, 0x1D, 0x63, 0x37, 0x2D, 0xB1, 0x92, 0xED, 0x9D, 0x4C, 0xD5, 0x4E, 0x9A, 0x0D, 0x79, 0x0F, 0xBD, 0x95, 0xBA, 0x08, 0x2A, 0xC6, 0x7E, 0x88, 0xCB, 0xA6, 0x29, 0x70, 0x35, 0x66, 0xCA, 0x89, 0x75, 0x6A, 0x4F, 0xB5, 0x6B, 0x74, 0xDE, 0x01, 0x04, 0x81, 0x91, 0x90, 0x18, 0x32, 0x0B, 0x7F, 0x44, 0xB4, 0xAF, 0xF2, 0xEB, 0x22, 0xFD, 0x14, 0xA0, 0xFE, 0x8B, 0xB9, 0x16, 0x86, 0xE3, 0xD7, 0xDA, 0xC5, 0x3A, 0x41, 0x83, 0xD1, 0x28, 0x54, 0x30, 0xE0, 0x40, 0xA5, 0x57, 0x8F, 0x84, 0xD6, 0x96, 0x39, 0xE5, 0x42, 0x80, 0xA9, 0x58, 0xCE, 0x5D, 0xEE, 0x5F, 0xA3, 0xD0, 0xC8, 0x59, 0x43, 0x4D, 0x5C, 0xF7, 0xCC, 0x76, 0x6E, 0xF3, 0x23, 0x3D, 0x85, 0x82, 0x78, 0xF6, 0x2F, 0xD8, 0xC3, 0x7C, 0x9C, 0x98, 0xEA, 0x71 }; unsigned char table_75[256] = { 0xE7, 0xA5, 0x30, 0xE1, 0x9D, 0x81, 0xBE, 0x83, 0xB2, 0x1E, 0xE4, 0x69, 0x2F, 0x2B, 0x0D, 0xEB, 0x7C, 0x59, 0x2D, 0xAA, 0x01, 0x0C, 0xDB, 0xED, 0xC4, 0xEE, 0x5D, 0x38, 0x72, 0xD8, 0x70, 0xCE, 0x0B, 0xF6, 0x7F, 0x48, 0x26, 0x9E, 0xA3, 0x44, 0xD6, 0xCF, 0x0F, 0x6B, 0xFD, 0x23, 0x98, 0xAB, 0x11, 0xD4, 0x92, 0x91, 0x5E, 0x08, 0x4D, 0xC6, 0xF0, 0xA8, 0x7E, 0x8A, 0x1D, 0xA1, 0x97, 0x76, 0x3E, 0x64, 0x07, 0x24, 0xDE, 0x75, 0xA4, 0xCC, 0x1A, 0x04, 0x4B, 0x6C, 0xFA, 0xB0, 0xC7, 0x35, 0xE2, 0x56, 0x61, 0xA0, 0xE9, 0x27, 0xDF, 0xC3, 0xE5, 0xF4, 0x8D, 0xB4, 0xD3, 0x52, 0xD7, 0x49, 0xCD, 0x31, 0x6E, 0x3F, 0x4E, 0x6A, 0x5B, 0x65, 0xCA, 0x14, 0x71, 0x53, 0xD9, 0x47, 0x28, 0x7D, 0x17, 0x06, 0x5C, 0xFE, 0xBA, 0xB8, 0xAC, 0x15, 0xE8, 0xE0, 0x9A, 0xDD, 0x1F, 0xBC, 0x95, 0x42, 0xCB, 0x58, 0x00, 0x85, 0xD5, 0x62, 0xC9, 0xB6, 0x05, 0x80, 0x4C, 0x3C, 0x1C, 0xF5, 0x03, 0xF8, 0x96, 0x77, 0x02, 0x19, 0xF2, 0xFB, 0x5F, 0xC2, 0xAE, 0x60, 0x1B, 0xAD, 0x8F, 0xC1, 0x33, 0xA6, 0x20, 0xBF, 0xA7, 0xC8, 0x74, 0x18, 0x90, 0xE3, 0x68, 0x09, 0x7A, 0x79, 0xB5, 0xDA, 0xF3, 0x0E, 0x66, 0x84, 0xB3, 0xBB, 0xE6, 0xF7, 0xB7, 0x7B, 0x39, 0x4A, 0x12, 0x4F, 0xC5, 0x41, 0x54, 0xD0, 0xFF, 0x87, 0x63, 0x40, 0x99, 0x21, 0x29, 0xD2, 0x3D, 0x37, 0x3A, 0x93, 0xFC, 0x25, 0xF1, 0xD1, 0x2C, 0x6D, 0x8C, 0x5A, 0x8E, 0x9B, 0xBD, 0xAF, 0x10, 0x55, 0xF9, 0x9F, 0x43, 0x0A, 0x50, 0x16, 0x57, 0xB1, 0xC0, 0x73, 0x82, 0xEF, 0x88, 0x6F, 0xEA, 0x2A, 0xEC, 0x2E, 0x86, 0x45, 0x51, 0x22, 0xA9, 0x34, 0x94, 0x3B, 0xB9, 0x9C, 0xA2, 0x13, 0x89, 0x46, 0x78, 0xDC, 0x32, 0x8B, 0x67, 0x36 }; unsigned char table_76[256] = { 0x3D, 0x66, 0x40, 0xC5, 0x1D, 0xF5, 0xE7, 0xB7, 0x2C, 0x23, 0x09, 0xC2, 0x68, 0xE6, 0xD3, 0x8D, 0x35, 0x94, 0x93, 0xF0, 0x43, 0x97, 0x2B, 0x4B, 0x1A, 0xEB, 0x00, 0x4C, 0x6F, 0xE4, 0x92, 0xEA, 0xB8, 0xA3, 0xA6, 0xEC, 0x11, 0x5E, 0x61, 0x81, 0xE1, 0x48, 0xC9, 0xCB, 0xDB, 0x2E, 0x3B, 0xED, 0x36, 0x52, 0x3A, 0xD2, 0x4F, 0x4E, 0x22, 0x96, 0x57, 0x2D, 0x62, 0x53, 0xCF, 0xD9, 0x5B, 0x9F, 0x8E, 0x78, 0xC6, 0x07, 0x7D, 0xA1, 0x02, 0xB4, 0xF4, 0xB6, 0x34, 0x98, 0xDA, 0xA9, 0xD4, 0x54, 0x99, 0x82, 0x0A, 0xD8, 0x88, 0x5D, 0x3C, 0xD0, 0xAB, 0x31, 0xFB, 0x03, 0x17, 0x46, 0xE8, 0xE2, 0xA4, 0xFF, 0xB0, 0xAA, 0xAD, 0x7C, 0x55, 0x49, 0x75, 0x6B, 0x10, 0x24, 0xC0, 0x04, 0xB1, 0xBF, 0x6A, 0xF6, 0x15, 0xEF, 0x5C, 0x60, 0x27, 0x3E, 0x38, 0x63, 0xC1, 0x76, 0xFD, 0x84, 0xE0, 0xCD, 0xFE, 0x30, 0xCE, 0xBB, 0xDC, 0x1E, 0x1B, 0xBC, 0xB5, 0xE9, 0x9E, 0x8F, 0x0D, 0x3F, 0x91, 0x19, 0x28, 0x37, 0x26, 0x42, 0x08, 0x9A, 0x0C, 0x83, 0x90, 0x6D, 0x74, 0x65, 0xF2, 0x4A, 0xDE, 0x8B, 0x67, 0x0E, 0x8C, 0x5F, 0xF9, 0x7F, 0x5A, 0x86, 0x69, 0x45, 0x44, 0xD5, 0xF7, 0xE5, 0x8A, 0xA8, 0xC8, 0x7E, 0x05, 0x64, 0xEE, 0x79, 0xBE, 0x7A, 0x14, 0xD6, 0x50, 0x18, 0x25, 0xBD, 0x85, 0xE3, 0xA2, 0x70, 0xCC, 0x59, 0x71, 0x77, 0xFA, 0x47, 0x9B, 0x1F, 0x9D, 0xBA, 0x29, 0x4D, 0xF8, 0xDF, 0xC4, 0x72, 0x2F, 0xAE, 0x06, 0x51, 0x41, 0xAF, 0xF3, 0xDD, 0x87, 0xB2, 0x9C, 0xC7, 0x12, 0x16, 0x20, 0xA7, 0x21, 0x73, 0xF1, 0x58, 0xD7, 0x7B, 0xB9, 0xB3, 0x32, 0x01, 0x80, 0x1C, 0x39, 0x0B, 0x13, 0x56, 0x6C, 0x89, 0x33, 0x6E, 0x2A, 0xA5, 0xD1, 0x95, 0xC3, 0xA0, 0x0F, 0xCA, 0xAC, 0xFC }; unsigned char table_77[32] = { 0x1C, 0x0D, 0x1E, 0x01, 0x06, 0x16, 0x18, 0x17, 0x0B, 0x1F, 0x04, 0x0F, 0x00, 0x19, 0x08, 0x0A, 0x11, 0x03, 0x05, 0x07, 0x09, 0x0C, 0x15, 0x14, 0x1A, 0x12, 0x13, 0x0E, 0x1D, 0x10, 0x02, 0x1B }; unsigned char table_78[32] = { 0x0E, 0x02, 0x17, 0x12, 0x1E, 0x09, 0x15, 0x03, 0x01, 0x0B, 0x0F, 0x11, 0x10, 0x0A, 0x16, 0x06, 0x07, 0x00, 0x1C, 0x1D, 0x1F, 0x0C, 0x18, 0x04, 0x13, 0x0D, 0x1B, 0x08, 0x19, 0x14, 0x05, 0x1A }; unsigned char table_79[32] = { 0x12, 0x0B, 0x11, 0x01, 0x07, 0x0E, 0x1A, 0x0D, 0x1E, 0x18, 0x14, 0x1F, 0x0A, 0x17, 0x19, 0x1B, 0x00, 0x10, 0x0C, 0x08, 0x13, 0x02, 0x0F, 0x1D, 0x09, 0x06, 0x04, 0x16, 0x15, 0x1C, 0x05, 0x03 }; unsigned char table_80[256] = { 0x14, 0xE7, 0x31, 0x0F, 0xD1, 0x5F, 0xED, 0x1E, 0xA6, 0x77, 0x20, 0x57, 0x34, 0x64, 0x33, 0x0B, 0x5A, 0xB4, 0x83, 0x62, 0xFD, 0x8E, 0xE4, 0xF3, 0xBD, 0xA5, 0xC8, 0x6D, 0x3E, 0x4F, 0x01, 0x7A, 0xD3, 0x45, 0x3C, 0xF2, 0x68, 0xFF, 0xE6, 0x84, 0xC2, 0xC1, 0x53, 0x72, 0x8C, 0xA1, 0xC7, 0x00, 0x89, 0x97, 0x69, 0xA4, 0xF8, 0xAA, 0xAD, 0x8F, 0x24, 0xC6, 0x9A, 0xAC, 0xE5, 0xAB, 0x6B, 0x79, 0x99, 0x60, 0x28, 0x2B, 0x3B, 0xAF, 0x1C, 0x80, 0xA3, 0x8A, 0x1A, 0xB5, 0xE1, 0x9F, 0xDA, 0x78, 0xD7, 0xC4, 0x87, 0x5D, 0xE9, 0x27, 0xFB, 0x18, 0x94, 0x3A, 0xCE, 0x3F, 0xF6, 0x12, 0x75, 0x37, 0x6E, 0x9E, 0x29, 0x6C, 0xF7, 0x7D, 0x92, 0x08, 0x42, 0xB2, 0xBF, 0x0C, 0xB6, 0x25, 0xE0, 0x49, 0x43, 0x91, 0x98, 0xBB, 0xDC, 0x63, 0xEA, 0xA8, 0x74, 0x38, 0x35, 0xCD, 0x07, 0x70, 0x81, 0x41, 0xC9, 0x51, 0xBC, 0xA9, 0x59, 0xD4, 0xB8, 0x2C, 0x7C, 0x2D, 0xB3, 0x6F, 0x11, 0x86, 0x9D, 0x46, 0xF0, 0x65, 0x76, 0x04, 0x0E, 0xCA, 0xBE, 0x5C, 0xF9, 0x71, 0x9C, 0x21, 0x4C, 0x02, 0xFE, 0x8D, 0xD5, 0x26, 0x40, 0xC3, 0x32, 0x9B, 0xB0, 0x5E, 0x48, 0xC5, 0x85, 0x4B, 0x0A, 0xCC, 0x58, 0x52, 0x61, 0x13, 0xEF, 0x4A, 0xEE, 0x03, 0xD9, 0xDE, 0xA7, 0x19, 0x09, 0x7F, 0x5B, 0x96, 0xBA, 0x0D, 0xCF, 0xD2, 0x06, 0x1F, 0xD8, 0xDB, 0xEC, 0xA0, 0xDD, 0x66, 0x10, 0xA2, 0xDF, 0x30, 0xF4, 0x88, 0xCB, 0x36, 0x82, 0xE3, 0x73, 0x17, 0x55, 0x15, 0xF5, 0xB7, 0x23, 0xB1, 0xD6, 0xE2, 0x47, 0x7E, 0x67, 0xE8, 0x1D, 0x16, 0x8B, 0xEB, 0xD0, 0x3D, 0x6A, 0x54, 0x2A, 0x4E, 0x93, 0xFA, 0x44, 0x05, 0x2F, 0x50, 0x2E, 0x95, 0xAE, 0x1B, 0x56, 0x7B, 0x39, 0xB9, 0xC0, 0x22, 0xF1, 0x4D, 0x90, 0xFC }; unsigned char table_81[32] = { 0x03, 0x02, 0x1D, 0x0E, 0x09, 0x1A, 0x0C, 0x11, 0x1C, 0x0D, 0x08, 0x12, 0x19, 0x10, 0x04, 0x17, 0x15, 0x05, 0x0A, 0x00, 0x13, 0x16, 0x1B, 0x18, 0x1E, 0x0B, 0x0F, 0x01, 0x07, 0x14, 0x1F, 0x06 }; unsigned char table_82[256] = { 0x53, 0xD3, 0x64, 0x89, 0x7D, 0xA5, 0x66, 0xA4, 0x09, 0x46, 0x17, 0x2C, 0xAF, 0x8C, 0x21, 0x5F, 0x3B, 0x22, 0xE3, 0x05, 0x07, 0x28, 0x2F, 0xAB, 0xF4, 0x8E, 0x51, 0x31, 0x02, 0xC7, 0x48, 0x13, 0x24, 0x12, 0xB8, 0xE5, 0xBD, 0xAE, 0x7E, 0xCC, 0xC9, 0x98, 0x08, 0xEE, 0xDB, 0x1B, 0xE8, 0x3D, 0x8F, 0xF2, 0xFB, 0x36, 0x4D, 0x94, 0x9C, 0x16, 0xF7, 0x42, 0x9B, 0x2B, 0xFD, 0x7B, 0x77, 0x3F, 0xC3, 0xFC, 0x23, 0x93, 0x50, 0x0C, 0x79, 0x18, 0x47, 0xE1, 0xCB, 0xA7, 0xB6, 0x85, 0xE6, 0x61, 0x2D, 0xD8, 0x9F, 0x80, 0xE9, 0x14, 0x0B, 0x1C, 0x40, 0x76, 0x2A, 0x25, 0x0E, 0x99, 0xAC, 0xC4, 0xEB, 0x29, 0x41, 0x8A, 0x73, 0x06, 0x57, 0xC6, 0x8D, 0xFA, 0x5A, 0xCD, 0x67, 0xB2, 0xD9, 0x0A, 0x1E, 0xEF, 0x3E, 0xA0, 0x45, 0x03, 0x27, 0xF1, 0x38, 0x54, 0xC1, 0x7A, 0xFE, 0x52, 0x75, 0xD4, 0x74, 0x7C, 0xD2, 0x68, 0xEA, 0x4C, 0x97, 0xF9, 0xF5, 0x8B, 0x0F, 0x84, 0xA8, 0x6E, 0x9E, 0x11, 0x6B, 0xBC, 0x4B, 0x6C, 0x9A, 0xF0, 0xA3, 0x1F, 0x92, 0x19, 0xA2, 0x3A, 0x15, 0x04, 0xC5, 0x62, 0xD5, 0x96, 0x90, 0x32, 0xAA, 0xD6, 0xCF, 0x35, 0xB4, 0x81, 0x2E, 0x01, 0x10, 0x49, 0x70, 0xDE, 0xDD, 0x88, 0xB9, 0x6D, 0x60, 0xBB, 0x44, 0xF8, 0x3C, 0xEC, 0x34, 0x82, 0x95, 0x72, 0x58, 0x4E, 0xE4, 0x0D, 0xBE, 0xDA, 0x83, 0x4A, 0x00, 0xBF, 0xD0, 0xC8, 0x26, 0xB3, 0x65, 0x1A, 0x69, 0xCA, 0xF3, 0xD7, 0x6F, 0x55, 0xE2, 0xFF, 0x5D, 0xDC, 0x20, 0xF6, 0x63, 0xED, 0xE0, 0x59, 0x9D, 0xB1, 0x1D, 0xAD, 0x91, 0xA1, 0xB7, 0xA9, 0xDF, 0xC0, 0x39, 0xD1, 0x43, 0xCE, 0x4F, 0x5C, 0xE7, 0x37, 0x5E, 0x33, 0x5B, 0xA6, 0xC2, 0xB0, 0xBA, 0x30, 0x6A, 0x78, 0xB5, 0x71, 0x56, 0x87, 0x7F, 0x86 }; unsigned char table_83[32] = { 0x1B, 0x0A, 0x1F, 0x01, 0x10, 0x08, 0x0E, 0x18, 0x06, 0x04, 0x00, 0x1C, 0x0C, 0x19, 0x0D, 0x16, 0x02, 0x03, 0x09, 0x07, 0x13, 0x0F, 0x05, 0x12, 0x17, 0x1E, 0x1A, 0x1D, 0x0B, 0x11, 0x14, 0x15 }; unsigned char table_84[32] = { 0x02, 0x1A, 0x0D, 0x15, 0x01, 0x16, 0x1E, 0x00, 0x08, 0x1B, 0x04, 0x10, 0x1C, 0x18, 0x19, 0x14, 0x0C, 0x11, 0x0B, 0x0E, 0x03, 0x0A, 0x07, 0x12, 0x1D, 0x17, 0x13, 0x06, 0x0F, 0x05, 0x09, 0x1F }; unsigned char table_85[256] = { 0xC6, 0x7C, 0xCE, 0xBD, 0x84, 0x3E, 0x0B, 0xD8, 0xFE, 0xCC, 0x46, 0x50, 0xD1, 0xFB, 0xA0, 0x6D, 0xEA, 0xE2, 0x40, 0x51, 0x13, 0xB0, 0xD6, 0xB1, 0xA8, 0xDF, 0x61, 0xA4, 0x80, 0x21, 0xB3, 0x33, 0x06, 0x6B, 0xE3, 0x8C, 0xA1, 0x18, 0xBA, 0x03, 0xD7, 0x8D, 0x54, 0x12, 0x4C, 0xEE, 0x9E, 0xCF, 0x04, 0x2A, 0x08, 0xBB, 0xC2, 0xD4, 0xC3, 0x4A, 0xD5, 0xFA, 0x36, 0x2F, 0x14, 0x3F, 0xED, 0x05, 0x17, 0x28, 0x75, 0xFC, 0xA2, 0x1F, 0x4B, 0x6F, 0x91, 0x7E, 0x4E, 0x96, 0x3B, 0xF3, 0x1D, 0x78, 0xEB, 0x68, 0xF1, 0xA7, 0x9F, 0xC7, 0x59, 0x6C, 0x92, 0xE6, 0x66, 0x07, 0x8A, 0x25, 0x26, 0x72, 0x30, 0x5A, 0x81, 0x2C, 0x58, 0x32, 0xCB, 0xE0, 0xF9, 0x48, 0x83, 0x9B, 0xA5, 0xE1, 0xA6, 0x64, 0xFF, 0xC9, 0x8F, 0x53, 0x3D, 0x24, 0xC8, 0xDE, 0x02, 0x7D, 0x09, 0xB4, 0x0A, 0x95, 0x0F, 0xE4, 0xDB, 0xB7, 0x71, 0x4D, 0x1C, 0xAC, 0x35, 0xCD, 0x29, 0xDD, 0xC1, 0xF2, 0xF4, 0xC0, 0x5C, 0x74, 0xDC, 0x87, 0xFD, 0x4F, 0x11, 0x0E, 0x5D, 0x3C, 0x01, 0x73, 0xE9, 0xD9, 0x10, 0x9A, 0x5B, 0xC5, 0x98, 0x34, 0x15, 0xAE, 0xF7, 0xAA, 0x67, 0x23, 0xBC, 0x8B, 0x7B, 0x65, 0xA9, 0xB6, 0x77, 0x00, 0x19, 0x0C, 0x5E, 0x99, 0xF0, 0x55, 0x86, 0x97, 0x69, 0xDA, 0x38, 0x9C, 0x16, 0xE8, 0x27, 0xAF, 0x2E, 0x47, 0x6A, 0xD0, 0x79, 0x44, 0x45, 0x2B, 0x5F, 0x85, 0xF5, 0x62, 0x70, 0x22, 0x7F, 0xF6, 0x88, 0x93, 0x60, 0x42, 0x3A, 0x39, 0x49, 0x6E, 0x89, 0x52, 0x20, 0xF8, 0xCA, 0xD2, 0x76, 0xB9, 0xAB, 0x7A, 0x9D, 0xD3, 0xBE, 0x1A, 0xAD, 0x41, 0x56, 0x31, 0x90, 0xB5, 0xB2, 0xEC, 0xA3, 0xE5, 0x8E, 0x1B, 0xEF, 0xBF, 0x94, 0xC4, 0x0D, 0xB8, 0x2D, 0x57, 0xE7, 0x82, 0x1E, 0x37, 0x63, 0x43 }; unsigned char table_86[32] = { 0x11, 0x07, 0x0F, 0x0A, 0x19, 0x1D, 0x0B, 0x09, 0x1C, 0x1E, 0x14, 0x06, 0x0C, 0x16, 0x13, 0x04, 0x15, 0x18, 0x00, 0x0D, 0x12, 0x05, 0x08, 0x02, 0x10, 0x1A, 0x1F, 0x01, 0x17, 0x0E, 0x03, 0x1B }; unsigned char table_87[32] = { 0x17, 0x0E, 0x1D, 0x13, 0x0B, 0x19, 0x03, 0x06, 0x09, 0x01, 0x0D, 0x15, 0x1C, 0x16, 0x18, 0x1B, 0x11, 0x10, 0x00, 0x1E, 0x1F, 0x08, 0x12, 0x0F, 0x02, 0x04, 0x07, 0x1A, 0x14, 0x0A, 0x0C, 0x05 }; unsigned char table_88[32] = { 0x09, 0x08, 0x17, 0x10, 0x0A, 0x07, 0x1C, 0x1F, 0x04, 0x0E, 0x01, 0x0C, 0x0D, 0x1B, 0x03, 0x15, 0x02, 0x1E, 0x18, 0x19, 0x0F, 0x06, 0x1A, 0x0B, 0x05, 0x11, 0x14, 0x00, 0x16, 0x1D, 0x12, 0x13 }; unsigned char table_89[32] = { 0x15, 0x1C, 0x1D, 0x14, 0x0F, 0x1A, 0x05, 0x02, 0x07, 0x09, 0x06, 0x08, 0x1F, 0x00, 0x10, 0x13, 0x0D, 0x03, 0x0C, 0x18, 0x0E, 0x16, 0x1B, 0x1E, 0x12, 0x04, 0x11, 0x0A, 0x01, 0x0B, 0x17, 0x19 }; unsigned char table_90[256] = { 0x62, 0x36, 0x64, 0x0E, 0x4C, 0x6C, 0xBE, 0xCF, 0x25, 0x5A, 0x3D, 0x12, 0x54, 0x9F, 0xE7, 0xA5, 0xDE, 0xD7, 0xB2, 0x60, 0x18, 0x8D, 0x89, 0x70, 0x48, 0x66, 0x1C, 0xA6, 0x17, 0x9B, 0xDF, 0x9A, 0x82, 0xB9, 0x2E, 0xFA, 0x83, 0x5B, 0x7A, 0x61, 0xFC, 0x6B, 0x8B, 0x4E, 0x0F, 0xAD, 0x78, 0xE1, 0xE8, 0x15, 0x1A, 0xF7, 0xA3, 0x3A, 0x04, 0xE3, 0x30, 0x8C, 0x06, 0xC4, 0x05, 0x32, 0x1F, 0x6A, 0xB8, 0x37, 0x58, 0xF5, 0x74, 0x63, 0xD4, 0xAC, 0xA4, 0xF3, 0xEC, 0xBB, 0x8E, 0x65, 0xA0, 0xEE, 0x6D, 0x11, 0xDD, 0xEA, 0x68, 0x2B, 0xDA, 0x0B, 0xEF, 0xC3, 0x8F, 0x03, 0x77, 0x1B, 0xFB, 0x1E, 0x5C, 0xD9, 0xCB, 0x33, 0x55, 0xF1, 0xA1, 0xF9, 0x7C, 0x38, 0x95, 0x00, 0x6E, 0x85, 0xC2, 0x7F, 0xBF, 0x84, 0x2A, 0x13, 0x72, 0x81, 0xE9, 0x59, 0x41, 0x69, 0x3B, 0x0C, 0x90, 0xB4, 0x51, 0x2F, 0xA2, 0xFE, 0xF8, 0x49, 0x57, 0xE5, 0x96, 0xFF, 0xCD, 0xD5, 0xCE, 0xAA, 0x40, 0xB0, 0x4D, 0xBA, 0xDB, 0xC7, 0x46, 0x86, 0xD1, 0xCA, 0xC0, 0x67, 0x9C, 0x21, 0xAE, 0xB3, 0x7B, 0x87, 0xE2, 0x71, 0xE6, 0x39, 0xA8, 0x22, 0x07, 0x2C, 0x44, 0x52, 0xA7, 0xF0, 0x4A, 0x92, 0x56, 0x28, 0x43, 0x8A, 0x5E, 0x53, 0x93, 0x47, 0x97, 0x88, 0x76, 0x79, 0x91, 0x26, 0xC1, 0x3F, 0xB7, 0xF6, 0x3E, 0x80, 0xA9, 0xC6, 0x01, 0xD2, 0xEB, 0x9E, 0x4B, 0xBC, 0xC8, 0xB5, 0x02, 0x5F, 0x98, 0x9D, 0x5D, 0x35, 0xD0, 0x16, 0xB1, 0x23, 0x7D, 0xAF, 0x10, 0x3C, 0xAB, 0x14, 0x09, 0x2D, 0x0D, 0xC5, 0x1D, 0xD6, 0x42, 0xF2, 0x34, 0x73, 0xF4, 0xFD, 0xE0, 0x24, 0x6F, 0xD3, 0x75, 0xD8, 0xCC, 0xB6, 0x99, 0x4F, 0x29, 0x0A, 0x08, 0xE4, 0x27, 0x19, 0x31, 0xC9, 0x20, 0x94, 0x45, 0xED, 0xDC, 0xBD, 0x7E, 0x50 }; unsigned char table_91[32] = { 0x03, 0x04, 0x0C, 0x18, 0x10, 0x0D, 0x13, 0x1B, 0x1F, 0x07, 0x11, 0x17, 0x1C, 0x1D, 0x05, 0x06, 0x0A, 0x12, 0x02, 0x1A, 0x0B, 0x01, 0x0E, 0x08, 0x14, 0x16, 0x00, 0x15, 0x19, 0x09, 0x0F, 0x1E }; unsigned char table_92[32] = { 0x1E, 0x10, 0x01, 0x07, 0x11, 0x16, 0x15, 0x17, 0x1F, 0x14, 0x0C, 0x1C, 0x06, 0x03, 0x00, 0x18, 0x08, 0x0E, 0x02, 0x1B, 0x09, 0x0D, 0x19, 0x05, 0x0F, 0x12, 0x0B, 0x13, 0x0A, 0x04, 0x1D, 0x1A }; unsigned char table_93[256] = { 0x76, 0x78, 0xA2, 0x94, 0x0E, 0x7F, 0xDF, 0xC1, 0xB9, 0xE1, 0x3D, 0x59, 0x6F, 0x1E, 0x53, 0x99, 0x80, 0xE3, 0x21, 0xF8, 0x65, 0xB8, 0x08, 0xBC, 0x29, 0x17, 0xFD, 0x33, 0x35, 0xF2, 0x70, 0xC7, 0x25, 0xD0, 0xCD, 0x7A, 0xB7, 0x9B, 0xA5, 0xC3, 0x00, 0x90, 0xDC, 0xB1, 0x0C, 0x20, 0x67, 0x8D, 0x43, 0x49, 0xF3, 0x96, 0x14, 0x1A, 0xC8, 0x19, 0x72, 0xD7, 0x8A, 0x38, 0x66, 0xDA, 0xDD, 0x2E, 0xBE, 0xD5, 0x91, 0x7C, 0x3A, 0x92, 0x8E, 0xE7, 0x51, 0xB5, 0xA8, 0xD9, 0x0B, 0x2A, 0xBA, 0x81, 0x41, 0x0F, 0xBD, 0x4E, 0x31, 0x23, 0x9C, 0x8B, 0x2B, 0x1D, 0x04, 0x3E, 0x8C, 0xF0, 0x45, 0xA0, 0x1C, 0x44, 0x55, 0x5E, 0xF1, 0x98, 0x54, 0x5D, 0x9D, 0x84, 0xAE, 0x09, 0xA9, 0xC5, 0x83, 0x60, 0x86, 0x95, 0xB4, 0xFA, 0x6B, 0xA7, 0x9A, 0xCA, 0x8F, 0x4F, 0x0A, 0x7B, 0xB0, 0x02, 0xEA, 0xA4, 0x18, 0xDB, 0xD3, 0x64, 0xEB, 0xFC, 0xC4, 0xC9, 0xF5, 0xD6, 0xCC, 0x75, 0x0D, 0x5C, 0x93, 0x4A, 0x6D, 0xC0, 0x1F, 0x50, 0xE6, 0x16, 0xEE, 0x07, 0xFB, 0x74, 0x56, 0x58, 0x52, 0x89, 0x79, 0x68, 0xB6, 0xFE, 0x01, 0xD4, 0x7E, 0x06, 0xBF, 0xCB, 0x5B, 0xC2, 0xC6, 0x32, 0xAC, 0x26, 0x22, 0xD2, 0x82, 0x46, 0x69, 0x15, 0x2C, 0xF7, 0xAD, 0x13, 0x4D, 0xA3, 0xF6, 0x2D, 0x48, 0x71, 0x57, 0x11, 0x63, 0x05, 0x5F, 0x9E, 0x4B, 0xAB, 0xA6, 0x61, 0xBB, 0xA1, 0x3C, 0x97, 0xF9, 0x03, 0x40, 0x12, 0xCF, 0x37, 0xE4, 0x10, 0x6A, 0xED, 0xFF, 0x62, 0x42, 0x4C, 0xAF, 0x9F, 0xE5, 0xE8, 0xD8, 0xD1, 0x28, 0x3F, 0x1B, 0xE9, 0xCE, 0x6C, 0x27, 0x88, 0xEF, 0x2F, 0xE0, 0x30, 0x87, 0x5A, 0x73, 0xB3, 0x6E, 0x3B, 0x7D, 0x77, 0x36, 0xAA, 0x39, 0xDE, 0x24, 0x34, 0xE2, 0xEC, 0x85, 0x47, 0xF4, 0xB2 }; unsigned char table_94[32] = { 0x1C, 0x07, 0x05, 0x1A, 0x10, 0x1D, 0x14, 0x12, 0x08, 0x0F, 0x0C, 0x01, 0x04, 0x1B, 0x16, 0x0A, 0x11, 0x02, 0x1F, 0x13, 0x0D, 0x1E, 0x17, 0x06, 0x0E, 0x09, 0x15, 0x19, 0x03, 0x18, 0x00, 0x0B }; unsigned char table_95[32] = { 0x12, 0x10, 0x11, 0x15, 0x03, 0x0A, 0x14, 0x05, 0x1D, 0x07, 0x17, 0x0D, 0x09, 0x08, 0x1B, 0x1F, 0x0B, 0x06, 0x19, 0x0E, 0x18, 0x04, 0x00, 0x02, 0x1E, 0x1C, 0x01, 0x0C, 0x1A, 0x0F, 0x13, 0x16 }; unsigned char table_96[256] = { 0x1C, 0x6E, 0xCD, 0xB4, 0xB3, 0x93, 0xA8, 0x2E, 0x4F, 0x09, 0xE3, 0x72, 0x64, 0x13, 0x21, 0xF5, 0x89, 0xB2, 0xD2, 0x22, 0x5D, 0x63, 0x90, 0xC4, 0x42, 0x9B, 0x07, 0xCA, 0x16, 0x19, 0x5C, 0x2B, 0x3D, 0xA0, 0x69, 0x5F, 0x52, 0x41, 0x66, 0xC0, 0x55, 0xDA, 0x82, 0x40, 0x25, 0x02, 0x3C, 0xDD, 0xAE, 0xD7, 0xD6, 0xDB, 0x04, 0x78, 0x05, 0x4A, 0x4C, 0x81, 0x00, 0xBE, 0x45, 0xC5, 0x30, 0xB0, 0x65, 0x5A, 0xA9, 0x38, 0x75, 0x26, 0x85, 0x4E, 0xF0, 0xA2, 0x91, 0x8A, 0x54, 0xD0, 0x3E, 0x0D, 0xFE, 0xF2, 0x0A, 0x23, 0x24, 0x37, 0x32, 0x0B, 0xCB, 0xB5, 0x28, 0x6A, 0x95, 0x49, 0x53, 0x9A, 0xEE, 0x2C, 0x9D, 0xD4, 0x1D, 0x46, 0xC9, 0x79, 0xCC, 0xDF, 0x17, 0xE8, 0x6D, 0x29, 0x0E, 0x80, 0xE0, 0x62, 0xA1, 0xFA, 0x10, 0xF6, 0x03, 0xC1, 0x15, 0x14, 0x1F, 0x99, 0x97, 0xD5, 0x9E, 0x3F, 0x7B, 0x2F, 0xEF, 0x2A, 0x68, 0x83, 0xE2, 0x1B, 0xC8, 0x87, 0x12, 0x70, 0xC7, 0x36, 0xD3, 0x73, 0x8B, 0x7D, 0x47, 0x9F, 0xD9, 0xFB, 0x6C, 0x5B, 0xFC, 0xAA, 0xB9, 0xB1, 0x0C, 0x31, 0x8E, 0xF3, 0x92, 0xA3, 0x4B, 0xF1, 0xC2, 0x3A, 0x67, 0xEA, 0x77, 0x11, 0xB6, 0xE4, 0x1A, 0x33, 0xD1, 0xBA, 0xF9, 0xAC, 0x43, 0xE5, 0xC3, 0xC6, 0xFD, 0xF4, 0x44, 0x6F, 0xB7, 0x88, 0xA7, 0xF8, 0x34, 0x94, 0x6B, 0x27, 0xDE, 0x1E, 0xDC, 0x01, 0x61, 0x50, 0xAD, 0x74, 0x4D, 0x86, 0xF7, 0x8D, 0x9C, 0x0F, 0x5E, 0xBD, 0x08, 0x84, 0x18, 0xED, 0xA5, 0x39, 0xAB, 0x98, 0x48, 0xE6, 0x2D, 0x96, 0xCF, 0x7F, 0xFF, 0xBB, 0x8F, 0xEC, 0xBF, 0xE7, 0x56, 0xA4, 0x35, 0x76, 0xA6, 0xAF, 0xBC, 0x71, 0xE9, 0xB8, 0x7E, 0x7C, 0x06, 0x3B, 0xEB, 0x60, 0x7A, 0x8C, 0x59, 0xCE, 0xE1, 0x57, 0x20, 0x58, 0x51, 0xD8 }; unsigned char table_97[256] = { 0x15, 0x2D, 0xAF, 0x36, 0xCF, 0xD3, 0xD0, 0xED, 0xB2, 0x1B, 0xFE, 0x92, 0xBD, 0xAD, 0x58, 0x0F, 0x76, 0x3C, 0x47, 0x03, 0x2E, 0x4C, 0x40, 0xF7, 0x39, 0xA7, 0x72, 0x22, 0x95, 0xF3, 0x8C, 0xE0, 0x79, 0xB6, 0x75, 0x82, 0x94, 0x8F, 0x44, 0xFC, 0xB0, 0x05, 0xE9, 0x10, 0x68, 0xE7, 0xF1, 0xA5, 0xA8, 0xE2, 0x6F, 0xBE, 0xE5, 0x54, 0xA2, 0xC6, 0xDB, 0x1C, 0x9E, 0x6D, 0x14, 0xA1, 0x26, 0x34, 0x1E, 0x1A, 0x06, 0x53, 0xEE, 0x67, 0xA9, 0x73, 0xD5, 0x59, 0x2F, 0x61, 0xE6, 0x74, 0xD6, 0x97, 0xC0, 0x0C, 0xB1, 0x6E, 0x6C, 0x33, 0xC8, 0x77, 0x8B, 0x49, 0x43, 0xE3, 0xB5, 0xDE, 0x6A, 0xA0, 0x78, 0x2A, 0xC9, 0xF9, 0x9A, 0xDC, 0x90, 0x55, 0xF4, 0x16, 0x5E, 0x3F, 0xC5, 0x7C, 0xFA, 0x09, 0x8E, 0x87, 0xF2, 0x9D, 0x70, 0x27, 0x9B, 0xC4, 0xCD, 0x91, 0x4B, 0xB4, 0x18, 0xE1, 0x3D, 0x5D, 0x7A, 0xEA, 0xF0, 0x65, 0xB9, 0xF6, 0xC3, 0x66, 0x21, 0x96, 0xD1, 0xB8, 0x56, 0x62, 0x48, 0x28, 0x3A, 0x86, 0x63, 0xD4, 0xD7, 0x41, 0x8D, 0x20, 0xC2, 0x98, 0x37, 0xD8, 0x85, 0x42, 0x0D, 0x31, 0x84, 0x4E, 0x11, 0x46, 0x2B, 0x19, 0xCC, 0xB7, 0x69, 0x13, 0x6B, 0x29, 0x38, 0x7E, 0x0E, 0xD2, 0x3B, 0x60, 0x89, 0x7F, 0xEF, 0x07, 0x08, 0xCA, 0xBF, 0x3E, 0xA3, 0xAA, 0x52, 0x4A, 0x45, 0x00, 0xC7, 0xF8, 0x57, 0xEB, 0x93, 0x9C, 0x4D, 0x7B, 0x2C, 0xBB, 0xFB, 0xFF, 0x35, 0x4F, 0x32, 0xA6, 0x23, 0x8A, 0xDD, 0x12, 0xA4, 0x81, 0x17, 0x1D, 0x1F, 0xCB, 0x0A, 0x71, 0x02, 0xAC, 0xDF, 0x24, 0xAB, 0x7D, 0x30, 0x5C, 0x01, 0x5A, 0xBA, 0xEC, 0x51, 0xF5, 0x0B, 0x64, 0xCE, 0xAE, 0x5B, 0x50, 0x80, 0x88, 0xE8, 0x5F, 0x04, 0xDA, 0xE4, 0xBC, 0x83, 0x25, 0x9F, 0xD9, 0x99, 0xC1, 0xFD, 0xB3 }; unsigned char table_98[256] = { 0xC8, 0xE6, 0x38, 0x93, 0xE5, 0x03, 0x18, 0x1F, 0xE9, 0x5A, 0xB6, 0xAF, 0xC3, 0x95, 0x00, 0x51, 0xC0, 0xFD, 0x32, 0xE8, 0x96, 0x57, 0xF0, 0xAA, 0xDC, 0x71, 0xF8, 0x01, 0x40, 0x0A, 0x4F, 0xB0, 0x1B, 0x9D, 0x16, 0x92, 0xF3, 0x5E, 0xA9, 0x3C, 0xBE, 0x6A, 0xA7, 0xE3, 0x35, 0x0D, 0xAD, 0xDB, 0x48, 0xE0, 0x7E, 0xC6, 0xB4, 0x6D, 0x17, 0x41, 0x3E, 0xE2, 0x87, 0x12, 0xE1, 0x53, 0xD9, 0x8A, 0xAC, 0xA6, 0xD8, 0xFA, 0x36, 0x0B, 0x06, 0xDF, 0x6C, 0x4E, 0xA4, 0xBC, 0xC9, 0xEE, 0x44, 0x26, 0xF2, 0xE4, 0x9E, 0x34, 0xEF, 0x05, 0x0F, 0x7F, 0xD1, 0xCD, 0x67, 0x28, 0xC1, 0x8E, 0x7D, 0x90, 0x8F, 0x60, 0x1E, 0x19, 0xBD, 0x77, 0xB8, 0xD5, 0x3D, 0x8C, 0x31, 0x99, 0x08, 0xDD, 0x04, 0x30, 0x61, 0xFB, 0xEB, 0x98, 0x15, 0xFC, 0x10, 0xDE, 0x20, 0xBA, 0xA1, 0xB3, 0xD4, 0x91, 0x6F, 0x9F, 0x94, 0x5B, 0x42, 0xCB, 0x75, 0x1C, 0xBB, 0x5C, 0x5D, 0xD6, 0x66, 0x50, 0xB9, 0xF1, 0x82, 0x7B, 0x33, 0x23, 0x4A, 0xA5, 0x55, 0x97, 0xEA, 0x37, 0xF4, 0x64, 0x6E, 0xBF, 0x8B, 0xB1, 0x07, 0x9A, 0x43, 0x11, 0x65, 0xC2, 0x02, 0xDA, 0x9B, 0x25, 0xCA, 0x3B, 0x7A, 0xCE, 0xA8, 0xCF, 0xF7, 0x56, 0x6B, 0xF9, 0x47, 0x2A, 0x2E, 0x1D, 0x2D, 0xE7, 0x46, 0xD0, 0x62, 0x4C, 0x80, 0x4B, 0x2B, 0xF5, 0x69, 0x9C, 0x45, 0xED, 0x83, 0xAB, 0x74, 0x39, 0xA3, 0x85, 0xD7, 0x5F, 0xB2, 0x86, 0x22, 0x29, 0x89, 0x49, 0x1A, 0xC4, 0x52, 0xEC, 0x8D, 0x73, 0xD3, 0x7C, 0x79, 0xD2, 0x14, 0x4D, 0x84, 0xA2, 0x0E, 0x70, 0x78, 0x72, 0xB7, 0xA0, 0xC5, 0x81, 0x58, 0x0C, 0x68, 0x27, 0xFF, 0xF6, 0xAE, 0xCC, 0x88, 0xFE, 0x24, 0x2F, 0x76, 0x3F, 0x59, 0x21, 0x54, 0x3A, 0x13, 0x09, 0x2C, 0xB5, 0xC7, 0x63 }; unsigned char table_99[32] = { 0x19, 0x00, 0x10, 0x18, 0x09, 0x11, 0x13, 0x1D, 0x08, 0x1A, 0x02, 0x05, 0x03, 0x17, 0x12, 0x01, 0x1F, 0x14, 0x06, 0x07, 0x15, 0x0D, 0x0F, 0x0B, 0x0E, 0x16, 0x1E, 0x04, 0x1B, 0x0A, 0x0C, 0x1C }; unsigned char table_100[256] = { 0x9B, 0x3A, 0xAE, 0x60, 0x27, 0x67, 0x1E, 0x4E, 0x91, 0xDA, 0x85, 0x43, 0x5C, 0xCC, 0x89, 0x55, 0x75, 0x56, 0xF2, 0x86, 0xEB, 0xC4, 0x0D, 0xE6, 0x63, 0x88, 0x38, 0x59, 0x68, 0xD0, 0x18, 0xF0, 0xBA, 0x28, 0xF5, 0x80, 0x02, 0x5B, 0xE1, 0xA4, 0x7A, 0x4B, 0x8E, 0xF7, 0x9E, 0x99, 0x70, 0xEF, 0x66, 0x50, 0xB1, 0xCD, 0x9A, 0xAF, 0x5F, 0x21, 0xE5, 0x5D, 0x14, 0xD4, 0x34, 0x22, 0xC3, 0x0F, 0x44, 0xB6, 0x92, 0xCE, 0xB4, 0x6E, 0xB0, 0x00, 0xF9, 0xB5, 0x10, 0xEA, 0x45, 0x2F, 0x2B, 0xF4, 0xF6, 0xFE, 0xCB, 0x0A, 0x42, 0xF8, 0xE7, 0xFD, 0xC8, 0xC2, 0x6C, 0x9C, 0x57, 0xA1, 0x46, 0x04, 0xE9, 0x97, 0x40, 0x32, 0x19, 0xFA, 0x51, 0xD1, 0x6D, 0x4C, 0x2A, 0xD9, 0x95, 0x26, 0x72, 0x1B, 0x83, 0x93, 0x5A, 0x15, 0x33, 0xC5, 0x77, 0x13, 0xE0, 0x36, 0x37, 0xDB, 0xA7, 0xC7, 0x81, 0x62, 0xC1, 0x47, 0x64, 0x74, 0x1D, 0x84, 0x29, 0x39, 0x41, 0x35, 0x09, 0x90, 0x20, 0x9F, 0x8C, 0x7D, 0x3E, 0x07, 0xB9, 0x76, 0x06, 0xA3, 0x31, 0x7F, 0x49, 0x6F, 0x3D, 0xD5, 0x25, 0xAC, 0xDF, 0x0B, 0x3C, 0x79, 0x01, 0x8F, 0x82, 0x2E, 0xFC, 0x98, 0xA5, 0x58, 0xA0, 0x4A, 0x7C, 0x24, 0xDD, 0x05, 0x4D, 0x12, 0xBC, 0xAA, 0xE2, 0xAB, 0xD3, 0xBF, 0x94, 0x2D, 0x54, 0xBB, 0xAD, 0xB7, 0x6A, 0xE3, 0xBD, 0x5E, 0x8D, 0x08, 0x3B, 0xB8, 0x73, 0x8A, 0x16, 0xD2, 0x69, 0xE8, 0xEE, 0x53, 0xD8, 0xDC, 0x48, 0xCF, 0xC6, 0xA9, 0x1A, 0xCA, 0x17, 0x11, 0xED, 0xC0, 0xA6, 0x1F, 0x96, 0x8B, 0xFF, 0x78, 0x03, 0x61, 0x1C, 0xA8, 0x3F, 0x9D, 0x0E, 0xC9, 0xE4, 0xA2, 0x52, 0xEC, 0x4F, 0xD6, 0xF3, 0x6B, 0x87, 0xB3, 0x7E, 0xDE, 0xD7, 0x71, 0x65, 0xF1, 0x30, 0x0C, 0xB2, 0x7B, 0xBE, 0xFB, 0x23, 0x2C }; unsigned char table_101[32] = { 0x18, 0x08, 0x14, 0x17, 0x03, 0x10, 0x19, 0x04, 0x0D, 0x1C, 0x06, 0x1D, 0x1E, 0x12, 0x11, 0x0B, 0x0F, 0x02, 0x0E, 0x1B, 0x13, 0x05, 0x07, 0x16, 0x15, 0x0A, 0x0C, 0x1A, 0x00, 0x01, 0x1F, 0x09 }; unsigned char table_102[32] = { 0x17, 0x1F, 0x0E, 0x05, 0x13, 0x0C, 0x14, 0x1A, 0x0F, 0x01, 0x12, 0x1C, 0x00, 0x07, 0x0D, 0x02, 0x10, 0x16, 0x04, 0x11, 0x1D, 0x03, 0x1E, 0x18, 0x06, 0x15, 0x0A, 0x19, 0x09, 0x08, 0x1B, 0x0B }; unsigned char table_103[32] = { 0x0F, 0x09, 0x1E, 0x11, 0x0D, 0x08, 0x10, 0x00, 0x01, 0x1F, 0x1D, 0x1C, 0x12, 0x04, 0x07, 0x05, 0x19, 0x14, 0x1B, 0x02, 0x1A, 0x15, 0x17, 0x16, 0x18, 0x0B, 0x0A, 0x13, 0x0C, 0x0E, 0x03, 0x06 }; unsigned char table_104[256] = { 0xA4, 0x9F, 0x78, 0x39, 0x3D, 0x81, 0x51, 0x24, 0x46, 0x2A, 0x56, 0xE8, 0xDF, 0x73, 0xA8, 0xA2, 0x0D, 0xDC, 0xA5, 0x4F, 0xF0, 0x93, 0xC0, 0x76, 0x38, 0x70, 0xB0, 0x30, 0x98, 0x13, 0x8B, 0x14, 0x26, 0x45, 0x0F, 0x7D, 0x34, 0x72, 0x6B, 0x89, 0x43, 0xE2, 0x96, 0x5B, 0xEF, 0x2B, 0xF9, 0xDE, 0x82, 0xB5, 0x61, 0x4A, 0x17, 0xC2, 0x5A, 0xCB, 0xB2, 0x8D, 0xE4, 0xEC, 0xD9, 0x80, 0xBC, 0x62, 0x67, 0x11, 0xA9, 0x3A, 0xE1, 0xC4, 0xEA, 0xD2, 0x71, 0xD0, 0xDB, 0xE5, 0x7B, 0x08, 0x77, 0xD6, 0x10, 0x19, 0x48, 0xEB, 0xAA, 0x2C, 0x0C, 0x59, 0xBE, 0xF6, 0x28, 0x50, 0x90, 0x87, 0xCD, 0x04, 0x1F, 0x79, 0x99, 0x5C, 0x49, 0x06, 0x8A, 0x3E, 0x5F, 0x5E, 0x15, 0x23, 0x2D, 0xB6, 0xA6, 0x7A, 0x03, 0x20, 0xDA, 0xFB, 0x35, 0x75, 0xC7, 0x47, 0xB9, 0x7C, 0xA1, 0xCE, 0xC5, 0xDD, 0xFD, 0x6C, 0x05, 0xAC, 0x09, 0xB4, 0x95, 0xD1, 0xB1, 0x63, 0xFF, 0xAE, 0xD5, 0x25, 0x1E, 0x6E, 0x57, 0x18, 0x74, 0xE6, 0x2F, 0x9A, 0xE7, 0x42, 0x65, 0xF5, 0x58, 0x27, 0x33, 0x9C, 0xCF, 0xB7, 0xC3, 0xF1, 0x12, 0x1D, 0xB8, 0xF4, 0x64, 0x4D, 0xD4, 0xBD, 0xE3, 0xAB, 0x44, 0x60, 0xAF, 0xCC, 0x0A, 0xFC, 0xD3, 0x21, 0x0B, 0x1A, 0x6D, 0x83, 0xA7, 0x8E, 0x3C, 0xC1, 0xED, 0xF3, 0x2E, 0x86, 0xC9, 0x41, 0x02, 0xF7, 0xC8, 0x40, 0x1B, 0xF8, 0xF2, 0x07, 0x5D, 0x4E, 0xC6, 0x29, 0xD7, 0x4B, 0x7E, 0x31, 0x94, 0x32, 0x01, 0x92, 0xE9, 0x36, 0x0E, 0x7F, 0x85, 0x16, 0xFA, 0x00, 0x88, 0x3F, 0x68, 0x4C, 0x22, 0x55, 0xBF, 0x9D, 0xE0, 0x6A, 0xAD, 0xBA, 0x91, 0xCA, 0xA3, 0x1C, 0xEE, 0xD8, 0x3B, 0x66, 0x69, 0x9B, 0x84, 0xA0, 0xB3, 0x6F, 0xFE, 0x52, 0x97, 0xBB, 0x37, 0x8C, 0x54, 0x53, 0x9E, 0x8F }; unsigned char table_105[256] = { 0x7B, 0x35, 0x11, 0x79, 0x07, 0x2F, 0xF6, 0x82, 0x8E, 0xB4, 0x6E, 0xD2, 0x6D, 0xC5, 0x8C, 0x1C, 0xE0, 0xD6, 0x34, 0xF0, 0x4F, 0x25, 0x59, 0xE8, 0xDF, 0x1D, 0xEB, 0x32, 0x86, 0x51, 0xA4, 0xF2, 0x5C, 0xD1, 0xC8, 0x41, 0xEC, 0x9D, 0x62, 0xAC, 0xDD, 0x3E, 0xB8, 0x65, 0x75, 0x89, 0x12, 0x6C, 0x40, 0x4E, 0xC7, 0x27, 0xE1, 0x37, 0xCF, 0x09, 0x16, 0x78, 0xAA, 0x58, 0x0D, 0xE6, 0x54, 0xFE, 0x8F, 0xFD, 0xF9, 0x61, 0x26, 0x3F, 0x2E, 0xCD, 0x2C, 0x04, 0xB2, 0x80, 0x0F, 0x14, 0x6F, 0xC6, 0xAB, 0xFB, 0x13, 0xDB, 0x9A, 0x21, 0xB3, 0xC0, 0xA9, 0x19, 0x70, 0xF3, 0x2B, 0xAE, 0x9B, 0x49, 0xB7, 0xA8, 0x24, 0x1B, 0x48, 0xEA, 0xED, 0xD9, 0x47, 0x9E, 0x9C, 0x69, 0x3C, 0x66, 0xBB, 0x06, 0x46, 0x38, 0x17, 0xB5, 0xCB, 0x05, 0x4A, 0x5E, 0x15, 0x20, 0xB9, 0xB6, 0x33, 0x4C, 0x7D, 0xA3, 0xD7, 0xB1, 0x23, 0x72, 0xC3, 0x4B, 0x63, 0xBE, 0xF7, 0x5B, 0x74, 0x64, 0x77, 0xCC, 0xD3, 0x85, 0xDE, 0x1A, 0x31, 0x97, 0xA2, 0x8B, 0xFC, 0x10, 0x5F, 0xDC, 0xD5, 0xB0, 0xBD, 0x55, 0xC1, 0xE7, 0x0C, 0x50, 0x43, 0x39, 0x71, 0x52, 0xE5, 0xAF, 0x8A, 0x60, 0x92, 0x2D, 0xD8, 0x03, 0xF5, 0x28, 0xCA, 0xEF, 0xD0, 0xC2, 0x53, 0x91, 0xA6, 0x73, 0x56, 0xA5, 0xF1, 0x57, 0x42, 0xF4, 0xD4, 0x36, 0x8D, 0xBC, 0xE9, 0x7E, 0x02, 0x76, 0x18, 0x0B, 0x84, 0x5A, 0xE2, 0xBF, 0x68, 0x95, 0x29, 0x98, 0xAD, 0x88, 0x1F, 0x81, 0x67, 0xA1, 0x3A, 0xA7, 0x22, 0xF8, 0x01, 0xA0, 0xCE, 0x7A, 0xDA, 0x30, 0xC4, 0xE4, 0xEE, 0x7C, 0x3B, 0x4D, 0x3D, 0xE3, 0xFA, 0x6A, 0x7F, 0x99, 0x00, 0x93, 0x0E, 0xFF, 0x90, 0x0A, 0x2A, 0x5D, 0x96, 0x08, 0x6B, 0x83, 0xBA, 0x1E, 0x44, 0x87, 0x45, 0x9F, 0xC9, 0x94 }; unsigned char table_106[32] = { 0x03, 0x11, 0x07, 0x1B, 0x0F, 0x14, 0x0C, 0x01, 0x04, 0x02, 0x09, 0x0A, 0x05, 0x12, 0x06, 0x1F, 0x1C, 0x0E, 0x0D, 0x15, 0x18, 0x08, 0x00, 0x10, 0x1E, 0x1D, 0x17, 0x19, 0x13, 0x16, 0x0B, 0x1A }; unsigned char table_107[32] = { 0x13, 0x1B, 0x06, 0x11, 0x1C, 0x07, 0x08, 0x0E, 0x10, 0x05, 0x09, 0x18, 0x04, 0x15, 0x1E, 0x0F, 0x1F, 0x12, 0x02, 0x00, 0x17, 0x19, 0x1A, 0x0D, 0x03, 0x0C, 0x0A, 0x1D, 0x14, 0x01, 0x16, 0x0B }; unsigned char table_108[256] = { 0x99, 0xA3, 0x48, 0xE8, 0x5A, 0x7D, 0x97, 0xCA, 0x7F, 0x06, 0x9B, 0x04, 0xE0, 0xF3, 0x18, 0xAE, 0x59, 0xA0, 0x2B, 0x15, 0x85, 0x3E, 0x12, 0x93, 0x3D, 0x28, 0x32, 0xF5, 0x20, 0x5D, 0x86, 0x00, 0x1B, 0x2E, 0x36, 0x10, 0x5E, 0x6C, 0xD8, 0x29, 0xB6, 0x3F, 0x05, 0x1C, 0xCE, 0xC2, 0x34, 0x5F, 0x5C, 0x79, 0xD1, 0x1F, 0xA2, 0xEE, 0x8A, 0x69, 0xB5, 0x87, 0x96, 0x6D, 0x4D, 0xC1, 0x61, 0x2C, 0x11, 0xE7, 0x8E, 0xBF, 0x1E, 0x53, 0xD0, 0x58, 0x76, 0xA4, 0x60, 0xA9, 0xB0, 0xF9, 0xEA, 0x3C, 0x52, 0x9A, 0x24, 0xF1, 0x9F, 0xD3, 0x40, 0x0A, 0x63, 0x78, 0x6A, 0x8B, 0x08, 0x22, 0x16, 0x83, 0x6B, 0xD2, 0x49, 0x19, 0xBD, 0xFD, 0x62, 0x72, 0xA8, 0x55, 0xAB, 0x0C, 0xB9, 0x13, 0xD5, 0xF0, 0xF2, 0x84, 0xAF, 0x2F, 0x7B, 0x2A, 0x21, 0x0F, 0xDA, 0x30, 0x71, 0xD6, 0x81, 0xE6, 0xEC, 0x41, 0x90, 0x50, 0x66, 0x0E, 0xA7, 0xB8, 0xF7, 0x3A, 0xB2, 0xCF, 0x3B, 0xFC, 0x56, 0x6F, 0xC3, 0xA6, 0xC9, 0xA1, 0x8D, 0xBB, 0x9D, 0x75, 0xF6, 0xAA, 0x7E, 0xF8, 0x33, 0xEF, 0xBC, 0x7C, 0x23, 0x1A, 0x92, 0x6E, 0x2D, 0x8F, 0xED, 0xB7, 0xB1, 0x1D, 0x67, 0x39, 0xAC, 0x0D, 0x74, 0xDB, 0x7A, 0x94, 0x07, 0x09, 0xC0, 0xD7, 0xAD, 0xFE, 0x54, 0x91, 0xDE, 0x45, 0xA5, 0x77, 0xCB, 0x37, 0xC6, 0x38, 0x89, 0x88, 0x17, 0xD9, 0x4F, 0xDF, 0x25, 0xFB, 0xFA, 0x4C, 0x80, 0x35, 0x82, 0xF4, 0x95, 0xC8, 0xFF, 0xE9, 0x31, 0x01, 0x14, 0xB3, 0x02, 0x9E, 0x4E, 0x43, 0x46, 0xC7, 0xEB, 0x51, 0xE5, 0x47, 0xB4, 0xE3, 0xDC, 0x57, 0xC4, 0x98, 0x03, 0xE1, 0xBA, 0x68, 0xCD, 0x27, 0xC5, 0x0B, 0xD4, 0x64, 0x4B, 0x9C, 0x70, 0x65, 0x4A, 0xE4, 0x42, 0xDD, 0xCC, 0xE2, 0x44, 0x73, 0xBE, 0x26, 0x8C, 0x5B }; unsigned char table_109[256] = { 0xE3, 0x95, 0xDB, 0x09, 0x82, 0x0A, 0x8F, 0x9E, 0xC9, 0xDC, 0x28, 0x35, 0x0F, 0x8B, 0xA8, 0xA5, 0x7F, 0x3D, 0x8C, 0xD1, 0x93, 0x57, 0x04, 0xAA, 0x6A, 0x98, 0x81, 0xDD, 0x16, 0x67, 0x2E, 0xDF, 0xED, 0xF7, 0xB2, 0xBD, 0x14, 0xB6, 0x76, 0xC8, 0x75, 0x9F, 0x48, 0xAE, 0xBB, 0xB0, 0xF3, 0xE2, 0xD4, 0x59, 0xD8, 0x9C, 0x64, 0xC1, 0x73, 0x21, 0x6D, 0x96, 0x7B, 0x62, 0x56, 0x55, 0xCC, 0xFD, 0xCE, 0x41, 0xA3, 0x43, 0x33, 0xAF, 0x23, 0x9D, 0x6F, 0x65, 0x19, 0x52, 0xAD, 0xC6, 0xD3, 0x3F, 0x66, 0xFF, 0xD0, 0x30, 0x6C, 0xC0, 0xEB, 0xCF, 0x51, 0x88, 0x38, 0x72, 0x69, 0x77, 0x3B, 0xFA, 0xBA, 0xB7, 0xA1, 0x91, 0xE0, 0x89, 0xAB, 0x44, 0x1B, 0x05, 0x5B, 0xB9, 0x71, 0x47, 0x7E, 0xFB, 0x02, 0xC7, 0x99, 0x6E, 0x42, 0x20, 0x90, 0x1F, 0x4A, 0x85, 0x1A, 0xEA, 0x0C, 0x0D, 0xB3, 0xDA, 0xE7, 0x13, 0xE6, 0xD7, 0x6B, 0x12, 0x46, 0x53, 0xB5, 0xF8, 0x1D, 0x83, 0x54, 0x49, 0x8A, 0x26, 0x4D, 0xDE, 0xF6, 0x03, 0xA2, 0x7D, 0x0E, 0xA0, 0x68, 0x79, 0xCA, 0x0B, 0x5D, 0x40, 0x4F, 0x80, 0xC2, 0xD6, 0x87, 0x70, 0xF0, 0xD2, 0x92, 0xEE, 0xBE, 0x74, 0x5F, 0xBC, 0xA4, 0x4B, 0xFE, 0x37, 0x60, 0xA9, 0x06, 0xA7, 0xE1, 0xF5, 0x2B, 0x10, 0xEF, 0x2C, 0x07, 0x86, 0x7A, 0x27, 0xE9, 0xC5, 0xAC, 0x32, 0x22, 0xF2, 0xE5, 0x8D, 0x31, 0x01, 0x34, 0xA6, 0xB8, 0xC3, 0x3C, 0xE4, 0x08, 0x94, 0x15, 0x4E, 0xB4, 0x39, 0x58, 0x00, 0x3E, 0x29, 0x45, 0x3A, 0x84, 0x36, 0xF1, 0x2A, 0x50, 0x11, 0xC4, 0x5A, 0xFC, 0xBF, 0xD9, 0xF9, 0x17, 0x9B, 0x8E, 0x18, 0x63, 0x4C, 0x2F, 0x78, 0x2D, 0x5E, 0x9A, 0xCD, 0x24, 0xEC, 0x7C, 0x97, 0x61, 0xCB, 0x1E, 0xF4, 0xD5, 0xB1, 0x5C, 0x25, 0xE8, 0x1C }; unsigned char table_110[256] = { 0xC3, 0x06, 0x3C, 0xCB, 0xD2, 0x44, 0x9D, 0x48, 0x28, 0xAA, 0xA9, 0xD0, 0x64, 0x25, 0x56, 0xCA, 0xC2, 0xF8, 0x5C, 0xAE, 0x4E, 0x63, 0xB2, 0xE9, 0x35, 0x11, 0xA8, 0x1A, 0x76, 0x15, 0xE0, 0x26, 0x97, 0x99, 0xD4, 0x43, 0x80, 0xEE, 0xC1, 0x69, 0xA6, 0x1E, 0x7A, 0x42, 0x55, 0x38, 0xBF, 0x75, 0x0E, 0x29, 0xF5, 0xF3, 0x36, 0x7D, 0x51, 0xE8, 0xE5, 0xEB, 0x68, 0x60, 0x0C, 0x70, 0xFD, 0xCC, 0xE3, 0x23, 0x09, 0x6D, 0x2D, 0x6C, 0x5E, 0xB6, 0x98, 0x8B, 0x1F, 0x50, 0x34, 0x8D, 0x10, 0x92, 0x82, 0x85, 0xD5, 0x79, 0x02, 0xA4, 0x0A, 0xBC, 0x40, 0xC6, 0xA3, 0x72, 0x8F, 0xC4, 0xA5, 0xE4, 0x49, 0xD6, 0xCE, 0xA1, 0x12, 0x4F, 0x30, 0x31, 0xDE, 0x2A, 0xF7, 0x95, 0xB5, 0x96, 0x14, 0x08, 0xE6, 0x3D, 0x86, 0xF2, 0x47, 0x74, 0xB8, 0x5D, 0x1D, 0x2B, 0x3A, 0x93, 0x7C, 0x6A, 0x01, 0xA0, 0x9A, 0x4D, 0xB7, 0x71, 0xA7, 0x41, 0xC5, 0x65, 0xC8, 0x89, 0xD1, 0x3E, 0x0D, 0xD8, 0xFF, 0x6F, 0x7F, 0xA2, 0xFE, 0xD9, 0xF0, 0x4A, 0x07, 0x1C, 0x0F, 0x6E, 0x03, 0x81, 0x1B, 0x05, 0xDF, 0x52, 0xF1, 0x8A, 0xF9, 0xDD, 0x91, 0x3B, 0xD7, 0xE1, 0x54, 0xAD, 0x90, 0x5A, 0x7B, 0xC7, 0x32, 0x62, 0x16, 0x27, 0xB9, 0x66, 0x21, 0x88, 0xBD, 0x18, 0x77, 0x8E, 0x94, 0x8C, 0x9B, 0x46, 0x9C, 0xB1, 0xD3, 0x53, 0xB0, 0xBE, 0xAC, 0xAF, 0x73, 0x24, 0xDA, 0x58, 0xE2, 0xFC, 0x78, 0xEA, 0xCD, 0xFA, 0x37, 0xED, 0x13, 0x19, 0xC0, 0x59, 0x83, 0xBA, 0x3F, 0x57, 0x00, 0x7E, 0xC9, 0x2E, 0x17, 0x5B, 0x84, 0xF6, 0xE7, 0x22, 0xFB, 0x5F, 0x4C, 0x2C, 0x61, 0x9F, 0x45, 0x39, 0xB3, 0xEC, 0x04, 0x87, 0x67, 0xDC, 0x0B, 0xF4, 0x20, 0xAB, 0x6B, 0x9E, 0x4B, 0xCF, 0xB4, 0x2F, 0xBB, 0xEF, 0xDB, 0x33 }; unsigned char table_111[32] = { 0x09, 0x0F, 0x00, 0x15, 0x12, 0x17, 0x1A, 0x0D, 0x1C, 0x0B, 0x01, 0x0A, 0x05, 0x1E, 0x1D, 0x0C, 0x1B, 0x08, 0x19, 0x18, 0x14, 0x07, 0x0E, 0x03, 0x10, 0x16, 0x11, 0x1F, 0x04, 0x06, 0x02, 0x13 }; unsigned char table_112[256] = { 0xF9, 0x7D, 0xBE, 0xD5, 0x9F, 0xB8, 0x95, 0x43, 0xDB, 0xAE, 0x7E, 0xEC, 0x5B, 0x58, 0x18, 0x49, 0x4B, 0x9D, 0x1C, 0x3E, 0x61, 0xD1, 0xF6, 0x2F, 0x41, 0x82, 0x51, 0x37, 0x72, 0x79, 0x05, 0x2A, 0xC2, 0xB0, 0xE2, 0xE7, 0xB2, 0xF3, 0x1B, 0x92, 0x86, 0xBB, 0xDC, 0x90, 0x1A, 0x19, 0xD7, 0xBA, 0x2C, 0x7B, 0xEF, 0xC7, 0x8A, 0x81, 0xEB, 0xDE, 0x73, 0x4E, 0xB7, 0x97, 0xCA, 0x29, 0x85, 0xC1, 0xA5, 0x7F, 0xFE, 0x56, 0xE9, 0x9E, 0x21, 0x76, 0x3A, 0x88, 0x70, 0xC6, 0xD3, 0x8C, 0x47, 0xC8, 0x83, 0x48, 0xC3, 0x6A, 0x9C, 0x80, 0x53, 0xBD, 0xFD, 0x54, 0x09, 0x91, 0x94, 0xAA, 0x7A, 0x59, 0x71, 0xDD, 0xA8, 0x07, 0xCB, 0x0F, 0xE0, 0x9A, 0x36, 0x4C, 0x4D, 0x0D, 0xA4, 0x96, 0x6F, 0x14, 0x22, 0x38, 0xAD, 0x02, 0xF4, 0x0B, 0xEA, 0x93, 0x20, 0x04, 0xBC, 0xE8, 0x6C, 0xFB, 0x10, 0x6B, 0x40, 0xB6, 0x24, 0x17, 0x06, 0x31, 0xD9, 0x33, 0xF5, 0x99, 0x57, 0xCD, 0xAB, 0x67, 0x5C, 0x30, 0x1E, 0x34, 0xB4, 0x3F, 0x16, 0x42, 0xA2, 0x68, 0x27, 0xB3, 0x1D, 0xED, 0x5F, 0x52, 0xF7, 0x3C, 0x65, 0x5D, 0xE5, 0x23, 0x0C, 0x6D, 0x84, 0x6E, 0xDA, 0x77, 0xF8, 0x15, 0xFA, 0x69, 0xD0, 0xA7, 0x11, 0xAC, 0xA6, 0xA3, 0x1F, 0x2E, 0xBF, 0x4A, 0x8F, 0xFC, 0xEE, 0xC9, 0x26, 0x12, 0xC0, 0xB1, 0x45, 0x0E, 0x3D, 0x7C, 0xCE, 0x13, 0x8E, 0x98, 0x46, 0x2B, 0xC5, 0x66, 0x28, 0x32, 0xD2, 0x03, 0xE3, 0xC4, 0x9B, 0x89, 0x5E, 0xF0, 0xCF, 0x3B, 0x2D, 0x50, 0xB5, 0x00, 0x0A, 0xD6, 0x55, 0xE1, 0x62, 0x63, 0x64, 0x87, 0xAF, 0x78, 0xB9, 0xF2, 0x25, 0x44, 0xFF, 0x39, 0xF1, 0x08, 0x4F, 0x74, 0xA9, 0x8B, 0x75, 0x01, 0xA0, 0xE4, 0x35, 0x8D, 0xA1, 0xCC, 0xDF, 0x60, 0xD8, 0x5A, 0xE6, 0xD4 }; unsigned char table_113[256] = { 0x46, 0x9D, 0x39, 0xB2, 0x8D, 0x3B, 0x59, 0x5A, 0xD0, 0x9C, 0xE4, 0x04, 0x01, 0xE2, 0xB3, 0xD2, 0xD7, 0x18, 0x40, 0xD8, 0xF1, 0xEF, 0x3A, 0x1D, 0x8E, 0xE5, 0xD9, 0xD3, 0xCB, 0x49, 0x4C, 0xCF, 0xC0, 0xD6, 0xB5, 0x73, 0x77, 0x82, 0x54, 0xA2, 0xB1, 0xB0, 0x84, 0x5D, 0xC7, 0xDE, 0x31, 0x2F, 0x50, 0x78, 0xBE, 0x94, 0x64, 0x44, 0x60, 0x7A, 0x1A, 0x6E, 0x09, 0x6F, 0xBF, 0x76, 0x81, 0x38, 0x22, 0xC3, 0xEE, 0x8F, 0xFB, 0x32, 0xED, 0x92, 0xAE, 0xE6, 0x5F, 0xAA, 0xAC, 0x0D, 0xA3, 0x47, 0x1F, 0x11, 0xC1, 0x29, 0xAF, 0xFD, 0x1C, 0xDB, 0x00, 0x23, 0xB9, 0xB8, 0x91, 0x41, 0x27, 0x37, 0x43, 0x02, 0x26, 0xF6, 0x7D, 0x0A, 0x85, 0x93, 0x97, 0x2E, 0x20, 0x55, 0x13, 0x4B, 0x6C, 0xE7, 0xFC, 0x25, 0xFA, 0x9E, 0x5B, 0xA1, 0xDF, 0x2C, 0x3E, 0xBC, 0xEA, 0x42, 0x7C, 0x36, 0x30, 0xEB, 0xBD, 0x8B, 0x87, 0x16, 0x3D, 0x5C, 0x07, 0xBA, 0xB4, 0x1B, 0xC2, 0xE3, 0x71, 0x9A, 0x5E, 0x4D, 0xF2, 0xCC, 0x0E, 0xE1, 0x34, 0x75, 0x58, 0x89, 0x17, 0xD4, 0x68, 0x80, 0x2B, 0x74, 0x70, 0x8A, 0x63, 0xE8, 0x56, 0x24, 0xD1, 0x57, 0x35, 0x6D, 0x3C, 0xA6, 0xC8, 0x7E, 0xA8, 0x4E, 0xC4, 0x33, 0xA9, 0x62, 0x61, 0x7F, 0x21, 0x98, 0x2A, 0xAD, 0xB6, 0xA7, 0xF5, 0x3F, 0x15, 0x45, 0xF8, 0xA4, 0x95, 0x88, 0xDC, 0x96, 0x90, 0x08, 0x9B, 0xF9, 0x06, 0x14, 0x05, 0xF0, 0xF7, 0xA0, 0xE0, 0x65, 0xCA, 0xA5, 0x9F, 0x79, 0xCD, 0x4F, 0x72, 0xB7, 0x4A, 0x0F, 0x66, 0xC5, 0x0C, 0x52, 0xF3, 0x69, 0x83, 0x03, 0x99, 0x1E, 0x2D, 0xDA, 0x8C, 0x53, 0x28, 0xDD, 0xE9, 0x0B, 0xC9, 0xF4, 0x48, 0x12, 0x6A, 0x19, 0xCE, 0xAB, 0x51, 0xD5, 0x6B, 0xBB, 0xFE, 0x7B, 0x67, 0xFF, 0x10, 0xEC, 0xC6, 0x86 }; unsigned char table_114[32] = { 0x11, 0x10, 0x04, 0x1D, 0x08, 0x15, 0x1A, 0x1B, 0x14, 0x18, 0x0F, 0x17, 0x16, 0x07, 0x1E, 0x0E, 0x12, 0x0A, 0x13, 0x0B, 0x0C, 0x00, 0x06, 0x02, 0x1F, 0x19, 0x09, 0x1C, 0x01, 0x0D, 0x03, 0x05 }; unsigned char table_115[256] = { 0xB7, 0xBB, 0x63, 0x0D, 0xF0, 0x33, 0x5A, 0x05, 0xF2, 0x7F, 0x64, 0xDB, 0x51, 0xC9, 0x2C, 0x85, 0x4F, 0x41, 0xA4, 0x42, 0xCF, 0xA6, 0x52, 0x2F, 0x26, 0xEF, 0xFB, 0x29, 0x40, 0x16, 0xF7, 0xED, 0x23, 0x69, 0x8A, 0xDF, 0x77, 0x28, 0x93, 0x14, 0x82, 0x0C, 0xBE, 0x3D, 0x20, 0xB4, 0x79, 0x94, 0x54, 0xF8, 0x07, 0xB1, 0xE1, 0x66, 0x73, 0xD3, 0x19, 0x15, 0xFF, 0x03, 0x6A, 0x9A, 0xDC, 0x1C, 0xB3, 0x5D, 0x76, 0x68, 0x47, 0x6C, 0xF9, 0xFD, 0xE9, 0xDD, 0x01, 0x65, 0xBD, 0x80, 0x0E, 0x7A, 0x8D, 0x99, 0x13, 0x7C, 0xA5, 0xA7, 0x1A, 0xCC, 0xB8, 0xE6, 0x2B, 0xB2, 0xB6, 0xD0, 0x62, 0x2D, 0x4D, 0xD2, 0xB9, 0x04, 0x46, 0xAE, 0xAA, 0x44, 0xDA, 0x92, 0x4B, 0x4E, 0xC4, 0xE2, 0xFE, 0xA2, 0x75, 0x7B, 0xC3, 0xFA, 0x9F, 0x37, 0x9D, 0x1E, 0x72, 0xD4, 0x1F, 0x4A, 0x9B, 0xE5, 0x6D, 0xEC, 0x5C, 0x7D, 0x98, 0xE8, 0xEE, 0x86, 0xD1, 0xC8, 0xEA, 0x55, 0xBF, 0xAF, 0xDE, 0x32, 0x09, 0x3A, 0x8F, 0x57, 0x83, 0x43, 0x61, 0xC6, 0x8E, 0x96, 0x22, 0xA3, 0x97, 0x91, 0x5F, 0x11, 0x3B, 0x5B, 0x1B, 0x34, 0x49, 0x95, 0xF1, 0x6F, 0x89, 0xA8, 0xC0, 0x36, 0x0A, 0x3F, 0x60, 0x50, 0xE7, 0x08, 0xCE, 0x25, 0xC1, 0x71, 0xF6, 0x59, 0x58, 0x56, 0x4C, 0xAB, 0x27, 0xAC, 0x06, 0xCB, 0x00, 0x30, 0x84, 0x3E, 0xC2, 0x1D, 0x02, 0xE0, 0xC5, 0xD6, 0x18, 0x70, 0xA9, 0x88, 0xD9, 0x39, 0x8B, 0x6E, 0xF4, 0x24, 0xA0, 0x48, 0x45, 0x21, 0x87, 0x78, 0x38, 0x90, 0xE3, 0xCA, 0xF5, 0xD7, 0x2A, 0x53, 0x9C, 0xCD, 0x31, 0x35, 0xAD, 0x74, 0xD8, 0x12, 0xBC, 0x9E, 0x6B, 0x67, 0xB0, 0xBA, 0xE4, 0x10, 0x5E, 0xFC, 0xC7, 0x0F, 0x2E, 0x81, 0x7E, 0xA1, 0x8C, 0x17, 0xB5, 0xEB, 0xD5, 0xF3, 0x0B, 0x3C }; unsigned char table_116[32] = { 0x00, 0x05, 0x10, 0x1C, 0x0C, 0x1A, 0x04, 0x1B, 0x0A, 0x0D, 0x14, 0x0B, 0x07, 0x03, 0x12, 0x1E, 0x06, 0x11, 0x01, 0x08, 0x15, 0x09, 0x1F, 0x0F, 0x19, 0x18, 0x16, 0x02, 0x13, 0x0E, 0x17, 0x1D }; unsigned char table_117[256] = { 0xD0, 0x9A, 0xAB, 0xA8, 0xA7, 0xDF, 0x28, 0xCE, 0x3E, 0x51, 0xBF, 0x76, 0x03, 0xA0, 0x53, 0x3F, 0x90, 0x93, 0x87, 0x67, 0x98, 0x3D, 0xEA, 0x8B, 0x55, 0xCF, 0x10, 0xF3, 0x25, 0xFC, 0x9F, 0x41, 0x6B, 0x54, 0x6E, 0x0B, 0x83, 0x35, 0x69, 0x7D, 0xE0, 0x88, 0x4B, 0xE9, 0x1E, 0x96, 0x91, 0x57, 0xBD, 0x72, 0x21, 0x3C, 0xA6, 0x99, 0x6C, 0xF6, 0x13, 0xFA, 0x29, 0xED, 0xDB, 0x16, 0x4D, 0x07, 0x45, 0xA5, 0xE3, 0x0E, 0x31, 0xBC, 0x56, 0x5C, 0xB2, 0x23, 0xDA, 0x74, 0xFF, 0x02, 0x8F, 0xF4, 0x2A, 0xC9, 0x89, 0xAA, 0x05, 0xB1, 0xD1, 0x1F, 0x4F, 0xB0, 0x7A, 0x2C, 0x14, 0xD9, 0xE7, 0x66, 0x62, 0x1A, 0x4C, 0xC0, 0xC6, 0x63, 0x7F, 0xB4, 0xF1, 0x43, 0xFE, 0x61, 0xA3, 0xCC, 0xE8, 0x6D, 0xBA, 0x65, 0x42, 0x2B, 0xCA, 0xD5, 0x52, 0x3A, 0xCD, 0x1D, 0x24, 0xD7, 0x47, 0xDE, 0x9E, 0x95, 0x85, 0x48, 0x86, 0xE1, 0xC5, 0xD2, 0x34, 0xAF, 0x40, 0xFB, 0xE6, 0x4E, 0xC8, 0xF5, 0x7B, 0x5A, 0xCB, 0xD4, 0x97, 0x6F, 0x0C, 0x79, 0x9C, 0x20, 0x59, 0x19, 0x68, 0x2E, 0x09, 0x64, 0x73, 0x50, 0xC2, 0x2F, 0x0D, 0xEF, 0x9D, 0x94, 0x00, 0x81, 0xE2, 0x46, 0x5F, 0xB8, 0x0A, 0x12, 0x75, 0x1C, 0x8C, 0xB6, 0x71, 0xAC, 0x04, 0x60, 0xA9, 0x5B, 0xF8, 0x30, 0x49, 0x44, 0x4A, 0xBE, 0x6A, 0xEB, 0xD3, 0xD8, 0x36, 0xB3, 0x3B, 0x17, 0x80, 0xA4, 0xEC, 0x26, 0x82, 0xB5, 0x37, 0x5D, 0x1B, 0x2D, 0xE5, 0xA2, 0x0F, 0xB7, 0xC4, 0xF2, 0x70, 0x39, 0xF9, 0xC7, 0xBB, 0x8A, 0x32, 0x78, 0xC3, 0x5E, 0xD6, 0xE4, 0x22, 0x9B, 0x18, 0x8E, 0xEE, 0x27, 0x8D, 0x33, 0x11, 0x77, 0x01, 0x06, 0x38, 0xF0, 0x7E, 0x08, 0x15, 0xB9, 0x7C, 0xAD, 0x84, 0xDD, 0xC1, 0xFD, 0x92, 0xA1, 0xF7, 0xAE, 0xDC, 0x58 }; unsigned char table_118[256] = { 0x38, 0xA0, 0xA6, 0xFC, 0x7C, 0x5A, 0x97, 0x1D, 0xFD, 0x00, 0x20, 0xA2, 0x72, 0x10, 0x1F, 0x48, 0x98, 0x7E, 0xDF, 0x2D, 0x80, 0x0A, 0x27, 0xDC, 0xCF, 0xBF, 0x92, 0x94, 0x53, 0xCC, 0x0E, 0x74, 0xA7, 0x60, 0x08, 0x15, 0x87, 0x6F, 0xB3, 0xA3, 0xED, 0x59, 0x09, 0x4F, 0x9E, 0x9A, 0xEE, 0x83, 0x56, 0x32, 0x34, 0xC7, 0x24, 0xE7, 0x96, 0x4D, 0xAE, 0xE3, 0xBD, 0xE2, 0x36, 0x4A, 0xB6, 0x8B, 0xF2, 0xC1, 0xD7, 0x40, 0x31, 0x4B, 0xDA, 0xF1, 0xB1, 0x70, 0xA8, 0xC3, 0xC6, 0x8A, 0xE6, 0x77, 0x21, 0x7D, 0xD5, 0x0C, 0x43, 0xC4, 0xF0, 0x1B, 0x18, 0xA1, 0x85, 0xE1, 0xFF, 0x8D, 0xE5, 0x6E, 0x9B, 0x51, 0x1C, 0xA4, 0x5C, 0x8E, 0x69, 0x49, 0x23, 0xCD, 0x52, 0xF8, 0x3E, 0x91, 0x5E, 0x1E, 0x25, 0xB4, 0x93, 0xCB, 0xE0, 0x47, 0xBC, 0x4E, 0x33, 0xB7, 0x75, 0x1A, 0x11, 0x9C, 0x3F, 0xEC, 0xD1, 0x46, 0xDD, 0xAA, 0xB8, 0x99, 0x86, 0x67, 0x58, 0xF9, 0x16, 0x17, 0x6D, 0x5F, 0x2B, 0xA5, 0xD3, 0x8F, 0x55, 0x71, 0xD2, 0xBA, 0x5B, 0x3C, 0x82, 0xB5, 0x41, 0xE4, 0x90, 0x45, 0x6C, 0xF6, 0xDE, 0xA9, 0x84, 0x62, 0x19, 0x3B, 0xB9, 0xC8, 0x2C, 0xB0, 0x76, 0x57, 0xD8, 0x26, 0x9D, 0x89, 0xC9, 0x54, 0xFB, 0x07, 0xCE, 0x22, 0x5D, 0x64, 0x65, 0xAD, 0x01, 0xDB, 0x14, 0x4C, 0x37, 0x03, 0x6B, 0xAF, 0xD0, 0x7F, 0x9F, 0xBB, 0xEB, 0xC0, 0x50, 0x66, 0x68, 0x0B, 0x42, 0x2A, 0xD4, 0xF5, 0x61, 0x63, 0xF3, 0x39, 0xBE, 0xC5, 0xEF, 0x28, 0x3A, 0xAB, 0x79, 0x05, 0xE9, 0x12, 0x73, 0x3D, 0xB2, 0x8C, 0xCA, 0x29, 0x0F, 0xF4, 0x7B, 0x13, 0x88, 0x44, 0xC2, 0x2E, 0xFA, 0xFE, 0x04, 0x35, 0xE8, 0x06, 0x7A, 0x78, 0x0D, 0x81, 0xF7, 0xEA, 0xD9, 0x2F, 0x02, 0xAC, 0x30, 0x6A, 0xD6, 0x95 }; unsigned char table_119[32] = { 0x14, 0x0A, 0x1C, 0x00, 0x0C, 0x1F, 0x1E, 0x0B, 0x12, 0x1D, 0x17, 0x08, 0x07, 0x04, 0x09, 0x10, 0x03, 0x1B, 0x0E, 0x1A, 0x05, 0x0D, 0x11, 0x15, 0x18, 0x02, 0x06, 0x01, 0x19, 0x16, 0x13, 0x0F }; unsigned char table_120[256] = { 0xCE, 0x89, 0xB2, 0x72, 0x04, 0x77, 0x64, 0xAE, 0x80, 0x99, 0xB5, 0x00, 0x7B, 0x50, 0x9D, 0xE3, 0x87, 0x37, 0x6D, 0x3D, 0x32, 0xBA, 0x20, 0xF0, 0xDC, 0xBD, 0x61, 0x26, 0xD4, 0xA6, 0x70, 0x54, 0xC1, 0x7D, 0x82, 0xFF, 0x81, 0x83, 0x2F, 0xF5, 0x3B, 0x42, 0x08, 0x5C, 0x30, 0x59, 0xBB, 0xC2, 0x33, 0x5D, 0xEE, 0xB7, 0xF7, 0x2B, 0x76, 0xD0, 0x43, 0x1C, 0x48, 0xFC, 0x01, 0xCD, 0x27, 0x1D, 0x5A, 0x96, 0x95, 0x03, 0xC6, 0x1F, 0x09, 0xCB, 0xF6, 0x47, 0xA9, 0x93, 0xA7, 0xD2, 0xDB, 0x51, 0xB0, 0x7A, 0xE6, 0x62, 0x0F, 0x12, 0x57, 0xF4, 0x35, 0xFE, 0xA4, 0xDF, 0x5B, 0xF3, 0x67, 0x85, 0x98, 0xE4, 0xAB, 0x75, 0x4C, 0xE2, 0x25, 0x74, 0x3A, 0x45, 0xDE, 0xEF, 0x4A, 0x97, 0x86, 0x24, 0xE9, 0x8F, 0xD8, 0xD7, 0x60, 0xAD, 0x36, 0x8E, 0x1E, 0xB9, 0x4F, 0x6B, 0x8C, 0x06, 0x23, 0x94, 0x0E, 0xD3, 0x49, 0x14, 0x90, 0xAF, 0x65, 0xEC, 0xF9, 0x0D, 0xED, 0x6C, 0xBE, 0x7F, 0xA5, 0xC5, 0xEA, 0x78, 0x2E, 0xBC, 0xD5, 0xDA, 0x18, 0xE1, 0x10, 0x2D, 0xB4, 0x16, 0x4B, 0xE8, 0xC4, 0x8D, 0x19, 0x1B, 0x02, 0x66, 0xB6, 0xE7, 0x9C, 0x7C, 0xC9, 0xA0, 0x2A, 0x53, 0x13, 0xDD, 0xF8, 0xA8, 0x0A, 0x6E, 0xCF, 0x6F, 0x7E, 0xE0, 0x3E, 0xE5, 0x07, 0xCC, 0x38, 0xD1, 0xF2, 0x2C, 0x9A, 0xAC, 0x88, 0x79, 0xB8, 0xC8, 0xBF, 0x63, 0x71, 0x69, 0x52, 0x39, 0x9F, 0x22, 0x3F, 0x9E, 0x44, 0xFA, 0x73, 0x6A, 0x8B, 0xA2, 0xD6, 0x1A, 0x9B, 0xB1, 0x8A, 0x4D, 0x58, 0xA1, 0x46, 0x5F, 0x55, 0x56, 0x21, 0x05, 0x15, 0x92, 0xAA, 0xEB, 0x31, 0x68, 0xFB, 0x41, 0xC3, 0x4E, 0xB3, 0x40, 0x34, 0x17, 0xD9, 0x29, 0x3C, 0x0C, 0xF1, 0x0B, 0x28, 0x84, 0x5E, 0xCA, 0xFD, 0x11, 0xA3, 0xC7, 0xC0, 0x91 }; unsigned char table_121[32] = { 0x1E, 0x12, 0x06, 0x1D, 0x15, 0x1F, 0x13, 0x0B, 0x10, 0x0D, 0x1C, 0x01, 0x0A, 0x0E, 0x02, 0x19, 0x04, 0x1A, 0x03, 0x11, 0x00, 0x16, 0x0C, 0x17, 0x14, 0x08, 0x18, 0x05, 0x09, 0x0F, 0x1B, 0x07 }; unsigned char table_122[256] = { 0x85, 0xDF, 0x7F, 0x7C, 0x56, 0xF0, 0x0C, 0x7D, 0x76, 0xA8, 0x58, 0x31, 0x25, 0x8A, 0x0D, 0x23, 0x05, 0x0F, 0x12, 0x64, 0x8E, 0x5D, 0xF4, 0x2C, 0x18, 0xFA, 0x4B, 0xFE, 0x91, 0xBF, 0x95, 0x0B, 0xF1, 0x88, 0x10, 0xD8, 0x3E, 0x53, 0x96, 0xB5, 0x75, 0x24, 0x8F, 0xD6, 0x68, 0x5C, 0x93, 0x1F, 0x6B, 0xC2, 0xAB, 0xED, 0x1E, 0xC0, 0xBC, 0x47, 0xE9, 0xD1, 0xDE, 0xCA, 0xF6, 0x62, 0x43, 0xEB, 0xA2, 0xB4, 0x08, 0xE6, 0x74, 0x0E, 0xA1, 0x72, 0x66, 0x61, 0x21, 0x2E, 0x32, 0x63, 0x29, 0xD7, 0x1C, 0x22, 0xAC, 0xE7, 0x54, 0xF3, 0x65, 0x17, 0x9F, 0x78, 0x79, 0x4C, 0xDD, 0x27, 0x90, 0x36, 0x19, 0x44, 0x03, 0xD9, 0x4A, 0x5A, 0x34, 0xF9, 0x97, 0xA6, 0x70, 0x39, 0x28, 0x77, 0x6E, 0xB7, 0x8C, 0x02, 0x5E, 0x9B, 0x8D, 0x59, 0x6F, 0xA5, 0x07, 0xE2, 0x41, 0x51, 0xC9, 0x3C, 0xE8, 0xE1, 0xB3, 0x16, 0x50, 0x04, 0xE3, 0x1D, 0x3B, 0xD2, 0x4D, 0x35, 0x71, 0xDA, 0x9E, 0xA7, 0xE4, 0xE0, 0xB6, 0x2B, 0xEA, 0x84, 0x55, 0xF8, 0x57, 0x3D, 0x73, 0x42, 0xC6, 0x0A, 0x92, 0x6A, 0xAE, 0xF5, 0xFC, 0xD5, 0x15, 0x52, 0x7E, 0x14, 0x81, 0x13, 0xE5, 0x49, 0x38, 0x2A, 0x94, 0x5B, 0xA3, 0x11, 0x8B, 0x80, 0xBB, 0x01, 0x9C, 0xA4, 0xDB, 0xF7, 0xA9, 0x20, 0xF2, 0x1A, 0xDC, 0x33, 0x3A, 0xEF, 0xD3, 0xFD, 0x30, 0xB0, 0x1B, 0xC4, 0x06, 0xD4, 0x6D, 0x87, 0x2F, 0x60, 0x5F, 0xC5, 0x09, 0x37, 0xAF, 0x00, 0xCB, 0x9D, 0xA0, 0xB9, 0x45, 0x86, 0x4F, 0x6C, 0x67, 0xFB, 0x40, 0x3F, 0xCC, 0xB8, 0xC8, 0x82, 0x98, 0x99, 0x7B, 0xB1, 0xCD, 0xD0, 0xBD, 0x48, 0xAD, 0x26, 0x7A, 0x9A, 0x46, 0xFF, 0x89, 0xC7, 0xC1, 0xCF, 0xBE, 0xAA, 0xEC, 0xBA, 0xCE, 0x2D, 0x4E, 0x83, 0xC3, 0x69, 0xEE, 0xB2 }; unsigned char table_123[256] = { 0x9D, 0xFB, 0x3C, 0x81, 0xAA, 0x05, 0xB2, 0xBE, 0xD1, 0x5F, 0x4C, 0xE0, 0xA3, 0xF4, 0xDE, 0x35, 0xFE, 0x1B, 0x37, 0x99, 0x94, 0x7A, 0x10, 0xAB, 0xC0, 0xA4, 0xB5, 0xFF, 0x8F, 0x3B, 0xB4, 0x51, 0x04, 0xE9, 0xB9, 0xC1, 0x98, 0xC5, 0x82, 0x38, 0x4D, 0x71, 0xFC, 0x33, 0xC4, 0x50, 0x5D, 0x88, 0xB8, 0x5C, 0x32, 0xE2, 0xBB, 0xCD, 0x60, 0x2C, 0xD4, 0x7E, 0x27, 0x59, 0x2B, 0x1F, 0x53, 0xF6, 0x25, 0x86, 0xAE, 0x21, 0xFA, 0x31, 0xD7, 0x0F, 0x17, 0xDA, 0x7F, 0xC9, 0x46, 0x19, 0x08, 0xA8, 0xCF, 0x13, 0xCC, 0x03, 0x3F, 0x22, 0x6E, 0xEB, 0x4A, 0x63, 0x73, 0xBD, 0x36, 0xED, 0x30, 0x57, 0x65, 0xF8, 0x41, 0x61, 0x1E, 0xA0, 0xC6, 0x45, 0x3E, 0x75, 0x28, 0x87, 0xCB, 0xD6, 0x16, 0xD8, 0xDF, 0xEF, 0xEA, 0xA7, 0x58, 0xB0, 0x1D, 0xE6, 0x47, 0x76, 0xD9, 0x96, 0xE7, 0xDC, 0x00, 0x80, 0xDD, 0xB7, 0x9A, 0xE1, 0xF5, 0x9C, 0x4B, 0xE3, 0xBC, 0x8D, 0xF2, 0x2F, 0x9F, 0x6C, 0x93, 0xAF, 0xA9, 0xC2, 0x5E, 0x24, 0x15, 0xD2, 0x09, 0x0D, 0xDB, 0x4F, 0x91, 0x0E, 0x64, 0x34, 0x4E, 0xAD, 0x62, 0x44, 0x23, 0x85, 0xB6, 0xAC, 0xC7, 0xCA, 0x84, 0xF9, 0x8C, 0xBF, 0x14, 0x7C, 0x8E, 0x92, 0xF0, 0x0B, 0xCE, 0x90, 0x7D, 0x70, 0x9E, 0x54, 0x39, 0x5B, 0x6D, 0x52, 0xEE, 0xA2, 0x6F, 0x78, 0x2D, 0x95, 0x8B, 0x02, 0x3D, 0x7B, 0x69, 0xC3, 0x49, 0xA5, 0x1A, 0x26, 0xD5, 0x6B, 0xE8, 0xFD, 0xB3, 0xD3, 0x20, 0x55, 0x18, 0x06, 0xF3, 0xB1, 0x0C, 0xC8, 0x07, 0x12, 0xF7, 0x01, 0x2E, 0x72, 0x97, 0xA6, 0x11, 0x89, 0x56, 0x5A, 0x29, 0xBA, 0x67, 0x42, 0x83, 0x6A, 0x2A, 0xF1, 0xA1, 0x9B, 0xE5, 0xE4, 0x74, 0x66, 0x1C, 0x68, 0xEC, 0x40, 0x48, 0x77, 0xD0, 0x0A, 0x8A, 0x3A, 0x43, 0x79 }; unsigned char table_124[256] = { 0x6C, 0xC3, 0x28, 0x2F, 0x42, 0x4B, 0x7C, 0x3C, 0xCE, 0x24, 0xC8, 0x51, 0x25, 0x3F, 0x49, 0x8D, 0x1E, 0x5C, 0x89, 0x3A, 0x98, 0x47, 0x0B, 0x12, 0xA9, 0xB1, 0xD7, 0xB6, 0x5D, 0xF9, 0x5A, 0xBC, 0xFA, 0x06, 0x7D, 0x08, 0xFC, 0x37, 0x54, 0x4F, 0xD4, 0xCD, 0xA7, 0x5E, 0xE0, 0x92, 0x82, 0x56, 0xF1, 0x2B, 0xC4, 0xE2, 0x29, 0xEA, 0x35, 0x57, 0x33, 0x4E, 0x1A, 0x17, 0x8B, 0x85, 0xBF, 0xD5, 0x18, 0xB3, 0x0D, 0x71, 0x45, 0x81, 0xB4, 0x27, 0xD1, 0xE1, 0xFF, 0x44, 0x9E, 0xA4, 0x15, 0x9A, 0x90, 0xC7, 0x79, 0xE3, 0x4C, 0xE9, 0x3D, 0x6B, 0xF5, 0xF4, 0xEE, 0xAA, 0xDB, 0x07, 0x09, 0xCF, 0x7B, 0x95, 0xA0, 0x53, 0x8F, 0xA1, 0x9D, 0xBE, 0x6F, 0xAE, 0x96, 0x46, 0x59, 0x01, 0x84, 0xCC, 0x3B, 0x8E, 0xF7, 0x4D, 0x6E, 0xDC, 0xE8, 0x36, 0x7A, 0xE5, 0xBD, 0xE7, 0x9F, 0x2C, 0x52, 0xAB, 0x55, 0x13, 0x1D, 0xFB, 0x58, 0x9C, 0xDF, 0xC0, 0x30, 0x73, 0x67, 0x39, 0x74, 0xD3, 0x11, 0xD2, 0x0E, 0x20, 0xB7, 0x02, 0xB9, 0x1C, 0x86, 0x76, 0x10, 0x68, 0x9B, 0x63, 0x48, 0x8A, 0xB2, 0xB8, 0xAF, 0x26, 0x99, 0x04, 0xB0, 0xE4, 0xEF, 0xEB, 0xEC, 0x6D, 0x61, 0xC1, 0xD0, 0x38, 0xC9, 0x19, 0x60, 0xA8, 0xA6, 0xF8, 0x80, 0xC5, 0x03, 0x0F, 0x22, 0x2D, 0x88, 0x32, 0x77, 0x70, 0xFE, 0x0C, 0x31, 0x40, 0x5F, 0xED, 0xA5, 0x93, 0x43, 0xF0, 0x8C, 0xE6, 0x34, 0x21, 0xD9, 0xC2, 0xD8, 0xC6, 0x6A, 0xD6, 0xCB, 0xAC, 0x75, 0xB5, 0x78, 0x0A, 0xA3, 0x69, 0x16, 0xBA, 0x50, 0x2A, 0x41, 0x83, 0xF6, 0x64, 0x00, 0x65, 0x7E, 0xDD, 0x5B, 0xDA, 0x14, 0xFD, 0x3E, 0x7F, 0xCA, 0x66, 0x4A, 0x1F, 0xA2, 0xAD, 0xF2, 0x23, 0xBB, 0x72, 0xF3, 0x94, 0x62, 0x1B, 0xDE, 0x91, 0x87, 0x97, 0x05, 0x2E }; unsigned char table_125[32] = { 0x1A, 0x18, 0x12, 0x15, 0x00, 0x1C, 0x01, 0x0B, 0x19, 0x1B, 0x1F, 0x11, 0x07, 0x10, 0x1E, 0x06, 0x17, 0x04, 0x0A, 0x0E, 0x0D, 0x0C, 0x16, 0x08, 0x02, 0x03, 0x13, 0x14, 0x09, 0x1D, 0x05, 0x0F }; unsigned char table_126[32] = { 0x1C, 0x1D, 0x07, 0x12, 0x18, 0x1A, 0x19, 0x09, 0x0F, 0x14, 0x1F, 0x0B, 0x13, 0x04, 0x0E, 0x1E, 0x0C, 0x0D, 0x01, 0x17, 0x1B, 0x16, 0x0A, 0x05, 0x15, 0x10, 0x11, 0x08, 0x00, 0x03, 0x06, 0x02 }; unsigned char table_127[256] = { 0xA0, 0x66, 0xD8, 0x08, 0xEA, 0x39, 0x78, 0xAB, 0x61, 0x4E, 0xC7, 0xD1, 0xA3, 0x1C, 0x9F, 0xCB, 0x19, 0x51, 0x15, 0x92, 0x23, 0xFD, 0x7D, 0x1D, 0x95, 0xAE, 0x0E, 0x8B, 0xE6, 0x7F, 0x86, 0x6D, 0x06, 0xBD, 0x20, 0x1F, 0x3A, 0xE4, 0x54, 0x91, 0x69, 0xD3, 0xE3, 0x3D, 0x4D, 0x31, 0x49, 0xA4, 0x41, 0xF3, 0xE0, 0x11, 0x14, 0x9B, 0x96, 0x5A, 0xC4, 0x8E, 0x34, 0xDB, 0xBA, 0x83, 0xD9, 0x81, 0xAF, 0x58, 0x8A, 0x79, 0x13, 0xBC, 0x85, 0x37, 0x9E, 0x6C, 0x57, 0x71, 0x8D, 0x97, 0x5F, 0x6F, 0x1E, 0x74, 0x27, 0xFC, 0x5C, 0x7A, 0x64, 0x87, 0xF5, 0xC6, 0xF2, 0x4F, 0xDE, 0x80, 0xAA, 0x84, 0x2E, 0xDC, 0xE7, 0x40, 0x75, 0xC5, 0xB3, 0xC8, 0xCE, 0x21, 0x02, 0x67, 0xB7, 0x10, 0x47, 0x6A, 0xEE, 0x53, 0x2C, 0x16, 0x05, 0xC0, 0x63, 0x4C, 0x0D, 0xBB, 0xC3, 0x38, 0x46, 0x68, 0x7E, 0xF9, 0xB8, 0xB4, 0x3E, 0x36, 0xD5, 0xEC, 0x0B, 0xF6, 0x33, 0x0A, 0x0F, 0x5B, 0xFB, 0x45, 0xEB, 0xA9, 0x6E, 0x6B, 0xCF, 0x55, 0x99, 0xAC, 0x22, 0xBE, 0xB1, 0xA2, 0x3F, 0x25, 0x77, 0x8F, 0x7C, 0xF1, 0xD4, 0x59, 0xA8, 0xE5, 0xD7, 0xCA, 0xA1, 0x93, 0xE9, 0xAD, 0xF7, 0x94, 0xEF, 0xED, 0x3C, 0x2A, 0x88, 0xB5, 0x35, 0x9D, 0x9C, 0x32, 0x5E, 0xB6, 0x48, 0x9A, 0x7B, 0x26, 0x50, 0x90, 0x04, 0xA7, 0xDD, 0x09, 0xB9, 0x98, 0xB2, 0xFE, 0xDF, 0x44, 0x89, 0x29, 0x5D, 0xE2, 0x72, 0xC9, 0x28, 0x03, 0x43, 0x8C, 0x52, 0x18, 0xC1, 0x56, 0x1B, 0x1A, 0x01, 0x65, 0xDA, 0xBF, 0x07, 0xFF, 0x76, 0xE8, 0x30, 0xA5, 0x4A, 0xA6, 0x12, 0x62, 0x24, 0x60, 0x4B, 0x73, 0x0C, 0xF0, 0xFA, 0x42, 0xF4, 0x00, 0xD2, 0xD0, 0xD6, 0x3B, 0xC2, 0x2F, 0xE1, 0x2B, 0x70, 0xF8, 0x17, 0xCD, 0xB0, 0xCC, 0x82, 0x2D }; unsigned char table_128[32] = { 0x1A, 0x1C, 0x09, 0x17, 0x1B, 0x0B, 0x16, 0x1E, 0x14, 0x0C, 0x12, 0x0E, 0x05, 0x03, 0x1F, 0x15, 0x19, 0x0D, 0x10, 0x13, 0x0A, 0x01, 0x00, 0x11, 0x02, 0x08, 0x0F, 0x18, 0x07, 0x04, 0x1D, 0x06 }; unsigned char table_129[256] = { 0x9D, 0x5F, 0xE8, 0x99, 0x57, 0x07, 0x16, 0xA6, 0x9F, 0xB6, 0xDE, 0xED, 0x2D, 0xB3, 0xC0, 0x8E, 0xCC, 0x49, 0xCE, 0xB0, 0x1B, 0xB1, 0x7A, 0xE0, 0xEB, 0x28, 0xDB, 0x7D, 0x88, 0xC8, 0x06, 0x6C, 0x02, 0xD0, 0x85, 0x7E, 0xDF, 0xF5, 0x78, 0xE5, 0xA9, 0x71, 0xD9, 0xDD, 0xDC, 0xEE, 0x8C, 0x54, 0xA0, 0x86, 0xFE, 0x0E, 0x55, 0xF7, 0x41, 0x47, 0x1D, 0x15, 0xD6, 0xA4, 0xFF, 0x1F, 0x25, 0xF8, 0x12, 0xE9, 0x74, 0x7B, 0x04, 0xE6, 0x4C, 0x31, 0xA2, 0xBE, 0x0C, 0xB9, 0x17, 0xBD, 0x3D, 0xF0, 0x9E, 0x4D, 0x4E, 0xB2, 0xE7, 0x40, 0xC9, 0x8A, 0x67, 0x5E, 0x19, 0x0F, 0xB7, 0x22, 0x8D, 0xBA, 0xFC, 0x93, 0x14, 0xEA, 0xFD, 0x0D, 0xD5, 0x38, 0xA1, 0x84, 0x1C, 0x35, 0x60, 0x37, 0x43, 0x9C, 0xCF, 0xEF, 0x3A, 0x72, 0xF2, 0x61, 0x75, 0x6A, 0x42, 0xAC, 0xD3, 0x48, 0x77, 0xC5, 0x29, 0xF6, 0x58, 0x79, 0xFA, 0x5D, 0xC7, 0x70, 0x53, 0x9A, 0x6F, 0xC1, 0x0A, 0x90, 0x8F, 0x3E, 0x3B, 0x8B, 0xEC, 0xBC, 0x20, 0x27, 0xC3, 0x66, 0x3F, 0x33, 0xA5, 0x44, 0x2E, 0x32, 0x65, 0x18, 0xFB, 0x59, 0x52, 0x50, 0xE2, 0x63, 0x2B, 0xCD, 0x64, 0xCB, 0xD2, 0x68, 0x10, 0xA7, 0xAE, 0x11, 0xA8, 0x96, 0x69, 0xAF, 0xC2, 0x34, 0x5C, 0x56, 0xE3, 0xF9, 0xDA, 0x51, 0x81, 0x4A, 0x05, 0x00, 0xB8, 0x7C, 0x30, 0x2F, 0x46, 0xB4, 0xC6, 0x87, 0x4B, 0x94, 0x80, 0xF4, 0x7F, 0x3C, 0x26, 0xF1, 0x5B, 0xAB, 0x91, 0x6E, 0x08, 0x76, 0x98, 0xD1, 0xE1, 0x36, 0x21, 0xCA, 0xD8, 0x24, 0x9B, 0x39, 0xBB, 0xAD, 0x13, 0x62, 0x97, 0x1A, 0x6D, 0x2C, 0x5A, 0xC4, 0xD4, 0xA3, 0x03, 0xBF, 0x1E, 0xE4, 0xF3, 0x95, 0x23, 0x73, 0x92, 0xB5, 0x01, 0x83, 0x82, 0xAA, 0x09, 0x45, 0x6B, 0xD7, 0x0B, 0x89, 0x4F, 0x2A }; unsigned char table_130[32] = { 0x07, 0x03, 0x15, 0x0B, 0x02, 0x11, 0x17, 0x14, 0x05, 0x10, 0x0A, 0x0F, 0x01, 0x1C, 0x1D, 0x0E, 0x12, 0x06, 0x18, 0x16, 0x1A, 0x09, 0x13, 0x19, 0x1B, 0x00, 0x08, 0x0D, 0x0C, 0x1E, 0x04, 0x1F }; unsigned char table_131[32] = { 0x1D, 0x13, 0x1B, 0x10, 0x07, 0x03, 0x0A, 0x02, 0x00, 0x0C, 0x0E, 0x0B, 0x0D, 0x18, 0x12, 0x1F, 0x1A, 0x04, 0x15, 0x11, 0x1E, 0x08, 0x1C, 0x14, 0x19, 0x05, 0x0F, 0x17, 0x06, 0x01, 0x09, 0x16 }; unsigned char table_132[256] = { 0x33, 0x8D, 0x45, 0x6F, 0xFF, 0xF5, 0xB6, 0x53, 0x3B, 0xF3, 0x07, 0xA4, 0x97, 0xEB, 0x6B, 0xA5, 0xD3, 0xDC, 0x7B, 0x79, 0x93, 0xE7, 0xF7, 0x67, 0x9C, 0x4F, 0x88, 0xF9, 0x3A, 0x2B, 0x27, 0x48, 0x47, 0x18, 0xF4, 0xAD, 0xB4, 0x8F, 0x2A, 0x76, 0x17, 0xE9, 0x1F, 0x40, 0x0C, 0x59, 0xD1, 0x4C, 0x20, 0x31, 0x73, 0x54, 0xCD, 0x68, 0x08, 0x52, 0x10, 0x62, 0x3D, 0xD2, 0x77, 0xF2, 0xD7, 0x30, 0xCA, 0x16, 0x01, 0x50, 0x9F, 0x3F, 0x75, 0xED, 0x90, 0x6A, 0x34, 0xCE, 0x05, 0x78, 0x5E, 0xD6, 0x85, 0xCC, 0x29, 0xB8, 0xC1, 0x0D, 0xCB, 0x80, 0x2E, 0x04, 0x00, 0x44, 0x32, 0x95, 0xBF, 0xFE, 0x6E, 0x7C, 0xFD, 0xA7, 0x3C, 0x5C, 0xF0, 0xEC, 0xAC, 0xF8, 0xB9, 0xC0, 0x1B, 0x3E, 0xE8, 0x66, 0x5D, 0xDE, 0x49, 0x71, 0xAA, 0xAF, 0x21, 0x64, 0x28, 0x8A, 0x4E, 0x98, 0x58, 0xA2, 0x23, 0xCF, 0x9E, 0x63, 0x61, 0x91, 0x12, 0xC6, 0x8C, 0x19, 0xA8, 0xD4, 0xC7, 0xDD, 0xFC, 0xBD, 0x38, 0xDF, 0xEA, 0x2D, 0x7E, 0x7D, 0xE3, 0xE0, 0xC3, 0xD9, 0x8B, 0x11, 0xF1, 0x4D, 0xC8, 0xB5, 0x55, 0xAE, 0xE1, 0x89, 0xE5, 0xB3, 0xBC, 0x69, 0x9D, 0xA6, 0x09, 0x9A, 0x74, 0x35, 0x1A, 0xFB, 0x24, 0xB7, 0x13, 0x14, 0x94, 0x0A, 0x86, 0x0F, 0x60, 0x51, 0xB0, 0x84, 0x22, 0x5B, 0x87, 0x43, 0x57, 0x0B, 0x2F, 0x5F, 0x02, 0xD0, 0xBB, 0xA3, 0xC9, 0x7A, 0xBE, 0xC2, 0x26, 0x46, 0xDB, 0x1E, 0x1D, 0x92, 0xE2, 0xB2, 0x37, 0x6D, 0xD5, 0x4A, 0x0E, 0x4B, 0x8E, 0xC5, 0x42, 0x99, 0xEE, 0xE4, 0xB1, 0x06, 0xAB, 0x5A, 0x56, 0x41, 0x65, 0xBA, 0xFA, 0x83, 0x15, 0xDA, 0x72, 0xA1, 0x81, 0x1C, 0xA9, 0x36, 0x25, 0x96, 0x6C, 0x39, 0x82, 0xE6, 0x2C, 0x9B, 0xC4, 0x7F, 0xA0, 0xD8, 0xEF, 0x03, 0x70, 0xF6 }; unsigned char table_133[256] = { 0x02, 0xF0, 0xED, 0xC4, 0xE4, 0x67, 0x60, 0x8B, 0xF3, 0x77, 0x92, 0xE0, 0x85, 0x93, 0x1E, 0x8E, 0x9A, 0x38, 0x61, 0x20, 0xB7, 0x68, 0xE1, 0x5E, 0xD5, 0x63, 0xA9, 0xA5, 0xBE, 0x36, 0x12, 0x4D, 0x86, 0x16, 0xD6, 0xB1, 0x23, 0x64, 0x4F, 0x62, 0xFC, 0xA3, 0xD3, 0x04, 0x7D, 0x8C, 0xE2, 0xFF, 0x5D, 0x30, 0xF5, 0x95, 0x1B, 0x5F, 0x73, 0xAA, 0xE8, 0x07, 0x87, 0xDC, 0x54, 0x7C, 0xEE, 0x00, 0xB8, 0xDE, 0x55, 0xBA, 0xD0, 0x50, 0xBB, 0x89, 0x1C, 0xCC, 0x0E, 0xC0, 0x42, 0x11, 0xD8, 0xA2, 0x2E, 0x33, 0xFE, 0x26, 0xD4, 0x10, 0xDA, 0xC5, 0xFB, 0xAF, 0x98, 0x78, 0xB5, 0xBD, 0xC8, 0x8D, 0x46, 0xA0, 0xD1, 0x7B, 0xBC, 0x75, 0xAB, 0x25, 0xB2, 0x43, 0x57, 0xB6, 0xEC, 0xF4, 0x66, 0x05, 0x9C, 0x08, 0x53, 0x80, 0xEA, 0x21, 0x2C, 0x6C, 0x17, 0x71, 0xD2, 0x70, 0x76, 0x9E, 0x6B, 0x7A, 0x58, 0xA7, 0xBF, 0x29, 0x03, 0x1F, 0x06, 0xC1, 0xDD, 0x2F, 0x5C, 0x0B, 0x0D, 0x8A, 0x0A, 0xCB, 0xCA, 0x6F, 0x19, 0x6A, 0xFA, 0xF7, 0xA8, 0xA1, 0xEB, 0x88, 0x44, 0xAC, 0x01, 0x4E, 0x59, 0x94, 0x72, 0x2B, 0xE9, 0x0F, 0x22, 0x9B, 0x27, 0x37, 0x41, 0xF9, 0xF2, 0xE3, 0xEF, 0xB3, 0xD9, 0x2A, 0x31, 0xC2, 0x0C, 0x15, 0x90, 0x14, 0xF6, 0x83, 0xFD, 0x96, 0x9D, 0x7F, 0xA4, 0x39, 0xE7, 0x3F, 0xE6, 0xC7, 0xCD, 0x1A, 0xCF, 0x48, 0x3C, 0x51, 0x6D, 0x5B, 0x74, 0xC3, 0xC9, 0x09, 0x3D, 0x9F, 0xDB, 0x32, 0x40, 0x18, 0xD7, 0xCE, 0x69, 0x49, 0x3A, 0xF1, 0xB9, 0x56, 0x91, 0x99, 0x84, 0x24, 0x7E, 0x34, 0x4B, 0xA6, 0x47, 0xB4, 0x6E, 0xDF, 0x65, 0x3B, 0xAD, 0x45, 0x13, 0xC6, 0x81, 0xF8, 0x4A, 0x2D, 0x8F, 0x4C, 0x97, 0x28, 0x3E, 0xE5, 0x5A, 0x35, 0xB0, 0xAE, 0x82, 0x79, 0x1D, 0x52 }; unsigned char table_134[32] = { 0x09, 0x0F, 0x10, 0x0C, 0x03, 0x15, 0x07, 0x17, 0x0E, 0x0B, 0x1D, 0x08, 0x19, 0x11, 0x00, 0x0A, 0x01, 0x06, 0x18, 0x16, 0x0D, 0x13, 0x14, 0x12, 0x02, 0x1B, 0x1A, 0x04, 0x05, 0x1F, 0x1C, 0x1E }; unsigned char table_135[256] = { 0x14, 0x34, 0xEA, 0x02, 0x2B, 0x5A, 0x10, 0x51, 0xF3, 0x8F, 0x28, 0xB2, 0x50, 0x8B, 0x01, 0xCC, 0x80, 0x15, 0x29, 0x42, 0xF4, 0x1D, 0xFB, 0xBB, 0x1F, 0x43, 0x8C, 0x17, 0x1E, 0x81, 0x04, 0x98, 0x46, 0xD8, 0xD5, 0x65, 0x4C, 0x1C, 0xDB, 0x40, 0x5F, 0x1A, 0x31, 0x74, 0xF1, 0x64, 0x19, 0x05, 0xFC, 0xF0, 0x73, 0xB6, 0x23, 0x77, 0x9C, 0xCE, 0x70, 0xEF, 0xDA, 0xE0, 0xA2, 0x78, 0x84, 0xEB, 0x9E, 0xC5, 0x95, 0xA3, 0xF6, 0xCA, 0xAD, 0x52, 0xD0, 0x3F, 0x54, 0xA7, 0x33, 0xA9, 0x09, 0x6A, 0x89, 0x7E, 0x75, 0xA8, 0xD6, 0x79, 0x9F, 0xAB, 0x8E, 0x11, 0x0E, 0x3B, 0xAA, 0xE6, 0x85, 0x53, 0x0A, 0x59, 0xEC, 0x94, 0xD7, 0x41, 0x86, 0x7D, 0x2F, 0xC7, 0xDE, 0x06, 0xCB, 0x13, 0xBA, 0x58, 0xC8, 0xC9, 0x07, 0x67, 0x7F, 0xA5, 0xB4, 0x2C, 0x48, 0x6C, 0xB8, 0xD1, 0x30, 0xD3, 0x35, 0x4F, 0x88, 0x26, 0x93, 0x32, 0x71, 0x3E, 0x3D, 0xF7, 0x6D, 0x03, 0xED, 0x8A, 0x36, 0x55, 0x9B, 0x66, 0x8D, 0x27, 0x7C, 0xF9, 0xA6, 0xC3, 0x20, 0x69, 0x4A, 0xE3, 0x99, 0x5C, 0xBC, 0x45, 0x16, 0x6B, 0xB9, 0x49, 0x82, 0xFF, 0xBD, 0xDD, 0xE9, 0x0C, 0xD4, 0x44, 0xFD, 0x22, 0xE5, 0xAC, 0x61, 0xC4, 0x90, 0x47, 0x37, 0x72, 0xA4, 0x7A, 0x24, 0x4D, 0x5B, 0x12, 0x38, 0x92, 0x87, 0x1B, 0xE1, 0xA0, 0x91, 0x3C, 0xEE, 0x6F, 0xC1, 0x0F, 0x56, 0xC2, 0x9A, 0xF8, 0x18, 0xE8, 0xD2, 0xDC, 0x4B, 0xCF, 0x39, 0xF5, 0xFE, 0x2A, 0x2D, 0x9D, 0xA1, 0xFA, 0xE7, 0xBF, 0x6E, 0xE4, 0x2E, 0xB3, 0xCD, 0xE2, 0xAF, 0x7B, 0xC0, 0x68, 0x97, 0xB5, 0x5D, 0xB7, 0x21, 0x57, 0x83, 0x76, 0xB1, 0xAE, 0x5E, 0x0D, 0x96, 0x4E, 0x08, 0xC6, 0x0B, 0xDF, 0x3A, 0xB0, 0x00, 0x63, 0xD9, 0xBE, 0xF2, 0x60, 0x25, 0x62 }; unsigned char table_136[256] = { 0xD3, 0x1A, 0x00, 0xED, 0x59, 0x24, 0xA3, 0xF2, 0xBA, 0x58, 0x4C, 0x5C, 0x75, 0x48, 0x98, 0xB0, 0xCF, 0xC3, 0xF7, 0x88, 0x70, 0xB3, 0x3D, 0x3E, 0x03, 0xF9, 0xC9, 0xFD, 0x80, 0x44, 0x7F, 0x3B, 0x95, 0x5F, 0x31, 0x47, 0x15, 0x07, 0xB8, 0x08, 0xCE, 0xDA, 0x71, 0x9F, 0x83, 0xB1, 0x55, 0x16, 0xE6, 0xB2, 0xC7, 0xBE, 0x54, 0xE7, 0x2E, 0x8D, 0x12, 0x21, 0x41, 0x69, 0xFE, 0x28, 0x11, 0x56, 0x5A, 0xDD, 0xB6, 0x87, 0x78, 0x82, 0x4D, 0x7B, 0x50, 0x9A, 0x9E, 0x62, 0xF8, 0x0A, 0x64, 0xF1, 0x4E, 0x33, 0xAD, 0xBB, 0x79, 0x76, 0xD8, 0xCD, 0x86, 0x34, 0x29, 0xD5, 0x7D, 0x72, 0xC5, 0xC1, 0xDF, 0x09, 0x4A, 0xB4, 0xD2, 0x7A, 0xF0, 0xCC, 0x0F, 0xA7, 0xD6, 0x2B, 0x20, 0x26, 0xEF, 0xAB, 0x74, 0x1E, 0xE3, 0x77, 0xCB, 0x7C, 0x73, 0x5E, 0x6B, 0x0D, 0x65, 0xA6, 0x30, 0xFB, 0xD0, 0xB7, 0xAA, 0x94, 0x9D, 0x85, 0x13, 0x18, 0xA8, 0xF3, 0xE0, 0xBC, 0x45, 0xCA, 0xC8, 0xDC, 0xE2, 0x3C, 0x23, 0xE5, 0xB9, 0x90, 0x49, 0xA5, 0xE4, 0x36, 0xFC, 0x53, 0xF6, 0xE8, 0xC6, 0x2C, 0x02, 0x25, 0xC0, 0x8F, 0x61, 0xA4, 0x39, 0x8C, 0x5D, 0xAE, 0x22, 0x1C, 0x2F, 0xD4, 0x6C, 0xD1, 0x51, 0xEA, 0x4F, 0x7E, 0xA0, 0xF5, 0x6A, 0x32, 0xA2, 0x01, 0xB5, 0x10, 0x2A, 0xAC, 0xA9, 0x06, 0xC4, 0x91, 0x68, 0xE1, 0xBD, 0x14, 0x38, 0xFA, 0x6E, 0x3F, 0x37, 0x66, 0xDB, 0x57, 0x43, 0x1B, 0x67, 0xAF, 0x1F, 0x0B, 0x6D, 0x2D, 0x89, 0x04, 0x4B, 0x52, 0xC2, 0xBF, 0xA1, 0x92, 0x99, 0x6F, 0x63, 0x81, 0x27, 0x05, 0x96, 0x3A, 0xEC, 0x0E, 0x97, 0xD9, 0xDE, 0x46, 0x35, 0x8B, 0x8E, 0x8A, 0xF4, 0xFF, 0x60, 0xD7, 0xE9, 0x17, 0xEB, 0x9C, 0x84, 0x0C, 0x93, 0x1D, 0x9B, 0x5B, 0x40, 0xEE, 0x42, 0x19 }; unsigned char table_137[32] = { 0x0F, 0x09, 0x02, 0x06, 0x18, 0x0B, 0x1E, 0x05, 0x11, 0x1D, 0x16, 0x01, 0x13, 0x10, 0x0E, 0x1A, 0x1B, 0x00, 0x0D, 0x08, 0x15, 0x14, 0x19, 0x17, 0x03, 0x1F, 0x0A, 0x12, 0x0C, 0x07, 0x04, 0x1C }; unsigned char table_138[32] = { 0x0D, 0x1C, 0x1F, 0x15, 0x0F, 0x14, 0x1B, 0x12, 0x09, 0x0B, 0x19, 0x07, 0x11, 0x16, 0x0C, 0x04, 0x13, 0x05, 0x1D, 0x03, 0x0E, 0x0A, 0x08, 0x1E, 0x01, 0x06, 0x18, 0x17, 0x10, 0x1A, 0x02, 0x00 }; unsigned char table_139[32] = { 0x05, 0x15, 0x1D, 0x02, 0x0F, 0x03, 0x17, 0x1A, 0x0A, 0x00, 0x1F, 0x12, 0x0E, 0x11, 0x1B, 0x13, 0x0B, 0x0D, 0x09, 0x18, 0x1E, 0x08, 0x14, 0x07, 0x0C, 0x04, 0x16, 0x19, 0x1C, 0x06, 0x10, 0x01 }; unsigned char table_140[32] = { 0x06, 0x1E, 0x0C, 0x11, 0x13, 0x08, 0x15, 0x01, 0x1D, 0x03, 0x0F, 0x19, 0x18, 0x04, 0x00, 0x14, 0x12, 0x1A, 0x0B, 0x0E, 0x02, 0x1B, 0x07, 0x05, 0x1F, 0x17, 0x09, 0x0A, 0x0D, 0x16, 0x10, 0x1C }; unsigned char table_141[256] = { 0xE1, 0x0A, 0x28, 0xCD, 0x8A, 0x1E, 0x26, 0x10, 0xC0, 0x6F, 0x06, 0x2C, 0xF8, 0x51, 0x6C, 0x8F, 0xA8, 0x8C, 0x41, 0xF4, 0xED, 0x36, 0xAC, 0x89, 0xBD, 0x9D, 0x42, 0x50, 0x95, 0x07, 0x2A, 0x9B, 0x7E, 0xA3, 0x6B, 0x30, 0x72, 0x4E, 0xBE, 0xD8, 0x8B, 0x5B, 0x1A, 0x56, 0x05, 0xEF, 0xEE, 0x64, 0xFF, 0xFD, 0x93, 0xB5, 0xD6, 0x04, 0x57, 0xAE, 0x4D, 0x6D, 0x2F, 0xBA, 0x40, 0xE0, 0xDB, 0xF2, 0xCC, 0x08, 0x35, 0x02, 0xC4, 0x65, 0x66, 0x76, 0xA1, 0x97, 0x9F, 0x6A, 0x90, 0xA7, 0x34, 0x1B, 0x18, 0xB9, 0xA2, 0xDE, 0x23, 0x1F, 0xCB, 0xE6, 0xAB, 0xCF, 0xAD, 0x4A, 0xF7, 0x24, 0xD0, 0xE8, 0x8D, 0x49, 0xEA, 0x0F, 0x94, 0x22, 0xD3, 0x74, 0x71, 0x0D, 0x21, 0x14, 0x39, 0x4B, 0x16, 0x25, 0x5A, 0xB7, 0x17, 0x67, 0x59, 0x47, 0x27, 0x4F, 0x32, 0x3B, 0x63, 0x0C, 0xF0, 0xF3, 0x7B, 0xC7, 0xCA, 0x3A, 0x9A, 0xE2, 0xD5, 0xFA, 0x91, 0xFC, 0x86, 0x81, 0x99, 0xB4, 0xBC, 0x7C, 0xC5, 0xBF, 0xC1, 0xF5, 0x77, 0xA4, 0x79, 0x11, 0x8E, 0x75, 0x55, 0x3D, 0x78, 0x20, 0x37, 0x3E, 0x85, 0xE4, 0x2E, 0x82, 0xA9, 0x7A, 0x31, 0xC9, 0xB3, 0xFE, 0x4C, 0x7D, 0xC3, 0xA0, 0x0E, 0x96, 0x5C, 0xC6, 0x1C, 0x5F, 0xD7, 0xDD, 0x83, 0xC8, 0x9E, 0xEC, 0x3F, 0xAF, 0x38, 0x9C, 0xD9, 0xB6, 0xDA, 0xD4, 0x61, 0x44, 0x43, 0xAA, 0xB1, 0xCE, 0xE7, 0x84, 0x00, 0x0B, 0xFB, 0x68, 0xC2, 0x3C, 0x58, 0xB2, 0x69, 0x7F, 0x33, 0x2B, 0x80, 0x03, 0xE9, 0x88, 0x29, 0x12, 0x01, 0x6E, 0x62, 0xF1, 0xA6, 0xF9, 0x5D, 0xD2, 0xE3, 0x53, 0x09, 0x2D, 0xBB, 0x15, 0xEB, 0x13, 0xA5, 0xF6, 0x73, 0x19, 0x60, 0xB0, 0xD1, 0x48, 0x92, 0x1D, 0x52, 0x5E, 0x45, 0x70, 0x98, 0x54, 0xB8, 0xDC, 0x46, 0xDF, 0x87, 0xE5 }; unsigned char table_142[256] = { 0x90, 0x94, 0xBE, 0x14, 0x99, 0xEB, 0x45, 0x0F, 0x34, 0x4A, 0xE3, 0x79, 0xD2, 0x64, 0x4D, 0x69, 0x91, 0xDE, 0xB9, 0x1C, 0x59, 0x20, 0x6C, 0x0B, 0x16, 0xC7, 0x1D, 0x18, 0x02, 0x7D, 0x13, 0xB2, 0x7B, 0x81, 0xCF, 0x61, 0xA3, 0x33, 0x00, 0x73, 0x5A, 0x8A, 0xA1, 0xA8, 0x31, 0xAC, 0xF0, 0x67, 0xAE, 0xA5, 0x2A, 0x96, 0x58, 0xF4, 0xB7, 0x0E, 0xE1, 0x54, 0x27, 0x83, 0x09, 0x85, 0xF8, 0x84, 0xEA, 0xAD, 0x06, 0xED, 0x43, 0xFF, 0xA2, 0x6E, 0x68, 0x46, 0x74, 0x47, 0x3C, 0xAA, 0xBC, 0x55, 0xA7, 0xC3, 0x82, 0xDC, 0xBF, 0x38, 0x80, 0x15, 0xF6, 0xB3, 0x92, 0x7C, 0x93, 0x3F, 0xE9, 0x4C, 0x35, 0x30, 0x32, 0xF3, 0x88, 0xC0, 0x49, 0x6D, 0xCE, 0x42, 0xDF, 0xFD, 0x78, 0x6A, 0x24, 0xCA, 0xB8, 0xFC, 0xA6, 0x5F, 0x29, 0xFE, 0x0C, 0x5C, 0x0D, 0x23, 0x8B, 0x9D, 0xD4, 0x03, 0x2C, 0x9C, 0x77, 0xD8, 0x39, 0x8C, 0x57, 0xD5, 0xE0, 0x8F, 0xC6, 0xB0, 0xCD, 0x48, 0xC9, 0xA0, 0xDA, 0xC8, 0xD1, 0x5B, 0xAB, 0x37, 0x5D, 0x63, 0xAF, 0xF9, 0x17, 0x1B, 0xE5, 0xF1, 0x36, 0xC1, 0x04, 0x26, 0x6F, 0x9E, 0xD9, 0x2F, 0x7F, 0xB5, 0x3A, 0xD6, 0xE6, 0x40, 0x07, 0xCB, 0x7E, 0x3E, 0xC5, 0x22, 0xEC, 0xE2, 0xD3, 0x4E, 0x65, 0x2D, 0x70, 0xE7, 0x10, 0x19, 0xD0, 0xEF, 0xBD, 0xC2, 0x44, 0xB4, 0xF7, 0xA4, 0x53, 0x9F, 0x86, 0xFA, 0xE8, 0x4B, 0x28, 0x3D, 0x9B, 0x56, 0x89, 0x6B, 0x25, 0x71, 0x60, 0x11, 0x9A, 0x5E, 0x1A, 0x52, 0x08, 0x4F, 0xB1, 0xDD, 0xBB, 0x98, 0xFB, 0x12, 0x3B, 0x0A, 0x2E, 0xDB, 0x62, 0x8D, 0xC4, 0x75, 0xA9, 0x2B, 0xE4, 0x97, 0x72, 0xF5, 0xEE, 0xF2, 0xB6, 0x21, 0xBA, 0x7A, 0x76, 0x41, 0x50, 0x66, 0x05, 0x8E, 0xCC, 0x1E, 0x87, 0xD7, 0x01, 0x1F, 0x51, 0x95 }; unsigned char table_143[32] = { 0x0E, 0x16, 0x18, 0x11, 0x0C, 0x01, 0x12, 0x1F, 0x08, 0x15, 0x0A, 0x06, 0x1C, 0x1E, 0x02, 0x1A, 0x17, 0x03, 0x07, 0x13, 0x05, 0x19, 0x10, 0x0F, 0x0D, 0x14, 0x09, 0x0B, 0x1B, 0x00, 0x1D, 0x04 }; unsigned char table_144[32] = { 0x00, 0x1B, 0x17, 0x19, 0x1D, 0x11, 0x0D, 0x1A, 0x13, 0x03, 0x1E, 0x09, 0x10, 0x0E, 0x15, 0x05, 0x0B, 0x1C, 0x1F, 0x08, 0x0A, 0x06, 0x01, 0x0F, 0x16, 0x14, 0x02, 0x04, 0x07, 0x18, 0x12, 0x0C }; unsigned char table_145[256] = { 0xF9, 0x2C, 0x38, 0x74, 0xDA, 0x65, 0x85, 0x0E, 0xBA, 0x64, 0xDB, 0xE3, 0xB6, 0x8B, 0x0B, 0x5E, 0x01, 0x0F, 0x12, 0x8C, 0xD4, 0xCC, 0xB1, 0x7B, 0xE7, 0xBC, 0x2E, 0x87, 0x84, 0x3B, 0xF8, 0x4C, 0x8E, 0x59, 0x2D, 0xAA, 0xCE, 0x28, 0x1B, 0xEE, 0x7F, 0x5C, 0xFB, 0x62, 0x05, 0xD9, 0xDD, 0x9D, 0x49, 0x66, 0x82, 0x71, 0xD2, 0xC7, 0xEB, 0xCF, 0x5B, 0x41, 0x25, 0xC8, 0x6C, 0xFF, 0x78, 0x97, 0x0C, 0xA2, 0x50, 0x7A, 0xAF, 0x2F, 0xB0, 0x7E, 0xBB, 0x73, 0xA0, 0x9B, 0x09, 0xDE, 0x35, 0xE9, 0x5A, 0x70, 0x56, 0xC5, 0x81, 0x19, 0x55, 0xAB, 0xC1, 0xB4, 0x2A, 0x30, 0x54, 0x6F, 0x3E, 0x46, 0x5D, 0x37, 0xF5, 0x57, 0x6B, 0x7C, 0x43, 0xE1, 0x4A, 0x3F, 0xB2, 0x4B, 0x77, 0xB5, 0x44, 0xD6, 0x91, 0x11, 0x72, 0xE8, 0xBE, 0xA5, 0xA8, 0xD3, 0x9A, 0x17, 0x86, 0x88, 0x16, 0x3C, 0x36, 0xD8, 0x6E, 0x07, 0x8D, 0x5F, 0xFA, 0xF1, 0x24, 0x7D, 0x20, 0x60, 0x0D, 0x89, 0xC9, 0x29, 0xA7, 0x2B, 0x4E, 0x10, 0x9F, 0xE5, 0x61, 0x32, 0x3A, 0xBF, 0x93, 0xE6, 0xF3, 0x52, 0x80, 0xC4, 0x02, 0x22, 0xA4, 0xBD, 0xF0, 0x48, 0x51, 0xF2, 0xD7, 0x33, 0x00, 0x53, 0x98, 0xEC, 0x47, 0x39, 0xB9, 0x90, 0x76, 0x4F, 0x68, 0x3D, 0x9C, 0x92, 0xD5, 0xB8, 0xAE, 0xD0, 0xF4, 0x67, 0x58, 0xC0, 0x06, 0x08, 0x14, 0x31, 0xDC, 0xA1, 0x15, 0xDF, 0xCA, 0xE2, 0x23, 0xFE, 0xE4, 0x8F, 0x0A, 0xFC, 0x8A, 0xA3, 0xC6, 0xCD, 0x6A, 0x75, 0xFD, 0x42, 0xB7, 0x79, 0x96, 0x1D, 0x63, 0x18, 0xA9, 0x1C, 0x83, 0x6D, 0xE0, 0x34, 0x04, 0xA6, 0x13, 0xAC, 0xD1, 0xF7, 0x26, 0xC3, 0x1F, 0x27, 0x45, 0x95, 0xCB, 0x21, 0xED, 0x1A, 0x9E, 0x99, 0xEA, 0x40, 0x94, 0x4D, 0x69, 0xF6, 0xEF, 0xC2, 0xAD, 0x03, 0xB3, 0x1E }; unsigned char table_146[256] = { 0x1C, 0xF5, 0x16, 0xD2, 0xCC, 0xDC, 0x1E, 0x29, 0xE3, 0x17, 0x3B, 0x66, 0x6A, 0xF7, 0x03, 0xB2, 0x92, 0x45, 0x4D, 0xD6, 0x0C, 0x5E, 0xE6, 0x01, 0xDE, 0xCE, 0x83, 0xFA, 0x35, 0x02, 0x85, 0xC4, 0x2E, 0x89, 0x8D, 0xE7, 0x30, 0x93, 0xDD, 0x70, 0x80, 0xD9, 0x6D, 0x81, 0x07, 0x8E, 0xA9, 0xA6, 0x5F, 0xC9, 0xF3, 0x9D, 0x65, 0xE8, 0x88, 0x0B, 0x49, 0xAA, 0xB7, 0x6C, 0x11, 0xFC, 0x6F, 0xA3, 0xF8, 0x52, 0x0E, 0xD4, 0x08, 0x25, 0x27, 0x33, 0x2F, 0xF0, 0x2B, 0x47, 0xDA, 0x4C, 0x39, 0x54, 0xB9, 0xC1, 0xEA, 0x7C, 0x44, 0xEB, 0x06, 0xE1, 0x8C, 0x9B, 0x74, 0x42, 0x4F, 0x0A, 0x69, 0x2A, 0x2D, 0xA1, 0x19, 0xD5, 0xC3, 0x87, 0x68, 0xFF, 0xEC, 0xE4, 0x86, 0xCF, 0xF6, 0x79, 0x34, 0xA8, 0x72, 0xF4, 0x8B, 0xAF, 0xA5, 0x00, 0xBA, 0x5C, 0x23, 0xB8, 0xC8, 0x59, 0xBF, 0x6E, 0xCB, 0x20, 0x1F, 0x53, 0x97, 0x4B, 0xD0, 0x55, 0x5B, 0xDF, 0x8A, 0xED, 0x9A, 0x62, 0xC5, 0xD7, 0x18, 0x82, 0xC7, 0x12, 0x15, 0x1B, 0xC0, 0x38, 0xCA, 0x26, 0xDB, 0xAE, 0xF9, 0x90, 0x1A, 0xF2, 0x56, 0x32, 0x21, 0x3C, 0x43, 0xEE, 0xA4, 0x13, 0x94, 0xA2, 0x46, 0x77, 0xBC, 0xB6, 0x9C, 0x0D, 0xCD, 0x37, 0x63, 0x60, 0x6B, 0x3A, 0x3E, 0xA7, 0xD8, 0xFE, 0xFB, 0xEF, 0x67, 0xFD, 0xAD, 0xF1, 0x09, 0x1D, 0xE9, 0x51, 0xB4, 0x95, 0x75, 0x0F, 0xB3, 0xD3, 0xAB, 0x22, 0xBB, 0x61, 0x7F, 0x5A, 0x58, 0x7B, 0x73, 0xC2, 0x05, 0xE0, 0x14, 0xE2, 0xAC, 0x91, 0xBE, 0x4E, 0xC6, 0x7A, 0x84, 0x50, 0x28, 0x3F, 0xB0, 0x04, 0x7E, 0xD1, 0x40, 0xBD, 0xE5, 0x71, 0xB1, 0x78, 0x41, 0x9E, 0x57, 0x64, 0x8F, 0x24, 0x4A, 0x9F, 0x3D, 0x31, 0x36, 0x5D, 0xA0, 0x2C, 0x7D, 0x96, 0x76, 0x99, 0xB5, 0x48, 0x98, 0x10 }; unsigned char table_147[32] = { 0x17, 0x07, 0x0D, 0x16, 0x00, 0x1B, 0x1F, 0x09, 0x10, 0x11, 0x14, 0x0A, 0x02, 0x06, 0x13, 0x0C, 0x08, 0x1E, 0x0F, 0x12, 0x05, 0x15, 0x19, 0x01, 0x1C, 0x1A, 0x03, 0x18, 0x04, 0x0B, 0x1D, 0x0E }; unsigned char table_148[256] = { 0xFB, 0x23, 0xBC, 0x5A, 0x8C, 0x02, 0x42, 0x3B, 0x95, 0x0C, 0x21, 0x0E, 0x14, 0xDF, 0x11, 0xC0, 0xDB, 0x5E, 0xD3, 0xEA, 0xCE, 0xB4, 0x32, 0x12, 0x70, 0x68, 0xA3, 0x25, 0x5B, 0x4B, 0x47, 0xA5, 0x84, 0x9B, 0xFA, 0xD1, 0xE1, 0x3C, 0x20, 0x93, 0x41, 0x26, 0x81, 0x39, 0x17, 0xA4, 0xCF, 0xB9, 0xC5, 0x5F, 0x1C, 0xB3, 0x88, 0xC2, 0x92, 0x30, 0x0A, 0xB8, 0xA0, 0xE2, 0x50, 0x2B, 0x48, 0x1E, 0xD5, 0x13, 0xC7, 0x46, 0x9E, 0x2A, 0xF7, 0x7E, 0xE8, 0x82, 0x60, 0x7A, 0x36, 0x97, 0x0F, 0x8F, 0x8B, 0x80, 0xE0, 0xEB, 0xB1, 0xC6, 0x6E, 0xAE, 0x90, 0x76, 0xA7, 0x31, 0xBE, 0x9C, 0x18, 0x6D, 0xAB, 0x6C, 0x7B, 0xFE, 0x62, 0x05, 0xE9, 0x66, 0x2E, 0x38, 0xB5, 0xB2, 0xFD, 0xFC, 0x7F, 0xE3, 0xA1, 0xF1, 0x99, 0x4D, 0x79, 0x22, 0xD2, 0x37, 0x29, 0x01, 0x54, 0x00, 0xBD, 0x51, 0x1B, 0x07, 0x0B, 0x4A, 0xEE, 0x57, 0xDA, 0x1A, 0x06, 0xCA, 0xCB, 0x9A, 0xC9, 0x7D, 0xE4, 0xDC, 0xE5, 0x8D, 0x75, 0x4F, 0xF6, 0xA2, 0x65, 0x7C, 0xD9, 0x9D, 0x03, 0x27, 0x2D, 0x4C, 0x49, 0xD4, 0x5D, 0x3E, 0xBA, 0x1D, 0xD8, 0x91, 0x74, 0x10, 0xF8, 0xDE, 0xEF, 0xF0, 0x6A, 0x04, 0x72, 0x08, 0x78, 0x3A, 0x53, 0xC4, 0x34, 0xF2, 0x64, 0xAF, 0x86, 0xC3, 0xF3, 0x73, 0x67, 0xCC, 0x58, 0xF4, 0x96, 0xAC, 0x3D, 0xE7, 0x15, 0x8E, 0x19, 0x61, 0xF9, 0xB6, 0xCD, 0x87, 0xAA, 0xB0, 0x1F, 0x6F, 0xAD, 0x28, 0xC8, 0x69, 0x56, 0xC1, 0x71, 0xED, 0xE6, 0x98, 0x6B, 0x59, 0xB7, 0xF5, 0x2C, 0xEC, 0xA8, 0x94, 0x89, 0xBB, 0xA9, 0xD7, 0x2F, 0x8A, 0x4E, 0xD6, 0x33, 0x16, 0x0D, 0x83, 0x5C, 0x52, 0x85, 0xA6, 0x40, 0x45, 0x9F, 0x44, 0x63, 0x35, 0x77, 0xFF, 0x09, 0x43, 0xBF, 0xD0, 0x55, 0xDD, 0x3F, 0x24 }; unsigned char table_149[32] = { 0x1B, 0x0B, 0x0C, 0x06, 0x1F, 0x17, 0x04, 0x1A, 0x1E, 0x02, 0x0F, 0x16, 0x0E, 0x09, 0x10, 0x01, 0x13, 0x19, 0x11, 0x00, 0x0A, 0x05, 0x03, 0x1C, 0x18, 0x1D, 0x14, 0x0D, 0x07, 0x08, 0x15, 0x12 }; unsigned char table_150[256] = { 0x57, 0xBC, 0x9D, 0x46, 0x14, 0xD0, 0x94, 0x95, 0x1B, 0x12, 0xB8, 0xD4, 0x53, 0x73, 0x83, 0xE6, 0x75, 0xE1, 0xD1, 0x0D, 0xDF, 0x23, 0x13, 0x40, 0xF1, 0x0C, 0xA0, 0xC1, 0x22, 0xDA, 0xE8, 0xFB, 0xE5, 0xC4, 0x16, 0x9C, 0x3F, 0xC3, 0x78, 0x3A, 0x06, 0xC7, 0xA8, 0x79, 0xA4, 0xB3, 0x55, 0x88, 0xA9, 0x82, 0xE3, 0x68, 0xFC, 0x3B, 0x26, 0x81, 0xB4, 0x0A, 0x7D, 0x96, 0xDB, 0x2C, 0xE2, 0xCD, 0x92, 0x5C, 0xED, 0x0E, 0x42, 0x98, 0xBE, 0xB7, 0x63, 0x25, 0x7B, 0xD9, 0xEF, 0x11, 0xB9, 0xA3, 0xFA, 0x00, 0x2A, 0x91, 0x71, 0xBF, 0xB2, 0x3D, 0x20, 0x4C, 0xB0, 0x8C, 0x3C, 0x27, 0xAF, 0x09, 0x10, 0x5D, 0x2B, 0x1D, 0xBD, 0x4B, 0x54, 0xD3, 0xAB, 0x1A, 0xE7, 0xF8, 0x56, 0x65, 0xA5, 0xAD, 0xEC, 0x17, 0x45, 0x28, 0xCA, 0xEA, 0x01, 0xF5, 0x34, 0x84, 0x43, 0x8B, 0x03, 0x02, 0x90, 0x6B, 0x60, 0xCE, 0x19, 0x86, 0x4F, 0x08, 0x35, 0x9A, 0xAE, 0x07, 0xE0, 0xB6, 0xD6, 0x2D, 0xD2, 0x89, 0x5F, 0xA6, 0x72, 0x05, 0x36, 0xB5, 0xC0, 0x5A, 0x4D, 0xD7, 0x30, 0x37, 0x87, 0x50, 0xA2, 0x48, 0x29, 0xAC, 0xDE, 0x93, 0x24, 0x6E, 0x1E, 0xF7, 0x52, 0x5E, 0x41, 0xC8, 0xEB, 0x31, 0x7E, 0xE9, 0x67, 0x7A, 0x47, 0x85, 0x8D, 0x74, 0x9E, 0x64, 0x38, 0x9B, 0xBA, 0xCC, 0x9F, 0x8E, 0xEE, 0x0F, 0xB1, 0x7C, 0x6A, 0xBB, 0x2E, 0x58, 0x70, 0x7F, 0x4E, 0x4A, 0x1C, 0x5B, 0xF0, 0xA1, 0x61, 0xF6, 0x15, 0x33, 0xE4, 0xF9, 0x2F, 0x62, 0x1F, 0x76, 0x32, 0xCB, 0x49, 0xFE, 0x8F, 0xD5, 0xDC, 0x66, 0x0B, 0x3E, 0xC5, 0x21, 0xC6, 0x6C, 0x18, 0xC2, 0x6D, 0xFF, 0x51, 0x99, 0xCF, 0xFD, 0x59, 0xA7, 0xAA, 0x8A, 0xF2, 0x69, 0x39, 0x6F, 0x77, 0xDD, 0x97, 0xC9, 0xF3, 0x04, 0xD8, 0xF4, 0x80, 0x44 }; unsigned char table_151[256] = { 0x78, 0x6C, 0xC5, 0x0C, 0x2D, 0xA7, 0x97, 0x9C, 0x22, 0x76, 0x3E, 0x81, 0x51, 0x47, 0x59, 0x71, 0xB1, 0xA2, 0x4A, 0x3C, 0xB5, 0x16, 0x06, 0x95, 0xB9, 0x01, 0xE6, 0x91, 0x96, 0x1C, 0x1B, 0xAD, 0x61, 0x64, 0xB2, 0xE7, 0x29, 0x19, 0x52, 0x3B, 0xFA, 0xAF, 0x30, 0xDB, 0xD4, 0x0B, 0xFE, 0x75, 0x1F, 0xBE, 0xCB, 0xF6, 0xEA, 0x31, 0xF8, 0xD8, 0xA3, 0x82, 0x73, 0x1D, 0x99, 0xF0, 0xCC, 0xB6, 0x46, 0x26, 0xAA, 0x8C, 0x87, 0x90, 0x24, 0x8F, 0x7A, 0x13, 0xEE, 0xD1, 0xA9, 0x05, 0xB3, 0xF7, 0x02, 0x7C, 0x4C, 0x1E, 0xFF, 0xE5, 0x77, 0xAB, 0xD6, 0x98, 0x20, 0x4D, 0xC4, 0x23, 0xF4, 0xA4, 0x85, 0x9A, 0x8E, 0x1A, 0x0E, 0xF5, 0x15, 0x60, 0x38, 0x72, 0xE9, 0xF1, 0xC3, 0x68, 0xF2, 0x93, 0xD3, 0x2A, 0x48, 0x74, 0xC2, 0x57, 0xA1, 0x7D, 0x94, 0x37, 0x92, 0x5C, 0xE1, 0x41, 0x83, 0xD5, 0x65, 0x14, 0xA6, 0xDC, 0x44, 0x27, 0xEF, 0xD7, 0x25, 0x10, 0x2C, 0x7F, 0x40, 0xA5, 0x55, 0xBD, 0x2B, 0x0D, 0xD0, 0xFC, 0xDF, 0xA0, 0x04, 0x00, 0x62, 0xB4, 0x5A, 0xEB, 0x6B, 0x84, 0x7E, 0x6A, 0xDE, 0xED, 0x66, 0x03, 0xFB, 0x2E, 0x4F, 0x4E, 0xBB, 0x36, 0x5B, 0x18, 0xE3, 0x69, 0x3F, 0xEC, 0xE4, 0xD2, 0x0A, 0x34, 0x63, 0xCF, 0xA8, 0xF9, 0x9B, 0x7B, 0x6F, 0xE8, 0x49, 0xC1, 0x09, 0x54, 0xF3, 0x50, 0x67, 0x79, 0xC0, 0x9F, 0x8D, 0x5F, 0x17, 0x70, 0x11, 0xC8, 0xBC, 0xC6, 0xE0, 0x35, 0x39, 0xC7, 0x6E, 0x21, 0xBF, 0xDA, 0x6D, 0x28, 0x0F, 0xDD, 0x33, 0xAC, 0x8A, 0x12, 0xC9, 0xCD, 0xB8, 0x45, 0xAE, 0x32, 0xCE, 0xE2, 0x56, 0xFD, 0x42, 0x89, 0x86, 0xCA, 0x4B, 0x3D, 0x5E, 0xBA, 0x8B, 0x5D, 0xB0, 0xB7, 0xD9, 0x58, 0x2F, 0x08, 0x43, 0x3A, 0x53, 0x9E, 0x80, 0x88, 0x07, 0x9D }; unsigned char table_152[32] = { 0x02, 0x1A, 0x17, 0x1D, 0x01, 0x03, 0x13, 0x1E, 0x05, 0x18, 0x06, 0x0A, 0x0C, 0x04, 0x1B, 0x00, 0x1C, 0x09, 0x1F, 0x16, 0x07, 0x0F, 0x0B, 0x0E, 0x14, 0x12, 0x0D, 0x10, 0x19, 0x11, 0x08, 0x15 }; unsigned char table_153[32] = { 0x0E, 0x14, 0x12, 0x1E, 0x1C, 0x02, 0x06, 0x16, 0x18, 0x0D, 0x17, 0x0C, 0x1D, 0x11, 0x08, 0x19, 0x07, 0x0F, 0x13, 0x04, 0x03, 0x1B, 0x0B, 0x1F, 0x1A, 0x0A, 0x05, 0x10, 0x00, 0x01, 0x15, 0x09 }; unsigned char table_154[256] = { 0x27, 0x5A, 0x08, 0x5B, 0xF4, 0x39, 0x13, 0x6F, 0x67, 0xEA, 0x22, 0xCA, 0x5C, 0xCF, 0x18, 0x7C, 0x05, 0x87, 0x60, 0xCC, 0x40, 0xC6, 0xE8, 0x6D, 0xF5, 0x2A, 0x2D, 0xA2, 0x8C, 0x82, 0xE9, 0xDC, 0xD6, 0x65, 0x74, 0x8E, 0x42, 0x4F, 0x3E, 0x55, 0xFF, 0xC7, 0x9D, 0x0F, 0x81, 0xE2, 0x4C, 0xE6, 0xEB, 0x4D, 0x70, 0xD1, 0x49, 0x43, 0x3D, 0x69, 0x0C, 0x45, 0x28, 0x00, 0x99, 0xAE, 0xEC, 0xB8, 0xC3, 0x17, 0x93, 0x8D, 0x36, 0x3C, 0x46, 0x2B, 0x29, 0xC5, 0xB4, 0xB1, 0xD0, 0x0D, 0xAD, 0xFE, 0xE5, 0xA8, 0x3B, 0x1A, 0x2C, 0xDF, 0x07, 0x86, 0xB0, 0xD3, 0x7A, 0x59, 0x79, 0x8B, 0xC1, 0x9A, 0x30, 0xDB, 0x24, 0xF3, 0xD8, 0x04, 0x25, 0xC2, 0xA3, 0x98, 0x96, 0x7B, 0x71, 0x4E, 0x5E, 0x58, 0xA5, 0x51, 0x88, 0xDA, 0xF8, 0xC0, 0x7D, 0xF6, 0x31, 0x5F, 0x09, 0x16, 0x21, 0x62, 0x01, 0x64, 0x9B, 0x3A, 0x2F, 0x61, 0x19, 0xA1, 0xB7, 0xE0, 0xB9, 0x12, 0xA0, 0xBA, 0x6E, 0x8A, 0xFB, 0xD9, 0x38, 0x1B, 0xD5, 0xB3, 0x10, 0xED, 0xE4, 0x6A, 0x32, 0xBD, 0x75, 0xD4, 0x1C, 0xFD, 0x73, 0x77, 0x54, 0xC8, 0x97, 0x47, 0x35, 0x94, 0xE3, 0xCD, 0x6B, 0xBB, 0xF9, 0xAC, 0x11, 0x14, 0xAF, 0x78, 0x3F, 0xCE, 0x26, 0x44, 0xEE, 0xFC, 0x15, 0x66, 0x4B, 0xA6, 0x20, 0x23, 0xBE, 0x84, 0x1D, 0x7E, 0x0B, 0x56, 0x92, 0x0A, 0xFA, 0xF7, 0x48, 0x33, 0x9E, 0x8F, 0xAB, 0x5D, 0x41, 0x50, 0xA4, 0x7F, 0x80, 0x4A, 0x68, 0x06, 0x2E, 0x6C, 0xC4, 0x02, 0x0E, 0x63, 0xF0, 0xC9, 0x91, 0xB2, 0xD2, 0x03, 0x37, 0xEF, 0x9C, 0x90, 0x83, 0x76, 0x1E, 0xA9, 0x85, 0xB6, 0x57, 0xD7, 0xF2, 0xF1, 0xE7, 0xDE, 0xCB, 0xAA, 0xBF, 0x89, 0x1F, 0xA7, 0xBC, 0x9F, 0x53, 0xE1, 0xDD, 0x72, 0x95, 0x52, 0x34, 0xB5 }; unsigned char table_155[256] = { 0x75, 0x58, 0xC5, 0xA5, 0x83, 0x16, 0xF3, 0x7F, 0x94, 0xDE, 0xA0, 0xF6, 0xFD, 0x89, 0xA8, 0x06, 0x98, 0x01, 0xD9, 0x69, 0xB7, 0x0F, 0xEA, 0x73, 0x32, 0xF0, 0x49, 0xBF, 0x02, 0xE7, 0x22, 0x3F, 0xDB, 0x30, 0x5F, 0x20, 0x6A, 0x93, 0x07, 0xBC, 0x09, 0x0D, 0x37, 0x24, 0x90, 0x15, 0x80, 0xAF, 0x8F, 0x59, 0x28, 0xFF, 0x6D, 0x1E, 0x52, 0x62, 0xE2, 0xDD, 0x85, 0x48, 0xB5, 0xAB, 0x68, 0xAC, 0x7E, 0x26, 0x2C, 0xF9, 0x2A, 0xBE, 0x5B, 0xCE, 0x87, 0x1D, 0x96, 0xBD, 0xEF, 0x29, 0xA9, 0xC3, 0x9D, 0x57, 0x79, 0x6B, 0x7A, 0x82, 0x78, 0x0A, 0x91, 0xF2, 0x7C, 0xC2, 0x25, 0x88, 0xE3, 0x47, 0x64, 0x46, 0x8D, 0x19, 0xF4, 0xE6, 0xF1, 0x53, 0x9C, 0x54, 0x23, 0xAD, 0xA3, 0x86, 0x3A, 0x04, 0x67, 0x1C, 0xF5, 0x43, 0x05, 0x42, 0xD6, 0x4B, 0xFB, 0xD4, 0x2B, 0x08, 0x45, 0xD8, 0xCD, 0xEB, 0x31, 0x4A, 0x5A, 0x34, 0x9B, 0xEC, 0x4D, 0xB4, 0xC6, 0xFE, 0xD5, 0x5E, 0xC1, 0x39, 0x81, 0xCF, 0x03, 0x6E, 0x95, 0x50, 0xA1, 0x3B, 0xB3, 0xE5, 0x3D, 0xB1, 0xB2, 0x41, 0x17, 0x2F, 0x2E, 0xE4, 0x1F, 0xDC, 0xB0, 0xB6, 0x18, 0x6F, 0x44, 0x12, 0x0B, 0xCC, 0x4E, 0xC0, 0x51, 0x14, 0x76, 0x3C, 0xB9, 0x9F, 0xA4, 0xD3, 0xA7, 0xE8, 0x13, 0x55, 0xC8, 0x8C, 0xD2, 0xEE, 0x65, 0xB8, 0xAA, 0x6C, 0x2D, 0x4F, 0x56, 0xFA, 0x61, 0x4C, 0xE0, 0x5C, 0xA6, 0x1A, 0xD1, 0x38, 0xD7, 0x72, 0x60, 0x74, 0xE1, 0xBA, 0x84, 0x3E, 0x40, 0xF8, 0xC7, 0x36, 0x27, 0x0C, 0x70, 0x97, 0x9A, 0x7D, 0x35, 0x71, 0xCA, 0x1B, 0x99, 0x8E, 0xAE, 0x66, 0x63, 0xE9, 0xC9, 0x11, 0x8A, 0x21, 0x92, 0x5D, 0x77, 0x10, 0xD0, 0xC4, 0xF7, 0x7B, 0x9E, 0xCB, 0xED, 0x0E, 0x8B, 0x33, 0xFC, 0xBB, 0x00, 0xA2, 0xDF, 0xDA }; unsigned char table_156[256] = { 0x31, 0x25, 0xB1, 0xD3, 0xAF, 0xAE, 0x84, 0x2C, 0x71, 0x5E, 0xD8, 0x80, 0x6F, 0x3E, 0x48, 0x86, 0xED, 0x54, 0x6A, 0xC3, 0xBC, 0xBF, 0x0E, 0xEA, 0x10, 0xA2, 0x9D, 0x91, 0x32, 0xE2, 0x7E, 0x1B, 0x49, 0x27, 0xFF, 0xDD, 0x8A, 0x2F, 0x8D, 0x38, 0xFA, 0x3C, 0x03, 0x14, 0x0F, 0x89, 0xCC, 0x07, 0x1A, 0xA0, 0x97, 0x37, 0xA6, 0xD6, 0x63, 0x87, 0xA1, 0xC2, 0x4B, 0x39, 0xCB, 0xCF, 0x69, 0x4E, 0xC9, 0x28, 0x1C, 0xBB, 0x42, 0x2B, 0xA9, 0x78, 0x5B, 0xF6, 0xE0, 0xD0, 0x5F, 0x46, 0x98, 0xCE, 0x1F, 0x7A, 0x34, 0x8B, 0xFD, 0x9B, 0xEF, 0x74, 0x05, 0xF2, 0x02, 0xC6, 0xDF, 0x73, 0x5C, 0x8E, 0xDE, 0x88, 0x57, 0x3B, 0x85, 0xBD, 0xC0, 0x3A, 0x45, 0x4D, 0x2D, 0x72, 0x0C, 0x60, 0xCA, 0x5D, 0x06, 0x04, 0x3D, 0x51, 0x15, 0xAD, 0xE8, 0x67, 0xBA, 0x43, 0x7D, 0xF8, 0xB2, 0xE6, 0xAB, 0xF4, 0x23, 0x6E, 0xF0, 0x6B, 0x0B, 0x2E, 0xC8, 0xC4, 0x4F, 0xA8, 0x6D, 0x26, 0xE9, 0x9C, 0x22, 0xB7, 0x00, 0xB3, 0x0A, 0x7C, 0x44, 0x55, 0x75, 0xD5, 0xAA, 0x66, 0x56, 0x24, 0x83, 0x90, 0xA4, 0xF5, 0xCD, 0xEC, 0x18, 0xDC, 0xFE, 0x96, 0xA3, 0xF7, 0xD2, 0xFB, 0xD1, 0x65, 0xC5, 0x08, 0x7B, 0x70, 0x16, 0x9A, 0x20, 0x09, 0x29, 0xDA, 0x52, 0x5A, 0x59, 0xB4, 0x77, 0x62, 0x9E, 0x19, 0x7F, 0x82, 0x4C, 0xB6, 0x0D, 0x58, 0xEE, 0x1D, 0xB9, 0x93, 0x50, 0xD9, 0x30, 0xE4, 0x13, 0x01, 0x36, 0x8F, 0x53, 0x3F, 0x64, 0xA5, 0xB5, 0xD7, 0x81, 0x41, 0x17, 0xE5, 0x94, 0xE3, 0xF9, 0x61, 0x76, 0xE1, 0x9F, 0xFC, 0x1E, 0x12, 0xDB, 0x21, 0x79, 0x2A, 0xAC, 0xF3, 0x6C, 0xC1, 0x95, 0x92, 0xEB, 0xA7, 0x11, 0xC7, 0xB8, 0x4A, 0x33, 0xB0, 0x99, 0xE7, 0xF1, 0x68, 0xBE, 0x35, 0x40, 0x8C, 0xD4, 0x47 }; unsigned char table_157[32] = { 0x00, 0x0D, 0x03, 0x02, 0x11, 0x04, 0x18, 0x0B, 0x14, 0x1D, 0x1C, 0x13, 0x1B, 0x17, 0x10, 0x15, 0x01, 0x19, 0x07, 0x09, 0x1A, 0x16, 0x12, 0x1E, 0x08, 0x06, 0x0C, 0x0E, 0x1F, 0x0F, 0x0A, 0x05 }; unsigned char table_158[256] = { 0x68, 0x26, 0x80, 0x0B, 0xB8, 0xD5, 0x8C, 0xB7, 0x65, 0xEF, 0xBC, 0x94, 0x28, 0xB9, 0xB2, 0xD2, 0x92, 0xA4, 0x55, 0x27, 0xE0, 0x40, 0x6C, 0x41, 0x25, 0xBD, 0xAF, 0xEA, 0xB1, 0x19, 0xA5, 0xC9, 0x0E, 0xED, 0xB4, 0xF9, 0x8B, 0x6A, 0xAE, 0xD8, 0x64, 0x83, 0xC1, 0xD3, 0x04, 0xF4, 0xFA, 0xC3, 0x46, 0x2C, 0xA8, 0xBB, 0x3A, 0x47, 0x33, 0x8F, 0x52, 0x86, 0x08, 0x9D, 0x1D, 0x59, 0x8E, 0x91, 0x32, 0xCF, 0x6B, 0x75, 0xB0, 0x7F, 0xC7, 0x24, 0x05, 0x6F, 0x00, 0x1C, 0x2D, 0xAC, 0xDA, 0x45, 0x73, 0xB3, 0x3E, 0xD6, 0x54, 0x61, 0x03, 0x77, 0xF8, 0xD9, 0xE2, 0x4B, 0xFF, 0xF2, 0x0C, 0x4F, 0x93, 0x71, 0xA7, 0x3D, 0x66, 0x88, 0x98, 0xF1, 0xB6, 0x7A, 0x2B, 0xCD, 0x44, 0x3C, 0x37, 0x5A, 0x96, 0x23, 0x9F, 0xBF, 0x7D, 0x5E, 0x2A, 0x35, 0x72, 0x79, 0xE1, 0xA3, 0x84, 0x99, 0x38, 0x49, 0xC8, 0xDB, 0x30, 0xDC, 0xAD, 0x3F, 0xF6, 0x09, 0x69, 0x95, 0xE5, 0x67, 0xA1, 0xFD, 0xF7, 0x1B, 0xEC, 0x17, 0xD4, 0xEB, 0x29, 0x36, 0x3B, 0x15, 0xDE, 0x2E, 0xC5, 0x70, 0x6D, 0x53, 0x56, 0xAB, 0xC0, 0x43, 0xC2, 0xE7, 0x31, 0xE6, 0xA6, 0x78, 0x5C, 0x7C, 0x48, 0x10, 0x87, 0xCC, 0x9E, 0x7E, 0x5F, 0xE9, 0x07, 0x5B, 0xF5, 0xEE, 0xB5, 0xCA, 0x62, 0x18, 0xBE, 0x20, 0x16, 0xDF, 0x13, 0x4E, 0x7B, 0x02, 0x11, 0x4C, 0x51, 0x85, 0x0D, 0x22, 0xF3, 0x14, 0x63, 0x76, 0xD0, 0x0F, 0xE4, 0xCB, 0xCE, 0xA0, 0x82, 0xE3, 0x01, 0xAA, 0x5D, 0x4A, 0x4D, 0xFB, 0x39, 0x8A, 0x2F, 0xDD, 0xE8, 0x06, 0x1A, 0x90, 0x81, 0x50, 0x8D, 0x89, 0x97, 0x1E, 0xFC, 0x60, 0x12, 0x42, 0x9C, 0xF0, 0x34, 0xD7, 0xD1, 0x1F, 0x0A, 0x21, 0xA9, 0x6E, 0xC4, 0xBA, 0x9A, 0x57, 0xA2, 0x74, 0xC6, 0xFE, 0x9B, 0x58 }; unsigned char table_159[256] = { 0xE5, 0xBF, 0x84, 0x56, 0xD6, 0x43, 0x3E, 0xA5, 0x64, 0x87, 0x44, 0x63, 0x4A, 0x4C, 0x8D, 0x24, 0x1C, 0xDA, 0x89, 0x52, 0x80, 0x4F, 0xE4, 0xBC, 0xC5, 0xF4, 0x27, 0x75, 0x9C, 0xF0, 0xE1, 0x06, 0x99, 0x48, 0xF2, 0x57, 0x34, 0x9A, 0xA8, 0x62, 0xC9, 0xD5, 0x16, 0x6D, 0x55, 0xFA, 0x37, 0x5A, 0x2A, 0xC6, 0x45, 0xDD, 0x1B, 0x76, 0x50, 0xE2, 0x69, 0x41, 0x6C, 0xC4, 0x3C, 0x47, 0xA9, 0x92, 0x00, 0x3D, 0x6F, 0xE7, 0x7A, 0x3A, 0x33, 0x53, 0xF7, 0x03, 0xA7, 0xB1, 0x15, 0x78, 0x0B, 0x67, 0x2E, 0x21, 0xF1, 0xD4, 0xB3, 0x98, 0x60, 0x58, 0xBB, 0x82, 0x1E, 0x70, 0x0A, 0xA2, 0x02, 0x17, 0xFF, 0x9F, 0xD2, 0xAF, 0xC7, 0xDC, 0x68, 0x83, 0x42, 0xCA, 0x08, 0x39, 0x20, 0xEC, 0x77, 0x96, 0x5B, 0xAD, 0x09, 0x6B, 0x40, 0xC2, 0x91, 0x51, 0x10, 0xD9, 0xF9, 0xC1, 0xB5, 0xDF, 0xDB, 0xC0, 0x7D, 0xAB, 0xAE, 0x54, 0x35, 0xF3, 0xA1, 0xE6, 0xEA, 0x14, 0xBA, 0xFC, 0xE8, 0xEB, 0xF6, 0xBD, 0x8C, 0x72, 0x1F, 0xE9, 0xFB, 0x7C, 0xCF, 0x49, 0xE3, 0xA3, 0x22, 0x9D, 0x46, 0x71, 0x94, 0x31, 0x2D, 0x65, 0x2B, 0x32, 0x18, 0xB6, 0x90, 0xF8, 0x11, 0x5F, 0xA0, 0xEF, 0xED, 0x1A, 0x25, 0x2C, 0x3B, 0xFD, 0x2F, 0x73, 0xB9, 0x7E, 0xDE, 0xB4, 0x97, 0x0F, 0x7F, 0x86, 0x93, 0x07, 0x19, 0xCE, 0xE0, 0xB7, 0xEE, 0x26, 0xD1, 0x01, 0x59, 0x5C, 0xC3, 0x79, 0x8B, 0xD3, 0x4B, 0x04, 0xD0, 0x29, 0x0D, 0x3F, 0xB2, 0x30, 0xCC, 0x36, 0xFE, 0xB0, 0xF5, 0x8E, 0xA6, 0x8A, 0xC8, 0xD8, 0x05, 0xB8, 0x12, 0xBE, 0x81, 0x4D, 0x38, 0xAC, 0x1D, 0x9E, 0x66, 0x5E, 0x7B, 0x6E, 0x0C, 0xCD, 0x6A, 0x88, 0xAA, 0x0E, 0x61, 0x5D, 0x95, 0x4E, 0xD7, 0x74, 0xCB, 0x9B, 0x13, 0x8F, 0xA4, 0x28, 0x23, 0x85 }; unsigned char table_160[256] = { 0x35, 0x44, 0x0E, 0x92, 0x75, 0x83, 0x9D, 0x53, 0xA5, 0x90, 0xF8, 0xF7, 0x54, 0x74, 0xDF, 0x3D, 0x5A, 0xAA, 0xC6, 0x26, 0x7A, 0xFC, 0x79, 0x6C, 0x56, 0xB3, 0x32, 0xE3, 0x1C, 0xF9, 0xDC, 0xE6, 0xA2, 0x93, 0x71, 0xFF, 0x1D, 0xEB, 0xB2, 0x04, 0x96, 0x46, 0x0C, 0x2B, 0x17, 0xEE, 0x28, 0x25, 0xD9, 0xAE, 0x11, 0xA7, 0x40, 0x45, 0xFB, 0x80, 0x18, 0xF1, 0xCB, 0x2E, 0x24, 0xF3, 0xEC, 0x4F, 0xAB, 0xD7, 0xD4, 0xC4, 0xFD, 0x4B, 0xAD, 0xC9, 0x4C, 0x08, 0xAC, 0xF4, 0xCD, 0xB7, 0xF2, 0x15, 0x02, 0x2F, 0x16, 0x34, 0x65, 0x8A, 0x87, 0xCC, 0x50, 0x0F, 0x9B, 0xC2, 0xC8, 0x7B, 0xEA, 0x8E, 0xE4, 0xD6, 0x97, 0x30, 0xA8, 0xA0, 0x94, 0xC5, 0xE8, 0x12, 0x27, 0xCE, 0x84, 0xDD, 0xB1, 0x47, 0x7E, 0xE7, 0xE1, 0x3A, 0x37, 0x21, 0x2D, 0x3B, 0x20, 0x60, 0x1E, 0x1B, 0x82, 0xBE, 0xA3, 0x70, 0x98, 0xBF, 0xA6, 0x4D, 0x76, 0x86, 0x42, 0x9F, 0xCF, 0xE0, 0x14, 0x4A, 0x0B, 0xB4, 0x36, 0xF5, 0x85, 0xB8, 0xC0, 0x6A, 0xE9, 0x7D, 0xBD, 0x4E, 0x8F, 0x51, 0x0D, 0x5B, 0x6B, 0x58, 0x5F, 0x03, 0x6F, 0xBC, 0x5D, 0x1F, 0x7F, 0xDB, 0x00, 0xC1, 0x13, 0xF0, 0xD1, 0xFA, 0xDA, 0x05, 0x39, 0xD3, 0x38, 0xD2, 0x89, 0xE2, 0x88, 0x5E, 0x5C, 0x6D, 0xCA, 0xB0, 0x01, 0x63, 0x8B, 0x59, 0xA4, 0xD0, 0x78, 0x19, 0xB5, 0x62, 0x1A, 0x69, 0x8D, 0x9C, 0x22, 0x3F, 0x9E, 0x33, 0x72, 0x2A, 0x41, 0x29, 0xFE, 0xF6, 0x64, 0x7C, 0x66, 0xB6, 0xAF, 0x23, 0x8C, 0x68, 0x6E, 0x49, 0x07, 0x99, 0x77, 0x3E, 0x9A, 0x73, 0xD8, 0x55, 0x0A, 0x3C, 0xBA, 0xA9, 0x52, 0xED, 0x91, 0x09, 0x95, 0xC7, 0x43, 0xD5, 0x57, 0x61, 0x81, 0xEF, 0x06, 0xDE, 0x48, 0x31, 0xBB, 0x2C, 0xE5, 0xC3, 0x67, 0xA1, 0x10, 0xB9 }; unsigned char table_161[256] = { 0x8F, 0x1A, 0x81, 0xA2, 0x2C, 0x56, 0x6D, 0xCD, 0x4A, 0x33, 0x50, 0xE9, 0xE0, 0x12, 0x5A, 0x43, 0x2D, 0x4F, 0xEA, 0x95, 0xFD, 0x49, 0xAB, 0xA3, 0x79, 0x42, 0x0B, 0xB8, 0x89, 0x40, 0x71, 0x14, 0x80, 0x55, 0xAF, 0xCF, 0x3E, 0x64, 0x8B, 0x74, 0xBF, 0x9C, 0x24, 0x97, 0xD1, 0xBA, 0x48, 0xD2, 0x08, 0x1F, 0xDD, 0xA7, 0xDC, 0x92, 0x30, 0x75, 0x31, 0x37, 0x67, 0x06, 0x68, 0x72, 0x6F, 0x05, 0x8A, 0x7C, 0x4C, 0x3C, 0x19, 0x28, 0x86, 0x3D, 0x93, 0xDA, 0xF4, 0xC7, 0x17, 0x85, 0xAC, 0x02, 0x78, 0x04, 0xAD, 0x03, 0x8D, 0x11, 0xC5, 0x9D, 0x3A, 0x73, 0x82, 0x59, 0x51, 0x9F, 0x27, 0x47, 0xE7, 0xED, 0x1E, 0xFF, 0x34, 0x01, 0x5B, 0x4B, 0xCA, 0x6C, 0x69, 0xBB, 0x3B, 0xC4, 0x5F, 0xDF, 0x09, 0x6B, 0x7D, 0xC9, 0x88, 0x45, 0x57, 0xD3, 0x2A, 0x4E, 0xF1, 0xC2, 0xA9, 0xB6, 0x18, 0xD4, 0xA0, 0x1C, 0x4D, 0x0E, 0xE5, 0xE1, 0xD7, 0xB2, 0x0C, 0x3F, 0x00, 0x61, 0x16, 0x0D, 0x32, 0x62, 0x58, 0x63, 0xEE, 0xEF, 0x2F, 0x5D, 0xB0, 0x20, 0x7A, 0x10, 0xE6, 0xA1, 0xF9, 0xD8, 0x6E, 0xCB, 0xF0, 0x9B, 0x84, 0x8E, 0xF2, 0xFE, 0xC8, 0x7F, 0xBD, 0xF8, 0x07, 0xC6, 0x39, 0xBC, 0xCC, 0x22, 0x54, 0x15, 0x9A, 0xA4, 0xC1, 0x2B, 0x1B, 0x25, 0xDE, 0x6A, 0xDB, 0x90, 0xEB, 0xB7, 0xD0, 0x44, 0xA6, 0xB9, 0xB1, 0x23, 0x9E, 0x65, 0x83, 0xFA, 0x96, 0xB5, 0x0F, 0xF6, 0xD6, 0xE8, 0x53, 0x13, 0x76, 0xD5, 0x35, 0x87, 0xE3, 0x38, 0xF5, 0xAE, 0xB3, 0xCE, 0xE2, 0x70, 0xD9, 0x66, 0x5C, 0x26, 0xC3, 0xFC, 0xF7, 0x94, 0xF3, 0xEC, 0xFB, 0x99, 0x91, 0x77, 0xB4, 0x46, 0xA5, 0x98, 0x7B, 0x1D, 0x52, 0x2E, 0xA8, 0x60, 0x5E, 0x29, 0x21, 0x7E, 0xBE, 0x0A, 0x36, 0x41, 0xC0, 0x8C, 0xE4, 0xAA }; unsigned char table_162[256] = { 0xF7, 0x1B, 0xC0, 0x31, 0x5A, 0x23, 0xEA, 0xE9, 0xFB, 0x14, 0x6A, 0xE8, 0x04, 0x65, 0x5B, 0x2C, 0x41, 0xD9, 0xEB, 0xE4, 0x8D, 0x1D, 0xCA, 0x8F, 0x5E, 0x43, 0xAF, 0x46, 0x0A, 0x01, 0x0C, 0xB4, 0x95, 0x52, 0x92, 0xE0, 0x10, 0x57, 0x0F, 0x71, 0xB1, 0x26, 0xD8, 0x05, 0x69, 0x3C, 0x54, 0xDF, 0xFF, 0x9D, 0x51, 0xA0, 0xA1, 0x0B, 0xC1, 0x20, 0x6D, 0xFA, 0x47, 0x15, 0x09, 0xD3, 0xE1, 0xA9, 0x66, 0x12, 0x5C, 0x49, 0x1E, 0x3B, 0xD0, 0x8B, 0x62, 0xBD, 0x06, 0xE5, 0x00, 0x98, 0x4E, 0x32, 0xB0, 0x2D, 0x2A, 0x7F, 0x03, 0xD5, 0x99, 0x7E, 0xAB, 0x22, 0xC6, 0xC3, 0x2F, 0x4C, 0x33, 0x45, 0xE3, 0x3F, 0xF9, 0xB2, 0xFE, 0x36, 0xE7, 0xF8, 0x55, 0x0D, 0x56, 0x1F, 0x4B, 0xE6, 0x50, 0x81, 0xCE, 0x80, 0xCD, 0x67, 0x6B, 0xCF, 0x2E, 0x9B, 0xBC, 0xBE, 0x11, 0x75, 0x4D, 0xAC, 0x59, 0x40, 0x85, 0x0E, 0xC9, 0x17, 0xA3, 0x60, 0xED, 0x16, 0xA4, 0xDD, 0xEE, 0x96, 0x77, 0x83, 0x34, 0xD2, 0xCB, 0xFC, 0x6C, 0x08, 0xEC, 0x35, 0xF2, 0x6F, 0x3A, 0x7B, 0x21, 0x4A, 0x70, 0xEF, 0xAD, 0xDE, 0x90, 0x9E, 0x7D, 0x64, 0x2B, 0x79, 0xF5, 0xF3, 0x13, 0x1C, 0x7A, 0x07, 0x4F, 0x78, 0x89, 0xB6, 0x97, 0xF1, 0xD7, 0x7C, 0x48, 0xAE, 0x39, 0xA8, 0xA6, 0x86, 0x3E, 0x27, 0x87, 0x73, 0x82, 0x24, 0x30, 0x74, 0x5F, 0xD1, 0x9F, 0x9C, 0x1A, 0x8C, 0x42, 0x6E, 0x28, 0xB9, 0xF0, 0xC4, 0x68, 0x25, 0xC5, 0xDC, 0xB8, 0x29, 0xD6, 0x84, 0x3D, 0xBB, 0x88, 0x76, 0xFD, 0x61, 0x94, 0x91, 0xDA, 0xB7, 0x72, 0xBA, 0xC2, 0xDB, 0xB5, 0xA5, 0xE2, 0x18, 0xF6, 0xAA, 0x8A, 0x19, 0x63, 0x9A, 0xA7, 0xC8, 0xD4, 0x02, 0x8E, 0x37, 0xF4, 0xB3, 0xA2, 0x53, 0x38, 0xCC, 0x58, 0x44, 0xBF, 0x93, 0x5D, 0xC7 }; unsigned char table_163[32] = { 0x1B, 0x14, 0x12, 0x15, 0x11, 0x1D, 0x17, 0x19, 0x10, 0x09, 0x08, 0x06, 0x1A, 0x16, 0x07, 0x13, 0x1F, 0x0B, 0x1C, 0x05, 0x0E, 0x00, 0x18, 0x0A, 0x04, 0x01, 0x03, 0x0C, 0x0D, 0x1E, 0x02, 0x0F }; unsigned char table_164[32] = { 0x15, 0x00, 0x10, 0x0B, 0x1D, 0x0A, 0x06, 0x1C, 0x0D, 0x1F, 0x17, 0x0F, 0x03, 0x14, 0x13, 0x12, 0x1B, 0x18, 0x08, 0x1E, 0x16, 0x09, 0x1A, 0x04, 0x02, 0x0C, 0x0E, 0x01, 0x07, 0x19, 0x11, 0x05 }; unsigned char table_165[256] = { 0x98, 0xF5, 0x1D, 0xFB, 0x13, 0x20, 0x41, 0xA3, 0xE3, 0x76, 0x49, 0x7E, 0x60, 0xD8, 0x68, 0x30, 0x88, 0x45, 0xD5, 0x77, 0x00, 0xC3, 0x09, 0x31, 0x44, 0x18, 0xD4, 0x14, 0xC8, 0x1B, 0x8B, 0x38, 0x08, 0x52, 0xD1, 0xF3, 0x69, 0x9F, 0xDA, 0x61, 0x16, 0x1C, 0xE4, 0x7D, 0xEE, 0xD9, 0x5E, 0x4C, 0xA7, 0xAA, 0xA6, 0xF6, 0xCF, 0xA0, 0xBA, 0x10, 0xE2, 0xDE, 0x0F, 0xEA, 0xBC, 0x32, 0x63, 0xC0, 0x54, 0xC5, 0xBE, 0x71, 0x80, 0x56, 0x5C, 0xA4, 0xAD, 0x15, 0x9D, 0x11, 0x43, 0x67, 0x95, 0xAE, 0xC6, 0xC4, 0x91, 0x9C, 0xE5, 0x37, 0xE1, 0x7A, 0xDB, 0xEF, 0x03, 0x65, 0x86, 0x66, 0x2A, 0xB5, 0xBF, 0xB4, 0x0D, 0xB3, 0xD7, 0x2D, 0x01, 0xEB, 0x8C, 0xF2, 0x5A, 0x2E, 0x64, 0x25, 0x02, 0xCB, 0x4A, 0xB0, 0xCE, 0x35, 0xA8, 0x47, 0x85, 0x33, 0x34, 0x24, 0x23, 0x7B, 0xB6, 0x48, 0x83, 0x40, 0x87, 0x57, 0x3C, 0xD6, 0xCD, 0x2C, 0x6D, 0xE7, 0xBB, 0xED, 0x81, 0x5D, 0x55, 0x46, 0xDD, 0xD3, 0x70, 0xBD, 0xB8, 0x75, 0x53, 0x6E, 0xD0, 0x99, 0xCA, 0x58, 0xC7, 0x4B, 0x3D, 0xA5, 0x50, 0x7C, 0x93, 0x51, 0xB7, 0xFD, 0x05, 0x3A, 0xE8, 0x8F, 0x28, 0x74, 0x39, 0xF0, 0x7F, 0x4F, 0x06, 0x36, 0xB2, 0x19, 0x2F, 0x1F, 0x8D, 0x0C, 0xB9, 0xFC, 0x89, 0x21, 0x12, 0xF7, 0x3F, 0x94, 0x6F, 0xDC, 0x3E, 0x4E, 0x3B, 0xC9, 0x07, 0x9B, 0x17, 0x9A, 0x73, 0x6A, 0x5B, 0xA1, 0x1E, 0x8A, 0x04, 0x72, 0x6C, 0xA2, 0xEC, 0x96, 0xFE, 0xF8, 0x84, 0xC1, 0x79, 0x0E, 0x62, 0x90, 0x8E, 0xF4, 0x42, 0x29, 0x92, 0x9E, 0xAC, 0x82, 0x4D, 0xAF, 0x2B, 0x6B, 0xA9, 0xFF, 0x0A, 0xAB, 0x22, 0x5F, 0xDF, 0xD2, 0x0B, 0x78, 0xF1, 0xE6, 0x59, 0x27, 0xC2, 0xE0, 0x1A, 0x26, 0xCC, 0xB1, 0xF9, 0xFA, 0x97, 0xE9 }; unsigned char table_166[256] = { 0xCB, 0xEA, 0x2A, 0x36, 0x6D, 0x93, 0x4E, 0xD5, 0xBC, 0x6A, 0xD4, 0x68, 0xF7, 0x18, 0xAB, 0x8B, 0x66, 0x95, 0x94, 0x64, 0xB7, 0x00, 0x4D, 0x97, 0x38, 0xB3, 0xFC, 0xE1, 0xBB, 0x63, 0xF3, 0x1F, 0x6B, 0x2C, 0x2F, 0x5E, 0xA4, 0x7E, 0xFB, 0xF4, 0xA8, 0x8A, 0x65, 0x53, 0x90, 0x58, 0x40, 0x60, 0x28, 0x8E, 0x35, 0x49, 0xED, 0xBD, 0x1B, 0x0B, 0xBA, 0xB8, 0x61, 0x50, 0xE9, 0x39, 0xEF, 0xC3, 0x74, 0xB6, 0x46, 0x8D, 0xD9, 0x32, 0x92, 0x9A, 0x30, 0x01, 0xF2, 0x41, 0xB9, 0xE7, 0x3A, 0xB0, 0x80, 0x15, 0xDE, 0x7D, 0x7F, 0x09, 0xC2, 0x76, 0xF8, 0x12, 0x59, 0xDD, 0x1D, 0xE6, 0x75, 0xBE, 0xA3, 0x04, 0xCA, 0x78, 0x7B, 0xAC, 0xD8, 0x70, 0xD3, 0xC1, 0x25, 0x6F, 0x03, 0x6C, 0x14, 0x45, 0xE5, 0x2B, 0x87, 0x83, 0xAA, 0x77, 0x5F, 0x4A, 0x9C, 0x27, 0x0C, 0x10, 0xAE, 0x56, 0x85, 0x0D, 0xE3, 0xFA, 0x71, 0xEE, 0x9F, 0x21, 0xC0, 0xCD, 0xFD, 0xDC, 0x5B, 0x11, 0x02, 0x0F, 0x96, 0x3D, 0x3C, 0x26, 0xEB, 0x08, 0x7A, 0x82, 0xA7, 0x19, 0xD7, 0xC5, 0xF6, 0x52, 0x57, 0x88, 0xFF, 0x47, 0x8F, 0xC6, 0x33, 0xB5, 0x2E, 0x8C, 0x81, 0x91, 0x44, 0xA6, 0x17, 0xF0, 0x4B, 0x9D, 0x34, 0x73, 0x72, 0x67, 0xD2, 0x0E, 0xA0, 0x99, 0xA5, 0xAF, 0xFE, 0x9E, 0x6E, 0xDA, 0x3B, 0xE2, 0x23, 0xD6, 0xD0, 0x13, 0x89, 0x5A, 0x42, 0x98, 0x5C, 0xD1, 0x86, 0x24, 0xDF, 0x37, 0xF9, 0xCC, 0xF5, 0xA9, 0x2D, 0xBF, 0x5D, 0xF1, 0x69, 0xE8, 0xA2, 0x06, 0x48, 0xC7, 0xDB, 0x29, 0xE4, 0xAD, 0x3E, 0xA1, 0xC9, 0x4C, 0x1A, 0xCE, 0x62, 0x4F, 0x7C, 0xC8, 0x05, 0xC4, 0xB1, 0x1E, 0x79, 0x55, 0x84, 0xB2, 0x20, 0x31, 0x9B, 0xEC, 0xB4, 0xCF, 0x54, 0x22, 0x1C, 0xE0, 0x51, 0x16, 0x43, 0x07, 0x0A, 0x3F }; unsigned char table_167[256] = { 0x91, 0xEA, 0x4F, 0x6A, 0x6E, 0x2D, 0x27, 0x22, 0x44, 0xA5, 0x6D, 0xE3, 0x45, 0x06, 0xE2, 0x87, 0x9A, 0xC9, 0x2C, 0x4A, 0x93, 0x6F, 0x00, 0xEB, 0x7C, 0x7F, 0xA2, 0xFE, 0x40, 0x3C, 0x3F, 0xC0, 0xC7, 0xFB, 0x8B, 0xDF, 0xA3, 0x28, 0x78, 0x48, 0x46, 0xD5, 0x70, 0x5C, 0x35, 0x4E, 0xD7, 0x3A, 0x42, 0x47, 0x5B, 0x26, 0x8E, 0xE0, 0x21, 0xB1, 0x77, 0x1E, 0x53, 0x4B, 0xCC, 0xE5, 0x65, 0xF6, 0x66, 0x2A, 0xA0, 0x5E, 0x3E, 0xAD, 0xA8, 0x95, 0x1B, 0x0D, 0x8A, 0x05, 0x68, 0x59, 0x0C, 0x38, 0x18, 0xC3, 0x81, 0xA4, 0xFD, 0x13, 0x50, 0xCA, 0xE8, 0xDD, 0xD9, 0x76, 0x8C, 0xC5, 0xF4, 0x17, 0xB4, 0x3D, 0xEC, 0x0B, 0x67, 0xC6, 0x8D, 0xE1, 0xBB, 0x7E, 0xCB, 0x10, 0x99, 0xE9, 0x39, 0xF3, 0x75, 0xFA, 0xAC, 0x16, 0x54, 0x51, 0xBC, 0x24, 0x58, 0x08, 0xA7, 0x0F, 0x5D, 0xBF, 0xBA, 0xE7, 0x9D, 0x2B, 0xB5, 0x29, 0xE4, 0xCD, 0x37, 0x30, 0x55, 0xAE, 0x1D, 0x4D, 0x94, 0x34, 0x92, 0x1C, 0x6B, 0xBE, 0x52, 0x7B, 0x33, 0xB0, 0x0A, 0x5A, 0x03, 0x23, 0x41, 0x49, 0x61, 0x64, 0x73, 0x97, 0xC2, 0x9F, 0x5F, 0x07, 0x04, 0xF8, 0xC1, 0xFC, 0x74, 0x02, 0x0E, 0x60, 0x9E, 0xD4, 0x85, 0x88, 0xC4, 0xF5, 0x90, 0x31, 0xF7, 0xEE, 0x9B, 0xB9, 0x20, 0xE6, 0xA6, 0x63, 0x79, 0x56, 0x62, 0xF0, 0x2F, 0xD8, 0x4C, 0x83, 0xF9, 0x36, 0x3B, 0x84, 0xDE, 0x57, 0xB8, 0xB7, 0x11, 0xF2, 0xC8, 0xD3, 0xD1, 0x96, 0x19, 0x2E, 0x72, 0x9C, 0xDB, 0xB3, 0xA1, 0xAA, 0xCE, 0x09, 0x98, 0xED, 0xA9, 0xDA, 0xAF, 0x86, 0xD0, 0x12, 0xFF, 0xDC, 0x1F, 0xD6, 0x01, 0xF1, 0xD2, 0x80, 0x43, 0x7A, 0x71, 0x82, 0xB6, 0xAB, 0x89, 0xBD, 0x8F, 0xEF, 0x7D, 0xB2, 0x14, 0x15, 0x25, 0x32, 0x6C, 0x69, 0x1A, 0xCF }; unsigned char table_168[256] = { 0x28, 0xEE, 0xB1, 0xFD, 0xB3, 0xEF, 0x36, 0x8E, 0x85, 0x5D, 0x1C, 0x53, 0x1E, 0xDA, 0xBA, 0x3C, 0xA8, 0x90, 0x99, 0x49, 0x45, 0xE0, 0x27, 0x8D, 0x22, 0xE4, 0x51, 0x3E, 0xAB, 0xE8, 0x70, 0xF5, 0x81, 0xE6, 0x34, 0x29, 0xF3, 0x11, 0x46, 0x5F, 0x5C, 0xA0, 0xD1, 0xE3, 0x15, 0x68, 0x3A, 0x01, 0xE9, 0xD7, 0x24, 0x5A, 0x18, 0x16, 0x88, 0x3B, 0x64, 0xA1, 0xDB, 0xBF, 0xAA, 0x43, 0xEA, 0x19, 0xA2, 0xD5, 0x7B, 0xBD, 0x2A, 0x0E, 0x4F, 0xB5, 0x4B, 0xB7, 0x5B, 0x73, 0xC9, 0xAC, 0x1B, 0x67, 0xC7, 0xB4, 0x69, 0x00, 0xBC, 0x6D, 0xC1, 0x04, 0xF4, 0x74, 0xD6, 0xD0, 0x60, 0xAE, 0x17, 0xFE, 0x63, 0xB6, 0x89, 0x41, 0x7C, 0x44, 0x8B, 0xDC, 0x50, 0xE5, 0x79, 0x77, 0x47, 0x9F, 0xA6, 0x3D, 0x09, 0x8A, 0x2F, 0xC0, 0x0F, 0xCD, 0x2B, 0x4D, 0x0D, 0xC2, 0x5E, 0xB0, 0x57, 0x62, 0xAF, 0x1A, 0x21, 0x82, 0x48, 0x9E, 0x38, 0xB9, 0xB8, 0xF2, 0x37, 0x07, 0xCA, 0xC5, 0x84, 0xDF, 0xF9, 0xEC, 0x42, 0x6B, 0x8F, 0x6C, 0x3F, 0xC4, 0x94, 0xED, 0x7A, 0x2D, 0xA3, 0x83, 0xD9, 0x55, 0x02, 0x9A, 0xA9, 0x75, 0x10, 0x2C, 0xCB, 0x95, 0xBB, 0x6E, 0x23, 0x65, 0x35, 0x97, 0x56, 0xAD, 0xCE, 0xF8, 0xF0, 0x0C, 0xE2, 0x52, 0x05, 0x91, 0xCC, 0xC8, 0x78, 0x06, 0x96, 0x4E, 0x03, 0xD3, 0x98, 0xA7, 0x13, 0x58, 0x93, 0xD4, 0xDD, 0xC6, 0xFC, 0x25, 0x9C, 0x86, 0x1F, 0xCF, 0x76, 0xA4, 0x6A, 0xFA, 0x0B, 0x4A, 0x54, 0x40, 0x59, 0xD8, 0x61, 0xFF, 0x7F, 0x80, 0x6F, 0x7D, 0xF1, 0x8C, 0x92, 0xDE, 0x9D, 0xC3, 0xB2, 0xE7, 0xFB, 0x20, 0x31, 0x72, 0x12, 0xBE, 0x1D, 0xF6, 0x9B, 0x14, 0x26, 0x0A, 0xEB, 0xF7, 0x71, 0x39, 0x30, 0xA5, 0x87, 0xD2, 0x66, 0x2E, 0x08, 0x32, 0x4C, 0x33, 0x7E, 0xE1 }; unsigned char table_169[256] = { 0xA4, 0x31, 0xA9, 0x3F, 0x13, 0x4D, 0x1B, 0x29, 0x73, 0x43, 0xF1, 0xE7, 0x9C, 0xC2, 0xF6, 0xCD, 0xA1, 0x94, 0x0D, 0x27, 0xFE, 0x7B, 0x9B, 0x0B, 0x89, 0xBA, 0x23, 0xEC, 0x76, 0xC3, 0x6C, 0xD8, 0x8D, 0xF8, 0xF9, 0x7D, 0x68, 0x5B, 0x61, 0x87, 0x28, 0x14, 0x55, 0x0C, 0xFC, 0xD9, 0x07, 0xE8, 0x36, 0x88, 0x67, 0x4C, 0xEA, 0xBD, 0xF5, 0x9D, 0xB6, 0xC6, 0x24, 0x32, 0x93, 0x03, 0x79, 0x8C, 0x12, 0x84, 0xFF, 0x7E, 0x42, 0xE4, 0x3C, 0xF2, 0x50, 0xEB, 0x1F, 0x47, 0xB0, 0xA5, 0xB1, 0x71, 0x30, 0x5F, 0x5C, 0x53, 0xF7, 0x10, 0xC5, 0x6E, 0xE0, 0xDE, 0xC8, 0x58, 0xB7, 0x90, 0xA6, 0x95, 0x70, 0x8F, 0xFD, 0xC1, 0x48, 0xB5, 0x19, 0x92, 0xBC, 0x15, 0x4E, 0xE6, 0x11, 0xDD, 0x81, 0x0E, 0xBB, 0x75, 0x5D, 0x4A, 0xAB, 0x2D, 0x02, 0x54, 0x4B, 0x66, 0xD6, 0x2B, 0x2A, 0xE5, 0x26, 0xE1, 0xEE, 0xE9, 0x8B, 0x6A, 0x7A, 0xF4, 0x51, 0x39, 0x1C, 0xC9, 0xCF, 0x77, 0x00, 0xF3, 0x25, 0xCC, 0x08, 0xFB, 0x0F, 0x3E, 0xCE, 0xED, 0x3D, 0x56, 0xEF, 0x1D, 0x85, 0x96, 0x52, 0xA8, 0xD3, 0xCB, 0xE3, 0x33, 0x06, 0x7C, 0xAE, 0x72, 0x09, 0x04, 0x91, 0xC4, 0x5A, 0x69, 0x98, 0xB4, 0x40, 0xDF, 0x7F, 0x9F, 0xAA, 0x83, 0xE2, 0x78, 0x74, 0x20, 0xAD, 0x6D, 0xDC, 0xD4, 0xCA, 0x60, 0xF0, 0x35, 0x37, 0xD0, 0x18, 0x1A, 0x64, 0x3A, 0x99, 0xDB, 0x62, 0x44, 0x2C, 0x82, 0x8E, 0xD7, 0xD1, 0xFA, 0x16, 0xD5, 0x46, 0xBF, 0xA7, 0xC0, 0x2E, 0x3B, 0x01, 0x63, 0xB2, 0x1E, 0x05, 0x21, 0xB8, 0x17, 0x22, 0x97, 0xAF, 0x4F, 0x86, 0x34, 0xDA, 0xC7, 0xA3, 0xA0, 0xB3, 0x2F, 0xAC, 0x49, 0xD2, 0x57, 0x6F, 0x9A, 0x65, 0xB9, 0x41, 0xBE, 0x8A, 0xA2, 0x6B, 0x0A, 0x59, 0x9E, 0x5E, 0x38, 0x45, 0x80 }; unsigned char table_170[256] = { 0xE3, 0x00, 0x99, 0x03, 0xF6, 0xDD, 0xD1, 0x41, 0x58, 0x7E, 0xD9, 0x46, 0x04, 0xAF, 0x5C, 0x43, 0xDE, 0x5E, 0xFC, 0x97, 0x3D, 0x68, 0xC8, 0x37, 0x3C, 0xFB, 0x0F, 0x5A, 0xBE, 0xFA, 0x4C, 0x82, 0x0C, 0xA0, 0x0A, 0xD4, 0x9D, 0xCE, 0x78, 0xA8, 0x55, 0x56, 0x60, 0xAA, 0xC9, 0x96, 0x62, 0xEA, 0x0D, 0xB8, 0xE2, 0x84, 0x17, 0xAE, 0x2B, 0x2C, 0x91, 0x57, 0x38, 0x01, 0xA9, 0xCD, 0x34, 0xBA, 0x8D, 0xC0, 0xD6, 0xFF, 0xF2, 0xD3, 0x5F, 0x26, 0xCA, 0x9B, 0x21, 0x75, 0x4E, 0x49, 0x20, 0x59, 0x39, 0xBF, 0x90, 0x6C, 0xFE, 0x8F, 0x2F, 0x18, 0x36, 0xD7, 0xB4, 0xAC, 0xBD, 0xF3, 0x1D, 0x4F, 0xA3, 0x74, 0x5B, 0x44, 0x05, 0x9C, 0x6D, 0x6B, 0x1E, 0xE8, 0x25, 0x16, 0x80, 0xCC, 0x29, 0xC7, 0x94, 0x4A, 0xF5, 0xF4, 0x27, 0x85, 0xBB, 0x24, 0xDA, 0xB5, 0x76, 0x69, 0xA5, 0x54, 0x23, 0x31, 0x11, 0xA4, 0x09, 0xE4, 0x64, 0x10, 0xC5, 0xC1, 0x7D, 0xE7, 0x92, 0xF8, 0x9E, 0x6A, 0x15, 0x8B, 0x98, 0x42, 0x52, 0x66, 0x0B, 0xA1, 0x35, 0x1A, 0x14, 0x7C, 0xE1, 0x9F, 0x28, 0xF1, 0x1B, 0xA6, 0x71, 0x73, 0x81, 0xAB, 0xE6, 0x95, 0x06, 0x1F, 0xC6, 0xB0, 0x51, 0x0E, 0xEE, 0x77, 0xF0, 0xD8, 0xC2, 0x89, 0x7B, 0x07, 0xA2, 0xB7, 0x19, 0x67, 0x2E, 0x8E, 0x47, 0xA7, 0xEF, 0x32, 0xD2, 0x93, 0xDC, 0x9A, 0xB2, 0xED, 0x45, 0xC4, 0x50, 0x3F, 0xE5, 0xCF, 0x88, 0x1C, 0x7A, 0x79, 0xEB, 0x70, 0x2A, 0x7F, 0xBC, 0xDB, 0xD0, 0xB1, 0xCB, 0x08, 0x86, 0x5D, 0x53, 0x72, 0xB6, 0x4B, 0xB3, 0x22, 0xC3, 0x6F, 0xB9, 0xD5, 0x3B, 0x13, 0x2D, 0xAD, 0x33, 0xFD, 0x02, 0x40, 0x8A, 0x3A, 0xF7, 0xE0, 0x8C, 0x3E, 0x61, 0x6E, 0xE9, 0x63, 0xF9, 0xEC, 0x48, 0x30, 0x87, 0x83, 0x12, 0x4D, 0x65, 0xDF }; unsigned char table_171[32] = { 0x07, 0x06, 0x11, 0x08, 0x0C, 0x1F, 0x19, 0x02, 0x14, 0x04, 0x0D, 0x18, 0x1A, 0x05, 0x17, 0x13, 0x1C, 0x1B, 0x15, 0x03, 0x01, 0x0F, 0x16, 0x1E, 0x1D, 0x10, 0x00, 0x12, 0x0B, 0x0E, 0x09, 0x0A }; unsigned char table_172[32] = { 0x11, 0x01, 0x1F, 0x06, 0x1A, 0x04, 0x02, 0x09, 0x05, 0x0D, 0x0B, 0x18, 0x0E, 0x12, 0x1B, 0x17, 0x07, 0x08, 0x1D, 0x1E, 0x14, 0x19, 0x16, 0x15, 0x03, 0x0C, 0x00, 0x10, 0x0A, 0x1C, 0x0F, 0x13 }; unsigned char table_173[32] = { 0x1F, 0x0B, 0x13, 0x00, 0x16, 0x15, 0x14, 0x0A, 0x1D, 0x05, 0x1E, 0x1A, 0x0F, 0x04, 0x0E, 0x01, 0x19, 0x07, 0x02, 0x12, 0x0C, 0x17, 0x08, 0x09, 0x03, 0x11, 0x18, 0x10, 0x1C, 0x1B, 0x06, 0x0D }; unsigned char table_174[32] = { 0x02, 0x1B, 0x0C, 0x17, 0x1F, 0x05, 0x15, 0x1E, 0x16, 0x09, 0x1A, 0x12, 0x0F, 0x1C, 0x18, 0x0A, 0x19, 0x10, 0x0D, 0x13, 0x04, 0x11, 0x08, 0x14, 0x1D, 0x0E, 0x06, 0x00, 0x01, 0x07, 0x0B, 0x03 }; unsigned char table_175[32] = { 0x00, 0x06, 0x0B, 0x08, 0x0C, 0x04, 0x1A, 0x1C, 0x05, 0x1E, 0x14, 0x03, 0x0A, 0x18, 0x12, 0x1D, 0x16, 0x1F, 0x07, 0x09, 0x0F, 0x0E, 0x17, 0x13, 0x11, 0x19, 0x10, 0x0D, 0x1B, 0x02, 0x01, 0x15 }; unsigned char table_176[32] = { 0x12, 0x03, 0x1A, 0x15, 0x04, 0x19, 0x0B, 0x1B, 0x17, 0x1E, 0x0D, 0x05, 0x11, 0x14, 0x1C, 0x00, 0x18, 0x10, 0x0A, 0x06, 0x0E, 0x08, 0x02, 0x07, 0x13, 0x09, 0x16, 0x1D, 0x0F, 0x0C, 0x01, 0x1F }; unsigned char table_177[256] = { 0x5E, 0x4D, 0x76, 0xFE, 0xB5, 0x50, 0x83, 0x23, 0x72, 0xDD, 0x93, 0x08, 0x69, 0xAD, 0xEC, 0x3B, 0x0B, 0x9A, 0x36, 0xC9, 0xCA, 0xBE, 0xF7, 0x30, 0x19, 0x39, 0x2C, 0xAB, 0xE3, 0x7B, 0xBC, 0x32, 0xA0, 0xE4, 0xA6, 0xB6, 0xCB, 0xC8, 0x37, 0x07, 0xD2, 0xA1, 0xD9, 0xF6, 0xBF, 0xF5, 0x88, 0x01, 0x95, 0x0F, 0x03, 0xFD, 0xE6, 0x68, 0x90, 0x61, 0x21, 0x6D, 0x3C, 0x62, 0x34, 0x2B, 0x71, 0x4B, 0x44, 0x64, 0x75, 0xA2, 0x6A, 0xFF, 0x29, 0xBD, 0x35, 0x15, 0xF9, 0xC1, 0x09, 0x45, 0xB2, 0xF2, 0x3F, 0xCE, 0xB0, 0xC0, 0xB8, 0x00, 0x05, 0xD7, 0x11, 0xC6, 0x78, 0x53, 0x9E, 0xB3, 0xED, 0x56, 0x22, 0x5C, 0x9D, 0x6C, 0x99, 0x43, 0x2F, 0xAE, 0xEB, 0x40, 0x8C, 0x1F, 0xC2, 0xDF, 0x92, 0x65, 0x6F, 0x79, 0x5D, 0x5B, 0xAA, 0xDB, 0xF1, 0x96, 0xD4, 0xF4, 0x8B, 0x51, 0xD5, 0xE2, 0xBB, 0x80, 0x17, 0x7C, 0x2A, 0x6E, 0xDE, 0xEA, 0x94, 0x31, 0xA4, 0x2D, 0xC3, 0x8D, 0x55, 0x14, 0x9B, 0x0E, 0x7D, 0xC4, 0x06, 0x33, 0x73, 0xE9, 0x7A, 0x38, 0x5F, 0x89, 0x84, 0xD6, 0xA8, 0x13, 0xE8, 0xCF, 0x46, 0xD0, 0x7F, 0x24, 0x8F, 0xF8, 0x87, 0x1B, 0x47, 0x02, 0x0C, 0x97, 0x52, 0xFB, 0x8E, 0x20, 0x70, 0x3E, 0x7E, 0xD1, 0xE5, 0xEE, 0xCC, 0x91, 0x74, 0xCD, 0x42, 0x04, 0x8A, 0xEF, 0xE1, 0x10, 0x4F, 0x1C, 0x28, 0x9F, 0xD8, 0x0A, 0x18, 0x49, 0x9C, 0x16, 0xF3, 0x82, 0x57, 0x1D, 0x26, 0x66, 0x27, 0x86, 0xE7, 0x59, 0xFA, 0x25, 0x54, 0x0D, 0x98, 0xDC, 0xF0, 0x3D, 0x63, 0x1E, 0x77, 0x3A, 0xDA, 0xB7, 0x6B, 0x2E, 0x48, 0x4C, 0xBA, 0xC7, 0x60, 0xAC, 0x1A, 0xB9, 0xFC, 0xA3, 0xA7, 0xA5, 0xB4, 0x67, 0xA9, 0x81, 0xB1, 0x12, 0xD3, 0x85, 0x5A, 0xC5, 0xE0, 0x58, 0x41, 0x4E, 0x4A, 0xAF }; unsigned char table_178[256] = { 0x33, 0xBA, 0x98, 0xDA, 0x07, 0x2C, 0x22, 0x9B, 0xE0, 0xED, 0xB7, 0xA1, 0x93, 0xEB, 0xDC, 0x49, 0xDF, 0xE1, 0x6C, 0xC2, 0x64, 0x52, 0xD0, 0x8F, 0xA2, 0x48, 0x26, 0x21, 0x6E, 0x5E, 0x0B, 0x7C, 0x0D, 0x90, 0xA4, 0xCE, 0xF5, 0x5F, 0xF9, 0x1D, 0x55, 0x83, 0x8D, 0xFB, 0x38, 0xB3, 0xF2, 0x67, 0xDE, 0x0A, 0xBE, 0xEC, 0x5B, 0x35, 0x08, 0x50, 0xE7, 0x56, 0x4A, 0x02, 0xBC, 0x5A, 0xBD, 0x43, 0x6F, 0x79, 0xB2, 0xF7, 0x60, 0xE9, 0xA0, 0x1B, 0xC8, 0xDD, 0x9D, 0xA3, 0x5C, 0x61, 0x77, 0x72, 0x9C, 0x31, 0x0E, 0x05, 0x1E, 0x12, 0xF1, 0xC9, 0x78, 0x4E, 0x15, 0x7D, 0x54, 0xCB, 0x73, 0xEA, 0xC5, 0x2B, 0x0F, 0x7E, 0x42, 0x96, 0xC6, 0x74, 0x09, 0x65, 0x34, 0xE6, 0x63, 0xA6, 0x70, 0xD3, 0x27, 0x87, 0x3A, 0x16, 0x7B, 0x13, 0x06, 0x40, 0x46, 0x69, 0xAD, 0x88, 0x81, 0xC0, 0x37, 0x58, 0xD1, 0x8A, 0x8E, 0x9A, 0x5D, 0x6D, 0xC7, 0xC3, 0xD2, 0xF4, 0x3F, 0x57, 0x3C, 0x4F, 0xA9, 0x6A, 0x92, 0xA5, 0x97, 0x0C, 0x2A, 0x36, 0x47, 0xDB, 0x8C, 0xEE, 0x03, 0x89, 0x7F, 0x91, 0x24, 0x80, 0x2F, 0x62, 0xE4, 0xAF, 0x17, 0x99, 0xD6, 0xCD, 0xFE, 0x76, 0x1C, 0xD4, 0x3E, 0xFF, 0xD8, 0xC4, 0x39, 0x32, 0xCF, 0xE2, 0xE3, 0x53, 0xD7, 0xCC, 0xD9, 0x11, 0xAA, 0x1F, 0x01, 0x3B, 0x51, 0xB5, 0x94, 0x4B, 0x28, 0xF0, 0xAC, 0x44, 0x14, 0x4C, 0xB9, 0xA7, 0xB8, 0x1A, 0xD5, 0xCA, 0xE8, 0x82, 0x9F, 0x2D, 0xAB, 0x2E, 0x29, 0xFD, 0x68, 0xB1, 0x66, 0xC1, 0x7A, 0xFA, 0x71, 0x04, 0xA8, 0xB0, 0x59, 0x18, 0xAE, 0x25, 0x3D, 0xE5, 0xF6, 0x41, 0x86, 0x75, 0x6B, 0xBB, 0xFC, 0x84, 0x8B, 0x85, 0x10, 0x23, 0xB6, 0xF3, 0x19, 0x30, 0x20, 0x4D, 0x95, 0x9E, 0xBF, 0xEF, 0xF8, 0x45, 0x00, 0xB4 }; unsigned char table_179[256] = { 0x50, 0x3D, 0x41, 0x42, 0x06, 0x5B, 0xD6, 0x34, 0x9D, 0x3C, 0x7B, 0x14, 0xE2, 0x9B, 0x80, 0x15, 0x51, 0x01, 0x6A, 0x30, 0xD7, 0xFC, 0x61, 0x4B, 0x8A, 0xEC, 0x38, 0x71, 0x70, 0x2E, 0x1C, 0x72, 0x79, 0x26, 0x4C, 0x48, 0xED, 0xAD, 0x25, 0x53, 0x03, 0xD9, 0xB5, 0x0D, 0x8E, 0x19, 0xCC, 0xBE, 0xE1, 0x91, 0x64, 0xA6, 0x21, 0xCE, 0x76, 0xAB, 0x9F, 0xD1, 0xB6, 0x23, 0x6D, 0xB0, 0x90, 0xBD, 0x09, 0x3A, 0x5E, 0xD0, 0x73, 0x10, 0x44, 0x08, 0xFF, 0xB8, 0x24, 0x58, 0xDB, 0x65, 0x95, 0xAA, 0xE9, 0xC4, 0x32, 0x2B, 0x84, 0xC9, 0xC7, 0xB1, 0x4F, 0x0C, 0xCB, 0x11, 0x4E, 0x22, 0x4A, 0x16, 0xDE, 0xBC, 0xEE, 0x68, 0x13, 0xFA, 0xC3, 0x98, 0xEB, 0x29, 0x43, 0x9A, 0xA1, 0xE0, 0xF0, 0x3F, 0x2F, 0x1B, 0xC2, 0x66, 0x35, 0xF5, 0xC8, 0xD8, 0x5A, 0xE5, 0x87, 0x47, 0xD3, 0x7A, 0xE6, 0x39, 0x77, 0x81, 0xF2, 0x0E, 0x83, 0x7E, 0x17, 0x6C, 0xB3, 0x5C, 0xE8, 0xD2, 0xC0, 0xA4, 0xF9, 0x86, 0xCD, 0xFB, 0x54, 0x7C, 0xBF, 0x2D, 0x82, 0xDA, 0x96, 0x74, 0x97, 0xC5, 0x7D, 0x27, 0x57, 0x56, 0xDC, 0xBA, 0x69, 0x8C, 0x9C, 0x88, 0xB4, 0x8D, 0x37, 0xEA, 0x3B, 0x33, 0x2C, 0xB2, 0x45, 0xF7, 0xC1, 0x1E, 0x46, 0x02, 0x6B, 0x3E, 0xA7, 0xD5, 0x05, 0x0A, 0xA9, 0x1D, 0xA3, 0x4D, 0xAE, 0x6F, 0x49, 0xDD, 0x8F, 0xEF, 0xBB, 0x67, 0x0B, 0x40, 0x9E, 0xF1, 0x78, 0x28, 0xDF, 0x52, 0xF4, 0x92, 0x94, 0x0F, 0xB9, 0x93, 0xF6, 0x1F, 0xAF, 0xA8, 0xCA, 0xE4, 0x59, 0x7F, 0x85, 0x75, 0xC6, 0xFD, 0x00, 0xB7, 0x55, 0xFE, 0x8B, 0x62, 0x5F, 0x12, 0xF8, 0xD4, 0x89, 0xA0, 0x20, 0xE7, 0xCF, 0x60, 0x5D, 0xAC, 0x1A, 0x36, 0x63, 0x99, 0x31, 0xF3, 0x2A, 0x04, 0x18, 0xA5, 0xA2, 0x6E, 0x07, 0xE3 }; unsigned char table_180[256] = { 0xDA, 0xCC, 0x72, 0xA6, 0xE7, 0x07, 0xFD, 0x25, 0x92, 0x39, 0x49, 0x02, 0xD6, 0x09, 0xA8, 0x65, 0x2E, 0x6C, 0xA1, 0x19, 0xBF, 0x21, 0x11, 0xC7, 0x3F, 0x9F, 0xF4, 0x51, 0xAF, 0x8C, 0xFE, 0xCD, 0x7A, 0xEB, 0x5A, 0xF7, 0x18, 0x69, 0xB9, 0xED, 0x37, 0x45, 0x13, 0xB4, 0xAA, 0x75, 0x47, 0x42, 0xA3, 0x81, 0x88, 0x70, 0xC1, 0x36, 0x73, 0x1D, 0x3B, 0x22, 0xB6, 0x35, 0xE9, 0x31, 0x56, 0x23, 0xE1, 0xF5, 0xAD, 0x46, 0x99, 0x32, 0xE4, 0x40, 0x00, 0x0F, 0x05, 0xC6, 0x33, 0x84, 0x7B, 0x4D, 0x4B, 0x7D, 0x91, 0x3D, 0xCE, 0x64, 0x77, 0x55, 0xD7, 0x2B, 0x2F, 0x2C, 0xB8, 0xD3, 0x85, 0xD1, 0xB5, 0x6A, 0xF9, 0x41, 0x08, 0xBB, 0x87, 0xEC, 0x78, 0xE0, 0xEE, 0x8D, 0x01, 0x58, 0x15, 0x8F, 0x06, 0xF0, 0x8B, 0x27, 0x0D, 0x0B, 0x6D, 0xBD, 0xCA, 0x2A, 0xA2, 0xE6, 0xDD, 0xBC, 0x4E, 0x5D, 0x74, 0x04, 0x3A, 0x96, 0x66, 0x12, 0x1E, 0xF2, 0xF6, 0xC4, 0xAE, 0x3C, 0x0C, 0x90, 0x68, 0xD8, 0x24, 0x5E, 0x79, 0x10, 0xAC, 0xDF, 0x9B, 0xC5, 0x44, 0xC3, 0x50, 0x5C, 0xA5, 0x89, 0x60, 0x5F, 0x48, 0x17, 0x34, 0xA7, 0xE2, 0xF3, 0xD9, 0x3E, 0x9C, 0xB7, 0x7C, 0x1F, 0xA9, 0xD4, 0xA4, 0x0E, 0x8E, 0x4C, 0xDC, 0xF8, 0xF1, 0x98, 0xDE, 0x2D, 0x61, 0xCB, 0xD5, 0x43, 0x86, 0x26, 0xB0, 0x7F, 0x7E, 0xFF, 0xAB, 0x83, 0x14, 0x9A, 0x80, 0x16, 0x30, 0xA0, 0x53, 0x97, 0x52, 0x9E, 0xB1, 0x1B, 0xD0, 0x1A, 0xC8, 0x57, 0xBA, 0x6E, 0xFA, 0x94, 0xE8, 0x63, 0x5B, 0x29, 0xEF, 0x71, 0x8A, 0x03, 0xB3, 0x76, 0xC9, 0xD2, 0xBE, 0xE5, 0x82, 0x1C, 0x95, 0x9D, 0x4A, 0x28, 0xEA, 0x0A, 0xC0, 0xE3, 0x6F, 0x20, 0x54, 0xFB, 0x93, 0xFC, 0x6B, 0x38, 0x62, 0x4F, 0xCF, 0xB2, 0xC2, 0x59, 0xDB, 0x67 }; unsigned char table_181[256] = { 0x2B, 0xED, 0x14, 0x05, 0x80, 0xCC, 0x5A, 0xF8, 0x43, 0xB7, 0x86, 0xC6, 0xEE, 0xA6, 0xD7, 0xD6, 0xA0, 0xC4, 0x21, 0x34, 0xB1, 0x8C, 0xF9, 0xF4, 0x7C, 0x53, 0x06, 0xD4, 0x6B, 0x3F, 0xE1, 0x12, 0x6A, 0xCE, 0xCF, 0xBF, 0x74, 0x3E, 0xD5, 0xCB, 0x97, 0x01, 0xA2, 0x2D, 0xAE, 0xF7, 0x17, 0x29, 0x47, 0x03, 0x0E, 0xE9, 0x82, 0x46, 0x94, 0xAF, 0x2A, 0x90, 0xFE, 0x4A, 0x7E, 0x0C, 0x71, 0xB6, 0xA5, 0xF2, 0x67, 0x41, 0xBA, 0xC2, 0x8A, 0x9D, 0x36, 0xFF, 0x50, 0x2E, 0xC3, 0x91, 0x9C, 0x37, 0x66, 0xAD, 0xB2, 0x1F, 0xE4, 0xE3, 0x9F, 0xDD, 0x87, 0xC0, 0xE6, 0xEF, 0x13, 0x70, 0x5B, 0xDE, 0x5C, 0x75, 0x7F, 0x4F, 0x44, 0xCA, 0x55, 0x57, 0xF0, 0x26, 0xA7, 0xC7, 0x10, 0x51, 0x00, 0xB3, 0x5D, 0x99, 0x81, 0x3B, 0xB9, 0x1C, 0x64, 0x7B, 0xFB, 0xD9, 0x8D, 0x4E, 0xAC, 0x25, 0xBB, 0x69, 0xDF, 0x02, 0x9E, 0x2C, 0xAB, 0xF3, 0x65, 0x09, 0xA3, 0x6C, 0xC1, 0x76, 0x52, 0x30, 0xD8, 0x3A, 0x40, 0x18, 0x59, 0xD0, 0xE5, 0xB4, 0x5F, 0x33, 0x68, 0x92, 0x2F, 0xB8, 0x93, 0xD1, 0xEB, 0xA4, 0xFC, 0x77, 0x19, 0x62, 0xC9, 0x49, 0x84, 0x1A, 0x9A, 0xE7, 0x31, 0xE8, 0xE2, 0x58, 0xF1, 0x4B, 0x1E, 0x0B, 0x39, 0xFD, 0x42, 0x7A, 0x89, 0x38, 0x11, 0x98, 0x63, 0x08, 0xE0, 0xEA, 0xBE, 0xB0, 0x45, 0x1B, 0x4C, 0x54, 0xC8, 0x27, 0x3D, 0x73, 0x04, 0x8F, 0x79, 0xBC, 0x6F, 0x0D, 0x0F, 0xA1, 0x60, 0xDC, 0xC5, 0xFA, 0x8E, 0xDA, 0x15, 0x96, 0xD3, 0x07, 0xF5, 0x3C, 0x88, 0x72, 0x1D, 0x4D, 0x8B, 0x61, 0x0A, 0xDB, 0xAA, 0x20, 0x23, 0xEC, 0x6E, 0x22, 0x48, 0x28, 0xBD, 0xA9, 0x56, 0x5E, 0x85, 0xA8, 0x95, 0x6D, 0x16, 0x78, 0xB5, 0xF6, 0x32, 0x24, 0x7D, 0x9B, 0xD2, 0x83, 0x35, 0xCD }; unsigned char table_182[256] = { 0x06, 0x7F, 0x66, 0xB5, 0xBA, 0x1E, 0xFD, 0x51, 0x81, 0x8D, 0x28, 0xA3, 0x15, 0x37, 0xDC, 0x58, 0xE6, 0x3D, 0xB4, 0xB9, 0x2E, 0xA0, 0x2F, 0xC4, 0xCB, 0xB1, 0x25, 0xBF, 0xC1, 0x4E, 0x5A, 0xE4, 0x0F, 0x10, 0x7C, 0x52, 0xA7, 0x29, 0x76, 0x55, 0xAA, 0x70, 0x62, 0x54, 0x43, 0x93, 0x3A, 0x7D, 0x5B, 0x56, 0x33, 0x64, 0x74, 0x2A, 0xD9, 0x9B, 0x88, 0xC0, 0x3C, 0x63, 0xDE, 0xF4, 0x73, 0xDF, 0x9E, 0xB2, 0xA8, 0x4F, 0x04, 0x57, 0x47, 0x87, 0x14, 0xFC, 0x27, 0x53, 0x83, 0xDB, 0xD7, 0x20, 0x96, 0x31, 0xD0, 0xCF, 0x30, 0x19, 0x69, 0x1A, 0xAE, 0x3B, 0x11, 0x0C, 0xA6, 0x95, 0x8A, 0xF2, 0x1B, 0xCC, 0x78, 0xEF, 0xB3, 0x71, 0x84, 0xA2, 0xF1, 0x7A, 0x92, 0x61, 0xCA, 0x90, 0x94, 0x89, 0x68, 0xEE, 0x97, 0x38, 0x0D, 0xF9, 0x1F, 0x8E, 0xE9, 0x26, 0xBD, 0xC9, 0xFF, 0x4C, 0x44, 0x1D, 0x98, 0xE5, 0x86, 0xF3, 0x18, 0xB6, 0x09, 0xD2, 0x7E, 0xC5, 0xE7, 0x2B, 0x8C, 0x8B, 0x60, 0x3F, 0x2C, 0x6A, 0x08, 0x0E, 0x50, 0x32, 0x9F, 0xF0, 0x9A, 0xC2, 0x39, 0xBE, 0xEA, 0x12, 0x16, 0xBB, 0x5E, 0x67, 0xE3, 0xB8, 0x79, 0x46, 0xDA, 0x00, 0xD3, 0xBC, 0xCE, 0x1C, 0x80, 0xFA, 0xAB, 0x65, 0x4A, 0xF8, 0xAC, 0x72, 0x01, 0xC6, 0x35, 0x85, 0x3E, 0x5C, 0xA1, 0x05, 0xA5, 0xA9, 0xE1, 0x40, 0xEB, 0xE8, 0x5F, 0xF5, 0xC3, 0xD1, 0x34, 0xFB, 0xEC, 0xF7, 0x9C, 0xC7, 0xDD, 0x6C, 0x36, 0x9D, 0x42, 0x59, 0x99, 0x5D, 0xD8, 0x82, 0x07, 0x24, 0x6D, 0xAD, 0x13, 0x48, 0x6B, 0x6E, 0x75, 0x4D, 0xD5, 0x02, 0xED, 0xFE, 0x91, 0xCD, 0x77, 0xB0, 0xF6, 0xC8, 0x6F, 0x23, 0xAF, 0xB7, 0x2D, 0xD6, 0xA4, 0xE2, 0x45, 0x8F, 0x21, 0xE0, 0x49, 0x22, 0x7B, 0x17, 0x0B, 0x0A, 0x41, 0x03, 0xD4, 0x4B }; unsigned char table_183[32] = { 0x1E, 0x1B, 0x11, 0x07, 0x08, 0x06, 0x18, 0x17, 0x0D, 0x0F, 0x12, 0x03, 0x1D, 0x04, 0x0A, 0x1A, 0x0C, 0x13, 0x14, 0x1F, 0x0B, 0x19, 0x10, 0x01, 0x16, 0x05, 0x1C, 0x0E, 0x02, 0x00, 0x09, 0x15 }; unsigned char table_184[32] = { 0x0F, 0x1D, 0x17, 0x16, 0x0D, 0x05, 0x13, 0x1F, 0x1B, 0x09, 0x1C, 0x1E, 0x15, 0x01, 0x06, 0x08, 0x0C, 0x10, 0x0B, 0x02, 0x04, 0x0A, 0x07, 0x1A, 0x18, 0x0E, 0x03, 0x11, 0x12, 0x14, 0x19, 0x00 }; unsigned char table_185[256] = { 0xA5, 0xEE, 0x2E, 0x28, 0xA7, 0xAC, 0xD9, 0xB2, 0x6E, 0x04, 0xB4, 0x03, 0xE8, 0x92, 0x5F, 0x4D, 0x73, 0x20, 0x71, 0xE0, 0x43, 0x53, 0x3F, 0xF8, 0x96, 0xA1, 0x24, 0x97, 0xAD, 0x7B, 0xE5, 0xE6, 0xF2, 0xCE, 0xE3, 0x76, 0x2F, 0xA2, 0x48, 0x0E, 0x4B, 0x4A, 0x8B, 0x5A, 0x81, 0x2C, 0xBF, 0xD7, 0xFB, 0x7D, 0x4C, 0x16, 0xF4, 0x00, 0xF5, 0x40, 0x64, 0x74, 0xA9, 0x37, 0x86, 0xD3, 0x1B, 0xCD, 0xF1, 0x1A, 0x90, 0x9F, 0x54, 0x79, 0x29, 0xC3, 0x77, 0x85, 0x02, 0xB1, 0x70, 0xFE, 0x5B, 0xDA, 0x6B, 0x01, 0x0C, 0x07, 0xB8, 0x58, 0x47, 0x42, 0x09, 0xE4, 0x27, 0xDD, 0xF3, 0x1E, 0x10, 0x9E, 0x49, 0x30, 0x05, 0xBE, 0x59, 0xEB, 0xD2, 0xAA, 0xC8, 0x9D, 0x8C, 0x5E, 0x14, 0x56, 0x8E, 0xF7, 0x38, 0x55, 0x87, 0xA3, 0x5D, 0x41, 0x4F, 0x1F, 0xF6, 0x0F, 0x57, 0x91, 0xAE, 0xBA, 0xB3, 0x95, 0x9B, 0x69, 0xC1, 0x11, 0xD0, 0x25, 0x7F, 0x3B, 0x62, 0xCF, 0xC0, 0xA0, 0xFC, 0xB6, 0x12, 0x6C, 0xF0, 0x13, 0x93, 0xAB, 0xC6, 0x78, 0x6D, 0x88, 0x22, 0x08, 0x2A, 0xE2, 0xB7, 0x65, 0x31, 0x3A, 0xA6, 0x7C, 0xF9, 0xDC, 0xE7, 0xA4, 0xC9, 0x63, 0xA8, 0x0B, 0xED, 0x50, 0x36, 0xD8, 0x3E, 0xB0, 0x6A, 0x5C, 0x45, 0x4E, 0x23, 0x84, 0x34, 0x9A, 0xCC, 0x3D, 0xB5, 0xEA, 0xDE, 0x75, 0xD6, 0xFF, 0x6F, 0xC2, 0xDB, 0x8D, 0x7A, 0x1C, 0xE9, 0x61, 0x0A, 0x1D, 0x32, 0x52, 0x3C, 0x19, 0xFA, 0xD1, 0xD4, 0x68, 0xC7, 0x0D, 0x99, 0x83, 0xEF, 0x80, 0x82, 0xBD, 0xD5, 0x7E, 0x39, 0x72, 0x51, 0xAF, 0x8A, 0x2D, 0xB9, 0x89, 0xC4, 0x67, 0x35, 0xE1, 0x44, 0x06, 0xEC, 0xCB, 0x8F, 0x17, 0xDF, 0x94, 0x60, 0xCA, 0x26, 0xFD, 0x33, 0x46, 0x21, 0xBB, 0x2B, 0xC5, 0x98, 0x18, 0x66, 0x15, 0x9C, 0xBC }; unsigned char table_186[256] = { 0xB7, 0xFA, 0x03, 0x7C, 0x76, 0x43, 0xA7, 0x15, 0x4B, 0x4F, 0x04, 0xAA, 0x4E, 0xD2, 0x52, 0xC8, 0x79, 0x16, 0xF6, 0x61, 0x01, 0x5D, 0xD6, 0x47, 0xDE, 0xC5, 0x4D, 0x2F, 0xF5, 0x29, 0x21, 0xE6, 0x97, 0x35, 0xDC, 0x0E, 0x8B, 0xF4, 0x0F, 0xBE, 0x30, 0x07, 0x1D, 0x46, 0x75, 0xCE, 0x56, 0x42, 0x28, 0x93, 0x84, 0x20, 0xA5, 0xC2, 0x87, 0x45, 0x1C, 0x6B, 0x55, 0x06, 0xEB, 0xB0, 0xF9, 0x14, 0x23, 0xF1, 0xFC, 0xD7, 0x98, 0xD1, 0xA4, 0xED, 0x5B, 0xB1, 0x12, 0x7A, 0xD5, 0x5F, 0x53, 0x88, 0x95, 0x71, 0xE7, 0x5C, 0xF8, 0x83, 0xC7, 0x49, 0xDD, 0xDA, 0x0B, 0xC1, 0x70, 0xEC, 0x67, 0xE2, 0xEA, 0x72, 0x4C, 0x92, 0xA6, 0xE5, 0x59, 0xA9, 0x3C, 0xFE, 0x0A, 0x65, 0x6E, 0xF3, 0xA3, 0x22, 0x24, 0x81, 0xF2, 0xCC, 0xD3, 0xA0, 0xDF, 0xDB, 0xAB, 0x09, 0x13, 0x96, 0x36, 0x9C, 0xEE, 0xD4, 0x33, 0x5E, 0x26, 0xAE, 0x48, 0x38, 0xFF, 0x08, 0x1F, 0x6D, 0x02, 0xEF, 0x7E, 0x57, 0x2A, 0x8A, 0xBA, 0x90, 0xAF, 0xA8, 0x37, 0x8E, 0x9B, 0xC0, 0x69, 0x32, 0x86, 0xBD, 0x73, 0x6C, 0xB9, 0x31, 0x66, 0xBF, 0x1B, 0x44, 0x9E, 0xB2, 0xD0, 0xE0, 0xF0, 0x2C, 0x3F, 0xE1, 0x91, 0x18, 0x19, 0x50, 0xCA, 0x8F, 0x54, 0xB5, 0x8D, 0x0C, 0x17, 0x39, 0x8C, 0x00, 0x7F, 0x41, 0xE3, 0x2E, 0x1A, 0x9D, 0x27, 0xA1, 0x10, 0x34, 0x1E, 0x3A, 0x60, 0x77, 0xBB, 0xB6, 0x0D, 0x4A, 0x3E, 0x6A, 0xB4, 0xA2, 0xB3, 0xFD, 0xCD, 0x80, 0x51, 0xAD, 0xCF, 0xBC, 0x40, 0x74, 0x6F, 0x68, 0x2B, 0xC3, 0xF7, 0x63, 0xB8, 0x25, 0xC4, 0x62, 0xE9, 0xFB, 0x58, 0x85, 0x78, 0xCB, 0x9A, 0x3D, 0xE4, 0xC9, 0x89, 0x2D, 0x64, 0x82, 0xC6, 0x05, 0xD8, 0xAC, 0x99, 0x9F, 0x11, 0x3B, 0x94, 0xE8, 0x7D, 0x7B, 0xD9, 0x5A }; unsigned char table_187[32] = { 0x0F, 0x04, 0x1D, 0x1B, 0x15, 0x10, 0x01, 0x0B, 0x00, 0x17, 0x13, 0x07, 0x1E, 0x1F, 0x08, 0x0A, 0x19, 0x09, 0x05, 0x06, 0x0C, 0x1A, 0x14, 0x16, 0x0E, 0x18, 0x03, 0x1C, 0x12, 0x11, 0x0D, 0x02 }; struct yahoo_fn yahoo_fntable[5][96] = { {{IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}, {IDENT, 0, 0}}, {{MULADD, 0x36056CD7, 0x4387}, {LOOKUP, (long)table_0, 0}, {LOOKUP, (long)table_1, 0}, {BITFLD, (long)table_2, 0}, {LOOKUP, (long)table_3, 0}, {BITFLD, (long)table_4, 0}, {MULADD, 0x4ABB534D, 0x3769}, {XOR, 0x1D242DA5, 0}, {MULADD, 0x3C23132D, 0x339B}, {XOR, 0x0191265C, 0}, {XOR, 0x3DB979DB, 0}, {LOOKUP, (long)table_5, 0}, {XOR, 0x1A550E1E, 0}, {XOR, 0x2F140A2D, 0}, {MULADD, 0x7C466A4B, 0x29BF}, {XOR, 0x2D3F30D3, 0}, {MULADD, 0x7E823B21, 0x6BB3}, {BITFLD, (long)table_6, 0}, {LOOKUP, (long)table_7, 0}, {BITFLD, (long)table_8, 0}, {LOOKUP, (long)table_9, 0}, {BITFLD, (long)table_10, 0}, {LOOKUP, (long)table_11, 0}, {BITFLD, (long)table_12, 0}, {LOOKUP, (long)table_13, 0}, {BITFLD, (long)table_14, 0}, {MULADD, 0x5B756AB9, 0x7E9B}, {LOOKUP, (long)table_15, 0}, {XOR, 0x1D1C4911, 0}, {LOOKUP, (long)table_16, 0}, {LOOKUP, (long)table_17, 0}, {XOR, 0x46BD7771, 0}, {XOR, 0x51AE2B42, 0}, {MULADD, 0x2417591B, 0x177B}, {MULADD, 0x57F27C5F, 0x2433}, {LOOKUP, (long)table_18, 0}, {LOOKUP, (long)table_19, 0}, {XOR, 0x71422261, 0}, {BITFLD, (long)table_20, 0}, {MULADD, 0x58E937F9, 0x1075}, {LOOKUP, (long)table_21, 0}, {BITFLD, (long)table_22, 0}, {LOOKUP, (long)table_23, 0}, {LOOKUP, (long)table_24, 0}, {MULADD, 0x0B4C3D13, 0x1597}, {BITFLD, (long)table_25, 0}, {XOR, 0x0FE07D38, 0}, {MULADD, 0x689B4017, 0x3CFB}, {BITFLD, (long)table_26, 0}, {LOOKUP, (long)table_27, 0}, {XOR, 0x35413DF3, 0}, {MULADD, 0x05B611AB, 0x570B}, {MULADD, 0x0DA5334F, 0x3AC7}, {XOR, 0x47706008, 0}, {BITFLD, (long)table_28, 0}, {LOOKUP, (long)table_29, 0}, {BITFLD, (long)table_30, 0}, {XOR, 0x57611B36, 0}, {MULADD, 0x314C2CD1, 0x2B5B}, {XOR, 0x1EF33946, 0}, {MULADD, 0x28EA041F, 0x638F}, {LOOKUP, (long)table_31, 0}, {LOOKUP, (long)table_32, 0}, {LOOKUP, (long)table_33, 0}, {MULADD, 0x511537CB, 0x7135}, {MULADD, 0x1CF71007, 0x5E17}, {XOR, 0x583D4BCF, 0}, {LOOKUP, (long)table_34, 0}, {XOR, 0x373E6856, 0}, {MULADD, 0x4D595519, 0x1A7D}, {LOOKUP, (long)table_35, 0}, {LOOKUP, (long)table_36, 0}, {XOR, 0x0E2A36A7, 0}, {LOOKUP, (long)table_37, 0}, {LOOKUP, (long)table_38, 0}, {BITFLD, (long)table_39, 0}, {BITFLD, (long)table_40, 0}, {XOR, 0x53F3604F, 0}, {BITFLD, (long)table_41, 0}, {BITFLD, (long)table_42, 0}, {MULADD, 0x1EDC0BA3, 0x7531}, {LOOKUP, (long)table_43, 0}, {XOR, 0x10DF1038, 0}, {BITFLD, (long)table_44, 0}, {LOOKUP, (long)table_45, 0}, {XOR, 0x4EDE0CAC, 0}, {MULADD, 0x2F076EEB, 0x5BCF}, {XOR, 0x6D86030F, 0}, {XOR, 0x3F331713, 0}, {LOOKUP, (long)table_46, 0}, {MULADD, 0x41CD726F, 0x3F79}, {BITFLD, (long)table_47, 0}, {XOR, 0x0ECE0054, 0}, {MULADD, 0x19B32B03, 0x4AD1}, {BITFLD, (long)table_48, 0}, {BITFLD, (long)table_49, 0}}, {{MULADD, 0x39731111, 0x419B}, {XOR, 0x54F7757A, 0}, {BITFLD, (long)table_50, 0}, {BITFLD, (long)table_51, 0}, {LOOKUP, (long)table_52, 0}, {LOOKUP, (long)table_53, 0}, {MULADD, 0x3CC0256B, 0x7CE7}, {XOR, 0x79991847, 0}, {MULADD, 0x228F7FB5, 0x472D}, {MULADD, 0x32DA290B, 0x7745}, {XOR, 0x7A28180D, 0}, {BITFLD, (long)table_54, 0}, {BITFLD, (long)table_55, 0}, {MULADD, 0x5C814F8B, 0x227F}, {LOOKUP, (long)table_56, 0}, {MULADD, 0x0B496F6D, 0x412D}, {XOR, 0x6F4B62DA, 0}, {LOOKUP, (long)table_57, 0}, {XOR, 0x64973977, 0}, {LOOKUP, (long)table_58, 0}, {LOOKUP, (long)table_59, 0}, {BITFLD, (long)table_60, 0}, {LOOKUP, (long)table_61, 0}, {LOOKUP, (long)table_62, 0}, {XOR, 0x6DD14C92, 0}, {LOOKUP, (long)table_63, 0}, {BITFLD, (long)table_64, 0}, {BITFLD, (long)table_65, 0}, {BITFLD, (long)table_66, 0}, {LOOKUP, (long)table_67, 0}, {XOR, 0x5E6324D8, 0}, {LOOKUP, (long)table_68, 0}, {LOOKUP, (long)table_69, 0}, {LOOKUP, (long)table_70, 0}, {BITFLD, (long)table_71, 0}, {XOR, 0x62745ED0, 0}, {MULADD, 0x102C215B, 0x0581}, {LOOKUP, (long)table_72, 0}, {LOOKUP, (long)table_73, 0}, {LOOKUP, (long)table_74, 0}, {MULADD, 0x19511111, 0x12C1}, {LOOKUP, (long)table_75, 0}, {MULADD, 0x2A6E2953, 0x6977}, {LOOKUP, (long)table_76, 0}, {XOR, 0x55CD5445, 0}, {BITFLD, (long)table_77, 0}, {BITFLD, (long)table_78, 0}, {MULADD, 0x646C21EB, 0x43E5}, {XOR, 0x71DC4898, 0}, {XOR, 0x167519CB, 0}, {XOR, 0x6D3158F8, 0}, {XOR, 0x7EA95BEA, 0}, {BITFLD, (long)table_79, 0}, {XOR, 0x47377587, 0}, {XOR, 0x2D8B6E8F, 0}, {MULADD, 0x5E6105DB, 0x1605}, {XOR, 0x65B543C8, 0}, {LOOKUP, (long)table_80, 0}, {BITFLD, (long)table_81, 0}, {MULADD, 0x48AF73CB, 0x0A67}, {XOR, 0x4FB96154, 0}, {LOOKUP, (long)table_82, 0}, {BITFLD, (long)table_83, 0}, {XOR, 0x622C4954, 0}, {BITFLD, (long)table_84, 0}, {XOR, 0x20D220F3, 0}, {XOR, 0x361D4F0D, 0}, {XOR, 0x2B2000D1, 0}, {XOR, 0x6FB8593E, 0}, {LOOKUP, (long)table_85, 0}, {BITFLD, (long)table_86, 0}, {XOR, 0x2B7F7DFC, 0}, {MULADD, 0x5FC41A57, 0x0693}, {MULADD, 0x17154387, 0x2489}, {BITFLD, (long)table_87, 0}, {BITFLD, (long)table_88, 0}, {BITFLD, (long)table_89, 0}, {LOOKUP, (long)table_90, 0}, {XOR, 0x7E221470, 0}, {XOR, 0x7A600061, 0}, {BITFLD, (long)table_91, 0}, {BITFLD, (long)table_92, 0}, {LOOKUP, (long)table_93, 0}, {BITFLD, (long)table_94, 0}, {MULADD, 0x00E813A5, 0x2CE5}, {MULADD, 0x3D707E25, 0x3827}, {MULADD, 0x77A53E07, 0x6A5F}, {BITFLD, (long)table_95, 0}, {LOOKUP, (long)table_96, 0}, {LOOKUP, (long)table_97, 0}, {XOR, 0x43A73788, 0}, {LOOKUP, (long)table_98, 0}, {BITFLD, (long)table_99, 0}, {LOOKUP, (long)table_100, 0}, {XOR, 0x55F4606B, 0}, {BITFLD, (long)table_101, 0}}, {{BITFLD, (long)table_102, 0}, {MULADD, 0x32CA58E3, 0x04F9}, {XOR, 0x11756B30, 0}, {MULADD, 0x218B2569, 0x5DB1}, {XOR, 0x77D64B90, 0}, {BITFLD, (long)table_103, 0}, {LOOKUP, (long)table_104, 0}, {MULADD, 0x7D1428CB, 0x3D}, {XOR, 0x6F872C49, 0}, {XOR, 0x2E484655, 0}, {MULADD, 0x1E3349F7, 0x41F5}, {LOOKUP, (long)table_105, 0}, {BITFLD, (long)table_106, 0}, {XOR, 0x61640311, 0}, {BITFLD, (long)table_107, 0}, {LOOKUP, (long)table_108, 0}, {LOOKUP, (long)table_109, 0}, {LOOKUP, (long)table_110, 0}, {XOR, 0x007044D3, 0}, {BITFLD, (long)table_111, 0}, {MULADD, 0x5C221625, 0x576F}, {LOOKUP, (long)table_112, 0}, {LOOKUP, (long)table_113, 0}, {XOR, 0x2D406BB1, 0}, {MULADD, 0x680B1F17, 0x12CD}, {BITFLD, (long)table_114, 0}, {MULADD, 0x12564D55, 0x32B9}, {MULADD, 0x21A67897, 0x6BAB}, {LOOKUP, (long)table_115, 0}, {MULADD, 0x06405119, 0x7143}, {XOR, 0x351D01ED, 0}, {MULADD, 0x46356F6B, 0x0A49}, {MULADD, 0x32C77969, 0x72F3}, {BITFLD, (long)table_116, 0}, {LOOKUP, (long)table_117, 0}, {LOOKUP, (long)table_118, 0}, {BITFLD, (long)table_119, 0}, {LOOKUP, (long)table_120, 0}, {BITFLD, (long)table_121, 0}, {MULADD, 0x74D52C55, 0x5F43}, {XOR, 0x26201CA8, 0}, {XOR, 0x7AEB3255, 0}, {LOOKUP, (long)table_122, 0}, {MULADD, 0x578F1047, 0x640B}, {LOOKUP, (long)table_123, 0}, {LOOKUP, (long)table_124, 0}, {BITFLD, (long)table_125, 0}, {BITFLD, (long)table_126, 0}, {XOR, 0x4A1352CF, 0}, {MULADD, 0x4BFB6EF3, 0x704F}, {MULADD, 0x1B4C7FE7, 0x5637}, {MULADD, 0x04091A3B, 0x4917}, {XOR, 0x270C2F52, 0}, {LOOKUP, (long)table_127, 0}, {BITFLD, (long)table_128, 0}, {LOOKUP, (long)table_129, 0}, {BITFLD, (long)table_130, 0}, {MULADD, 0x127549D5, 0x579B}, {MULADD, 0x0AB54121, 0x7A47}, {BITFLD, (long)table_131, 0}, {XOR, 0x751E6E49, 0}, {LOOKUP, (long)table_132, 0}, {LOOKUP, (long)table_133, 0}, {XOR, 0x670C3F74, 0}, {MULADD, 0x6B080851, 0x7E8B}, {XOR, 0x71CD789E, 0}, {XOR, 0x3EB20B7B, 0}, {BITFLD, (long)table_134, 0}, {LOOKUP, (long)table_135, 0}, {MULADD, 0x58A67753, 0x272B}, {MULADD, 0x1AB54AD7, 0x4D33}, {MULADD, 0x07D30A45, 0x0569}, {MULADD, 0x737616BF, 0x70C7}, {LOOKUP, (long)table_136, 0}, {MULADD, 0x45C4485D, 0x2063}, {BITFLD, (long)table_137, 0}, {XOR, 0x2598043D, 0}, {MULADD, 0x223A4FE3, 0x49A7}, {XOR, 0x1EED619F, 0}, {BITFLD, (long)table_138, 0}, {XOR, 0x6F477561, 0}, {BITFLD, (long)table_139, 0}, {BITFLD, (long)table_140, 0}, {LOOKUP, (long)table_141, 0}, {MULADD, 0x4BC13C4F, 0x45C1}, {XOR, 0x3B547BFB, 0}, {LOOKUP, (long)table_142, 0}, {MULADD, 0x71406AB3, 0x7A5F}, {XOR, 0x2F1467E9, 0}, {MULADD, 0x009366D1, 0x22D1}, {MULADD, 0x587D1B75, 0x2CA5}, {MULADD, 0x213A4BE7, 0x4499}, {MULADD, 0x62653E89, 0x2D5D}, {BITFLD, (long)table_143, 0}, {MULADD, 0x4F5F3257, 0x444F}, {MULADD, 0x4C0E2B2B, 0x19D3}}, {{MULADD, 0x3F867B35, 0x7B3B}, {MULADD, 0x32D25CB1, 0x3D6D}, {BITFLD, (long)table_144, 0}, {MULADD, 0x50FA1C51, 0x5F4F}, {LOOKUP, (long)table_145, 0}, {XOR, 0x05FE7AF1, 0}, {MULADD, 0x14067C29, 0x10C5}, {LOOKUP, (long)table_146, 0}, {MULADD, 0x4A5558C5, 0x271F}, {XOR, 0x3C0861B1, 0}, {BITFLD, (long)table_147, 0}, {LOOKUP, (long)table_148, 0}, {MULADD, 0x18837C9D, 0x6335}, {BITFLD, (long)table_149, 0}, {XOR, 0x7DAB5033, 0}, {LOOKUP, (long)table_150, 0}, {MULADD, 0x03B87321, 0x7225}, {XOR, 0x7F906745, 0}, {LOOKUP, (long)table_151, 0}, {BITFLD, (long)table_152, 0}, {XOR, 0x21C46C2C, 0}, {MULADD, 0x2B36757D, 0x028D}, {BITFLD, (long)table_153, 0}, {LOOKUP, (long)table_154, 0}, {XOR, 0x106B4A85, 0}, {XOR, 0x17640F11, 0}, {LOOKUP, (long)table_155, 0}, {XOR, 0x69E60486, 0}, {LOOKUP, (long)table_156, 0}, {MULADD, 0x3782017D, 0x05BF}, {BITFLD, (long)table_157, 0}, {LOOKUP, (long)table_158, 0}, {XOR, 0x6BCA53B0, 0}, {LOOKUP, (long)table_159, 0}, {LOOKUP, (long)table_160, 0}, {LOOKUP, (long)table_161, 0}, {LOOKUP, (long)table_162, 0}, {XOR, 0x0B8236E3, 0}, {BITFLD, (long)table_163, 0}, {MULADD, 0x5EE51C43, 0x4553}, {BITFLD, (long)table_164, 0}, {LOOKUP, (long)table_165, 0}, {LOOKUP, (long)table_166, 0}, {LOOKUP, (long)table_167, 0}, {MULADD, 0x42B14C6F, 0x5531}, {XOR, 0x4A2548E8, 0}, {MULADD, 0x5C071D85, 0x2437}, {LOOKUP, (long)table_168, 0}, {MULADD, 0x29195861, 0x108B}, {XOR, 0x24012258, 0}, {LOOKUP, (long)table_169, 0}, {XOR, 0x63CC2377, 0}, {XOR, 0x08D04B59, 0}, {MULADD, 0x3FD30CF5, 0x7027}, {XOR, 0x7C3E0478, 0}, {MULADD, 0x457776B7, 0x24B3}, {XOR, 0x086652BC, 0}, {MULADD, 0x302F5B13, 0x371D}, {LOOKUP, (long)table_170, 0}, {MULADD, 0x58692D47, 0x0671}, {XOR, 0x6601178E, 0}, {MULADD, 0x0F195B9B, 0x1369}, {XOR, 0x07BA21D8, 0}, {BITFLD, (long)table_171, 0}, {BITFLD, (long)table_172, 0}, {XOR, 0x13AC3D21, 0}, {MULADD, 0x5BCF3275, 0x6E1B}, {MULADD, 0x62725C5B, 0x16B9}, {MULADD, 0x5B950FDF, 0x2D35}, {BITFLD, (long)table_173, 0}, {BITFLD, (long)table_174, 0}, {MULADD, 0x73BA5335, 0x1C13}, {BITFLD, (long)table_175, 0}, {BITFLD, (long)table_176, 0}, {XOR, 0x3E144154, 0}, {MULADD, 0x4EED7B27, 0x38AB}, {LOOKUP, (long)table_177, 0}, {MULADD, 0x627C7E0F, 0x7F01}, {MULADD, 0x5D7E1F73, 0x2C0F}, {LOOKUP, (long)table_178, 0}, {MULADD, 0x55C9525F, 0x4659}, {XOR, 0x3765334C, 0}, {MULADD, 0x5DF66DDF, 0x7C25}, {LOOKUP, (long)table_179, 0}, {LOOKUP, (long)table_180, 0}, {XOR, 0x16AE5776, 0}, {LOOKUP, (long)table_181, 0}, {LOOKUP, (long)table_182, 0}, {BITFLD, (long)table_183, 0}, {BITFLD, (long)table_184, 0}, {LOOKUP, (long)table_185, 0}, {MULADD, 0x4392327B, 0x7E0D}, {LOOKUP, (long)table_186, 0}, {MULADD, 0x3D8B0CB5, 0x640D}, {MULADD, 0x32865601, 0x4D43}, {BITFLD, (long)table_187, 0}} }; #define A( x ) (( x ) & 0xFF ) #define B( x ) (( x ) >> 8 & 0xFF ) #define C( x ) (( x ) >> 16 & 0xFF ) #define D( x ) (( x ) >> 24 & 0xFF ) int yahoo_xfrm(int table, int depth, int seed) { struct yahoo_fn *xfrm; int i, j, z; unsigned int n = seed; unsigned char *arg; for (i = 0; i < depth; i++) { xfrm = &yahoo_fntable[table][n % 96]; switch (xfrm->type) { case IDENT: return seed; case XOR: seed ^= xfrm->arg1; break; case MULADD: seed = seed * xfrm->arg1 + xfrm->arg2; break; case LOOKUP: arg = (unsigned char *)xfrm->arg1; seed = arg[A(seed)] | arg[B(seed)] << 8 | arg[C(seed)] << 16 | arg[D(seed)] << 24; break; case BITFLD: arg = (unsigned char *)xfrm->arg1; for (j = 0, z = 0; j < 32; j++) z = (((seed >> j) & 1) << arg[j]) | (~(1 << arg[j]) & z); seed = z; break; } if (depth - i == 1) return seed; z = ((((((A(seed) * 0x9E3779B1) ^ B(seed)) * 0x9E3779B1) ^ C(seed)) * 0x9E3779B1) ^ D(seed)) * 0x9E3779B1; n = ((((z ^ (z >> 8)) >> 16) ^ z) ^ (z >> 8)) & 0xFF; seed *= 0x00010DCD; } return seed; } centerim-4.22.10/libyahoo2/yahoo_fn.h0000644000175000001440000000224611473007750014256 00000000000000/* * libyahoo2 - originally from gaim patches by Amatus * * Copyright (C) 2003-2004 * * 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 */ #define IDENT 1 /* identify function */ #define XOR 2 /* xor with arg1 */ #define MULADD 3 /* multipy by arg1 then add arg2 */ #define LOOKUP 4 /* lookup each byte in the table pointed to by arg1 */ #define BITFLD 5 /* reorder bits according to table pointed to by arg1 */ struct yahoo_fn { int type; long arg1, arg2; }; int yahoo_xfrm(int table, int depth, int seed); centerim-4.22.10/libyahoo2/yahoo_httplib.h0000644000175000001440000000305611473007750015321 00000000000000/* * libyahoo2: yahoo_httplib.h * * Copyright (C) 2002-2004, Philip S Tellis * * 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 YAHOO_HTTPLIB_H #define YAHOO_HTTPLIB_H #ifdef __cplusplus extern "C" { #endif #include "yahoo2_types.h" char *yahoo_urlencode(const char *instr); char *yahoo_urldecode(const char *instr); char *yahoo_xmldecode(const char *instr); int yahoo_tcp_readline(char *ptr, int maxlen, void *fd); void yahoo_http_post(int id, const char *url, const char *cookies, long size, yahoo_get_fd_callback callback, void *data); void yahoo_http_get(int id, const char *url, const char *cookies, int http11, int keepalive, yahoo_get_fd_callback callback, void *data); void yahoo_http_head(int id, const char *url, const char *cookies, int size, char *payload, yahoo_get_fd_callback callback, void *data); #ifdef __cplusplus } #endif #endif centerim-4.22.10/libyahoo2/libyahoo2.c0000644000175000001440000037527211473007750014353 00000000000000/* * libyahoo2: libyahoo2.c * * Some code copyright (C) 2002-2004, Philip S Tellis * YMSG16 code copyright (C) 2009, * Siddhesh Poyarekar * * Yahoo Search copyright (C) 2003, Konstantin Klyagin * * Much of this code was taken and adapted from the yahoo module for * gaim released under the GNU GPL. This code is also released under the * GNU GPL. * * This code is derivitive of Gaim * copyright (C) 1998-1999, Mark Spencer * 1998-1999, Adam Fritzler * 1998-2002, Rob Flynn * 2000-2002, Eric Warmenhoven * 2001-2002, Brian Macke * 2001, Anand Biligiri S * 2001, Valdis Kletnieks * 2002, Sean Egan * 2002, Toby Gray * * This library also uses code from other libraries, namely: * Portions from libfaim copyright 1998, 1999 Adam Fritzler * * Portions of Sylpheed copyright 2000-2002 Hiroyuki Yamamoto * * * YMSG16 authentication code based mostly on write-up at: * http://www.carbonize.co.uk/ymsg16.html * * 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 * */ #if HAVE_CONFIG_H # include #endif #if HAVE_UNISTD_H #include #endif #include #include #include #if STDC_HEADERS # include #else # if !HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr(), *strrchr(); # if !HAVE_MEMCPY # define memcpy(d, s, n) bcopy ((s), (d), (n)) # define memmove(d, s, n) bcopy ((s), (d), (n)) # endif #endif #include #include #include #include "sha1.h" #include "md5.h" #include "yahoo2.h" #include "yahoo_httplib.h" #include "yahoo_util.h" #include "yahoo_fn.h" #include "yahoo2_callbacks.h" #include "yahoo_debug.h" #ifdef __MINGW32__ #define snprintf _snprintf #define vsnprintf _vsnprintf #endif struct yahoo_callbacks *yc = NULL; void yahoo_register_callbacks(struct yahoo_callbacks *tyc) { yc = tyc; } #define YAHOO_CALLBACK(x) yc->x static int yahoo_send_data(void *fd, void *data, int len); static void _yahoo_http_connected(int id, void *fd, int error, void *data); static void yahoo_connected(void *fd, int error, void *data); int yahoo_log_message(char *fmt, ...) { char out[1024]; va_list ap; va_start(ap, fmt); vsnprintf(out, sizeof(out), fmt, ap); va_end(ap); return YAHOO_CALLBACK(ext_yahoo_log) ("%s", out); } int yahoo_connect(char *host, int port) { return YAHOO_CALLBACK(ext_yahoo_connect) (host, port); } static enum yahoo_log_level log_level = YAHOO_LOG_NONE; enum yahoo_log_level yahoo_get_log_level() { return log_level; } int yahoo_set_log_level(enum yahoo_log_level level) { enum yahoo_log_level l = log_level; log_level = level; return l; } /* default values for servers */ static char *default_pager_hosts[] = { "scs.msg.yahoo.com", "scsa.msg.yahoo.com", "scsb.msg.yahoo.com", "scsc.msg.yahoo.com", NULL}; static int pager_port = 5050; static int fallback_ports[] = { 23, 25, 80, 20, 119, 8001, 8002, 5050, 0 }; static char filetransfer_host[] = "filetransfer.msg.yahoo.com"; static int filetransfer_port = 80; static char webcam_host[] = "webcam.yahoo.com"; static int webcam_port = 5100; static char webcam_description[] = ""; static char local_host[] = ""; static int conn_type = Y_WCM_DSL; static char profile_url[] = "http://profiles.yahoo.com/"; struct connect_callback_data { struct yahoo_data *yd; int tag; int i; int server_i; }; struct yahoo_pair { int key; char *value; }; struct yahoo_packet { unsigned short int service; unsigned int status; unsigned int id; YList *hash; }; struct yahoo_search_state { int lsearch_type; char *lsearch_text; int lsearch_gender; int lsearch_agerange; int lsearch_photo; int lsearch_yahoo_only; int lsearch_nstart; int lsearch_nfound; int lsearch_ntotal; }; struct data_queue { unsigned char *queue; int len; }; struct yahoo_input_data { struct yahoo_data *yd; struct yahoo_webcam *wcm; struct yahoo_webcam_data *wcd; struct yahoo_search_state *ys; void *fd; enum yahoo_connection_type type; unsigned char *rxqueue; int rxlen; int read_tag; YList *txqueues; int write_tag; }; struct yahoo_server_settings { char *pager_host; int pager_port; char *filetransfer_host; int filetransfer_port; char *webcam_host; int webcam_port; char *webcam_description; char *local_host; int conn_type; char **pager_host_list; }; static void yahoo_process_ft_connection(struct yahoo_input_data *yid, int over); static void yahoo_process_filetransfer(struct yahoo_input_data *yid, struct yahoo_packet *pkt); static void yahoo_process_filetransferinfo(struct yahoo_input_data *yid, struct yahoo_packet *pkt); static void yahoo_process_filetransferaccept(struct yahoo_input_data *yid, struct yahoo_packet *pkt); static void *_yahoo_default_server_settings() { struct yahoo_server_settings *yss = y_new0(struct yahoo_server_settings, 1); /* Give preference to the default host list * Make sure that only one of the two is set at any time */ yss->pager_host = NULL; yss->pager_host_list = default_pager_hosts; yss->pager_port = pager_port; yss->filetransfer_host = strdup(filetransfer_host); yss->filetransfer_port = filetransfer_port; yss->webcam_host = strdup(webcam_host); yss->webcam_port = webcam_port; yss->webcam_description = strdup(webcam_description); yss->local_host = strdup(local_host); yss->conn_type = conn_type; return yss; } static void *_yahoo_assign_server_settings(va_list ap) { struct yahoo_server_settings *yss = _yahoo_default_server_settings(); char *key; char *svalue; int nvalue; char **pvalue; while (1) { key = va_arg(ap, char *); if (key == NULL) break; if (!strcmp(key, "pager_host")) { svalue = va_arg(ap, char *); free(yss->pager_host); yss->pager_host = strdup(svalue); yss->pager_host_list = NULL; } else if (!strcmp(key, "pager_host_list")) { pvalue = va_arg(ap, char **); yss->pager_host_list = pvalue; free(yss->pager_host); yss->pager_host = NULL; } else if (!strcmp(key, "pager_port")) { nvalue = va_arg(ap, int); yss->pager_port = nvalue; } else if (!strcmp(key, "filetransfer_host")) { svalue = va_arg(ap, char *); free(yss->filetransfer_host); yss->filetransfer_host = strdup(svalue); } else if (!strcmp(key, "filetransfer_port")) { nvalue = va_arg(ap, int); yss->filetransfer_port = nvalue; } else if (!strcmp(key, "webcam_host")) { svalue = va_arg(ap, char *); free(yss->webcam_host); yss->webcam_host = strdup(svalue); } else if (!strcmp(key, "webcam_port")) { nvalue = va_arg(ap, int); yss->webcam_port = nvalue; } else if (!strcmp(key, "webcam_description")) { svalue = va_arg(ap, char *); free(yss->webcam_description); yss->webcam_description = strdup(svalue); } else if (!strcmp(key, "local_host")) { svalue = va_arg(ap, char *); free(yss->local_host); yss->local_host = strdup(svalue); } else if (!strcmp(key, "conn_type")) { nvalue = va_arg(ap, int); yss->conn_type = nvalue; } else { WARNING(("Unknown key passed to yahoo_init, " "perhaps you didn't terminate the list " "with NULL")); } } return yss; } static void yahoo_free_server_settings(struct yahoo_server_settings *yss) { if (!yss) return; free(yss->pager_host); free(yss->filetransfer_host); free(yss->webcam_host); free(yss->webcam_description); free(yss->local_host); free(yss); } static YList *conns = NULL; static YList *inputs = NULL; static int last_id = 0; static void add_to_list(struct yahoo_data *yd) { conns = y_list_prepend(conns, yd); } static struct yahoo_data *find_conn_by_id(int id) { YList *l; for (l = conns; l; l = y_list_next(l)) { struct yahoo_data *yd = l->data; if (yd->client_id == id) return yd; } return NULL; } static void del_from_list(struct yahoo_data *yd) { conns = y_list_remove(conns, yd); } /* call repeatedly to get the next one */ /* static struct yahoo_input_data * find_input_by_id(int id) { YList *l; for(l = inputs; l; l = y_list_next(l)) { struct yahoo_input_data *yid = l->data; if(yid->yd->client_id == id) return yid; } return NULL; } */ static struct yahoo_input_data *find_input_by_id_and_webcam_user(int id, const char *who) { YList *l; LOG(("find_input_by_id_and_webcam_user")); for (l = inputs; l; l = y_list_next(l)) { struct yahoo_input_data *yid = l->data; if (yid->type == YAHOO_CONNECTION_WEBCAM && yid->yd->client_id == id && yid->wcm && ((who && yid->wcm->user && !strcmp(who, yid->wcm->user)) || !(yid->wcm->user && !who))) return yid; } return NULL; } static struct yahoo_input_data *find_input_by_id_and_type(int id, enum yahoo_connection_type type) { YList *l; LOG(("find_input_by_id_and_type")); for (l = inputs; l; l = y_list_next(l)) { struct yahoo_input_data *yid = l->data; if (yid->type == type && yid->yd->client_id == id) return yid; } return NULL; } static struct yahoo_input_data *find_input_by_id_and_fd(int id, void *fd) { YList *l; LOG(("find_input_by_id_and_fd")); for (l = inputs; l; l = y_list_next(l)) { struct yahoo_input_data *yid = l->data; if (yid->fd == fd && yid->yd->client_id == id) return yid; } return NULL; } static int count_inputs_with_id(int id) { int c = 0; YList *l; LOG(("counting %d", id)); for (l = inputs; l; l = y_list_next(l)) { struct yahoo_input_data *yid = l->data; if (yid->yd->client_id == id) c++; } LOG(("%d", c)); return c; } extern char *yahoo_crypt(char *, char *); /* Free a buddy list */ static void yahoo_free_buddies(YList *list) { YList *l; for (l = list; l; l = l->next) { struct yahoo_buddy *bud = l->data; if (!bud) continue; FREE(bud->group); FREE(bud->id); FREE(bud->real_name); if (bud->yab_entry) { FREE(bud->yab_entry->fname); FREE(bud->yab_entry->lname); FREE(bud->yab_entry->nname); FREE(bud->yab_entry->id); FREE(bud->yab_entry->email); FREE(bud->yab_entry->hphone); FREE(bud->yab_entry->wphone); FREE(bud->yab_entry->mphone); FREE(bud->yab_entry); } FREE(bud); l->data = bud = NULL; } y_list_free(list); } /* Free an identities list */ static void yahoo_free_identities(YList *list) { while (list) { YList *n = list; FREE(list->data); list = y_list_remove_link(list, list); y_list_free_1(n); } } /* Free webcam data */ static void yahoo_free_webcam(struct yahoo_webcam *wcm) { if (wcm) { FREE(wcm->user); FREE(wcm->server); FREE(wcm->key); FREE(wcm->description); FREE(wcm->my_ip); } FREE(wcm); } static void yahoo_free_data(struct yahoo_data *yd) { FREE(yd->user); FREE(yd->password); FREE(yd->cookie_y); FREE(yd->cookie_t); FREE(yd->cookie_b); FREE(yd->cookie_c); FREE(yd->login_cookie); FREE(yd->login_id); yahoo_free_buddies(yd->buddies); yahoo_free_buddies(yd->ignore); yahoo_free_identities(yd->identities); yahoo_free_server_settings(yd->server_settings); FREE(yd); } #define YAHOO_PACKET_HDRLEN (4 + 2 + 2 + 2 + 2 + 4 + 4) static struct yahoo_packet *yahoo_packet_new(enum yahoo_service service, enum ypacket_status status, int id) { struct yahoo_packet *pkt = y_new0(struct yahoo_packet, 1); pkt->service = service; pkt->status = status; pkt->id = id; return pkt; } static void yahoo_packet_hash(struct yahoo_packet *pkt, int key, const char *value) { struct yahoo_pair *pair = y_new0(struct yahoo_pair, 1); pair->key = key; pair->value = strdup(value); pkt->hash = y_list_append(pkt->hash, pair); } static int yahoo_packet_length(struct yahoo_packet *pkt) { YList *l; int len = 0; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; int tmp = pair->key; do { tmp /= 10; len++; } while (tmp); len += 2; len += strlen(pair->value); len += 2; } return len; } #define yahoo_put16(buf, data) ( \ (*(buf) = (unsigned char)((data)>>8)&0xff), \ (*((buf)+1) = (unsigned char)(data)&0xff), \ 2) #define yahoo_get16(buf) ((((*(buf))&0xff)<<8) + ((*((buf)+1)) & 0xff)) #define yahoo_put32(buf, data) ( \ (*((buf)) = (unsigned char)((data)>>24)&0xff), \ (*((buf)+1) = (unsigned char)((data)>>16)&0xff), \ (*((buf)+2) = (unsigned char)((data)>>8)&0xff), \ (*((buf)+3) = (unsigned char)(data)&0xff), \ 4) #define yahoo_get32(buf) ((((*(buf) )&0xff)<<24) + \ (((*((buf)+1))&0xff)<<16) + \ (((*((buf)+2))&0xff)<< 8) + \ (((*((buf)+3))&0xff))) static void yahoo_packet_read(struct yahoo_packet *pkt, unsigned char *data, int len) { int pos = 0; while (pos + 1 < len) { char *key, *value = NULL; int accept; int x; struct yahoo_pair *pair = y_new0(struct yahoo_pair, 1); key = malloc(len + 1); x = 0; while (pos + 1 < len) { if (data[pos] == 0xc0 && data[pos + 1] == 0x80) break; key[x++] = data[pos++]; } key[x] = 0; pos += 2; pair->key = strtol(key, NULL, 10); free(key); accept = x; if (pos + 1 > len) { /* Malformed packet! (Truncated--garbage or something) */ accept = 0; } /* if x is 0 there was no key, so don't accept it */ if (accept) value = malloc(len - pos + 1); x = 0; while (pos + 1 < len) { if (data[pos] == 0xc0 && data[pos + 1] == 0x80) break; if (accept) value[x++] = data[pos++]; } if (accept) value[x] = 0; pos += 2; if (accept) { pair->value = strdup(value); FREE(value); pkt->hash = y_list_append(pkt->hash, pair); DEBUG_MSG(("Key: %d \tValue: %s", pair->key, pair->value)); } else { FREE(pair); } } } static void yahoo_packet_write(struct yahoo_packet *pkt, unsigned char *data) { YList *l; int pos = 0; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; unsigned char buf[100]; snprintf((char *)buf, sizeof(buf), "%d", pair->key); strcpy((char *)data + pos, (char *)buf); pos += strlen((char *)buf); data[pos++] = 0xc0; data[pos++] = 0x80; strcpy((char *)data + pos, pair->value); pos += strlen(pair->value); data[pos++] = 0xc0; data[pos++] = 0x80; } } static void yahoo_dump_unhandled(struct yahoo_packet *pkt) { YList *l; NOTICE(("Service: 0x%02x\tStatus: %d", pkt->service, pkt->status)); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; NOTICE(("\t%d => %s", pair->key, pair->value)); } } static void yahoo_packet_dump(unsigned char *data, int len) { if (yahoo_get_log_level() >= YAHOO_LOG_DEBUG) { int i; for (i = 0; i < len; i++) { if ((i % 8 == 0) && i) YAHOO_CALLBACK(ext_yahoo_log) (" "); if ((i % 16 == 0) && i) YAHOO_CALLBACK(ext_yahoo_log) ("\n"); YAHOO_CALLBACK(ext_yahoo_log) ("%02x ", data[i]); } YAHOO_CALLBACK(ext_yahoo_log) ("\n"); for (i = 0; i < len; i++) { if ((i % 8 == 0) && i) YAHOO_CALLBACK(ext_yahoo_log) (" "); if ((i % 16 == 0) && i) YAHOO_CALLBACK(ext_yahoo_log) ("\n"); if (isprint(data[i])) YAHOO_CALLBACK(ext_yahoo_log) (" %c ", data[i]); else YAHOO_CALLBACK(ext_yahoo_log) (" . "); } YAHOO_CALLBACK(ext_yahoo_log) ("\n"); } } static const char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789._"; static void to_y64(unsigned char *out, const unsigned char *in, int inlen) /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */ { for (; inlen >= 3; inlen -= 3) { *out++ = base64digits[in[0] >> 2]; *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)]; *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; *out++ = base64digits[in[2] & 0x3f]; in += 3; } if (inlen > 0) { unsigned char fragment; *out++ = base64digits[in[0] >> 2]; fragment = (in[0] << 4) & 0x30; if (inlen > 1) fragment |= in[1] >> 4; *out++ = base64digits[fragment]; *out++ = (inlen < 2) ? '-' : base64digits[(in[1] << 2) & 0x3c]; *out++ = '-'; } *out = '\0'; } static void yahoo_add_to_send_queue(struct yahoo_input_data *yid, void *data, int length) { struct data_queue *tx = y_new0(struct data_queue, 1); tx->queue = y_new0(unsigned char, length); tx->len = length; memcpy(tx->queue, data, length); yid->txqueues = y_list_append(yid->txqueues, tx); if (!yid->write_tag) yid->write_tag = YAHOO_CALLBACK(ext_yahoo_add_handler) (yid->yd-> client_id, yid->fd, YAHOO_INPUT_WRITE, yid); } static void yahoo_send_packet(struct yahoo_input_data *yid, struct yahoo_packet *pkt, int extra_pad) { int pktlen = yahoo_packet_length(pkt); int len = YAHOO_PACKET_HDRLEN + pktlen; unsigned char *data; int pos = 0; if (!yid->fd) return; data = y_new0(unsigned char, len + 1); memcpy(data + pos, "YMSG", 4); pos += 4; pos += yahoo_put16(data + pos, YAHOO_PROTO_VER); /* version [latest 12 0x000c] */ pos += yahoo_put16(data + pos, 0x0000); /* HIWORD pkt length??? */ pos += yahoo_put16(data + pos, pktlen + extra_pad); /* LOWORD pkt length? */ pos += yahoo_put16(data + pos, pkt->service); /* service */ pos += yahoo_put32(data + pos, pkt->status); /* status [4bytes] */ pos += yahoo_put32(data + pos, pkt->id); /* session [4bytes] */ yahoo_packet_write(pkt, data + pos); yahoo_packet_dump(data, len); if (yid->type == YAHOO_CONNECTION_FT) yahoo_send_data(yid->fd, data, len); else yahoo_add_to_send_queue(yid, data, len); FREE(data); } static void yahoo_packet_free(struct yahoo_packet *pkt) { while (pkt->hash) { struct yahoo_pair *pair = pkt->hash->data; YList *tmp; FREE(pair->value); FREE(pair); tmp = pkt->hash; pkt->hash = y_list_remove_link(pkt->hash, pkt->hash); y_list_free_1(tmp); } FREE(pkt); } static int yahoo_send_data(void *fd, void *data, int len) { int ret; int e; if (fd == NULL) return -1; yahoo_packet_dump(data, len); do { ret = YAHOO_CALLBACK(ext_yahoo_write) (fd, data, len); } while (ret == -1 && errno == EINTR); e = errno; if (ret == -1) { LOG(("wrote data: ERR %s", strerror(errno))); } else { LOG(("wrote data: OK")); } errno = e; return ret; } void yahoo_close(int id) { struct yahoo_data *yd = find_conn_by_id(id); if (!yd) return; del_from_list(yd); yahoo_free_data(yd); if (id == last_id) last_id--; } static void yahoo_input_close(struct yahoo_input_data *yid) { inputs = y_list_remove(inputs, yid); LOG(("yahoo_input_close(read)")); YAHOO_CALLBACK(ext_yahoo_remove_handler) (yid->yd->client_id, yid->read_tag); LOG(("yahoo_input_close(write)")); YAHOO_CALLBACK(ext_yahoo_remove_handler) (yid->yd->client_id, yid->write_tag); yid->read_tag = yid->write_tag = 0; if (yid->fd) YAHOO_CALLBACK(ext_yahoo_close) (yid->fd); yid->fd = 0; FREE(yid->rxqueue); if (count_inputs_with_id(yid->yd->client_id) == 0) { LOG(("closing %d", yid->yd->client_id)); yahoo_close(yid->yd->client_id); } yahoo_free_webcam(yid->wcm); if (yid->wcd) FREE(yid->wcd); if (yid->ys) { FREE(yid->ys->lsearch_text); FREE(yid->ys); } FREE(yid); } static int is_same_bud(const void *a, const void *b) { const struct yahoo_buddy *subject = a; const struct yahoo_buddy *object = b; return strcmp(subject->id, object->id); } static char *getcookie(char *rawcookie) { char *cookie = NULL; char *tmpcookie; char *cookieend; if (strlen(rawcookie) < 2) return NULL; tmpcookie = strdup(rawcookie + 2); cookieend = strchr(tmpcookie, ';'); if (cookieend) *cookieend = '\0'; cookie = strdup(tmpcookie); FREE(tmpcookie); /* cookieend=NULL; not sure why this was there since the value is not preserved in the stack -dd */ return cookie; } static char *getlcookie(char *cookie) { char *tmp; char *tmpend; char *login_cookie = NULL; tmpend = strstr(cookie, "n="); if (tmpend) { tmp = strdup(tmpend + 2); tmpend = strchr(tmp, '&'); if (tmpend) *tmpend = '\0'; login_cookie = strdup(tmp); FREE(tmp); } return login_cookie; } static void yahoo_process_notify(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *msg = NULL; char *from = NULL; char *to = NULL; int stat = 0; int accept = 0; char *ind = NULL; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 4) from = pair->value; if (pair->key == 5) to = pair->value; if (pair->key == 49) msg = pair->value; if (pair->key == 13) stat = atoi(pair->value); if (pair->key == 14) ind = pair->value; if (pair->key == 16) { /* status == -1 */ NOTICE((pair->value)); return; } } if (!msg) return; if (!strncasecmp(msg, "TYPING", strlen("TYPING"))) YAHOO_CALLBACK(ext_yahoo_typing_notify) (yd->client_id, to, from, stat); else if (!strncasecmp(msg, "GAME", strlen("GAME"))) YAHOO_CALLBACK(ext_yahoo_game_notify) (yd->client_id, to, from, stat, ind); else if (!strncasecmp(msg, "WEBCAMINVITE", strlen("WEBCAMINVITE"))) { if (!strcmp(ind, " ")) { YAHOO_CALLBACK(ext_yahoo_webcam_invite) (yd->client_id, to, from); } else { accept = atoi(ind); /* accept the invitation (-1 = deny 1 = accept) */ if (accept < 0) accept = 0; YAHOO_CALLBACK(ext_yahoo_webcam_invite_reply) (yd-> client_id, to, from, accept); } } else LOG(("Got unknown notification: %s", msg)); } static void yahoo_process_conference(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *msg = NULL; char *host = NULL; char *who = NULL; char *room = NULL; char *id = NULL; int utf8 = 0; YList *members = NULL; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 50) host = pair->value; if (pair->key == 52) { /* invite */ members = y_list_append(members, strdup(pair->value)); } if (pair->key == 53) /* logon */ who = pair->value; if (pair->key == 54) /* decline */ who = pair->value; if (pair->key == 55) /* unavailable (status == 2) */ who = pair->value; if (pair->key == 56) /* logoff */ who = pair->value; if (pair->key == 57) room = pair->value; if (pair->key == 58) /* join message */ msg = pair->value; if (pair->key == 14) /* decline/conf message */ msg = pair->value; if (pair->key == 13) ; if (pair->key == 16) /* error */ msg = pair->value; if (pair->key == 1) /* my id */ id = pair->value; if (pair->key == 3) /* message sender */ who = pair->value; if (pair->key == 97) utf8 = atoi(pair->value); } if (!room) return; if (host) { for (l = members; l; l = l->next) { char *w = l->data; if (!strcmp(w, host)) break; } if (!l) members = y_list_append(members, strdup(host)); } /* invite, decline, join, left, message -> status == 1 */ switch (pkt->service) { case YAHOO_SERVICE_CONFINVITE: if (pkt->status == 2) ; else if (members) YAHOO_CALLBACK(ext_yahoo_got_conf_invite) (yd-> client_id, id, host, room, msg, members); else if (msg) YAHOO_CALLBACK(ext_yahoo_error) (yd->client_id, msg, 0, E_CONFNOTAVAIL); break; case YAHOO_SERVICE_CONFADDINVITE: if (pkt->status == 1) YAHOO_CALLBACK(ext_yahoo_got_conf_invite) (yd-> client_id, id, host, room, msg, members); break; case YAHOO_SERVICE_CONFDECLINE: if (who) YAHOO_CALLBACK(ext_yahoo_conf_userdecline) (yd-> client_id, id, who, room, msg); break; case YAHOO_SERVICE_CONFLOGON: if (who) YAHOO_CALLBACK(ext_yahoo_conf_userjoin) (yd->client_id, id, who, room); break; case YAHOO_SERVICE_CONFLOGOFF: if (who) YAHOO_CALLBACK(ext_yahoo_conf_userleave) (yd->client_id, id, who, room); break; case YAHOO_SERVICE_CONFMSG: if (who) YAHOO_CALLBACK(ext_yahoo_conf_message) (yd->client_id, id, who, room, msg, utf8); break; } } static void yahoo_process_chat(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { char *msg = NULL; char *id = NULL; char *who = NULL; char *room = NULL; char *topic = NULL; YList *members = NULL; struct yahoo_chat_member *currentmember = NULL; int msgtype = 1; int utf8 = 0; int firstjoin = 0; int membercount = 0; int chaterr = 0; YList *l; yahoo_dump_unhandled(pkt); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 1) { /* My identity */ id = pair->value; } if (pair->key == 104) { /* Room name */ room = pair->value; } if (pair->key == 105) { /* Room topic */ topic = pair->value; } if (pair->key == 108) { /* Number of members in this packet */ membercount = atoi(pair->value); } if (pair->key == 109) { /* message sender */ who = pair->value; if (pkt->service == YAHOO_SERVICE_CHATJOIN) { currentmember = y_new0(struct yahoo_chat_member, 1); currentmember->id = strdup(pair->value); members = y_list_append(members, currentmember); } } if (pair->key == 110) { /* age */ if (pkt->service == YAHOO_SERVICE_CHATJOIN) currentmember->age = atoi(pair->value); } if (pair->key == 113) { /* attribs */ if (pkt->service == YAHOO_SERVICE_CHATJOIN) currentmember->attribs = atoi(pair->value); } if (pair->key == 141) { /* alias */ if (pkt->service == YAHOO_SERVICE_CHATJOIN) currentmember->alias = strdup(pair->value); } if (pair->key == 142) { /* location */ if (pkt->service == YAHOO_SERVICE_CHATJOIN) currentmember->location = strdup(pair->value); } if (pair->key == 130) { /* first join */ firstjoin = 1; } if (pair->key == 117) { /* message */ msg = pair->value; } if (pair->key == 124) { /* Message type */ msgtype = atoi(pair->value); } if (pair->key == 114) { /* message error not sure what all the pair values mean */ /* but -1 means no session in room */ chaterr = atoi(pair->value); } } if (!room) { if (pkt->service == YAHOO_SERVICE_CHATLOGOUT) { /* yahoo originated chat logout */ YAHOO_CALLBACK(ext_yahoo_chat_yahoologout) (yid->yd-> client_id, id); return; } if (pkt->service == YAHOO_SERVICE_COMMENT && chaterr) { YAHOO_CALLBACK(ext_yahoo_chat_yahooerror) (yid->yd-> client_id, id); return; } WARNING(("We didn't get a room name, ignoring packet")); return; } switch (pkt->service) { case YAHOO_SERVICE_CHATJOIN: if (y_list_length(members) != membercount) { WARNING(("Count of members doesn't match No. of members we got")); } if (firstjoin && members) { YAHOO_CALLBACK(ext_yahoo_chat_join) (yid->yd->client_id, id, room, topic, members, yid->fd); } else if (who) { if (y_list_length(members) != 1) { WARNING(("Got more than 1 member on a normal join")); } /* this should only ever have one, but just in case */ while (members) { YList *n = members->next; currentmember = members->data; YAHOO_CALLBACK(ext_yahoo_chat_userjoin) (yid-> yd->client_id, id, room, currentmember); y_list_free_1(members); members = n; } } break; case YAHOO_SERVICE_CHATEXIT: if (who) { YAHOO_CALLBACK(ext_yahoo_chat_userleave) (yid->yd-> client_id, id, room, who); } break; case YAHOO_SERVICE_COMMENT: if (who) { YAHOO_CALLBACK(ext_yahoo_chat_message) (yid->yd-> client_id, id, who, room, msg, msgtype, utf8); } break; } } static void yahoo_process_message(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; YList *l; YList *messages = NULL; struct m { int i_31; int i_32; char *to; char *from; long tm; char *msg; int utf8; char *gunk; } *message = y_new0(struct m, 1); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 1 || pair->key == 4) { if (!message->from) message->from = pair->value; } else if (pair->key == 5) message->to = pair->value; else if (pair->key == 15) message->tm = strtol(pair->value, NULL, 10); else if (pair->key == 97) message->utf8 = atoi(pair->value); /* This comes when the official client sends us a message */ else if (pair->key == 429) message->gunk = pair->value; /* user message *//* sys message */ else if (pair->key == 14 || pair->key == 16) message->msg = pair->value; else if (pair->key == 31) { if (message->i_31) { messages = y_list_append(messages, message); message = y_new0(struct m, 1); } message->i_31 = atoi(pair->value); } else if (pair->key == 32) message->i_32 = atoi(pair->value); else LOG(("yahoo_process_message: status: %d, key: %d, value: %s", pkt->status, pair->key, pair->value)); } messages = y_list_append(messages, message); for (l = messages; l; l = l->next) { message = l->data; if (pkt->service == YAHOO_SERVICE_SYSMESSAGE) { YAHOO_CALLBACK(ext_yahoo_system_message) (yd->client_id, message->to, message->from, message->msg); } else if (pkt->status <= 2 || pkt->status == 5) { /* Confirm message receipt if we got the gunk */ if(message->gunk) { struct yahoo_packet *outpkt; outpkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE_CONFIRM, YPACKET_STATUS_DEFAULT, 0); yahoo_packet_hash(outpkt, 1, yd->user); yahoo_packet_hash(outpkt, 5, message->from); yahoo_packet_hash(outpkt, 302, "430"); yahoo_packet_hash(outpkt, 430, message->gunk); yahoo_packet_hash(outpkt, 303, "430"); yahoo_packet_hash(outpkt, 450, "0"); yahoo_send_packet(yid, outpkt, 0); yahoo_packet_free(outpkt); } if (!strcmp(message->msg, "")) YAHOO_CALLBACK(ext_yahoo_got_buzz) (yd->client_id, message->to, message->from, message->tm); else YAHOO_CALLBACK(ext_yahoo_got_im) (yd->client_id, message->to, message->from, message->msg, message->tm, pkt->status, message->utf8); } else if (pkt->status == 0xffffffff) { YAHOO_CALLBACK(ext_yahoo_error) (yd->client_id, message->msg, 0, E_SYSTEM); } FREE(message); } y_list_free(messages); } /* * Here's what multi-level packets look like. Data in brackets is the value. * * 3 level: * ======= * * 302 (318) - Beginning level 1 * 300 (318) - Begin level 2 * 302 (319) - End level 2 header * 300 (319) - Begin level 3 * 301 (319) - End level 3 * 303 (319) - End level 2 * 303 (318) - End level 1 * * 2 level: * ======= * * 302 (315) - Beginning level 1 * 300 (315) - Begin level 2 * 301 (315) - End level 2 * 303 (315) - End level 1 * */ static void yahoo_process_status(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { YList *l; struct yahoo_data *yd = yid->yd; struct yahoo_process_status_entry *u; YList *users = 0; if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) { YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id, YAHOO_LOGIN_DUPL, NULL); return; } /* * Status updates may be spread accross multiple packets and not * even on buddy boundaries, so keeping some state is important. * So, continue where we left off, and only add a user entry to * the list once it's complete (301-315 End buddy). */ u = yd->half_user; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 300: /* Begin buddy */ if (!strcmp(pair->value, "315") && !u) { u = yd->half_user = y_new0(struct yahoo_process_status_entry, 1); } break; case 301: /* End buddy */ if (!strcmp(pair->value, "315") && u) { users = y_list_prepend(users, u); u = yd->half_user = NULL; } break; case 0: /* we won't actually do anything with this */ NOTICE(("key %d:%s", pair->key, pair->value)); break; case 1: /* we don't get the full buddy list here. */ if (!yd->logged_in) { yd->logged_in = 1; if (yd->current_status < 0) yd->current_status = yd->initial_status; YAHOO_CALLBACK(ext_yahoo_login_response) (yd-> client_id, YAHOO_LOGIN_OK, NULL); } break; case 8: /* how many online buddies we have */ NOTICE(("key %d:%s", pair->key, pair->value)); break; case 7: /* the current buddy */ if (!u) { /* This will only happen in case of a single level message */ u = y_new0(struct yahoo_process_status_entry, 1); users = y_list_prepend(users, u); } u->name = pair->value; break; case 10: /* state */ u->state = strtol(pair->value, NULL, 10); break; case 19: /* custom status message */ u->msg = pair->value; break; case 47: /* is it an away message or not. Not applicable for YMSG16 anymore */ u->away = atoi(pair->value); break; case 137: /* seconds idle */ u->idle = atoi(pair->value); break; case 11: /* this is the buddy's session id */ u->buddy_session = atoi(pair->value); break; case 17: /* in chat? */ u->f17 = atoi(pair->value); break; case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */ u->flags = atoi(pair->value); break; case 60: /* SMS -> 1 MOBILE USER */ /* sometimes going offline makes this 2, but invisible never sends it */ u->mobile = atoi(pair->value); break; case 138: u->f138 = atoi(pair->value); break; case 184: u->f184 = pair->value; break; case 192: u->f192 = atoi(pair->value); break; case 10001: u->f10001 = atoi(pair->value); break; case 10002: u->f10002 = atoi(pair->value); break; case 198: u->f198 = atoi(pair->value); break; case 197: u->f197 = pair->value; break; case 205: u->f205 = pair->value; break; case 213: u->f213 = atoi(pair->value); break; case 16: /* Custom error message */ YAHOO_CALLBACK(ext_yahoo_error) (yd->client_id, pair->value, 0, E_CUSTOM); break; default: WARNING(("unknown status key %d:%s", pair->key, pair->value)); break; } } while (users) { YList *t = users; struct yahoo_process_status_entry *u = users->data; if (u->name != NULL) { if (pkt->service == YAHOO_SERVICE_LOGOFF /*|| u->flags == 0 No flags for YMSG16 */ ) { YAHOO_CALLBACK(ext_yahoo_status_changed) (yd-> client_id, u->name, YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0); } else { /* Key 47 always seems to be 1 for YMSG16 */ if (!u->state) u->away = 0; else u->away = 1; YAHOO_CALLBACK(ext_yahoo_status_changed) (yd-> client_id, u->name, u->state, u->msg, u->away, u->idle, u->mobile); } } users = y_list_remove_link(users, users); y_list_free_1(t); FREE(u); } } static void yahoo_process_buddy_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; YList *l; int last_packet = 0; char *cur_group = NULL; struct yahoo_buddy *newbud = NULL; /* we could be getting multiple packets here */ for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 300: case 301: case 302: break; /* Separators. Our logic does not need them */ case 303: if (318 == atoi(pair->value)) last_packet = 1; break; case 65: cur_group = strdup(pair->value); break; case 7: newbud = y_new0(struct yahoo_buddy, 1); newbud->id = strdup(pair->value); if (cur_group) newbud->group = strdup(cur_group); else if (yd->buddies) { struct yahoo_buddy *lastbud = (struct yahoo_buddy *)y_list_nth(yd-> buddies, y_list_length(yd->buddies) - 1)->data; newbud->group = strdup(lastbud->group); } else newbud->group = strdup("Buddies"); yd->buddies = y_list_append(yd->buddies, newbud); break; } } /* we could be getting multiple packets here */ if (pkt->hash && !last_packet) return; /* Logged in */ if (!yd->logged_in) { yd->logged_in = 1; if (yd->current_status < 0) yd->current_status = yd->initial_status; YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id, YAHOO_LOGIN_OK, NULL); yahoo_set_away(yd->client_id, yd->initial_status, NULL, (yd->initial_status == YAHOO_STATUS_AVAILABLE) ? 0 : 1); yahoo_get_yab(yd->client_id); } YAHOO_CALLBACK(ext_yahoo_got_buddies) (yd->client_id, yd->buddies); } static void yahoo_process_list(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; YList *l; /* we could be getting multiple packets here */ for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 89: /* identities */ { char **identities = y_strsplit(pair->value, ",", -1); int i; for (i = 0; identities[i]; i++) yd->identities = y_list_append(yd->identities, strdup(identities[i])); y_strfreev(identities); } YAHOO_CALLBACK(ext_yahoo_got_identities) (yd->client_id, yd->identities); break; case 59: /* cookies */ if (pair->value[0] == 'Y') { FREE(yd->cookie_y); FREE(yd->login_cookie); yd->cookie_y = getcookie(pair->value); yd->login_cookie = getlcookie(yd->cookie_y); } else if (pair->value[0] == 'T') { FREE(yd->cookie_t); yd->cookie_t = getcookie(pair->value); } else if (pair->value[0] == 'C') { FREE(yd->cookie_c); yd->cookie_c = getcookie(pair->value); } break; case 3: /* my id */ case 90: /* 1 */ case 100: /* 0 */ case 101: /* NULL */ case 102: /* NULL */ case 93: /* 86400/1440 */ break; } } if (yd->cookie_y && yd->cookie_t) /* We don't get cookie_c anymore */ YAHOO_CALLBACK(ext_yahoo_got_cookies) (yd->client_id); } static void yahoo_process_verify(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; if (pkt->status != 0x01) { DEBUG_MSG(("expected status: 0x01, got: %d", pkt->status)); YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id, YAHOO_LOGIN_LOCK, ""); return; } pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } static void yahoo_process_picture_checksum(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *from; char *to; int checksum = 0; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 1: case 4: from = pair->value; case 5: to = pair->value; break; case 212: break; case 192: checksum = atoi(pair->value); break; } } YAHOO_CALLBACK(ext_yahoo_got_buddyicon_checksum) (yd->client_id, to, from, checksum); } static void yahoo_process_picture(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *url; char *from; char *to; int status = 0; int checksum = 0; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 1: case 4: /* sender */ from = pair->value; break; case 5: /* we */ to = pair->value; break; case 13: /* request / sending */ status = atoi(pair->value); break; case 20: /* url */ url = pair->value; break; case 192: /*checksum */ checksum = atoi(pair->value); break; } } switch (status) { case 1: /* this is a request, ignore for now */ YAHOO_CALLBACK(ext_yahoo_got_buddyicon_request) (yd->client_id, to, from); break; case 2: /* this is cool - we get a picture :) */ YAHOO_CALLBACK(ext_yahoo_got_buddyicon) (yd->client_id, to, from, url, checksum); break; } } static void yahoo_process_picture_upload(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; YList *l; char *url; if (pkt->status != 1) return; /* something went wrong */ for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 5: /* we */ break; case 20: /* url */ url = pair->value; break; case 27: /* local filename */ break; case 38: /* time */ break; } } YAHOO_CALLBACK(ext_yahoo_buddyicon_uploaded) (yd->client_id, url); } void yahoo_login(int id, int initial) { struct yahoo_data *yd = find_conn_by_id(id); struct connect_callback_data *ccd; struct yahoo_server_settings *yss; int tag; char *host; struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1); yid->yd = yd; yid->type = YAHOO_CONNECTION_PAGER; inputs = y_list_prepend(inputs, yid); yd->initial_status = initial; yss = yd->server_settings; ccd = y_new0(struct connect_callback_data, 1); ccd->yd = yd; host = yss->pager_host; if (!host) host = yss->pager_host_list[0]; tag = YAHOO_CALLBACK(ext_yahoo_connect_async) (yd->client_id, host, yss->pager_port, yahoo_connected, ccd, 0); /* * if tag <= 0, then callback has already been called * so ccd will have been freed */ if (tag > 0) ccd->tag = tag; else if (tag < 0) YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id, YAHOO_LOGIN_SOCK, NULL); } static void yahoo_auth_https(struct yahoo_data *yd) { char url[256]; char *user_encoded, *pass_encoded, *seed_encoded; struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1); yid->yd = yd; yid->type = YAHOO_CONNECTION_AUTH; inputs = y_list_prepend(inputs, yid); user_encoded = yahoo_urlencode(yid->yd->user); pass_encoded = yahoo_urlencode(yid->yd->password); seed_encoded = yahoo_urlencode(yid->yd->seed); snprintf(url, sizeof(url), "https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=" "&login=%s&passwd=%s&chal=%s", user_encoded, pass_encoded, seed_encoded); yahoo_http_get(yid->yd->client_id, url, NULL, 1, 0, _yahoo_http_connected, yid); FREE(user_encoded); FREE(pass_encoded); FREE(seed_encoded); } static void yahoo_process_auth(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { char *seed = NULL; char *sn = NULL; YList *l = pkt->hash; int m = 0; struct yahoo_data *yd = yid->yd; while (l) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 94: seed = pair->value; break; case 1: sn = pair->value; break; case 13: m = atoi(pair->value); break; } l = l->next; } if (!seed) return; yd->seed = strdup(seed); if (m==2) yahoo_auth_https(yd); else { /* call error */ WARNING(("unknown auth type %d", m)); YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); } } static void yahoo_send_auth(struct yahoo_data *yd) { struct yahoo_packet *packet; unsigned char crypt_hash[25]; md5_byte_t result[16]; md5_state_t ctx; struct yahoo_input_data *yid = find_input_by_id_and_type(yd->client_id, YAHOO_CONNECTION_PAGER); /* HTTPS */ md5_init(&ctx); md5_append(&ctx, (md5_byte_t *)yd->crumb, strlen(yd->crumb)); md5_append(&ctx, (md5_byte_t *)yd->seed, strlen(yd->seed)); md5_finish(&ctx, result); to_y64(crypt_hash, result, 16); packet = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, yd->initial_status, yd->session_id); yahoo_packet_hash(packet, 1, yd->user); yahoo_packet_hash(packet, 0, yd->user); yahoo_packet_hash(packet, 277, yd->cookie_y); yahoo_packet_hash(packet, 278, yd->cookie_t); yahoo_packet_hash(packet, 307, (char *)crypt_hash); yahoo_packet_hash(packet, 244, "4194239"); /* Rekkanoryo says this is the build number */ yahoo_packet_hash(packet, 2, yd->user); yahoo_packet_hash(packet, 2, "1"); yahoo_packet_hash(packet, 59, yd->cookie_b); yahoo_packet_hash(packet, 98, "us"); /* TODO Put country code */ yahoo_packet_hash(packet, 135, "9.0.0.2152"); yahoo_send_packet(yid, packet, 0); yahoo_packet_free(packet); } static void yahoo_process_auth_resp(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *login_id; char *handle; char *url = NULL; int login_status = -1; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 0) login_id = pair->value; else if (pair->key == 1) handle = pair->value; else if (pair->key == 20) url = pair->value; else if (pair->key == 66) login_status = atoi(pair->value); } if (pkt->status == YPACKET_STATUS_DISCONNECTED) { YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id, login_status, url); /* yahoo_logoff(yd->client_id); */ } } static void yahoo_process_mail(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *who = NULL; char *email = NULL; char *subj = NULL; int count = 0; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 9) count = strtol(pair->value, NULL, 10); else if (pair->key == 43) who = pair->value; else if (pair->key == 42) email = pair->value; else if (pair->key == 18) subj = pair->value; else LOG(("key: %d => value: %s", pair->key, pair->value)); } if (who && email && subj) { char from[1024]; snprintf(from, sizeof(from), "%s (%s)", who, email); YAHOO_CALLBACK(ext_yahoo_mail_notify) (yd->client_id, from, subj, count); } else if (count > 0) YAHOO_CALLBACK(ext_yahoo_mail_notify) (yd->client_id, NULL, NULL, count); } static void yahoo_process_new_contact(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *me = NULL; char *who = NULL; char *msg = NULL; int online = -1; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 4) who = pair->value; else if (pair->key == 5) me = pair->value; else if (pair->key == 14) msg = pair->value; else if (pair->key == 13) online = strtol(pair->value, NULL, 10); } if (pkt->status == 3) { // auth request YAHOO_CALLBACK(ext_yahoo_auth_request) (yd->client_id, who, msg); } else if (pkt->status == 1) { /* if (who && online == 1) YAHOO_CALLBACK(ext_yahoo_contact_added) (yd->client_id, me, who, msg); else */if (online == 2) YAHOO_CALLBACK(ext_yahoo_rejected) (yd->client_id, who, msg); } } /* UNUSED? */ static void yahoo_process_contact(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *id = NULL; char *who = NULL; char *msg = NULL; char *name = NULL; long tm = 0L; int state = YAHOO_STATUS_AVAILABLE; int online = 0; int away = 0; int idle = 0; int mobile = 0; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 1) id = pair->value; else if (pair->key == 3) who = pair->value; else if (pair->key == 14) msg = pair->value; else if (pair->key == 7) name = pair->value; else if (pair->key == 10) state = strtol(pair->value, NULL, 10); else if (pair->key == 15) tm = strtol(pair->value, NULL, 10); else if (pair->key == 13) online = strtol(pair->value, NULL, 10); else if (pair->key == 47) away = strtol(pair->value, NULL, 10); else if (pair->key == 137) idle = strtol(pair->value, NULL, 10); else if (pair->key == 60) mobile = strtol(pair->value, NULL, 10); } if (id) YAHOO_CALLBACK(ext_yahoo_contact_added) (yd->client_id, id, who, msg); else if (name) YAHOO_CALLBACK(ext_yahoo_status_changed) (yd->client_id, name, state, msg, away, idle, mobile); else if (pkt->status == 0x07) YAHOO_CALLBACK(ext_yahoo_rejected) (yd->client_id, who, msg); } static void yahoo_process_buddyadd(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *who = NULL; char *where = NULL; int status = 0; char *me = NULL; struct yahoo_buddy *bud = NULL; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 1) me = pair->value; if (pair->key == 7) who = pair->value; if (pair->key == 65) where = pair->value; if (pair->key == 66) status = strtol(pair->value, NULL, 10); } if (!who) return; if (!where) where = "Unknown"; bud = y_new0(struct yahoo_buddy, 1); bud->id = strdup(who); bud->group = strdup(where); bud->real_name = NULL; yd->buddies = y_list_append(yd->buddies, bud); /* A non-zero status (i've seen 2) seems to mean the buddy is already * added and is online */ if (status) { LOG(("Setting online see packet for info")); yahoo_dump_unhandled(pkt); YAHOO_CALLBACK(ext_yahoo_status_changed) (yd->client_id, who, YAHOO_STATUS_AVAILABLE, NULL, 0, 0, 0); } } static void yahoo_process_buddydel(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { struct yahoo_data *yd = yid->yd; char *who = NULL; char *where = NULL; int unk_66 = 0; char *me = NULL; struct yahoo_buddy *bud; YList *buddy; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 1) me = pair->value; else if (pair->key == 7) who = pair->value; else if (pair->key == 65) where = pair->value; else if (pair->key == 66) unk_66 = strtol(pair->value, NULL, 10); else DEBUG_MSG(("unknown key: %d = %s", pair->key, pair->value)); } if (!who || !where) return; bud = y_new0(struct yahoo_buddy, 1); bud->id = strdup(who); bud->group = strdup(where); buddy = y_list_find_custom(yd->buddies, bud, is_same_bud); FREE(bud->id); FREE(bud->group); FREE(bud); if (buddy) { bud = buddy->data; yd->buddies = y_list_remove_link(yd->buddies, buddy); y_list_free_1(buddy); FREE(bud->id); FREE(bud->group); FREE(bud->real_name); FREE(bud); bud = NULL; } } static void yahoo_process_ignore(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { char *who = NULL; int status = 0; char *me = NULL; int un_ignore = 0; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 0) who = pair->value; if (pair->key == 1) me = pair->value; if (pair->key == 13) /* 1 == ignore, 2 == unignore */ un_ignore = strtol(pair->value, NULL, 10); if (pair->key == 66) status = strtol(pair->value, NULL, 10); } /* * status * 0 - ok * 2 - already in ignore list, could not add * 3 - not in ignore list, could not delete * 12 - is a buddy, could not add */ /* if(status) YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, who, 0, status); */ } static void yahoo_process_voicechat(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { char *who = NULL; char *me = NULL; char *room = NULL; char *voice_room = NULL; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 4) who = pair->value; if (pair->key == 5) me = pair->value; if (pair->key == 13) voice_room = pair->value; if (pair->key == 57) room = pair->value; } NOTICE(("got voice chat invite from %s in %s to identity %s", who, room, me)); /* * send: s:0 1:me 5:who 57:room 13:1 * ???? s:4 5:who 10:99 19:-1615114531 * gotr: s:4 5:who 10:99 19:-1615114615 * ???? s:1 5:me 4:who 57:room 13:3room * got: s:1 5:me 4:who 57:room 13:1room * rej: s:0 1:me 5:who 57:room 13:3 * rejr: s:4 5:who 10:99 19:-1617114599 */ } static void yahoo_process_ping(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { char *errormsg = NULL; YList *l; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 16) errormsg = pair->value; } NOTICE(("got ping packet")); YAHOO_CALLBACK(ext_yahoo_got_ping) (yid->yd->client_id, errormsg); } static void yahoo_process_buddy_change_group(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { YList *l; char *me = NULL; char *who = NULL; char *old_group = NULL; char *new_group = NULL; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 1) me = pair->value; if (pair->key == 7) who = pair->value; if (pair->key == 224) old_group = pair->value; if (pair->key == 264) new_group = pair->value; } YAHOO_CALLBACK(ext_yahoo_got_buddy_change_group) (yid->yd->client_id, me, who, old_group, new_group); } static void _yahoo_webcam_get_server_connected(void *fd, int error, void *d) { struct yahoo_input_data *yid = d; char *who = yid->wcm->user; char *data = NULL; char *packet = NULL; unsigned char magic_nr[] = { 0, 1, 0 }; unsigned char header_len = 8; unsigned int len = 0; unsigned int pos = 0; if (error || !fd) { FREE(who); FREE(yid); return; } yid->fd = fd; inputs = y_list_prepend(inputs, yid); /* send initial packet */ if (who) data = strdup(""); else data = strdup(""); yahoo_add_to_send_queue(yid, data, strlen(data)); FREE(data); /* send data */ if (who) { data = strdup("g="); data = y_string_append(data, who); data = y_string_append(data, "\r\n"); } else { data = strdup("f=1\r\n"); } len = strlen(data); packet = y_new0(char, header_len + len); packet[pos++] = header_len; memcpy(packet + pos, magic_nr, sizeof(magic_nr)); pos += sizeof(magic_nr); pos += yahoo_put32(packet + pos, len); memcpy(packet + pos, data, len); pos += len; yahoo_add_to_send_queue(yid, packet, pos); FREE(packet); FREE(data); yid->read_tag = YAHOO_CALLBACK(ext_yahoo_add_handler) (yid->yd->client_id, fd, YAHOO_INPUT_READ, yid); } static void yahoo_webcam_get_server(struct yahoo_input_data *y, char *who, char *key) { struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1); struct yahoo_server_settings *yss = y->yd->server_settings; yid->type = YAHOO_CONNECTION_WEBCAM_MASTER; yid->yd = y->yd; yid->wcm = y_new0(struct yahoo_webcam, 1); yid->wcm->user = who ? strdup(who) : NULL; yid->wcm->direction = who ? YAHOO_WEBCAM_DOWNLOAD : YAHOO_WEBCAM_UPLOAD; yid->wcm->key = strdup(key); YAHOO_CALLBACK(ext_yahoo_connect_async) (yid->yd->client_id, yss->webcam_host, yss->webcam_port, _yahoo_webcam_get_server_connected, yid, 0); } static YList *webcam_queue = NULL; static void yahoo_process_webcam_key(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { char *me = NULL; char *key = NULL; char *who = NULL; YList *l; yahoo_dump_unhandled(pkt); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 5) me = pair->value; if (pair->key == 61) key = pair->value; } l = webcam_queue; if (!l) return; who = l->data; webcam_queue = y_list_remove_link(webcam_queue, webcam_queue); y_list_free_1(l); yahoo_webcam_get_server(yid, who, key); FREE(who); } static void yahoo_packet_process(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { DEBUG_MSG(("yahoo_packet_process: 0x%02x", pkt->service)); switch (pkt->service) { case YAHOO_SERVICE_USERSTAT: case YAHOO_SERVICE_LOGON: case YAHOO_SERVICE_LOGOFF: case YAHOO_SERVICE_ISAWAY: case YAHOO_SERVICE_ISBACK: case YAHOO_SERVICE_GAMELOGON: case YAHOO_SERVICE_GAMELOGOFF: case YAHOO_SERVICE_IDACT: case YAHOO_SERVICE_IDDEACT: case YAHOO_SERVICE_Y6_STATUS_UPDATE: case YAHOO_SERVICE_Y8_STATUS: yahoo_process_status(yid, pkt); break; case YAHOO_SERVICE_NOTIFY: yahoo_process_notify(yid, pkt); break; case YAHOO_SERVICE_MESSAGE: case YAHOO_SERVICE_GAMEMSG: case YAHOO_SERVICE_SYSMESSAGE: yahoo_process_message(yid, pkt); break; case YAHOO_SERVICE_NEWMAIL: yahoo_process_mail(yid, pkt); break; case YAHOO_SERVICE_Y7_AUTHORIZATION: yahoo_process_new_contact(yid, pkt); break; case YAHOO_SERVICE_NEWCONTACT: yahoo_process_contact(yid, pkt); break; case YAHOO_SERVICE_LIST: yahoo_process_list(yid, pkt); break; case YAHOO_SERVICE_VERIFY: yahoo_process_verify(yid, pkt); break; case YAHOO_SERVICE_AUTH: yahoo_process_auth(yid, pkt); break; case YAHOO_SERVICE_AUTHRESP: yahoo_process_auth_resp(yid, pkt); break; case YAHOO_SERVICE_CONFINVITE: case YAHOO_SERVICE_CONFADDINVITE: case YAHOO_SERVICE_CONFDECLINE: case YAHOO_SERVICE_CONFLOGON: case YAHOO_SERVICE_CONFLOGOFF: case YAHOO_SERVICE_CONFMSG: yahoo_process_conference(yid, pkt); break; case YAHOO_SERVICE_CHATONLINE: case YAHOO_SERVICE_CHATGOTO: case YAHOO_SERVICE_CHATJOIN: case YAHOO_SERVICE_CHATLEAVE: case YAHOO_SERVICE_CHATEXIT: case YAHOO_SERVICE_CHATLOGOUT: case YAHOO_SERVICE_CHATPING: case YAHOO_SERVICE_COMMENT: yahoo_process_chat(yid, pkt); break; case YAHOO_SERVICE_P2PFILEXFER: case YAHOO_SERVICE_Y7_FILETRANSFER: yahoo_process_filetransfer(yid, pkt); break; case YAHOO_SERVICE_Y7_FILETRANSFERINFO: yahoo_process_filetransferinfo(yid, pkt); break; case YAHOO_SERVICE_Y7_FILETRANSFERACCEPT: yahoo_process_filetransferaccept(yid, pkt); break; case YAHOO_SERVICE_ADDBUDDY: yahoo_process_buddyadd(yid, pkt); break; case YAHOO_SERVICE_REMBUDDY: yahoo_process_buddydel(yid, pkt); break; case YAHOO_SERVICE_IGNORECONTACT: yahoo_process_ignore(yid, pkt); break; case YAHOO_SERVICE_VOICECHAT: yahoo_process_voicechat(yid, pkt); break; case YAHOO_SERVICE_WEBCAM: yahoo_process_webcam_key(yid, pkt); break; case YAHOO_SERVICE_PING: yahoo_process_ping(yid, pkt); break; case YAHOO_SERVICE_Y7_CHANGE_GROUP: yahoo_process_buddy_change_group(yid, pkt); break; case YAHOO_SERVICE_IDLE: case YAHOO_SERVICE_MAILSTAT: case YAHOO_SERVICE_CHATINVITE: case YAHOO_SERVICE_CALENDAR: case YAHOO_SERVICE_NEWPERSONALMAIL: case YAHOO_SERVICE_ADDIDENT: case YAHOO_SERVICE_ADDIGNORE: case YAHOO_SERVICE_GOTGROUPRENAME: case YAHOO_SERVICE_GROUPRENAME: case YAHOO_SERVICE_PASSTHROUGH2: case YAHOO_SERVICE_CHATLOGON: case YAHOO_SERVICE_CHATLOGOFF: case YAHOO_SERVICE_CHATMSG: case YAHOO_SERVICE_REJECTCONTACT: case YAHOO_SERVICE_PEERTOPEER: WARNING(("unhandled service 0x%02x", pkt->service)); yahoo_dump_unhandled(pkt); break; case YAHOO_SERVICE_PICTURE: yahoo_process_picture(yid, pkt); break; case YAHOO_SERVICE_PICTURE_CHECKSUM: yahoo_process_picture_checksum(yid, pkt); break; case YAHOO_SERVICE_PICTURE_UPLOAD: yahoo_process_picture_upload(yid, pkt); break; case YAHOO_SERVICE_Y8_LIST: /* Buddy List */ yahoo_process_buddy_list(yid, pkt); break; default: WARNING(("unknown service 0x%02x", pkt->service)); yahoo_dump_unhandled(pkt); break; } } static struct yahoo_packet *yahoo_getdata(struct yahoo_input_data *yid) { struct yahoo_packet *pkt; struct yahoo_data *yd = yid->yd; int pos = 0; int pktlen; if (!yd) return NULL; DEBUG_MSG(("rxlen is %d", yid->rxlen)); if (yid->rxlen < YAHOO_PACKET_HDRLEN) { DEBUG_MSG(("len < YAHOO_PACKET_HDRLEN")); return NULL; } pos += 4; /* YMSG */ pos += 2; pos += 2; pktlen = yahoo_get16(yid->rxqueue + pos); pos += 2; DEBUG_MSG(("%d bytes to read, rxlen is %d", pktlen, yid->rxlen)); if (yid->rxlen < (YAHOO_PACKET_HDRLEN + pktlen)) { DEBUG_MSG(("len < YAHOO_PACKET_HDRLEN + pktlen")); return NULL; } LOG(("reading packet")); yahoo_packet_dump(yid->rxqueue, YAHOO_PACKET_HDRLEN + pktlen); pkt = yahoo_packet_new(0, 0, 0); pkt->service = yahoo_get16(yid->rxqueue + pos); pos += 2; pkt->status = yahoo_get32(yid->rxqueue + pos); pos += 4; DEBUG_MSG(("Yahoo Service: 0x%02x Status: %d", pkt->service, pkt->status)); pkt->id = yahoo_get32(yid->rxqueue + pos); pos += 4; yd->session_id = pkt->id; yahoo_packet_read(pkt, yid->rxqueue + pos, pktlen); yid->rxlen -= YAHOO_PACKET_HDRLEN + pktlen; DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); if (yid->rxlen > 0) { unsigned char *tmp = y_memdup(yid->rxqueue + YAHOO_PACKET_HDRLEN + pktlen, yid->rxlen); FREE(yid->rxqueue); yid->rxqueue = tmp; DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); } else { DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue)); FREE(yid->rxqueue); } return pkt; } static struct yab *yahoo_yab_read(unsigned char *d, int len) { char *st, *en; char *data = (char *)d; struct yab *yab = NULL; data[len] = '\0'; DEBUG_MSG(("Got yab: %s", data)); st = en = strstr(data, "e0=\""); if (st) { yab = y_new0(struct yab, 1); st += strlen("e0=\""); en = strchr(st, '"'); *en++ = '\0'; yab->email = yahoo_xmldecode(st); } if (!en) return NULL; st = strstr(en, "id=\""); if (st) { st += strlen("id=\""); en = strchr(st, '"'); *en++ = '\0'; yab->yid = atoi(yahoo_xmldecode(st)); } st = strstr(en, "fn=\""); if (st) { st += strlen("fn=\""); en = strchr(st, '"'); *en++ = '\0'; yab->fname = yahoo_xmldecode(st); } st = strstr(en, "ln=\""); if (st) { st += strlen("ln=\""); en = strchr(st, '"'); *en++ = '\0'; yab->lname = yahoo_xmldecode(st); } st = strstr(en, "nn=\""); if (st) { st += strlen("nn=\""); en = strchr(st, '"'); *en++ = '\0'; yab->nname = yahoo_xmldecode(st); } st = strstr(en, "yi=\""); if (st) { st += strlen("yi=\""); en = strchr(st, '"'); *en++ = '\0'; yab->id = yahoo_xmldecode(st); } st = strstr(en, "hphone=\""); if (st) { st += strlen("hphone=\""); en = strchr(st, '"'); *en++ = '\0'; yab->hphone = yahoo_xmldecode(st); } st = strstr(en, "wphone=\""); if (st) { st += strlen("wphone=\""); en = strchr(st, '"'); *en++ = '\0'; yab->wphone = yahoo_xmldecode(st); } st = strstr(en, "mphone=\""); if (st) { st += strlen("mphone=\""); en = strchr(st, '"'); *en++ = '\0'; yab->mphone = yahoo_xmldecode(st); } st = strstr(en, "dbid=\""); if (st) { st += strlen("dbid=\""); en = strchr(st, '"'); *en++ = '\0'; yab->dbid = atoi(st); } return yab; } static struct yab *yahoo_getyab(struct yahoo_input_data *yid) { struct yab *yab = NULL; int pos = 0, end = 0; struct yahoo_data *yd = yid->yd; if (!yd) return NULL; do { DEBUG_MSG(("rxlen is %d", yid->rxlen)); if (yid->rxlen <= strlen("rxlen - strlen("rxqueue + pos, "= yid->rxlen - 1) return NULL; end = pos + 2; /* end with > */ while (end < yid->rxlen - strlen(">") && memcmp(yid->rxqueue + end, ">", strlen(">"))) end++; if (end >= yid->rxlen - 1) return NULL; yab = yahoo_yab_read(yid->rxqueue + pos, end + 2 - pos); yid->rxlen -= end + 1; DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); if (yid->rxlen > 0) { unsigned char *tmp = y_memdup(yid->rxqueue + end + 1, yid->rxlen); FREE(yid->rxqueue); yid->rxqueue = tmp; DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); } else { DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue)); FREE(yid->rxqueue); } } while (!yab && end < yid->rxlen - 1); return yab; } static char *yahoo_getwebcam_master(struct yahoo_input_data *yid) { unsigned int pos = 0; unsigned int len = 0; unsigned int status = 0; char *server = NULL; struct yahoo_data *yd = yid->yd; if (!yid || !yd) return NULL; DEBUG_MSG(("rxlen is %d", yid->rxlen)); len = yid->rxqueue[pos++]; if (yid->rxlen < len) return NULL; /* extract status (0 = ok, 6 = webcam not online) */ status = yid->rxqueue[pos++]; if (status == 0) { pos += 2; /* skip next 2 bytes */ server = y_memdup(yid->rxqueue + pos, 16); pos += 16; } else if (status == 6) { YAHOO_CALLBACK(ext_yahoo_webcam_closed) (yd->client_id, yid->wcm->user, 4); } /* skip rest of the data */ yid->rxlen -= len; DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); if (yid->rxlen > 0) { unsigned char *tmp = y_memdup(yid->rxqueue + pos, yid->rxlen); FREE(yid->rxqueue); yid->rxqueue = tmp; DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); } else { DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue)); FREE(yid->rxqueue); } return server; } static int yahoo_get_webcam_data(struct yahoo_input_data *yid) { unsigned char reason = 0; unsigned int pos = 0; unsigned int begin = 0; unsigned int end = 0; unsigned int closed = 0; unsigned char header_len = 0; char *who; int connect = 0; struct yahoo_data *yd = yid->yd; if (!yd) return -1; if (!yid->wcm || !yid->wcd || !yid->rxlen) return -1; DEBUG_MSG(("rxlen is %d", yid->rxlen)); /* if we are not reading part of image then read header */ if (!yid->wcd->to_read) { header_len = yid->rxqueue[pos++]; yid->wcd->packet_type = 0; if (yid->rxlen < header_len) return 0; if (header_len >= 8) { reason = yid->rxqueue[pos++]; /* next 2 bytes should always be 05 00 */ pos += 2; yid->wcd->data_size = yahoo_get32(yid->rxqueue + pos); pos += 4; yid->wcd->to_read = yid->wcd->data_size; } if (header_len >= 13) { yid->wcd->packet_type = yid->rxqueue[pos++]; yid->wcd->timestamp = yahoo_get32(yid->rxqueue + pos); pos += 4; } /* skip rest of header */ pos = header_len; } begin = pos; pos += yid->wcd->to_read; if (pos > yid->rxlen) pos = yid->rxlen; /* if it is not an image then make sure we have the whole packet */ if (yid->wcd->packet_type != 0x02) { if ((pos - begin) != yid->wcd->data_size) { yid->wcd->to_read = 0; return 0; } else { yahoo_packet_dump(yid->rxqueue + begin, pos - begin); } } DEBUG_MSG(("packet type %.2X, data length %d", yid->wcd->packet_type, yid->wcd->data_size)); /* find out what kind of packet we got */ switch (yid->wcd->packet_type) { case 0x00: /* user requests to view webcam (uploading) */ if (yid->wcd->data_size && yid->wcm->direction == YAHOO_WEBCAM_UPLOAD) { end = begin; while (end <= yid->rxlen && yid->rxqueue[end++] != 13) ; if (end > begin) { who = y_memdup(yid->rxqueue + begin, end - begin); who[end - begin - 1] = 0; YAHOO_CALLBACK(ext_yahoo_webcam_viewer) (yd-> client_id, who + 2, 2); FREE(who); } } if (yid->wcm->direction == YAHOO_WEBCAM_DOWNLOAD) { /* timestamp/status field */ /* 0 = declined viewing permission */ /* 1 = accepted viewing permission */ if (yid->wcd->timestamp == 0) { YAHOO_CALLBACK(ext_yahoo_webcam_closed) (yd-> client_id, yid->wcm->user, 3); } } break; case 0x01: /* status packets?? */ /* timestamp contains status info */ /* 00 00 00 01 = we have data?? */ break; case 0x02: /* image data */ YAHOO_CALLBACK(ext_yahoo_got_webcam_image) (yd->client_id, yid->wcm->user, yid->rxqueue + begin, yid->wcd->data_size, pos - begin, yid->wcd->timestamp); break; case 0x05: /* response packets when uploading */ if (!yid->wcd->data_size) { YAHOO_CALLBACK(ext_yahoo_webcam_data_request) (yd-> client_id, yid->wcd->timestamp); } break; case 0x07: /* connection is closing */ switch (reason) { case 0x01: /* user closed connection */ closed = 1; break; case 0x0F: /* user cancelled permission */ closed = 2; break; } YAHOO_CALLBACK(ext_yahoo_webcam_closed) (yd->client_id, yid->wcm->user, closed); break; case 0x0C: /* user connected */ case 0x0D: /* user disconnected */ if (yid->wcd->data_size) { who = y_memdup(yid->rxqueue + begin, pos - begin + 1); who[pos - begin] = 0; if (yid->wcd->packet_type == 0x0C) connect = 1; else connect = 0; YAHOO_CALLBACK(ext_yahoo_webcam_viewer) (yd->client_id, who, connect); FREE(who); } break; case 0x13: /* user data */ /* i=user_ip (ip of the user we are viewing) */ /* j=user_ext_ip (external ip of the user we */ /* are viewing) */ break; case 0x17: /* ?? */ break; } yid->wcd->to_read -= pos - begin; yid->rxlen -= pos; DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); if (yid->rxlen > 0) { unsigned char *tmp = y_memdup(yid->rxqueue + pos, yid->rxlen); FREE(yid->rxqueue); yid->rxqueue = tmp; DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); } else { DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue)); FREE(yid->rxqueue); } /* If we read a complete packet return success */ if (!yid->wcd->to_read) return 1; return 0; } int yahoo_write_ready(int id, void *fd, void *data) { struct yahoo_input_data *yid = data; int len; struct data_queue *tx; LOG(("write callback: id=%d fd=%p data=%p", id, fd, data)); if (!yid || !yid->txqueues) return -2; tx = yid->txqueues->data; LOG(("writing %d bytes", tx->len)); len = yahoo_send_data(fd, tx->queue, MIN(1024, tx->len)); if (len == -1 && errno == EAGAIN) return 1; if (len <= 0) { int e = errno; DEBUG_MSG(("len == %d (<= 0)", len)); while (yid->txqueues) { YList *l = yid->txqueues; tx = l->data; free(tx->queue); free(tx); yid->txqueues = y_list_remove_link(yid->txqueues, yid->txqueues); y_list_free_1(l); } LOG(("yahoo_write_ready(%d, %p) len < 0", id, fd)); YAHOO_CALLBACK(ext_yahoo_remove_handler) (id, yid->write_tag); yid->write_tag = 0; errno = e; return 0; } tx->len -= len; if (tx->len > 0) { unsigned char *tmp = y_memdup(tx->queue + len, tx->len); FREE(tx->queue); tx->queue = tmp; } else { YList *l = yid->txqueues; free(tx->queue); free(tx); yid->txqueues = y_list_remove_link(yid->txqueues, yid->txqueues); y_list_free_1(l); /* if(!yid->txqueues) LOG(("yahoo_write_ready(%d, %d) !yxqueues", id, fd)); */ if (!yid->txqueues) { LOG(("yahoo_write_ready(%d, %p) !txqueues", id, fd)); YAHOO_CALLBACK(ext_yahoo_remove_handler) (id, yid->write_tag); yid->write_tag = 0; } } return 1; } static void yahoo_process_pager_connection(struct yahoo_input_data *yid, int over) { struct yahoo_packet *pkt; struct yahoo_data *yd = yid->yd; int id = yd->client_id; if (over) return; while (find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER) && (pkt = yahoo_getdata(yid)) != NULL) { yahoo_packet_process(yid, pkt); yahoo_packet_free(pkt); } } static void yahoo_process_chatcat_connection(struct yahoo_input_data *yid, int over) { if (over) return; if (strstr((char *)yid->rxqueue + (yid->rxlen - 20), "")) { YAHOO_CALLBACK(ext_yahoo_chat_cat_xml) (yid->yd->client_id, (char *)yid->rxqueue); } } static void yahoo_process_yab_connection(struct yahoo_input_data *yid, int over) { struct yahoo_data *yd = yid->yd; struct yab *yab; YList *buds; int changed = 0; int id = yd->client_id; int yab_used = 0; LOG(("Got data for YAB")); if (over) return; while (find_input_by_id_and_type(id, YAHOO_CONNECTION_YAB) && (yab = yahoo_getyab(yid)) != NULL) { if (!yab->id) continue; changed = 1; yab_used = 0; for (buds = yd->buddies; buds; buds = buds->next) { struct yahoo_buddy *bud = buds->data; if (!strcmp(bud->id, yab->id)) { yab_used = 1; bud->yab_entry = yab; if (yab->nname) { bud->real_name = strdup(yab->nname); } else if (yab->fname && yab->lname) { bud->real_name = y_new0(char, strlen(yab->fname) + strlen(yab->lname) + 2); sprintf(bud->real_name, "%s %s", yab->fname, yab->lname); } else if (yab->fname) { bud->real_name = strdup(yab->fname); } break; /* for */ } } if (!yab_used) { FREE(yab->fname); FREE(yab->lname); FREE(yab->nname); FREE(yab->id); FREE(yab->email); FREE(yab->hphone); FREE(yab->wphone); FREE(yab->mphone); FREE(yab); } } if (changed) YAHOO_CALLBACK(ext_yahoo_got_buddies) (yd->client_id, yd->buddies); } static void yahoo_process_search_connection(struct yahoo_input_data *yid, int over) { struct yahoo_found_contact *yct = NULL; char *p = (char *)yid->rxqueue, *np, *cp; int k, n; int start = 0, found = 0, total = 0; YList *contacts = NULL; struct yahoo_input_data *pyid = find_input_by_id_and_type(yid->yd->client_id, YAHOO_CONNECTION_PAGER); if (!over || !pyid) return; if (p && (p = strstr(p, "\r\n\r\n"))) { p += 4; for (k = 0; (p = strchr(p, 4)) && (k < 4); k++) { p++; n = atoi(p); switch (k) { case 0: found = pyid->ys->lsearch_nfound = n; break; case 2: start = pyid->ys->lsearch_nstart = n; break; case 3: total = pyid->ys->lsearch_ntotal = n; break; } } if (p) p++; k = 0; while (p && *p) { cp = p; np = strchr(p, 4); if (!np) break; *np = 0; p = np + 1; switch (k++) { case 1: if (strlen(cp) > 2 && y_list_length(contacts) < total) { yct = y_new0(struct yahoo_found_contact, 1); contacts = y_list_append(contacts, yct); yct->id = cp + 2; } else { *p = 0; } break; case 2: yct->online = !strcmp(cp, "2") ? 1 : 0; break; case 3: yct->gender = cp; break; case 4: yct->age = atoi(cp); break; case 5: /* not worth the context switch for strcmp */ if (cp[0] != '\005' || cp[1] != '\000') yct->location = cp; k = 0; break; } } } YAHOO_CALLBACK(ext_yahoo_got_search_result) (yid->yd->client_id, found, start, total, contacts); while (contacts) { YList *node = contacts; contacts = y_list_remove_link(contacts, node); free(node->data); y_list_free_1(node); } } static void _yahoo_webcam_connected(void *fd, int error, void *d) { struct yahoo_input_data *yid = d; struct yahoo_webcam *wcm = yid->wcm; struct yahoo_data *yd = yid->yd; char conn_type[100]; char *data = NULL; char *packet = NULL; unsigned char magic_nr[] = { 1, 0, 0, 0, 1 }; unsigned header_len = 0; unsigned int len = 0; unsigned int pos = 0; if (error || !fd) { FREE(yid); return; } yid->fd = fd; inputs = y_list_prepend(inputs, yid); LOG(("Connected")); /* send initial packet */ switch (wcm->direction) { case YAHOO_WEBCAM_DOWNLOAD: data = strdup(""); break; case YAHOO_WEBCAM_UPLOAD: data = strdup(""); break; default: return; } yahoo_add_to_send_queue(yid, data, strlen(data)); FREE(data); /* send data */ switch (wcm->direction) { case YAHOO_WEBCAM_DOWNLOAD: header_len = 8; data = strdup("a=2\r\nc=us\r\ne=21\r\nu="); data = y_string_append(data, yd->user); data = y_string_append(data, "\r\nt="); data = y_string_append(data, wcm->key); data = y_string_append(data, "\r\ni="); data = y_string_append(data, wcm->my_ip); data = y_string_append(data, "\r\ng="); data = y_string_append(data, wcm->user); data = y_string_append(data, "\r\no=w-2-5-1\r\np="); snprintf(conn_type, sizeof(conn_type), "%d", wcm->conn_type); data = y_string_append(data, conn_type); data = y_string_append(data, "\r\n"); break; case YAHOO_WEBCAM_UPLOAD: header_len = 13; data = strdup("a=2\r\nc=us\r\nu="); data = y_string_append(data, yd->user); data = y_string_append(data, "\r\nt="); data = y_string_append(data, wcm->key); data = y_string_append(data, "\r\ni="); data = y_string_append(data, wcm->my_ip); data = y_string_append(data, "\r\no=w-2-5-1\r\np="); snprintf(conn_type, sizeof(conn_type), "%d", wcm->conn_type); data = y_string_append(data, conn_type); data = y_string_append(data, "\r\nb="); data = y_string_append(data, wcm->description); data = y_string_append(data, "\r\n"); break; } len = strlen(data); packet = y_new0(char, header_len + len); packet[pos++] = header_len; packet[pos++] = 0; switch (wcm->direction) { case YAHOO_WEBCAM_DOWNLOAD: packet[pos++] = 1; packet[pos++] = 0; break; case YAHOO_WEBCAM_UPLOAD: packet[pos++] = 5; packet[pos++] = 0; break; } pos += yahoo_put32(packet + pos, len); if (wcm->direction == YAHOO_WEBCAM_UPLOAD) { memcpy(packet + pos, magic_nr, sizeof(magic_nr)); pos += sizeof(magic_nr); } memcpy(packet + pos, data, len); yahoo_add_to_send_queue(yid, packet, header_len + len); FREE(packet); FREE(data); yid->read_tag = YAHOO_CALLBACK(ext_yahoo_add_handler) (yid->yd->client_id, yid->fd, YAHOO_INPUT_READ, yid); } static void yahoo_webcam_connect(struct yahoo_input_data *y) { struct yahoo_webcam *wcm = y->wcm; struct yahoo_input_data *yid; struct yahoo_server_settings *yss; if (!wcm || !wcm->server || !wcm->key) return; yid = y_new0(struct yahoo_input_data, 1); yid->type = YAHOO_CONNECTION_WEBCAM; yid->yd = y->yd; /* copy webcam data to new connection */ yid->wcm = y->wcm; y->wcm = NULL; yss = y->yd->server_settings; yid->wcd = y_new0(struct yahoo_webcam_data, 1); LOG(("Connecting to: %s:%d", wcm->server, wcm->port)); YAHOO_CALLBACK(ext_yahoo_connect_async) (y->yd->client_id, wcm->server, wcm->port, _yahoo_webcam_connected, yid, 0); } static void yahoo_process_webcam_master_connection(struct yahoo_input_data *yid, int over) { char *server; struct yahoo_server_settings *yss; if (over) return; server = yahoo_getwebcam_master(yid); if (server) { yss = yid->yd->server_settings; yid->wcm->server = strdup(server); yid->wcm->port = yss->webcam_port; yid->wcm->conn_type = yss->conn_type; yid->wcm->my_ip = strdup(yss->local_host); if (yid->wcm->direction == YAHOO_WEBCAM_UPLOAD) yid->wcm->description = strdup(yss->webcam_description); yahoo_webcam_connect(yid); FREE(server); } } static void yahoo_process_webcam_connection(struct yahoo_input_data *yid, int over) { int id = yid->yd->client_id; void *fd = yid->fd; if (over) return; /* as long as we still have packets available keep processing them */ while (find_input_by_id_and_fd(id, fd) && yahoo_get_webcam_data(yid) == 1) ; } static void yahoo_process_auth_connection(struct yahoo_input_data *yid, int over) { char *line_end; char *token; char *cookie; int error_code = 0; int is_ymsgr = 0; /* Wait till we get everything */ if (!over) return; if (!yid->rxqueue) { LOG(("Whoops! Closed it just like that??\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); return; } token = strstr((char *)yid->rxqueue, "\r\n\r\n"); if (!token) { LOG(("Could not find anything after the HTTP headers? huh?\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); return; } *token = '\0'; token += 4; /* Skip the first number */ token = strstr(token, "\r\n"); if (!token) { LOG(("Well I tried to skip the first number and found... nothing\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); return; } token += 2; line_end = strstr(token, "\r\n"); if (line_end) { *line_end = '\0'; line_end += 2; } error_code = atoi((char *)token); switch (error_code) { case 0: /* successful */ break; case 1212: /* Incorrect ID or password */ LOG(("Incorrect ID or password\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_PASSWD, NULL); return; case 1213: /* Security lock from too many failed login attempts */ LOG(("Security lock from too many failed login attempts\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_LOCK, ""); return; case 1214: /* Security lock */ LOG(("Security lock\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_LOCK, ""); return; case 1235: /* User ID not taken yet */ LOG(("User ID not taken yet\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNAME, NULL); return; case 1216: /* Seems to be a lock, but shows the same generic User ID/Password failure */ LOG(("Seems to be a lock, but shows the same generic User ID/Password failure\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_PASSWD, NULL); return; case 100: /* Username and password cannot be blank */ LOG(("Username and password cannot be blank\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_PASSWD, NULL); return; default: /* Unknown error code */ LOG(("Unknown Error\n")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); return; } if (line_end && !strncmp(line_end, "ymsgr=", 6)) { is_ymsgr = 1; } else if (strncmp(line_end, "crumb=", 6)) { LOG(("Oops! There was no ymsgr=. Where do I get my token from now :(")); LOG(("I got this:\n\n%s\n", line_end)); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); return; /* Error */ } token = line_end + 6; line_end = strstr(token, "\r\n"); if (line_end) { *line_end = '\0'; line_end += 2; } /* Go for the crumb */ if (is_ymsgr) { char url[256]; char *token_enc; struct yahoo_input_data *crumb_yid = y_new0(struct yahoo_input_data, 1); crumb_yid->yd = yid->yd; crumb_yid->type = YAHOO_CONNECTION_AUTH; inputs = y_list_prepend(inputs, crumb_yid); token_enc = yahoo_urlencode(token); snprintf(url, sizeof(url), "https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=" "&token=%s", token_enc); yahoo_http_get(crumb_yid->yd->client_id, url, NULL, 1, 0, _yahoo_http_connected, crumb_yid); FREE(token_enc); return; } /* token is actually crumb */ if (!line_end) { /* We did not get our cookies. Cry. */ LOG(("NO Cookies!")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); return; } cookie = strstr((char *)yid->rxqueue, "Set-Cookie: Y="); if (!cookie) { /* Cry. */ LOG(("NO Y Cookie!")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); return; } cookie += 14; line_end = strstr(cookie, "\r\n"); *line_end = '\0'; yid->yd->cookie_y = strdup(cookie); *line_end = ';'; cookie = strstr((char *)yid->rxqueue, "Set-Cookie: T="); if (!cookie) { /* Cry. */ LOG(("NO T Cookie!")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); return; } cookie += 14; line_end = strstr(cookie, "\r\n"); *line_end = '\0'; yid->yd->cookie_t = strdup(cookie); *line_end = ';'; cookie = strstr((char *)yid->rxqueue, "Set-Cookie: B="); if (!cookie) { /* Cry. */ LOG(("NO B Cookie!")); YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd->client_id, YAHOO_LOGIN_UNKNOWN, NULL); return; } cookie += 14; line_end = strstr(cookie, "\r\n"); *line_end = '\0'; yid->yd->cookie_b = strdup(cookie); yid->yd->crumb = strdup(token); yahoo_send_auth(yid->yd); } static void (*yahoo_process_connection[]) (struct yahoo_input_data *, int over) = { yahoo_process_pager_connection, yahoo_process_ft_connection, yahoo_process_yab_connection, yahoo_process_webcam_master_connection, yahoo_process_webcam_connection, yahoo_process_chatcat_connection, yahoo_process_search_connection, yahoo_process_auth_connection}; int yahoo_read_ready(int id, void *fd, void *data) { struct yahoo_input_data *yid = data; char buf[1024]; int len; LOG(("read callback: id=%d fd=%p data=%p", id, fd, data)); if (!yid) return -2; do { len = YAHOO_CALLBACK(ext_yahoo_read) (fd, buf, sizeof(buf)); } while (len == -1 && errno == EINTR); if (len == -1 && (errno == EAGAIN || errno == EINTR)) /* we'll try again later */ return 1; if (len <= 0) { int e = errno; DEBUG_MSG(("len == %d (<= 0)", len)); if (yid->type == YAHOO_CONNECTION_PAGER) { YAHOO_CALLBACK(ext_yahoo_login_response) (yid->yd-> client_id, YAHOO_LOGIN_SOCK, NULL); } yahoo_process_connection[yid->type] (yid, 1); yahoo_input_close(yid); /* no need to return an error, because we've already fixed it */ if (len == 0) return 1; errno = e; LOG(("read error: %s", strerror(errno))); return -1; } yid->rxqueue = y_renew(unsigned char, yid->rxqueue, len + yid->rxlen + 1); memcpy(yid->rxqueue + yid->rxlen, buf, len); yid->rxlen += len; yid->rxqueue[yid->rxlen] = 0; yahoo_process_connection[yid->type] (yid, 0); return len; } int yahoo_init_with_attributes(const char *username, const char *password, ...) { va_list ap; struct yahoo_data *yd; yd = y_new0(struct yahoo_data, 1); if (!yd) return 0; yd->user = strdup(username); yd->password = strdup(password); yd->initial_status = -1; yd->current_status = -1; yd->client_id = ++last_id; add_to_list(yd); va_start(ap, password); yd->server_settings = _yahoo_assign_server_settings(ap); va_end(ap); return yd->client_id; } int yahoo_init(const char *username, const char *password) { return yahoo_init_with_attributes(username, password, NULL); } static void yahoo_connected(void *fd, int error, void *data) { struct connect_callback_data *ccd = data; struct yahoo_data *yd = ccd->yd; struct yahoo_packet *pkt; struct yahoo_input_data *yid; struct yahoo_server_settings *yss = yd->server_settings; if (error) { int tag; if (fallback_ports[ccd->i]) { char *host = yss->pager_host; if (!host) host = yss->pager_host_list[ccd->server_i]; yss->pager_port = fallback_ports[ccd->i++]; tag = YAHOO_CALLBACK(ext_yahoo_connect_async) (yd-> client_id, host, yss->pager_port, yahoo_connected, ccd, 0); if (tag > 0) ccd->tag = tag; } else if (yss->pager_host_list && yss->pager_host_list[ccd->server_i]) { /* Get back to the default port */ yss->pager_port = pager_port; ccd->server_i++; LOG(("Fallback: Connecting to %s:%d", yss->pager_host_list[ccd->server_i], yss->pager_port)); ccd->i = 0; tag = YAHOO_CALLBACK(ext_yahoo_connect_async) (yd->client_id, yss->pager_host_list[ccd->server_i], yss->pager_port, yahoo_connected, ccd, 0); } else { FREE(ccd); YAHOO_CALLBACK(ext_yahoo_login_response) (yd->client_id, YAHOO_LOGIN_SOCK, NULL); } return; } FREE(ccd); /* fd == NULL && error == 0 means connect was cancelled */ if (!fd) return; pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, YPACKET_STATUS_DEFAULT, yd->session_id); NOTICE(("Sending initial packet")); yahoo_packet_hash(pkt, 1, yd->user); yid = find_input_by_id_and_type(yd->client_id, YAHOO_CONNECTION_PAGER); yid->fd = fd; yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); yid->read_tag = YAHOO_CALLBACK(ext_yahoo_add_handler) (yid->yd->client_id, yid->fd, YAHOO_INPUT_READ, yid); } void *yahoo_get_fd(int id) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); if (!yid) return 0; else return yid->fd; } void yahoo_send_buzz(int id, const char *from, const char *who) { yahoo_send_im(id, from, who, "", 1, 0); } void yahoo_send_im(int id, const char *from, const char *who, const char *what, int utf8, int picture) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_packet *pkt = NULL; struct yahoo_data *yd; char pic_str[10]; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, yd->session_id); snprintf(pic_str, sizeof(pic_str), "%d", picture); if (from && strcmp(from, yd->user)) yahoo_packet_hash(pkt, 0, yd->user); yahoo_packet_hash(pkt, 1, from ? from : yd->user); yahoo_packet_hash(pkt, 5, who); yahoo_packet_hash(pkt, 14, what); if (utf8) yahoo_packet_hash(pkt, 97, "1"); yahoo_packet_hash(pkt, 63, ";0"); /* imvironment name; or ;0 */ yahoo_packet_hash(pkt, 64, "0"); yahoo_packet_hash(pkt, 206, pic_str); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_send_typing(int id, const char *from, const char *who, int typ) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YPACKET_STATUS_NOTIFY, yd->session_id); yahoo_packet_hash(pkt, 5, who); yahoo_packet_hash(pkt, 1, from ? from : yd->user); yahoo_packet_hash(pkt, 14, " "); yahoo_packet_hash(pkt, 13, typ ? "1" : "0"); yahoo_packet_hash(pkt, 49, "TYPING"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_set_away(int id, enum yahoo_status state, const char *msg, int away) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; int old_status; char s[4]; if (!yid) return; yd = yid->yd; old_status = yd->current_status; if (msg) { yd->current_status = YAHOO_STATUS_CUSTOM; } else { yd->current_status = state; } /* Thank you libpurple :) */ if (yd->current_status == YAHOO_STATUS_INVISIBLE) { pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_VISIBLE_TOGGLE, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 13, "2"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); return; } pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_STATUS_UPDATE, yd->current_status, yd->session_id); snprintf(s, sizeof(s), "%d", yd->current_status); yahoo_packet_hash(pkt, 10, s); if (yd->current_status == YAHOO_STATUS_CUSTOM) { yahoo_packet_hash(pkt, 19, msg); } else { yahoo_packet_hash(pkt, 19, ""); } yahoo_packet_hash(pkt, 47, (away == 2) ? "2" : (away) ? "1" : "0"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); if (old_status == YAHOO_STATUS_INVISIBLE) { pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_VISIBLE_TOGGLE, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 13, "1"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } } void yahoo_logoff(int id) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; LOG(("yahoo_logoff: current status: %d", yd->current_status)); if (yd->current_status != -1) { pkt = yahoo_packet_new(YAHOO_SERVICE_LOGOFF, YPACKET_STATUS_DEFAULT, yd->session_id); yd->current_status = -1; if (pkt) { yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } } /* do { yahoo_input_close(yid); } while((yid = find_input_by_id(id)));*/ } void yahoo_get_list(int id) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_LIST, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); if (pkt) { yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } } static void _yahoo_http_connected(int id, void *fd, int error, void *data) { struct yahoo_input_data *yid = data; if (fd == NULL || error) { inputs = y_list_remove(inputs, yid); FREE(yid); return; } yid->fd = fd; yid->read_tag = YAHOO_CALLBACK(ext_yahoo_add_handler) (yid->yd->client_id, fd, YAHOO_INPUT_READ, yid); } /* FIXME Get address book from address.yahoo.com instead */ void yahoo_get_yab(int id) { struct yahoo_data *yd = find_conn_by_id(id); struct yahoo_input_data *yid; char url[1024]; char buff[2048]; if (!yd) return; yid = y_new0(struct yahoo_input_data, 1); yid->yd = yd; yid->type = YAHOO_CONNECTION_YAB; LOG(("Sending request for Address Book")); snprintf(url, 1024, "http://address.yahoo.com/yab/us?v=XM&prog=ymsgr&.intl=us" "&diffs=1&t=0&tags=short&rt=0&prog-ver=8.1.0.249&useutf8=1&legenc=codepage-1252"); snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); inputs = y_list_prepend(inputs, yid); yahoo_http_get(yid->yd->client_id, url, buff, 0, 0, _yahoo_http_connected, yid); } struct yahoo_post_data { struct yahoo_input_data *yid; char *data; }; static void _yahoo_http_post_connected(int id, void *fd, int error, void *data) { struct yahoo_post_data *yad = data; struct yahoo_input_data *yid = yad->yid; char *buff = yad->data; if (!fd) { inputs = y_list_remove(inputs, yid); FREE(yid); return; } YAHOO_CALLBACK(ext_yahoo_write) (fd, buff, strlen(buff)); yid->fd = fd; yid->read_tag = YAHOO_CALLBACK(ext_yahoo_add_handler) (yid->yd->client_id, fd, YAHOO_INPUT_READ, yid); FREE(buff); FREE(yad); } /* FIXME This is also likely affected */ void yahoo_set_yab(int id, struct yab *yab) { struct yahoo_post_data *yad = y_new0(struct yahoo_post_data, 1); struct yahoo_data *yd = find_conn_by_id(id); struct yahoo_input_data *yid; char url[1024]; char buff[1024]; char post[1024]; int size = 0; if (!yd) return; yid = y_new0(struct yahoo_input_data, 1); yid->type = YAHOO_CONNECTION_YAB; yid->yd = yd; if(yab->yid) size = snprintf(post, sizeof(post), "" "" "" "", yd->user, 9, yab->yid, /* Don't know why */ yab->id, yab->nname?yab->nname:""); else size = snprintf(post, sizeof(post), "" "" "" "", yd->user, 1, /* Don't know why */ yab->id, yab->nname?yab->nname:""); yad->yid = yid; yad->data = strdup(post); strcpy(url, "http://address.yahoo.com/yab/us?v=XM&prog=ymsgr&.intl=us" "&sync=1&tags=short&noclear=1&useutf8=1&legenc=codepage-1252"); snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); inputs = y_list_prepend(inputs, yid); yahoo_http_post(yid->yd->client_id, url, buff, size, _yahoo_http_post_connected, yad); } void yahoo_set_identity_status(int id, const char *identity, int active) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(active ? YAHOO_SERVICE_IDACT : YAHOO_SERVICE_IDDEACT, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 3, identity); if (pkt) { yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } } void yahoo_refresh(int id) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_USERSTAT, YPACKET_STATUS_DEFAULT, yd->session_id); if (pkt) { yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } } void yahoo_keepalive(int id) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_PING, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_chat_keepalive(int id) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_CHATPING, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_add_buddy(int id, const char *who, const char *group, const char *msg) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; if (!yd->logged_in) return; pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YPACKET_STATUS_DEFAULT, yd->session_id); if (msg != NULL) /* add message/request "it's me add me" */ yahoo_packet_hash(pkt, 14, msg); else yahoo_packet_hash(pkt, 14, ""); yahoo_packet_hash(pkt, 65, group); yahoo_packet_hash(pkt, 97, "1"); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 302, "319"); yahoo_packet_hash(pkt, 300, "319"); yahoo_packet_hash(pkt, 7, who); yahoo_packet_hash(pkt, 334, "0"); yahoo_packet_hash(pkt, 301, "319"); yahoo_packet_hash(pkt, 303, "319"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_remove_buddy(int id, const char *who, const char *group) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 7, who); yahoo_packet_hash(pkt, 65, group); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_confirm_buddy(int id, const char *who, int reject, const char *msg) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; if (!yd->logged_in) return; pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_AUTHORIZATION, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 5, who); if (reject) yahoo_packet_hash(pkt, 13, "2"); else { yahoo_packet_hash(pkt, 241, "0"); yahoo_packet_hash(pkt, 13, "1"); } yahoo_packet_hash(pkt, 334, "0"); if (reject) { yahoo_packet_hash(pkt, 14, msg ? msg : ""); yahoo_packet_hash(pkt, 97, "1"); } yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_ignore_buddy(int id, const char *who, int unignore) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; if (!yd->logged_in) return; pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 7, who); yahoo_packet_hash(pkt, 13, unignore ? "2" : "1"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_stealth_buddy(int id, const char *who, int unstealth) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; if (!yd->logged_in) return; pkt = yahoo_packet_new(YAHOO_SERVICE_STEALTH_PERM, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 7, who); yahoo_packet_hash(pkt, 31, unstealth ? "2" : "1"); yahoo_packet_hash(pkt, 13, "2"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_change_buddy_group(int id, const char *who, const char *old_group, const char *new_group) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_CHANGE_GROUP, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 302, "240"); yahoo_packet_hash(pkt, 300, "240"); yahoo_packet_hash(pkt, 7, who); yahoo_packet_hash(pkt, 224, old_group); yahoo_packet_hash(pkt, 264, new_group); yahoo_packet_hash(pkt, 301, "240"); yahoo_packet_hash(pkt, 303, "240"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_group_rename(int id, const char *old_group, const char *new_group) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt = NULL; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_GROUPRENAME, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 65, old_group); yahoo_packet_hash(pkt, 67, new_group); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_conference_addinvite(int id, const char *from, const char *who, const char *room, const YList *members, const char *msg) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_CONFADDINVITE, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_packet_hash(pkt, 51, who); yahoo_packet_hash(pkt, 57, room); yahoo_packet_hash(pkt, 58, msg); yahoo_packet_hash(pkt, 13, "0"); for (; members; members = members->next) { yahoo_packet_hash(pkt, 52, (char *)members->data); yahoo_packet_hash(pkt, 53, (char *)members->data); } /* 52, 53 -> other members? */ yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_conference_invite(int id, const char *from, YList *who, const char *room, const char *msg) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_CONFINVITE, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_packet_hash(pkt, 50, yd->user); for (; who; who = who->next) { yahoo_packet_hash(pkt, 52, (char *)who->data); } yahoo_packet_hash(pkt, 57, room); yahoo_packet_hash(pkt, 58, msg); yahoo_packet_hash(pkt, 13, "0"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_conference_logon(int id, const char *from, YList *who, const char *room) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_CONFLOGON, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_packet_hash(pkt, 3, (from ? from : yd->user)); yahoo_packet_hash(pkt, 57, room); for (; who; who = who->next) yahoo_packet_hash(pkt, 3, (char *)who->data); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_conference_decline(int id, const char *from, YList *who, const char *room, const char *msg) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_CONFDECLINE, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_packet_hash(pkt, 3, (from ? from : yd->user)); for (; who; who = who->next) yahoo_packet_hash(pkt, 3, (char *)who->data); yahoo_packet_hash(pkt, 57, room); yahoo_packet_hash(pkt, 14, msg); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_conference_logoff(int id, const char *from, YList *who, const char *room) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_CONFLOGOFF, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_packet_hash(pkt, 3, (from ? from : yd->user)); for (; who; who = who->next) yahoo_packet_hash(pkt, 3, (char *)who->data); yahoo_packet_hash(pkt, 57, room); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_conference_message(int id, const char *from, YList *who, const char *room, const char *msg, int utf8) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_CONFMSG, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_packet_hash(pkt, 53, (from ? from : yd->user)); for (; who; who = who->next) yahoo_packet_hash(pkt, 53, (char *)who->data); yahoo_packet_hash(pkt, 57, room); yahoo_packet_hash(pkt, 14, msg); if (utf8) yahoo_packet_hash(pkt, 97, "1"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_get_chatrooms(int id, int chatroomid) { struct yahoo_data *yd = find_conn_by_id(id); struct yahoo_input_data *yid; char url[1024]; char buff[1024]; if (!yd) return; yid = y_new0(struct yahoo_input_data, 1); yid->yd = yd; yid->type = YAHOO_CONNECTION_CHATCAT; if (chatroomid == 0) { snprintf(url, 1024, "http://insider.msg.yahoo.com/ycontent/?chatcat=0"); } else { snprintf(url, 1024, "http://insider.msg.yahoo.com/ycontent/?chatroom_%d=0", chatroomid); } snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); inputs = y_list_prepend(inputs, yid); yahoo_http_get(yid->yd->client_id, url, buff, 0, 0, _yahoo_http_connected, yid); } void yahoo_chat_logon(int id, const char *from, const char *room, const char *roomid) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_CHATONLINE, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_packet_hash(pkt, 109, yd->user); yahoo_packet_hash(pkt, 6, "abcde"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATJOIN, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_packet_hash(pkt, 104, room); yahoo_packet_hash(pkt, 129, roomid); yahoo_packet_hash(pkt, 62, "2"); /* ??? */ yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_chat_message(int id, const char *from, const char *room, const char *msg, const int msgtype, const int utf8) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; char buf[2]; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_COMMENT, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_packet_hash(pkt, 104, room); yahoo_packet_hash(pkt, 117, msg); snprintf(buf, sizeof(buf), "%d", msgtype); yahoo_packet_hash(pkt, 124, buf); if (utf8) yahoo_packet_hash(pkt, 97, "1"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_chat_logoff(int id, const char *from) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_CHATLOGOUT, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_buddyicon_request(int id, const char *who) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YPACKET_STATUS_DEFAULT, 0); yahoo_packet_hash(pkt, 4, yd->user); yahoo_packet_hash(pkt, 5, who); yahoo_packet_hash(pkt, 13, "1"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_send_picture_info(int id, const char *who, const char *url, int checksum) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; char checksum_str[10]; if (!yid) return; yd = yid->yd; snprintf(checksum_str, sizeof(checksum_str), "%d", checksum); pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YPACKET_STATUS_DEFAULT, 0); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 4, yd->user); yahoo_packet_hash(pkt, 5, who); yahoo_packet_hash(pkt, 13, "2"); yahoo_packet_hash(pkt, 20, url); yahoo_packet_hash(pkt, 192, checksum_str); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_send_picture_update(int id, const char *who, int type) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; char type_str[10]; if (!yid) return; yd = yid->yd; snprintf(type_str, sizeof(type_str), "%d", type); pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_UPDATE, YPACKET_STATUS_DEFAULT, 0); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 5, who); yahoo_packet_hash(pkt, 206, type_str); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_send_picture_checksum(int id, const char *who, int checksum) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; char checksum_str[10]; if (!yid) return; yd = yid->yd; snprintf(checksum_str, sizeof(checksum_str), "%d", checksum); pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_CHECKSUM, YPACKET_STATUS_DEFAULT, 0); yahoo_packet_hash(pkt, 1, yd->user); if (who != 0) yahoo_packet_hash(pkt, 5, who); yahoo_packet_hash(pkt, 192, checksum_str); yahoo_packet_hash(pkt, 212, "1"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_webcam_close_feed(int id, const char *who) { struct yahoo_input_data *yid = find_input_by_id_and_webcam_user(id, who); if (yid) yahoo_input_close(yid); } void yahoo_webcam_get_feed(int id, const char *who) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_data *yd; struct yahoo_packet *pkt; if (!yid) return; /* * add the user to the queue. this is a dirty hack, since * the yahoo server doesn't tell us who's key it's returning, * we have to just hope that it sends back keys in the same * order that we request them. * The queue is popped in yahoo_process_webcam_key */ webcam_queue = y_list_append(webcam_queue, who ? strdup(who) : NULL); yd = yid->yd; pkt = yahoo_packet_new(YAHOO_SERVICE_WEBCAM, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); if (who != NULL) yahoo_packet_hash(pkt, 5, who); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_webcam_send_image(int id, unsigned char *image, unsigned int length, unsigned int timestamp) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_WEBCAM); unsigned char *packet; unsigned char header_len = 13; unsigned int pos = 0; if (!yid) return; packet = y_new0(unsigned char, header_len); packet[pos++] = header_len; packet[pos++] = 0; packet[pos++] = 5; /* version byte?? */ packet[pos++] = 0; pos += yahoo_put32(packet + pos, length); packet[pos++] = 2; /* packet type, image */ pos += yahoo_put32(packet + pos, timestamp); yahoo_add_to_send_queue(yid, packet, header_len); FREE(packet); if (length) yahoo_add_to_send_queue(yid, image, length); } void yahoo_webcam_accept_viewer(int id, const char *who, int accept) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_WEBCAM); char *packet = NULL; char *data = NULL; unsigned char header_len = 13; unsigned int pos = 0; unsigned int len = 0; if (!yid) return; data = strdup("u="); data = y_string_append(data, (char *)who); data = y_string_append(data, "\r\n"); len = strlen(data); packet = y_new0(char, header_len + len); packet[pos++] = header_len; packet[pos++] = 0; packet[pos++] = 5; /* version byte?? */ packet[pos++] = 0; pos += yahoo_put32(packet + pos, len); packet[pos++] = 0; /* packet type */ pos += yahoo_put32(packet + pos, accept); memcpy(packet + pos, data, len); FREE(data); yahoo_add_to_send_queue(yid, packet, header_len + len); FREE(packet); } void yahoo_webcam_invite(int id, const char *who) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_packet *pkt; if (!yid) return; pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YPACKET_STATUS_NOTIFY, yid->yd->session_id); yahoo_packet_hash(pkt, 49, "WEBCAMINVITE"); yahoo_packet_hash(pkt, 14, " "); yahoo_packet_hash(pkt, 13, "0"); yahoo_packet_hash(pkt, 1, yid->yd->user); yahoo_packet_hash(pkt, 5, who); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } static void yahoo_search_internal(int id, int t, const char *text, int g, int ar, int photo, int yahoo_only, int startpos, int total) { struct yahoo_data *yd = find_conn_by_id(id); struct yahoo_input_data *yid; char url[1024]; char buff[1024]; char *ctext, *p; if (!yd) return; yid = y_new0(struct yahoo_input_data, 1); yid->yd = yd; yid->type = YAHOO_CONNECTION_SEARCH; /* age range .ar=1 - 13-18, 2 - 18-25, 3 - 25-35, 4 - 35-50, 5 - 50-70, 6 - 70+ */ snprintf(buff, sizeof(buff), "&.sq=%%20&.tt=%d&.ss=%d", total, startpos); ctext = strdup(text); while ((p = strchr(ctext, ' '))) *p = '+'; snprintf(url, 1024, "http://members.yahoo.com/interests?.oc=m&.kw=%s&.sb=%d&.g=%d&.ar=0%s%s%s", ctext, t, g, photo ? "&.p=y" : "", yahoo_only ? "&.pg=y" : "", startpos ? buff : ""); FREE(ctext); snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); inputs = y_list_prepend(inputs, yid); yahoo_http_get(yid->yd->client_id, url, buff, 0, 0, _yahoo_http_connected, yid); } void yahoo_search(int id, enum yahoo_search_type t, const char *text, enum yahoo_search_gender g, enum yahoo_search_agerange ar, int photo, int yahoo_only) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_search_state *yss; if (!yid) return; if (!yid->ys) yid->ys = y_new0(struct yahoo_search_state, 1); yss = yid->ys; FREE(yss->lsearch_text); yss->lsearch_type = t; yss->lsearch_text = strdup(text); yss->lsearch_gender = g; yss->lsearch_agerange = ar; yss->lsearch_photo = photo; yss->lsearch_yahoo_only = yahoo_only; yahoo_search_internal(id, t, text, g, ar, photo, yahoo_only, 0, 0); } void yahoo_search_again(int id, int start) { struct yahoo_input_data *yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); struct yahoo_search_state *yss; if (!yid || !yid->ys) return; yss = yid->ys; if (start == -1) start = yss->lsearch_nstart + yss->lsearch_nfound; yahoo_search_internal(id, yss->lsearch_type, yss->lsearch_text, yss->lsearch_gender, yss->lsearch_agerange, yss->lsearch_photo, yss->lsearch_yahoo_only, start, yss->lsearch_ntotal); } void yahoo_send_picture(int id, const char *name, unsigned long size, yahoo_get_fd_callback callback, void *data) { /* Not Implemented */ } /* File Transfer */ static YList *active_file_transfers = NULL; enum { FT_STATE_HEAD = 1, FT_STATE_RECV, FT_STATE_RECV_START, FT_STATE_SEND }; struct send_file_data { int client_id; char *id; char *who; char *filename; char *ip_addr; char *token; int size; struct yahoo_input_data *yid; int state; yahoo_get_fd_callback callback; void *data; }; static char *yahoo_get_random(void) { int i = 0; int r = 0; int c = 0; char out[25]; out[24] = '\0'; out[23] = '$'; out[22] = '$'; for (i = 0; i < 22; i++) { if(r == 0) r = rand(); c = r%61; if(c<26) out[i] = c + 'a'; else if (c<52) out[i] = c - 26 + 'A'; else out[i] = c - 52 + '0'; r /= 61; } return strdup(out); } static int _are_same_id(const void *sfd1, const void *id) { return strcmp(((struct send_file_data *)sfd1)->id, (char *)id); } static int _are_same_yid(const void *sfd1, const void *yid) { if(((struct send_file_data *)sfd1)->yid == yid) return 0; else return 1; } static struct send_file_data *yahoo_get_active_transfer(char *id) { YList *l = y_list_find_custom(active_file_transfers, id, _are_same_id); if(l) return (struct send_file_data *)l->data; return NULL; } static struct send_file_data *yahoo_get_active_transfer_with_yid(void *yid) { YList *l = y_list_find_custom(active_file_transfers, yid, _are_same_yid); if(l) return (struct send_file_data *)l->data; return NULL; } static void yahoo_add_active_transfer(struct send_file_data *sfd) { active_file_transfers = y_list_prepend(active_file_transfers, sfd); } static void yahoo_remove_active_transfer(struct send_file_data *sfd) { active_file_transfers = y_list_remove(active_file_transfers, sfd); free(sfd->id); free(sfd->who); free(sfd->filename); free(sfd->ip_addr); FREE(sfd); } static void _yahoo_ft_upload_connected(int id, void *fd, int error, void *data) { struct send_file_data *sfd = data; struct yahoo_input_data *yid = sfd->yid; if (!fd) { inputs = y_list_remove(inputs, yid); FREE(yid); return; } sfd->callback(id, fd, error, sfd->data); yid->fd = fd; yid->read_tag = YAHOO_CALLBACK(ext_yahoo_add_handler) (yid->yd->client_id, fd, YAHOO_INPUT_READ, yid); } static void yahoo_file_transfer_upload(struct yahoo_data *yd, struct send_file_data *sfd) { char url[256]; char buff[4096]; char *sender_enc = NULL, *recv_enc = NULL, *token_enc = NULL; struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1); yid->yd = yd; yid->type = YAHOO_CONNECTION_FT; inputs = y_list_prepend(inputs, yid); sfd->yid = yid; sfd->state = FT_STATE_SEND; token_enc = yahoo_urlencode(sfd->token); sender_enc = yahoo_urlencode(yd->user); recv_enc = yahoo_urlencode(sfd->who); snprintf(url, sizeof(url), "http://%s/relay?token=%s&sender=%s&recver=%s", sfd->ip_addr, token_enc, sender_enc, recv_enc); snprintf(buff, sizeof(buff), "T=%s; Y=%s", yd->cookie_t, yd->cookie_y); yahoo_http_post(yd->client_id, url, buff, sfd->size, _yahoo_ft_upload_connected, sfd); FREE(token_enc); FREE(sender_enc); FREE(recv_enc); } static void yahoo_init_ft_recv(struct yahoo_data *yd, struct send_file_data *sfd) { char url[256]; char buff[1024]; char *sender_enc = NULL, *recv_enc = NULL, *token_enc = NULL; struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1); yid->yd = yd; yid->type = YAHOO_CONNECTION_FT; inputs = y_list_prepend(inputs, yid); sfd->yid = yid; sfd->state = FT_STATE_HEAD; token_enc = yahoo_urlencode(sfd->token); sender_enc = yahoo_urlencode(sfd->who); recv_enc = yahoo_urlencode(yd->user); snprintf(url, sizeof(url), "http://%s/relay?token=%s&sender=%s&recver=%s", sfd->ip_addr, token_enc, sender_enc, recv_enc); snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); yahoo_http_head(yid->yd->client_id, url, buff, 0, NULL, _yahoo_http_connected, yid); FREE(token_enc); FREE(sender_enc); FREE(recv_enc); } static void yahoo_file_transfer_accept(struct yahoo_input_data *yid, struct send_file_data *sfd) { struct yahoo_packet *pkt; pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, YPACKET_STATUS_DEFAULT, yid->yd->session_id); yahoo_packet_hash(pkt, 1, yid->yd->user); yahoo_packet_hash(pkt, 5, sfd->who); yahoo_packet_hash(pkt, 265, sfd->id); yahoo_packet_hash(pkt, 27, sfd->filename); yahoo_packet_hash(pkt, 249, "3"); yahoo_packet_hash(pkt, 251, sfd->token); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); yahoo_init_ft_recv(yid->yd, sfd); } static void yahoo_process_filetransferaccept(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { YList *l; struct send_file_data *sfd; char *who = NULL; char *filename = NULL; char *id = NULL; char *token = NULL; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 4: who = pair->value; break; case 5: /* Me... don't care */ break; case 249: break; case 265: id = pair->value; break; case 251: token = pair->value; break; case 27: filename = pair->value; break; } } sfd = yahoo_get_active_transfer(id); if (sfd) { sfd->token = strdup(token); yahoo_file_transfer_upload(yid->yd, sfd); } else { YAHOO_CALLBACK(ext_yahoo_file_transfer_done) (yid->yd->client_id, YAHOO_FILE_TRANSFER_UNKNOWN, sfd->data); yahoo_remove_active_transfer(sfd); } } static void yahoo_process_filetransferinfo(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { YList *l; char *who = NULL; char *filename = NULL; char *id = NULL; char *token = NULL; char *ip_addr = NULL; struct send_file_data *sfd; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 1: case 4: who = pair->value; break; case 5: /* Me... don't care */ break; case 249: break; case 265: id = pair->value; break; case 250: ip_addr = pair->value; break; case 251: token = pair->value; break; case 27: filename = pair->value; break; } } sfd = yahoo_get_active_transfer(id); if (sfd) { sfd->token = strdup(token); sfd->ip_addr = strdup(ip_addr); yahoo_file_transfer_accept(yid, sfd); } else { YAHOO_CALLBACK(ext_yahoo_file_transfer_done) (yid->yd->client_id, YAHOO_FILE_TRANSFER_UNKNOWN, sfd->data); yahoo_remove_active_transfer(sfd); } } static void yahoo_send_filetransferinfo(struct yahoo_data *yd, struct send_file_data *sfd) { struct yahoo_input_data *yid; struct yahoo_packet *pkt; yid = find_input_by_id_and_type(yd->client_id, YAHOO_CONNECTION_PAGER); sfd->ip_addr = YAHOO_CALLBACK(ext_yahoo_get_ip_addr)("relay.yahoo.com"); if (!sfd->ip_addr) { YAHOO_CALLBACK(ext_yahoo_file_transfer_done) (yd->client_id, YAHOO_FILE_TRANSFER_RELAY, sfd->data); yahoo_remove_active_transfer(sfd); return; } pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERINFO, YPACKET_STATUS_DEFAULT, yd->session_id); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 5, sfd->who); yahoo_packet_hash(pkt, 265, sfd->id); yahoo_packet_hash(pkt, 27, sfd->filename); yahoo_packet_hash(pkt, 249, "3"); yahoo_packet_hash(pkt, 250, sfd->ip_addr); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } static void yahoo_process_filetransfer(struct yahoo_input_data *yid, struct yahoo_packet *pkt) { YList *l; char *who = NULL; char *filename = NULL; char *msg = NULL; char *id = NULL; int action = 0; int size = 0; struct yahoo_data *yd = yid->yd; struct send_file_data *sfd; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 4: who = pair->value; break; case 5: /* Me... don't care */ break; case 222: action = atoi(pair->value); break; case 265: id = pair->value; break; case 266: /* Don't know */ break; case 302: /* Start Data? */ break; case 300: break; case 27: filename = pair->value; break; case 28: size = atoi(pair->value); break; case 14: msg = pair->value; case 301: /* End Data? */ break; case 303: break; } } if (action == YAHOO_FILE_TRANSFER_INIT) { /* Received a FT request from buddy */ sfd = y_new0(struct send_file_data, 1); sfd->client_id = yd->client_id; sfd->id = strdup(id); sfd->who = strdup(who); sfd->filename = strdup(filename); sfd->size = size; yahoo_add_active_transfer(sfd); YAHOO_CALLBACK(ext_yahoo_got_file) (yd->client_id, yd->user, who, msg, filename, size, sfd->id); } else { /* Response to our request */ sfd = yahoo_get_active_transfer(id); if (sfd && action == YAHOO_FILE_TRANSFER_ACCEPT) { yahoo_send_filetransferinfo(yd, sfd); } else if (!sfd || action == YAHOO_FILE_TRANSFER_REJECT) { YAHOO_CALLBACK(ext_yahoo_file_transfer_done) (yd->client_id, YAHOO_FILE_TRANSFER_REJECT, sfd->data); yahoo_remove_active_transfer(sfd); } } } void yahoo_send_file(int id, const char *who, const char *msg, const char *name, unsigned long size, yahoo_get_fd_callback callback, void *data) { struct yahoo_packet *pkt = NULL; char size_str[10]; struct yahoo_input_data *yid; struct yahoo_data *yd; struct send_file_data *sfd; yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); yd = find_conn_by_id(id); sfd = y_new0(struct send_file_data, 1); sfd->client_id = id; sfd->id = yahoo_get_random(); sfd->who = strdup(who); sfd->filename = strdup(name); sfd->size = size; sfd->callback = callback; sfd->data = data; yahoo_add_active_transfer(sfd); if (!yd) return; pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER, YPACKET_STATUS_DEFAULT, yd->session_id); snprintf(size_str, sizeof(size_str), "%ld", size); yahoo_packet_hash(pkt, 1, yd->user); yahoo_packet_hash(pkt, 5, who); yahoo_packet_hash(pkt, 265, sfd->id); yahoo_packet_hash(pkt, 222, "1"); yahoo_packet_hash(pkt, 266, "1"); yahoo_packet_hash(pkt, 302, "268"); yahoo_packet_hash(pkt, 300, "268"); yahoo_packet_hash(pkt, 27, name); yahoo_packet_hash(pkt, 28, size_str); yahoo_packet_hash(pkt, 301, "268"); yahoo_packet_hash(pkt, 303, "268"); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); } void yahoo_send_file_transfer_response(int client_id, int response, char *id, void *data) { struct yahoo_packet *pkt = NULL; char resp[2]; struct yahoo_input_data *yid; struct send_file_data *sfd = yahoo_get_active_transfer(id); sfd->data = data; yid = find_input_by_id_and_type(client_id, YAHOO_CONNECTION_PAGER); pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER, YPACKET_STATUS_DEFAULT, yid->yd->session_id); snprintf(resp, sizeof(resp), "%d", response); yahoo_packet_hash(pkt, 1, yid->yd->user); yahoo_packet_hash(pkt, 5, sfd->who); yahoo_packet_hash(pkt, 265, sfd->id); yahoo_packet_hash(pkt, 222, resp); yahoo_send_packet(yid, pkt, 0); yahoo_packet_free(pkt); if(response == YAHOO_FILE_TRANSFER_REJECT) yahoo_remove_active_transfer(sfd); } static void yahoo_process_ft_connection(struct yahoo_input_data *yid, int over) { struct send_file_data *sfd; struct yahoo_data *yd = yid->yd; sfd = yahoo_get_active_transfer_with_yid(yid); if (!sfd) { LOG(("Something funny happened. yid %p has no sfd.\n", yid)); return; } /* * We want to handle only the complete data with HEAD since we don't * want a situation where both the GET and HEAD are active. * With SEND, we really can't do much with partial response */ if ((sfd->state == FT_STATE_HEAD || sfd->state == FT_STATE_SEND) && !over) return; if (sfd->state == FT_STATE_HEAD) { /* Do a GET */ char url[256]; char buff[1024]; char *sender_enc = NULL, *recv_enc = NULL, *token_enc = NULL; struct yahoo_input_data *yid_ft = y_new0(struct yahoo_input_data, 1); yid_ft->yd = yid->yd; yid_ft->type = YAHOO_CONNECTION_FT; inputs = y_list_prepend(inputs, yid_ft); sfd->yid = yid_ft; sfd->state = FT_STATE_RECV; token_enc = yahoo_urlencode(sfd->token); sender_enc = yahoo_urlencode(sfd->who); recv_enc = yahoo_urlencode(yd->user); snprintf(url, sizeof(url), "http://%s/relay?token=%s&sender=%s&recver=%s", sfd->ip_addr, token_enc, sender_enc, recv_enc); snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); yahoo_http_get(yd->client_id, url, buff, 1, 1, _yahoo_http_connected, yid_ft); FREE(token_enc); FREE(sender_enc); FREE(recv_enc); } else if (sfd->state == FT_STATE_RECV || sfd->state == FT_STATE_RECV_START) { unsigned char *data_begin = NULL; if (yid->rxlen == 0) yahoo_remove_active_transfer(sfd); if (sfd->state != FT_STATE_RECV_START && (data_begin = (unsigned char *)strstr((char *)yid->rxqueue, "\r\n\r\n"))) { sfd->state = FT_STATE_RECV_START; yid->rxlen -= 4+(data_begin-yid->rxqueue)/sizeof(char); data_begin += 4; if (yid->rxlen > 0) YAHOO_CALLBACK(ext_yahoo_got_ft_data) (yd->client_id, data_begin, yid->rxlen, sfd->data); } else if (sfd->state == FT_STATE_RECV_START) YAHOO_CALLBACK(ext_yahoo_got_ft_data) (yd->client_id, yid->rxqueue, yid->rxlen, sfd->data); FREE(yid->rxqueue); yid->rxqueue = NULL; yid->rxlen = 0; } else if (sfd->state == FT_STATE_SEND) { /* Sent file completed */ int len = 0; char *off = strstr((char *)yid->rxqueue, "Content-Length: "); if (off) { off += 16; len = atoi(off); } if (len < sfd->size) YAHOO_CALLBACK(ext_yahoo_file_transfer_done) (yd->client_id, YAHOO_FILE_TRANSFER_FAILED, sfd->data); else YAHOO_CALLBACK(ext_yahoo_file_transfer_done) (yd->client_id, YAHOO_FILE_TRANSFER_DONE, sfd->data); yahoo_remove_active_transfer(sfd); } } /* End File Transfer */ enum yahoo_status yahoo_current_status(int id) { struct yahoo_data *yd = find_conn_by_id(id); if (!yd) return YAHOO_STATUS_OFFLINE; return yd->current_status; } const YList *yahoo_get_buddylist(int id) { struct yahoo_data *yd = find_conn_by_id(id); if (!yd) return NULL; return yd->buddies; } const YList *yahoo_get_ignorelist(int id) { struct yahoo_data *yd = find_conn_by_id(id); if (!yd) return NULL; return yd->ignore; } const YList *yahoo_get_identities(int id) { struct yahoo_data *yd = find_conn_by_id(id); if (!yd) return NULL; return yd->identities; } const char *yahoo_get_cookie(int id, const char *which) { struct yahoo_data *yd = find_conn_by_id(id); if (!yd) return NULL; if (!strncasecmp(which, "y", 1)) return yd->cookie_y; if (!strncasecmp(which, "b", 1)) return yd->cookie_b; if (!strncasecmp(which, "t", 1)) return yd->cookie_t; if (!strncasecmp(which, "c", 1)) return yd->cookie_c; if (!strncasecmp(which, "login", 5)) return yd->login_cookie; return NULL; } const char *yahoo_get_profile_url(void) { return profile_url; } centerim-4.22.10/libyahoo2/Makefile.in0000644000175000001440000003751411473011437014353 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libyahoo2 DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru liblibyahoo2_a_AR = $(AR) $(ARFLAGS) liblibyahoo2_a_LIBADD = am_liblibyahoo2_a_OBJECTS = crypt.$(OBJEXT) libyahoo2.$(OBJEXT) \ sha1.$(OBJEXT) yahoo_list.$(OBJEXT) yahoo_httplib.$(OBJEXT) \ yahoo_util.$(OBJEXT) yahoo_fn.$(OBJEXT) liblibyahoo2_a_OBJECTS = $(am_liblibyahoo2_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(liblibyahoo2_a_SOURCES) DIST_SOURCES = $(liblibyahoo2_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -DSTDC_HEADERS -DUSE_STRUCT_CALLBACKS -I$(top_srcdir)/connwrap noinst_LIBRARIES = liblibyahoo2.a noinst_HEADERS = yahoo2_callbacks.h yahoo_debug.h yahoo_httplib.h yahoo2_types.h yahoo_list.h yahoo_util.h yahoo2.h sha1.h yahoo_fn.h AUTOMAKE_OPTIONS = foreign liblibyahoo2_a_SOURCES = crypt.c libyahoo2.c sha1.c yahoo_list.c yahoo_httplib.c yahoo_util.c yahoo_fn.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libyahoo2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libyahoo2/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) liblibyahoo2.a: $(liblibyahoo2_a_OBJECTS) $(liblibyahoo2_a_DEPENDENCIES) -rm -f liblibyahoo2.a $(liblibyahoo2_a_AR) liblibyahoo2.a $(liblibyahoo2_a_OBJECTS) $(liblibyahoo2_a_LIBADD) $(RANLIB) liblibyahoo2.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libyahoo2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yahoo_fn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yahoo_httplib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yahoo_list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yahoo_util.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/libyahoo2/yahoo_list.h0000644000175000001440000000427411473007750014631 00000000000000/* * yahoo_list.h: linked list routines * * Some code copyright (C) 2002-2004, Philip S Tellis * Other code copyright Meredydd Luff * * 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 is a replacement for the GList. It only provides functions that * we use in Ayttm. Thanks to Meredyyd from everybuddy dev for doing * most of it. */ #ifndef __YLIST_H__ #define __YLIST_H__ #ifdef __cplusplus extern "C" { #endif typedef struct _YList { struct _YList *next; struct _YList *prev; void *data; } YList; typedef int (*YListCompFunc) (const void *, const void *); typedef void (*YListFunc) (void *, void *); YList *y_list_append(YList *list, void *data); YList *y_list_prepend(YList *list, void *data); YList *y_list_remove_link(YList *list, const YList *link); YList *y_list_remove(YList *list, void *data); YList *y_list_insert_sorted(YList *list, void *data, YListCompFunc comp); YList *y_list_copy(YList *list); YList *y_list_concat(YList *list, YList *add); YList *y_list_find(YList *list, const void *data); YList *y_list_find_custom(YList *list, const void *data, YListCompFunc comp); YList *y_list_nth(YList *list, int n); void y_list_foreach(YList *list, YListFunc fn, void *user_data); void y_list_free_1(YList *list); void y_list_free(YList *list); int y_list_length(const YList *list); int y_list_empty(const YList *list); int y_list_singleton(const YList *list); #define y_list_next(list) list->next #ifdef __cplusplus } #endif #endif centerim-4.22.10/libyahoo2/sha1.c0000644000175000001440000003362311473007750013306 00000000000000/*- * Copyright (c) 2001-2003 Allan Saddi * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY ALLAN SADDI AND HIS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL ALLAN SADDI OR HIS CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Define WORDS_BIGENDIAN if compiling on a big-endian architecture. * * Define SHA1_TEST to test the implementation using the NIST's * sample messages. The output should be: * * a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d * 84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1 * 34aa973c d4c4daa4 f61eeb2b dbad2731 6534016f */ #ifdef HAVE_CONFIG_H #include #endif /* HAVE_CONFIG_H */ #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #include #include "sha1.h" #define ROTL(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) #define ROTR(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) #define F_0_19(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) #define F_20_39(x, y, z) ((x) ^ (y) ^ (z)) #define F_40_59(x, y, z) (((x) & ((y) | (z))) | ((y) & (z))) #define F_60_79(x, y, z) ((x) ^ (y) ^ (z)) #define DO_ROUND(F, K) { \ temp = ROTL(a, 5) + F(b, c, d) + e + *(W++) + K; \ e = d; \ d = c; \ c = ROTL(b, 30); \ b = a; \ a = temp; \ } #define K_0_19 0x5a827999L #define K_20_39 0x6ed9eba1L #define K_40_59 0x8f1bbcdcL #define K_60_79 0xca62c1d6L #ifndef RUNTIME_ENDIAN #ifdef WORDS_BIGENDIAN #define BYTESWAP(x) (x) #define BYTESWAP64(x) (x) #else /* WORDS_BIGENDIAN */ #define BYTESWAP(x) ((ROTR((x), 8) & 0xff00ff00L) | (ROTL((x), 8) & 0x00ff00ffL)) static uint64_t _byteswap64(uint64_t x) { uint32_t a = x >> 32; uint32_t b = (uint32_t) x; return ((uint64_t) BYTESWAP(b) << 32) | (uint64_t) BYTESWAP(a); } #define BYTESWAP64(x) _byteswap64(x) #endif /* WORDS_BIGENDIAN */ #else /* !RUNTIME_ENDIAN */ #define BYTESWAP(x) _byteswap(sc->littleEndian, x) #define BYTESWAP64(x) _byteswap64(sc->littleEndian, x) #define _BYTESWAP(x) ((ROTR((x), 8) & 0xff00ff00L) | \ (ROTL((x), 8) & 0x00ff00ffL)) #define _BYTESWAP64(x) __byteswap64(x) static uint64_t __byteswap64(uint64_t x) { uint32_t a = x >> 32; uint32_t b = (uint32_t) x; return ((uint64_t) _BYTESWAP(b) << 32) | (uint64_t) _BYTESWAP(a); } static uint32_t _byteswap(int littleEndian, uint32_t x) { if (!littleEndian) return x; else return _BYTESWAP(x); } static uint64_t _byteswap64(int littleEndian, uint64_t x) { if (!littleEndian) return x; else return _BYTESWAP64(x); } static void setEndian(int *littleEndianp) { union { uint32_t w; uint8_t b[4]; } endian; endian.w = 1L; *littleEndianp = endian.b[0] != 0; } #endif /* !RUNTIME_ENDIAN */ static const uint8_t padding[64] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void SHA1Init(SHA1Context *sc) { #ifdef RUNTIME_ENDIAN setEndian(&sc->littleEndian); #endif /* RUNTIME_ENDIAN */ sc->totalLength = 0LL; sc->hash[0] = 0x67452301L; sc->hash[1] = 0xefcdab89L; sc->hash[2] = 0x98badcfeL; sc->hash[3] = 0x10325476L; sc->hash[4] = 0xc3d2e1f0L; sc->bufferLength = 0L; } static void burnStack(int size) { char buf[128]; memset(buf, 0, sizeof(buf)); size -= sizeof(buf); if (size > 0) burnStack(size); } static void SHA1Guts(SHA1Context *sc, const uint32_t *cbuf) { uint32_t buf[80]; uint32_t *W, *W3, *W8, *W14, *W16; uint32_t a, b, c, d, e, temp; int i; W = buf; for (i = 15; i >= 0; i--) { *(W++) = BYTESWAP(*cbuf); cbuf++; } W16 = &buf[0]; W14 = &buf[2]; W8 = &buf[8]; W3 = &buf[13]; for (i = 63; i >= 0; i--) { *W = *(W3++) ^ *(W8++) ^ *(W14++) ^ *(W16++); *W = ROTL(*W, 1); W++; } a = sc->hash[0]; b = sc->hash[1]; c = sc->hash[2]; d = sc->hash[3]; e = sc->hash[4]; W = buf; #ifndef SHA1_UNROLL #define SHA1_UNROLL 20 #endif /* !SHA1_UNROLL */ #if SHA1_UNROLL == 1 for (i = 19; i >= 0; i--) DO_ROUND(F_0_19, K_0_19); for (i = 19; i >= 0; i--) DO_ROUND(F_20_39, K_20_39); for (i = 19; i >= 0; i--) DO_ROUND(F_40_59, K_40_59); for (i = 19; i >= 0; i--) DO_ROUND(F_60_79, K_60_79); #elif SHA1_UNROLL == 2 for (i = 9; i >= 0; i--) { DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); } for (i = 9; i >= 0; i--) { DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); } for (i = 9; i >= 0; i--) { DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); } for (i = 9; i >= 0; i--) { DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); } #elif SHA1_UNROLL == 4 for (i = 4; i >= 0; i--) { DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); } for (i = 4; i >= 0; i--) { DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); } for (i = 4; i >= 0; i--) { DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); } for (i = 4; i >= 0; i--) { DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); } #elif SHA1_UNROLL == 5 for (i = 3; i >= 0; i--) { DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); } for (i = 3; i >= 0; i--) { DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); } for (i = 3; i >= 0; i--) { DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); } for (i = 3; i >= 0; i--) { DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); } #elif SHA1_UNROLL == 10 for (i = 1; i >= 0; i--) { DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); } for (i = 1; i >= 0; i--) { DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); } for (i = 1; i >= 0; i--) { DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); } for (i = 1; i >= 0; i--) { DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); } #elif SHA1_UNROLL == 20 DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_0_19, K_0_19); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_20_39, K_20_39); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_40_59, K_40_59); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); DO_ROUND(F_60_79, K_60_79); #else /* SHA1_UNROLL */ #error SHA1_UNROLL must be 1, 2, 4, 5, 10 or 20! #endif sc->hash[0] += a; sc->hash[1] += b; sc->hash[2] += c; sc->hash[3] += d; sc->hash[4] += e; } void SHA1Update(SHA1Context *sc, const void *vdata, uint32_t len) { const uint8_t *data = vdata; uint32_t bufferBytesLeft; uint32_t bytesToCopy; int needBurn = 0; #ifdef SHA1_FAST_COPY if (sc->bufferLength) { bufferBytesLeft = 64L - sc->bufferLength; bytesToCopy = bufferBytesLeft; if (bytesToCopy > len) bytesToCopy = len; memcpy(&sc->buffer.bytes[sc->bufferLength], data, bytesToCopy); sc->totalLength += bytesToCopy * 8L; sc->bufferLength += bytesToCopy; data += bytesToCopy; len -= bytesToCopy; if (sc->bufferLength == 64L) { SHA1Guts(sc, sc->buffer.words); needBurn = 1; sc->bufferLength = 0L; } } while (len > 63) { sc->totalLength += 512L; SHA1Guts(sc, data); needBurn = 1; data += 64L; len -= 64L; } if (len) { memcpy(&sc->buffer.bytes[sc->bufferLength], data, len); sc->totalLength += len * 8L; sc->bufferLength += len; } #else /* SHA1_FAST_COPY */ while (len) { bufferBytesLeft = 64L - sc->bufferLength; bytesToCopy = bufferBytesLeft; if (bytesToCopy > len) bytesToCopy = len; memcpy(&sc->buffer.bytes[sc->bufferLength], data, bytesToCopy); sc->totalLength += bytesToCopy * 8L; sc->bufferLength += bytesToCopy; data += bytesToCopy; len -= bytesToCopy; if (sc->bufferLength == 64L) { SHA1Guts(sc, sc->buffer.words); needBurn = 1; sc->bufferLength = 0L; } } #endif /* SHA1_FAST_COPY */ if (needBurn) burnStack(sizeof(uint32_t[86]) + sizeof(uint32_t *[5]) + sizeof(int)); } void SHA1Final(SHA1Context *sc, uint8_t hash[SHA1_HASH_SIZE]) { uint32_t bytesToPad; uint64_t lengthPad; int i; bytesToPad = 120L - sc->bufferLength; if (bytesToPad > 64L) bytesToPad -= 64L; lengthPad = BYTESWAP64(sc->totalLength); SHA1Update(sc, padding, bytesToPad); SHA1Update(sc, &lengthPad, 8L); if (hash) { for (i = 0; i < SHA1_HASH_WORDS; i++) { #ifdef SHA1_FAST_COPY *((uint32_t *)hash) = BYTESWAP(sc->hash[i]); #else /* SHA1_FAST_COPY */ hash[0] = (uint8_t) (sc->hash[i] >> 24); hash[1] = (uint8_t) (sc->hash[i] >> 16); hash[2] = (uint8_t) (sc->hash[i] >> 8); hash[3] = (uint8_t) sc->hash[i]; #endif /* SHA1_FAST_COPY */ hash += 4; } } } #ifdef SHA1_TEST #include #include #include int main(int argc, char *argv[]) { SHA1Context foo; uint8_t hash[SHA1_HASH_SIZE]; char buf[1000]; int i; SHA1Init(&foo); SHA1Update(&foo, "abc", 3); SHA1Final(&foo, hash); for (i = 0; i < SHA1_HASH_SIZE;) { printf("%02x", hash[i++]); if (!(i % 4)) printf(" "); } printf("\n"); SHA1Init(&foo); SHA1Update(&foo, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56); SHA1Final(&foo, hash); for (i = 0; i < SHA1_HASH_SIZE;) { printf("%02x", hash[i++]); if (!(i % 4)) printf(" "); } printf("\n"); SHA1Init(&foo); memset(buf, 'a', sizeof(buf)); for (i = 0; i < 1000; i++) SHA1Update(&foo, buf, sizeof(buf)); SHA1Final(&foo, hash); for (i = 0; i < SHA1_HASH_SIZE;) { printf("%02x", hash[i++]); if (!(i % 4)) printf(" "); } printf("\n"); exit(0); } #endif /* SHA1_TEST */ centerim-4.22.10/libyahoo2/yahoo2.h0000644000175000001440000002126011473007750013652 00000000000000/* * libyahoo2: yahoo2.h * * Copyright (C) 2002-2004, Philip S Tellis * * 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 YAHOO2_H #define YAHOO2_H #ifdef __cplusplus extern "C" { #endif #include "yahoo2_types.h" /* returns the socket descriptor object for a given pager connection. shouldn't be needed */ void *yahoo_get_fd(int id); /* says how much logging to do */ /* see yahoo2_types.h for the different values */ int yahoo_set_log_level(enum yahoo_log_level level); enum yahoo_log_level yahoo_get_log_level(void); /* these functions should be self explanatory */ /* who always means the buddy you're acting on */ /* id is the successful value returned by yahoo_init */ /* init returns a connection id used to identify the connection hereon */ /* or 0 on failure */ /* you must call init before calling any other function */ /* * The optional parameters to init are key/value pairs that specify * server settings to use. This list must be NULL terminated - even * if the list is empty. If a parameter isn't set, a default value * will be used. Parameter keys are strings, parameter values are * either strings or ints, depending on the key. Values passed in * are copied, so you can use const/auto/static/pointers/whatever * you want. Parameters are: * NAME TYPE DEFAULT * pager_host char * scs.msg.yahoo.com * pager_port int 5050 * filetransfer_host char * filetransfer.msg.yahoo.com * filetransfer_port int 80 * webcam_host char * webcam.yahoo.com * webcam_port int 5100 * webcam_description char * "" * local_host char * "" * conn_type int Y_WCM_DSL * * You should set at least local_host if you intend to use webcams */ int yahoo_init_with_attributes(const char *username, const char *password, ...); /* yahoo_init does the same as yahoo_init_with_attributes, assuming defaults * for all attributes */ int yahoo_init(const char *username, const char *password); /* release all resources held by this session */ /* you need to call yahoo_close for a session only if * yahoo_logoff is never called for it (ie, it was never logged in) */ void yahoo_close(int id); /* login logs in to the server */ /* initial is of type enum yahoo_status. see yahoo2_types.h */ void yahoo_login(int id, int initial); void yahoo_logoff(int id); /* reloads status of all buddies */ void yahoo_refresh(int id); /* activates/deactivates an identity */ void yahoo_set_identity_status(int id, const char *identity, int active); /* regets the entire buddy list from the server */ void yahoo_get_list(int id); /* download buddy contact information from your yahoo addressbook */ void yahoo_get_yab(int id); /* add/modify an address book entry. if yab->dbid is set, it will */ /* modify that entry else it creates a new entry */ void yahoo_set_yab(int id, struct yab *yab); void yahoo_keepalive(int id); void yahoo_chat_keepalive(int id); /* from is the identity you're sending from. if NULL, the default is used */ /* utf8 is whether msg is a utf8 string or not. */ void yahoo_send_im(int id, const char *from, const char *who, const char *msg, int utf8, int picture); void yahoo_send_buzz(int id, const char *from, const char *who); /* if type is true, send typing notice, else send stopped typing notice */ void yahoo_send_typing(int id, const char *from, const char *who, int typ); /* used to set away/back status. */ /* away says whether the custom message is an away message or a sig */ void yahoo_set_away(int id, enum yahoo_status state, const char *msg, int away); void yahoo_add_buddy(int id, const char *who, const char *group, const char *msg); void yahoo_remove_buddy(int id, const char *who, const char *group); void yahoo_confirm_buddy(int id, const char *who, int reject, const char *msg); void yahoo_stealth_buddy(int id, const char *who, int unstealth); /* if unignore is true, unignore, else ignore */ void yahoo_ignore_buddy(int id, const char *who, int unignore); void yahoo_change_buddy_group(int id, const char *who, const char *old_group, const char *new_group); void yahoo_group_rename(int id, const char *old_group, const char *new_group); void yahoo_conference_invite(int id, const char *from, YList *who, const char *room, const char *msg); void yahoo_conference_addinvite(int id, const char *from, const char *who, const char *room, const YList *members, const char *msg); void yahoo_conference_decline(int id, const char *from, YList *who, const char *room, const char *msg); void yahoo_conference_message(int id, const char *from, YList *who, const char *room, const char *msg, int utf8); void yahoo_conference_logon(int id, const char *from, YList *who, const char *room); void yahoo_conference_logoff(int id, const char *from, YList *who, const char *room); /* Get a list of chatrooms */ void yahoo_get_chatrooms(int id, int chatroomid); /* join room with specified roomname and roomid */ void yahoo_chat_logon(int id, const char *from, const char *room, const char *roomid); /* Send message "msg" to room with specified roomname, msgtype is 1-normal message or 2-/me mesage */ void yahoo_chat_message(int id, const char *from, const char *room, const char *msg, const int msgtype, const int utf8); /* Log off chat */ void yahoo_chat_logoff(int id, const char *from); /* requests a webcam feed */ /* who is the person who's webcam you would like to view */ /* if who is null, then you're the broadcaster */ void yahoo_webcam_get_feed(int id, const char *who); void yahoo_webcam_close_feed(int id, const char *who); /* sends an image when uploading */ /* image points to a JPEG-2000 image, length is the length of the image */ /* in bytes. The timestamp is the time in milliseconds since we started the */ /* webcam. */ void yahoo_webcam_send_image(int id, unsigned char *image, unsigned int length, unsigned int timestamp); /* this function should be called if we want to allow a user to watch the */ /* webcam. Who is the user we want to accept. */ /* Accept user (accept = 1), decline user (accept = 0) */ void yahoo_webcam_accept_viewer(int id, const char *who, int accept); /* send an invitation to a user to view your webcam */ void yahoo_webcam_invite(int id, const char *who); /* will set up a connection and initiate file transfer. * callback will be called with the fd that you should write * the file data to */ void yahoo_send_file(int id, const char *who, const char *msg, const char *name, unsigned long size, yahoo_get_fd_callback callback, void *data); /* * Respond to a file transfer request. Be sure to provide the callback data * since that is your only chance to recognize future callbacks */ void yahoo_send_file_transfer_response(int client_id, int response, char *id, void *data); /* send a search request */ void yahoo_search(int id, enum yahoo_search_type t, const char *text, enum yahoo_search_gender g, enum yahoo_search_agerange ar, int photo, int yahoo_only); /* continue last search * should be called if only (start+found >= total) * * where the above three are passed to ext_yahoo_got_search_result */ void yahoo_search_again(int id, int start); /* these should be called when input is available on a fd */ /* registered by ext_yahoo_add_handler */ /* if these return negative values, errno may be set */ int yahoo_read_ready(int id, void *fd, void *data); int yahoo_write_ready(int id, void *fd, void *data); /* utility functions. these do not hit the server */ enum yahoo_status yahoo_current_status(int id); const YList *yahoo_get_buddylist(int id); const YList *yahoo_get_ignorelist(int id); const YList *yahoo_get_identities(int id); /* 'which' could be y, t, c or login. This may change in later versions. */ const char *yahoo_get_cookie(int id, const char *which); /* returns the url used to get user profiles - you must append the user id */ /* as of now this is http://profiles.yahoo.com/ */ /* You'll have to do urlencoding yourself, but see yahoo_httplib.h first */ const char *yahoo_get_profile_url(void); void yahoo_buddyicon_request(int id, const char *who); #include "yahoo_httplib.h" #ifdef __cplusplus } #endif #endif centerim-4.22.10/libyahoo2/Makefile.am0000644000175000001440000000057111473007750014336 00000000000000AM_CPPFLAGS = -DSTDC_HEADERS -DUSE_STRUCT_CALLBACKS -I$(top_srcdir)/connwrap noinst_LIBRARIES = liblibyahoo2.a noinst_HEADERS= yahoo2_callbacks.h yahoo_debug.h yahoo_httplib.h yahoo2_types.h yahoo_list.h yahoo_util.h yahoo2.h sha1.h yahoo_fn.h AUTOMAKE_OPTIONS = foreign liblibyahoo2_a_SOURCES = crypt.c libyahoo2.c sha1.c yahoo_list.c yahoo_httplib.c yahoo_util.c yahoo_fn.c centerim-4.22.10/libyahoo2/yahoo_util.h0000644000175000001440000000470111473007750014626 00000000000000/* * libyahoo2: yahoo_util.h * * Copyright (C) 2002-2004, Philip S Tellis * * 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 __YAHOO_UTIL_H__ #define __YAHOO_UTIL_H__ #if HAVE_CONFIG_H # include #endif #if HAVE_GLIB # include # define FREE(x) if(x) {g_free(x); x=NULL;} # define y_new g_new # define y_new0 g_new0 # define y_renew g_renew # define y_memdup g_memdup # define y_strsplit g_strsplit # define y_strfreev g_strfreev # ifndef strdup # define strdup g_strdup # endif # ifndef strncasecmp # define strncasecmp g_strncasecmp # define strcasecmp g_strcasecmp # endif # define snprintf g_snprintf # define vsnprintf g_vsnprintf #else # include # include # define FREE(x) if(x) {free(x); x=NULL;} # define y_new(type, n) (type *)malloc(sizeof(type) * (n)) # define y_new0(type, n) (type *)calloc((n), sizeof(type)) # define y_renew(type, mem, n) (type *)realloc(mem, n) void *y_memdup(const void *addr, int n); char **y_strsplit(char *str, char *sep, int nelem); void y_strfreev(char **vector); /* #ifndef _WIN32 int strncasecmp(const char *s1, const char *s2, size_t n); int strcasecmp(const char *s1, const char *s2); //char *strdup(const char *s); int snprintf(char *str, size_t size, const char *format, ...); int vsnprintf(char *str, size_t size, const char *format, va_list ap); #endif */ #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) #endif #ifndef MAX #define MAX(x,y) ((x)>(y)?(x):(y)) #endif /* * The following three functions return newly allocated memory. * You must free it yourself */ char *y_string_append(char *str, char *append); char *y_str_to_utf8(const char *in); char *y_utf8_to_str(const char *in); #endif centerim-4.22.10/libyahoo2/yahoo_util.c0000644000175000001440000000645311473007750014627 00000000000000/* * libyahoo2: yahoo_util.c * * Copyright (C) 2002-2004, Philip S Tellis * * 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 * */ #if HAVE_CONFIG_H # include #endif #if STDC_HEADERS # include #else # if !HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr(), *strrchr(); # if !HAVE_MEMCPY # define memcpy(d, s, n) bcopy ((s), (d), (n)) # define memmove(d, s, n) bcopy ((s), (d), (n)) # endif #endif #include "yahoo_util.h" char *y_string_append(char *string, char *append) { int size = strlen(string) + strlen(append) + 1; char *new_string = y_renew(char, string, size); if (new_string == NULL) { new_string = y_new(char, size); strcpy(new_string, string); FREE(string); } strcat(new_string, append); return new_string; } char *y_str_to_utf8(const char *in) { unsigned int n, i = 0; char *result = NULL; if (in == NULL || *in == '\0') return strdup(""); result = y_new(char, strlen(in) * 2 + 1); /* convert a string to UTF-8 Format */ for (n = 0; n < strlen(in); n++) { unsigned char c = (unsigned char)in[n]; if (c < 128) { result[i++] = (char)c; } else { result[i++] = (char)((c >> 6) | 192); result[i++] = (char)((c & 63) | 128); } } result[i] = '\0'; return result; } char *y_utf8_to_str(const char *in) { int i = 0; unsigned int n; char *result = NULL; if (in == NULL || *in == '\0') return strdup(""); result = y_new(char, strlen(in) + 1); /* convert a string from UTF-8 Format */ for (n = 0; n < strlen(in); n++) { unsigned char c = in[n]; if (c < 128) { result[i++] = (char)c; } else { result[i++] = (c << 6) | (in[++n] & 63); } } result[i] = '\0'; return result; } #if !HAVE_GLIB void y_strfreev(char **vector) { char **v; for (v = vector; *v; v++) { FREE(*v); } FREE(vector); } char **y_strsplit(char *str, char *sep, int nelem) { char **vector; char *s, *p; int i = 0; int l = strlen(sep); if (nelem <= 0) { char *s; nelem = 0; if (*str) { for (s = strstr(str, sep); s; s = strstr(s + l, sep), nelem++) ; if (strcmp(str + strlen(str) - l, sep)) nelem++; } } vector = y_new(char *, nelem + 1); for (p = str, s = strstr(p, sep); i < nelem && s; p = s + l, s = strstr(p, sep), i++) { int len = s - p; vector[i] = y_new(char, len + 1); strncpy(vector[i], p, len); vector[i][len] = '\0'; } if (i < nelem && *str) /* str didn't end with sep, and str isn't empty */ vector[i++] = strdup(p); vector[i] = NULL; return vector; } void *y_memdup(const void *addr, int n) { void *new_chunk = malloc(n); if (new_chunk) memcpy(new_chunk, addr, n); return new_chunk; } #endif centerim-4.22.10/libyahoo2/yahoo_list.c0000644000175000001440000001010611473007750014613 00000000000000/* * yahoo_list.c: linked list routines * * Some code copyright (C) 2002-2004, Philip S Tellis * Other code copyright Meredydd Luff * * 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 * * Some of this code was borrowed from elist.c in the eb-lite sources * */ #include #include "yahoo_list.h" YList *y_list_append(YList *list, void *data) { YList *n; YList *new_list = malloc(sizeof(YList)); YList *attach_to = NULL; new_list->next = NULL; new_list->data = data; for (n = list; n != NULL; n = n->next) { attach_to = n; } if (attach_to == NULL) { new_list->prev = NULL; return new_list; } else { new_list->prev = attach_to; attach_to->next = new_list; return list; } } YList *y_list_prepend(YList *list, void *data) { YList *n = malloc(sizeof(YList)); n->next = list; n->prev = NULL; n->data = data; if (list) list->prev = n; return n; } YList *y_list_concat(YList *list, YList *add) { YList *l; if (!list) return add; if (!add) return list; for (l = list; l->next; l = l->next) ; l->next = add; add->prev = l; return list; } YList *y_list_remove(YList *list, void *data) { YList *n; for (n = list; n != NULL; n = n->next) { if (n->data == data) { list = y_list_remove_link(list, n); y_list_free_1(n); break; } } return list; } /* Warning */ /* link MUST be part of list */ /* caller must free link using y_list_free_1 */ YList *y_list_remove_link(YList *list, const YList *link) { if (!link) return list; if (link->next) link->next->prev = link->prev; if (link->prev) link->prev->next = link->next; if (link == list) list = link->next; return list; } int y_list_length(const YList *list) { int retval = 0; const YList *n = list; for (n = list; n != NULL; n = n->next) { retval++; } return retval; } /* well, you could just check for list == NULL, but that would be * implementation dependent */ int y_list_empty(const YList *list) { if (!list) return 1; else return 0; } int y_list_singleton(const YList *list) { if (!list || list->next) return 0; return 1; } YList *y_list_copy(YList *list) { YList *n; YList *copy = NULL; for (n = list; n != NULL; n = n->next) { copy = y_list_append(copy, n->data); } return copy; } void y_list_free_1(YList *list) { free(list); } void y_list_free(YList *list) { YList *n = list; while (n != NULL) { YList *next = n->next; free(n); n = next; } } YList *y_list_find(YList *list, const void *data) { YList *l; for (l = list; l && l->data != data; l = l->next) ; return l; } void y_list_foreach(YList *list, YListFunc fn, void *user_data) { for (; list; list = list->next) fn(list->data, user_data); } YList *y_list_find_custom(YList *list, const void *data, YListCompFunc comp) { YList *l; for (l = list; l; l = l->next) if (comp(l->data, data) == 0) return l; return NULL; } YList *y_list_nth(YList *list, int n) { int i = n; for (; list && i; list = list->next, i--) ; return list; } YList *y_list_insert_sorted(YList *list, void *data, YListCompFunc comp) { YList *l, *n, *prev = NULL; if (!list) return y_list_append(list, data); n = malloc(sizeof(YList)); n->data = data; for (l = list; l && comp(l->data, n->data) <= 0; l = l->next) prev = l; if (l) { n->prev = l->prev; l->prev = n; } else n->prev = prev; n->next = l; if (n->prev) { n->prev->next = n; return list; } else { return n; } } centerim-4.22.10/libyahoo2/yahoo_debug.h0000644000175000001440000000275611473007750014747 00000000000000/* * libyahoo2: yahoo_debug.h * * Copyright (C) 2002-2004, Philip S Tellis * * 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 * */ extern int yahoo_log_message(char *fmt, ...); #define NOTICE(x) if(yahoo_get_log_level() >= YAHOO_LOG_NOTICE) { yahoo_log_message x; yahoo_log_message("\n"); } #define LOG(x) if(yahoo_get_log_level() >= YAHOO_LOG_INFO) { yahoo_log_message("%s:%d: ", __FILE__, __LINE__); \ yahoo_log_message x; \ yahoo_log_message("\n"); } #define WARNING(x) if(yahoo_get_log_level() >= YAHOO_LOG_WARNING) { yahoo_log_message("%s:%d: warning: ", __FILE__, __LINE__); \ yahoo_log_message x; \ yahoo_log_message("\n"); } #define DEBUG_MSG(x) if(yahoo_get_log_level() >= YAHOO_LOG_DEBUG) { yahoo_log_message("%s:%d: debug: ", __FILE__, __LINE__); \ yahoo_log_message x; \ yahoo_log_message("\n"); } centerim-4.22.10/libyahoo2/crypt.c0000644000175000001440000001452411473007750013612 00000000000000/* One way encryption based on MD5 sum. Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ /* warmenhoven took this file and made it work with the md5.[ch] we * already had. isn't that lovely. people should just use linux or * freebsd, crypt works properly on those systems. i hate solaris */ #if HAVE_CONFIG_H # include #endif #if HAVE_STRING_H # include #elif HAVE_STRINGS_H # include #endif #include #include "yahoo_util.h" #include "md5.h" /* Define our magic string to mark salt for MD5 "encryption" replacement. This is meant to be the same as for other MD5 based encryption implementations. */ static const char md5_salt_prefix[] = "$1$"; /* Table with characters for base64 transformation. */ static const char b64t[64] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; char *yahoo_crypt(char *key, char *salt) { char *buffer = NULL; int buflen = 0; int needed = 3 + strlen(salt) + 1 + 26 + 1; md5_byte_t alt_result[16]; md5_state_t ctx; md5_state_t alt_ctx; size_t salt_len; size_t key_len; size_t cnt; char *cp; if (buflen < needed) { buflen = needed; if ((buffer = realloc(buffer, buflen)) == NULL) return NULL; } /* Find beginning of salt string. The prefix should normally always be present. Just in case it is not. */ if (strncmp(md5_salt_prefix, salt, sizeof(md5_salt_prefix) - 1) == 0) /* Skip salt prefix. */ salt += sizeof(md5_salt_prefix) - 1; salt_len = MIN(strcspn(salt, "$"), 8); key_len = strlen(key); /* Prepare for the real work. */ md5_init(&ctx); /* Add the key string. */ md5_append(&ctx, (md5_byte_t *)key, key_len); /* Because the SALT argument need not always have the salt prefix we add it separately. */ md5_append(&ctx, (md5_byte_t *)md5_salt_prefix, sizeof(md5_salt_prefix) - 1); /* The last part is the salt string. This must be at most 8 characters and it ends at the first `$' character (for compatibility which existing solutions). */ md5_append(&ctx, (md5_byte_t *)salt, salt_len); /* Compute alternate MD5 sum with input KEY, SALT, and KEY. The final result will be added to the first context. */ md5_init(&alt_ctx); /* Add key. */ md5_append(&alt_ctx, (md5_byte_t *)key, key_len); /* Add salt. */ md5_append(&alt_ctx, (md5_byte_t *)salt, salt_len); /* Add key again. */ md5_append(&alt_ctx, (md5_byte_t *)key, key_len); /* Now get result of this (16 bytes) and add it to the other context. */ md5_finish(&alt_ctx, alt_result); /* Add for any character in the key one byte of the alternate sum. */ for (cnt = key_len; cnt > 16; cnt -= 16) md5_append(&ctx, alt_result, 16); md5_append(&ctx, alt_result, cnt); /* For the following code we need a NUL byte. */ alt_result[0] = '\0'; /* The original implementation now does something weird: for every 1 bit in the key the first 0 is added to the buffer, for every 0 bit the first character of the key. This does not seem to be what was intended but we have to follow this to be compatible. */ for (cnt = key_len; cnt > 0; cnt >>= 1) md5_append(&ctx, (cnt & 1) != 0 ? alt_result : (md5_byte_t *)key, 1); /* Create intermediate result. */ md5_finish(&ctx, alt_result); /* Now comes another weirdness. In fear of password crackers here comes a quite long loop which just processes the output of the previous round again. We cannot ignore this here. */ for (cnt = 0; cnt < 1000; ++cnt) { /* New context. */ md5_init(&ctx); /* Add key or last result. */ if ((cnt & 1) != 0) md5_append(&ctx, (md5_byte_t *)key, key_len); else md5_append(&ctx, alt_result, 16); /* Add salt for numbers not divisible by 3. */ if (cnt % 3 != 0) md5_append(&ctx, (md5_byte_t *)salt, salt_len); /* Add key for numbers not divisible by 7. */ if (cnt % 7 != 0) md5_append(&ctx, (md5_byte_t *)key, key_len); /* Add key or last result. */ if ((cnt & 1) != 0) md5_append(&ctx, alt_result, 16); else md5_append(&ctx, (md5_byte_t *)key, key_len); /* Create intermediate result. */ md5_finish(&ctx, alt_result); } /* Now we can construct the result string. It consists of three parts. */ strncpy(buffer, md5_salt_prefix, MAX(0, buflen)); cp = buffer + strlen(buffer); buflen -= sizeof(md5_salt_prefix); strncpy(cp, salt, MIN((size_t) buflen, salt_len)); cp = cp + strlen(cp); buflen -= MIN((size_t) buflen, salt_len); if (buflen > 0) { *cp++ = '$'; --buflen; } #define b64_from_24bit(B2, B1, B0, N) \ do { \ unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ int n = (N); \ while (n-- > 0 && buflen > 0) { \ *cp++ = b64t[w & 0x3f]; \ --buflen; \ w >>= 6; \ }\ } while (0) b64_from_24bit(alt_result[0], alt_result[6], alt_result[12], 4); b64_from_24bit(alt_result[1], alt_result[7], alt_result[13], 4); b64_from_24bit(alt_result[2], alt_result[8], alt_result[14], 4); b64_from_24bit(alt_result[3], alt_result[9], alt_result[15], 4); b64_from_24bit(alt_result[4], alt_result[10], alt_result[5], 4); b64_from_24bit(0, 0, alt_result[11], 2); if (buflen <= 0) { FREE(buffer); } else *cp = '\0'; /* Terminate the string. */ /* Clear the buffer for the intermediate result so that people attaching to processes or reading core dumps cannot get any information. We do it in this way to clear correct_words[] inside the MD5 implementation as well. */ md5_init(&ctx); md5_finish(&ctx, alt_result); memset(&ctx, '\0', sizeof(ctx)); memset(&alt_ctx, '\0', sizeof(alt_ctx)); return buffer; } centerim-4.22.10/libyahoo2/yahoo_httplib.c0000644000175000001440000002114611473007750015314 00000000000000/* * libyahoo2: yahoo_httplib.c * * Copyright (C) 2002-2004, Philip S Tellis * * 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 * */ #if HAVE_CONFIG_H # include #endif #include #include #if STDC_HEADERS # include #else # if !HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr(), *strrchr(); # if !HAVE_MEMCPY # define memcpy(d, s, n) bcopy ((s), (d), (n)) # define memmove(d, s, n) bcopy ((s), (d), (n)) # endif #endif #include #if HAVE_UNISTD_H #include #endif #include #include "yahoo2.h" #include "yahoo2_callbacks.h" #include "yahoo_httplib.h" #include "yahoo_util.h" #include "yahoo_debug.h" #ifdef __MINGW32__ # include # define snprintf _snprintf #endif extern struct yahoo_callbacks *yc; #define YAHOO_CALLBACK(x) yc->x extern enum yahoo_log_level log_level; int yahoo_tcp_readline(char *ptr, int maxlen, void *fd) { int n, rc; char c; for (n = 1; n < maxlen; n++) { do { rc = YAHOO_CALLBACK(ext_yahoo_read) (fd, &c, 1); } while (rc == -1 && (errno == EINTR || errno == EAGAIN)); /* this is bad - it should be done asynchronously */ if (rc == 1) { if (c == '\r') /* get rid of \r */ continue; *ptr = c; if (c == '\n') break; ptr++; } else if (rc == 0) { if (n == 1) return (0); /* EOF, no data */ else break; /* EOF, w/ data */ } else { return -1; } } *ptr = 0; return (n); } static int url_to_host_port_path(const char *url, char *host, int *port, char *path, int *ssl) { char *urlcopy = NULL; char *slash = NULL; char *colon = NULL; /* * http://hostname * http://hostname/ * http://hostname/path * http://hostname/path:foo * http://hostname:port * http://hostname:port/ * http://hostname:port/path * http://hostname:port/path:foo * and https:// variants of the above */ if (strstr(url, "http://") == url) { urlcopy = strdup(url + 7); } else if (strstr(url, "https://") == url) { urlcopy = strdup(url + 8); *ssl = 1; } else { WARNING(("Weird url - unknown protocol: %s", url)); return 0; } slash = strchr(urlcopy, '/'); colon = strchr(urlcopy, ':'); if (!colon || (slash && slash < colon)) { if (*ssl) *port = 443; else *port = 80; } else { *colon = 0; *port = atoi(colon + 1); } if (!slash) { strcpy(path, "/"); } else { strcpy(path, slash); *slash = 0; } strcpy(host, urlcopy); FREE(urlcopy); return 1; } static int isurlchar(unsigned char c) { return (isalnum(c)); } char *yahoo_urlencode(const char *instr) { int ipos = 0, bpos = 0; char *str = NULL; int len = strlen(instr); if (!(str = y_new(char, 3 *len + 1))) return ""; while (instr[ipos]) { while (isurlchar(instr[ipos])) str[bpos++] = instr[ipos++]; if (!instr[ipos]) break; snprintf(&str[bpos], 4, "%%%02x", instr[ipos] & 0xff); bpos += 3; ipos++; } str[bpos] = '\0'; /* free extra alloc'ed mem. */ len = strlen(str); str = y_renew(char, str, len + 1); return (str); } char *yahoo_urldecode(const char *instr) { int ipos = 0, bpos = 0; char *str = NULL; char entity[3] = { 0, 0, 0 }; unsigned dec; int len = strlen(instr); if (!(str = y_new(char, len + 1))) return ""; while (instr[ipos]) { while (instr[ipos] && instr[ipos] != '%') if (instr[ipos] == '+') { str[bpos++] = ' '; ipos++; } else str[bpos++] = instr[ipos++]; if (!instr[ipos]) break; if (instr[ipos + 1] && instr[ipos + 2]) { ipos++; entity[0] = instr[ipos++]; entity[1] = instr[ipos++]; sscanf(entity, "%2x", &dec); str[bpos++] = (char)dec; } else { str[bpos++] = instr[ipos++]; } } str[bpos] = '\0'; /* free extra alloc'ed mem. */ len = strlen(str); str = y_renew(char, str, len + 1); return (str); } char *yahoo_xmldecode(const char *instr) { int ipos = 0, bpos = 0, epos = 0; char *str = NULL; char entity[4] = { 0, 0, 0, 0 }; char *entitymap[5][2] = { {"amp;", "&"}, {"quot;", "\""}, {"lt;", "<"}, {"gt;", "<"}, {"nbsp;", " "} }; unsigned dec; int len = strlen(instr); if (!(str = y_new(char, len + 1))) return ""; while (instr[ipos]) { while (instr[ipos] && instr[ipos] != '&') if (instr[ipos] == '+') { str[bpos++] = ' '; ipos++; } else str[bpos++] = instr[ipos++]; if (!instr[ipos] || !instr[ipos + 1]) break; ipos++; if (instr[ipos] == '#') { ipos++; epos = 0; while (instr[ipos] != ';') entity[epos++] = instr[ipos++]; sscanf(entity, "%u", &dec); str[bpos++] = (char)dec; ipos++; } else { int i; for (i = 0; i < 5; i++) if (!strncmp(instr + ipos, entitymap[i][0], strlen(entitymap[i][0]))) { str[bpos++] = entitymap[i][1][0]; ipos += strlen(entitymap[i][0]); break; } } } str[bpos] = '\0'; /* free extra alloc'ed mem. */ len = strlen(str); str = y_renew(char, str, len + 1); return (str); } typedef void (*http_connected) (int id, void *fd, int error); struct callback_data { int id; yahoo_get_fd_callback callback; char *request; void *user_data; }; static void connect_complete(void *fd, int error, void *data) { struct callback_data *ccd = data; if (error == 0) YAHOO_CALLBACK(ext_yahoo_write) (fd, ccd->request, strlen(ccd->request)); free(ccd->request); ccd->callback(ccd->id, fd, error, ccd->user_data); FREE(ccd); } static void yahoo_send_http_request(int id, char *host, int port, char *request, yahoo_get_fd_callback callback, void *data, int use_ssl) { struct callback_data *ccd = y_new0(struct callback_data, 1); ccd->callback = callback; ccd->id = id; ccd->request = strdup(request); ccd->user_data = data; YAHOO_CALLBACK(ext_yahoo_connect_async) (id, host, port, connect_complete, ccd, use_ssl); } void yahoo_http_post(int id, const char *url, const char *cookies, long content_length, yahoo_get_fd_callback callback, void *data) { char host[255]; int port = 80; char path[255]; char buff[1024]; int ssl = 0; if (!url_to_host_port_path(url, host, &port, path, &ssl)) return; /* thanks to kopete dumpcap */ snprintf(buff, sizeof(buff), "POST %s HTTP/1.1\r\n" "Cookie: %s\r\n" "User-Agent: Mozilla/5.0\r\n" "Host: %s\r\n" "Content-Length: %ld\r\n" "Cache-Control: no-cache\r\n" "\r\n", path, cookies, host, content_length); yahoo_send_http_request(id, host, port, buff, callback, data, ssl); } void yahoo_http_get(int id, const char *url, const char *cookies, int http11, int keepalive, yahoo_get_fd_callback callback, void *data) { char host[255]; int port = 80; char path[255]; char buff[2048]; char cookiebuff[1024]; int ssl = 0; if (!url_to_host_port_path(url, host, &port, path, &ssl)) return; /* Allow cases when we don't need to send a cookie */ if (cookies) snprintf(cookiebuff, sizeof(cookiebuff), "Cookie: %s\r\n", cookies); else cookiebuff[0] = '\0'; snprintf(buff, sizeof(buff), "GET %s HTTP/1.%s\r\n" "%sHost: %s\r\n" "User-Agent: Mozilla/4.5 [en] (" PACKAGE "/" VERSION ")\r\n" "Accept: */*\r\n" "%s" "\r\n", path, http11?"1":"0", cookiebuff, host, keepalive? "Connection: Keep-Alive\r\n":"Connection: close\r\n"); yahoo_send_http_request(id, host, port, buff, callback, data, ssl); } void yahoo_http_head(int id, const char *url, const char *cookies, int len, char *payload, yahoo_get_fd_callback callback, void *data) { char host[255]; int port = 80; char path[255]; char buff[2048]; char cookiebuff[1024]; int ssl = 0; if (!url_to_host_port_path(url, host, &port, path, &ssl)) return; /* Allow cases when we don't need to send a cookie */ if (cookies) snprintf(cookiebuff, sizeof(cookiebuff), "Cookie: %s\r\n", cookies); else cookiebuff[0] = '\0'; snprintf(buff, sizeof(buff), "HEAD %s HTTP/1.0\r\n" "Accept: */*\r\n" "Host: %s:%d\r\n" "User-Agent: Mozilla/4.5 [en] (" PACKAGE "/" VERSION ")\r\n" "%s" "Content-Length: %d\r\n" "Cache-Control: no-cache\r\n" "\r\n%s", path, host, port, cookiebuff, len, payload?payload:""); yahoo_send_http_request(id, host, port, buff, callback, data, ssl); } centerim-4.22.10/kkstrtext/0000755000175000001440000000000011473011456012530 500000000000000centerim-4.22.10/kkstrtext/Makefile.in0000644000175000001440000003621311473011437014521 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = kkstrtext DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libkkstrtext_a_AR = $(AR) $(ARFLAGS) libkkstrtext_a_LIBADD = am_libkkstrtext_a_OBJECTS = kkstrtext.$(OBJEXT) libkkstrtext_a_OBJECTS = $(am_libkkstrtext_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libkkstrtext_a_SOURCES) DIST_SOURCES = $(libkkstrtext_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CXXFLAGS = -Wno-write-strings noinst_LIBRARIES = libkkstrtext.a libkkstrtext_a_SOURCES = kkstrtext.cc noinst_HEADERS = kkstrtext.h conf.h AUTOMAKE_OPTIONS = foreign all: all-am .SUFFIXES: .SUFFIXES: .cc .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kkstrtext/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign kkstrtext/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libkkstrtext.a: $(libkkstrtext_a_OBJECTS) $(libkkstrtext_a_DEPENDENCIES) -rm -f libkkstrtext.a $(libkkstrtext_a_AR) libkkstrtext.a $(libkkstrtext_a_OBJECTS) $(libkkstrtext_a_LIBADD) $(RANLIB) libkkstrtext.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kkstrtext.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/kkstrtext/Makefile.am0000644000175000001440000000025211461606612014504 00000000000000AM_CXXFLAGS = -Wno-write-strings noinst_LIBRARIES = libkkstrtext.a libkkstrtext_a_SOURCES = kkstrtext.cc noinst_HEADERS = kkstrtext.h conf.h AUTOMAKE_OPTIONS = foreign centerim-4.22.10/kkstrtext/conf.h0000644000175000001440000000146311461606612013553 00000000000000#ifndef __KONST_CONF_H__ #define __KONST_CONF_H__ #ifdef HAVE_CONFIG_H #include #endif #if defined(__sgi) && !defined(__GNUC__) && (_COMPILER_VERSION >= 721) && defined(_NAMESPACES) #define __KTOOL_USE_NAMESPACES #endif #if defined(__COMO__) #define __KTOOL_USE_NAMESPACES #endif #ifdef __GNUC__ #ifdef HAVE__G_CONFIG_H #include <_G_config.h> #endif #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 9) #else #define __KTOOL_USE_NAMESPACES #endif #endif #ifdef __KTOOL_USE_NAMESPACES #define __KTOOL_BEGIN_NAMESPACE namespace ktool { #define __KTOOL_END_NAMESPACE } using namespace std; #else #define __KTOOL_BEGIN_NAMESPACE #define __KTOOL_END_NAMESPACE #endif #define __KTOOL_BEGIN_C extern "C" { #define __KTOOL_END_C } #endif centerim-4.22.10/kkstrtext/kkstrtext.cc0000644000175000001440000006065511461606612015037 00000000000000/* * * kkstrtext string related and text processing routines * $Id: kkstrtext.cc,v 1.45 2005/02/01 00:13:24 konst Exp $ * * Copyright (C) 1999-2004 by Konstantin Klyagin * * 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 "kkstrtext.h" #include #ifdef HAVE_STDINT_H #include /* for intptr_t */ #endif char *strcut(char *strin, int frompos, int count) { if(count > 0) { if(count > strlen(strin)-frompos) count = strlen(strin)-frompos; char *buf = (char *) malloc(strlen(strin) - frompos - count + 1); memcpy(buf, strin + frompos + count, strlen(strin) - frompos - count); memcpy(strin + frompos, buf, strlen(strin) - frompos - count); strin[strlen(strin) - count] = 0; free(buf); } return strin; } char *strimlead(char *str) { return trimlead(str, " \t"); } char *strimtrail(char *str) { return trimtrail(str, " \t"); } char *strim(char *str) { return trim(str, " \t"); } char *trimlead(char *str, char *chr) { while(strchr(chr, str[0]) && strlen(str)) strcpy(str, str + 1); return str; } char *trimtrail(char *str, char *chr) { while(strlen(str) && strchr(chr, str[strlen(str)-1])) str[strlen(str)-1] = 0; return str; } char *trim(char *str, char *chr) { return trimlead(trimtrail(str, chr), chr); } char *time2str(const time_t *t, char *mask, char *sout) { struct tm *s; char ch, b[10], b1[20]; int len, i, j; sout[0] = 0; s = localtime(t); for(i = 0; i < strlen(mask); i++) { len = 0; if(strchr("DMYhms", ch = mask[i])) { j = i; len = 1; while(mask[++j] == ch) len++; sprintf(b, "%%0%dd", len); i += len-1; switch(ch) { case 'D': sprintf(b1, b, s->tm_mday); break; case 'M': sprintf(b1, b, s->tm_mon+1); break; case 'Y': j = s->tm_year + 1900; sprintf(b1, b, j); if(len <= 3) strcut(b1, 0, 2); break; case 'h': sprintf(b1, b, s->tm_hour); break; case 'm': sprintf(b1, b, s->tm_min); break; case 's': sprintf(b1, b, s->tm_sec); break; } strcat(sout, b1); } else { len = strlen(sout); sout[len+1] = 0; sout[len] = mask[i]; } } return sout; } time_t str2time(char *sdate, char *mask, time_t *t) { struct tm *s; int i, len, j, k; char ch, b[10]; s = (struct tm*) malloc(sizeof(struct tm)); for(i = 0; i < strlen(mask); i++) { len = 0; if(strchr("DMYhms", ch = mask[i])) { j = i; len = 1; while(mask[++j] == ch) len++; i += len-1; b[0] = 0; for(j = i-len+1; j < i+1; j++) { k = strlen(b); b[k+1] = 0; b[k] = sdate[j]; } switch(ch) { case 'D': s->tm_mday=atoi(b); break; case 'M': s->tm_mon=atoi(b); s->tm_mon--; break; case 'Y': s->tm_year=atoi(b); s->tm_year-=1900; break; case 'h': s->tm_hour=atoi(b); s->tm_hour--; break; case 'm': s->tm_min=atoi(b); break; case 's': s->tm_sec=atoi(b); break; } } } s->tm_isdst = -1; *t = mktime(s); free(s); return *t; } string unmime(const string &text) { string r; char *buf = new char[text.size()+1]; strcpy(buf, text.c_str()); r = unmime(buf); delete[] buf; return r; } string mime(const string &text) { string r; char *buf = new char[text.size()*3+1]; r = mime(buf, text.c_str()); delete[] buf; return r; } string fromutf8(const string &text) { string r; char *buf = (char *) utf8_to_str(text.c_str()); r = buf; delete buf; return r; } string toutf8(const string &text) { string r; char *buf = str_to_utf8(text.c_str()); r = buf; delete buf; return r; } char *unmime(char *text) { register int s, d; int htm; for(s = 0, d = 0; text[s] != 0; s++) { if(text[s] == '+') text[d++] = ' '; else if(text[s] == '%') { sscanf(text + s + 1, "%2x", &htm); text[d++] = htm; s += 2; } else text[d++] = text[s]; } text[d] = 0; return(text); } char *mime(char *dst, const char *src) { register int s, d; char c; for(s = 0, d = 0; src[s]; s++) { if((src[s] >= 'a' && src[s] <= 'z') || (src[s] >= 'A' && src[s] <= 'Z') || (src[s] >= '0' && src[s] <= '9')) dst[d++] = src[s]; else { if(src[s] != ' ') { dst[d++] = '%'; c = (src[s] >> 4 & 0x0F); dst[d++] = (c > 9) ? 'A'+c-10 : '0'+c; c = (src[s] & 0x0F); dst[d++] = (c > 9) ? 'A'+c-10 : '0'+c; } else dst[d++] = '+'; } } dst[d] = '\0'; return(dst); } char *strccat(char *dest, char c) { int k = strlen(dest); dest[k] = c; dest[k+1] = 0; return dest; } vector getquotelayout(const string &haystack, const string &qs, const string &aescs) { vector r; string needle, escs; int pos, prevpos, curpos; char cchar, qchar, prevchar; qchar = 0; curpos = prevpos = 0; escs = (qs == aescs) ? "" : aescs; needle = qs + escs; while((pos = haystack.substr(curpos).find_first_of(needle)) != -1) { curpos += pos; cchar = *(haystack.begin()+curpos); if(escs.find(cchar) != -1) { if(qchar) if(prevpos == curpos-1) if(escs.find(prevchar) != -1) { /* Neutralize previous esc char */ cchar = 0; } } else if(qs.find(cchar) != -1) { if(!((escs.find(prevchar) != -1) && (prevpos == curpos-1))) { /* Wasn't an escape (right before this quote char) */ if(!qchar || (qchar == cchar)) { qchar = qchar ? 0 : cchar; r.push_back(curpos); } } } prevpos = curpos++; prevchar = cchar; } return r; } vector getsymbolpositions(const string &haystack, const string &needles, const string &qoutes, const string &esc) { vector r, qp, nr; vector::iterator iq, ir; int pos, st, ed, cpos; for(cpos = 0; (pos = haystack.substr(cpos).find_first_of(needles)) != -1; ) { r.push_back(cpos+pos); cpos += pos+1; } qp = getquotelayout(haystack, qoutes, esc); for(iq = qp.begin(); iq != qp.end(); iq++) { if(!((iq-qp.begin()) % 2)) { st = *iq; ed = iq+1 != qp.end() ? *(iq+1) : haystack.size(); nr.clear(); for(ir = r.begin(); ir != r.end(); ir++) { if(!(*ir > st && *ir < ed)) { nr.push_back(*ir); } } r = nr; } } return r; } #define CHECKESC(curpos, startpos, esc) \ if(curpos > startpos+1) \ if(strchr(esc, *(curpos-1))) \ if(!strchr(esc, *(curpos-2))) { \ curpos++; \ continue; \ } const char *strqpbrk(const char *s, int offset, const char *accept, const char *q, const char *esc) { if(!s) return 0; if(!s[0]) return 0; char qchar = 0; const char *ret = 0, *p = s; char *cset = (char *) malloc(strlen(accept)+strlen(q)+1); strcpy(cset, accept); strcat(cset, q); while(p = strpbrk(p, cset)) { if(strchr(q, *p)) { if(strcmp(esc, q)) CHECKESC(p, s, esc); if(!qchar) { qchar = *p; } else { if(*p == qchar) qchar = 0; } } else if((p-s >= offset) && !qchar) { ret = p; break; } p++; } free(cset); return ret; } const char *strqcasestr(const char *s, const char *str, const char *q, const char *esc) { char quote = 0; int i; for(i = 0; i < strlen(s); i++) { if(strchr(q, s[i])) { if(strcmp(esc, q)) CHECKESC(s+i, s, esc); quote = !quote; } if(!quote) if(!strncasecmp(s + i, str, strlen(str))) return s + i; } return 0; } const char *strqstr(const char *s, const char *str, const char *q, const char *esc) { char quote; const char *ret = 0, *p, *ss, *r; p = ss = s; while(p = strstr(ss, str)) { quote = 0; r = s; while(r = strpbrk(r, q)) { if(r > p) break; if(strcmp(esc, q)) CHECKESC(r, s, esc); quote = !quote; r++; } if(!quote) { ret = p; break; } else { ss = p+strlen(str); } } return ret; } char *strinsert(char *buf, int pos, char *ins) { char *p = strdup(buf+pos); memcpy(buf+pos+strlen(ins), p, strlen(p)+1); memcpy(buf+pos, ins, strlen(ins)); free(p); return buf; } char *strcinsert(char *buf, int pos, char ins) { char *p = strdup(buf+pos); memcpy(buf+pos+1, p, strlen(p)+1); buf[pos] = ins; free(p); return buf; } int strchcount(char *s, char *accept) { char *p = s-1; int ret = 0; while(p = strpbrk(p+1, accept)) ret++; return ret; } int stralone(char *buf, char *startword, int wordlen, char *delim) { int leftdelim = 0, rightdelim = 0; leftdelim = (buf != startword && strchr(delim, *(startword-1))) || buf == startword; rightdelim = !*(startword+wordlen) || strchr(delim, *(startword+wordlen)); return leftdelim && rightdelim; } string justfname(const string &fname) { return fname.substr(fname.rfind("/")+1); } string justpathname(const string &fname) { int pos; if((pos = fname.rfind("/")) != -1) { return fname.substr(0, pos); } else { return ""; } } void charpointerfree(void *p) { char *cp = (char *) p; if(cp) free (cp); } void nothingfree(void *p) { } int stringcompare(void *s1, void *s2) { if(!s1 || !s2) { return s1 != s2; } else { return strcmp((char *) s1, (char *) s2); } } int intcompare(void *s1, void *s2) { return (intptr_t) s1 != (intptr_t) s2; } string i2str(int i) { char buf[64]; sprintf(buf, "%d", i); return (string) buf; } string ui2str(int i) { char buf[64]; sprintf(buf, "%du", i); return (string) buf; } string textscreen(const string &text) { string r = text; for(int i = 0; i < r.size(); i++) { if(!isalnum(r[i])) r.insert(i++, "\\"); } return r; } string leadcut(const string &base, const string &delim) { int pos = base.find_first_not_of(delim); return (pos != -1) ? base.substr(pos) : ""; } string trailcut(const string &base, const string &delim) { int pos = base.find_last_not_of(delim); return (pos != -1) ? base.substr(0, pos+1) : ""; } string getword(string &base, const string &delim) { string sub; int i; bool found = false; base = leadcut(base, delim); for(i = 0, sub = base; i < sub.size(); i++) if(strchr(delim.c_str(), sub[i])) { sub.resize(i); base.replace(0, i, ""); base = leadcut(base, delim); found = true; break; } if(!found) base = ""; return sub; } const string getwordquote(string &base, string quote, string delim) { string sub; bool inquote = false; int i; base = leadcut(base, delim); for(i = 0, sub = base; i < sub.size(); i++) { if(strchr(quote.c_str(), sub[i])) { inquote = !inquote; } else if(!inquote && strchr(delim.c_str(), sub[i])) { sub.resize(i); base.replace(0, i, ""); base = leadcut(base, delim); break; } } if(sub == base) base = ""; return sub; } string getrword(string &base, const string &delim) { string sub; int i; base = trailcut(base, delim); for(i = base.size()-1, sub = base; i >= 0; i--) if(strchr(delim.c_str(), base[i])) { sub = base.substr(i+1); base.resize(i); base = trailcut(base, delim); break; } if(sub == base) base = ""; return sub; } string getrwordquote(string &base, const string "e, const string &delim) { string sub; bool inquote = false; int i; base = trailcut(base, delim); for(i = base.size()-1, sub = base; i >= 0; i--) if(strchr(quote.c_str(), base[i])) { inquote = !inquote; } else if(!inquote && strchr(delim.c_str(), base[i])) { sub = base.substr(i+1); base.resize(i); base = trailcut(base, delim); break; } if(sub == base) base = ""; return sub; } int rtabmargin(bool fake, int curpos, const char *p) { int ret = -1, n, near; if(p && (curpos != strlen(p))) { n = strspn(p+curpos, " "); if(fake) { near = ((curpos/(TAB_SIZE/2))+1)*(TAB_SIZE/2); if(n >= near-curpos) ret = near; } near = ((curpos/TAB_SIZE)+1)*TAB_SIZE; if(n >= near-curpos) ret = near; } else { if(p && fake) fake = (strspn(p, " ") == strlen(p)); if(fake) ret = ((curpos/(TAB_SIZE/2))+1)*(TAB_SIZE/2); else ret = ((curpos/TAB_SIZE)+1)*TAB_SIZE; } return ret; } int ltabmargin(bool fake, int curpos, const char *p) { int ret = -1, near, n = 0; const char *cp; if(p) { cp = p+curpos; if(curpos) { if(*(--cp) == ' ') n++; for(; (*cp == ' ') && (cp != p); cp--) n++; } if(fake) { near = (curpos/(TAB_SIZE/2))*(TAB_SIZE/2); if(near <= curpos-n) if((ret = curpos-n) != 0) ret++; } near = (curpos/TAB_SIZE)*TAB_SIZE; if(near <= curpos-n) { if((ret = curpos-n) != 0) ret++; } else ret = near; } else { if(fake) ret = (curpos/(TAB_SIZE/2))*(TAB_SIZE/2); else ret = (curpos/TAB_SIZE)*TAB_SIZE; } return ret; } void breakintolines(string text, vector &lst, int linelen) { int dpos, nlen; string sub; vector::iterator i; breakintolines(text, lst); if(linelen > 0) { for(i = lst.begin(); i != lst.end(); i++) { if(i->size() > linelen) { sub = i->substr(0, nlen = linelen); if((dpos = sub.rfind(" ")) != -1) { if(dpos) nlen = dpos; else nlen = 1; } if(dpos != -1) nlen++; sub = i->substr(nlen); i->erase(nlen); lst.insert(i+1, sub); i = lst.begin(); } } } } void breakintolines(const string &text, vector &lst) { int npos, dpos, tpos; string sub; tpos = 0; lst.clear(); while(tpos < text.size()) { if((npos = text.find("\n", tpos)) != -1) { sub = text.substr(tpos, npos-tpos); } else { sub = text.substr(tpos); npos = text.size(); } tpos += npos-tpos+1; for(dpos = 0; (dpos = sub.find("\r", dpos)) != -1; ) { sub.erase(dpos, 1); } for(dpos = 0; (dpos = sub.find("\t", dpos)) != -1; ) { sub.erase(dpos, 1); sub.insert(dpos, string(rtabmargin(false, dpos)-dpos, ' ')); } lst.push_back(sub); } } void find_gather_quoted(vector &lst, const string &str, const string "e, const string &escape) { bool inquote = false; int npos = 0, qch; quotedblock qb; while((npos = str.find_first_of(quote, npos)) != -1) { if(npos) if(escape.find(str[npos-1]) == -1) { inquote = !inquote; if(inquote) { qb.begin = npos; qch = str[npos]; } else { if(str[npos] == qch) { qb.end = npos; lst.push_back(qb); } else { inquote = true; } } } npos++; } } int find_quoted(const string &str, const string &needle, int offs, const string "e, const string &escape) { vector positions; vector::iterator qi; int npos = offs; bool found; find_gather_quoted(positions, str, quote, escape); while((npos = str.find(needle, npos)) != -1) { for(found = false, qi = positions.begin(); qi != positions.end() && !found; qi++) if((npos > qi->begin) && (npos < qi->end)) found = true; if(!found) break; npos++; } return !found ? npos : -1; } int find_quoted_first_of(const string &str, const string &needle, int offs, const string "e, const string &escape) { vector positions; vector::iterator qi; int npos = offs; bool found; find_gather_quoted(positions, str, quote, escape); while((npos = str.find_first_of(needle, npos)) != -1) { for(found = false, qi = positions.begin(); qi != positions.end() && !found; qi++) if((npos > qi->begin) && (npos < qi->end)) found = true; if(!found) break; npos++; } return !found ? npos : -1; } void splitlongtext(string text, vector &lst, int size, const string cont) { string sub; int npos; lst.clear(); while(!text.empty()) { if(text.size() <= size-cont.size()) { npos = text.size(); } else if((npos = text.substr(0, size-cont.size()).find_last_of(" \t")) == -1) { npos = size-cont.size(); } sub = text.substr(0, npos); text.erase(0, npos); if(text.size() > cont.size()) sub += cont; else { sub += text; text = ""; } if((npos = text.find_first_not_of(" \t")) != -1) text.erase(0, npos); lst.push_back(sub); } } string strdateandtime(time_t stamp, const string &fmt) { return strdateandtime(localtime(&stamp), fmt); } string strdateandtime(struct tm *tms, const string &fmt) { char buf[512]; /*time_t current_time = time(0);*/ /*time_t when = mktime(tms);*/ string afmt = fmt; if(afmt.empty()) { afmt = "%b %e %Y %H:%M"; /* if(current_time > when + 6L * 30L * 24L * 60L * 60L // Old. || current_time < when - 60L * 60L) { // Future. afmt = "%b %e %Y"; } else { afmt = "%b %e %H:%M"; } */ } strftime(buf, 512, afmt.c_str(), tms); return buf; } bool iswholeword(const string &s, int so, int eo) { bool rm, lm; const string wdelims = "[](),.; <>-+{}=|&%~*/:?@"; lm = !so || (wdelims.find(s.substr(so-1, 1)) != -1); rm = (eo == s.size()-1) || (wdelims.find(s.substr(eo, 1)) != -1); return rm && lm; } int hex2int(const string &ahex) { int r, i; r = 0; if(ahex.size() <= 2) { for(i = 0; i < ahex.size(); i++) { r += isdigit(ahex[i]) ? ahex[i]-48 : toupper(ahex[i])-55; if(!i) r *= 16; } } return r; } bool getconf(string &st, string &buf, ifstream &f, bool passemptylines) { bool ret = false; static string sect; while(!f.eof() && !ret) { getstring(f, buf); if(buf.size()) { switch(buf[0]) { case '%': sect = buf.substr(1); break; case '#': if(buf[1] != '!') break; default: ret = buf.size(); break; } } else if(passemptylines) { ret = 1; } } st = sect; return ret; } bool getstring(istream &f, string &sbuf) { static char buf[2048]; bool r; if(r = !f.eof()) { sbuf = ""; do { f.clear(); f.getline(buf, 2048); sbuf += buf; } while(!f.good() && !f.eof()); } return r; } string ruscase(const string &s, const string &mode) { static const string lower = "ÃÂ×ÇÄÅÖÚÉÊËÌÃÃŽÃÃÒÓÔÕÆÈÃÞÛÃØßÙÜÀÑ"; static const string upper = "áâ÷çäåöúéêëìíîïðòóôõæèãþûýøÿùüàñ"; string r, tfrom, tto; int pos, tpos; if(mode == "tolower") { tfrom = upper; tto = lower; } else if(mode == "toupper") { tfrom = lower; tto = upper; } else { return s; } pos = 0; for(r = s; (pos = r.find_first_of(tfrom, pos)) != -1; ) { char c = r[pos]; tpos = tfrom.find(c); r[pos] = tto[tpos]; pos++; } pos = 0; while((pos = r.find_first_not_of(tfrom, pos)) != -1) { if(mode == "tolower") r[pos] = tolower(r[pos]); else if(mode == "toupper") r[pos] = toupper(r[pos]); pos++; } return r; } string siconv(const string &atext, const string &fromcs, const string &tocs) { #ifdef HAVE_ICONV iconv_t cd = iconv_open(tocs.c_str(), fromcs.c_str()); if(cd != ((iconv_t) -1)) { string r, text(atext); size_t inleft, outleft, soutleft; char *inbuf, *outbuf, *sinbuf, *soutbuf; //from iconv.c (libiconv) iconv(cd,NULL,NULL,NULL,NULL); size_t len = text.size(); sinbuf = inbuf = (char *)malloc(len+1); memcpy(sinbuf, text.c_str(), len+1); inleft = len; while (inleft > 0) { soutleft = outleft = inleft*4; soutbuf = outbuf = new char[outleft]; size_t res = iconv(cd, (ICONV_CONST char **) &inbuf, &inleft, &outbuf, &outleft); soutbuf[soutleft-outleft] = 0; r += soutbuf; delete[] soutbuf; if ((res == (size_t)(-1)) && (errno != EILSEQ)) { break; } if (inleft>0) { inbuf++; inleft--; } } free(sinbuf); iconv_close(cd); return r; } #endif return atext; } string cuthtml(const string &html, int flags) { string r, tag, buf, token; int npos, pos, tpos; for(pos = 0; (npos = html.find("<", pos)) != -1; pos = npos) { tpos = npos; r += html.substr(pos, npos-pos); if((npos = html.find(">", ++npos)) != -1) { npos++; tag = html.substr(tpos+1, npos-tpos-2); if(tag.substr(0, 1) == "/") tag.erase(0, 1); tag = leadcut(trailcut(tag, "/ \n\r"), "/ \n\r"); buf = ruscase(tag, "toupper"); token = getword(buf); if(token == "BR") r += (flags & chCutBR) ? "\n" : "
"; else if((flags & chCutBR) && token == "P") r += "\n\n"; if(flags & chLeaveLinks) { getword(tag); if(token == "A") { if((tpos = buf.find("HREF")) != -1) if((tpos = buf.substr(tpos).find("\"")) != -1) { tag.erase(0, tpos+1); r += "[ href: " + getword(tag, "\"") + " ] "; } } else if(token == "IMG") { if((tpos = buf.find("SRC")) != -1) if((tpos = buf.substr(tpos).find("\"")) != -1) { tag.erase(0, tpos+1); r += " [ img: " + getword(tag, "\"") + " ]"; } } } } else { r += html.substr(tpos); npos = html.size(); } } if(pos < html.size()) r += html.substr(pos); return r; } char *utf8_to_str(const char *pin) { int n = 0, i = 0, inlen; unsigned char *result; const unsigned char *in = (unsigned char *) pin; if(!in) return NULL; inlen = strlen(pin); result = new unsigned char[inlen + 1]; while (n <= inlen - 1) { long c = (long)in[n]; if(c < 0x80) result[i++] = (char)c; else { if((c & 0xC0) == 0xC0) result[i++] = (char)(((c & 0x03) << 6) | (((unsigned char)in[++n]) & 0x3F)); else if ((c & 0xE0) == 0xE0) { if (n + 2 <= inlen) { result[i] = (char)(((c & 0xF) << 4) | (((unsigned char)in[++n]) & 0x3F)); result[i] = (char)(((unsigned char)result[i]) | (((unsigned char)in[++n]) & 0x3F)); i++; } else n += 2; } else if ((c & 0xF0) == 0xF0) n += 3; else if ((c & 0xF8) == 0xF8) n += 4; else if ((c & 0xFC) == 0xFC) n += 5; } n++; } result[i] = '\0'; return (char *) result; } char *str_to_utf8(const char *pin) { int n = 0, i = 0; int inlen; char *result = NULL; const unsigned char *in = (unsigned char *) pin; if(!in) return NULL; inlen = strlen(pin); result = new char[inlen * 2 + 1]; while (n < inlen) { long c = (long)in[n]; if (c == 27) { n += 2; if (in[n] == 'x') n++; if (in[n] == '3') n++; n += 2; continue; } if (c < 128) result[i++] = (char)c; else { result[i++] = (char)((c >> 6) | 192); result[i++] = (char)((c & 63) | 128); } n++; } result[i] = '\0'; return result; } string striprtf(const string &s, const string &charset) { string r, spec, unichar, tmp; char pre = 0; bool bprint, bspec, bunicode; int bparen = -1; bprint = true; bspec = bunicode = false; for(string::const_iterator i = s.begin(); i != s.end(); ++i) { if(!isalpha(*i) && !isdigit(*i)) bprint = true; if(bspec) { spec += *i; if(spec.size() == 2) { r += (char) hex2int(spec); bspec = false; bprint = true; } } else switch(*i) { case '{': if(pre != '\\') { bparen++; bprint = false; } else { bprint = true; r += *i; } break; case '}': if(pre != '\\') { bprint = false; bparen--; } else { bprint = true; r += *i; } break; case '\\': if(pre != '\\') { bprint = false; } else { bprint = true; r += *i; pre = 0; continue; } break; case '\'': if(!bparen && bprint && pre == '\\') { spec = ""; bspec = true; } else { r += *i; } break; case 'u': if(!bparen) { if(pre == '\\' && isdigit(*(i+1))) { unichar = ""; bunicode = true; } else if(bprint) { r += *i; } } break; default: if(!bparen) { if(bunicode) { unichar += *i; if(unichar.size() == 5) { bunicode = false; if(unichar.substr(0, 4).find_first_not_of("0123456789") == -1) { long l = strtol(unichar.substr(0, 4).c_str(), 0, 0); char ubuf[sizeof(long)+4]; #ifdef HAVE_ICONV memcpy(ubuf, "\xff\xfe", 2); memcpy(ubuf+2, &l, sizeof(long)); memcpy(ubuf+sizeof(long)+2, "\x0a\x00", 2); #else strcpy(ubuf, unichar.substr(4).c_str()); #endif r += siconv(ubuf , "utf-16", charset); } } } else if(bprint) { r += *i; } } } pre = *i; } return leadcut(trailcut(r)); } centerim-4.22.10/kkstrtext/kkstrtext.h0000644000175000001440000001057211461606612014672 00000000000000#ifndef __KONST_STRING_H_ #define __KONST_STRING_H_ #include #include #include #include #include #include #include #include #include #include #include "conf.h" #ifdef HAVE_ICONV #include #endif // // Gives out a number with the both limits _included_ // #define randlimit(l, h) ((int)((float)rand()/(float)RAND_MAX*(float)(h+1-l)+(float)l)) #define SWAPVAL(v1, v2) { \ int SWAPVAL__v = v2; \ v2 = v1, v1 = SWAPVAL__v; \ } #define PRINTNULL(p) (p ? p : "") #define TAB_SIZE 8 struct quotedblock { int begin, end; }; void charpointerfree(void *p); void nothingfree(void *p); int stringcompare(void *s1, void *s2); int intcompare(void *s1, void *s2); string leadcut(const string &base, const string &delim = "\t\n\r "); string trailcut(const string &base, const string &delim = "\t\n\r "); string getword(string &base, const string &delim = "\t\n\r "); string getrword(string &base, const string &delim = "\t\n\r "); string getwordquote(string &base, const string "e = "\"", const string &delim = "\t\n\r "); string getrwordquote(string &base, const string "e = "\"", const string &delim = "\t\n\r "); int rtabmargin(bool fake, int curpos, const char *p = 0); int ltabmargin(bool fake, int curpos, const char *p = 0); void breakintolines(string text, vector &lst, int linelen); void breakintolines(const string &text, vector &lst); void find_gather_quoted(vector &lst, const string &str, const string "e, const string &escape); int find_quoted(const string &str, const string &needle, int offs = 0, const string "e = "\"'", const string &escape = "\\"); int find_quoted_first_of(const string &str, const string &needle, int offs = 0, const string "e = "\"'", const string &escape = "\\"); void splitlongtext(string text, vector &lst, int size = 440, const string cont = "\n[continued]"); string strdateandtime(time_t stamp, const string &fmt = ""); string strdateandtime(struct tm *tms, const string &fmt = ""); bool iswholeword(const string &s, int so, int eo); int hex2int(const string &ahex); vector getquotelayout(const string &haystack, const string &qs, const string &aescs); vector getsymbolpositions(const string &haystack, const string &needles, const string &qoutes, const string &esc); #define VGETSTRING(c, fmt) \ { \ va_list vgs__ap; char vgs__buf[1024]; \ va_start(vgs__ap, fmt); \ vsnprintf(vgs__buf, 1024, fmt, vgs__ap); c = vgs__buf; \ va_end(vgs__ap); \ } string justfname(const string &fname); string justpathname(const string &fname); string textscreen(const string &text); string i2str(int i); string ui2str(int i); bool getconf(string &st, string &buf, ifstream &f, bool passemptylines = false); bool getstring(istream &f, string &buf); string unmime(const string &text); string mime(const string &text); string toutf8(const string &text); string fromutf8(const string &text); string ruscase(const string &s, const string &mode); string siconv(const string &text, const string &fromcs, const string &tocs); const int chCutBR = 1; const int chLeaveLinks = 2; string cuthtml(const string &html, int flags = 0); string striprtf(const string &s, const string &charset); __KTOOL_BEGIN_C char *strcut(char *strin, int frompos, int count); char *trimlead(char *str, char *chr); char *trimtrail(char *str, char *chr); char *trim(char *str, char *chr); char *strimlead(char *str); char *strimtrail(char *str); char *strim(char *str); const char *strqpbrk( const char *s, int offset, const char *accept, const char *q, const char *esc = ""); const char *strqcasestr( const char *s, const char *str, const char *q, const char *esc = ""); const char *strqstr(const char *s, const char *str, const char *q, const char *esc = ""); char *strccat(char *dest, char c); char *strinsert(char *buf, int pos, char *ins); char *strcinsert(char *buf, int pos, char ins); int strchcount(char *s, char *accept); int stralone(char *buf, char *startword, int wordlen, char *delim); char *time2str(const time_t *t, char *mask, char *sout); time_t str2time(char *sdate, char *mask, time_t *t); char *unmime(char *text); char *mime(char *dst, const char *src); char *utf8_to_str(const char *pin); char *str_to_utf8(const char *pin); __KTOOL_END_C #endif centerim-4.22.10/centerim.10000644000175000001440000001075211461606612012303 00000000000000.TH CENTERIM 1 "April 2, 2007" .SH NAME \fBcenterim\fP \- a text mode based IM client for Linux, *BSD, Sun Solaris, MacOS X and possibly, other Unices. ICQ2000, Yahoo!, AIM TOC, IRC, MSN, Gadu-Gadu and Jabber protocols are now supported. Internal LiveJournal client and RSS reader are also provided. .SH SYNOPSIS .B "centerim " [ .B option ] ... .SH DESCRIPTION This manual page documents briefly the .B centerim command. .PP \fBcenterim\fP is a text mode menu- and window-driven IM interface. Currently ICQ2000, Yahoo!, AIM, IRC, MSN, Gadu-Gadu and Jabber protocols are supported. It allows you to send, receive, and forward messages, URLs, SMSes and, contacts, mass message send, search for users (including extended "whitepages search"), view users' details, maintain your contact list directly from the program (including non-icq contacts), view the messages history, register a new UIN and update your details, be informed on receiving email messages, automatically set away after the defined period of inactivity (on any console), and have your own ignore, visible and invisible lists. It can also associate events with sounds, add events to the outgoing queue from command line, define external event processing actions (like events auto-forwarding or elizatalk), has support for Hebrew and Arabic languages and allows to arrange contacts into groups. .SH OPTIONS .TP \fB\-a\fR, \fB\-\-ascii\fR use ascii characters to draw lines and boxes .TP \fB\-h\fR, \fB\-\-help\fR display command line usage .TP \fB\-v\fR, \fB\-\-version\fR show the program version info .TP \fB\-b\fR, \fB\-\-basedir\fR specify another base directory; useful for having several IM identities under the same UNIX account .TP \fB\-B\fR, \fB\-\-bind\fR tells centerim to use the specified IP address for outgoing connections .TP \fB\-B\fR, \fB\-\-no\-xtitles\fR disable title changing in xterm or screen .TP \fB\-o\fR, \fB\-\-offline\fR start with all protocols set offline .PP The following commands are used to put events to the outgoing queue from the command line. If centerim is already running they're to be sent immediately, otherwise they will be sent as soon as you go on-line. .TP \fB\-s\fR, \fB\-\-send\fR This parameter specifies the type of event you want to send. Currently only "msg", "url" and "sms" are supported. .TP \fB\-p\fR, \fB\-\-proto\fR This one specifies to which IM network the destination contact belongs. Can be "icq", "yahoo", "aim", "irc", "jab", "msn", "gg" or "lj". .TP \fB\-t\fR, \fB\-\-to\fR With this one you specify nickname or UIN of the destination contact. For icq it's possible to specify 0 to send events to yourself. Only SMSes are known to be possible to be sent to oneself though. .TP \fB\-n\fR, \fB\-\-number\fR Using this parameter you can send SMSes to any mobile numbers through the ICQ network. .PP The message text is read from the standard input, so use pipes in shell to pass it. For example, you can say "hi" to me through the ICQ network with the following command: \fB$ echo "hi" | centerim -s msg -p icq -t 17502151\fR In case you want to send an URL, the URL itself and its description are separated with a newline character the following way: \fB$ echo -e "http://thekonst.net/\\nMy modest homepage." \ | centerim -s url -p icq -t 17502151\fR Please note, that all three parameters are required in order to queue an event. Finally, a small example of sending SMSes: \fB$ echo "sms test" | centerim -s sms -n 1234567890\fR .PP It's also possible to change your current status on a particular IM network with the following command line option. .TP \fB\-S\fR, \fB\-\-status\fR The argument parameter is a letter which indicates which status is to be set: o (Online), _ (Offline), a (Away), d (Don't disturb), n (N/A), c (Occupied), f (Free for chat), i (Invisible) .TP \fB\-p\fR or \fB\-\-proto\fR Exactly the same like it was described for the previous command. .PP Examples: \fB$ centerim -S _ -p icq\fR This will set the icq status to offline. In other words, it'll be disconnected immediately. \fB$ centerim -S a -p yahoo\fR And this command will switch your yahoo status to away. .SH VERSION centerim 4.22.1 .SH BUG REPORT Report any bugs at our Bugzilla site at http://bugzilla.centerim.org/ .SH AUTHOR This page and centerim was originally written by Konstantin Klyagin. Currently, several people are maintaining this software project. .SH WEB http://www.centerim.org/ centerim-4.22.10/po/0000755000175000001440000000000011473011460011076 500000000000000centerim-4.22.10/po/fr.po0000644000175000001440000024556311473011457012012 00000000000000# Centericq French Translation Template # Copyright (C) 2002 Free Software Foundation, Inc. # Julien Lemoine Apr, 2002 # rewritten by Emmanuel le Chevoir Apr, 2002 # updated by Emmanuel le Chevoir Oct, 2002 # updated by Thomas Nemeth Jun, 2003 # updated by Thomas Nemeth Mar, 2004 # # Some terms, such as irc ones, mainly, have been left in english. # This is intentional, as we (french people) use them "as is". # I believe it would not be wise to translate "channel", e.g. # Some terms have been "franglisés". That's not really nice, but # still, many french users won't understand anything else than # "kické" for "kicked", in the irc context. # # If you find that those translations are not suitable, or not # acceptable, just drop me a few lines on my personnal email :o) # #: src/hooks/jabberhook.cc:2088 #, fuzzy msgid "" msgstr "" "Project-Id-Version: centerim 4.9.4\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2002-01-01 01:01+0020\n" "Last-Translator: Thomas Nemeth \n" "Language-Team: fr \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "mot de passe : " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" "F2/M contact courant, F3/S changer d'état, F4/G actions générales, Q quitter" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Ignorer tous les événements venant de %s ?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "Suppression de %s des contacts ?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Voulez-vous vraiment supprimer %s ?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Nouveau pseudo à afficher : " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Sélectionnez un groupe où déplacer l'utilisateur" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ impossible de récupérer les messages d'absence en étant déconnecté" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! espace disponible sur le disque < 10k, déconnexion" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "message d'absence" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! le support de %s a été désactivé à la compilation" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ nouveau mail reçu, %d messages" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] nouveau mail reçu, %d messages" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ dernier message de : %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ la configuration de %s a changé. Rechargée." #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! un autre centerim est déjà lancé" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! cela peut poser problème. pid %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Mobile : " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "répertoire où sauver le(s) fichier(s) : " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "Le répertoire donné n'a pas les droits en écriture" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "Le répertoire donné n'existe pas" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ pas d'historique pour %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ l'utilisateur %s est déjà dans la liste" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Sélectionnez un groupe où ajouter l'utilisateur" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s a été ajouté à la liste" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ l'utilisateur est de retour" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] état précédent rétabli" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] mode automatique : %s" #: src/centerim.cc:1490 msgid "away" msgstr "absent" #: src/centerim.cc:1490 msgid "n/a" msgstr "n/d" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! espace disponible sur le disque < 10k, déconnexion" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! pour éviter la perte de messages ou de la configuration" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "Inviter à une conférence..." #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "Sélectionnez les contacts à déplacer" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "Déplacer en bloc les contacts sélectionnés vers..." #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "récupération impossible" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "XML erroné" #: src/hooks/rsshook.cc:353 #, fuzzy msgid "no or tag found" msgstr "pas de balise trouvée" #: src/hooks/rsshook.cc:362 #, fuzzy msgid "no or tag found" msgstr "pas de balise trouvée" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "mauvaise balise " #: src/hooks/rsshook.cc:380 msgid "success" msgstr "succès" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "Titre : " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "Publié le : " #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "Catégorie : " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "Auteur : " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "Description : " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "Lien : " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "Commentaires : " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] impossible de se connecter : " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "impossible de résoudre le nom d'hôte" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "impossible de créer la socket" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "vérifiez le nom d'hôte et le port entrés" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] déconnexion de la conférence %s" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "Rejoignez ma conférence SVP." #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Notification d'état personnalisée :" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] impossible de récupérer le msg d'absence de %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] impossible de se connecter : " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "" "+ [yahoo] connexion impossible : mauvais nom d'utilisateur mot de passe" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "" "+ [yahoo] connexion impossible : mauvais nom d'utilisateur mot de passe" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] connexion impossible : le compte est bloqué" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ pour le réactiver, allez sur %s" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] autre connexion détectée" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] le serveur a fermé la socket" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "L'utilisateur %s vous a invité à la conférence %s, pour parler de : %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "Les membres actuels de la conférence sont : " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Connexion automatique à la conférence" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "L'utilisateur %s a décliné votre invitation à rejoindre la conférence" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "L'utilisateur %s a rejoint la conférence" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "L'utilisateur %s a quitté la conférence" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "L'utilisateur vous a ajouté à sa liste de contacts" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "message : " #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] e-mail de %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] système : %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] erreur : %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] erreur : %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] la connexion directe a échoué" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] impossible de se connecter : " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] impossible de se connecter : " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] impossible de se connecter : " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] impossible de se connecter : " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] erreur : %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] erreur : %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] impossible de se connecter : " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] impossible de se connecter : " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] erreur : %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "C'est l'anniversaire de l'utilisateur aujourd'hui" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] impossible de se connecter au serveur" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] désenregistrement de l'agent %s" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Message d'absence : " #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] pas de message d'absence de %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "Mauvaus pseudo donné, impossible de s'enregistrer" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "Connexion impossible" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "L'utilisateur distant utilise %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "Serveur de conférence jabber par défaut" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, fuzzy, c-format msgid "+ [jab] error %d" msgstr "+ [jab] erreur %d : %s" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] erreur %d : %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" "L'utilisateur veut s'inscrire à votre notification de présence sur le réseau" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" "L'utilisateur vous a supprimé de sa liste de contacts (vous à désinscrit en " "utilisant le langage de Jabber)" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] impossible de se connecter au serveur" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "Le profil AIM par défaut de centerim %s me convient trs bien." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "la connexion à aim a échoué" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] la connexion a échoué : %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "L'utilisateur n'a pas d'information dans son profil." #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] mot de passe envoyé" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "comme demandé" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "problèmes de socket" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "mauvais nom d'utilisateur" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "turboing" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "mot de passe incorrect" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "le nom d'utilisateur et mot le passe ne correspondent pas" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ [msn] impossible de se connecter : " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] déconnecté" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "raison de la déconnexion" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "L'utilisateur a accepté votre demande d'autorisation" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "L'utilisateur a refusé votre demande d'autorisation ; raison : " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] échec SMS vers %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] échec SMS vers %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] impossible de récupérer le msg d'absence depuis %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Interlocuteur aléatoire" #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ [gg] connexion de perdue" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [gg] impossible de résoudre %s" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "+ [gg] échec de connexion au serveur" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "+ [gg] connexion de perdue" #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [jab] pas de message d'absence de %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] impossible de se connecter au serveur" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] la connexion a échoué : %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] votre pseudo a été changé" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Sur les chans : " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Kick par %s ; raison : %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "%s a changé de pseudo. Il s'appelle maintenant %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] mot de passe envoyé" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] mot de passe envoyé" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "Réponse au PING : %d seconde(s)" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s nous a rejoint." #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s est parti" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "raison : %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s a été kické par %s." #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr " Le sujet du chan est maintenant : %s " #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "mis par %s" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s a été mis op par %s." #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s a été démis op par %s." #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s nous a mis op." #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "vous êtes op ici" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s nous a démis op." #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] recherche terminée" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "impossible de se connecter" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] échec HTTP : %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "Message du serveur : " #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] échec de connexion : %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] publication réussie. L'id est %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] erreur : %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "L'utilisateur %s (%s) vous a ajouté à sa liste d'amis\n" "\n" "Adresse du journal : %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "L'utilisateur %s vous a enlevé de sa liste d'amis\n" "\n" "Adresse du journal : %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] erreur de suppression d'ami" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] l'utilisateur a été enlevé de votre liste d'amis" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] impossible d'ajouter l'ami" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s a été ajouté aux amis" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] affichage inversé des utilisateurs terminé, %d réponse(s)" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "" "+ [msn] e-mail non lus : %d dans la boite d'entrée, %d dans les dossiers" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] e-mail de %s, %s" #: src/hooks/msnhook.cc:905 msgid "+ [msn] cannot connect: " msgstr "+ [msn] impossible de se connecter : " #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "vérifiez le nom d'hôte et le port" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "connexion au serveur en cours" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "connecté" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "recherche terminée, %d réponse(s)" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "le mot de passe a été changé avec succès" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "Déconnecté" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "ajout de %s aux contacts" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "suppression de %s des contacts" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "récupération de la liste des membres terminée, %d réponse(s)" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "C'est l'anniversaire de l'utilisateur aujourd'hui" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Jan" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Fév" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Mar" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Avr" #: src/icqcontact.cc:854 msgid "May" msgstr "Mai" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Jun" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Jui" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Aoû" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Sep" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Oct" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Nov" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Déc" #: src/icqgroups.cc:66 msgid "General" msgstr "Général" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Envoyé le %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60 ou plus" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "type de messagerie instantanée inconnu" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Discussion générale" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Romance" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Jeux" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Étudiants" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "20-30 ans" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "30-40 ans" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "40-50 ans" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50 ans et plus" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "En mal de femme" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "En mal d'homme" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Nom" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Rechercher des profils " #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Supprimer" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Charger" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ vous devez être connecté avant" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "Ouvrir" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "sAuver" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "effacer" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Changer" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Recherche/Ajout" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "Joindre/Quitter" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "lIer" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Chercher/ajouter utilisateur(s)" #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " Joindre ou créer un chan ou une conférence" #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " Ajouter un flux RSS" #: src/icqdialogs.cc:299 msgid " Network " msgstr " Réseau " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Détails " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Pseudo : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail : %s" #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Prénom : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Nom : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Tranche d'âge : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Sexe : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Langue : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " Lieu " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Ville : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Région : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Pays : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Travail " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Société : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Secteur : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Position : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Connectés uniquement " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Groupe de discussion aléatoire" #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Mots clé " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Pseudo " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " Services de recherche " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Paramètres de recherche " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " Paramètres de recherche " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " URL d'export XML : %s " #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " Fréquence de vérification (minutes) : %lu " #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Chan : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Nom : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " Seulement ceux qui ont joint depuis la dernire vérification" #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " Mots clé : %s " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " Options " #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " Utilisateurs avec photo uniquement : %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " Chercher seulement les gens connectés : %s " #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Afficher les utilisateurs qui vous ont dans leur liste de contacts " #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Nom/Titre " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Mot de passe " #: src/icqdialogs.cc:443 msgid " Service " msgstr " Service " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Nouveau nom de profil : " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "Un profil de ce nom existe déjà. Voulez-vous l'écraser ?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN : " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Pseudo : " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Nom/Titre : " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-Mail : " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Prénom : " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Nom : " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Ville : " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Région : " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Société : " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Secteur : " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Position : " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Chan : " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Nom : " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Mots Clé : " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Mot de passe : " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "URL : " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "Fréquence de vérification : " #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Général " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " Service d'enregistrement " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Paramètres d'enregistrement " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " Changer le mot de passe : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr "E-mail : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Date de naissance : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Âge : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Maison " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Adresse : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Code postal : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Téléphone : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Mobile : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Page perso : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Plus " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1ère langue : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2ème langue : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3ème langue : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Divers " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Activer l'indicateur d'état sur le web : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Groupe de discussion aléatoire : %s" #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Autorisation nécessaire : %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Région : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " À propos " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Récupration de vos informations" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Vos infos %s " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s : informations " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Terminé" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Veuillez patienter. Votre profil n'a pas encore été récupéré" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-mail : " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Date de naissance (JJ-MM-AAAA): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Âge : " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Adresse : " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "Code postal : " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Téléphone : " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax : " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Mobile : " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Page perso : " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "À propos" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "Nouveau mot de passe : " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "Confirmer le mot de passe : " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "aucun" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X sauvegarder, Esc annuler] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Envoyer le(s) fichier(s) vers %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Ajouter" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Commentaire" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Envoyer" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Fichiers " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Commentaire " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "nom du fichier : " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "commentaire : " #: src/icqdialogs.cc:1163 msgid "None" msgstr "Aucun(e)" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "Russe" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "Polonais" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " Configuration de centerim " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Interface utilisateur " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Périphérique audio : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Jeu de couleurs : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr " Demander autorisation" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Nom : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " Chan : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Classer les contacts en groupes : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Activer le support des langues bidirectionnelles : %s " #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Activer les raccourcis emacs dans l'éditeur : %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " Activer les raccourcis emacs dans l'éditeur : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr " Conversion de pages de codes " #: src/icqdialogs.cc:1241 #, c-format msgid " Switch to language preset : %s " msgstr " Passer à la langue : %s " #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Se souvenir des mots de passe : %s " #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Nom : %s " #: src/icqdialogs.cc:1246 #, fuzzy, c-format msgid " For protocols : %s" msgstr " Pour les protocols : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Liste des contacts " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Classer les contacts en groupes : %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Classer les contacts en groupes : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Masquer les utilisateurs déconnectés : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-spam - ignorer les msg venant d'inconnus : %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Autorisation nécessaire : %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Reprendre le message dans les réponses : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Scruter la boite mail locale : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Se souvenir des mots de passe : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Éditer le message d'absence en changeant d'état : %s " # This one gave me headaches, it won't be perfect... # But to be true, the english phrasing is not so good either. #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Suivi de discussion : %s " #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " [Entrée] envoie le message pour : %s " # This one gave me headaches, it won't be perfect... # But to be true, the english phrasing is not so good either. #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Suivi de discussion : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " [Entrée] envoie le message : %s " #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " Classer les contacts en groupes : %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Communications " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " Serveur SMTP : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " Proxy HTTP : %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " Proxy HTTP : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Activer les communications pair-à-pair : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " Échelle des ports pour le pair-à-pair : %s" #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " Journalisation " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " Datation dans la fenêtre journal : %s" #: src/icqdialogs.cc:1301 #, fuzzy, c-format msgid " Timestamps include seconds : %s " msgstr " Datation dans la fenêtre journal : %s" #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " Événement Connecté/Déconnecté dans la fenêtre journal : %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Journaliser les événements dans ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Devenir automatiquement absent après (min) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Passer automatiquement en n/d après (min) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Passer automatiquement en n/d après (min) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Adresse : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Automatiquement absent après (0 = désactivé) : " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Automatiquement n/d après (0 = désactivé) : " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "Nom du serveur SMTP : " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr " Échelle de ports pair-à-pair (min-max) : " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "Nom du proxy HTTP : " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "Convertir depuis le charset : " #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "Convertir vers le charset : " #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "Nom du proxy HTTP : " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Message de demande d'autorisation vide" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Votre profil a été récupéré" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Classer les groupes de contacts" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Renommer" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "supprimEr" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "monter" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "Descendre" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Sélectionner" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Groupes " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Nom du groupe à créer : " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Nouveau nom pour le groupe : " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Voulez-vous vraiment supprimer le groupe ?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "État du transfert de fichier" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Annuler" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " Reçu de %s " #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " Envoyé à %s " #: src/icqdialogs.cc:1865 msgid "init" msgstr "initier" #: src/icqdialogs.cc:1866 msgid "start" msgstr "démarrer" #: src/icqdialogs.cc:1867 msgid "work" msgstr "travail" #: src/icqdialogs.cc:1868 msgid "done" msgstr "terminé" #: src/icqdialogs.cc:1869 msgid "err" msgstr "err" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "annuler" #: src/icqdialogs.cc:1877 msgid " of " msgstr " de " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "Impossible de supprimer un transfert en cours" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "public (visible de tous)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "privé" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "amis seulement" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr "Publication LiveJournal : attributs" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "Détecter la musique" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "Publier" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Annuler" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " Publier dans le journal : %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " Objet : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " Sécurité : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " Trucs décoratifs " #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " Humeur : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(aucune/perso)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " Humeur perso : %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " Musique : %s" #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " Photo : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(défaut)" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Âge : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " Désactiver l'auto-formattage : %s " #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " Désactiver l'envoi de commentaires par e-mail : %s " #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " Interdire les commentaires : %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " Entrée antidatée : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "Objet de la publication : " #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "Actuellement : " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "Humeur actuelle : " #: src/icqdialogs.cc:2094 #, fuzzy msgid "Tags for the entry: " msgstr "Message du serveur : " #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr " Liste des contacts " #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "" "Quicksearch : entrez un nom, chercher à nouveau, terminer" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 #, fuzzy msgid " Use no key" msgstr "Infos contact" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "action externe manuelle %s terminée, code de retour : %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "action externe %s terminée, code de retour : %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Déconnecté" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Connecté" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Invisible" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Libre pour discuter" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Ne pas déranger" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Occupé" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] Non disponible" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "Absent" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "Ne pas déranger" #: src/imlogger.cc:39 msgid "N/A" msgstr "N/D" #: src/imlogger.cc:49 msgid "message" msgstr "message" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "autorisation" #: src/imlogger.cc:53 msgid "e-mail" msgstr "e-mail" #: src/imlogger.cc:54 msgid "notification" msgstr "notification" #: src/imlogger.cc:55 msgid "contacts" msgstr "contacts" #: src/imlogger.cc:56 msgid "files" msgstr "fichiers" #: src/imlogger.cc:57 msgid "event" msgstr "événement" #: src/imlogger.cc:79 msgid "events log started" msgstr "journalisation des événements démarrée" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "%s envoyé à %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "%s reçu de %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "ignoré" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s s'est déconnecté" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "%s à %s, Envoyé le %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s s'est connecté, état : %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s s'est déconnecté" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "état %s changé de %s pour %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " gestionnaire de comptes de messagerie " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Serveur : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " Sécurisé : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Identifiant : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Mot de passe (optionnel) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Mot de passe : %s " #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr " Priorité : %s " #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr " Importer une liste d'amis : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Mot de passe (optionnel) : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " Classer les contacts en groupes : %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Classer les contacts en groupes : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " S'enregistrer " #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Sexe : %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Mots clé : %s " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " Changer le pseudo " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Mettre à jour les informations " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Définir le message d'absence " #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Supprimer " #: src/accountmanager.cc:200 msgid " user name: " msgstr " nom d'utilisateur : " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin : " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " mot de passe : " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Commencez par supprimer les informations du compte !" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Vous devez vous déconnecter du service d'abord !" #: src/accountmanager.cc:241 msgid " server address: " msgstr " adresse du serveur : " #: src/accountmanager.cc:285 msgid " priority: " msgstr " priorité : " #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " S'enregistrer sur le réseau %s " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Continuer" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Définir le mot de passe : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Confirmer le mot de passe : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Serveur à utiliser : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Confirmez le mot de passe : " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Pseudo à définir : " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Serveur : " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Les mots de passe sont différents" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Vous devez entrer un mot de passe" #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "Le mot de passe doit faire au moins 6 caractères" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Enregistrement en cours " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Connexion au serveur %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Envoi de la requête" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Délai d'attente d'un nouvel UIN dépassé. Réessayer ?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Nouvelle tentative..." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Nouvel UIN reçu, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Déconnecté" #: src/imcontroller.cc:179 msgid "Unable to connect to icq server. Retry?" msgstr "Impossible de se connecter au serveur ICQ, réessayer ?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "Tentative d'enregistrement de %s à %s..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "L'ID Jabber a été enregistré avec succès" #: src/imcontroller.cc:228 msgid "Failed" msgstr "Échec" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Vous devez être connect au réseau ICQ pour mettre à jour votre profil" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "nouveau pseudo MSN : " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "Vous devez être connecté au réseau MSN pour mettre à jour votre pseudo" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "" "Vous devez être connecté au réseau Jabber pour mettre à jour votre profil" #: src/imcontroller.cc:318 #, fuzzy msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "" "Vous devez être connecté au réseau Jabber pour mettre à jour votre profil" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "enregistrement non supporté" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "Le message d'absence %s par défaut de %s %s me convient très bien." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ commande %s lancée" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "erreur d'émission : pas assez de paramètres" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "erreur d'émission : seuls les UIN sont autorisés par le protocole ICQ" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "erreur d'émission : type de messagerie instantannée inconnu" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "erreur d'émission : type d'événement inconnu" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s vers %s a été ajouté à la file" #: src/icqconf.cc:1616 #, fuzzy msgid "event sending error: error creating directory for the contact" msgstr "erreur d'émission : pas assez de paramètres" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "un caractère d'état inconnu a été entré" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "type de messagerie instantanée inconnu" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "erreur de changement d'état : " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Syntaxe : " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "Options générales : " #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " --ascii, -a utiliser des caractères ASCII pour l'interface" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b définir un répertoire de base" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B se lier à une IP locale" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help afficher cette aide" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v afficher la version du programme" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Options d'émission : " #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr " -s, --send type d'événement (msg, sms ou url)" #: src/icqconf.cc:1694 #, fuzzy msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr " -S, --status <état> changer l'état courant de la MI" #: src/icqconf.cc:1695 #, fuzzy msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto type de protocole (icq, yahoo, msn, aim, irc, " "jabber ou lj)" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" " -t, --to UIN ou pseudo de destination (dépend du protocole)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" " -n, --number numéro de téléphone où envoyer un message (sms " "seulement)" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Rapporter les bugs à http://bugzilla.centerim.org." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Message de demande d'autorisation vide" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* Demande d'autorisation : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* Autorisation : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Contacts : " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* Transfert de fichier" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "pas de balise trouvée" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Info" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " gestionnaire de comptes de messagerie " #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Pour les protocols : %s " #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " nom d'utilisateur : " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "oui" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "non" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "oui" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Comptes..." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " Tous les protocoles" #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Syntaxe : " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " Tous les protocoles" #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Comptes..." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "oui" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "Nov" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " Service " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 #, fuzzy msgid "No Jabber" msgstr " [jab] Jabber" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "type de messagerie instantanée inconnu" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Homme" #: src/icqface.cc:53 msgid "Female" msgstr "Femme" #: src/icqface.cc:56 msgid "Not specified" msgstr "Non précisé" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "Suiv." #: src/icqface.cc:63 msgid "Fwd" msgstr "Faire Suivre" #: src/icqface.cc:64 msgid "Reply" msgstr "Répondre" #: src/icqface.cc:65 msgid "Open" msgstr "Ouvrir" #: src/icqface.cc:66 msgid "Accept" msgstr "Accepter" #: src/icqface.cc:67 msgid "Reject" msgstr "Rejeter" #: src/icqface.cc:68 msgid "User info" msgstr "Infos contact" #: src/icqface.cc:70 msgid "Prev" msgstr "Prc." #: src/icqface.cc:78 msgid "sound card" msgstr "carte son" #: src/icqface.cc:79 msgid "speaker" msgstr "haut-parleur" #: src/icqface.cc:80 msgid "disable" msgstr "désactiver" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "ne pas changer" #: src/icqface.cc:88 msgid "dark" msgstr "sombre" #: src/icqface.cc:89 msgid "blue" msgstr "bleu" #: src/icqface.cc:97 #, fuzzy msgid "protocol" msgstr " Tous les protocoles" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "démarrer" #: src/icqface.cc:118 msgid "mode 1" msgstr "mode 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "mode 2" #: src/icqface.cc:249 #, fuzzy, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "centerim %s NON-ENVOYÉ(S) : %lu" #: src/icqface.cc:274 #, fuzzy msgid "Send an URL" msgstr " Envoyer SMS" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " Envoyer SMS" #: src/icqface.cc:276 #, fuzzy msgid "Send contacts" msgstr "Envoyer aux contacts..." #: src/icqface.cc:277 msgid " Request authorization" msgstr " Demander autorisation" #: src/icqface.cc:278 #, fuzzy msgid "Edit details" msgstr " Détails " #: src/icqface.cc:279 #, fuzzy msgid "Fetch away message" msgstr " Voir message d'absence f" #: src/icqface.cc:280 #, fuzzy msgid "Add to list" msgstr " Ajouter à la liste a" #: src/icqface.cc:281 #, fuzzy msgid "Rename contact" msgstr " Renommer contact r" #: src/icqface.cc:282 msgid " Move to group.." msgstr " Déplacer vers..." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 #, fuzzy msgid "Fetch version info" msgstr " Récupérer infos vers. v" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " Envoyer fichier(s)" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " Inviter à une confrence..." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Envoyer msg au chan entrée" #: src/icqface.cc:294 #, fuzzy msgid "Channel chat history" msgstr " Historique du chan h" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Supprimer chan del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Joindre le chan" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Quitter le chan" #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Nom : " #: src/icqface.cc:301 #, fuzzy msgid "UnBlock channel messages" msgstr " Débloquer les messages du chan i" #: src/icqface.cc:303 #, fuzzy msgid "Block channel messages" msgstr " Débloquer les messages du chan i" #: src/icqface.cc:310 #, fuzzy msgid "Send a message" msgstr " Définir le message d'absence " #: src/icqface.cc:312 #, fuzzy msgid "Event history" msgstr " Historique h" #: src/icqface.cc:313 #, fuzzy msgid "Remove user" msgstr "Supprimer" #: src/icqface.cc:314 #, fuzzy msgid "User's details" msgstr " Infos contact ?" #: src/icqface.cc:315 #, fuzzy msgid "External actions.." msgstr " Actions externes... f6" #: src/icqface.cc:318 #, fuzzy msgid "Unset ignore user" msgstr " Ignorer contact i" #: src/icqface.cc:318 #, fuzzy msgid "Ignore user" msgstr "Liste des contacts ignorés" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 #, fuzzy msgid "Force check" msgstr "Prochaine vérification" #: src/icqface.cc:435 #, fuzzy msgid "Change status" msgstr "Changer" #: src/icqface.cc:436 #, fuzzy msgid "Go to contact.." msgstr "Déplacer vers les contacts" #: src/icqface.cc:437 msgid " Accounts.." msgstr " Comptes..." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " Options de configuration de centerim" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Moniteur transferts de fichiers" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Chercher/Ajouter contacts" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " Joindre le chan/la conférence" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " Ajouer un flux RSS" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Liste des contacts à ignorer" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Liste des contacts invisibles" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Liste des contacts visibles" #: src/icqface.cc:455 #, fuzzy msgid "Show offline users" msgstr " Masquer les utilisateurs déconnectés : %s " #: src/icqface.cc:457 #, fuzzy msgid "Hide offline users" msgstr " Masquer les utilisateurs déconnectés : %s " #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " Classer les groupes de contacts" #: src/icqface.cc:461 msgid " Mass group move.." msgstr " Déplacer en bloc..." #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Détails" #: src/icqface.cc:905 msgid "Message" msgstr "Message" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Nouvelle recherche" #: src/icqface.cc:924 msgid "Contact to add" msgstr "Contact à ajouter" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Recherche des contacts..." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Résultats de la recherche [terminé]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Informations sur %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Pseudo" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "Voici votre compte LiveJournal. L'utiliser pour" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "publier de nouvelles entrées au journal." #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "Les utilisateurs suivants vous on listé comme ami : " #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr "Liste des contacts ignorés" #: src/icqface.cc:1116 #, fuzzy msgid "not found" msgstr "pas de balise trouvée" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2ème e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Ancien e-mail" #: src/icqface.cc:1134 msgid "Gender" msgstr "Sexe" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Date de naissance" #: src/icqface.cc:1136 msgid "Age" msgstr "Âge" #: src/icqface.cc:1137 msgid "Languages" msgstr "Langues" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Dernière IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Vu pour la dernière fois" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Jamais" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "Envoyer" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "fichiers" #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Envoyer aux contacts..." #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "autorisation" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Adresse" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Lieu" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "Code Postal" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Téléphone" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Mobile" #: src/icqface.cc:1259 msgid "Timezone" msgstr "Fuseau horaire" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Page perso" #: src/icqface.cc:1300 msgid "Company" msgstr "Société" #: src/icqface.cc:1301 msgid "Department" msgstr "Section" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Titre" #: src/icqface.cc:1346 msgid "Interests" msgstr "Intérêts" #: src/icqface.cc:1358 msgid "Background" msgstr "Fond" #: src/icqface.cc:1376 msgid "Handle" msgstr "Nom" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "Document RSS" #: src/icqface.cc:1378 msgid "Version" msgstr "Version" #: src/icqface.cc:1379 msgid "Encoding" msgstr "Codage" #: src/icqface.cc:1382 msgid "Link" msgstr "Lien" #: src/icqface.cc:1384 msgid "Frequency" msgstr "Fréquence" #: src/icqface.cc:1385 msgid "Last check" msgstr "Dernière vérification" #: src/icqface.cc:1386 msgid "Next check" msgstr "Prochaine vérification" #: src/icqface.cc:1387 msgid "Last result" msgstr "Dernier résultat" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu minutes" #: src/icqface.cc:1404 msgid "Now" msgstr "Maintenant" #: src/icqface.cc:1423 msgid "Full name" msgstr "Nom complet : " #: src/icqface.cc:1442 #, fuzzy, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "F2 URLs, F6 actions externes, ESC fermer" #: src/icqface.cc:1447 #, fuzzy, c-format msgid "user info for %s" msgstr "Infos contact" #: src/icqface.cc:1456 msgid "Check" msgstr "Vérification" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Éditer" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "Récupérer" #: src/icqface.cc:1466 msgid "Friend of" msgstr "Ami de" #: src/icqface.cc:1472 msgid "Home" msgstr "Maison" #: src/icqface.cc:1472 msgid "Work" msgstr "Travail" #: src/icqface.cc:1472 msgid "More" msgstr "Plus" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Récupérer" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] réseau ICQ" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr " [gg] Gadu-Gadu" #: src/icqface.cc:1622 msgid " All protocols" msgstr " Tous les protocoles" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr " Déjà connectés seulement" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " ou confirme, annule " #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " confirme, annule " #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Déplacer vers les contacts" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Liste des contacts ignorés" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Liste des contacts visibles" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Liste des contacts invisibles" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Sélectionnez un contact à ajouter à la liste" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "Retirer les %d contacts de la liste aussi ?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Destinataires d'événements" #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "" "Quicksearch : entrez un nom, chercher à nouveau, terminer" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr " Liste des contacts " #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ pas d'URL dans le contexte courant" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URL dans le contexte courant" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ pas d'action externe définie pour %s" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "Résultat de l'action externe %s : " #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "^X envoi, ^P multi, ^O histo., F2 URLs, F9 max, Alt-? membres, ESC fermer" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "^X envoi, ^P multi, ^O histo., F2 URLs, F9 max, Alt-? membres, ESC annuler" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr " Envoyé à %s " #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Envoyer aux contacts..." #: src/icqface.cc:2670 msgid "file name: " msgstr "nom du fichier : " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "%s envoyé à %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Envoyé le %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "%s reçu de %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Reçu le %s" #: src/icqface.cc:3182 #, fuzzy, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "F2 pour les URLS, F9 pour plein écran, ESC pour fermer" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s de %s, reçu le %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s à %s, Envoyé le %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "Historique pour %s, %d événements au total" #: src/icqface.cc:3339 #, fuzzy, c-format msgid "%s search, %s again, %s cancel" msgstr "/ chercher, N encore, ESC annuler" #: src/icqface.cc:3348 msgid "search for: " msgstr "Chercher : " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] système : %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] e-mail de %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s s'est connecté, état : %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s a changé son état %s pour %s" #~ msgid " [o] Online" #~ msgstr " [o] Connecté" #~ msgid " [_] Offline" #~ msgstr " [_] Déconnecté" #~ msgid " [a] Away" #~ msgstr " [a] Absent" #~ msgid " [c] Occupied" #~ msgstr " [c] Occupé" #~ msgid " [f] Free for chat" #~ msgstr " [f] Libre pour une discussion" #~ msgid " [i] Invisible" #~ msgstr " [i] Invisible" #~ msgid "+ [irc] password was requested, but it's not set" #~ msgstr "+ [irc] le mot de passe a été demandé, mais n'est pas défini" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Confirmer le mot de passe : %s " #~ msgid " Convert from : %s " #~ msgstr " Convertir de : %s " #~ msgid " Convert to : %s " #~ msgstr " convertir vers : %s " #~ msgid "Your friendly nickname has been changed to %s" #~ msgstr "Votre pseudo a été changé en %s" #~ msgid "already logged" #~ msgstr "déjà connecté" #~ msgid "" #~ "event sending error: the destination contact doesn't exist on your list" #~ msgstr "erreur d'émission : le contact n'existe pas dans votre liste" #, fuzzy #~ msgid "URLs, " #~ msgstr "URL : " #, fuzzy #~ msgid " details, " #~ msgstr " Détails " #, fuzzy #~ msgid " cancel" #~ msgstr "Annuler" #, fuzzy #~ msgid "search, " #~ msgstr "Chercher : " #, fuzzy #~ msgid " esc cancel" #~ msgstr " Quitter le chan" #, fuzzy #~ msgid "contact menu, " #~ msgstr "contacts" #, fuzzy #~ msgid "change status, " #~ msgstr "%s a changé son état %s pour %s" #, fuzzy #~ msgid "general actions, " #~ msgstr "Options générales : " #~ msgid " Store contact list server-side : %s " #~ msgstr " Stocker les contacts sur le serveur : %s" #~ msgid " Send an URL u" #~ msgstr " Envoyer URL u" #~ msgid " Send contacts c" #~ msgstr " Envoyer aux contacts c" #~ msgid " Edit details e" #~ msgstr " Détails du contact e" #~ msgid " List nicknames ?" #~ msgstr " Afficher les pseudos ?" #~ msgid " Block channel messages i" #~ msgstr " Bloquer les messages du chan i" #~ msgid " Send a message enter" #~ msgstr " Envoyer message entrée" #~ msgid " Remove user del" #~ msgstr " Supprimer contact del" #~ msgid " Ignore user i" #~ msgstr " Ignorer contact i" #~ msgid " Remove feed del" #~ msgstr " Supprimer le flux del" #~ msgid " Feed information ?" #~ msgstr " Informations du flux ?" #~ msgid " Force check c" #~ msgstr " Forcer la vérification c" #~ msgid " Unset ignore feed i" #~ msgstr " Ne pas ignorer le flux i" #~ msgid " Ignore feed i" #~ msgstr " Ignorer le flux i" #~ msgid " Change status s" #~ msgstr " Changer d'état s" #~ msgid " Go to contact.. alt-s" #~ msgstr " Se déplacer au contact... alt-s" #~ msgid " Show offline users F5" #~ msgstr " Voir utilisateurs non connectés F5" #~ msgid " Hide offline users F5" #~ msgstr " Masquer utilisateurs non connectés F5" #~ msgid "ESC or F9 to close" #~ msgstr "ESC ou F9 pour fermer" centerim-4.22.10/po/pt_BR.gmo0000644000175000001440000002025511473011460012534 00000000000000Þ•Ÿß ˆ ‰  ± Å Í 6Ø *):dz˜¶ Ð Üæ÷ ' 1 ? MX`p ‚ š´»ËÜãó '7Wo ‰– ¬·Îæíý #.4;?GKQU Yz 𤭾 Åæíõ ý' + 6C KX]fmv{𫝵¹ À ÍÛßæë ôÿ    $. 6 BLUZ^bgx}ƒ™ °»ÀÉ Û æôø   "-DJ R]dj s"~¡¦ ¶ÁÅÍ'Þ  + 0:? G T_ bmu¹y3EWi q?~8¾?÷7$F&k’ ¨ ¶ÄÕ æó    . 9Dc x „ ’³ºÊÞî ý $46E| ” µÃ Ôß$ÿ $ /:N ju{ ƒ —¥©B­Ið :E MW_y ‚Ž – ¾ ÂÏÞ çôû ;TX^bk{ šŸ¤ ­ ¸ Ä ÏÚÞâæ îù !% )7KPVm …“œ¤ »Å×Ûãçï òþ " + 6B JTZ,oœ£ ³ÁÅ ÎBÚ % + 4 8 > C Q X c p ‚ ‡ ” © R`Žzy”Vpr“I‘|W5 j>@•nƒ.^CmJ] YeQ+6ˆ?#2Go{žN Z—uEf‹Œ!0XK€~F8a›;*&O‰=) _whq9†gU–k ’Ÿ„P"1b‚x‡/A…s3œ%Bt-M[˜L4ŠHcDdST,$vl™\' 7š(}i<: 1st language : %s 2nd language : %s 3rd language : %s About Age : %s Anti-spam: kill msgs from users not on the list : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Cellular phone : %s Change color scheme to : %s Change sound device to : %s Check the password : %s City : %s Comment Communications Company : %s Country : %s Department : %s Details E-Mail : %s E-mail : %s Fax : %s Files Find/add users First name : %s Gender : %s General Hide offline users : %s Home Homepage : %s Last name : %s More Nickname : %s Password : %s Password to set : %s Phone : %s Position : %s Quote a message on reply : %s Registration progress Send file(s) to %s, %lu State : %s Street address : %s UIN : %s View/edit ignore list View/edit visible list Work Zip code : %s + last msg from %s+ the user is back2nd e-mailAboutAcceptAddAddressAgeAge: AprAugAuto Away period (0 - disable): Auto N/A period (0 - disable): BirthdateCellularCellular phone: ChangeCheck the password you entered: City: CommentCompanyCompany: Connecting to the server %s ...DecDepartmentDepartment: DetailsDisconnectedDoneE-Mail: E-mailE-mail: EditEnter birthdate (DD-MM-YYYY): Event recipientsFaxFax: FebFemaleFirst name: Free for chatFwdGenderHomeHomepageHomepage: InfoInterestsInvisibleJanJulJunLanguagesLast IPLast name: Last seenLocationMaleMarMayMoreMove to contactsNameNeverNew UIN received, %luNew nickname to show: New searchNextNicknameNickname to set: Nickname: Not specifiedNovOccupiedOctOfflineOkOld e-mailOnlinePassword: Passwords do not matchPhonePhone: Position: RemoveReplyRetrieveRetrying..Select contacts to add to the listSendSending requestSent on %sSepState: Street address: Timed out waiting for a new uin. Retry?TitleUIN: WorkZip codeZip code: bluecomment: darkdisabledon't changefilename: nosound cardspeakeryesProject-Id-Version: centerim 2.0.0 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2002-09-10 01:22+0300 Last-Translator: Paulo Oliveira Filho Language-Team: Brazilian Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: iso-8859-1 1o. idioma : %s 2o. idioma : %s 3o. idioma : %s Sobre Idade : %s Anti-spam: destruir mensagens de quem não está na lista: %s Automaticam. setar para afastado (Away) em (min.) : %d Automaticam. setar para não disponível (N/A) em (min.) : %d Celular : %s Alterar esquema de cores para : %s Alterar dispositivo de som para : %s Repita a senha : %s Cidade : %s Comentário Comunicações Companhia : %s País : %s Departamento : %s Detalhes E-mail : %s E-mail : %s Fax : %s Arquivos Pesquisar/adicionar usuários Primeiro nome : %s Sexo : %s Inf. gerais Ocultar usuários offline : %s Casa Homepage : %s Último nome : %s Mais detalhes Apelido : %s Senha : %s Senha para definir : %s Telefone : %s Posição : %s Mencionar (quote) mensagem original na resposta : %s Andamento do registro Enviar arquivo(s) para %s, %lu Estado : %s Endereço : %s UIN : %s Exibir/editar lista de ignorar Exibir/editar lista de visibilidade Trabalho CEP : %s + última msg de %s+ o usuário está de volta2o. e-mailSobreAceitarAdicionarEndereçoIdadeIdade: AbrAgoPeríodo p/ setar afastado (Away) automaticamente (0 - desativa): Período p/ setar não disponível (N/A) automaticamente (0 - desativa): NascimentoCelularCelular: AlterarRepita a senha digitada: Cidade: ComentárioEmpresaEmpresa: Conectando ao servidor %s ...DezDepartamentoDepartamento: DetalhesDesconectadoProntoE-mail: E-mailE-mail: EditarEntre nascimento (DD-MM-AAAA): Destinatários do eventoFaxFax: FevFemininoPrimeiro nome: Livre para batepapoEncaminharSexoCasaHomepageHomepage: Inf. geraisInteressesInvisívelJanJulJunIdiomasÚltimo IPÚltimo nome: Visto emLocalMasculinoMarMaiMais detalhesMover para contatosNomeNuncaNovo UIN recebido, %luNovo apelido a exibir: Nova pesquisaPróximaApelidoApelido para definir: Apelido: Não especificadoNovOcupadoOutOfflineOkE-mail ant.OnlineSenha: Senhas não conferemTelefoneTelefone: Posição: RemoverResponderPegarTentando novamente..Selecione os contatos para adicionar a listaEnviarEnviando pedidoEnviado em %sSetEstado: Endereço: Tempo expirou enquanto esperava por um novo UIN. Tentar novamente?TítuloUIN: TrabalhoCEPCEP: azulcomentário: escurodesativadonão alterarnome do arquivo: nãoplaca de somalto-falante internosimcenterim-4.22.10/po/ms.gmo0000644000175000001440000007405611473011460012155 00000000000000Þ•Þ ü(K(6M(-„(8²(Gë(=3)Hq) º)È)Ü)ð)* * *#*64*#k***­*)Ø*++)+G+Y+p+Ž++¸+Ö+õ+ , ,%,6,E,T,c,0u, ¦,°, ·, Å,)Ó, ý,- -(-;-K- ]-k-t-Ž-•-¥-º-Í- å-ó-" . /.:.J.[. j. u. .Œ.œ.£. ´. À. Í. ×.â. ò..///H/ Y/d/// ¦/³/¹/É/é/ý/ 0!0>0X0p0‡0¡0Á0Ø0ë0ÿ01"111 Q1 ^1l1 †1”1 ©1³1'Æ1 î1û1#252 ;2F2\2m2„2ž2¶2½2Ï2ß2û2 3 3 (363 J3X3 ]3i3{3 ‚3+31»30í3"4A4\4w44£4 ²4¾4"Ï4ò455(5H5[5 v5„5”550½5î5 6!6<6'R6z66¨6Å6)à6 7' 7H7#]7'7©70Ä71õ7'84B86w8®8#Ë8*ï89$-9$R9w9,‘9¾9Ñ9 ê9 : ): 6: A: N:[:c: l:v:|:ƒ:‡::“:™::&½:ä: è: ;);D; I; W; b;l;1s;¥;®;¿;Æ; ß;é; <#<*<2< :<D<d< s<”<«<¯< ³< ¾<Ë< Ó<à<#å< ==="=#'=K=j={=“=š=ž=¤=¨=¯=Å=Ú= ã= ð=þ=>>> >$>5>>>^>c> l>7w>9¯>é> ??$?)? >? H?R?a?x? |?ˆ?Œ? ?›? ´?¾? Æ? Ò?Ü?á?ê?ï?ó?÷?ÿ?@@%@)@ .@ O@\@c@i@@˜@¯@¾@ Ñ@Ü@á@ê@ ü@ AAA"A&A.A 1A I€IŸI ¨I³I¹I ÏI ÜIêI ïI üI JJJ#!J EJOJXJpJ‹J"J³J »JÈJÍJÔJ*ØJ<K$@K'eKK- K4ÎK L LL L9LALULZL_LgLnL uLL‡L‹L£L¦L «L¸L ÊLÕL ÜLçLM M M!M 1MfEfJfQf"Vf$yfžf±fÑf×fÜfãf çfñfg!g)g0g ?g JgTg\g _g kgwg€gg £g ­g:¹g:ôg/h LhZhkhth‰hh˜h¨hÁh ÅhÐhÔh Øhähi ii$i:i?iFiMiQiUi[isixiˆiŒi"‘i ´iÁi ÈiÕiìi#j*j=j Pj \j gj%sj™jªj»j ¿jÉjÍjÕj Øj âjïjöjûjk#"kFk ^klkƒk ‹k•k ´k¾kÇkÛkìkòk%øk"lAlPlVlul{l‹l”l˜l¬l ÇlÓlãlòlm#m+m-Fmtm{mŠm§m¸m ¼mÆmÏmØmàm.þm-n$Mn,rn>Ÿn@Þn(o%Ho&no'•o3½o0ño)"p2Lpfp7æp/qNqWq_q}qƒq‡q¢q ¼qÉqÛq5êq r0&r Wr;xr>´rIór=s\scslsrs…s šs¥s ªsµsÊsÙsÞs"ästtt,tDt'Jt rt ~tŠt’t—t7›tFÓt5u=PuŽu(¦u/Ïu ÿu vvv 1v;vLvSvXv^vdvjvsv{v!v¡v§v ­v»v ËvÙv Þvèvw ww )w 7wAwIwNwewuw~w(–w"¿wâw)ûw%x+x=ø$/8QÌ´Æî™—µVß, šàç0?5¥âÚŒa±å9Gi¸‚þVFYOõÅsŸÇP@ ¾Šªã_=£< ˜xˆWD;Íüa (!%}ŽÞ¹zÈÒÓMÉR§·Z†JÁ>Bìh´Ëc ,Ñëk«­ Õ¾ÖLŒf³ nºÊ>6˜©n$ y{ñ²Q e€3ÐEèLY¡-„ê\X")įïÈ–l¦¥T‡ÒjŸ[¶ÞÃiÅz†H…‹²UC…Pg ­‘»ASÚ w^gdÝÙR•¡pófð³ÀK×ûBÏ'¨Éžm`{Ü1‰Ô7ØŽ-?£Ì‰Oý¦A&؇Ub¬'€áË!ö~”M•.m^›¿Ý±k¯q½°„IÏ6ÿŠ‚™©æ¤rùuEJ&Ätv+K›Ö@ÜC‘®ÎÑÓÊ:7+ƒ}2ˆÛ<"FD9W¤0or“ƒÔò¿Iv¼ú”×À\bc’é5wœ)yǺ]ÕS÷_‹~[4*xí–ä oÆ Â:“N¶Xp·§—3#ÍÁhô»«’eª#qGÙ%¸d¨ÎN`(j2t/ Ð;1½s¬®¹š|4µ]Hlüž¢¢°Û*œ|8.uZT --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --help display this stuff --version, -v show the program version info -n, --number mobile number to send an event to (sms only) -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s About Accounts.. Age : %s Age range : %s Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Birthdate : %s Cellular phone : %s Change color scheme to : %s Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Check the local mailbox : %s Check the password : %s City : %s Comment Communications Company : %s Contact list Country : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Fax : %s File transfers monitor Files Find/add user(s) Find/add users First name : %s Gender : %s Groups Hide offline users : %s Home Homepage : %s IM account manager Incoming from %s Invite to conference.. Join channel Join channel/conference Joined since the last check only Keywords Language : %s Last name : %s Leave channel Location Logging Login : %s Miscellaneous More Move to group.. Name : %s Name/Title Network Nickname Nickname : %s Online only Online/offline events in the log window : %s Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Ping Position : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remove channel del Request authorization SMTP server : %s Search parameters Search profiles Search service Secured : %s Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Show users who have you on their list State : %s Street address : %s Timestamps in the log window : %s UIN UIN : %s Update user details User interface View/edit ignore list View/edit invisible list View/edit visible list Work Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [icq] ICQ network [irc] IRC [jab] Jabber [msn] M$ Messenger [yahoo] YAIM of password: server address: uin: user name: ! another running copy of centerim detected! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! this may cause problems. pid %lu%s from %s, received on %s%s has been deopped by %s.%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s to %s has been put to the queue%s to %s, sent on %s%s went offline%s: went offline%s: went online, with status %s* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ cannot fetch away messages being offline+ last msg from %s+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateCancelCannot remove a transfer which is in progress nowCellularCellular phone: ChangeChannel topic now is: %sChannel: Check the new password: Check the password you entered: City: CommentCompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Custom status message:DNDDecDepartmentDepartment: DetailsDisconnectedDoneDrop the account information first!E-Mail: E-mailE-mail: EditEmpty authorization request messageEnter birthdate (DD-MM-YYYY): Event recipientsEvents sending options:FailedFaxFax: FebFemaleFetching your detailsFile transfer statusFinishedFirst name: Free for chatFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLanguagesLast IPLast name: Last seenLoadLocationMaleMarMayMessageMobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNicknameNickname to set: Nickname: Not specifiedNovOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %s to %sPING reply from the user: %d second(s)Password must be enteredPassword: Passwords do not matchPhonePhone: Please join my conference.Position: PrevRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?RenameReplyResult of the external action %s:RetrieveRetrying..RomanceSMSSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSendSend contacts..Sending requestSent on %sSepServer: State: Street address: StudentsThe Jabber ID was successfully registeredThe profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesTimed out waiting for a new uin. Retry?TimezoneTitleTrying to register %s at %s ...UIN: URLURLs within the current contextUnable to connectUsage: User infoVisible listWait a moment. Your details haven't been fetched yetWorkWrong nickname given, cannot registerYou have to disconnect the service first!You must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: abortaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecLearchanged our %s status to %s from %scomment: contactscould not create socketcould not resolve hostnamedarkdirectory to save the file(s) to: disabledon't changedonee-mailerrevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesicq disconnection reasonignoredincoming %s from %sinitlOadmessagemode 1mode 2move Downmove Upn/anew MSN friendly nick: nononenotificationoutgoing %s to %spassword: rEmovereason: %sregistration is not supportedsAvesearch for: set by %ssocket problemssound cardspeakerstartstatus change error: the message was: turboingunknown IM typeunknown status character was givenusername and password mismatchverify the hostname and portverify the pager host and port enteredworkyesProject-Id-Version: centerim 4.6.9 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2003-07-01 14:44+0800 Last-Translator: Khairulanuar Abd Majid Language-Team: Bahasa Melayu Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --ascii, -a gunakan aksara ASCII bagi tetingkap dan kawalan UI --basedir, -b tetapkan direktori asas --help senaraikan benda ini --version, -v tunjukkan maklumat versi -n, --number nombor telefon bagi menghantar peristiwa (sms sahaja) -s, --send jenis peristiwa; samada msg, sms atau url -t, --to UIN atau nama pendek destinasi (bergantung kepada protokol) %s: maklumat Bahasa Utama : %s Bahasa Kedua : %s Bahasa Ketiga : %s Mengenai Akaun.. Umur : %s Lingkungan umur : %s Anti-spam: buang mesej dari pengguna yang tiada dalam senarai : %s Susun rakan ke dalam kumpulan : %s Pengesahan diperlukan: %s Masa untuk menetapkan Away secara automatik (min) : %d Masa untuk menetapkan N/A secara automatik (min) : %d Tarikh Lahir : %s Telefon Bimbit : %s Tukar skima warna ke : %s Tukar Nama pendek Tukar kata laluan : %s Tukar peranti bunyi ke : %s Channel : %s Mod mesej chat : %s Mod mesej chat bagi : %s Periksa peti surat setempat : %s Periksa kata laluan : %s Bandar : %s Komen Hubungan Syarikat : %s Senarai hubungan Negara : %s Jabatan : %s Maklumat terperinci IM di dalam fail log ~/.centerim/log : %s Maklumat Buang Emel : %s Emel : %s Edit mesej away pada perubahan status : %s Faks : %s Monitor pindahan fail Fail Cari/tambah pengguna Cari/Tambah rakan Nama : %s Jantina : %s Kumpulan Sembunyikan pengguna offline : %s Rumah Laman Web : %s Pengurus akaun IM Datang dari %s Jemput ke perbincangan.. Sertai channel Sertain channel/perbincangan Sertai sejak kali terakhir diperiksa sahaja Katakunci Bahasa : %s Nama Keluarga : %s Tinggalkan channel Lokasi Log Login : %s Pelbagai Lagi Pindah ke kumpulan.. Nama : %s Nama/Title Network Nama panggilan Nama panggilan : %s Online sahaja Peristiwa online/offline di dalam tetingkap log : %s Susunan kumpulan rakan Keluar ke %s Kata Laluan Kata laluan (pilihan) : %s Katalaluan : %s Tetapkan kata laluan : %s Telefon : %s Ping Jawatan : %s Quote mesej dalam balasan : %s Kumpulan Chat Rawak Kumpulan chat rawak : %s Daftar Daftar ke rangkaian %s Parameter pendaftaran Progress pendaftaran Servis pendaftaran Ingat kata laluan : %s Buang channel del Minta pengesahan Pelayan SMTP : %s Parameter carian Profil carian Servis carian Selamat : %s Hantar mesej channel enter Hantar SMS Hantar fail Hantar fail ke %s, %lu Pelayan : %s Pelayan yang hendak diguna : %s Servis Tetapkan mesej away Tunjukkan pengguna yang menyenaraikan anda di dalam senarai mereka Negeri : %s Jalan : %s Stem masa di dalam tetingkap log : %s UIN UIN : %s Kemaskini maklumat rakan Antaramuka pengguna Papar/edit senarai abai Papar/edit senarai invisible Papar/edit senarai nampak Kerja Maklumat %s anda Poskod : %s [Ctrl-X simpan, Esc batal] [aim] AOL TOC [icq] rangkaian ICQ [irc] IRC [jab] Jabber [msn] M$ Messenger [yahoo] YAIM dari kata laluan: alamat pelayan: uin: nama pengguna: ! ada centerim lain sedang dilarikan! ruang storan kurang dari 10k, offline! sebaliknya kita akan kehilangan data dan tetapan! ini mungkin menyebabkan masalah. pid %lu%s dari %s, diterima pada %s%s telah di-nyah-OP oleh %s.%s telah diOPkan oleh %s.%s telah me-nyah-OPkan kita.%s telah menyertai.%s telah keluar%s telah mengOPkan kita.%s ke %s telah dimasukkan ke dalam queue%s kepada %s, dihantar pada %s%s offline%s: ke offline%s: jadi online dengan status %s* Pengesahan : * Permintaan pengesahan : * Rakan : * Pindahan fail* SMS : + %s telah dimasukkan ke senarai+ [%02d:%02d:%02d] mail baru diterima, %d mesej+ [%s] telah ditetapkan secara automatik %s+ [%s] status restored+ [aim] hubungan gagal: %s+ [aim] kata laluan telah dihantar+ [aim] gagal menghubungi pelayan+ [icq] diputuskan+ [icq] gagal SMS ke %s+ [icq] gagal SMS ke %s, %s+ [irc] hubungan gagal: %s+ [irc] nama pendek berjaya ditukar+ [irc] kata laluan telah dihantar+ [irc] gagal menghubungi pelayan+ [jab] ralat %d: %s+ [jab] tiada mesej away dari %s, %s+ [jab] gagal menghubungi pelayan+ [msn] emel dari %s, %s+ [msc] selesai reverse senarai pengguna, %d ditemui+ [msn] email tidak dibaca: %d dalam inbox, %d dalam folder+ [yahoo] sambungan gagal: + [yahoo] gagal login: akaun anda dihalang+ [yahoo] gagal login: nama dan kata laluan tidak seragam+ [yahoo] emel dari %s, %s+ [yahoo] meninggalkan perbincangan %s+ gagal dapatkan mesej away kerana offline+ mesej terakhir dari %s+ tiada URL di dalam konteks sekaran+ tiada aksi luaran ditetapkan bagi %s+ tiada sejarah bagi %s+ kofigurasi %s berubah, muat semula+ pengguna telah kembali+ untuk aktifkan semula, lawat %s+ pengguna %s telah berada dalam senarai rakan+ anda mesti log in terlebih dahulu20 anEmel ke-230 an40 an50 Ke atas60-ke atasMengenaiTerimaTambahAlamatUmurUmur: AprAnda pasti untuk membuang %s?Adakah anda pasti untuk memadam kumpulan?OgoJangkamasa Auto Away (0 - matikan): Jangkamasa Auto N.A (0 - matikan): Auto-join perbincanganAwayMesej away:LatarbelakangTarikh LahirBatalTidak boleh buang penghantaran yang sedang berlangsung sekarangTelefon BimbitTelefon Bimbit: TukarTajuk Channel sekarang ialah: %sChannel: Periksa kata laluan baru: Periksa kata laluan yang anda masukkan: Bandar: KomenSyarikatSyarikat: Sedang menghubungi pelayan %s ...Rakan ingin ditambahRakan perbincangan sekarang ialah: Mesej status kostum:DNDDisJabatanJabatan: MaklumatDiputuskanSiapBuang maklumat akaun dahulu!Emel: EmelEmel: EditMesej permintaan pengesahan kosongMasukkan Tarikh Lahir (HH-BB-TTTT): Penerima peristiwaPilihan penghantaran peristiwa:GagalFaksFaks: FebPerempuanDapatkan maklumat andaStatus penghantaran failSelesaiNama: Sedia berborakKe hadapanPermainanJantinaAmSembang Am Pilihan am:TeruskanSejarah bagi %s, %d semuanyaRumahLaman WebLaman Web: Saya seronok dengan mesej away %s yang default bagi %s %s.Saya gemar menggunakan profil defaul AIM dari centerim %s.Abaikan semua acara dari %s?Sengarai abai%s masuk dari %sMaklumatMaklumat mengenai %sMinatSembunyiSenarai LimunanJemput ke perbincangan..JanMasuk/BinaJulJunKatakunci: Ditendang oleh %s; sebab: %sBahasaIP TerakhirNama keluarga: Kali terakhir ditemuiMuatLokasiLelakiMacMeiMesejNombor telefon bimbit: LagiPindah ke rakanN/ANamaNama kumpulan yang hendak dibuat: Nama/Title: Nama: Tidak pernahUIN baru diterima, %luNama baru bagu kumpulan: Nama pendek baru untuk dipaparkan: Kata laluan baru: Nama profil baru: Carian baruSeterusnyaNama pendekNama samaran yang hendak ditetapkan: Nama panggilan: Tidak ditetapkanNovDigunakanOktOfflineOkEmel lamaDi channel: OnlineBukaSusunan kumpulan rakan%s keluar ke %sBalasan PING dari pengguna: %d saatKata laluan mesti diisiKata laluan: Kata laluan tidak samaTelefonTelefon: Sila sertai perbincangan saya.Jawatan: KemudianPengguna Chat RawakDiterima pada %sTolakBuangKeluarkan %s juga dari senarai rakan?Buang %d rakan dari senarai rakan?Namakan semulaBalasKeputusan bagi aksi luaran %s:AmbilSedan mencuba..RomantikSMSNama pelayan SMTP: Keputusan carian [selesai]Cari/TambahMencari rakan..Mencari LelakiMencari WanitaPilihPIlih kumpulan untuk masukkan rakanMasukkan rakan ke kumpulanPilih rakan untuk dimasukkan ke dalam senaraiHantarHantar rakan..Sedang menghantar permintaanDihantar pada %sSepPelayan: Negeri: Alamat: PelajarID Jabber berjaya didaftarkanNama profil telah wujud. Anda ingin teruskan ?Pengguna di sana menggunakan %sDirektori yang diberikan tidak wujudDirektori yang diberikan tidak dapat ditulisPengguna %s menolak jemputan anda untuk menyertai perbincanganPengguna %s telah mengajak anda ke perbincangan %s, tajuknya: %sPengguna %s telah menyertai perbincanganPengguna %s meninggalkan perbincanganPengguna menyambut hari lahir hari iniPengguna telah menerima permintaan andaPengguna telah menambah anda ke dalam senarai rakanPengguna telah menukar nama pendek dari %s ke %sPengguna tidak mempunyai profil maklumat.Pengguna menolak permintaan anda; mesejnya ialah: Pengguna telah mengeluarkan anda dari senarai rakannya (menyah-langgan anda, menggunakan bahasa JabberPengguna ingin melanggan ke rangkaian anda yang terkiniMasa tamat semasa menunggu UIN baru. Cuba lagi?Zon MasaPangkatCubaan mendaftar %s di %s ...UIN: URLURL dalam konteks sekarangGagal menghubungi pelayanPenggunaan: Maklumat penggunaSenarai NampakTunggu sebentar. Maklumat anda masih belum diperolehiKerjaNama pendek diberikan tidak sah, gagal mendaftarPutuskan servis terlebih dahulu!Anda mesti log ke rangkaian ICQ untuk mengemaskini maklumatAnda mesti log ke rangkaian Jabber untuk mengemaskini maklumatAnda mesti log ke rangkaian MSN untuk mengemaskini nama pendek yang mesraMaklumat anda telah diperolehiPoskodPoskod: batalhubungan aim gagalseperti yang dimintapengesahanawaymesej awaykatalaluan tidak sahnama tidak sahbirucLeartukar status kita %s ke %s dari %skomen: hubungangagal membina soketgagal dapatkan nama hosgelapfail akan disimpan di dalam direktori: tidak aktifjangan ubahselesaiemelerrmasalah menghantar peristiwa: parameter tidak mencukupimasalah menghantar peristiwa: hanya UIN dibenarkan dengan protokol icqmasalah menghantar peristiwa: jenis IM tidak dikenalimasalah menghantar peristiwa: jenis peristiwa tidak diketahuilog peristiwa dimulakanlakukan aksi luaran %s, return code = %dlakukan aksi luaran manual %s, return code = %dnama fail: nama fail: failsebab icq ditamatkandiabaikan%s masuk dari %smulaanmUatmesejmod 1mod 2ke bawahke atasn/anama pendek baru yang mesra MSN: tidaktiadapemberitahuan%s keluar ke %skata laluan: uBahsebab: %spendaftaran tidak disokongsimpAncari bagi: ditetapkan oleh %smasalah soketkad bunyispeakermularalat menukar status: mesejnya ialah:mencepatjenis IM tidak dikenaliterima aksara status yang tidak dikenalinama dan kata laluan tidak seragamsahkan nama hos dan portsahkan hos pager dan port yang dimasukkankerjayacenterim-4.22.10/po/ru.gmo0000644000175000001440000015442011473011460012156 00000000000000Þ•˜Üwœ)x7Ky76Å71ü75.8-d8/’8IÂ88 9GE9=9HË9 :":6:J:^:*~:©: ±: ½:È:Ù:è:';6(;#_;ƒ;•;*³;)Þ;<<0<F<d<v<<«<º<Õ<!ó<=4= N=Z= q={=Œ=›=ª=¹=Ì=0Þ= >>)8>b>{> ‚>)>-º>+è>)?">?a?!€? ¢? °?»?Í?å?í?@@"@ 6@ D@N@W@p@Š@‘@¡@¶@Ð@ã@ û@ A""A"EAhA }AˆA˜A¨A¹AÈAÚA!íAB $B /B 9BFBbBuB …B‘B˜B ©B ¶B ÂB ÏB#ÙB ýBC C.&CUC gCqCŠC ›C¦CÁCÑC èCõC)D.D>DUD'eDD­DÁD ÚDåDEE4EKEeE{E›E²EÅEÙEëEüE FF3F SF `FnF ˆF–F «FµF'ÈF ðFýFG "G#CGgG GŠGœG ²G¾GÏGíGHH6H=HSHeHuH‘H¤H ©H µHÁHÓH ÚH+çH2I1FI0xI+©I"ÕI øIJJ:JSJlJJ ŽJšJ2«JÞJ"ýJ K)5K*_KŠKšK«K ËK ÕKãKöK LL/L0OL€LœL³LÎL'äL M%M>M&UM"|MŸM¶MËMäMN)NFN'\N„N•N#ªN'ÎN'öNO=OTOoOŒO¤O'ºO6âOP5PNP0iP1šP ÌPíP4Q6=Q"tQ—Q#´QØQ*÷Q"R 5RVR$vR$›RÀR,ÚRSS 3STS rS S ŠS —S¤S¬S µS¿SÅSÌS ÐSÜSäSèSîSòS&T9T=T FTgT‡T¢T §T µT ÀTÊTáT1èT U%U.U?U FUTUiU ‚U"ŒU ¯UÐUÖUèU V"V)V 1VaLa\a lawa{a„a—aŸa°a)¹a4ãaGb`b&wb'žbJÆb?cHQc%šc#ÀcIäc.d0Ld.}d-¬d$ÚdCÿd\Ce< e+Ýe' f1f:f@fHfhfnfŽf§f'¹fáfóf ûfgg g4)g^gcg%tg)šgBÄg;h?ChAƒhÅhäh íhøhþhi .i ;i Ii Vi cipiui|i‚i#‘i µi¿iØiòiûij.j=jBj"Gjjj rj jŒj‘j¥j©j=¯j*íj<k$Uk'zk¢k-µk4ãk l $l/l5l ;lHlYl_lxl€l”l­l²l·l ¼l(Ælïl÷lûlm mmm3m6m ;mEm Nm[m!mm mšm¯m!Ámãmëmn nn3nQnVn pn}n …nn Ÿnªn²n¸nÎnÖnènñn"o$o)o:oYo&voo ¢o¬o°o©Ãojmq\ØqL5rb‚r?årN%sytsKîsm:t`¨tv u€u“u§u»u3ÏuBv FvTvdvzvv¬vJÌv`w7xw°w2Íw:x9;x3ux ©x(Êx"óx"y"9y,\y‰y.›y5Êy6zF7z+~zªz/¼zìz {{ *{K{3_{“{9¥{ ß{>ê{I)|0s|¤| µ|hÃ|E,}7r}Fª};ñ}B-~Ip~º~Ø~%è~0 ?4L& ¨"¶ Ù çô%€N)€x€€!›€?½€ý€3F7bKšNæ"5‚X‚"v‚™‚©‚¿‚&Ü‚'ƒE+ƒ,qƒ žƒ¿ƒ΃#àƒ*„/„>„Z„)w„¡„ µ„Ä Ö„:á„…'%…M…El…²… Ê…9×…†%†14†f†z†ކ¤†M¼† ‡)$‡N‡Qh‡Bº‡ý‡#ˆ@ˆ'Yˆ+ˆ­ˆ%ƈ"ìˆ,‰+<‰*h‰“‰!¬‰Ήì‰0Š 9ŠZŠ2zŠ­ŠŠ(ߊ‹,‹I‹.X‹U‡‹1Ý‹Œ!Œ=1Œ9oŒ1©Œ ÛŒæŒ0'6-^/Œ¼*Ö(Ž*Ž&9Ž"`ŽƒŽ/—ŽÇŽÜŽãŽóŽ  (?6dvdÛJ@G‹<Ó‘‘I?‘4‰‘F¾‘5’;’J’=Y’S—’-ë’3“M“Yi“cÓ '”3”8R”‹”¥”·”(Ó”ü”•%2•PX•8©•,â•6–!F–Gh–(°–/Ù–, —C6—/z—)ª—"Ô—7÷—;/˜6k˜4¢˜!טGù˜A™Y™0u™G¦™5î™7$š\šLyšCÆš5 ›(@›1i›R››"î›5œGœGbœJªœBõœ78^pgÏ?7žwž1”ž8ÆžZÿž/ZŸ$ŠŸ?¯ŸFïŸG6 %~ H¤ +í E¡$_¡a„¡æ¡ ö¡¢¢"¢5¢H¢ Z¢f¢}¢ Ž¢ ¯¢º¢É¢Ø¢?ߢI£i£ p£*}£)¨£>Ò£¤&¤?¤W¤!i¤‹¤gœ¤¥¥#,¥P¥a¥%}¥1£¥ Õ¥Sâ¥Q6¦ˆ¦!›¦&½¦4ä¦ §&§=§V§g§/z§,ª§+×§%¨+)¨AU¨—¨Až¨ ਠë¨ø¨ ©!©6©Q© k©Cx©¼©Å© ̩٩Mð©>ª(Qªzª˜ª4­ª#⪫« «)«0«$?«d«>„«,ëð«ù«"¬<¬K¬`¬t¬‡¬¬ —¬¤¬¸¬Õ¬$ä¬) ­3­/D­:t­¯­¶­É­¢Þ­Ž®4¯@E¯†¯Ÿ¯»¯į߯ð¯1°29°l°s°°”°1›°LͰ ± %±3±H±Y±l± ±Œ±!›±½± бÛ±ê±<ñ±.²5²(H²2q² ¤²±²̲1Ó²³³³".³ Q³7r³ª³3ijø³´´*´1´O´X´_´t´†´ ´ š´¥´¬´±´Á´×´ç´8ö´ /µPµ'lµ(”µ½µB?¶=‚¶!À¶]â¶X@·/™·É·$Ø·Zý·X¸g¸x¸‰¸ž¸±¸ɸÒ¸ví¸)d¹޹¢¹³¹7¹Vú¹Qº`º)qº ›ºE¦ºìºýº»#»6»E»4b» —»¢»»Þ»ú»5 ¼H?¼Mˆ¼?Ö¼½!%½G½c½(ƒ½¬½ʽܽã½7ò½,*¾ W¾d¾<u¾m²¾^ ¿"¿;¢¿[Þ¿‚:Ào½À`-Á@ŽÁAÏÁzÂ(ŒÂwµÂZ-ÃEˆÃGÎËÄ¥¢ÄoHÅU¸Å=Æ LÆWÆjÆ>ƾÆ1ÄÆ'öÆ+ÇcJÇ+®ÇÚÇ÷ÇÈ È/"ÈaRÈ ´È#ÁÈZåÈQ@É€’ɀʀ”ÊnË=„Ë ÂËÏËÞË'íË.ÌDÌXÌoÌ%‡Ì8­Ì æÌñÌÍ+Í7?ÍwÍ(Í>¹ÍøÍ. Î78Î!pÎ ’ΟÎ,¨ÎÕÎçÎÏ ÏÏ 7ÏDÏ^SÏY²Ï ÐNšÐXéÐ)BÑSlÑSÀÑÒ(Ò <Ò GÒ TÒuÒ Ò-˜ÒÆÒåÒ7Ó 9ÓDÓUÓ-hÓ;–ÓÒÓåÓ ìÓ ùÓÔ ÔÔ9Ô@ÔGÔYÔnÔÔ1ÔÏÔ(ÞÔÕK!Õ mÕzÕŠÕ™Õ8¬Õ%åÕ Ö.ÖMÖ \ÖiÖ1yÖ«Ö¼Ö ËÖ(ØÖ××*$×)O×My×Ç×à×Lû×0HØ0yØªØ»ØØØ2ÝØkù‘^^{m>™ôD'Òp b«j4ªÇ«)4ל"?1xÿeùJ`cy5*‚\ÜŸ-¨Á~Šlcp®q¤Nê ž VÄJ’ëŽvµ»4Ô”øÝ NuM"aKU¹ëH@.Ž-ua¶(Ô¦ZµÌrV0_¡V%GÑ~)X[¯n­1 ÒIÉväOR“¤ýŒñ–CUþ/áo¥l3ìxrØ&t“¦S¡t7X3DzwÙÛn šGA ”:T‹Å¥|ƒ–W´Î Dˆ&feP¶_ÃÖOy°â‡92ȱ/ hºÀrî9Zš˜»´¼gÓ}íˆ?fÁ,À#”€º“ é.‡B/·AÏ Ÿ$nE\ÇÐ,8S j£`3lTB-QèõA™súÚ7*Ú×›Ë@O„Ë[W{­F+÷Ä XigL¢YƒŠæ s…ï&Þ¨29NãóqB# Yt¾€6=!L²ÍpÌ6Iãm~>Ž—d:É}ú‹=m³U£¸€ÿ?½Fh‰®áâ2Š ±¬P‰à‘,ѽ]¹ðWû.Ïæ\ÍR÷ÕÖ05<’(¸Û#vø%HC¯<JPŒ–‡Ùe¼¿þûS˜ð‹"•†ƒ!ˆ§‚„ÊhÂ+Åê;˜é‚ß'z…ì[{Œݲ8Õ³·•=5 +Ê a$;(üçΆky†¾åE%Gbgoüw‰öåÐQ©Lïç]bk—› Zu]ÞRwM|:œQ1o—<MöÜq¢Iiž )‘0cdT6ª¬`©ó$õK°K^|Y8_ô!jäz„}ßs;í'iòHÆÃý•7Ædî…>xEF’C§*Óàè@òf¿ÈñØ --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --debug, -d enables debug info logging --help display this stuff --no-xtitles, -T disable xterm titles --offline, -o set all protocols status to offline upon start --version, -v show the program version info -n, --number mobile number to send an event to (sms only) -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Accounts.. Age : %s Age range : %s All protocols Already logged in only Always online non-IM contacts for : %s Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Assign PGP key.. Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Backdated entry : %s Birthdate : %s Cellular phone : %s Change color scheme to : %s Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Codepages conversion Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users First name : %s For protocols : %s Gender : %s General Groups HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Import friend list : %s Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Joined since the last check only Key passphrase: %s Keywords Keywords : %s Language : %s Last name : %s Leave channel Link an RSS feed Link an RSS feed LiveJournal posting: attributes Local charset : %s Location Logging Login : %s Look for online only : %s Mass group move.. Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network NickServ password (optional) : %s Nickname Nickname : %s Online only Online/offline events in the log window : %s OpenPGP key: %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Priority : %s Proxy only for HTTP (rss and lj) : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remote charset : %s Remove channel del Request authorization SMTP server : %s Search parameters Search profiles Search service Secured : %s Security : %s Select PGP key to use Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Show users who have you on their list State : %s Street address : %s Subject : %s Switch to language preset : %s Timestamps in the log window : %s Turn PGP encryption %s UIN : %s Unassign PGP key Update user details Use no key User interface Users with photos only : %s View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [icq] ICQ network of password: priority: server address: uin: user name: ! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu%lu minutes%s from %s, received on %s%s has been deopped by %s.%s has been kicked by %s%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s or %s to close, Up/Down and PgUp/PgDn to scroll%s search, %s again, %s cancel%s to %s has been put to the queue%s to %s, sent on %s%s to URLs, %s external actions, %s close%s to URLs, %s to full-screenize, %s close%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer+ %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [gg] cannot resolve %s+ [gg] connection failed+ [gg] connection lost+ [gg] connection to the server failed+ [gg] no away message from %s, %s+ [icq] cannot connect+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] cannot connect: + [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ [yahoo] server closed socket+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ new mail arrived, %d messages+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAdd to listAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateBlock channel messagesCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChange statusChannel chat historyChannel topic now is: %sChannel: Charset to convert messages from: Charset to convert messages to: CheckCheck frequency: Check the new password: Check the password you entered: City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DecDefault Jabber conference serverDepartmentDepartment: Description: DetailsDetect musicDisconnectedDo not disturbDoneDrop the account information first!E-Mail: E-mailEditEdit detailsEmpty authorization request messageEncodingEnter birthdate (DD-MM-YYYY): Event historyEvent recipientsEvents sending options:External actions..FailedFaxFax: FebFemaleFetch away messageFetch version infoFetching your detailsFile transfer statusFirst name: Force checkFree for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadGo to contact..HTTP proxy server hostname: HandleHide offline usersHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIgnore userIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLanguagesLast IPLast checkLast name: Last resultLast seenLinkLink: List nicknamesLoadLocationMaleMarMass move selected users to..MayMessageMessage from the server: Mobile number: MoreMove to contactsNameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: NoneNot availableNot specifiedNovNowOccupiedOctOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %sOutgoing %s to %sPGP encrypt error: PGP key passphrase: PGP key search: type to find, %s find again, Enter finishPGP key selection: %s for quick lookupPGP passphrase required: PGP sign error: PING reply from the user: %d second(s)Password must be at least 6 chars longPassword must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: PolishPosition: PostPosting subject: PrevPublished on: QuickSearch: type to find, %s find again, Enter finishRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?Remove userRenameRename contactReplyResult of the external action %s:RetreiveRetrieveRetrying..RomanceRussianSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSelect contacts to moveSendSend a messageSend an URLSend contactsSend contacts..Sending requestSent on %sSepServer: Show offline usersState: Street address: StudentsThe Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesThis is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLs within the current contextUnBlock channel messagesUnable to connectUnable to connect to icq server. Retry?Unset ignore userUsage: User infoUser's detailsVersionVisible listWait a moment. Your details haven't been fetched yetWorkWrong Jabber ID!Wrong nickname given, cannot registerYou have to disconnect the service first!You must be logged to the Gadu-Gadu network to update your detailsYou must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: abortadding %s to the contactsaim connection failedas requestedauthorizationaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: connecting to the servercontact list quick searchcontactscould not create socketcould not resolve hostnamecouldn't fetchdarkdaysdirectory to save the file(s) to: disabledisconnecteddon't changedonedual login detectederreventevent sending error: error creating directory for the contactevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfoundfriends onlyfull-screen viewhoursicq disconnection reasonignoredincoming %s from %sincorrect PGP passphraseinitlInklOadlogged inmembers list fetching finished, %d foundmessageminmode 1mode 2move Downmove Upnew MSN friendly nick: nononenot foundnot usednotificationoutgoing %s to %spassword was changed successfullypassword: pgp key quick searchpgp key selectionpost new entries to your journal.privatepublic (visible to all)rEmovereason: %sregistration is not supportedremoving %s from the contactssAvesearch finished, %d foundsearch for: secondsset by %ssocket problemssound cardspeakerstartstatus change error: successthe message was: turboingunknown IM typeunknown status character was givenuseduser info for %susername and password mismatchverify the hostname and portverify the pager host and port enteredworkwrong XMLyesyou are an op hereProject-Id-Version: centerim 4.20.0 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2004-02-08 01:22+0300 Last-Translator: Konstantin Klyagin Language-Team: Russian Language: ru MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --ascii, -a иÑпользовать ASCII Ñимволы Ð´Ð»Ñ Ð¾ÐºÐ¾ÑˆÐµÐº и рамок --basedir, -b <путь> задать другую базовую директорию --bind, -B IP Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ñщих Ñоединений --debug, -d включить запиÑÑŒ отладочной информации --help показать Ñтот Ñкран --no-xtitles, -T не менÑть заголовок окна xterm --offline, -o уÑтановить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñех протоколов в offline при Ñтарте --version, -v показать верÑию программы -n, --number <тел.ном.> мобильный номер Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ (только Ð´Ð»Ñ sms) -s, --send <тип> тип ÑообщениÑ; может быть msg, sms или url -t, --to <назначение> UIN или nickname Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ (завиÑит от протокола) %s: детали 1й Ñзык : %s 2й Ñзык : %s 3й Ñзык : %s <пробел> выбрать, отмена <пробел> или выбрать, отмена О Ñебе Логины.. ВозраÑÑ‚ : %s ВозраÑÑ‚ : %s Ð’Ñе протоколы Уже Ñоединенные Контакты вÑегда онлайн Ð´Ð»Ñ Ð½Ðµ-IM Ñетей : %s Ðе принимать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ юзеров, что не в ÑпиÑке : %s Поддержка групп контактов : %s Задать PGP ключ.. Ðеобходима Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : %s ÐвтоматичеÑки Away поÑле (мин) : %d ÐвтоматичеÑки N/A поÑле (мин) : %d ПомеÑтить задним чиÑлом : %s Дата Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ : %s Мобильный телефон : %s Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñхема : %s Сменить friendly nickname Сменить пароль : %s Звуковое уÑтройÑтво : %s Канал : %s Чат-режим при общении : %s Чат-режим при общении Ð´Ð»Ñ : %s ЧаÑтота проверки (минуты) : %lu ПроверÑть локальный почтовый Ñщик : %s Пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ : %s Город : %s Перекодировка Ñообщений Комментарий СвÑзь ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ : %s СпиÑок контактов Страна : %s Свой вариант наÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ : %s Отдел : %s Подробный журнал в ~/.centerim/log : %s Инфо Отключить автоформатирование : %s Отключить прием комментарием по e-mail : %s Отключить комментарии : %s Удалить E-Mail : %s Редактировать away ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ переключении ÑтатуÑа : %s Поддержка двунаправленных Ñзыков : %s Кнопки а-Ð»Ñ emacs в редакторе : %s ПрÑмые ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ клиентами : %s Включить web ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ : %s ОтÑылка Ñообщений по нажатию Enter : %s ОтÑылка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ нажатию Enter Ð´Ð»Ñ : %s Ð’ÑÑÐºÐ°Ñ ÐºÑ€Ð°Ñота Ð¤Ð°ÐºÑ : %s Параметры подпиÑки Монитор переÑылки файлов Файлы ПоиÑк/добавление контактов ПоиÑк пользователей Ð˜Ð¼Ñ : %s Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¾Ð² : %s Пол : %s Общие Группы HTTP прокÑи-Ñервер : %s Ðе показывать тех, кто не на линии (offline) : %s Дом Страничка : %s Менеджер логинов Добавить друзей в контакт-лиÑÑ‚ : %s Прием от %s ПриглаÑить на конференцию.. Войти на канал ПриÑоединитьÑÑ Ðº конференции ПриÑоединитьÑÑ Ð¸Ð»Ð¸ Ñоздать конференцию Только вошедшие поÑле поÑледней проверки ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° : %s Ключевые Ñлова Ключевые Ñлова : %s Язык : %s Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ : %s Покинуть канал Добавить RSS подпиÑку Добавить RSS подпиÑку Помещение запиÑи в журнал: аттрибуты Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° : %s МеÑтонахождение Журнал Логин : %s Только на линии : %s МаÑÑовое перемещение.. Прочее ÐаÑтроение : %s Дополнительно ПеремеÑтить в группу.. Музыка : %s Ð˜Ð¼Ñ : %s Ðазвание Сеть Пароль NickServ (не обÑзательно) : %s Ðик Короткое Ð¸Ð¼Ñ (ник) : %s Только на линии Входы-выходы пользователей в логе : %s OpenPGP ключ : %s Опции Управление группами контактов ПоÑылка %s Пароль Пароль (не обÑзательно) : %s Пароль : %s Пароль : %s Телефон : %s Картинка : %s Диапазон портов Ð´Ð»Ñ Ð¿Ñ€Ñмых Ñоединений : %s ДолжноÑть : %s ПомеÑтить в журнал : %s Приоритет : %s ИÑпользовать прокÑи только Ð´Ð»Ñ HTTP (rss и lj) : %s Цитировать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ ответе : %s Группа random-чата Группа random-чата : %s РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð² Ñети %s Параметры региÑтрации РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¡Ð»ÑƒÐ¶Ð±Ð° региÑтрации Помнить пароли : %s Ð£Ð´Ð°Ð»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° : %s Удалить канал del ЗапроÑить авторизацию SMTP Ñервер : %s Параметры поиÑка Профили поиÑка Служба поиÑка Защищенное Ñоединение : %s Права доÑтупа : %s Выберите PGP ключ ПоÑлать чат-Ñообщение enter ПоÑлать SMS ПоÑлать файл(Ñ‹) ПоÑылка файла(ов) %s, %lu Сервер : %s ИÑпользовать Ñервер : %s Служба УÑтановить away-Ñообщение Показать тех, у кого в ÑпиÑке еÑть наш контакт ОблаÑть/штат/Ð¿Ñ€Ð¾Ð²Ð¸Ð½Ñ†Ð¸Ñ : %s ÐÐ´Ñ€ÐµÑ : %s Тема : %s УÑтановить автоматичеÑки Ð´Ð»Ñ : %s Ð’Ñ€ÐµÐ¼Ñ Ñобытий в окошке лога : %s УÑтановить PGP-шифрование %s UIN : %s СброÑить PGP ключ Обновить Ñвою информацию Ðе иÑпользовать ключ Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¢Ð¾Ð»ÑŒÐºÐ¾ Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñми : %s Игнор. ÑпиÑок СпиÑок invisible-контактов СпиÑок visible-контактов Работа ÐÐ´Ñ€ÐµÑ XML ÑкÑпорта : %s Ваша %s Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð˜Ð½Ð´ÐµÐºÑ : %s [Ctrl-X Ñохранить, Esc отмена] [icq] Сеть ICQ из пароль: приоритет: Ñервер : номер: логин: ! обнаружена Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÑŽÑ‰Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ centerim! Ñвободного меÑта на диÑке оÑталоÑÑŒ < 10k, раÑÑоединение! Ñвободного меÑта на диÑке оÑталоÑÑŒ < 10k, раÑÑоединение! иначе мы можем терÑть ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¸ глючить! поддержка %s была выключена при Ñборке! Ñто может вызвать проблемы. pid %lu%lu минут%s от %s, получено %s%s больше не оператор канала, %s ÑнÑл флаг.%s был выброшен командой от %s.%s назначен оператором по инициативе %s.%s ÑнÑл Ñ Ð½Ð°Ñ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°%s вошел.%s вышел.%s уÑтановил нам ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°.%s or %s закрыть, Вверх/Вниз и PgUp/PgDn Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¸%s поиÑк, %s опÑть, %s отменаочередь пополнилаÑÑŒ на %s к %s%s к %s, поÑлано %s%s показать ÑÑылки, %s внешние программы, %s закрыть%s показать ÑÑылки, %s раÑкрыть в полный Ñкран, %s закрыть%s ушел%s: ушли в оффлайн%s: вышли в онлайн, Ñо ÑтатуÑом %s(по умолчанию)(нет/Ñвой)* ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : * Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ð¸ : * Контакты : * Передача файлов+ %s добавлен в ÑпиÑок+ [%02d:%02d:%02d] получена Ð½Ð¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°, %d Ñообщений+ [%s] автоматичеÑкий переход в %s+ [%s] ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ð¾ÑÑтановлен+ [aim] не удалоÑÑŒ ÑоединитьÑÑ: %s+ [aim] пароль выÑлан+ [aim] невозможно ÑоединитьÑÑ Ñ Ñервером+ [gg] не удалоÑÑŒ найти %s+ [gg] Ñоединение не удалоÑÑŒ+ [gg] Ñоединение прервано+ [gg] Ñоединение Ñ Ñервером не удалоÑÑŒ+ [gg] нет away-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñƒ %s, %s+ [icq] ошибка ÑоединениÑ+ [icq] раÑÑоединение+ [icq] невозможно отоÑлать SMS к %s+ [icq] невозможно отоÑлать SMS к %s, %s+ [irc] не удалоÑÑŒ ÑоединитьÑÑ: %s+ [irc] никнейм изменен уÑпешно+ [irc] пароль выÑлан+ [irc] невозможно ÑоединитьÑÑ Ñ Ñервером+ [jab] ошибка %d+ [jab] ошибка %d: %s+ [jab] нет away-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñƒ %s, %s+ [jab] невозможно ÑоединитьÑÑ Ñ Ñервером+ [jab] отказываемÑÑ Ð¾Ñ‚ агента %s+ [lj] %s добавлен в ÑпиÑок друзей+ [lj] ошибка HTTP: %s+ [lj] добавление в ÑпиÑок друзей не удалоÑÑŒ+ [lj] ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка друзей+ [lj] не удалоÑÑŒ ÑоединитьÑÑ: %s+ [lj] ошибка отправки: %s+ [lj] отправлено удачно, id = %s+ [lj] удаление из ÑпиÑка друзей прошло уÑпешно+ [lj] поиÑк завершен+ [msn] невозможно ÑоединитьÑÑ: + [msn] e-mail от %s, %s+ [msn] чтение ÑпиÑка завершено, %d найдено+ [msn] Ð½ÐµÑ‡Ð¸Ñ‚Ð°Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°: %d в inbox, %d в фолдерах+ [yahoo] кто-то еще вошел под Ñтим ником+ [yahoo] невозможно ÑоединитьÑÑ: + [yahoo] невозможно ÑоединитьÑÑ: аккаунт заблокирован+ [yahoo] невозможно ÑоединитьÑÑ: неправильный логин/пароль+ [yahoo] прÑмое Ñоединение не удалоÑÑŒ+ [yahoo] e-mail от %s, %s+ [yahoo] выход Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð¸ %s+ [yahoo] Ñервер закрыл Ñоединение+ невозможно запроÑить away-Ñообщение, будучи в offline+ поÑледнее Ñообщение от %s+ команда %s запущена+ получена Ð½Ð¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°, %d Ñообщений+ не ни одной ÑÑылки в данном контекÑте+ внешние программы Ð´Ð»Ñ %s не определены+ иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ %s пуÑта+ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ %s изменена, перечитываем+ пользователь вернулÑÑ+ чтобы реактивировать его, поÑетите %s+ %s уже еÑть в ÑпиÑке+ вы должны войти в Ñеть прежде чем добавить кого-либо20-летние2-й e-mail30-летние40-летние50 и больше60 и больше<нет ника>О ÑебеПодтвердитьДобавитьДобавить в ÑпиÑокÐдреÑВозраÑтВозраÑÑ‚ÐпрВы дейÑтвительно хотите удалить %s?Ð’Ñ‹ дейÑтвительно хотите удалить группу?ÐвгÐвтор: Ðвто-away поÑле (0 - выкл): Ðвто-N/A поÑле (0 - выкл): Ðвто-вход в конференцию ÑоÑтоÑлÑÑОтÑутÑтвиеAway Ñообщение:Прошлый опытДата рождБлокировать каналОтменитьÐевозможно удалить передачу, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÐµÑ‰Ðµ не закончилаÑьКатегориÑ: МобильныйМобильный телефон: ИзменитьСменить ÑтатуÑÐрхив чата на каналеУÑтановлена тема канала: %s Канал: ÐšÐ¾Ð´Ð¾Ð²Ð°Ñ Ñтраница, из которой конвертировать: ÐšÐ¾Ð´Ð¾Ð²Ð°Ñ Ñтраница, в которую конвертировать: ПроверитьЧаÑтота проверки: Пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸: Контроль введенного паролÑ: Город: КомментарийКомментарии: КомпаниÑКомпаниÑ: Соединение Ñ Ñервером %s ...Контакты Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÑУчаÑтники конференции: Текущее наÑтроение: Играет в данный момент: ПользовательÑкое ÑтатуÑ-Ñообщение:ДекСтандартный Jabber Ñервер конференцийОтделОтдел: ОпиÑание: ИнфоОпределить музыкуРаÑÑоединениеÐе беÑпокоитьГотовоСначала удалите информацию о логине!E-Mail: E-mailРедактРедакт. инфоПуÑтое Ñообщение в запроÑе на авторизациюКодировкаДата Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ (DD-MM-YYYY): Ðрхив ÑообщенийПолучателиОпции Ð´Ð»Ñ Ð¿Ð¾Ñылки Ñообщений:Внешние программы..ÐеудачаФакÑФакÑ: ФевЖенÑкийЧитать away-ÑообщениеЗапроÑить верÑиюЗапрашиваем перÑональные детали..Монитор передачи файловИмÑ: Проверить ÑейчаÑÐе прочь поболтатьЧаÑтотаВ друзьÑÑ… уПолное имÑПереÑлатьИгрыПолСвалкаОбщий трепОÑновные опции:ПоехалиПерейти к контакту..Ð˜Ð¼Ñ HTTP прокÑи-Ñервера: ÐазваниеСкрыть offline-пользователейИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ %s, вÑего %d ÑообщенийДомСтраничкаСтраничка: Мне дейÑтвительно нравитÑÑ Ñообщение Ð´Ð»Ñ %s, которое centerim %s %s уÑтанавливает по умолчанию.Мне дейÑтвительно нравитÑÑ AIM profile, который centerim %s уÑтанавливает по умолчанию.Игнорировать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ %s?СпиÑок игнорируемых пользователейИгнорироватьВходÑщее %s от %sÐ˜Ð½Ñ„Ð¾Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ %sИнтереÑÑ‹ÐевидимоÑтьСпиÑок invisible пользователейПриглаÑить на конференцию..ЯнвЗайти/СоздатьИюлИюнКлючевые Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка: Выброшен Ñ ÐºÐ°Ð½Ð°Ð»Ð° оператором %s; причина: %sЯзыкиIP-адреÑПредыдущаÑФамилиÑ: РезультатПоÑвлениеСÑылкаСÑылка: СпиÑок учаÑтниковЗагрузитьМеÑтоМужÑкойМарПеремеÑтить выбранные контакты..МайСообщениеСообщение от Ñервера: Ðомер мобильного телефона: ДополнВ контакт-лиÑтИмÑÐазвание Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ группы: ÐазваниеИмÑ: ÐикогдаПолучен новый UIN, %luÐовое Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹: Ðовый ник Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° в ÑпиÑке: Ðовый пароль: Ðазвание Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ поиÑка: Ðовый поиÑкСледСледующаÑÐикУÑтановить ник: Ðик: ÐетÐедоÑтупенÐе указанÐоÑСейчаÑЗанÑтОктОкСтар e-mailÐа каналах: Ðа линииОткрытьУправление группами контактовРедактирование %s ИÑходÑщее %s к %sОшибка PGP-шифрованиÑ: ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° Ð´Ð»Ñ PGP: БыÑтрый поиÑк PGP ключа: набирайте Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка, %s повторить, Enter завершитьВыбор PGP ключа: %s Ð´Ð»Ñ Ð±Ñ‹Ñтрого поиÑÐºÐ°ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° необходима Ð´Ð»Ñ PGP: Ошибка PGP-подпиÑи: Ответ на PING от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ‹Ð» получен за %d ÑекундПароль должен быть как минимум 6 Ñимволов длинойПароль должен быть указанПароль: Пароли не ÑовпадаютДиапазон портов Ð´Ð»Ñ Ð¿Ñ€Ñмых Ñоединений (мин-макÑ): ТелефонТелефон: ПольÑкийДолжноÑть: ОтправитьТема запиÑи: ПредОпубликовано: БыÑтрый переход: набирайте Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка, %s повторить, Enter завершитьПользователь из random chatПолучено %sОтказатьУдалитьУдалить %s из ÑпиÑка контактов?Желаете удалить Ñти %d контактов из ÑпиÑка тоже?УдалитьИзменитьПереименовать контактОтветРезультат работы внешней программы %s:ОбновитьОбновитьПовторÑем..РомантикаРуÑÑÐºÐ¸Ð¹Ð˜Ð¼Ñ SMTP Ñервера: Результаты поиÑка [завершен]ПоиÑкПоиÑк контактов..Ищущие мужчиныИщущие женщиныВыбратьВыберите группу Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°Ð’Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ новую группу Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑВыберите контакты Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑпиÑокВыберите контакты Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸ÑПоÑлатьПоÑлать ÑообщениеПоÑлать ÑÑылкуПоÑлать контактыКонтакты Ð´Ð»Ñ Ð¾Ñ‚Ñылки..ПоÑылка запроÑаПоÑлано %sСенСервер: Показывать offline-пользователейОблаÑть/штат/провинциÑ: ÐдреÑ: СтудентыРегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Jabber ID прошла уÑпешноСледующие пользователи добавили Ð²Ð°Ñ Ð² ÑпиÑки Ñвоих друзей: ПоиÑк Ñ Ñ‚Ð°ÐºÐ¸Ð¼ имененм уже ÑущеÑтвует. ПерезапиÑать?.. а мы пользуемÑÑ %sУказанный каталог не ÑущеÑтвуетÐе хватает прав на запиÑÑŒ Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð³Ð¾ каталогаПользователь %s (%s) добавил Ð²Ð°Ñ Ð² Ñвой ÑпиÑок друзей ÐÐ´Ñ€ÐµÑ ÐµÐ³Ð¾ журнала: %sПользователь %s ответил отказом на приглашение к конференцииПользователь %s приглаÑил Ð²Ð°Ñ Ð² конференцию %s, тема: %sПользователь %s вошел в конференциюПользователь %s покинул конференциюПользователь %s удалил Ð²Ð°Ñ Ð¸Ð· Ñвоего ÑпиÑка друзей ÐÐ´Ñ€ÐµÑ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð°: %sÐ¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð´ÐµÐ½ÑŒ рождениÑПользователь подтвердил Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° добавление в ÑпиÑок контактовПользователь добавил Ð²Ð°Ñ Ð² Ñвой ÑпиÑок контактовПользователь поменÑл Ñвой ник Ñ %s на %sУ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½ÐµÑ‚ профайл-информации.Пользователь отклонил Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° добавление в ÑпиÑок контактов; объÑÑнение: Пользователь удалил Ð²Ð°Ñ Ð¸Ð· ÑпиÑка контактов. ВыражаÑÑÑŒ Ñзыком Джаббера, "отпиÑалÑÑ" от ваÑПользователь хочет получать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑтатуÑа в ÑетиЭто ваш логин на LiveJournal. Его можно иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÑŒÐ’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ¸ иÑтекло. Повторить?ВремÑДолжноÑтьЗаголовок: Попытка зарегиÑтрировать %s на %s ...UIN: СÑылки в текущем контекÑтеРазблокировать каналÐевозможно ÑоединитьÑÑÐевозможно ÑоединитьÑÑ Ñ Ñервером. Повторить попытку?Разблокировать контактИÑпользование: ИнфоИнформациÑВерÑиÑСпиÑок visible пользователейПодождите минуточку. Ваша Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐµÑ‰Ðµ не полученаРаботаÐеправильный Jabber ID!Ðеверный пÑевдоним, невозможно зарегиÑтрироватьСначала вы должны произвеÑти раÑÑоединение!Ð’Ñ‹ должны быть в он-лайн чтобы иметь возможноÑть обновлÑть информациюВы должны быть в он-лайн чтобы иметь возможноÑть обновлÑть информациюВы должны быть в он-лайн чтобы иметь возможноÑть обновлÑть информациюВы должны быть в он-лайн чтобы иметь возможноÑть Ñменить никВаша Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð° уÑпешноИндекÑИндекÑ: отменендобавление %s в ÑпиÑокaim не удалоÑÑŒ ÑоединитьÑÑпо запроÑуавторизациÑaway-Ñообщениенеправильный парольнеправильное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑÑинÑÑОтменитьОчиÑтитьневозможно ÑоединитьÑÑпоменÑли Ñвой %s ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° %s Ñ %sкомментарий: Ñоединение Ñ ÑерверомбыÑтрый поиÑк по ÑпиÑку контактовконтактыневозможно Ñоздать Ñокетневозможно определить IP хоÑтаошибка ÑоединениÑтемнаÑÐ´Ð½ÐµÐ¹Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»(ов): без звукараÑÑоединениене менÑтьготовдвойной входошибкаÑобытиеошибка отÑылки ÑобытиÑ: невозможно Ñоздать каталогошибка отÑылки ÑобытиÑ: недоÑтаточно параметровошибка отÑылки ÑобытиÑ: Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð³Ð¾ протокола разрешены только номера (UIN)ошибка отÑылки ÑобытиÑ: неизвеÑÑ‚Ð½Ð°Ñ IM Ñетьошибка отÑылки ÑобытиÑ: неизвеÑтный тип ÑобытиÑжурналирование начатозапущен внешний обработчик %s, код возврата = %dзапущена внешнÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° %s, код возврата = %dÐ¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: файлынайдентолько Ð´Ð»Ñ Ð´Ñ€ÑƒÐ·ÐµÐ¹Ð¿Ð¾Ð»Ð½Ñ‹Ð¹ ÑкранчаÑовпричина раÑÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ icqпроигнорировановходÑщее %s от %sÐ½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° Ð´Ð»Ñ PGPÑвÑзьДобавитьЗагрузитьвход в ÑиÑтему ÑоÑтоÑлÑÑвывод ÑпиÑка завершен, %d найденоÑообщениеминрежим 1режим 2ВнизВверхновый MSN friendly nick: нетнетне найденне иÑпольз.извещениеиÑходÑщее %s к %sпароль был изменен уÑпешнопароль: быÑтрый поиÑк pgp-ключавыбор pgp ÐºÐ»ÑŽÑ‡Ð°Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… запиÑей в ваш журнал.Ð»Ð¸Ñ‡Ð½Ð¾ÐµÐ´Ð»Ñ Ð²ÑехУдалитьпричина: %sрегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑудаление %s из ÑпиÑкаСохранитьпоиÑк завершен, %d найденоиÑкать: Ñекундавтор - %sкоммуникационные проблемызв. картадинамикначалоошибка Ñмены ÑтатуÑа: уÑпешноÑообщение:Ñлишком чаÑтые попыткинеизвеÑтный тип IM ÑетинеизвеÑÑ‚Ð½Ð°Ñ Ð±ÑƒÐºÐ²Ð° Ð´Ð»Ñ ÑтатуÑа была заданаиÑпользуетÑÑÐ¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ %sнеÑовпадение имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролÑпроверьте Ð¸Ð¼Ñ Ñ…Ð¾Ñта и портпроверьте Ð¸Ð¼Ñ Ñ…Ð¾Ñта и портпрогреÑÑнеправильный XMLдавы - оператор на Ñтом каналеcenterim-4.22.10/po/nl.po0000644000175000001440000023606711473011457012013 00000000000000# translation of nl.po to Nederlands # A translation for centerim to dutch # Copyright (C) 2002, 2004 Free Software Foundation, Inc. # Marino Vande Walle , 2002. # Sander Devrieze , 2004. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: nl\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2008-08-03 19:52+0100\n" "Last-Translator: Matthias Nieuwenhuisen \n" "Language-Team: Nederlands \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.3.1\n" #: src/centerim.cc:138 msgid "password: " msgstr "wachtwoord: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "%s contactenmenu, %s status wijzigen, %s algemene acties, %s afsluiten" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Alles van %s negeren?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "Wilt u ook %s van de contactenlijst verwijderen?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Weet je zeker dat je %s wil verwijderen?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Nieuwe naam om te tonen: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Selecteer een groep om de gebruiker naartoe te verplaatsen" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ kan de 'ben weg' berichten niet ophalen als je 'offline' bent" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! kan niet verbinden, vrije schijfruimte is minder dan 10k" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "Afwezigheidsbericht" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! support voor %s is uitgeschakeld bij compilatie" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ nieuwe e-mail binnengekomen, %d berichten" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] nieuwe e-mail binnengekomen, %d berichten" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ laatste bericht van %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ de %s configuratie is gewijzigd, herladen" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! er draait al een centerim" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! dit kan problemen veroorzaken. PID %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "GSM nummer: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "map om de bestanden naar op te slaan: " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "De gespecificeerde map is tegen schrijven beveiligd" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "De gespecificeerde map bestaat niet" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ geen geschiedenis van %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ gebruiker %s staat al in je lijst" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Selecteer een groep" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s is toegevoegd aan je lijst" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ de gebruiker is terug" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] status hersteld" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] automatisch op %s gezet" #: src/centerim.cc:1490 msgid "away" msgstr "weg" #: src/centerim.cc:1490 msgid "n/a" msgstr "niet ber." #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! vrije schijfruimte is minder dan 10k, bezig met offline gaan" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! anders kunnen we gebeurtenissen en de configuratie verliezen" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "Nodig uit op conferentiekamer.." #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "Selecteer contacten om toe te verplaatsen" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "Verplaats geselecteerde gebruikers massaal naar.." #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "kon niet afhalen" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "foutieve XML" #: src/hooks/rsshook.cc:353 #, fuzzy msgid "no or tag found" msgstr "geen -tag gevonden" #: src/hooks/rsshook.cc:362 #, fuzzy msgid "no or tag found" msgstr "geen -tag gevonden" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "foutieve -tag" #: src/hooks/rsshook.cc:380 msgid "success" msgstr "gelukt" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "Titel: " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "Gepubliceerd op: " #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "Categorie: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "Auteur: " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "Beschrijving: " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "Koppel: " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "Commentaar: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] kan niet verbinden: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "kon hostnaam niet opzoeken" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "kon geen socket creëren" #: src/hooks/yahoohook.cc:180 #, fuzzy msgid "verify the pager host and port entered" msgstr "controleer de pager host en de ingevoerde poort" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] bezig met verlaten van conferentiekamer %s" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "Betreed alstublieft mijn conferentie." #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Standaard statusbericht:" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] kan afwezigheidsbericht niet afhalen van %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] kan niet verbinden: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "" "+ [yahoo] kan niet aanmelden: gebruikersnaam en wachtwoord komen niet overeen" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "" "+ [yahoo] kan niet aanmelden: gebruikersnaam en wachtwoord komen niet overeen" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] kan niet aanmelden: de account is geblokkeerd" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ om bezoek %s te heractiveren" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] er is al ergens anders aangemeld op deze account" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] server heeft socket gesloten" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "" "Gebruiker %s heeft u uitgenodigd om de conferentiekamer %s met onderwerp %s " "te betreden" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "Huidige aanwezigen in deze conferentiekamer zijn:" #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Automatisch toegetreden tot de conferentiekamer" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "" "Gebruiker %s heeft uw uitnodiging om toe te treden tot de conferentiekamer " "geweigerd" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "Gebruiker %s heeft de conferentiekamer betreden" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "Gebruiker %s heeft de conferentiekamer verlaten" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "De gebruiker heeft je toegevoegd aan zijn/haar contactenlijst" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "het bericht was:" #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] e-mail van %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] systeem: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] fout: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] fout: %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] rechtstreekse verbinding mislukt" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] kan niet verbinden: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] kan niet verbinden: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] kan niet verbinden: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] kan niet verbinden: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] fout: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] fout: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] kan niet verbinden: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] kan niet verbinden: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] fout: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "De gebruiker is jarig vandaag" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] kan niet verbinden met de server" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] bezig met het ongedaan maken van de registratie op %s" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Afwezigheidsbericht:" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] geen afwezigheidsbericht van %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "Kan niet registreren: verkeerde bijnaam opgegeven" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "Kan niet verbinden" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "De persoon op afstand gebruikt %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "Standaard Jabber conferentieserver" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, c-format msgid "+ [jab] error %d" msgstr "+ [jab] fout %d" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] fout %d: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "De gebruiker wilt zich inschrijven op uw status updates" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "De gebruiker heeft u verwijderd van zijn/haar roster" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] kan niet verbinden met de server" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "Ik hou van het standaard AIM-profiel van centerim %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "verbinden met aim mislukt" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] verbinding mislukt: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "De gebruiker heeft geen profielinformatie" #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] wachtwoord verzonden" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "zoals gevraagd" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "socket probleem" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "foute gebruikersnaam" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "turboing" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "fout wachtwoord" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "gebruikersnaam en wachtwoord verkeerd" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ [msn] kan niet verbinden: " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] verbinding verbroken" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "reden van verbroken icq-verbinding" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "De gebruiker heeft uw autorisatieaanvraag aanvaard" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "De gebruiker heeft uw autorisatieaanvraag geweigerd; het bericht was: " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] gefaald SMS naar %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] gefaalde SMS naar %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] kan 'ben weg' bericht van %s niet ophalen, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Willekeurige gesprekspartner" #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ [gg] verbinding verbroken" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [gg] kan niet opzoeken %s" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "+ [gg] verbinding met de server is mislukt" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "+ [gg] verbinding verbroken" #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [jab] geen afwezigheidsbericht van %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] kan niet verbinden met de server" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] verbinding mislukt: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] bijnaam is met succes gewijzigde" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Op kanalen: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Verbannen door %s met de reden: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "De gebruiker heeft zijn/haar bijnaam veranderd van %s naar %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] wachtwoord verzonden" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] wachtwoord verzonden" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "PING-antwoord van de gebruiker: %d seconde(n)" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s heeft de kamer betreden." #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s heeft de kamer verlaten" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "reden: %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s is gebannen door %s" #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "Kanaalonderwerp is nu: %s" #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "ingesteld door %s" #: src/hooks/irchook.cc:1541 #, fuzzy, c-format msgid "%s has been opped by %s." msgstr "%s is geopped door %s." #: src/hooks/irchook.cc:1557 #, fuzzy, c-format msgid "%s has been deopped by %s." msgstr "%s is gedeopped door %s." #: src/hooks/irchook.cc:1571 #, fuzzy, c-format msgid "%s has opped us." msgstr "%s heeft ons geopped." #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "u bent hier nu een op" #: src/hooks/irchook.cc:1585 #, fuzzy, c-format msgid "%s has deopped us." msgstr "%s heeft ons gedeopped." #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] opzoeken van gebruikers beëindigd" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "kan niet verbinden" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] HTTP mislukt: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "Bericht van de server: " #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] aanmelden mislukt: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] posten gelukt, de ID is %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] fout tijdens posten: %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Gebruiker %s (%s) heeft u toegevoegd aan zijn/haar contactenlijst\n" "\n" "Adres van dagboek: %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Gebruiker %s heeft u van zijn/haar contactenlijst verwijderd\n" "\n" "Adres van dagboek: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] fout tijdens verwijderen van contact" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] de gebruiker is verwijderd van uw contactenlijst" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] kon contactpersoon niet toevoegen" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s is toegevoegd bij uw contactpersonen" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] omkeren van gebruikersopsomming beëindigd, %d gevonden" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "+ [msn] ongelezen e-mail: %d in postvak in, %d in mappen" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] e-mail van %s, %s" #: src/hooks/msnhook.cc:905 msgid "+ [msn] cannot connect: " msgstr "+ [msn] kan niet verbinden: " #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "controleer de hostnaam en poort" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "bezig met verbinden met de server" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "aangemeld" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "zoekopdracht beëindigd, %d gevonden" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "wachtwoord is met succes gewijzigd" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "verbinding verbroken" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "%s aan de contacten toevoegen" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "%s verwijderen van de contactlijst" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "afhalen van ledenlijst beëindigd, %d gevonden" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "De gebruiker is jarig vandaag" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Jan" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Feb" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Maa" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Apr" #: src/icqcontact.cc:854 msgid "May" msgstr "Mei" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Jun" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Jul" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Aug" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Sep" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Okt" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Nov" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Dec" #: src/icqgroups.cc:66 msgid "General" msgstr "Algemeen" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Verzonden op %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60+" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "onbekend IM type" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Algemeen gesprek" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Romantiek" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Spelletjes" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Studenten" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "Ongeveer 20" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "Ongeveer 30" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "Ongeveer 40" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50-plus" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "Zoekt vrouw" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Zoekt man" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Naam" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Profielen zoeken " #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Verwijder" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Laden" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ u moet eerst aangemeld zijn" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "lAden" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "oPslaan" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "Wis" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Verander" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Zoek/Voeg toe" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "Betreed/Creëer" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "Koppel" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Zoek/voeg gebruiker(s) toe " #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr "Betreed/creëer een kanaal/conferentiekamer" #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr "Koppel een RSS-feed" #: src/icqdialogs.cc:299 msgid " Network " msgstr " Netwerk " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Details " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Nickname : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Voornaam : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Achternaam : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Leeftijds bereik : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Geslacht : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Taal : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " Locatie " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Plaats : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Provincie : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Land : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Werk " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Bedrijf : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Afdeling : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Positie : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Alleen online " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr "Willekeurige gespreksgroep" #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Sleutelwoorden " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Nickname " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " Zoekdienst " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Zoekparameters " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr "" #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " URL van XML-export : %s " #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr "Controleer frequent (in minuten) : %lu " #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Kanaal : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Naam : %s " #: src/icqdialogs.cc:407 #, fuzzy msgid " Joined since the last check only " msgstr " Betreden sinds de laatste controle alleen" #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " Sleutelwoorden : %s " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " Opties " #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " Enkel gebruikers met foto's : %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " Kijk enkel naar online : %s " #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Toon gebruikers die u op hun contactenlijst hebben" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Naam/Titel " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Wachtwoord " #: src/icqdialogs.cc:443 msgid " Service " msgstr " Dienst " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Naam voor nieuw profiel: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "Er bestaat al een profiel met deze naam. Wilt u het overschrijven?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Nickname: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Naam/titel: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-Mail: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Voornaam: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Achternaam: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Plaats: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Provincie: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Bedrijf: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Afdeling: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Positie: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Kanaal: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Naam: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Sleutelwoorden: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Wachtwoord: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "URL: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "Controleer frequent: " #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "Foutieve JabberID!" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Algemeen " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " Registratiedienst " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Registratieparameters " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " Verander wachtwoord : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Geb. Datum : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Leeftijd : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Thuis " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Straat : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Postcode : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefoon : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " GSM : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Homepage : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Meer " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1ste taal : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2de taal : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3de taal : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Overige " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Schakel web status indicator aan : %s" #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr "Willekeurige gespreksgroep : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr "Autorisatie vereist : %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Provincie : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " Over " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Details ophalen" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Uw %s details " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: details " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Klaar" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Even wachten. Bezig met ophalen..." #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-mail: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Geboortedatum (DD-MM-JJJJ): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Leeftijd: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Straat: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "Postcode: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefoon: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "GSM nummer: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Homepage: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Over" #: src/icqdialogs.cc:869 msgid "New password: " msgstr " Nieuw wachtwoord: " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr " Controleer het nieuwe wachtwoord : " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "geen" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X bewaar, Esc annuleer] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Verstuur bestand(en) naar %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Voeg toe" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Commentaar" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Verstuur" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Bestanden " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Commentaar " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "bestandsnaam: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "commentaar: " #: src/icqdialogs.cc:1163 msgid "None" msgstr "Geen" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "Russisch" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "Pools" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " centerim configuratie " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Gebruikersinterface: " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Verander geluidsschema naar : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Verander kleurenschema naar : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr "Vraag autorisatie aan" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Achternaam : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " Kanaal : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Organiseer contacten in groepen : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Schakel bidirectionele talenondersteuning in : %s " #: src/icqdialogs.cc:1230 #, fuzzy, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Schakel emacs bindings in teksteditor in : %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " Schakel emacs bindings in teksteditor in : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 #, fuzzy msgid " Codepages conversion " msgstr " Conversie van codepagina's" #: src/icqdialogs.cc:1241 #, fuzzy, c-format msgid " Switch to language preset : %s " msgstr " Schakel om naar taal preset : %s " #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Bewaar wachtwoorden : %s " #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Achternaam : %s " #: src/icqdialogs.cc:1246 #, c-format msgid " For protocols : %s" msgstr " Voor protocollen : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Contactlijst " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Organiseer contacten in groepen : %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Organiseer contacten in groepen : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Verberg offline gebruikers : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-stalking: verw. ber. van gebruiker niet op lijst : %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr "Autorisatie vereist : %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Haal origineel bericht aan bij antwoorden : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Controleer de locale mailbox : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Bewaar wachtwoorden : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Bewerk afwezigheidsbericht bij statuswijziging : %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Berichtenmodus voor : %s " #: src/icqdialogs.cc:1272 #, fuzzy, c-format msgid " Enter key sends message for : %s" msgstr " Indrukken van key stuurt berichten voor : %s " #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Berichtenmodus : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr "" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr " Toon niet-IM contactpersonen altijd als online : %s" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " Organiseer contacten in groepen : %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Communicaties " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " SMTP server : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " HTTP proxy server : %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " HTTP proxy server : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Schakel peer-to-peer verbindingen in : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " Port range om te gebruiken voor peer-to-peer : %s " #: src/icqdialogs.cc:1299 #, fuzzy msgid " Logging " msgstr " Loggen " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr "Tijdsaanduidingen in het geschiedenisvenster : %s " #: src/icqdialogs.cc:1301 #, fuzzy, c-format msgid " Timestamps include seconds : %s " msgstr "Tijdsaanduidingen in het geschiedenisvenster : %s " #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " Online/offline gebeurtenissen in het geschiedenisvenster : %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Gedetailleerde IM gebeurtenissen opslaan in ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Zet automatisch afwezigheid periode (min) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Zet automatisch niet bereikbaar (min) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Zet automatisch niet bereikbaar (min) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Straat : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Zet autom. weg in minuten (0 - inactief): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Zet autom. nt. besch. in minuten (0 - inactief): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "Hostnaam SMTP server: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "Peer-to-peer port range (min-max): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "Hostnaam HTTP proxy server: " #: src/icqdialogs.cc:1432 #, fuzzy msgid "Charset to convert messages from: " msgstr "Tekenset om berichten van te converteren: " #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "Tekenset om berichten naar te converteren:" #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "Hostnaam HTTP proxy server: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Lege autorisatie-aanvraag" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Uw details zijn opgehaald" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Organiseer contactgroepen" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Hernoem" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "Verwijder" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "verplaats naar Boven" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "verplaats naar beNeden" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Selecteer" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Groepen " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Naam voor de groep: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Nieuwe naam voor de groep: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Ben je zeker dat de groep verwijderd mag worden?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Status bestandsoverdracht" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Annuleren" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " Binnenkomend van %s " #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " Uitgaand bericht naar %s " #: src/icqdialogs.cc:1865 #, fuzzy msgid "init" msgstr "init" #: src/icqdialogs.cc:1866 msgid "start" msgstr "start" #: src/icqdialogs.cc:1867 msgid "work" msgstr "werk" #: src/icqdialogs.cc:1868 msgid "done" msgstr "klaar" #: src/icqdialogs.cc:1869 msgid "err" msgstr "" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "afbreken" #: src/icqdialogs.cc:1877 msgid " of " msgstr " van " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "Kan geen bestandsoverdracht verwijderen die nu bezig is" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "publiek (zichtbaar voor iedereen)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "privé" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "enkel vrienden" #: src/icqdialogs.cc:2032 #, fuzzy msgid " LiveJournal posting: attributes " msgstr " LiveJournal posting: attributen " #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "Detecteer muziek" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "Post" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Annuleren" #: src/icqdialogs.cc:2052 #, fuzzy, c-format msgid " Post to journal : %s " msgstr " Positie : %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " Onderwerp : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " Veiligheid : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr "" #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " Humeur : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(geen/aangepast)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " Aangepast humeur : %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " Muziek : %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " Afbeelding : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(standaard)" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Leeftijd : %s " #: src/icqdialogs.cc:2071 #, fuzzy, c-format msgid " Disable auto-formatting : %s " msgstr " Zet automatische formatering uit : %s" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " Zet commentaar versturen via e-mail uit : %s" #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " Laat geen commentaren toe : %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr "" #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "Luistert dit moment naar: " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "Huidig humeur: " #: src/icqdialogs.cc:2094 #, fuzzy msgid "Tags for the entry: " msgstr "Bericht van de server: " #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr " Contactlijst " #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "" "SnelVinden: voer gegevens in die je wilt zoeken, %s om opnieuw te zoeken, " "Enter om te beëindigen" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 #, fuzzy msgid " Use no key" msgstr "Gebruikersinformatie" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "externe manuele actie %s uitgevoerd, return code = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "externe actie %s uitgevoerd, return code = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Offline" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Online" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Onzichtbaar" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Vrij voor klets" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Niet storen" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Bezig" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] Niet beschikbaar" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "Weg" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "Niet St." #: src/imlogger.cc:39 msgid "N/A" msgstr "Nt. besch." #: src/imlogger.cc:49 msgid "message" msgstr "bericht" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "autorisatie" #: src/imlogger.cc:53 msgid "e-mail" msgstr "e-mail" #: src/imlogger.cc:54 msgid "notification" msgstr "notificatie" #: src/imlogger.cc:55 msgid "contacts" msgstr "contacten" #: src/imlogger.cc:56 msgid "files" msgstr "bestanden" #: src/imlogger.cc:57 msgid "event" msgstr "gebeurtenis" #: src/imlogger.cc:79 msgid "events log started" msgstr "gebeurtenislogger gestart" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "uitgaande %s naar %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "inkomende %s van %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "genegeerd" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s ging offline" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "%s naar %s, verstuurt op %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: is nu online, met %s status" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: ging offline" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "status %s veranderd naar %s van %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " IM accountbeheer " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Server : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " Beveiligd : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Aanmelden : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Wachtwoord (optioneel) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Wachtwoord : %s " #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr " Prioriteit : %s " #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr " Importeer contactenlijst : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Wachtwoord (optioneel) : %s " #: src/accountmanager.cc:141 #, c-format msgid " Request receipts: %s " msgstr " Ontvangstbevestiging aanvragen: %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Organiseer contacten in groepen : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " Registreer " #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Geslacht : %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Sleutelwoorden : %s " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " Wijzig bijnaam " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Update gebruikersdetails " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Verander afwezigheidsbericht " #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Weggooien " #: src/accountmanager.cc:200 msgid " user name: " msgstr " gebruikersnaam: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " wachtwoord: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Eerst accountinfo weggooien!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Eerst service ontkoppelen! (disconnect)" #: src/accountmanager.cc:241 msgid " server address: " msgstr " server adres: " #: src/accountmanager.cc:285 msgid " priority: " msgstr " prioriteit: " #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " Registreer op het %s netwerk " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Doe maar" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Wachtwoord veranderen naar : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Controleer wachtwoord : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Te gebruiken server : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Controleer ingevoerd wachtwoord: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Nickname veranderen: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Server: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Wachtwoorden komen niet overeen" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Wachtwoord moet ingevoerd worden" #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "Wachtwoord moet minstens 6 tekens lang zijn" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Registratieverloop " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Verbinding maken met server %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Aanvraag sturen" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Timeout tijdens het wachten op een uin. Herproberen?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Bezig met proberen..." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Nieuwe UIN ontvangen, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Disconnected" #: src/imcontroller.cc:179 msgid "Unable to connect to icq server. Retry?" msgstr "Kan niet verbinden met de icq-server. Herproberen?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "Bezig met proberen te registreren van %s op %s ..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "De JabberID is met succes geregistreerd" #: src/imcontroller.cc:228 msgid "Failed" msgstr "Mislukt" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "U moet aangemeld zijn op het ICQ netwerk om uw details bij te werken" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "nieuwe MSN bijnaam: " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "U moet aangemeld zijn op het MSN netwerk om uw bijnaam te updaten" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "" "U moet aangemeld zijn op het Jabber netwerk om uw details bij te werken" #: src/imcontroller.cc:318 #, fuzzy msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "" "U moet aangemeld zijn op het Jabber netwerk om uw details bij te werken" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "registratie werkt nog niet" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "Ik hou van het standaard %s afwezigheidsbericht van %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "" #: src/icqconf.cc:1545 #, fuzzy msgid "event sending error: not enough parameters" msgstr "gebeurtenis verzendingsfout: niet genoeg parameters" #: src/icqconf.cc:1556 #, fuzzy msgid "event sending error: only UINs are allowed with icq protocol" msgstr "" "gebeurtenis verzendingsfout: alleen UIN's zijn toegelaten door het icq " "protocol" #: src/icqconf.cc:1571 #, fuzzy msgid "event sending error: unknown IM type" msgstr "gebeurtenis verzendingsfout: onbekend IM type" #: src/icqconf.cc:1593 #, fuzzy msgid "event sending error: unknown event type" msgstr "gebeurtenis verzendingsfout: onbekend gebeurtenistype" #: src/icqconf.cc:1610 #, fuzzy, c-format msgid "%s to %s has been put to the queue" msgstr "%s naar %s has been put to the queue" #: src/icqconf.cc:1616 #, fuzzy msgid "event sending error: error creating directory for the contact" msgstr "gebeurtenis verzendingsfout: niet genoeg parameters" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "onbekend statusteken opgegeven" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "onbekend IM type" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "fout bij wijzigen van status: " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Gebruik: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "Algemene opties: " #: src/icqconf.cc:1683 #, fuzzy msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " --ascii, -a gebruik ASCII tekens voor venster- en " "gebruikersinterfacecontrole" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b stel een aangepaste basismap in" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr "" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help laat deze gegevens zien" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v toon de versiegegevens van dit programma" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Opties voor het versturen van gebeurtenissen:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr " -s, --send gebeurtenistype; kan msg, sms of url zijn" #: src/icqconf.cc:1694 #, fuzzy msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr " -S, --status wijzig de huidige IM-status" #: src/icqconf.cc:1695 #, fuzzy msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto protocoltype; kan icq, yahoo, aim, irc, jabber of " "lj zijn" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" " -t, --to bestemmings-UIN of -bijnaam (hangt af van het " "gebruikte protocol)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" " -n, --number GSM-nummer om een gebeurtenis naar te sturen " "(enkel sms)" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Rapporteer bugs op http://bugzilla.centerim.org." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Lege autorisatie-aanvraag" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* Autorisatieaanvraag : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* Autorisatie : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Contactlijst : " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* Bestandsoverdracht" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "geen -tag gevonden" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Info" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " IM accountbeheer " #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Voor protocollen : %s " #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " gebruikersnaam: " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "ja" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "nee" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "ja" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Accounts.." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr "Alle protocollen" #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Gebruik: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr "Alle protocollen" #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Accounts.." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "ja" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "Nov" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " Dienst " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 #, fuzzy msgid "No Jabber" msgstr "Foutieve JabberID!" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "onbekend IM type" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Mannelijk" #: src/icqface.cc:53 msgid "Female" msgstr "Vrouwelijk" #: src/icqface.cc:56 msgid "Not specified" msgstr "Niet bepaald" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "Volgende" #: src/icqface.cc:63 msgid "Fwd" msgstr "Fwd" #: src/icqface.cc:64 msgid "Reply" msgstr "Antw." #: src/icqface.cc:65 msgid "Open" msgstr "Open" #: src/icqface.cc:66 msgid "Accept" msgstr "Acc." #: src/icqface.cc:67 msgid "Reject" msgstr "Verwerp" #: src/icqface.cc:68 msgid "User info" msgstr "Gebruikersinformatie" #: src/icqface.cc:70 msgid "Prev" msgstr "Vorige" #: src/icqface.cc:78 msgid "sound card" msgstr "Geluidskaart" #: src/icqface.cc:79 msgid "speaker" msgstr "Luidspreker" #: src/icqface.cc:80 msgid "disable" msgstr "niet actief" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "niet veranderen" #: src/icqface.cc:88 msgid "dark" msgstr "donker" #: src/icqface.cc:89 msgid "blue" msgstr "blauw" #: src/icqface.cc:97 #, fuzzy msgid "protocol" msgstr "Alle protocollen" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "start" #: src/icqface.cc:118 msgid "mode 1" msgstr "mode 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "mode 2" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "" #: src/icqface.cc:274 msgid "Send an URL" msgstr "Verstuur een URL" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " Verstuur een SMS" #: src/icqface.cc:276 msgid "Send contacts" msgstr "Verstuur contacten" #: src/icqface.cc:277 msgid " Request authorization" msgstr "Vraag autorisatie aan" #: src/icqface.cc:278 msgid "Edit details" msgstr "Bewerk details" #: src/icqface.cc:279 msgid "Fetch away message" msgstr "Haal afwezigheidsbericht af" #: src/icqface.cc:280 msgid "Add to list" msgstr "Toevoegen aan lijst" #: src/icqface.cc:281 msgid "Rename contact" msgstr "Hernoemen contact" #: src/icqface.cc:282 msgid " Move to group.." msgstr " Verplaats naar groep.." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "Haal versie-informatie af" #: src/icqface.cc:285 msgid " Send file(s)" msgstr "Verstuur bestand(en)" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr "Nodig uit op conferentiekamer.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Stuur een kanaalbericht enter" #: src/icqface.cc:294 msgid "Channel chat history" msgstr "Berichtengeschiedenis van kanaal" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Verwijder kanaal del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Kanaal betreden" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Kanaal verlaten" #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Toon bijnamen" #: src/icqface.cc:301 msgid "UnBlock channel messages" msgstr " Deblokkeer kanaalberichten" #: src/icqface.cc:303 msgid "Block channel messages" msgstr " Blokkeer kanaalberichten" #: src/icqface.cc:310 msgid "Send a message" msgstr "Verstuur een bericht" #: src/icqface.cc:312 msgid "Event history" msgstr "Gebeurtenissengeschiedenis" #: src/icqface.cc:313 msgid "Remove user" msgstr "Verwijder gebruiker" #: src/icqface.cc:314 msgid "User's details" msgstr "Gebruikersdetails" #: src/icqface.cc:315 msgid "External actions.." msgstr "Externe acties.." #: src/icqface.cc:318 msgid "Unset ignore user" msgstr "" #: src/icqface.cc:318 msgid "Ignore user" msgstr "Negeer gebruiker" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 msgid "Force check" msgstr "Forceer controle" #: src/icqface.cc:435 msgid "Change status" msgstr "Verander status" #: src/icqface.cc:436 msgid "Go to contact.." msgstr "Ga naar contact.." #: src/icqface.cc:437 msgid " Accounts.." msgstr " Accounts.." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " centerim configuratie" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Bestandsoverdrachtvenster" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Voeg gebruikers toe" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr "Betreed kanaal/conferentiekamer" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " Koppel een RSS-feed" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Toon/bewerk negeerlijst" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Toon/bewerk onzichtbaarlijst" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Toon/bewerk zichtbaarlijst" #: src/icqface.cc:455 msgid "Show offline users" msgstr "Toon offline gebruikers" #: src/icqface.cc:457 msgid "Hide offline users" msgstr "Verberg offline gebruikers" #: src/icqface.cc:460 msgid " Organize contact groups" msgstr "Organiseer contactgroepen" #: src/icqface.cc:461 #, fuzzy msgid " Mass group move.." msgstr "Massale groepenverplaatsing.." #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Details" #: src/icqface.cc:905 msgid "Message" msgstr "Bericht" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Opnieuw" #: src/icqface.cc:924 msgid "Contact to add" msgstr "Contact om toe te voegen" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Zoeken naar contactpersonen.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Zoekresultaten [klaar]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Informatie over %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Nickname" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "Dit is uw LiveJournal account. Gebruik het om" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "nieuwe items te posten in uw dagboek" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "De volgende gebruikers hebben u in hun contactenlijst als vriend:" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr "Negeer gebruiker" #: src/icqface.cc:1116 #, fuzzy msgid "not found" msgstr "geen -tag gevonden" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-Mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2de e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Oude e-mail" #: src/icqface.cc:1134 msgid "Gender" msgstr "Geslacht" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Geb. datum" #: src/icqface.cc:1136 msgid "Age" msgstr "Leeftijd" #: src/icqface.cc:1137 msgid "Languages" msgstr "Talen" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Laatste IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Laatst gezien" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Nooit" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 msgid "seconds" msgstr "" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "bestanden" #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Verstuur contacten" #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "autorisatie" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Adres" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Locatie" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "Postcode" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefoon" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "GSM" #: src/icqface.cc:1259 msgid "Timezone" msgstr "Tijdzone" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Homepage" #: src/icqface.cc:1300 msgid "Company" msgstr "Bedrijf" #: src/icqface.cc:1301 msgid "Department" msgstr "Afdeling" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Titel" #: src/icqface.cc:1346 msgid "Interests" msgstr "Hobby's" #: src/icqface.cc:1358 msgid "Background" msgstr "Achtergrond" #: src/icqface.cc:1376 msgid "Handle" msgstr "Handelen" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "RSS doc" #: src/icqface.cc:1378 msgid "Version" msgstr "Versie" #: src/icqface.cc:1379 msgid "Encoding" msgstr "Codering" #: src/icqface.cc:1382 msgid "Link" msgstr "Koppel" #: src/icqface.cc:1384 msgid "Frequency" msgstr "Frequentie" #: src/icqface.cc:1385 msgid "Last check" msgstr "Laatste controle" #: src/icqface.cc:1386 msgid "Next check" msgstr "Volgende controle" #: src/icqface.cc:1387 msgid "Last result" msgstr "Laatste resultaat" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu minuten" #: src/icqface.cc:1404 msgid "Now" msgstr "Nu" #: src/icqface.cc:1423 msgid "Full name" msgstr "Volledige naam" #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "%s naar URL's, %s externe acties, %s sluiten" #: src/icqface.cc:1447 #, fuzzy, c-format msgid "user info for %s" msgstr "Gebruikersinformatie" #: src/icqface.cc:1456 msgid "Check" msgstr "Controleer" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Bewerk" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "Opzoeken" #: src/icqface.cc:1466 msgid "Friend of" msgstr "Vrienden van" #: src/icqface.cc:1472 msgid "Home" msgstr "Thuis" #: src/icqface.cc:1472 msgid "Work" msgstr "Werk" #: src/icqface.cc:1472 msgid "More" msgstr "Meer" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Haal op" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] ICQ netwerk" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr " [gg] Gadu-Gadu" #: src/icqface.cc:1622 msgid " All protocols" msgstr "Alle protocollen" #: src/icqface.cc:1623 #, fuzzy msgid " Already logged in only" msgstr "Al aangemeld" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " of om te bevestigen, om te annuleren " #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " om te bevestigen, om te annuleren " #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Verplaats naar contacten" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Negeerlijst" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Zichtbaar lijst" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Niet-zichtbaar lijst" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Selecteer contacten om toe te voegen" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "" "Moeten de %d contactpersonen ook van de contactlijst verwijderd worden?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Gebeurtenis-ontvanger" #: src/icqface.cc:2269 #, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "" "SnelVinden: voer gegevens in die je wilt zoeken, %s om opnieuw te zoeken, " "Enter om te beëindigen" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr " Contactlijst " #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ geen URLs in de huidige context" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URLs in de huidige context" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ geen externe acties gedefiëerd voor %s" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "Resultaten van de externe actie %s:" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "%s versturen, %s meerdere, %s geschiedenis, %s URL's, %s uitbreiden, %s " "leden, %s sluiten" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "%s versturen, %s meerdere, %s geschiedenis, %s URL's, %s uitbreiden, %s " "details, %s annuleren" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr " Uitgaand bericht naar %s " #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Verstuur contactpersonen.." #: src/icqface.cc:2670 msgid "file name: " msgstr "bestandsnaam: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "(%s) Uitgaand bericht naar %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Verzonden op %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "Inkomende %s van %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Ontvangen op %s" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "%s naar URL's, %s voor volledige schermgrootte, %s sluiten" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s van %s, ontvangen op %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s naar %s, verstuurt op %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "%s of %s om te sluiten, Omhoog/Omlaag en PgUp/PgDn om schuiven" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "Geschiedenis van %s, %d totaal" #: src/icqface.cc:3339 #, c-format msgid "%s search, %s again, %s cancel" msgstr "%s zoeken, %s opnieuw, %s annuleren" #: src/icqface.cc:3348 msgid "search for: " msgstr "zoeken naar: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] systeem: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] e-mail van %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s is online, met %s status" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s veranderde status naar %s van %s" #~ msgid " [o] Online" #~ msgstr " [o] Online" #~ msgid " [_] Offline" #~ msgstr " [_] Offline" #~ msgid " [a] Away" #~ msgstr " [a] Weg" #~ msgid " [c] Occupied" #~ msgstr " [c] Bezig" #~ msgid " [f] Free for chat" #~ msgstr " [f] Vrij voor klets" #~ msgid " [i] Invisible" #~ msgstr " [i] Onzichtbaar" #~ msgid "+ [irc] password was requested, but it's not set" #~ msgstr "+ [irc] wachtwoord is aangevraagd maar nog niet ingesteld" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Controleer wachtwoord : %s " #, fuzzy #~ msgid " Convert from : %s " #~ msgstr " Converteer van : %s " #, fuzzy #~ msgid " Convert to : %s " #~ msgstr " Converteer naar : %s " #~ msgid "Your friendly nickname has been changed to %s" #~ msgstr "Uw bijnaam is gewijzigd naar %s" #~ msgid "already logged" #~ msgstr "al gelogd" #, fuzzy #~ msgid "" #~ "event sending error: the destination contact doesn't exist on your list" #~ msgstr "" #~ "gebeurtenis verzendingsfout: de bestemmeling bestaat niet in uw " #~ "contactenlijst" centerim-4.22.10/po/sv.po0000644000175000001440000025611111473011457012022 00000000000000# Swedish translation for centerim. # Copyright (C) 2002 Free Software Foundation, Inc. # Mattias Webjörn Eriksson , 2002. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.9.8\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2002-10-25 20:27+0200\n" "Last-Translator: Mattias Webjörn Eriksson \n" "Language-Team: swedish \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "lösenord: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" "F2/M kontaktmeny, F3/S ändra status, F4/G allmänna funktioner, Q avsluta" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Ignorera alla händelser frÃ¥n %s?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "Skall %s tas bort frÃ¥n kontaktlistan ocksÃ¥?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Är du säker pÃ¥ att du vill ta bort %s?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Nytt smeknamn: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Välj grupp att flytta användaren till" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ Du mÃ¥ste vara ansluten för att hämta frÃ¥nvarumeddelande" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! kunde inte ansluta, det finns mindre än 10k ledigt diskutrymme" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "frÃ¥nvarumeddelande" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! stöd för %s avaktiverades vid kompileringen" #: src/centerim.cc:692 src/centerim.cc:747 #, fuzzy, c-format msgid "+ new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] ny e-post, %d meddelanden" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] ny e-post, %d meddelanden" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ sista meddelandet frÃ¥n %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ %s konfigurationen ändrades och lästes in" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! en annan instans av centerim har upptäckts" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! detta kan innebära problem. pid %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Mobilnummer: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "katalog att spara filen/filerna i: " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "Den angivna katalogen är inte skrivbar" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "Den angivna katalogen finns inte" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ inga tidigare meddelanden frÃ¥n %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ användaren %s finns redan pÃ¥ listan" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Välj en grupp att lägga till en användare" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s lades till i kontaktlistan" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ användaren är tillbaka" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] status Ã¥terställd" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] satte automatiskt %s" #: src/centerim.cc:1490 msgid "away" msgstr "iväg" #: src/centerim.cc:1490 msgid "n/a" msgstr "icke tillgänglig" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! det finns mindre än 10k ledigt diskutrymme, kopplar ned" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! annars kan händelser och inställningar gÃ¥ förlorade" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "Inbjud till konferens.." #: src/centerim.cc:1772 #, fuzzy msgid "Select contacts to move" msgstr "Välj kontakter att lägga till lista" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "" #: src/hooks/rsshook.cc:317 #, fuzzy msgid "couldn't fetch" msgstr "kunde inte hämta" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "felaktig XML" #: src/hooks/rsshook.cc:353 #, fuzzy msgid "no or tag found" msgstr "hittade ingen tag" #: src/hooks/rsshook.cc:362 #, fuzzy msgid "no or tag found" msgstr "hittade ingen tag" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "felaktig tag" #: src/hooks/rsshook.cc:380 msgid "success" msgstr "lyckades" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "Titel: " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "Publicerad pÃ¥: " #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "Kategori: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "Författare: " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "Beskrivning: " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "Länk: " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "Kommentarer: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "misslyckades med namnuppslagning" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "kunde inte skapa en socket" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "verifiera angiven värd och port" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] lämnar konferensen %s" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "Snälla, anslut till min konferens." #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Status meddelande:" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] kunde inte hämta frÃ¥nvarumeddelande frÃ¥n %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] kunde inte logga in: felaktigt användarnamn eller lösenord" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] kunde inte logga in: felaktigt användarnamn eller lösenord" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] kunde inte logga in: kontot har blivit blockerat" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ för att Ã¥teraktivera besök %s" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] upptäckte en annan inloggning" #: src/hooks/yahoohook.cc:809 #, fuzzy msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] fel: %s" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "Användaren %s bjöd in dig till konferensen %s, ämnet där är: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "Just nu har konferensen följande medlemmar: " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Anslöt automatiskt till konfernesen" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "Användaren %s avböjde din inbjudan att ansluta till konferensen" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "Användaren %s anslöt till konferensen" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "Användaren %s lämnade konferensen" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "Användaren har lagt till dig i sin kontaktlista" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "meddelandet var: " #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] e-post frÃ¥n %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] system: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] fel: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] fel: %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] misslyckades med direkt anslutning" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] fel: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] fel: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] fel: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "Användaren har födelsedag idag" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] kunde inte ansluta till servern" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] avregistrerades frÃ¥n %s agenten" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "FrÃ¥nvarumeddelande:" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] kunde inte hämta frÃ¥nvarumeddelande frÃ¥n %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "Felaktigt smeknamn, kan inte registra" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "Kunde inte ansluta" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "Fjärranvändaren använder %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "Standard Jabberkonferensserver" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, fuzzy, c-format msgid "+ [jab] error %d" msgstr "+ [jab] fel %d: %s" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] fel %d: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "Användaren vill prenumerera pÃ¥ uppdateringar om din nätverks närvaro" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "Användaren tog bort dig frÃ¥n sin kontaktlista (med JabbersprÃ¥ket)" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] kunde inte ansluta till servern" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "Jag gillar verkligen standard AIM profilen hos centerim %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "aim uppkoppling misslyckades" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] uppkoppling misslyckades: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "Användaren har ingen profilinformation" #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] lösenord skickat" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "som begärt" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "socket problem" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "felaktigt användarnamn" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "turbo, loggade in/ut för snabbt" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "felaktigt lösenord" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "felaktigt användarnamn eller lösenord" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] frÃ¥nkopplad" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "icq frÃ¥nkopplad p.g.a" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "Användaren accepterade din attest förfrÃ¥gan" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "Användaren avslog din attest förfrÃ¥gan; meddelandet var: " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] misslyckat SMS till %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] misslyckades att SMS:a till %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] kunde inte hämta frÃ¥nvarumeddelande frÃ¥n %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Slumpmässig chatanvändare" #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ [msn] ansluter frÃ¥n %s" #: src/hooks/gaduhook.cc:164 #, fuzzy, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [msn] ansluter frÃ¥n %s" #: src/hooks/gaduhook.cc:218 #, fuzzy msgid "+ [gg] connection to the server failed" msgstr "+ [lj] ansluter till servern" #: src/hooks/gaduhook.cc:291 #, fuzzy msgid "+ [gg] connection lost" msgstr "+ [msn] ansluter frÃ¥n %s" #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [jab] kunde inte hämta frÃ¥nvarumeddelande frÃ¥n %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] kunde inte ansluta till servern" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] uppkoppling misslyckades: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] smeknamnet ändrades" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "PÃ¥ kanaler: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Sparkad av %s; anledning: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "Användaren har ändrat sitt smeknamn frÃ¥n %s till %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] lösenord skickat" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] lösenord skickat" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "PING svat frÃ¥n användaren: %d sekund(er)" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s anslöt." #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s har lämnat" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "anledning: %s" #: src/hooks/irchook.cc:1489 #, fuzzy, c-format msgid "%s has been kicked by %s" msgstr "%s blev 'oppad' av %s." #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "Kanalens ämne är nu: %s" #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "sattes av %s" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s blev 'oppad' av %s." #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s blev 'avoppad' av %s." #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s har 'oppat' oss." #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "du är en op här" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s har 'avoppad' oss." #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] användarsökning klar" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "kunde inte ansluta" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] HTTP misslyckades: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "Meddelande frÃ¥n servern: " #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] inloggning misslyckades: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] lyckades att anslÃ¥, id:et är %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] ett fel uppstod: %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Användaren %s (%s) lade till dig i sin kontaktlista\n" "Journaladress: %s" #: src/hooks/ljhook.cc:687 #, fuzzy, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Användaren %s (%s) tog bort dig frÃ¥n sin kontaktlista\n" "Journaladress: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] fel vid borttagning av vän" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] användaren har tagits bort frÃ¥n din kontaktlista" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] misslyckades med att lägga till vän" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s lades till i kontaktlistan" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] klar med att reversera användarlistan, %d funna" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "+ [msn] oläst e-post: %d i inkorgen, %d i mappar" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] e-post frÃ¥n %s, %s" #: src/hooks/msnhook.cc:905 #, fuzzy msgid "+ [msn] cannot connect: " msgstr "+ [yahoo] kunde inte ansluta: " #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "verifiera angiven värd och port" #: src/hooks/abstracthook.cc:355 #, fuzzy msgid "connecting to the server" msgstr "+ [lj] ansluter till servern" #: src/hooks/abstracthook.cc:356 #, fuzzy msgid "logged in" msgstr "+ [lj] inloggad" #: src/hooks/abstracthook.cc:357 #, fuzzy, c-format msgid "search finished, %d found" msgstr "+ [icq] sökning klar, %d hittade" #: src/hooks/abstracthook.cc:358 #, fuzzy msgid "password was changed successfully" msgstr "+ [icq] lösenordet ändrades" #: src/hooks/abstracthook.cc:359 #, fuzzy msgid "disconnected" msgstr "Nedkopplad" #: src/hooks/abstracthook.cc:360 #, fuzzy, c-format msgid "adding %s to the contacts" msgstr "+ [aim] lägger till %s till kontaktlistan" #: src/hooks/abstracthook.cc:361 #, fuzzy, c-format msgid "removing %s from the contacts" msgstr "+ [msn] tar bort %s frÃ¥n kontaktlistan" #: src/hooks/abstracthook.cc:362 #, fuzzy, c-format msgid "members list fetching finished, %d found" msgstr "+ [yahoo] hämtade listan över medlemmarna, %d stycken" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "Användaren har födelsedag idag" #: src/icqcontact.cc:853 msgid "Jan" msgstr "jan" #: src/icqcontact.cc:853 msgid "Feb" msgstr "feb" #: src/icqcontact.cc:853 msgid "Mar" msgstr "mar" #: src/icqcontact.cc:853 msgid "Apr" msgstr "apr" #: src/icqcontact.cc:854 msgid "May" msgstr "maj" #: src/icqcontact.cc:854 msgid "Jun" msgstr "jun" #: src/icqcontact.cc:854 msgid "Jul" msgstr "jul" #: src/icqcontact.cc:854 msgid "Aug" msgstr "aug" #: src/icqcontact.cc:855 msgid "Sep" msgstr "sep" #: src/icqcontact.cc:855 msgid "Oct" msgstr "okt" #: src/icqcontact.cc:855 msgid "Nov" msgstr "nov" #: src/icqcontact.cc:855 msgid "Dec" msgstr "dec" #: src/icqgroups.cc:66 msgid "General" msgstr "Allmän" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Sänt pÃ¥ %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60-och-över" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "okänd IM typ" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Allmän Chat" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Romantik" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Spel" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Studenter" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "20 nÃ¥gonting" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "30 NÃ¥gonting" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "40 NÃ¥gonting" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50 Plus" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "Letar efter en kvinna" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Letar efter en man" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Namn" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Sökprofiler " #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Ta bort" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Ladda" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ du mÃ¥ste vara inloggad" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "Ladda(O)" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "Spara(A)" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "Rensa(L)" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Ändra" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Sök/Lägg till" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "Anslut/Skapa" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "länk(I)" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Sök/lägg till användare " #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " Anslut/skapa en kanal/konferens " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " Länka en RSS feed " #: src/icqdialogs.cc:299 msgid " Network " msgstr " Nätverk " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Detaljer " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Smeknamn : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-post : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Förnamn : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Efternamn : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Ã…ldersgrupp : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Kön : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " SprÃ¥k : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " Hemvist " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Stad/Ort : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Delstat : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Land : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Arbete " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Företag : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Avdelning : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Titel : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Endast anslutna " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Slumpmässig chatgrupp " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Nyckelord " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Smeknamn " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " Söktjänst " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Sökparametrar " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " Ange (Feed) Parametrar " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " XML exportera URL: %s " #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " Kolla frekvens (minuter) : %lu " #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Kanal : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Namn : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " Ansluten sedan den sista kollen " #: src/icqdialogs.cc:416 #, fuzzy, c-format msgid " Keywords : %s " msgstr " Nyckelord " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " Alternativ " #: src/icqdialogs.cc:422 #, fuzzy, c-format msgid " Users with photos only : %s " msgstr " AnslÃ¥ till journal : %s " #: src/icqdialogs.cc:423 #, fuzzy, c-format msgid " Look for online only : %s " msgstr " Endast anslutna " #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Visa de användare, som har dig pÃ¥ sin lista " #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Namn/Titel " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Lösenord " #: src/icqdialogs.cc:443 msgid " Service " msgstr " Tjänst " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Nytt filnamn: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "En profil med detta namn finns redan. Vill du skriva över den?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Smeknamn: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Namn/Titel: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-post: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Förnamn: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Efternamn: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Stad/ort: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Delstat: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Företag: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Avdelning: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Titel: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Kanal: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Namn: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Nyckelord: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Lösenord: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "URL: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "Kolla frekves: " #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Allmänt " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " Registreringstjänst " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Registrering pÃ¥gÃ¥r " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " Ändra lösenord : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-post : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Födelsedag : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Ã…lder : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Hem " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Gatuadress : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Zip kod : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefon : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Mobiltelefon : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Hemsida : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Mer " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1:a sprÃ¥k : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2:a sprÃ¥k : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3:e sprÃ¥k : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Allmänt " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Aktivera webstatus indikator : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Slumpmässig chatgrupp : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Obligatorisk attest : %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Delstat : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " Om " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Hämta dina detaljer" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Dina %s detaljer " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: detaljer " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Klar" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Vänta. Dina detaljer har inte hämtats än" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-post: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Ange födelsedag (DD-MM-YYYY): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Ã…lder: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Gatuadress: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "Zip kod: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefon: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Mobiltelefon: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Hemsida: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Om" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "Nytt lösenord: " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "Bekräfta lösenordet : " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "ingen" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X spara, Esc avbryt] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Skicka fil(er) till %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Lägg till" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Kommentar" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Sänd" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Filer " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Kommentar " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "filnamn: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "kommentar: " #: src/icqdialogs.cc:1163 #, fuzzy msgid "None" msgstr "Klar" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "" #: src/icqdialogs.cc:1165 #, fuzzy msgid "Polish" msgstr "Skicka" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " centerim inställningar " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Användargränssnitt " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Ändra ljudenhet till : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Ändra färgschema till: %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr "+ [icq] begär automatiskt attest att spara %lu" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Standard teckenuppsättning : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " Kanal : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Arrangera kontakterna i grupper : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Aktivera bidirektionellt sprÃ¥kstöd : %s " #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Aktivera emacs bindningar i texteditorn : %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " Aktivera emacs bindningar i texteditorn : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr "" #: src/icqdialogs.cc:1241 #, fuzzy, c-format msgid " Switch to language preset : %s " msgstr " 1:a sprÃ¥k : %s " #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Standard teckenuppsättning : %s " #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Standard teckenuppsättning : %s " #: src/icqdialogs.cc:1246 #, fuzzy, c-format msgid " For protocols : %s" msgstr " Alla protokoll" #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Kontaktlista " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Arrangera kontakterna i grupper : %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Arrangera kontakterna i grupper : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Göm icke anslutna användare : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-spam: Släng medd. frÃ¥n icke listade användare : %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Obligatorisk attest : %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Citera meddelanden vid svar : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Kolla den lokala brevlÃ¥dan : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Spara lösenord : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Editera frÃ¥nvarumeddelande vid statusförändring : %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Chatmeddelandeläge för : %s " #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " Retur tangenten skickar meddelande för : %s" #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Chat meddelande läge : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " Retur tangenten skickar meddelande : %s " #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " Arrangera kontakterna i grupper : %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Kommunikation " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " SMTP server : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " HTTP proxy server : %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " HTTP proxy server : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Aktivera peer-to-peer kommunikation : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " Portnummer för peer-to-peer : %s " #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " Loggar " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " Tidsstämplar i loggfönstret : %s " #: src/icqdialogs.cc:1301 #, fuzzy, c-format msgid " Timestamps include seconds : %s " msgstr " Tidsstämplar i loggfönstret : %s " #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " Online/offline händelser i loggfönstret : %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Detaljerad IM händelselog i ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Sätt frÃ¥nvarande automatiskt efter viss tid (min) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Sätt icke tillgänglig automatiskt efter viss tid (min) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Sätt icke tillgänglig automatiskt efter viss tid (min) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Gatuadress : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Automatisk frÃ¥nvaroperiod (0 - ): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Automatisk icke tillgänglig (0 - ): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "SMTP server: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "Peer-to-peer port nummer (min-max): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "HTTP proxy server: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "" #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "HTTP proxy server: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Tom attest förfrÃ¥gan" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Dina detaljer har hämtats" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Organisera kontaktgrupper" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Ändra" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "Ta bort(E)" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "Upp(U)" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "Ned(D)" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Välj" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Grupper " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Skapa en ny grupp med namn: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Nytt namn för gruppen: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Är du säker pÃ¥ att du vill ta bort gruppen?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Filöverföringsstatus" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Avbryt" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " Inkommande frÃ¥n %s " #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " UtgÃ¥ende till %s " #: src/icqdialogs.cc:1865 msgid "init" msgstr "initiera" #: src/icqdialogs.cc:1866 msgid "start" msgstr "starta" #: src/icqdialogs.cc:1867 msgid "work" msgstr "arbete" #: src/icqdialogs.cc:1868 msgid "done" msgstr "klar" #: src/icqdialogs.cc:1869 msgid "err" msgstr "fel" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "avbryt" #: src/icqdialogs.cc:1877 msgid " of " msgstr " av " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "Kan inte ta bort en pÃ¥gÃ¥ende överföring nu" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "publik (synbar för alla)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "" #: src/icqdialogs.cc:2025 #, fuzzy msgid "friends only" msgstr "privat (bara vänner)" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr " LiveJournal post: attribut " #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "Upptäck musik" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "Skicka" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Avbryt(A)" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " AnslÃ¥ till journal : %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " Ärende : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " Säkerhet : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " Fiffiga saker " #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " Humör : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(ingen/egen" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " Eget humör : %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " Musik : %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " Bild : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(standard)" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Ã…lder : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " Inaktivera autoformatering : %s " #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " Inaktivera sändning av kommentarer via epost : %s " #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " TillÃ¥t inte kommentarer : %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " Antedatera notering : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "AnslÃ¥ ärende: " #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "Spelar just nu: " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "Humör just nu: " #: src/icqdialogs.cc:2094 #, fuzzy msgid "Tags for the entry: " msgstr "Meddelande frÃ¥n servern: " #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr " Kontaktlista " #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "Snabbsökning: skriv för att söka, Alt-S sök igen, Enter avsluta" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 #, fuzzy msgid " Use no key" msgstr "Anv.info" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "exekverade extern manuell Ã¥tgärd %s, returvärde = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "exekverade extern Ã¥tgärd %s, returvärde = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Ej ansluten" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Ansluten" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Osynlig" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Tillgänglig för chat" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Do not disturb" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Upptagen" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] Not available" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "Iväg" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "DND" #: src/imlogger.cc:39 msgid "N/A" msgstr "Icke tillgänglig" #: src/imlogger.cc:49 msgid "message" msgstr "meddelande" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "attest" #: src/imlogger.cc:53 msgid "e-mail" msgstr "e-post" #: src/imlogger.cc:54 msgid "notification" msgstr "meddelande" #: src/imlogger.cc:55 msgid "contacts" msgstr "kontakter" #: src/imlogger.cc:56 msgid "files" msgstr "filer" #: src/imlogger.cc:57 #, fuzzy msgid "event" msgstr "Aldrig" #: src/imlogger.cc:79 msgid "events log started" msgstr "händelselog startad" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "utgÃ¥ende %s till %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "inkommande %s frÃ¥n %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "ignorerad" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s kopplade ned" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "%s till %s, skickat den %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: anslöt, med status %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: kopplade ned (offline)" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "ändrade %s status till %s frÃ¥n %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " IM kontohanterare" #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Server : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " Säkrad : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Användarnamn : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Lösenord (valfritt) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Lösenord : %s " #: src/accountmanager.cc:124 #, fuzzy, c-format msgid " Priority : %s " msgstr " Stad/Ort : %s " #: src/accountmanager.cc:129 #, fuzzy, c-format msgid " Import friend list : %s " msgstr " Avdelning : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Lösenord (valfritt) : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " Arrangera kontakterna i grupper : %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Arrangera kontakterna i grupper : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " Registrera " #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Kön : %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Nyckelord " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " Ändra smeknamn " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Uppdatera detaljerna " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " FrÃ¥nvarumeddelande " #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Ta bort nuvarande inställningar" #: src/accountmanager.cc:200 msgid " user name: " msgstr " användarnamn: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " lösenord: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Ta bort kontoinformationen först!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Du mÃ¥ste koppla frÃ¥n tjänsten först!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " server adress: " #: src/accountmanager.cc:285 msgid " priority: " msgstr "" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " Registrera dig pÃ¥ %s nätverket " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Kör" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Ändra lösenord : %s" #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Bekräfta lösenordet : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Server : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Kontrollera lösenordet: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Smeknamn: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Server: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Lösenorden är inte lika" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Du mÃ¥ste ange ett lösenord" #: src/imcontroller.cc:118 #, fuzzy msgid "Password must be at least 6 chars long" msgstr "Du mÃ¥ste ange ett lösenord" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Registrering pÃ¥gÃ¥r " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Ansluter till server %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Skickar förfrÃ¥gan" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Ã…tgärden tog för lÃ¥ng tid. Vill du försöka igen?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Försöker igen.." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Nytt UIN mottaget, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Nedkopplad" #: src/imcontroller.cc:179 #, fuzzy msgid "Unable to connect to icq server. Retry?" msgstr "Kunde inte ansluta till icq servern. Vill du försöka igen?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "Försöker att registrera %s vid %s ..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "Jabber ID:et registrerades" #: src/imcontroller.cc:228 msgid "Failed" msgstr "Misslyckades" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "" "Du mÃ¥ste vara ansluten till ICQ nätverket för att kunna uppdatera detaljerna" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "nytt vänligt MSN smeknamn: " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "" "Du mÃ¥ste vara ansluten till MSN nätverket för att kunna uppdatera smeknamnet" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "" "Du mÃ¥ste vara ansluten till Jabber nätverket för att kunna uppdatera " "detaljerna" #: src/imcontroller.cc:318 #, fuzzy msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "" "Du mÃ¥ste vara ansluten till Jabber nätverket för att kunna uppdatera " "detaljerna" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "registrering stöds inte" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "Jag gillar verkligen %s:s standard frÃ¥nvarumeddelande för %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ exekverade %s kommandot" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "sändfel: otillräckligt med parametrar" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "sändfel: bara UIN:er är tillÃ¥tna i icq protokollet" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "sändfel: okänd IM typ" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "sändfel: okänd händelse typ" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s till %s lades till i kön" #: src/icqconf.cc:1616 #, fuzzy msgid "event sending error: error creating directory for the contact" msgstr "sändfel: otillräckligt med parametrar" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "Det angivna statustecknet är okänt" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "okänd IM typ" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "fel, status ändring: " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Användning: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "Allmänna inställningar:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " --ascii, -a använd ASCII tecken för fönster och UI kontroller" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b ange baskatalog" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B Skapa socket för lokal ipadress" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help visa denna hjälp" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v visa visa versionsinformation" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Händelse inställningar:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr " -s, --send händelsetyp; kan vara msg, sms eller url" #: src/icqconf.cc:1694 #, fuzzy msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr " -S, --status ändra IM status" #: src/icqconf.cc:1695 #, fuzzy msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto protokolltyp; kan vara icq, yahoo, aim, irc " "jabber eller lj" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" " -t, --to destinations UIN eller smeknamn (beror pÃ¥ " "protokoll)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" " -n, --number mobilnummer att skicka händelse till (endast sms)" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Rapportera buggar till http://bugzilla.centerim.org." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Tom attest förfrÃ¥gan" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* Attest förfrÃ¥gan : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* Attest : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr " Kontakter : " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* Filöverföring" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "inte ansluten" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Info" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " IM kontohanterare" #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Alla protokoll" #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " användarnamn: " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "ja" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "nej" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "ja" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Konton.." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " Alla protokoll" #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Användning: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " Alla protokoll" #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Konton.." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "ja" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "nov" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " Tjänst " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 #, fuzzy msgid "No Jabber" msgstr " [jab] Jabber" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "Avslutad" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "okänd IM typ" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Man" #: src/icqface.cc:53 msgid "Female" msgstr "Kvinna" #: src/icqface.cc:56 msgid "Not specified" msgstr "Ej specificerad" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "Nästa" #: src/icqface.cc:63 msgid "Fwd" msgstr "VB" #: src/icqface.cc:64 msgid "Reply" msgstr "Svara" #: src/icqface.cc:65 msgid "Open" msgstr "Öppna" #: src/icqface.cc:66 msgid "Accept" msgstr "Acceptera" #: src/icqface.cc:67 msgid "Reject" msgstr "AvslÃ¥" #: src/icqface.cc:68 msgid "User info" msgstr "Anv.info" #: src/icqface.cc:70 msgid "Prev" msgstr "Föreg" #: src/icqface.cc:78 msgid "sound card" msgstr "ljudkort" #: src/icqface.cc:79 msgid "speaker" msgstr "högtalare" #: src/icqface.cc:80 msgid "disable" msgstr "stäng av" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "ändra inte" #: src/icqface.cc:88 msgid "dark" msgstr "mörk" #: src/icqface.cc:89 msgid "blue" msgstr "blÃ¥" #: src/icqface.cc:97 #, fuzzy msgid "protocol" msgstr " Alla protokoll" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "starta" #: src/icqface.cc:118 msgid "mode 1" msgstr "läge 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "läge 2" #: src/icqface.cc:249 #, fuzzy, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "centerim %s EJ SKICKADE: %lu" #: src/icqface.cc:274 #, fuzzy msgid "Send an URL" msgstr " Skicka ett SMS" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " Skicka ett SMS" #: src/icqface.cc:276 #, fuzzy msgid "Send contacts" msgstr "Sänd kontakter.." #: src/icqface.cc:277 msgid " Request authorization" msgstr " Begär attest" #: src/icqface.cc:278 #, fuzzy msgid "Edit details" msgstr " Ändra detaljer" #: src/icqface.cc:279 #, fuzzy msgid "Fetch away message" msgstr " Hämta frÃ¥nvaro medd. f" #: src/icqface.cc:280 #, fuzzy msgid "Add to list" msgstr " Lägg till i listan a" #: src/icqface.cc:281 #, fuzzy msgid "Rename contact" msgstr " Byt namn pÃ¥ kontakten r" #: src/icqface.cc:282 msgid " Move to group.." msgstr " Flytta till en grupp.." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 #, fuzzy msgid "Fetch version info" msgstr " Hämta versionsinfo v" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " Skicka fil(er)" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " Inbjud till konferens.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Skicka ett kanal medd. enter" #: src/icqface.cc:294 #, fuzzy msgid "Channel chat history" msgstr " Kanal chat historik h" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Ta bort kanalen del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Anslut kanal" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Lämna kanal" #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Efternamn: " #: src/icqface.cc:301 #, fuzzy msgid "UnBlock channel messages" msgstr " AvBlockera kanal meddelanden i" #: src/icqface.cc:303 #, fuzzy msgid "Block channel messages" msgstr " AvBlockera kanal meddelanden i" #: src/icqface.cc:310 #, fuzzy msgid "Send a message" msgstr " FrÃ¥nvarumeddelande " #: src/icqface.cc:312 #, fuzzy msgid "Event history" msgstr " Händelsehistorik h" #: src/icqface.cc:313 #, fuzzy msgid "Remove user" msgstr "Ta bort" #: src/icqface.cc:314 #, fuzzy msgid "User's details" msgstr " Detaljer ?" #: src/icqface.cc:315 #, fuzzy msgid "External actions.." msgstr " Externa Ã¥tgärder.. f6" #: src/icqface.cc:318 #, fuzzy msgid "Unset ignore user" msgstr " Avmarkera ignorering i" #: src/icqface.cc:318 #, fuzzy msgid "Ignore user" msgstr " Ignorera användaren" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 #, fuzzy msgid "Force check" msgstr " Tvinga kontroll" #: src/icqface.cc:435 #, fuzzy msgid "Change status" msgstr "Ändra" #: src/icqface.cc:436 #, fuzzy msgid "Go to contact.." msgstr "Lägg t. kontakt" #: src/icqface.cc:437 msgid " Accounts.." msgstr " Konton.." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " centerim inställningar" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Filöverföringsmonitor" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Sök/lägg till användare" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " Anslut kanal/konferens" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " Länka en RSS feed" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Läs/editera svartlistade" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Läs/editera osynliga" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Läs/editera synliga" #: src/icqface.cc:455 #, fuzzy msgid "Show offline users" msgstr " Göm icke anslutna användare : %s " #: src/icqface.cc:457 #, fuzzy msgid "Hide offline users" msgstr " Göm icke anslutna användare : %s " #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " Organisera kontaktgrupper" #: src/icqface.cc:461 msgid " Mass group move.." msgstr "" #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Detaljer" #: src/icqface.cc:905 msgid "Message" msgstr "Meddelande" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Ny sökning" #: src/icqface.cc:924 msgid "Contact to add" msgstr "Lägg till kontakt" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Söker kontakter.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Sökresultat [klar]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Information om %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Smeknamn" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "Detta är ditt LiveJournal konto. Använd det för" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "anslÃ¥ nya noteringar i din journal." #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "Följande användare har dig listad som vän:" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr "inte ansluten" #: src/icqface.cc:1116 #, fuzzy msgid "not found" msgstr "inte ansluten" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-post" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "Sekundär e-post" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Gammal e-post" #: src/icqface.cc:1134 msgid "Gender" msgstr "Kön" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Födelsedag" #: src/icqface.cc:1136 msgid "Age" msgstr "Ã…lder" #: src/icqface.cc:1137 msgid "Languages" msgstr "SprÃ¥k" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Senaste IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "SÃ¥gs senast" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Aldrig" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "Sänd" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "filer" #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Sänd kontakter.." #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "attest" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Adress" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Hemvist" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "Zip kod" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefon" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Mobiltelefon" #: src/icqface.cc:1259 msgid "Timezone" msgstr "Tidszon" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Hemsida" #: src/icqface.cc:1300 msgid "Company" msgstr "Företag" #: src/icqface.cc:1301 msgid "Department" msgstr "Avdelning" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Titel" #: src/icqface.cc:1346 msgid "Interests" msgstr "Intressen" #: src/icqface.cc:1358 msgid "Background" msgstr "Bakgrund" #: src/icqface.cc:1376 msgid "Handle" msgstr "Handtag" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "RSS dokumentation" #: src/icqface.cc:1378 msgid "Version" msgstr "Version" #: src/icqface.cc:1379 msgid "Encoding" msgstr "Kodning" #: src/icqface.cc:1382 msgid "Link" msgstr "Länk" #: src/icqface.cc:1384 msgid "Frequency" msgstr "Frekvens" #: src/icqface.cc:1385 msgid "Last check" msgstr "Senaste kontroll" #: src/icqface.cc:1386 msgid "Next check" msgstr "Nästa koll" #: src/icqface.cc:1387 msgid "Last result" msgstr "Senast resultat" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu minuter" #: src/icqface.cc:1404 msgid "Now" msgstr "Nu" #: src/icqface.cc:1423 msgid "Full name" msgstr "Fullständigt namn:" #: src/icqface.cc:1442 #, fuzzy, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "F2 för URL:er, F6 för externa Ã¥tgärder, ESC för att stänga" #: src/icqface.cc:1447 #, fuzzy, c-format msgid "user info for %s" msgstr "Anv.info" #: src/icqface.cc:1456 msgid "Check" msgstr "Koll" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Editera" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "Ã…terkalla" #: src/icqface.cc:1466 msgid "Friend of" msgstr "Vän till" #: src/icqface.cc:1472 msgid "Home" msgstr "Hem" #: src/icqface.cc:1472 msgid "Work" msgstr "Arbete" #: src/icqface.cc:1472 msgid "More" msgstr "Mer" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Hämta" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] ICQ nätverket" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr " Alla protokoll" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr " Redan inloggad" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " eller bekräfta, avbryt " #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " bekräfta, avbryt " #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Lägg t. kontakt" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Svarta listan" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Synliga listan" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Osynliga listan" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Välj kontakter att lägga till lista" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "Skall de %d kontakterna tas bort frÃ¥n listan ocksÃ¥?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Händelse mottagare" #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "Snabbsökning: skriv för att söka, Alt-S sök igen, Enter avsluta" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr " Kontaktlista " #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ inga URL:er inom gällande kontext" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URL:er inom gällande kontext" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ inga externa Ã¥tgärder definerade för %s" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "Resultat för den externa Ã¥tgärden %s:" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "^X sänd, ^P välj flera, ^O historia, F2 URL:er, F9 expandera, Alt-? " "medlemmar, ESC stäng" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "^X sänd, ^P välj flera, ^O historia, F2 URL:er, F9 expandera, Alt-? " "detaljer, ESC avbryt" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr " UtgÃ¥ende till %s " #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Sänd kontakter.." #: src/icqface.cc:2670 msgid "file name: " msgstr "filnamn: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "UtgÃ¥ende %s till %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Sänt pÃ¥ %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "Inkommande %s frÃ¥n %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Mottaget %s" #: src/icqface.cc:3182 #, fuzzy, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "F2 för URL:er, F9 för full skärmstorlek, ESC för att stänga" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s frÃ¥n %s, mottaget den %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s till %s, skickat den %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "Historia för %s, %d händelser totalt" #: src/icqface.cc:3339 #, fuzzy, c-format msgid "%s search, %s again, %s cancel" msgstr "/ sök, N igen, ESC avbryt" #: src/icqface.cc:3348 msgid "search for: " msgstr "sök efter: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] system: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] e-post frÃ¥n %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s anslöt, med status %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s ändrade status till %s frÃ¥n %s" #~ msgid " [o] Online" #~ msgstr " [o] Online" #~ msgid " [_] Offline" #~ msgstr " [_] Offline" #~ msgid " [a] Away" #~ msgstr " [a] Away" #~ msgid " [c] Occupied" #~ msgstr " [c] Occupied" #~ msgid " [f] Free for chat" #~ msgstr " [f] Free for chat" #~ msgid " [i] Invisible" #~ msgstr " [i] Invisible" #~ msgid "+ [irc] password was requested, but it's not set" #~ msgstr "+ [irc] begärde lösenord, men det är inte satt" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Bekräfta lösenordet : %s " #, fuzzy #~ msgid " Convert from : %s " #~ msgstr " Land : %s " #, fuzzy #~ msgid " Convert to : %s " #~ msgstr " Land : %s " #~ msgid "Your friendly nickname has been changed to %s" #~ msgstr "Ditt vänliga smeknamn har ändrats till %s" #~ msgid "already logged" #~ msgstr "redan inloggad" #~ msgid "" #~ "event sending error: the destination contact doesn't exist on your list" #~ msgstr "sändfel: destinations kontakten finns inte pÃ¥ din lista" #, fuzzy #~ msgid "to URLs, " #~ msgstr "F2 för URL:er, ESC för att stänga" #, fuzzy #~ msgid "URLs, " #~ msgstr "URL: " #, fuzzy #~ msgid " details, " #~ msgstr " Detaljer " #, fuzzy #~ msgid " cancel" #~ msgstr "Avbryt" #, fuzzy #~ msgid "search, " #~ msgstr "sök efter: " #, fuzzy #~ msgid " esc cancel" #~ msgstr " Lämna kanal" #, fuzzy #~ msgid "contact menu, " #~ msgstr "kontakter" #, fuzzy #~ msgid "change status, " #~ msgstr "%s ändrade status till %s frÃ¥n %s" #, fuzzy #~ msgid "general actions, " #~ msgstr "Allmänna inställningar:" #~ msgid " Store contact list server-side : %s " #~ msgstr " Spara kontaktlistan pÃ¥ servern : %s " #~ msgid " Send an URL u" #~ msgstr " Skicka en URL u" #~ msgid " Send contacts c" #~ msgstr " Sänd kontakter r" #~ msgid " Edit details e" #~ msgstr " Ändra detaljer ?" #~ msgid " List nicknames ?" #~ msgstr " Lista smeknamn ?" #~ msgid " Block channel messages i" #~ msgstr " Blockera kanal meddelanden i" #~ msgid " Send a message enter" #~ msgstr " Skicka ett medd. enter" #~ msgid " Remove user del" #~ msgstr " Ta bort användaren del" #~ msgid " Ignore user i" #~ msgstr " Ignorera användaren i" #~ msgid " Remove feed del" #~ msgstr " Ta bort feed del" #~ msgid " Feed information ?" #~ msgstr " Feed information ?" #, fuzzy #~ msgid " Force check c" #~ msgstr " Ignorera feed i" #~ msgid " Unset ignore feed i" #~ msgstr " Avmarkera ignorering i" #~ msgid " Ignore feed i" #~ msgstr " Ignorera feed i" #~ msgid " Change status s" #~ msgstr " Ändra status s" #~ msgid " Go to contact.. alt-s" #~ msgstr " GÃ¥ till kontakt.. alt-s" #~ msgid " Show offline users F5" #~ msgstr " Visa icke anslutna användare F5" #~ msgid " Hide offline users F5" #~ msgstr " Göm icke anslutna användare F5" #~ msgid "ESC or F9 to close" #~ msgstr "ESC eller F9 för att avsluta" #~ msgid " Russian win/koi translation for : %s" #~ msgstr " Rysk win/koi översättning för : %s" #~ msgid " Russian win/koi translation : %s " #~ msgstr " Rysk win/koi översättning : %s " #~ msgid "Default charset: " #~ msgstr "Standard teckenuppsättning: " #~ msgid "+ [yahoo] connecting to the server" #~ msgstr "+ [yahoo] ansluter till servern" #~ msgid "+ [yahoo] disconnected" #~ msgstr "+ [yahoo] frÃ¥nkopplad" #~ msgid "+ [yahoo] adding %s to the contacts" #~ msgstr "+ [yahoo] lägger till %s till kontaktlistan" #~ msgid "+ [yahoo] removing %s from the contacts" #~ msgstr "+ [yahoo] tar bort %s frÃ¥n kontaktlistan" #~ msgid "+ [yahoo] logged in" #~ msgstr "+ [yahoo] inloggad" #, fuzzy #~ msgid "+ [yahoo] search finished, %d found" #~ msgstr "+ [jab] sökning klar, %d hittade" #~ msgid "+ [jab] connecting to the server" #~ msgstr "+ [jab] ansluter till servern" #~ msgid "+ [jab] adding %s to the contacts" #~ msgstr "+ [jab] lägger till %s till kontaktlistan" #~ msgid "+ [jab] removing %s from the contacts" #~ msgstr "+ [jab] tar bort %s frÃ¥n kontaktlistan" #~ msgid "+ [jab] conference list fetching finished, %d found" #~ msgstr "+ [jab] hämtade listan över konferensdeltagarna, %d hittade" #~ msgid "+ [jab] search finished, %d found" #~ msgstr "+ [jab] sökning klar, %d hittade" #~ msgid "+ [jab] logged in" #~ msgstr "+ [jab] inloggad" #~ msgid "+ [jab] disconnected" #~ msgstr "+ [jab] frÃ¥nkopplad" #~ msgid "+ [aim] connecting to the server" #~ msgstr "+ [aim] ansluter till servern" #~ msgid "+ [aim] removing %s from the contacts" #~ msgstr "+ [aim] tar bort %s frÃ¥n kontaktlistan" #~ msgid "+ [aim] logged in" #~ msgstr "+ [aim] inloggad" #~ msgid "+ [aim] disconnected" #~ msgstr "+ [aim] frÃ¥nkopplad" #~ msgid "+ [aim] password was changed successfully" #~ msgstr "+ [aim] lösenordet ändrades" #~ msgid "+ [icq] connecting to the server" #~ msgstr "+ [icq] ansluter till servern" #~ msgid "+ [icq] logged in" #~ msgstr "+ [icq] inloggad" #~ msgid "+ [irc] connecting to the server" #~ msgstr "+ [irc] ansluter till servern" #~ msgid "+ [irc] channel members list fetching finished, %d found" #~ msgstr "+ [irc] hämtade listan över kanalmedlemmarna, %d stycken" #~ msgid "+ [irc] logged in" #~ msgstr "+ [irc] inloggad" #~ msgid "+ [irc] disconnected" #~ msgstr "+ [irc] frÃ¥nkopplad" #~ msgid "+ [lj] disconnected" #~ msgstr "+ [lj] frÃ¥nkopplad" #~ msgid " Synchronize contact list " #~ msgstr " Synkronisera kontaktlistan " #~ msgid "You must be logged in to preform the synchronization" #~ msgstr "Du mÃ¥ste vara inloggad för att kunna utföra synkroniseringen" #~ msgid " Contact list synchronization " #~ msgstr " Kontaktliste synkronisering " #~ msgid "Starting the synchronization process" #~ msgstr "Startar synkroniseringsprocessen" #~ msgid "Attempt #%d" #~ msgstr "Försök #%d" #~ msgid ".. %d already synchronized, %d contacts to be stored" #~ msgstr ".. %d är redan synkroniserade, %d kontakter kvar att spara" #~ msgid "Too many attempts, gave up" #~ msgstr "För mÃ¥nga försök, gav upp" #~ msgid " Uploading buddies " #~ msgstr " Tankar upp polare " #~ msgid "No contacts to be synchronized" #~ msgstr "Inga kontakter att synkronisera" #~ msgid ".. all of them are already stored server-side" #~ msgstr ".. alla är redan sparade pÃ¥ servern" #~ msgid "%d contacts are do be stored server-side. Add them now?" #~ msgstr "%d kontakter skall sparas pÃ¥ servern. Lägga till dem nu?" #~ msgid ".. adding %s" #~ msgstr ".. lägger till %s" #~ msgid "Cancelled" #~ msgstr "Avbryten" #~ msgid "Timed out" #~ msgstr "Tiden gick ut" #~ msgid "+ [yahoo] %s: started typing" #~ msgstr "+ [yahoo] %s: började skriva" #~ msgid "+ [yahoo] %s: stopped typing" #~ msgstr "+ [yahoo] %s: slutade skriva" #~ msgid "+ [icq] %s has requested our away message" #~ msgstr "+ [icq] %s begärde frÃ¥nvarumeddelandet" #~ msgid "%s requested our away message, sent the response" #~ msgstr "%s begärde frÃ¥nvarumeddelandet, skickade svar" #~ msgid "+ [msn] connecting to the server" #~ msgstr "+ [msn] ansluter till servern" #~ msgid "+ [msn] %s: stopped typing" #~ msgstr "+ [msn] %s: slutade skriva" #~ msgid "+ [msn] %s: started typing" #~ msgstr "+ [msn] %s: började skriva" #~ msgid "+ [msn] logged in" #~ msgstr "+ [msn] inloggad" #~ msgid "+ [msn] disconnected" #~ msgstr "+ [msn] frÃ¥nkopplad" #~ msgid " Typing notifications in the log window : %s " #~ msgstr " Skriver noteringar i loggfönstret : %s " #~ msgid " [all] All of them" #~ msgstr " [alla] Alla tjänster" #~ msgid "+ [jab] incorrect jabber id" #~ msgstr "+ [jab] felaktigt jabber id" #~ msgid " enter to select a file, esc to cancel " #~ msgstr " tryck enter för att välja en fil, esc för avbryta " #~ msgid " space to select a directory, esc to cancel " #~ msgstr " tryck mellanslag för att välja en katalog, esc för avbryta " #~ msgid "SOCKS proxy server to use: " #~ msgstr "Använd SOCKS proxy server: " #~ msgid "SOCKS proxy user name: " #~ msgstr "SOCKS proxy användarnamn: " #~ msgid "SOCKS proxy password: " #~ msgstr "SOCKS proxy lösenord: " #~ msgid "+ [msn] unable to connect to the server" #~ msgstr "+ [msn] kunde inte ansluta till servern" #~ msgid "+ [msn] connecting with %s" #~ msgstr "+ [msn] ansluter med %s" #~ msgid " Channel manager " #~ msgstr " Kanalhanterare " #~ msgid " IRC channels manager " #~ msgstr " IRC Kanalhanterare " #~ msgid "Password" #~ msgstr "Lösenord" #~ msgid "Show" #~ msgstr "Visa" #~ msgid " Channels " #~ msgstr " Kanaler " #~ msgid "shown" #~ msgstr "synlig" #~ msgid "hidden" #~ msgstr "gömd" #~ msgid "channel name to add: " #~ msgstr "lägg till följande kanalnamn: " #~ msgid "+ [aim] disconnected from the network" #~ msgstr "+ [aim] frÃ¥nkopplad frÃ¥n tjänsten" #~ msgid "+ [irc] disconnected from the network" #~ msgstr "+ [irc] frÃ¥nkopplad frÃ¥n tjänsten" #~ msgid "Show on the list" #~ msgstr "Visa i listan" #~ msgid ".. %d contacts require authorization" #~ msgstr ".. %d kontakter kräver attestering" #~ msgid "%d contacts require authorization to be added. Request it now?" #~ msgstr "%d kontakter kräver attest för att läggas till. Begär det nu?" #~ msgid " Sound and colors " #~ msgstr " Ljud och färger " #~ msgid "Notify the user he/she has been added?" #~ msgstr "Meddela användaren att han/hon har lagts till?" #~ msgid "+ the notification has been sent to %lu" #~ msgstr "+ meddelandet har skickats till %lu" #~ msgid "+ initializing %s engine" #~ msgstr "+ initierar %s motorn" #~ msgid "+ [yahoo] unable to connect to the server" #~ msgstr "+ [yahoo] kunde inte ansluta till servern" #~ msgid "+ [yahoo] disconnected from the network" #~ msgstr "+ [yahoo] frÃ¥nkopplad frÃ¥n tjänsten" #~ msgid "* %s" #~ msgstr "* %s" #~ msgid " IRC channels (join/leave) " #~ msgstr " IRC kanaler (anslut/lämna) " centerim-4.22.10/po/zh_CN.po0000644000175000001440000023071211473011457012372 00000000000000# Traditional Chinese language definitions for centerim. # Copyright (C) 2000-2001 Free Software Foundation, Inc. # Clive Lin , 2000 # Ying-Chieh Liao , 2000-2005 # Minor corrections by Ambrose Li , 2001 # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.20.0\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2005-02-04 11:12+0800\n" "Last-Translator: Ying-Chieh Liao \n" "Language-Team: Chinese \n" "Language: zh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: China\n" #: src/centerim.cc:138 msgid "password: " msgstr "密ç : " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "%s 好å‹åˆ—表èœå•, %s å˜æ¢çжæ€, %s 选项, %s 退出" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "忽略所有æ¥è‡ª %s 的消æ¯å— ?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "也把 %s 从好å‹åˆ—è¡¨ä¸­åˆ é™¤å— ?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "真的è¦å°† %s ç”±åˆ—è¡¨ä¸­åˆ é™¤å— ?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "新昵称: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "改å˜ä½¿ç”¨è€…分组" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ ä¸èƒ½åœ¨ç¦»çº¿çжæ€ä¸‹è¯»å–外出消æ¯" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! 硬盘空间ä¸åˆ° 10k 所以无法连接" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "外出消æ¯" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! 编译时没有加入 %s 的功能" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ 收到新信, å…± %d å°" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] 收到新信, å…± %d å°" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ 最åŽçš„æ¶ˆæ¯æ˜¯ %s ä¼ æ¥çš„" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ %s 的设置已修改, 釿–°è½½å…¥ä¸­" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! 有å¦ä¸€ä¸ª centerim 正在执行中" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! pid %lu 会造æˆé—®é¢˜" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "手机å·ç : " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "把文件存到哪个目录 : " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "所指定的目录ä¸å¯å†™å…¥" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "所指定的目录ä¸å­˜åœ¨" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ 与 %s 之间无消æ¯è®°å½•" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ %s 已在列表中" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "把使用者加入分组" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s 已被加入列表中" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ 对方已ç»å›žæ¥" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] 状æ€å›žå­˜" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] 自动设置 %s" #: src/centerim.cc:1490 msgid "away" msgstr "外出" #: src/centerim.cc:1490 msgid "n/a" msgstr "N/A" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! 硬盘空间ä¸åˆ° 10k, 自动离线" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! å¦åˆ™å¯èƒ½ä¼šä¸¢å¤±é‡è¦æ¶ˆæ¯æˆ–是设置" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "邀请加入会议.." #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "选择è¦ç§»åŠ¨åˆ†ç»„çš„å¥½å‹" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "将选å–的使用者移至.." #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "无法读å–" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "错误的 XML" #: src/hooks/rsshook.cc:353 #, fuzzy msgid "no or tag found" msgstr "找ä¸åˆ° 标签" #: src/hooks/rsshook.cc:362 #, fuzzy msgid "no or tag found" msgstr "找ä¸åˆ° 标签" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "错误的 标签" #: src/hooks/rsshook.cc:380 msgid "success" msgstr "æˆåŠŸ" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "主题: " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "在哪里å‘布 :" #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "类别: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "作者 : " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "æè¿° : " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "链接 : " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "附注: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] 无法连接: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "无法å解主机åç§°" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "无法建立连接" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "éªŒè¯æ‰€è¾“入的主机ååŠç«¯å£" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] 离开 %s 会议" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "请加入我的会议." #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "è‡ªå®šä¹‰çŠ¶æ€æ¶ˆæ¯ :" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] 无法å–å¾— %s, %s 的外出消æ¯" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] 无法连接: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] 无法登录 : 使用者å称和密ç ä¸ç¬¦" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] 无法登录 : 使用者å称和密ç ä¸ç¬¦" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] 无法登录 : 该å¸å·è¢«åœç”¨" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ 釿–°æŸ¥çœ‹ %s" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] 检查到从其他地方上线" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] æœåŠ¡å™¨å…³é—­é“¾æŽ¥" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "使用者 %s 邀请你加入 %s 会议, 主题是 : %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "ç›®å‰å‚加会议的æˆå‘˜æœ‰ : " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "自动加入会议" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "使用者 %s æ‹’ç»äº†ä½ çš„会议邀请" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "使用者 %s 加入会议中" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "使用者 %s 离开会议了" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "该使用者己ç»å°†ä½ åŠ å…¥ä»–çš„å¥½å‹åˆ—表中" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "æ¶ˆæ¯æ˜¯ : " #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] 从 %s, %s 寄æ¥çš„ e-mail" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] ç³»ç»Ÿæ¶ˆæ¯ : %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] 错误 : %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] 错误 : %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] 无法直接连接" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] 无法连接: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] 无法连接: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] 无法连接: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] 无法连接: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] 错误 : %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] 错误 : %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] 无法连接: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] 无法连接: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] 错误 : %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "该使用者今天生日" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] 无法连接æœåС噍" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] 在 %s agent 处喿¶ˆç™»å½•" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "å¤–å‡ºæ¶ˆæ¯ : " #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] 无法å–å¾— %s, %s 的外出消æ¯" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "无法注册有问题的昵称" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "无法连接" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "远端机器使用 %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "默认的 Jabber 会议主机" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, c-format msgid "+ [jab] error %d" msgstr "+ [jab] 错误 %d" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] 错误 %d : %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "该使用者把你从好å‹åˆ—表中移除 (以 Jabber çš„è¯æ¥è¯´å°±æ˜¯ unsubscribe)" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] 无法连接æœåС噍" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "我很喜欢 centerim 默认的 AIM 资讯 %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "AIM 连接失败" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] 连接失败: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "该使用者没有å¯å–得的资讯" #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] 密ç å·²é€å‡º" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "如您所愿" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "连接有问题" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "䏿­£ç¡®çš„使用者åç§°" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "加速" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "密ç é”™è¯¯" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "使用者å称和密ç ä¸ç¬¦" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "检查到é‡å¤ç™»å½•" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] cannot connect" msgstr "+ [icq] 无法连接 : " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] 连接中断" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "ICQ 中断原因" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "è¯¥ä½¿ç”¨è€…å·²åŒæ„你的验è¯è¦æ±‚" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "该使用者拒ç»ä½ çš„验è¯è¦æ±‚, ç†ç”±æ˜¯ : " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] 无法传短信给 %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] 无法传短信给 %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] 无法å–å¾— %s, %s 的外出消æ¯" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "éšæœºé€‰å–èŠå¤©å¯¹è±¡" #: src/hooks/gaduhook.cc:161 msgid "+ [gg] connection failed" msgstr "+ [gg] æœåŠ¡å™¨è¿žæŽ¥å¤±è´¥" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [gg] 无法查明 %s" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "+ [gg] 连接æœåŠ¡å™¨æ—¶å‘生问题" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "+ [gg] æœåŠ¡å™¨è¿žæŽ¥ä¸­æ–­" #: src/hooks/gaduhook.cc:404 #, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [gg] 无法å–å¾— %s, %s 的外出消æ¯" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] 无法连接æœåС噍" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] 连接失败: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] 昵称æˆåŠŸåœ°ä¿®æ”¹äº†" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "ç™»å½•é¢‘é“ : " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "被 %s 踢出 ; ç†ç”±æ˜¯ : %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "该使用者把昵称从 %s æ¢æˆ %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] 密ç å·²é€å‡º" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] 密ç å·²é€å‡º" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "从使用者æ¥çš„ PING 回应 : %d ç§’" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s 加入了" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s 离开了" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "ç†ç”± : %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s 被 %s 踢出去" #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "频é“主题是 : %s " #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "ç”± %s 设置" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s 被 %s 赋与 op æƒé™" #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s 被 %s å–æ¶ˆäº† op æƒé™" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s 给我 op æƒé™" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "你是这里的 op" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s å–æ¶ˆæˆ‘çš„ op æƒé™" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] æœç´¢ç»“æŸ" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "无法连接 : " #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] HTTP 连接失败: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "æœåŠ¡å™¨æ¶ˆæ¯ :" #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] 登录失败: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] å¼ è´´æˆåŠŸï¼Œä»£å·æ˜¯ %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] 张贴错误 : %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "使用者 %s (%s) å·±ç»å°†ä½ åŠ å…¥ä»–çš„å¥½å‹åˆ—表中\n" "\n" "Journal åœ°å€ : %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "使用者 %s å·±ç»å°†ä½ ä»Žä»–的好å‹åˆ—表中移除\n" "\n" "Journal åœ°å€ : %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] åˆ é™¤å¥½å‹æ—¶å‘生错误" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] å·²ç»ä»Žæ‚¨çš„好å‹åˆ—表中删除该使用者" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] 无法新增好å‹" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s 已被加入列表中" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] åå‘使用者列表已å–回, 找到 %d 笔资料" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "+ [msn] 未读信件 : 收件匣中有 %d å°, 其他信匣中有 %d å°" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] 从 %s, %s 寄æ¥çš„ e-mail" #: src/hooks/msnhook.cc:905 msgid "+ [msn] cannot connect: " msgstr "+ [msn] 无法连接 : " #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "验è¯ä¸»æœºååŠç«¯å£" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "连接æœåС噍䏭" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "登录" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "æœç´¢ç»“æŸ, 找到 %d 笔资料" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "å¯†ç æˆåŠŸåœ°ä¿®æ”¹äº†" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "断线" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "把 %s 加入好å‹åˆ—表" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "把 %s 从好å‹åˆ—表中删除" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "æˆå‘˜åˆ—表已å–回, 找到 %d 笔资料" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "该使用者今天生日" #: src/icqcontact.cc:853 msgid "Jan" msgstr "一月" #: src/icqcontact.cc:853 msgid "Feb" msgstr "二月" #: src/icqcontact.cc:853 msgid "Mar" msgstr "三月" #: src/icqcontact.cc:853 msgid "Apr" msgstr "四月" #: src/icqcontact.cc:854 msgid "May" msgstr "五月" #: src/icqcontact.cc:854 msgid "Jun" msgstr "六月" #: src/icqcontact.cc:854 msgid "Jul" msgstr "七月" #: src/icqcontact.cc:854 msgid "Aug" msgstr "八月" #: src/icqcontact.cc:855 msgid "Sep" msgstr "乿œˆ" #: src/icqcontact.cc:855 msgid "Oct" msgstr "åæœˆ" #: src/icqcontact.cc:855 msgid "Nov" msgstr "å一月" #: src/icqcontact.cc:855 msgid "Dec" msgstr "å二月" #: src/icqgroups.cc:66 msgid "General" msgstr "一般" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "从 %s æ¥çš„事件" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60 以上" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "䏿˜Žçš„ IM 类型" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "一般èŠå¤©" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "爱情故事" #: src/icqdialogs.cc:60 msgid "Games" msgstr "游æˆ" #: src/icqdialogs.cc:61 msgid "Students" msgstr "学生" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "二å多å²" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "三å多å²" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "å››å多å²" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "五åå²ä»¥ä¸Š" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "找女人" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "找男人" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "åå­—" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " æœç´¢ä¸ªäººèµ„æ–™" #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "移除" #: src/icqdialogs.cc:120 msgid "Load" msgstr "L载入" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ 必需先登录系统" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "O载入" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "Aä¿å­˜" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "L清除" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "C修改" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Sæœç´¢/A新增" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "J加入/C新创" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "I链接" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " F找寻/新增好å‹" #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " J加入或新创一个频é“/会议 " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " 链接一个 RSS æ¥æº" #: src/icqdialogs.cc:299 msgid " Network " msgstr " 网络 " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " 详细资料 " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " 昵称 : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " å : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " å§“ : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " 年龄 : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " 性别 : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " 语言 : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " 地ç†ä½ç½® " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " 城市 : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " çœ/å·ž : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " 国家 : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " 工作 " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " å…¬å¸ : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " 部门 : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " èŒç§° : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " åªæ‰¾åœ¨çº¿ " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " éšæœºèŠå¤©åˆ†ç»„ " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " 关键字 " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " 昵称 " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " æœç´¢æœåŠ¡ " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " æœç´¢å‚æ•° " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " 频é“傿•° " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " XML 汇出 URL : %s" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " 检查频率 (以分为å•ä½) : %lu" #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " é¢‘é“ : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " åç§° : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr "" #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " 关键字 : %s" #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " 选项 " #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " åªå¯»æ‰¾é™„照片的使用者 : %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " åªå¯»æ‰¾åœ¨çº¿çš„ : %s" #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " 显示到底有哪些人把你加到好å‹åˆ—表中 " #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " åç§°/头衔 " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " å¯†ç  " #: src/icqdialogs.cc:443 msgid " Service " msgstr " æœåŠ¡ " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "新设置文件å : " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "å·²ç»æœ‰ä¸€ä¸ªåŒå的设置文件å了. è¦è¦†ç›–å— ?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "昵称: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "åç§°/头衔 : " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-Mail: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "å: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "å§“: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "城市: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "çœ/å·ž: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "å…¬å¸: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "部门: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "èŒä½: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "频é“: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "åç§° : " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "关键字 : " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "密ç : " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "URL: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "检查频率 :" #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "错误的 Jabber ä»£ç  !" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " 一般 " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " 注册æœåŠ¡ " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " æ³¨å†Œå‚æ•° " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " ä¿®æ”¹å¯†ç  : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " 生日 : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " 年龄 : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " ä½å®¶ " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " è¡—é“ä½å€ : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " é‚®é€’åŒºå· : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " ç”µè¯ : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " 传真 : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " 手机 : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " 主页 : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " å…¶ä»– " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " æ¯è¯­ : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 第一外语 : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 第二外语 : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " æ‚项 " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " å¯åŠ¨ç½‘é¡µçŠ¶æ€æŒ‡ç¤ºå™¨ : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " éšæœºèŠå¤©åˆ†ç»„ : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " è¦æ±‚éªŒè¯ : %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " çœ/å·ž : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " 关于 " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "下载你的详细资料" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " ä½ çš„ %s 资料 " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s 的详细资料 " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "完æˆ" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "ç¨å¾…片刻, 您的详细资料尚未下载" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-mail: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "输入生日 (DD-MM-YYYY): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "年龄: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "è¡—é“ä½å€: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "邮递区å·: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "电è¯: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "传真: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "手机: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "首页: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "关于" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "新密ç : " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "ç¡®è®¤å¯†ç  : " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "没有" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X ä¿å­˜, Esc å–æ¶ˆ] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " 呿–‡ä»¶ç»™ %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "加入" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "附注" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "å‘é€" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " 文件 " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " 附注 " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "文件å: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "附注: " #: src/icqdialogs.cc:1163 msgid "None" msgstr "没有" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "俄国的" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "波兰的" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " centerim 设置选项 " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " ä½¿ç”¨è€…ç•Œé¢ " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " 改å˜éŸ³æ•ˆè£…置为 : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " 改å˜è‰²å½©é…置为 : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr " 需è¦éªŒè¯" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " 本地字符集 : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " é¢‘é“ : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " 分组分类显示法 : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " å¯åЍåŒå‘语言功能 : %s " #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " 在文字编辑器里å¯åЍ emacs 按键设置 : %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " 在文字编辑器里å¯åЍ emacs 按键设置 : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr " 转æ¢è¯­ç³»é¡µç " #: src/icqdialogs.cc:1241 #, c-format msgid " Switch to language preset : %s " msgstr " 切æ¢åˆ°é»˜è®¤è¯­è¨€ : %s " #: src/icqdialogs.cc:1242 #, c-format msgid " Remote charset : %s " msgstr " 远端字符集 : %s " #: src/icqdialogs.cc:1243 #, c-format msgid " Local charset : %s " msgstr " 本地字符集 : %s " #: src/icqdialogs.cc:1246 #, c-format msgid " For protocols : %s" msgstr " 对什么åè®® : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " 好å‹åˆ—表 " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " 分组分类显示法 : %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " 分组分类显示法 : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " éšè—离线使用者 : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " 防垃圾消æ¯: 删除éžå¥½å‹çš„æ¶ˆæ¯ : %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " è¦æ±‚éªŒè¯ : %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " åœ¨å›žå¤æ¶ˆæ¯æ—¶å¼•言 : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " 检查本地邮件 : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " ä¿å­˜å¯†ç  : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " åœ¨ä¿®æ”¹çŠ¶æ€æ—¶ä¿®æ”¹å¤–å‡ºæ¶ˆæ¯ : %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " èŠå¤©æ¶ˆæ¯æ¨¡å¼ : %s" #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " 按 Enter 就把消æ¯é€å‡º : %s" #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " èŠå¤©æ¶ˆæ¯æ¨¡å¼ : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " 按 Enter 就把消æ¯é€å‡º : %s" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr " æ°¸è¿œä¿æŒä¸Šçº¿çŠ¶æ€ : %s" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " 分组分类显示法 : %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " 通讯 " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " SMTP æœåС噍 : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " HTTP æµè§ˆå™¨ : %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " HTTP ä»£ç†æœåС噍 : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "HTTP Proxy (RSS å’Œ LJ 会用到) : %s" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " å¯åЍ P2P 通讯 : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " P2P å¯ä½¿ç”¨çš„ port 范围 : %s " #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " 记录中 " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " log 视窗中是å¦è¦æ˜¾ç¤ºæ—¶é—´æˆ³ : %s " #: src/icqdialogs.cc:1301 #, fuzzy, c-format msgid " Timestamps include seconds : %s " msgstr " log 视窗中是å¦è¦æ˜¾ç¤ºæ—¶é—´æˆ³ : %s " #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " log 视窗中是å¦è¦æ˜¾ç¤º 上线/离线 æ¶ˆæ¯ : %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " 在 ~/.centerim/log 中详注 IM 事件日志细节 : %s" #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " è‡ªåŠ¨åˆ‡æ¢æŠŠçŠ¶æ€åˆ‡æ¢æˆå¤–出 (å•ä½åˆ†) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " 自动把状æ€åˆ‡æ¢æˆ N/A (å•ä½åˆ†) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " 自动把状æ€åˆ‡æ¢æˆ N/A (å•ä½åˆ†) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " è¡—é“ä½å€ : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "闲置自动外出时间 (0 表ä¸ä½¿ç”¨): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "闲置自动N/Aæ—¶é—´ (0 表ä¸ä½¿ç”¨): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "SMTP æœåС噍: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "P2P å¯ä½¿ç”¨çš„ port 范围 (最å°-最大): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "HTTP ä»£ç†æœåŠ¡å™¨åœ°å€: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "消æ¯åŽŸå§‹å­—ç¬¦é›† : " #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "消æ¯è½¬æ¢å­—符集 : " #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "HTTP ä»£ç†æœåŠ¡å™¨åœ°å€: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "空白的验è¯è¦æ±‚" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "您的详细资料已下载完" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "管ç†åˆ†ç»„" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Ræ›´å" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "E移除" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "Uå‘上移" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "Då‘下移" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "选择" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " 分组 " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "新增分组åç§°: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "新分组å: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "确定è¦åˆ é™¤åˆ†ç»„å— ?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "文件传输状æ€" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "å–æ¶ˆ" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " 从 %s æ¥çš„" #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " é€åˆ° %s 去 " #: src/icqdialogs.cc:1865 msgid "init" msgstr "å¯å§‹" #: src/icqdialogs.cc:1866 msgid "start" msgstr "开始" #: src/icqdialogs.cc:1867 msgid "work" msgstr "工作" #: src/icqdialogs.cc:1868 msgid "done" msgstr "完æˆ" #: src/icqdialogs.cc:1869 msgid "err" msgstr "错误" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "失败" #: src/icqdialogs.cc:1877 msgid " of " msgstr " çš„ " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "这个å‘é€è¿‡ç¨‹å·²ç»åœ¨è¿›è¡Œä¸­, ä¸èƒ½ç§»é™¤" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "公开的 (所有人都å¯ä»¥çœ‹å¾—到)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "ç§æœ‰çš„" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "åªç»™å¥½å‹" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr " LiveJournal å¼ è´´ : 属性" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "éŸ³ä¹æ£€æŸ¥" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "På¼ è´´" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Aå–æ¶ˆ" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " 贴到 journal : %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " 主题 : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " 安全性 : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " 有趣的事物" #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " 心情 : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(æ— /自定义)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " 自定义心情 : %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " éŸ³ä¹ : %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " 照片 : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(默认值)" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " 年龄 : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " 关闭自动格å¼åŒ– : %s" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " 关闭由 e-mail 传递评论 : %s" #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " ä¸å…许评论 : %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " 过时æ¡ç›® : %s" #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "张贴主题 :" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "" #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "ç›®å‰å¿ƒæƒ… :" #: src/icqdialogs.cc:2094 #, fuzzy msgid "Tags for the entry: " msgstr "æœåŠ¡å™¨æ¶ˆæ¯ :" #: src/icqdialogs.cc:2128 msgid "pgp key quick search" msgstr "PGP 密钥快速æœç´¢" #: src/icqdialogs.cc:2130 #, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "PGP 密钥æœç´¢: æœç´¢å¥½å‹, %s 冿‰¾ä¸€æ¬¡, Enter ç»“æŸæœç´¢" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "选择一份 PGP 密钥 " #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr "ä¸ä½¿ç”¨å¯†é’¥" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "选择 PGP 密钥" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "选择 PGP 密钥: 快速查看请用 %s" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "执行外部命令 %s, è¿”å›žä»£ç  = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "执行外部命令 %s, è¿”å›žä»£ç  = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "离线" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "上线" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "éšèº«" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "欢迎èŠå¤©" #: src/imcontact.cc:114 msgid "Do not disturb" msgstr "ä¸è¦æ‰“扰" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "很忙" #: src/imcontact.cc:116 msgid "Not available" msgstr "没空" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "外出" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "DND" #: src/imlogger.cc:39 msgid "N/A" msgstr "没空" #: src/imlogger.cc:49 msgid "message" msgstr "消æ¯" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "短信" #: src/imlogger.cc:52 msgid "authorization" msgstr "验è¯" #: src/imlogger.cc:53 msgid "e-mail" msgstr "E-mail" #: src/imlogger.cc:54 msgid "notification" msgstr "æé†’" #: src/imlogger.cc:55 msgid "contacts" msgstr "好å‹" #: src/imlogger.cc:56 msgid "files" msgstr "文件" #: src/imlogger.cc:57 msgid "event" msgstr "事件" #: src/imlogger.cc:79 msgid "events log started" msgstr "开始事件纪录" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "é€ %s ç»™ %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "收到 %2$s ä¼ æ¥çš„ %1$s" #: src/imlogger.cc:123 msgid "ignored" msgstr "忽略" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s 离线了" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "在 %3$s 上é€å‡ºç»™ %2$s çš„ %1$s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: 上线了, ç›®å‰çŠ¶æ€æ˜¯ %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: 离线了" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "把您的 %1$s 状æ€ä»Ž %3$s åˆ‡æ¢æˆ %2$s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " IM å¸å·ç®¡ç†å‘˜ " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " æœåŠ¡å™¨åœ°å€ : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " 安全性 : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " å¸å· : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " å¯†ç  (选择性的) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " å¯†ç  : %s " #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr " 优先级 : %s " #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr " 汇入好å‹åˆ—表 : %s " #: src/accountmanager.cc:134 #, c-format msgid " NickServ password (optional) : %s " msgstr " NickServ å¯†ç  (选择性的) : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " 分组分类显示法 : %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " 分组分类显示法 : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " 注册 " #: src/accountmanager.cc:155 #, c-format msgid " OpenPGP key: %s " msgstr " OpenPGP 密钥: %s " #: src/accountmanager.cc:160 #, c-format msgid " Key passphrase: %s " msgstr " 密钥通行ç : %s" #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " 修改昵称 " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " 更新您的详细资料 " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " 设置外出消æ¯" #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " åœç”¨ " #: src/accountmanager.cc:200 msgid " user name: " msgstr " 使用者: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " 密ç : " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "必需先丢弃å¸å·èµ„æ–™!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "必需先离线!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " æœåŠ¡å™¨åœ°å€ :" #: src/accountmanager.cc:285 msgid " priority: " msgstr " 优先级 :" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "PGP 密钥通行ç : " #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " 在 %s 网络上注册 " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "直接åš" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " æƒ³ä½¿ç”¨çš„å¯†ç  : %s" #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " ç¡®è®¤å¯†ç  : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " æœåŠ¡å™¨åœ°å€ : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "验è¯å¯†ç : " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "昵称: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "æœåС噍: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "密ç ä¸ç¬¦åˆ" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "必需输入密ç " #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "密ç è‡³å°‘è¦æœ‰ 6 个字" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " 注册进行中... " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "连接至æœåС噍 %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "é€å‡ºè¯·æ±‚" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "注册新使用者超时。é‡è¯• ?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "é‡è¯•中..." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "æ–°çš„ UIN 是 %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "断线" #: src/imcontroller.cc:179 msgid "Unable to connect to icq server. Retry?" msgstr "无法连接 icq æœåŠ¡å™¨ã€‚é‡è¯• ?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "å°è¯•在 %2$s 中注册 %1$s ..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "Jabber ID å·²ç»æˆåŠŸåœ°æ³¨å†Œäº†" #: src/imcontroller.cc:228 msgid "Failed" msgstr "失败" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "在更新资料å‰å¿…需先登录 ICQ" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "MSN 新昵称 : " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "在修改昵称å‰å¿…需先登录 MSN 网络" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "在更新资料å‰å¿…需先登录 Jabber 网络" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "在更新资料å‰å¿…需先登录 Gadu-Gadu 网络" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "注册目å‰å°šæœªæ”¯æŒ" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "我很喜欢默认的 %s å¤–å‡ºæ¶ˆæ¯ %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ 执行 %s 指令" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "事件å‘é€é”™è¯¯ : 傿•°ä¸è¶³" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "事件å‘é€é”™è¯¯ : åªæœ‰åœ¨ ICQ åè®®æ‰èƒ½ä¼  UINs" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "事件å‘é€é”™è¯¯ : 䏿˜Žçš„ IM 类型" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "事件å‘é€é”™è¯¯ : 䏿˜Žçš„事件类型" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s 到 %s 已被放入队列中" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "事件å‘é€é”™è¯¯ : 无法新增该使用者的目录" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "䏿˜Žçš„状æ€å­—符" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "䏿˜Žçš„ IM 类型" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "çŠ¶æ€æ”¹å˜æœ‰è¯¯ : " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "使用方法: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "一般选项:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr " --ascii, -a 使用 ASCII 字符æ¥ç»˜å‡ºè§†çª—以åŠä½¿ç”¨è€…界é¢" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b 设置一个自定义目录" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B 使用自定义的 IP" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr " --no-xtitles, -T ä¸åŽ»ä¿®æ”¹ xterm 的视窗标题" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr " --offline, -o å¯åŠ¨æ—¶å°†æ‰€æœ‰å议的状æ€éƒ½è®¾ä¸ºç¦»çº¿" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr " --debug, -d å¯åŠ¨é™¤é”™è®°å½•" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help 显示这份消æ¯" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v 显示程åºç‰ˆæœ¬èµ„讯" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "事件å‘é€é€‰é¡¹:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr " -s, --send 事件类型; å¯ä»¥æ˜¯ msg, sms 或是 url" #: src/icqconf.cc:1694 #, fuzzy msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr " -S, --status 设置目å‰çš„ IM 状æ€" #: src/icqconf.cc:1695 #, fuzzy msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto å议类型; å¯ä»¥æ˜¯ icq, yahoo, aim, irc, jabber 或" "是 lj" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr " -t, --to 对象 UIN 或是昵称 (ä¾å议类型而异)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr " -n, --number 手机å·ç  (åªé™ç”¨åœ¨çŸ­ä¿¡)" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "错误请通报 http://bugzilla.centerim.org" #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "空白的验è¯è¦æ±‚" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* è¦æ±‚éªŒè¯ : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* éªŒè¯ : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* 好å‹åˆ—表 : " #: src/imevents.cc:522 msgid "" msgstr "<无昵称>" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* 文件传输" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "请输入 PGP 通行ç : " #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "䏿­£ç¡®çš„ PGP 通行ç " #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "PGP ç­¾å错误: " #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "PGP 加密错误: " #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "未寻获" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "资讯" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " IM å¸å·ç®¡ç†å‘˜ " #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " 对什么åè®® : %s " #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " 使用者: " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "是" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "å¦" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "是" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " å¸å·.." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " 所有åè®®" #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "使用方法: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " 所有åè®®" #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " å¸å·.." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "是" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "å一月" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " æœåŠ¡ " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 #, fuzzy msgid "No Jabber" msgstr "错误的 Jabber ä»£ç  !" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "䏿˜Žçš„ IM 类型" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "ç”·" #: src/icqface.cc:53 msgid "Female" msgstr "女" #: src/icqface.cc:56 msgid "Not specified" msgstr "未指定" #: src/icqface.cc:61 msgid "Ok" msgstr "确认" #: src/icqface.cc:62 msgid "Next" msgstr "下一个" #: src/icqface.cc:63 msgid "Fwd" msgstr "转é€" #: src/icqface.cc:64 msgid "Reply" msgstr "回å¤" #: src/icqface.cc:65 msgid "Open" msgstr "å¼€å¯" #: src/icqface.cc:66 msgid "Accept" msgstr "接å—" #: src/icqface.cc:67 msgid "Reject" msgstr "退回" #: src/icqface.cc:68 msgid "User info" msgstr "用户信æ¯" #: src/icqface.cc:70 msgid "Prev" msgstr "å‰ä¸€é¡¹" #: src/icqface.cc:78 msgid "sound card" msgstr "音效å¡" #: src/icqface.cc:79 msgid "speaker" msgstr "PC å–‡å­" #: src/icqface.cc:80 msgid "disable" msgstr "关掉" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "䏿”¹å˜" #: src/icqface.cc:88 msgid "dark" msgstr "高雅的黑" #: src/icqface.cc:89 msgid "blue" msgstr "尊贵的è“" #: src/icqface.cc:97 #, fuzzy msgid "protocol" msgstr " 所有åè®®" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "开始" #: src/icqface.cc:118 msgid "mode 1" msgstr "第 1 åž‹" #: src/icqface.cc:119 msgid "mode 2" msgstr "第 2 åž‹" #: src/icqface.cc:249 #, fuzzy, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "centerim %s æœªé€æ¶ˆæ¯: %lu" #: src/icqface.cc:274 msgid "Send an URL" msgstr "å‘é€ç½‘å€" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " å‘é€çŸ­ä¿¡" #: src/icqface.cc:276 msgid "Send contacts" msgstr "å‘é€å¥½å‹" #: src/icqface.cc:277 msgid " Request authorization" msgstr " 需è¦éªŒè¯" #: src/icqface.cc:278 msgid "Edit details" msgstr "编辑详细资料 " #: src/icqface.cc:279 msgid "Fetch away message" msgstr "抓å–外出消æ¯" #: src/icqface.cc:280 msgid "Add to list" msgstr "加入好å‹åˆ—表" #: src/icqface.cc:281 msgid "Rename contact" msgstr "好勿›´å" #: src/icqface.cc:282 msgid " Move to group.." msgstr " 移至分组.." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "获å–版本信æ¯" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " å‘逿–‡ä»¶" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " 邀请å‚加会议.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " å‘ä¸€ä¸ªé¢‘é“æ¶ˆæ¯ enter" #: src/icqface.cc:294 msgid "Channel chat history" msgstr "频é“历å²è®°å½•" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " åˆ é™¤é¢‘é“ del" #: src/icqface.cc:296 msgid " Join channel" msgstr " 加入频é“" #: src/icqface.cc:297 msgid " Leave channel" msgstr " ç¦»å¼€é¢‘é“ " #: src/icqface.cc:298 msgid "List nicknames" msgstr "列出昵称" #: src/icqface.cc:301 msgid "UnBlock channel messages" msgstr "æ˜¾ç¤ºé¢‘é“æ¶ˆæ¯" #: src/icqface.cc:303 msgid "Block channel messages" msgstr "䏿˜¾ç¤ºé¢‘铿¶ˆæ¯" #: src/icqface.cc:310 msgid "Send a message" msgstr "逿¶ˆæ¯" #: src/icqface.cc:312 msgid "Event history" msgstr "事件历å²è®°å½•" #: src/icqface.cc:313 msgid "Remove user" msgstr "移除使用者" #: src/icqface.cc:314 msgid "User's details" msgstr "对方详细资料" #: src/icqface.cc:315 msgid "External actions.." msgstr "外部动作.." #: src/icqface.cc:318 msgid "Unset ignore user" msgstr "ä¸å¿½ç•¥è¯¥ä½¿ç”¨è€…" #: src/icqface.cc:318 msgid "Ignore user" msgstr "忽略使用者" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "指定 PGP 密钥..." #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "å–æ¶ˆ PGP 密钥" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "è½¬æ¢ PGP 加密 %s" #: src/icqface.cc:328 msgid "Force check" msgstr "强制检查" #: src/icqface.cc:435 msgid "Change status" msgstr "改å˜çжæ€" #: src/icqface.cc:436 msgid "Go to contact.." msgstr "移至好å‹åˆ—表.." #: src/icqface.cc:437 msgid " Accounts.." msgstr " å¸å·.." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " centerim 设置选项" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " 文件传输进度" #: src/icqface.cc:444 msgid " Find/add users" msgstr " 找寻/新增好å‹" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " 加入频é“/会议" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " 链接一个 RSS æ¥æº" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " 查看/编辑 忽略列表" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " 查看/编辑 ä¸å¯è§†åˆ—表" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " 查看/编辑 å¯è§†åˆ—表" #: src/icqface.cc:455 msgid "Show offline users" msgstr "显示离线使用者" #: src/icqface.cc:457 msgid "Hide offline users" msgstr "éšè—离线使用者" #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " 分组管ç†" #: src/icqface.cc:461 msgid " Mass group move.." msgstr " 大é‡åˆ†ç»„转移.." #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "详细资料" #: src/icqface.cc:905 msgid "Message" msgstr "消æ¯" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "æ–°æœç´¢" #: src/icqface.cc:924 msgid "Contact to add" msgstr "æ–°å¢žå¥½å‹ " #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "æœç´¢å¥½å‹.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "æœç´¢ç»“æžœ [æ— ]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "%s 的详细资料" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "昵称" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "这是你的 LiveJournal å¸å·ã€‚" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "用它æ¥åœ¨ä½ çš„ journal 里张贴消æ¯ã€‚" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "下列使用者将你加进他们的好å‹åˆ—表 :" #: src/icqface.cc:1112 msgid "found" msgstr "找到" #: src/icqface.cc:1114 msgid "used" msgstr "已使用" #: src/icqface.cc:1114 msgid "not used" msgstr "未使用" #: src/icqface.cc:1116 msgid "not found" msgstr "未寻获" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "别的 e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "æ—§çš„ e-mail" #: src/icqface.cc:1134 msgid "Gender" msgstr "性别" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "生日" #: src/icqface.cc:1136 msgid "Age" msgstr "年龄" #: src/icqface.cc:1137 msgid "Languages" msgstr "语言" #: src/icqface.cc:1138 msgid "Last IP" msgstr "最åŽä¸Šçº¿ IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "最åŽä¸Šçº¿æ—¶é—´" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "从未" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "天" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "å°æ—¶" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "分" #: src/icqface.cc:1189 msgid "seconds" msgstr "ç§’" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "文件" #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "å‘é€å¥½å‹" #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "验è¯" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "ä½å€" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "地ç†ä½ç½®" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "邮递区å·" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "电è¯" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "传真" #: src/icqface.cc:1258 msgid "Cellular" msgstr "手机" #: src/icqface.cc:1259 msgid "Timezone" msgstr "时区" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "主页" #: src/icqface.cc:1300 msgid "Company" msgstr "å…¬å¸" #: src/icqface.cc:1301 msgid "Department" msgstr "部门" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "èŒè¡”" #: src/icqface.cc:1346 msgid "Interests" msgstr "å…´è¶£" #: src/icqface.cc:1358 msgid "Background" msgstr "背景" #: src/icqface.cc:1376 msgid "Handle" msgstr "" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "RSS 文件" #: src/icqface.cc:1378 msgid "Version" msgstr "版本" #: src/icqface.cc:1379 msgid "Encoding" msgstr "ç¼–ç " #: src/icqface.cc:1382 msgid "Link" msgstr "链接" #: src/icqface.cc:1384 msgid "Frequency" msgstr "频率" #: src/icqface.cc:1385 msgid "Last check" msgstr "æœ€åŽæ£€æŸ¥æ—¶é—´" #: src/icqface.cc:1386 msgid "Next check" msgstr "下一个检查" #: src/icqface.cc:1387 msgid "Last result" msgstr "上次结果" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu 分" #: src/icqface.cc:1404 msgid "Now" msgstr "立刻" #: src/icqface.cc:1423 msgid "Full name" msgstr "å…¨å" #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "%s 链接 URL, %s 外部指令, %s 关闭" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "使用者 %s 的信æ¯" #: src/icqface.cc:1456 msgid "Check" msgstr "检查" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "编辑" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "接收" #: src/icqface.cc:1466 msgid "Friend of" msgstr "好å‹" #: src/icqface.cc:1472 msgid "Home" msgstr "ä½å®¶" #: src/icqface.cc:1472 msgid "Work" msgstr "工作" #: src/icqface.cc:1472 msgid "More" msgstr "å…¶ä»–" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "接收" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] ICQ 网络" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr " [gg] Gadu-Gadu" #: src/icqface.cc:1622 msgid " All protocols" msgstr " 所有åè®®" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr " åªæœ‰å·²ç™»å½•" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " 或 确定, å–æ¶ˆ" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " 确定, å–æ¶ˆ" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "移至好å‹åˆ—表" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "忽略列表" #: src/icqface.cc:1953 msgid "Visible list" msgstr "å¯è§†åˆ—表" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "ä¸å¯è§†åˆ—表" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "选择加入列表的è”系人" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "也把 %d 好å‹ä»Žå¥½å‹åˆ—è¡¨ä¸­ç§»é™¤å— ?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "事件接å—者" #: src/icqface.cc:2269 #, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "好å‹é€ŸæŸ¥: æœç´¢å¥½å‹, %s 冿‰¾ä¸€æ¬¡, Enter ç»“æŸæœç´¢" #: src/icqface.cc:2272 msgid "contact list quick search" msgstr "好å‹åˆ—表速查" #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ ç›®å‰çš„æ¶ˆæ¯ä¸­æ²¡æœ‰ URL" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "ç›®å‰æ¶ˆæ¯ä¸­çš„ URL" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ %s 没有定义外部动作" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "%s 外部动作的结果是 : " #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "%s é€å‡º, %s 多人短信, %s 过眼云烟, %s URLs, %s å…¨å±, %s æˆå‘˜, %s 关闭" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "%s é€å‡º, %s 多人短信, %s 过眼云烟, %s URLs, %s å…¨å±, %s 详细, %s å–æ¶ˆ" #: src/icqface.cc:2477 #, c-format msgid "Outgoing %s" msgstr "é€åˆ° %s" #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "å‘é€å¥½å‹.." #: src/icqface.cc:2670 msgid "file name: " msgstr "文件å: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "å‘é€ %s ç»™ %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "å‘é€è‡³ %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "收到 %s, 从 %s ä¼ æ¥" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "从 %s 接收到" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "%s 连到网å€,%s å…¨å±, %s 关闭" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "在 %3$s 上收到从 %2$s æ¥çš„ %1$s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "在 %3$s 上é€å‡ºç»™ %2$s çš„ %1$s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "免屿Ÿ¥çœ‹" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "%s 或 %s 关闭, Up/Down å’Œ PgUp/PgDn 翻页" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "与 %s 的历å²è®°å½•, 共有 %d 笔" #: src/icqface.cc:3339 #, c-format msgid "%s search, %s again, %s cancel" msgstr "%s æœç´¢, %s 冿œç´¢,%s å–æ¶ˆ" #: src/icqface.cc:3348 msgid "search for: " msgstr "æœç´¢: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] ç³»ç»Ÿæ¶ˆæ¯ : %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] 从 %s, %s 寄æ¥çš„ e-mail" #~ msgid "%s went online, with status %s" #~ msgstr "%s 上线了, ç›®å‰çŠ¶æ€æ˜¯ %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%1$s 的状æ€ä»Ž %3$s å˜æˆ %2$s" #~ msgid " [o] Online" #~ msgstr " [o] 上线" #~ msgid " [_] Offline" #~ msgstr " [_] 离线" #~ msgid " [a] Away" #~ msgstr " [a] 外出" #~ msgid " [c] Occupied" #~ msgstr " [c] 很忙" #~ msgid " [f] Free for chat" #~ msgstr " [f] 欢迎èŠå¤©" #~ msgid " [i] Invisible" #~ msgstr " [i] éšèº«" #~ msgid "+ [irc] password was requested, but it's not set" #~ msgstr "+ [irc] 需è¦å¯†ç ä½†æ˜¯æ²¡è®¾ç½®" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " ç¡®è®¤å¯†ç  : %s " #~ msgid " Convert from : %s " #~ msgstr " ä»Žä»€ä¹ˆè½¬æ¢ : %s " #~ msgid " Convert to : %s " #~ msgstr " 转æ¢è‡³ : %s " #~ msgid "Your friendly nickname has been changed to %s" #~ msgstr "你的昵称已被修改为 %s" centerim-4.22.10/po/remove-potcdate.sin0000644000175000001440000000066011473011430014626 00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } centerim-4.22.10/po/quot.sed0000644000175000001440000000023111473011430012474 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g centerim-4.22.10/po/Makevars0000644000175000001440000000356311461606612012527 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Konstantin Klyagin # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = centerim-4.22.10/po/pl.po0000644000175000001440000023451011473011457012004 00000000000000# Polish translation for centerim # Copyright (C) 2003 Free Software Foundation, Inc. # This file is distributed under the same license as the centerim package. # Piotr KUCHARSKI , 2003-2004. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.13.0\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2004-12-29 20:48+0100\n" "Last-Translator: Piotr KUCHARSKI \n" "Language-Team: Polish\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "hasÅ‚o: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" "%s menu listy kontaktowej, %s zmiana statusu, %s akcje ogólne, %s wyjÅ›cie" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Ignorować wszystko od %s?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "Usunąć %s także z listy kontaktów?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Czy na pewno chcesz usunąć %s?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Nowa ksywka: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Wybierz grupÄ™, do której przenieść użytkownika" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ nie można pobrać powodów nieobecnoÅ›ci, jeÅ›li nie jesteÅ› podłączony" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! nie można siÄ™ połączyć, mniej niż 10kB wolnego na dysku" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "powód nieobecnoÅ›ci" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! wsparcie dla %s zostaÅ‚o usuniÄ™te w trakcie kompilacji" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ otrzymano nowÄ… pocztÄ™, %d wiadomoÅ›ci" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] otrzymano nowÄ… pocztÄ™, %d wiadomoÅ›ci" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ ostatnia wiadomość od %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ konfiguracja %s zmieniÅ‚a siÄ™, odÅ›wieżono" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! inna kopia centerim jest już uruchomiona" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! może to powodować problemy. pid %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Komórka: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "katalog, w którym zostanÄ… nagrane pliki: " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "W danym katalogu nie można zapisywać" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "Dany katalog nie istnieje" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ brak historii dla %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ użytkownik %s jest już na liÅ›cie" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Wybierz grupÄ™, do której chcesz dodać użytkownika" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s zostaÅ‚ dodany do listy" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ użytkownik powróciÅ‚" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] status odtworzony" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] automatycznie oznacz jako %s" #: src/centerim.cc:1490 msgid "away" msgstr "Nieobecny" #: src/centerim.cc:1490 msgid "n/a" msgstr "n/a" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! wolne miejsce na dysku poniżej 10k, rozłączono" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! w przeciwnym wypadku można utracić wiadomoÅ›ci i konfiguracjÄ™" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "Zaproszenie do konferencji" #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "Wybierz kontakty, które chcesz przenieść" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "PrzenieÅ› wszystkich zaznaczonych użytkowników do.." #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "nie można pobrać" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "zÅ‚y XML" #: src/hooks/rsshook.cc:353 #, fuzzy msgid "no or tag found" msgstr "brak znacznika " #: src/hooks/rsshook.cc:362 #, fuzzy msgid "no or tag found" msgstr "brak znacznika " #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "zÅ‚y znacznik " #: src/hooks/rsshook.cc:380 msgid "success" msgstr "sukces" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "TytuÅ‚" #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "Opublikowano: " #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "Kategoria: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "Autor: " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "Opis: " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "ÅÄ…cze: " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "Komentarze: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] nie można siÄ™ połączyć: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "nie można znaleźć nazwy serwera" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "nie można utworzyć gniazda TCP/IP" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "sprawdź wprowadzonÄ… nazwÄ™ serwera i port" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] wychodzenie z konferencji %s" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "ProszÄ™ dołącz do mojej konferencji" #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Twój status" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] nie można pobrać powodu nieobecnoÅ›ci z %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] nie można siÄ™ połączyć: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] nie można zalogować: błędna nazwa użytkownika lub hasÅ‚o" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] nie można zalogować: błędna nazwa użytkownika lub hasÅ‚o" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] nie można zalogować: konto zostaÅ‚o zablokowane" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ w celu ponownej aktywacji odwiedź %s" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] wykryto inne zalogowanie" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] serwer zamknÄ…Å‚ połączenie" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "Użytkownik %s zaprasza CiÄ™ do konferencji %s o temacie: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "Bieżący czÅ‚onkowie konferencji: " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Automatycznie dołączono do konferencji" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "Użytkownik %s odrzuciÅ‚ Twoje zaproszenie do konferencji" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "Użytkownik %s dołączyÅ‚ do konferencji" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "Użytkownik %s opuÅ›ciÅ‚ konferencjÄ™" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "Użytkownik dodaÅ‚ CiÄ™ do swojej listy kontaktowej" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "wiadomość byÅ‚a: " #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] e-mail od %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] system: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] błąd: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] błąd: %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] bezpoÅ›rednie połączenie nie powiodÅ‚o siÄ™" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] nie można siÄ™ połączyć: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] nie można siÄ™ połączyć: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] nie można siÄ™ połączyć: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] nie można siÄ™ połączyć: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] błąd: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] błąd: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] nie można siÄ™ połączyć: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] nie można siÄ™ połączyć: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] błąd: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "Użytkownik ma dziÅ› urodziny" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] nie można podłączyć siÄ™ do serwera" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] wyrejestrowywanie z agenta %s" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Powód nieobecnoÅ›ci:" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] brak powodu nieobecnoÅ›ci od %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "ZÅ‚a ksywka, nie można zarejestrować" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "Nie można siÄ™ połączyć" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "Druga strona używa %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "DomyÅ›lny serwer konferencyjny Jabbera" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, c-format msgid "+ [jab] error %d" msgstr "+ [jab] błąd %d" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] błąd %d: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" "Użytkownik chce siÄ™ zapisać do otrzymywania Twojej widocznoÅ›ci sieciowej" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" "Użytkownik usunÄ…Å‚ CiÄ™ z listy jego kontaktów (używajÄ…c jÄ™zyka Jabbera, " "odsubskrybowaÅ‚ CiÄ™)" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] brak połączenia z serwerem" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "NaprawdÄ™ podoba mi siÄ™ domyÅ›lny profil AIM w centerim %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "[aim] połączenie siÄ™ nie udaÅ‚o" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] połączenie siÄ™ nie udaÅ‚o: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "Użytkownik nie ma informacji w profilu" #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] wysÅ‚ano hasÅ‚o" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "wedle życzenia" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "problem z gniazdem TCP/IP" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "zÅ‚a nazwa użytkownika" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "zbyt czÄ™ste połączenia, włączona czasowa ochrona" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "zÅ‚e hasÅ‚o" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "nazwa użytkownika lub hasÅ‚o nieprawidÅ‚owe" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "wykryto podwójne logowanie" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] cannot connect" msgstr "+ [icq] nie można siÄ™ połączyć: " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] rozłączono" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "[icq] powód rozłączenia" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "Użytkownik zaakceptowaÅ‚ TwojÄ… proÅ›bÄ™ o autoryzacjÄ™" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "Użytkownik odrzuciÅ‚ TwojÄ… proÅ›bÄ™ o autoryzacjÄ™ z powodu: " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] SMS nie zostaÅ‚ dostarczony do %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] SMS nie zostaÅ‚ dostarczony do %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] nie można pobrać powodu nieobecnoÅ›ci od %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Losowy Użytkownik do Rozmowy" #: src/hooks/gaduhook.cc:161 msgid "+ [gg] connection failed" msgstr "+ [gg] połączenie nie udaÅ‚o siÄ™" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [gg] nieznany host %s" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "+ [gg] połączenie z serwerem nie udaÅ‚o siÄ™" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "+ [gg] lista połączeÅ„" #: src/hooks/gaduhook.cc:404 #, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [gg] brak powodu nieobecnoÅ›ci od %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] brak połączenia z serwerem" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] połączenie siÄ™ nie udaÅ‚o: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] zmieniono ksywkÄ™" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Na kanaÅ‚ach: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Wykopany przez %s z powodu: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "Użytkownik zmieniÅ‚ ksywkÄ™ z %s na %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] wysÅ‚ano hasÅ‚o" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] wysÅ‚ano hasÅ‚o" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "Odpowiedź PING od użytkownika: %d sek" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s wszedÅ‚." #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s wyszedÅ‚" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "powód: %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s zostaÅ‚ wykopany przez %s" #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "Temat kanaÅ‚u teraz to: %s" #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "ustawiony przez %s" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s dostaÅ‚ opa od %s." #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s zostaÅ‚ zdeopowany przez %s." #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s daÅ‚ nam opa." #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "jesteÅ› tu opem" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s zabraÅ‚ nam opa." #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] sprawdzenie użytkownika zakoÅ„czono" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "nie można siÄ™ połączyć" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] HTTP nie powiodÅ‚o siÄ™: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "Wiadomość z serwera: " #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] logowanie nie powiodÅ‚o siÄ™: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] wysÅ‚ano poprawnie, id %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] błąd wysyÅ‚ania: %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Użytkownik %s (%s) dodaÅ‚ CiÄ™ do swojej listy przyjaciół\n" "\n" "Adres dziennika: %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Użytkownik %s usunÄ…Å‚ CiÄ™ ze swojej listy przyjaciół\n" "\n" "Adres dziennika: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] błąd kasowania przyjaciela" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] użytkownik zostaÅ‚ usuniÄ™ty z Twojej listy przyjaciół" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] nie można byÅ‚o dodać przyjaciela" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s zostaÅ‚ dodany do listy przyjaciół" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] zakoÅ„czono wypisywanie listy użytkowników, znaleziono %d" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr " + [msn] nieczytana poczta: %d w inbox, %d w folderach" #: src/hooks/msnhook.cc:799 #, fuzzy, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] e-mail od %s, %s" #: src/hooks/msnhook.cc:905 #, fuzzy msgid "+ [msn] cannot connect: " msgstr "+ [msn] nie można siÄ™ połączyć: " #: src/hooks/msnhook.cc:929 #, fuzzy msgid "verify the hostname and port" msgstr "sprawdź wprowadzonÄ… nazwÄ™ serwera i port" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "łączenie z serwerem" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "zalogowano" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "zakoÅ„czono wyszukiwanie, znaleziono %d" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "hasÅ‚o zostaÅ‚o zmienione" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "rozłączono" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "dodawanie %s do listy kontaktów" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "usuwanie %s z listy kontaktów" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "zakoÅ„czono Å›ciÄ…ganie listy czÅ‚onków, znaleziono %d" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "Użytkownik ma dziÅ› urodziny" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Sty" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Lut" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Mar" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Kwi" #: src/icqcontact.cc:854 msgid "May" msgstr "Maj" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Cze" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Lip" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Sie" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Wrz" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Paź" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Lis" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Gru" #: src/icqgroups.cc:66 msgid "General" msgstr "Ogólny " #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "zdarzenie od %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60 i wiÄ™cej" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "nieznany typ IM" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Chat ogólny" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Romanse" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Gry" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Studenci" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "20 coÅ›" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "30 coÅ›" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "40 coÅ›" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50 plus" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "Szukam kobiet" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Szukam mężczyzn" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Nazwisko" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Wyszukaj profile" #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "UsuÅ„" #: src/icqdialogs.cc:120 msgid "Load" msgstr "ZaÅ‚aduj" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ musisz być zalogowany" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "ZaÅ‚aduj" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "Zapisz" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "Wyczyść" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "ZmieÅ„" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Szukaj" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "Wejdź/Utwórz" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "Przyłącz" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Znajdź/dodaj użytkownika" #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " Wejdź/utwórz kanaÅ‚/konferencjÄ™ " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " Przyłącz strumieÅ„ RSS " #: src/icqdialogs.cc:299 msgid " Network " msgstr " Sieć " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Szczegóły " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Ksywka: %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " Email: %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " ImiÄ™: %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Nazwisko: %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Wiek: %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " PÅ‚eć: %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " JÄ™zyk: %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " Lokalizacja" #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Miasto: %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Stan: %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " PaÅ„stwo: %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Praca " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Firma : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " DziaÅ‚ : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Posada : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Tylko obecni " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Losowa grupa chat " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " SÅ‚owa kluczowe " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Ksywka " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " Szukanie " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Parametry szukania " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " Parametry strumienia " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " URL do eksportu XML: %s " #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " CzÄ™stotliwość sprawdzania (w minutach): %lu " #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " KanaÅ‚: %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Nazwa: %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " Dołączyli od ostatniego sprawdzenia " #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " SÅ‚owa kluczowe: %s " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " Opcje " #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " Użytkownicy tylko ze zdjÄ™ciami: %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " Sprawdzaj tylko obecnych użytkowników: %s " #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Pokazuj użytkowników, którzy majÄ… CiÄ™ na ich liÅ›cie " #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Nazwa/TytuÅ‚ " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " HasÅ‚o " #: src/icqdialogs.cc:443 msgid " Service " msgstr " Serwis " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Nowa nazwa profilu: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "Profil o takiej nazwie już istnieje. Czy chcesz go zastÄ…pić?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Ksywka: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Nazwa/TytuÅ‚: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "Email: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "ImiÄ™: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Nazwisko: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Miasto: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Stan: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Firma: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "DziaÅ‚: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Posada: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "KanaÅ‚: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Nazwa: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "SÅ‚owa kluczowe: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "HasÅ‚o: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "URL: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "CzÄ™stotliwość sprawdzania: " #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "NieprawidÅ‚owy Jabber ID" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Ogólne " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " Serwis rejestracji " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Parametry rejestracji " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " ZmieÅ„ hasÅ‚o: %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " Email: %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr "Data ur.: %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Wiek: %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Dom " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Ulica: %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Kod: %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefon: %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax: %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Komórka: %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Strona domowa: %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " WiÄ™cej " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " Pierwszy jÄ™zyk: %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " Drugi jÄ™zyk: %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " Trzeci jÄ™zyk: %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Różne " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Włącz znacznik stanu na WWW: %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Losowa grupa chat: %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Wymagana autoryzacja: %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Stan: %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " O... " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Pobieranie szczegółów " #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Twoje szczegóły %s " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: szczegóły " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "ZakoÅ„czono" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "ProszÄ™ poczekać. Ustawienia osobiste nie zostaÅ‚y jeszcze pobrane" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "Email: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Data urodzenia (DD-MM-YYYY): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Wiek: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Ulica: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "Kod: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefon: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Komórka: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Strona domowa: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "O..." #: src/icqdialogs.cc:869 msgid "New password: " msgstr "Nowe hasÅ‚o: " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "Powtórz nowe hasÅ‚o: " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "brak" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X zapisz, Esc anuluj] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " WyÅ›lij plik(i) do %s, %lu" #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Dodaj" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Komentarz" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "WyÅ›lij" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Pliki " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Komentarz " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "nazwa pliku: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "komentarz: " #: src/icqdialogs.cc:1163 #, fuzzy msgid "None" msgstr "Brak" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "rosyjski" #: src/icqdialogs.cc:1165 #, fuzzy msgid "Polish" msgstr "polski" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " Konfiguracja centerim " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Interfejs użytkownika " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " UrzÄ…dzenie dźwiÄ™kowe: %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Schemat kolorów: %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr "ProÅ›ba o autoryzacjÄ™ od %lu" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Lokalne kodowanie : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " KanaÅ‚: %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " UporzÄ…dkuj kontakty w grupy: %s" #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Włącz wsparcie dla jÄ™zyków dwukierunkowych: %s" #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Włącz emacsowe skróty klawiszy w edytorze: %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " Włącz emacsowe skróty klawiszy w edytorze: %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr " Konwersja stron kodowych " #: src/icqdialogs.cc:1241 #, c-format msgid " Switch to language preset : %s " msgstr " Przełącz na jÄ™zyk: %s " #: src/icqdialogs.cc:1242 #, c-format msgid " Remote charset : %s " msgstr " Zdalne kodowanie : %s " #: src/icqdialogs.cc:1243 #, c-format msgid " Local charset : %s " msgstr " Lokalne kodowanie : %s " #: src/icqdialogs.cc:1246 #, c-format msgid " For protocols : %s" msgstr " Dla protokołów: %s" #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Lista kontaktów " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " UporzÄ…dkuj kontakty w grupy: %s" #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " UporzÄ…dkuj kontakty w grupy: %s" #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Ukrywanie nieobecnych użytkowników: %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anty-spam: odrzucaj wiadomoÅ›ci od użytkowników spoza listy: %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Wymagana autoryzacja: %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Cytuj wiadomość w odpowiedzi: %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Sprawdzaj lokalnÄ… pocztÄ™: %s" #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " PamiÄ™taj hasÅ‚a: %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Zmieniaj powód nieobecnoÅ›ci przy zmianie statusu: %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Tryb chat dla: %s " #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " Enter wysyÅ‚a wiadomość w: %s" #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Tryb chat dla: %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " Enter wysyÅ‚a wiadomość w: %s " #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr " Kontakty inne niż IM zawsze online dla : %s" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " UporzÄ…dkuj kontakty w grupy: %s" #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Komunikacja " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " Serwer poczty SMTP: %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " Serwer proxy HTTP: %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " Serwer proxy HTTP: %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr " Proxy dla HTTP (rss i lj): %s " #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Włącz komunikacjÄ™ jeden-do-jednego: %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " Zakres portów do używania w komunikacji jeden-do-jednego: %s " #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " Logowanie " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " Data/czas w oknie logowania: %s " #: src/icqdialogs.cc:1301 #, fuzzy, c-format msgid " Timestamps include seconds : %s " msgstr " Data/czas w oknie logowania: %s " #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " Pokazywanie zmiany statusu w oknie logowania: %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Szczegółowe logi zdarzeÅ„ IM w ~/.centerim/log: %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Automatyczne oznaczanie 'Nieobecny' po (min): %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Automatyczne oznaczanie 'NiedostÄ™pny' po (min): %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Automatyczne oznaczanie 'NiedostÄ™pny' po (min): %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Ulica: %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Automatyczne oznaczanie 'Nieobecny' (0 - wyłącz) po (min): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Automatyczne oznaczanie 'NiedostÄ™pny' (0 - wyłącz) po (min): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr " Serwer poczty SMTP: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "Zakres portów do używania w komunikacji jeden-do-jednego (min-max): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr " Serwer proxy HTTP: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "Kodowanie z którego zmieniać: " #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "Kodowanie na które zmieniać: " #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr " Serwer proxy HTTP: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Pusta proÅ›ba o autoryzacjÄ™" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Pobrano Twoje szczegóły" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "UporzÄ…dkuj grupy kontaktów" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "ZmieÅ„" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "UsuÅ„" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "W górÄ™" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "W dół" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Wybierz" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Grupy " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr " Nazwa grupy do utworzenia: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Nowa nazwa dla grupy: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Czy na pewno chcesz usunąć tÄ™ grupÄ™?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Status transferu pliku" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Przerwij" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr "Wiadomość od %s " #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr "Wiadomość do %s " #: src/icqdialogs.cc:1865 msgid "init" msgstr "inicjalizacja" #: src/icqdialogs.cc:1866 msgid "start" msgstr "start" #: src/icqdialogs.cc:1867 msgid "work" msgstr "praca" #: src/icqdialogs.cc:1868 msgid "done" msgstr "zakoÅ„czono" #: src/icqdialogs.cc:1869 msgid "err" msgstr "błąd" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "przerwij" #: src/icqdialogs.cc:1877 msgid " of " msgstr " z " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "Nie można usunąć aktywnego transferu" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "publiczny (widoczny dla wszystkich)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "prywatny" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "tylko dla przyjaciół" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr " ArtykuÅ‚ LiveJournal: atrybuty" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "Wykryj dźwiÄ™k" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "WyÅ›lij" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Przerwij" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " WyÅ›lij do dziennika: %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " Temat: %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " Zabezpieczenia: %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " Dziwne rzeczy " #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " Nastrój: %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(brak/wÅ‚asny)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " WÅ‚asny nastrój: %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " Muzyka: %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " ZdjÄ™cie: %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(domyÅ›lny)" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Wiek: %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " Wyłącz autoformatowanie: %s " #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " Wyłącz wysyÅ‚anie komentarzy emailem: %s " #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " ZabroÅ„ komentarzy: %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " Wpis z datÄ… wstecznÄ…: %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "Temat wpisu: " #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "Teraz gra: " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "Aktualny nastrój: " #: src/icqdialogs.cc:2094 #, fuzzy msgid "Tags for the entry: " msgstr "Wiadomość z serwera: " #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr "szybkie szukanie w liÅ›cie kontaktów" #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "Szybkie szukanie: wpisz by znaleźć, %s szukaj ponownie, Enter koÅ„czy" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 #, fuzzy msgid " Use no key" msgstr "Info o użytkowniku" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "wykonano zewnÄ™trznÄ… rÄ™cznÄ… komendÄ™ %s, zwrócony kod = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "wykonano zewnÄ™trznÄ… komendÄ™ %s, zwrócony kod = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Rozłączony" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Przyłączony" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Ukryty" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Chęć pogadania" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Nie przeszkadzać" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "ZajÄ™ty" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] NiedostÄ™pny" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "Nieobecny" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "Nie przeszkadzać" #: src/imlogger.cc:39 msgid "N/A" msgstr "NiedostÄ™pny" #: src/imlogger.cc:49 msgid "message" msgstr "wiadomość" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "autoryzacja" #: src/imlogger.cc:53 msgid "e-mail" msgstr "e-mail" #: src/imlogger.cc:54 msgid "notification" msgstr "powiadomienie" #: src/imlogger.cc:55 msgid "contacts" msgstr "kontakty" #: src/imlogger.cc:56 msgid "files" msgstr "pliki" #: src/imlogger.cc:57 msgid "event" msgstr "zdarzenie" #: src/imlogger.cc:79 msgid "events log started" msgstr "zaczÄ™to logowanie zdarzeÅ„" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "wychodzÄ…ce %s do %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "przychodzÄ…ce %s od %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "zignorowane" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s jest nieobecny" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "%s do %s, wysÅ‚ano %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: jest obecny ze statusem %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: jest nieobecny" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "zmieniÅ‚ siÄ™ nasz status %s na %s z %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " ZarzÄ…dca kont IM " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Adres serwera: %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " Zabezpieczenia: %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN: %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Login: %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " HasÅ‚o (opcjonalne): %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " HasÅ‚o: %s " #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr " Priorytet: %s " #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr " Importuj listÄ™ przyjaciół : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " HasÅ‚o do NickServ (opcjonalne): %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " UporzÄ…dkuj kontakty w grupy: %s" #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " UporzÄ…dkuj kontakty w grupy: %s" #: src/accountmanager.cc:150 msgid " Register " msgstr " Zarejestruj " #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " PÅ‚eć: %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " SÅ‚owa kluczowe: %s " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr "ZmieÅ„ ksywkÄ™ " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Aktualizuj szczegóły " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Ustaw powód nieobecnoÅ›ci " #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " UsuÅ„ " #: src/accountmanager.cc:200 msgid " user name: " msgstr " nazwa użytkownika: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " hasÅ‚o: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "UsuÅ„ najpierw informacje o koncie!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Musisz siÄ™ najpierw rozłączyć z serwisem!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " adres serwera: " #: src/accountmanager.cc:285 msgid " priority: " msgstr " priorytet: " #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " Zarejestruj na sieci %s " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Dalej" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " HasÅ‚o: %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Powtórz hasÅ‚o: %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Serwer: %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Powtórz wpisane hasÅ‚o: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Ustaw ksywkÄ™: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Serwer: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "HasÅ‚a nie sÄ… takie same" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Musisz podać hasÅ‚o" #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "HasÅ‚o musi mieć przynajmniej 6 znaków" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Przebieg rejestracji " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "ÅÄ…czenie z serwerem %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "WysyÅ‚anie żądania" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "UpÅ‚ynÄ…Å‚ czas oczekiwania na nowy UIN. Powtórzyć?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Powtarzanie..." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Otrzymano nowy UIN, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Rozłączono" #: src/imcontroller.cc:179 #, fuzzy msgid "Unable to connect to icq server. Retry?" msgstr "Połączenie z serwerem icq nie udaÅ‚o siÄ™. Powtórzyć?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "Próba zarejestrowania %s w %s..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "Jabber ID zostaÅ‚ poprawnie zarejestrowany" #: src/imcontroller.cc:228 msgid "Failed" msgstr "Nie udaÅ‚o siÄ™" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Musisz być zalogowany do sieci ICQ, żeby móc zaktualizować szczegóły" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "nowa przyjazna ksywka MSN: " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "Musisz być zalogowany do sieci MSN, żeby zaktualizować TwojÄ… ksywkÄ™" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "Musisz być zalogowany do sieci Jabber, żeby zaktualizować swoje dane" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "" "Musisz być zalogowany do sieci Gadu-Gadu, żeby zaktualizować swoje dane" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "rejestracja nie jest wspierana" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "NaprawdÄ™ podoba mi siÄ™ domyÅ›lny w %s powód nieobecnoÅ›ci %s %s " #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ uruchomiono komendÄ™ %s" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "błąd wysyÅ‚ania zdarzenia: za maÅ‚o parametrów" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "błąd wysyÅ‚ania zdarzenia: tylko UIN-y sÄ… pozwolone w protokole icq" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "błąd wysyÅ‚ania zdarzenia: nieznany typ IM" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "błąd wysyÅ‚ania zdarzenia: nieznany typ zdarzenia" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s do %s zostaÅ‚o zostawione w kolejce" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "błąd wysyÅ‚ania zdarzenia: nie można utworzyć katalogu dla kontaktu" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "podano nieznany znak statusu" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "nieznany typ IM" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "błąd zmiany statusu: " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Użycie: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "Opcje ogólne:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr " --ascii, -a używaj znaków ASCII do rysowania okienek" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b <Å›cieżka> ustaw bazowÄ… Å›cieżkÄ™" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B korzystaj z danego IP" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr " --no-xtitles, -T wyłącz tytuÅ‚y xterm" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr " --debug, -d włącza logowanie debug" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help pokaż pomoc" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v pokaż wersjÄ™ programu" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Opcje wysyÅ‚ania zdarzeÅ„:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr " -s, --send typ zdarzenia; może być msg, sms lub url" #: src/icqconf.cc:1694 #, fuzzy msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr " -S, --status zmieÅ„ status IM" #: src/icqconf.cc:1695 #, fuzzy msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto typ protokoÅ‚u; może być icq, yahoo, aim, irc, " "jabber lub lj" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr " -t, --to docelowy UIN lub nick (zależy od protokoÅ‚u)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" " -n, --number numer telefonu komórkowego do wysÅ‚ania zdarzenia " "(tylko sms)" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "ZgÅ‚aszanie problemów do http://bugzilla.centerim.org." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Pusta proÅ›ba o autoryzacjÄ™" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* ProÅ›ba o autoryzacjÄ™: " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* Autoryzacja: " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS: " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Kontakty: " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* Transfer plików" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "brak znacznika " #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Informacja" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " ZarzÄ…dca kont IM " #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Dla protokołów: %s" #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " nazwa użytkownika: " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "tak" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "nie" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "tak" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Konta.." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " Wszystkie protokoÅ‚y" #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Użycie: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " Wszystkie protokoÅ‚y" #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Konta.." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "tak" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "Lis" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " Serwis " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 #, fuzzy msgid "No Jabber" msgstr "NieprawidÅ‚owy Jabber ID" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "nieznany typ IM" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Mężczyzna" #: src/icqface.cc:53 msgid "Female" msgstr "Kobieta" #: src/icqface.cc:56 msgid "Not specified" msgstr "Niepodane" #: src/icqface.cc:61 msgid "Ok" msgstr "OK" #: src/icqface.cc:62 msgid "Next" msgstr "NastÄ™pne" #: src/icqface.cc:63 msgid "Fwd" msgstr "Przekazanie dalej" #: src/icqface.cc:64 msgid "Reply" msgstr "Odpowiedź" #: src/icqface.cc:65 msgid "Open" msgstr "Otwórz" #: src/icqface.cc:66 msgid "Accept" msgstr "Akceptuj" #: src/icqface.cc:67 msgid "Reject" msgstr "Odrzuć" #: src/icqface.cc:68 msgid "User info" msgstr "Info o użytkowniku" #: src/icqface.cc:70 msgid "Prev" msgstr "Poprzednie" #: src/icqface.cc:78 msgid "sound card" msgstr "karta dźwiÄ™kowa" #: src/icqface.cc:79 msgid "speaker" msgstr "gÅ‚oÅ›nik" #: src/icqface.cc:80 msgid "disable" msgstr "wyłączone" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "nie zmieniaj" #: src/icqface.cc:88 msgid "dark" msgstr "ciemny" #: src/icqface.cc:89 msgid "blue" msgstr "niebieski" #: src/icqface.cc:97 #, fuzzy msgid "protocol" msgstr " Wszystkie protokoÅ‚y" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "start" #: src/icqface.cc:118 msgid "mode 1" msgstr "Tryb 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "Tryb 2" #: src/icqface.cc:249 #, fuzzy, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr " centerim %s NIEWYSÅANYCH: %lu" #: src/icqface.cc:274 msgid "Send an URL" msgstr " WyÅ›lij URL" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " WyÅ›lij SMS" #: src/icqface.cc:276 msgid "Send contacts" msgstr "WyÅ›lij kontakty" #: src/icqface.cc:277 msgid " Request authorization" msgstr "ProÅ›ba o autoryzacjÄ™ od %lu" #: src/icqface.cc:278 msgid "Edit details" msgstr "Szczegóły " #: src/icqface.cc:279 msgid "Fetch away message" msgstr " Info o nieobecnoÅ›ci" #: src/icqface.cc:280 msgid "Add to list" msgstr " Dodaj do listy" #: src/icqface.cc:281 msgid "Rename contact" msgstr " ZmieÅ„ nazwÄ™" #: src/icqface.cc:282 msgid " Move to group.." msgstr " PrzenieÅ› do grupy.." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 msgid "Fetch version info" msgstr " Pobierz wersjÄ™ " #: src/icqface.cc:285 msgid " Send file(s)" msgstr " WyÅ›lij plik(i)" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " ZaproÅ› do konferencji.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " WyÅ›lij wiadomość enter" #: src/icqface.cc:294 msgid "Channel chat history" msgstr " Historia rozmowy" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " UsuÅ„ kanaÅ‚ del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Wejdź na kanaÅ‚" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Opuść kanaÅ‚" #: src/icqface.cc:298 msgid "List nicknames" msgstr "Wypisz ksywki" #: src/icqface.cc:301 msgid "UnBlock channel messages" msgstr " Odblokuj wiadomoÅ›ci z kanaÅ‚u" #: src/icqface.cc:303 msgid "Block channel messages" msgstr "Zablokuj wiadomoÅ›ci z kanaÅ‚u" #: src/icqface.cc:310 msgid "Send a message" msgstr "WyÅ›lij wiadomość" #: src/icqface.cc:312 msgid "Event history" msgstr "Historia zdarzeÅ„" #: src/icqface.cc:313 msgid "Remove user" msgstr "UsuÅ„" #: src/icqface.cc:314 msgid "User's details" msgstr "Szczegóły" #: src/icqface.cc:315 msgid "External actions.." msgstr " ZewnÄ™trzne akcje.." #: src/icqface.cc:318 msgid "Unset ignore user" msgstr " Nie ignoruj" #: src/icqface.cc:318 msgid "Ignore user" msgstr "Ignoruj użytkownika" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 msgid "Force check" msgstr "WymuÅ› sprawdzenie" #: src/icqface.cc:435 msgid "Change status" msgstr "ZmieÅ„ status" #: src/icqface.cc:436 msgid "Go to contact.." msgstr "Idź do kontaktu.." #: src/icqface.cc:437 msgid " Accounts.." msgstr " Konta.." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " Opcje konfiguracji centerim" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Monitorowanie transferów plików" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Znajdź/dodaj użytkownika" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " Wejdź na kanaÅ‚/konferencjÄ™" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " Podłącz strumieÅ„ RSS" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Edycja listy ignorowanych" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Edycja listy niewidzialnoÅ›ci" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Edycja listy widzialnoÅ›ci" #: src/icqface.cc:455 msgid "Show offline users" msgstr "Pokaż nieobecnych użytkowników" #: src/icqface.cc:457 msgid "Hide offline users" msgstr " Ukryj nieobecnych użytkowników" #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " UporzÄ…dkuj grupy kontaktów" #: src/icqface.cc:461 msgid " Mass group move.." msgstr " Masowe przenoszenie grupy.." #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Szczegóły" #: src/icqface.cc:905 msgid "Message" msgstr "Wiadomość" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Nowe szukanie" #: src/icqface.cc:924 msgid "Contact to add" msgstr "Kontakt do dodania" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Szukanie kontaktów.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Wyniki szukania [zakoÅ„czono]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Informacje o %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Ksywka" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "To jest Twoje konto LiveJournal. Użyj go do" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "wysyÅ‚ania nowych wpisów w Twoim dzienniku." #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "Lista użytkowników, którzy majÄ… CiÄ™ zapisanego jako ich przyjaciela:" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr "Ignoruj użytkownika" #: src/icqface.cc:1116 #, fuzzy msgid "not found" msgstr "brak znacznika " #: src/icqface.cc:1131 msgid "E-mail" msgstr "Email" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "Drugi email" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Stary email" #: src/icqface.cc:1134 msgid "Gender" msgstr "PÅ‚eć" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Data ur." #: src/icqface.cc:1136 msgid "Age" msgstr "Wiek" #: src/icqface.cc:1137 msgid "Languages" msgstr "JÄ™zyki" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Ostatni IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Ostatnio widziano" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Nigdy" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "dni" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "godziny" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "minuty" #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "sekundy" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "pliki" #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "WyÅ›lij kontakty" #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "autoryzacja" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Adres" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Lokalizacja" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "Kod" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefon" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Komórka" #: src/icqface.cc:1259 msgid "Timezone" msgstr "Strefa czasowa" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Strona domowa" #: src/icqface.cc:1300 msgid "Company" msgstr "Firma" #: src/icqface.cc:1301 msgid "Department" msgstr "DziaÅ‚" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "TytuÅ‚" #: src/icqface.cc:1346 msgid "Interests" msgstr "Zainteresowania" #: src/icqface.cc:1358 msgid "Background" msgstr "TÅ‚o/PrzeszÅ‚ość" #: src/icqface.cc:1376 msgid "Handle" msgstr "Uchwyt" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "Dokumentacja RSS" #: src/icqface.cc:1378 msgid "Version" msgstr "Wersja" #: src/icqface.cc:1379 msgid "Encoding" msgstr "Kodowanie" #: src/icqface.cc:1382 msgid "Link" msgstr "ÅÄ…cze" #: src/icqface.cc:1384 msgid "Frequency" msgstr "CzÄ™stość" #: src/icqface.cc:1385 msgid "Last check" msgstr "Ostatnio sprawdzono" #: src/icqface.cc:1386 msgid "Next check" msgstr "NastÄ™pne sprawdzenie" #: src/icqface.cc:1387 msgid "Last result" msgstr "Ostatni wynik" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu min" #: src/icqface.cc:1404 msgid "Now" msgstr "Teraz" #: src/icqface.cc:1423 msgid "Full name" msgstr "ImiÄ™ i nazwisko" #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "%s do URL-i, %s zewnÄ™trzne programy, %s zamknij" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "Info o użytkowniku %s" #: src/icqface.cc:1456 msgid "Check" msgstr "Sprawdź" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Edycja" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "ÅšciÄ…gnij" #: src/icqface.cc:1466 msgid "Friend of" msgstr "Przyjaciel (czyj)" #: src/icqface.cc:1472 msgid "Home" msgstr "Dom" #: src/icqface.cc:1472 msgid "Work" msgstr "Praca" #: src/icqface.cc:1472 msgid "More" msgstr "WiÄ™cej" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "ÅšciÄ…gnij" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] sieć ICQ" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] MS Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr " [gg] Gadu-Gadu" #: src/icqface.cc:1622 msgid " All protocols" msgstr " Wszystkie protokoÅ‚y" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr "Już zarejestrowany" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " lub potwierdza, anuluje " #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " potwierdza, anuluje " #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "PrzenieÅ› do kontaktów" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Lista ignorowanych" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Lista widocznoÅ›ci" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Lista niewidocznoÅ›ci" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Wybierz kontakty, które chcesz dodać do listy" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "UsuÅ„ %d kontaktów z listy kontaktów?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Odbiorcy" #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "Szybkie szukanie: wpisz by znaleźć, %s szukaj ponownie, Enter koÅ„czy" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr "szybkie szukanie w liÅ›cie kontaktów" #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ bieżący kontekst nie zawiera URL-i" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URL-e w bieżącym kontekÅ›cie" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr " + brak zdefiniowanych akcji zewnÄ™trznych dla %s" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "Rezultat zewnÄ™trznej akcji %s:" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "%s wyÅ›lij, %s do wielu, %s historia, %s URL-e, %s powiÄ™ksz, %s czÅ‚onkowie, " "%s zamknij " #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "%s wyÅ›lij, %s do wielu, %s historia, %s URL-e, %s powiÄ™ksz, %s szczegóły, %s " "zamknij" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr "Wiadomość do %s " #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "WyÅ›lij kontakty.." #: src/icqface.cc:2670 msgid "file name: " msgstr "nazwa pliku: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "%s wychodzÄ…ce do %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "WysÅ‚ane %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "%s przychodzÄ…ce od %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Otrzymane %s" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "%s do URL-i, %s peÅ‚ny ekran, %s zamknij" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s od %s, otrzymano %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s do %s, wysÅ‚ano %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "widok na caÅ‚y ekran" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "%s lub %s zamykaj, Góra/Dół i PgUp/PgDn przewijaj" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "Historia dla %s, %d zdarzeÅ„" #: src/icqface.cc:3339 #, fuzzy, c-format msgid "%s search, %s again, %s cancel" msgstr "%s szukaj, %s ponownie, %s anuluj" #: src/icqface.cc:3348 msgid "search for: " msgstr "wyszukiwanie dla:" #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] system: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] e-mail od %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s jest obecny ze statusem %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s zmieniÅ‚ status na %s z %s" #~ msgid " [o] Online" #~ msgstr " [o] Obecny" #~ msgid " [_] Offline" #~ msgstr " [_] Rozłączony" #~ msgid " [a] Away" #~ msgstr " [a] Nieobecny" #~ msgid " [c] Occupied" #~ msgstr " [c] ZajÄ™ty" #~ msgid " [f] Free for chat" #~ msgstr " [f] Chęć pogadania" #~ msgid " [i] Invisible" #~ msgstr " [i] Niewidoczny" centerim-4.22.10/po/uk.gmo0000644000175000001440000005351011473011460012145 00000000000000Þ•:ì £¼H IWk“ › §²6Ã#ú*)Is„š¸Öå 9 EO`o~0Ÿ ÐÚ á ï)ý '2:M] o }‡ª±ÁÖæ ÷ & 7 C MX h v‘ ¨µÅ åð" 5B \j ’Ÿµ »ÆÜó % , > N j y Œ — « ¹ Å × Þ +ë 1!0I!"z!"!À!Ð!á!"0!"R"n"…" "'¶"Þ"ó"#'+#*S#~#$‘#¶#Ð# ã# $$$$%$)$1$5$;$?$&_$†$ Š$«$Ë$ Ð$ Û$å$î$ÿ$ % %1%8%@% H%R%r%v% z% …%’% š%§%#¬%Ð%Ù%à%é%#î%&1&B&F&L&P&W& m& z&ˆ&Œ&“&›&¤&Ä&É& Ò&7Ý&9'O' j'v'Š'' ¤' ®'¸'Ç'Ë'Ï' Ó'Ý' å' ñ'û'( ( ((()(.(?(C( H(i(p(v(Œ(¥( ¼(Ç(Ì(Õ( ç( ò()) ))) ) ')5)<)A)Y)k) „))¦)¬) ´)¿)Î)Õ)Ü)ã)é) ò)ý)* *#*!**"L*"o*’*—* §*²*¶*¿*Ç*$Ø*'ý*%+.+4+:+>+ ^+4k+ +)¥+;Ï+ ,*, 3,>, T, a,o, t, , Ž,›, ,#¦, Ê,Ô,Ù, á,î,*õ,< -$]-'‚-ª- ½-È-á-é-ý-. . ..%.).,.1. C.N.U. s.€. .›.£.¹.Â."Ò.õ./+/ D1e1x1‹1ž1§1 »1&É1jð1C[2TŸ2Vô2$K3p3&„3'«3Ó3å3;4A4a4s4†4•4­4Ç4Û4Hï485O5#d5#ˆ5]¬5 6 6$'6$L6 q66‘6 ¤67±6é6&ø6)7I7Y7 q7~7 77%°7Ö7å7ô78868E8Y8x8Ž8F¢8 é8 91!9#S9w9.’9Á9Õ96è9:/:C: I:$T:9y:9³:5í:#;'2;$Z;/;¯;¾; ×;â; ö;<<3<!:<2\<]<^í<UL=-¢=Ð=é=*>,.>7[>-“>(Á>0ê>'?0C?t?5?0Æ?0÷?w(@3 @Ô@+ò@+A(JA sA}AŽA•A ¦A ³AÀAÇAÐA#×A+ûA'Bn.BrBC C-C BCOC^C mC<zC ·CÄCÕCæC1ùC+DCD JDWDfDoD ƒDSD0äDEE;E2PEAƒEÅEÚE ãEîE õEIF LFVFsF †F‘F¢F1¶FèFïF!G^"GNG8ÐG# H-HGHPHoH€H#“H·H¾HÅHÌHÕHçHúH II'I.I5INIhI{I–I«I)³I ÝI çI/ôI $J7EJ}J“J œJ2©JÜJëJÿJKKK5K8KLK bKpK7K¹K"ÓKöK)L/L>LOL^LrL…L–L±LÆL×LðL0÷L(MBM_QM_±MCNUN!hNŠN N§N ¶NÁNAÐNTOgO OŒO’OA–OØOIøO BPJOPnšPE Q OQ\Q4|Q±QÏQæQ öQR-5RcRtR3…R¹R ÌR×RéRûR[Sr^SZÑST,TTŸT/³TãTúTU -U :UGUaU}UƒUˆU‘U«UºU4ËU VV+VEV*TVV2›V2ÎV?WAW\‰IwÌèØlsu9kÇYy™tÛ&'ù„,$Á´óë]’q¸ÓË-n»4>3/1[Sc6­*Œ·.*ÈvÒVïz€âÜ0—ÄÊÝaÕû&äÚEK¿H×M<,:²‹°pãÎ8ß ¥-–NBåÐüˆƒôç!7?7xhøÔ+4FU…³#C ”.Þ #oŸ=÷_J ñW; ©36ò"¦¹jO£2“/)ÙÅ›{" 1êÃÉ(%+骆0XÍA§ ¢b:(¾@Q5dºGLýö¯õá ¬Z Æ5æ|ÀDrR‚ `à'¼ú%8íPTœÑ^‘gÿÏ}þžµ92ލ eÖ ½¤ ˜ð)šf•Šm‡!$¡~¶ìi± %s: details 1st language : %s 2nd language : %s 3rd language : %s About Accounts.. Age : %s Age range : %s Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Birthdate : %s Cellular phone : %s Change color scheme to : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Check the local mailbox : %s Check the password : %s City : %s Comment Communications Company : %s Contact list Country : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Fax : %s Files Find/add user(s) Find/add users First name : %s Gender : %s General Groups Hide offline users : %s Home Homepage : %s IM account manager Language : %s Last name : %s Location Login : %s Miscellaneous More Move to group.. Name : %s Network Nickname Nickname : %s Online only Password Password : %s Password to set : %s Phone : %s Position : %s Quote a message on reply : %s Register Registration progress Remember passwords : %s SMTP server : %s Send an SMS Send file(s) to %s, %lu Server : %s Server to use : %s Set away message State : %s Street address : %s UIN UIN : %s Update user details View/edit ignore list View/edit invisible list View/edit visible list Work Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [icq] ICQ network [irc] IRC [msn] M$ Messenger [yahoo] YAIM password: server address: uin: user name: ! another running copy of centerim detected! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! this may cause problems. pid %lu%s to %s has been put to the queue%s went offline%s: went offline%s: went online, with status %s+ %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [icq] disconnected+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] unable to connect to the server+ cannot fetch away messages being offline+ last msg from %s+ no URLs within the current context+ no history items for %s+ the user is back+ user %s is already on the list2nd e-mail60-aboveAboutAcceptAddAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuto Away period (0 - disable): Auto N/A period (0 - disable): AwayBackgroundBirthdateCellularCellular phone: ChangeChannel: Check the password you entered: City: CommentCompanyCompany: Connecting to the server %s ...DNDDecDepartmentDepartment: DetailsDisconnectedDoneDrop the account information first!E-Mail: E-mailE-mail: EditEmpty authorization request messageEnter birthdate (DD-MM-YYYY): Event recipientsFaxFax: FebFemaleFetching your detailsFirst name: Free for chatFwdGenderGeneralGo aheadHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listJanJulJunLanguagesLast IPLast name: Last seenLocationMaleMarMayMessageMobile number: MoreMove to contactsN/ANameName for a group to be created: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New searchNextNicknameNickname to set: Nickname: Not specifiedNovOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %s to %sPassword must be enteredPassword: Passwords do not matchPhonePhone: Position: Received on %sRejectRemoveRenameReplyRetrieveRetrying..SMSSMTP server hostname: Search/AddSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSendSending requestSent on %sSepServer: State: Street address: The user has no profile information.Timed out waiting for a new uin. Retry?TimezoneTitleUIN: URLURLs within the current contextVisible listWait a moment. Your details haven't been fetched yetWorkYou have to disconnect the service first!You must be logged to the ICQ network to update the detailsYour details have been fetchedZip codeZip code: aim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecLearchanged our %s status to %s from %scomment: darkdisabledon't changee-mailevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedfilename: icq disconnection reasonignoredincoming %s from %smessagemode 1mode 2move Downmove Upn/anononeoutgoing %s to %spassword: rEmoveregistration is not supportedsearch for: socket problemssound cardspeakerstatus change error: turboingunknown IM typeunknown status character was givenusername and password mismatchyesProject-Id-Version: centerim 4.7.2 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2002-06-12 12:15+0300 Last-Translator: Cawko Xakep Language-Team: Ukrainian Language: uk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ %s Мова N1 : %s Мова N2 : %s Мова N3 : %s Про Ðккаунти.. Вік : %s Вікова ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ñ–Ñ : %s Відкидати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ тих, хто не в контакт-лиÑті : %s ВпрорÑдковувати контакти в групи: %s Змінювати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° 'Відійшов' через %d хвилин Змінювати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° 'ÐедocÑжний' через %d хвилин Дата Ð½Ð°Ñ€Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ : %s Мобіла : %s Палітра кольорів : %s Звуковий приÑтрій : %s Канал : %s Режим балачки: %s ПеревірÑти поштову Ñкриньку : %s Пароль ще раз : %s МіÑто : %s Коментар Мережа ÐšÐ¾Ð¼Ð¿Ð°Ð½Ñ–Ñ : %s Контакт-ліÑÑ‚ Країна : %s Відділ : %s Детальний протокол подій в ~/.centerim/log : %s Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð’Ñ–Ð´ÐºÐ¸Ð½ÑƒÑ‚Ð¸ ÐдреÑа ел.пошти : %s ÐдреÑа ел.пошти : %s Редагувати Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ зміні ÑтатуÑу : %s Ð¤Ð°ÐºÑ : %s Файли Пошук кориÑтувачів Пошук кориÑтувачів Iм'Ñ : %s Стать : %s Загальне Групи Ðе показувати відключених : %s ÐдреÑа Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка : %s РозпорÑдник акаунтів Мова : %s Прізвище : %s МіÑце Логін : %s Різне ІнтереÑи ПеренеÑти до групи.. Ім'Ñ : %s Мережа Кличка Кличкa : %s Лише підключені Пароль Пароль : %s Ðовий пароль : %s Телефон : %s ПоÑада : %s Цитувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñƒ відповіді : %s ЗареєÑтруватиÑÑ Ð ÐµÑ”ÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð—Ð°Ð¿Ð°Ð¼'Ñтовувати паролі : %s Поштовий Ñервер: %s ÐадіÑлати СМС ВідіÑлати файли Ð´Ð»Ñ %s, %lu Сервер : %s Сервер: %s ÐадіÑлати Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¨Ñ‚Ð°Ñ‚ : %s ÐдреÑа : %s UIN UIN : %s Поновити Ваше інфо Редагувати ÑпиÑок Ñ–Ð³Ð½Ð¾Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок невидимоÑті Редагувати ÑпиÑок видимоÑті Робота %s Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ð²Ð°Ñ ÐŸÐ¾ÑˆÑ‚Ð¾Ð²Ð¸Ð¹ Ñ–Ð½Ð´ÐµÐºÑ : %s [^X зберегти, Esc ÑкаÑувати] [aim] AOL TOC [icq] Мережа ICQ [irc] IRC [msn] M$ Messenger [yahoo] YAIM пароль: адреÑа Ñерверу: uin: ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: ! Вже одна ÐºÐ¾Ð¿Ñ–Ñ centerim працює! на диÑку менше 10К вільного проÑтору, відключємоÑÑ! інакше можна втратити конфігурацію та облік подій! це може призвеÑти до проблем. номер процеÑу %lu%s до %s поÑтавлено в чергу%s від'єднавÑÑ%s: від'єднавÑÑ%s: під'єднавÑÑ, ÑÑ‚Ð°Ñ‚ÑƒÑ %s+ %s додано у контакт-ліÑÑ‚+ [%02d:%02d:%02d] нова пошта! %d лиÑтів+ [%s] авто зміна ÑтатуÑу: %s+ [%s] ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾+ [aim] невдале під'єднаннÑ: %s+ [aim] пароль відіÑлано+ [aim] не можу законектитиÑÑ+ [icq] від'єднано+ [icq] збій відÑÐ¸Ð»Ð°Ð½Ð½Ñ SMS до %s, %s+ [irc] невдале під'єднаннÑ: %s+ [irc] не можу законектитиÑÑ+ не можу витÑгти автоповідомленнÑ, коли не підключені до Ñерверу+ оÑтаннє Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s+ немає поÑилань+ Ñ–ÑÑ‚Ð¾Ñ€Ñ–Ñ Ð·Ð°Ð¼Ð¾Ð²Ñ‡ÑƒÑ” про %s+ кориÑтувач повернувÑÑ+ %s вже у контакт-ліÑтіE-mail #260 та даліПроПрийнÑтиДодатиÐдреÑаВікВік: КвіСправді видалити %s?Справді видалити групу?СерПеріод автоматичної зміни ÑтатуÑу на 'Відійшов' (0 - Ñкинути): Період автоматичної зміни ÑтатуÑу на 'ÐедоÑÑжний' (0 - Ñкинути): ВідійшoвМинулеÐародженнÑМобілаМобіла: ЗмінитиКанал: Введіть вдруге той Ñамий пароль: МіÑто: КоментарКомпаніÑКомпаніÑ: КонектимоÑÑ Ð´Ð¾ Ñерверу %s ...Ðе турбуватиГруВідділВідділ: ІнфоВід'єднаноГараздСпочатку треба Ñкинути інформацію про акаунтÐдреÑа електронної пошти: E-mailÐдреÑа ел.пошти: РедагуватиПорожній запит авторизаціїДата Вашого Ð½Ð°Ñ€Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ (дд-мм-рррр): ОтримувачіФакÑФакÑ: Ð›ÑŽÑ‚Ð–Ñ–Ð½Ð¾Ñ‡Ð°ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð’Ð°ÑˆÐ¾Ñ— інформації кориÑтувачаІм'Ñ: Xoчу попатÑкати!ПереÑлатиСтатьЗагальнеЙдіть гетьІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð· %s, вÑього подій: %dÐ”Ñ–Ð¼Ð¡Ñ‚Ð¾Ñ€Ñ–Ð½ÐºÐ°Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка: Мені подобаєтьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð²Ðµ %s Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ %s %s.Мені подобаєтьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¸Ð¹ AIM-профіль centerim %s.Ігнорувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s?СпиÑок ігноруваннÑВхідне %s від %sÐ†Ð½Ñ„Ð¾Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ %sІнтереÑиÐевидимийСпиÑок невидимоÑтіСічЛипЧерМовиОÑÑ‚Ð°Ð½Ð½Ñ IPПрізвище: ВоÑтаннєМіÑцеЧоловічаБерТраПовідомленнÑÐомер мобіли: ДодатковоВ контакт-ліÑÑ‚ÐедоÑÑжнийІм'ÑÐазва Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— групи: Ім'Ñ: ÐіколиОтримано новий номер UIN, %luÐова назва групи: Показувати під такою Кличкою: Ðовий пошукДаліКличкаЗареєÑтруватиÑÑ Ð· кличкою: Кличка: Ðе вказаноЛиÑЗайнÑтийЖовВідключенийOKСтаре милоÐа каналах: Ð’ ефіріВідкритиВпорÑдкувати контакти в групиВихідне %s до %sСлід ввеÑти парольПароль: Паролі не Ñпівпадають!ТелефонТелефон: ПоÑада: Отримано %sВідкинутиВидалитиПереіменуватиВідповіÑтиПоновитиÐова Ñпроба...СМСÐдреÑа поштового Ñерверу: Шукати/додатиВибратиВиберіть групу, в Ñку треба переміÑтити кориÑтувачаВиберіть групу, в Ñку треба переміÑтити кориÑтувачаВиберіть контакти щоби додати в ліÑтВідіÑлатиÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚ÑƒÐ’Ñ–Ð´Ñ–Ñлано %sВерСервер: Штат: ÐдреÑа: Ðа цього кориÑтувача немає профілю.Помилка Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації. Спробувати ще?ЧаÑовий поÑÑПоÑадаUIN: URLПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² поточному повідомленніСпиÑок видимоÑтіЗачекайте... Ваше інфо вÑе ще не отриманоРоботаСпочатку треба від'єднатиÑÑ Ð²Ñ–Ð´ ÑервіÑу!Треба бути під'єднаним до мережі ICQ щоби поновити інформаціюОтримано вашу інформацію кориÑтувачаІндекÑПоштовий індекÑ: збій під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ мережі aimÑк запитувалоÑÑавторизаціÑвідійшoвавтоповідомленнÑневірний парольневірне ім'Ñ ÐºÐ¾Ñ€Ð¸ÑтувачаблакитнаочиÑтитизмінено наш %s ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° %s з %sкоментар: темнабез звукубез зміниe-mailпомилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: недоÑтатньо параметрівпомилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: в icq-протоколі дозволÑютьÑÑ Ð»Ð¸ÑˆÐµ UIN'ипомилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: невідомий тип програмипомилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: невідомий тип подіїпочато протоколÑкий файл: причина від'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ icqігноруєтьÑÑвхідне %s від %sповідомленнÑрежим 1режим 2поÑунути внизпоÑунути вгорун/днінемавихідне %s до %sпароль: ВидалитиреєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð½Ðµ підтримуєтьÑÑшукати:проблеми socket'івзвукова картадинамікпомилка зміни ÑтатуÑу: зачаÑті Ñпробиневідомий тип комунікатораневідомий ÑтатуÑний Ñимволневірні пароль та ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувачатакcenterim-4.22.10/po/Makefile.in.in0000644000175000001440000003170711473011430013475 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2005 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.14.4 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ localedir = $(datadir)/locale gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @MKINSTALLDIRS@ mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-@USE_NLS@ all-yes: stamp-po all-no: # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkinstalldirs) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkinstalldirs) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkinstalldirs) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkinstalldirs) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ $(SHELL) ./config.status force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/po/pl.gmo0000644000175000001440000012552611473011460012150 00000000000000Þ•„mì( 6K¡66í61$75V7-Œ7/º78ê7G#8=k8H©8 ò899(9<9*\9‡9 9 ›9¦9·9Æ9'Þ96:#=:a:*:)ª:Ô:ë:ü:;0;B;Y;w;†;¡;!¿;á;< <&< =<G<X<g<v<…<˜<0ª< Û<å<)=.=G= N= \=)j=-”=+Â=)î=">;>!Z> |> Š>•>§>¿>Ç>Ú>ê>ü> ? ?(?1?J?d?k?{??ª?½? Õ?ã?"ü?"@ B@M@]@m@~@@Ÿ@!²@Ô@ é@ ô@ þ@ A'A:A JAVA]A nA {A ‡A ”A žA©A ¹A.ÇA öABB *B5BPB`B wB„B“B)™BÃBÓBêB'úB"CBCVC oCzC—C±CÉCàCúCD0DGDZDnD€D‘D D°D ÐD ÝDëD EE (E2E'EE mEzEE ŸE#ÀEäE êEõE FF:FQFkFƒFŠF F²FÂFÞFíFýF G G)G;G OG]G bG nGzGŒG “G+ G2ÌG1ÿG01H+bH"ŽH ±H½HØHóH I%I8I GISI2dI"—IºI)ÏI*ùI$J4JEJ eJ oJ}JJ «J¹JÉJÒJ0òJ#K?KVKqK'‡K¯KÈKáK&øK"LBLYLnL‡L¤L)¿LéL'ÿL'M8M#MM'qM'™MÁMàM÷MN/NGN']N6…N¼N0ØN1 O ;O\O4wO6¬O"ãOP##PGP*fP‘P ¤PÅP$åP$ Q/Q,IQvQ‰Q ¢QÃQ áQ îQ ùQ RRR $R.R4R;R ?RKRSRWR]RaR&R¨R¬R µRÖRöRS S $S /S9SPS1WS ‰S”SS®S µSÃSØS ñS"ûS T?TETWT pT‘T˜T  T«T ³T½TÝT ìT UU0UGUKU OU pU {U ˆU–U žU «U¸U#½UáUêUñUúU ÿU# V0V9V XVfVwVV¢V©V­V³V·V¾VÑVäVúV W W (W 6W @W JWTWXW^WeW mWzW‹W”W¤WÁWÈWÛWûWX X7X9LX†X ¡X ­X¹XÍXÒX çX ñXûX Y!Y %Y1Y5Y 9YDY]Y `YjY rY }Y ‰Y •YŸY¤Y«YºY¿YÈYÍYÑYïYóYûYZ%Z*Z;Z?Z DZ eZrZyZZ•Z®ZÅZÔZ çZòZ ÷Z[ [ [ ([6[:[>[G[K[S[ V[ a[o[v[{[“[&¥[&Ì[ó[ \\#.\R\X\`\ {\†\‹\\¢\±\¹\Ê\Ù\à\(ç\5] F]R]Y]h]!n]]™] ¢]­]µ]½]Á]Ø] î]ù] ^ ^(^!/^"Q^"t^—^¯^´^ Ã^ Ï^Ý^í^ ý^_ __(_0_A_)J_4t_G©_ñ_&`'/`JW`?¢`Hâ`%+a#QaIua¿a0Ýa.b-=b$kbCb\Ôb<1c+nc'šcÂcËcÑcÙcùcÿcd d)dBdTdfd ndxd‡d d4œdÑdÖd%çd) eB7e;ze?¶eAöe8fWf `fkfqf‹f ¡f ®f¼f Áf Îf Ûfèfífôfúf# g -g7gPgYgqgŒg›g g"¥gÈg Ðg Ýgêgïgh hh=h*Rh<}h$ºh'ßhi-i4Hi }i ‰i”i ši§i¸i¾i×ißióiøiýi j( j5j=jAjHj OjYjajej}j€j …j’j!¤j Æj!Ñjójûjk k%kCkakfk €k k—k §k²kºkÀkÖkÞkðkùk" l,l=l&\lƒl ˆl’l–lš©lEDn5Šn0Àn3ñn'%o1Mo2oY²oE pHRp›p­pÃpÖp#êp/q>qEq Nq Yqdqzq-ŽqC¼q!r"r2=r5pr¦r ÃrÑràr÷rss 9sFsZs0nsŸs¿s Õsâs ýs t t$t7tFt ]t6kt ¢t°t,Ðtýtu u *u86u3ou2£u+Öu#v!&v Hviv yvƒv"šv½vÅváv ýv w w ,w6w>w*Vww‡w›w#¯wÓwæwxx$1x'Vx~xx ¦x³xÂxÒxëxy&y ?y Ly Xy-dy’y ¯y¹y ÈyÒy èy õyzzz !z.z2=zpzxz–z©z²z Ìz Ùz æzôz{@ { J{X{s{ƒ{$£{È{Ü{ ô{||4|K|`|w|!|±|Ï|è|ý| }}/}"D} g}t}…}¡} µ}Â}Ë};è} $~ /~ ;~G~!b~„~ Š~”~­~&Æ~í~'CKe |†¤³Ã Ô ßíÿ €!€ %€ /€<€M€T€+j€?–€3Ö€B 9M'‡¯·Îî ‚!‚ 5‚ A‚M‚4^‚&“‚º‚0Ђ(ƒ*ƒ<ƒOƒ nƒzƒ‰ƒ™ƒ ´ƒÁƒÔƒ܃:ùƒ#4„X„(q„š„$²„ׄ#ï„….,…*[…%†…¬…)Á…-ë…(†B†\†$t†™†«†+Á†/í†%‡.C‡"r‡*•‡#À‡'ä‡ ˆ )ˆ@Jˆ+‹ˆC·ˆ6ûˆ"2‰'U‰;}‰G¹‰7Š9Š&TŠ'{ŠL£ŠðŠ ‹)'‹&Q‹1x‹ª‹.Á‹ð‹' Œ%1ŒWŒpŒ xŒ„ŒŒŒ”Œ œŒ ©Œ¶Œ»ŒÄŒÊŒÚŒàŒåŒìŒ ðŒ(:>=F@„(Å îøŽ!Ž*ŽIŽ'RŽ zŽ†Ž ŽšŽ ¡Ž¯ŽÁŽÜŽ åŽ&/Ne ˆ ’Ÿ¥­Ê#Ý  !.@&Dkr{ ‚Ž ž «#·Ûãéñ ø‘ "‘,‘J‘\‘e‘€‘•‘¥‘©‘¯‘³‘»‘Ñ‘ã‘ý‘’’/’ @’L’^’o’’…’Œ’ •’¢’±’·’Ê’ß’!æ’“%“ )“7“CG“<‹“È“ã“ö“ ” "”-”=”M”T”j”…”‰”˜”œ” ”²”єԔ Ü”ç” û” ••&• .• 8•F• O• [•g•5k•¡• ¥•±• ɕԕܕ ô•– –'–6–>–D–\– s– –– ¤– ²–¼–Ò–Ù–é– ò–ü–——— — — #—/— >—L—T—q—'†—(®—×—ì—õ—F˜V˜ ^˜%h˜Ž˜—˜ Ÿ˜ ­˜¸˜ǘؘ ö˜™ ™&™'8™`™f™m™ |™‡™ §™ ²™½™Ì™Ô™Ý™á™÷™šš2š DšRš5Zš3š/Äš+ôš ›(› <›I›Z›m› ‚›Ž›’›!››½›Ä›Ì›*Õ›Iœ?JœŠœ¡œ&»œQâœ94<n)«%ÕNûJž8hž3¡ž'Õž'ýž?%ŸdeŸLÊŸ, 5D z ‰  !— ¹ ¿ àÉ è ¡ $¡ 1¡;¡ O¡[¡b¡Cu¡¹¡¿¡&Ø¡-ÿ¡J-¢Jx¢GâH £T£n£r£x£ £"¢£Å£ Õ£ á£ë£ ¤ ¤ $¤.¤ 7¤A¤']¤ …¤‘¤§¤#°¤"Ô¤÷¤ ¥¥+¥ A¥ M¥ Z¥ g¥s¥¥–¥ ¥G§¥1ï¥F!¦,h¦3•¦ɦ5å¦>§ Z§ h§v§|§“§¨§°§ ˧×§ î§ ü§¨ ¨7¨ S¨_¨f¨m¨t¨|¨…¨‰¨¥¨©¨ ®¨¼¨Ѩë¨,ô¨!©#*©N© T©_©~©©'¤©Ì©Þ©ñ© ª ª'ª-ªEªLª5`ª–ª¦ªê,Úª+«3«9«B«F«êITBMÑ‘ò5Ýõ˜BRžÐdt›¤®}†{ŽŒÁXÕ|*ˆzwo‚k7‰NícrjÇšdÄS¿·³  u]l¹õV³%ʼ*h–«a‹zý¾nþÞÀ›{ƒ%¦$5ˆ[$Šä3+ Ý; ,å6Ÿtvº1½ûPq oBØZŠ ãúš|};­ëGML¥Y+&G9t ñ‰73^Ù#cð”¤=„ßJ»ÅG22lŒ4 ópV–5=ï ]îñW_ns8Eï‹îèxyKm¨x©ç#.y&=FKÎI—:k‡oã-4 íΜøD6’Cuȡý²h,ÍSëˆìÉ7´ü ÿ£Ön…q®'@hà#»˜ió¬Ë0_¥†EmêC(ÿ§’ƒ¨ÈàÁÛg ?ô‚ÆlÍþ-K*Y40é‡\'Õ·fƒ2çöÔÛZµ!ÐjO?-•,ÌCì¡‚d.i ö† ¯p ùËRf )À™:ûE‡ª¿¶a§æ‘UÂ6”3ÂrYÅ@:HÆi[‰ò<<AÓèÇVLÚuÒ%Aa×å¾ÜŒÏWw;­>—y~ù“>$Ø„+â°ž…U¯&D€÷Üq±HáäeSc1fwxµM{„` X1k€áý¢!R×¶újZ/}œJ€8.N¸©ªðQ¦Om“seWbIÙæ¼‹Êbe])²9Ã\´ÞUH9 AޱsŠ[T"~¬F'zÖ¢J¸âÑ<Ò¹gÉP?@`vÌ_T™ørß"Äé/°ºLp8/b|ÏF(Óv\…QOP ôü>)•Q!Ÿ÷DNg("£ÔX^^`Ú «0~ --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --debug, -d enables debug info logging --help display this stuff --no-xtitles, -T disable xterm titles --version, -v show the program version info -n, --number mobile number to send an event to (sms only) -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Accounts.. Age : %s Age range : %s All protocols Already logged in only Always online non-IM contacts for : %s Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Backdated entry : %s Birthdate : %s Cellular phone : %s Change color scheme to : %s Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Codepages conversion Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users First name : %s For protocols : %s Gender : %s General Groups HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Import friend list : %s Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Joined since the last check only Keywords Keywords : %s Language : %s Last name : %s Leave channel Link an RSS feed Link an RSS feed LiveJournal posting: attributes Local charset : %s Location Logging Login : %s Look for online only : %s Mass group move.. Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network Nickname Nickname : %s Online only Online/offline events in the log window : %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Priority : %s Proxy only for HTTP (rss and lj) : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remote charset : %s Remove channel del Request authorization SMTP server : %s Search parameters Search profiles Search service Secured : %s Security : %s Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Show users who have you on their list State : %s Street address : %s Subject : %s Switch to language preset : %s Timestamps in the log window : %s UIN UIN : %s Update user details User interface Users with photos only : %s View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM of password: priority: server address: uin: user name: ! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu%lu minutes%s from %s, received on %s%s has been deopped by %s.%s has been kicked by %s%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s or %s to close, Up/Down and PgUp/PgDn to scroll%s to %s has been put to the queue%s to %s, sent on %s%s to URLs, %s external actions, %s close%s to URLs, %s to full-screenize, %s close%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [gg] cannot resolve %s+ [gg] connection failed+ [gg] connection lost+ [gg] connection to the server failed+ [gg] no away message from %s, %s+ [icq] cannot connect+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ [yahoo] server closed socket+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ new mail arrived, %d messages+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAdd to listAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateBlock channel messagesCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChange statusChannel chat historyChannel topic now is: %sChannel: Charset to convert messages from: Charset to convert messages to: CheckCheck frequency: Check the new password: Check the password you entered: City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DNDDecDefault Jabber conference serverDepartmentDepartment: Description: DetailsDetect musicDisconnectedDoneDrop the account information first!E-Mail: E-mailE-mail: EditEdit detailsEmpty authorization request messageEncodingEnter birthdate (DD-MM-YYYY): Event historyEvent recipientsEvents sending options:External actions..FailedFaxFax: FebFemaleFetch away messageFetch version infoFetching your detailsFile transfer statusFirst name: Force checkFree for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadGo to contact..HTTP proxy server hostname: HandleHide offline usersHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIgnore userIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLinkLink: List nicknamesLoadLocationMaleMarMass move selected users to..MayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: Not specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %s to %sPING reply from the user: %d second(s)Password must be at least 6 chars longPassword must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: Please join my conference.Position: PostPosting subject: PrevPublished on: RSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?Remove userRenameRename contactReplyResult of the external action %s:RetreiveRetrieveRetrying..RomanceRussianSMSSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSelect contacts to moveSendSend a messageSend an URLSend contactsSend contacts..Sending requestSent on %sSepServer: Show offline usersState: Street address: StudentsThe Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesThis is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnBlock channel messagesUnable to connectUnset ignore userUsage: User infoUser's detailsVersionVisible listWait a moment. Your details haven't been fetched yetWorkWrong Jabber ID!Wrong nickname given, cannot registerYou have to disconnect the service first!You must be logged to the Gadu-Gadu network to update your detailsYou must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: abortadding %s to the contactsaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: connecting to the servercontactscould not create socketcould not resolve hostnamecouldn't fetchdarkdaysdirectory to save the file(s) to: disabledisconnecteddon't changedonedual login detectede-mailerreventevent sending error: error creating directory for the contactevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfriends onlyfull-screen viewhoursicq disconnection reasonignoredincoming %s from %sinitlInklOadlogged inmembers list fetching finished, %d foundmessageminmode 1mode 2move Downmove Upn/anew MSN friendly nick: nononenotificationoutgoing %s to %spassword was changed successfullypassword: post new entries to your journal.privatepublic (visible to all)rEmovereason: %sregistration is not supportedremoving %s from the contactssAvesearch finished, %d foundsearch for: set by %ssocket problemssound cardspeakerstartstatus change error: successthe message was: turboingunknown IM typeunknown status character was givenuser info for %susername and password mismatchverify the pager host and port enteredworkwrong XMLyesyou are an op hereProject-Id-Version: centerim 4.13.0 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2004-12-29 20:48+0100 Last-Translator: Piotr KUCHARSKI Language-Team: Polish Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --ascii, -a używaj znaków ASCII do rysowania okienek --basedir, -b <Å›cieżka> ustaw bazowÄ… Å›cieżkÄ™ --bind, -B korzystaj z danego IP --debug, -d włącza logowanie debug --help pokaż pomoc --no-xtitles, -T wyłącz tytuÅ‚y xterm --version, -v pokaż wersjÄ™ programu -n, --number numer telefonu komórkowego do wysÅ‚ania zdarzenia (tylko sms) -s, --send typ zdarzenia; może być msg, sms lub url -t, --to docelowy UIN lub nick (zależy od protokoÅ‚u) %s: szczegóły Pierwszy jÄ™zyk: %s Drugi jÄ™zyk: %s Trzeci jÄ™zyk: %s potwierdza, anuluje lub potwierdza, anuluje O... Konta.. Wiek: %s Wiek: %s Wszystkie protokoÅ‚yJuż zarejestrowany Kontakty inne niż IM zawsze online dla : %s Anty-spam: odrzucaj wiadomoÅ›ci od użytkowników spoza listy: %s UporzÄ…dkuj kontakty w grupy: %s Wymagana autoryzacja: %s Automatyczne oznaczanie 'Nieobecny' po (min): %d Automatyczne oznaczanie 'NiedostÄ™pny' po (min): %d Wpis z datÄ… wstecznÄ…: %s Data ur.: %s Komórka: %s Schemat kolorów: %s ZmieÅ„ ksywkÄ™ ZmieÅ„ hasÅ‚o: %s UrzÄ…dzenie dźwiÄ™kowe: %s KanaÅ‚: %s Tryb chat dla: %s Tryb chat dla: %s CzÄ™stotliwość sprawdzania (w minutach): %lu Sprawdzaj lokalnÄ… pocztÄ™: %s Powtórz hasÅ‚o: %s Miasto: %s Konwersja stron kodowych Komentarz Komunikacja Firma : %s Lista kontaktów PaÅ„stwo: %s WÅ‚asny nastrój: %s DziaÅ‚ : %s Szczegółowe logi zdarzeÅ„ IM w ~/.centerim/log: %s Szczegóły Wyłącz autoformatowanie: %s Wyłącz wysyÅ‚anie komentarzy emailem: %s ZabroÅ„ komentarzy: %s UsuÅ„ Email: %s Email: %s Zmieniaj powód nieobecnoÅ›ci przy zmianie statusu: %s Włącz wsparcie dla jÄ™zyków dwukierunkowych: %s Włącz emacsowe skróty klawiszy w edytorze: %s Włącz komunikacjÄ™ jeden-do-jednego: %s Włącz znacznik stanu na WWW: %s Enter wysyÅ‚a wiadomość w: %s Enter wysyÅ‚a wiadomość w: %s Dziwne rzeczy Fax: %s Parametry strumienia Monitorowanie transferów plików Pliki Znajdź/dodaj użytkownika Znajdź/dodaj użytkownika ImiÄ™: %s Dla protokołów: %s PÅ‚eć: %s Ogólne Grupy Serwer proxy HTTP: %s Ukrywanie nieobecnych użytkowników: %s Dom Strona domowa: %s ZarzÄ…dca kont IM Importuj listÄ™ przyjaciół : %s Wiadomość od %s ZaproÅ› do konferencji.. Wejdź na kanaÅ‚ Wejdź na kanaÅ‚/konferencjÄ™ Wejdź/utwórz kanaÅ‚/konferencjÄ™ Dołączyli od ostatniego sprawdzenia SÅ‚owa kluczowe SÅ‚owa kluczowe: %s JÄ™zyk: %s Nazwisko: %s Opuść kanaÅ‚ Podłącz strumieÅ„ RSS Przyłącz strumieÅ„ RSS ArtykuÅ‚ LiveJournal: atrybuty Lokalne kodowanie : %s Lokalizacja Logowanie Login: %s Sprawdzaj tylko obecnych użytkowników: %s Masowe przenoszenie grupy.. Różne Nastrój: %s WiÄ™cej PrzenieÅ› do grupy.. Muzyka: %s Nazwa: %s Nazwa/TytuÅ‚ Sieć Ksywka Ksywka: %s Tylko obecni Pokazywanie zmiany statusu w oknie logowania: %s Opcje UporzÄ…dkuj grupy kontaktówWiadomość do %s HasÅ‚o HasÅ‚o (opcjonalne): %s HasÅ‚o: %s HasÅ‚o: %s Telefon: %s ZdjÄ™cie: %s Ping Zakres portów do używania w komunikacji jeden-do-jednego: %s Posada : %s WyÅ›lij do dziennika: %s Priorytet: %s Proxy dla HTTP (rss i lj): %s Cytuj wiadomość w odpowiedzi: %s Losowa grupa chat Losowa grupa chat: %s Zarejestruj Zarejestruj na sieci %s Parametry rejestracji Przebieg rejestracji Serwis rejestracji PamiÄ™taj hasÅ‚a: %s Zdalne kodowanie : %s UsuÅ„ kanaÅ‚ delProÅ›ba o autoryzacjÄ™ od %lu Serwer poczty SMTP: %s Parametry szukania Wyszukaj profile Szukanie Zabezpieczenia: %s Zabezpieczenia: %s WyÅ›lij wiadomość enter WyÅ›lij SMS WyÅ›lij plik(i) WyÅ›lij plik(i) do %s, %lu Adres serwera: %s Serwer: %s Serwis Ustaw powód nieobecnoÅ›ci Pokazuj użytkowników, którzy majÄ… CiÄ™ na ich liÅ›cie Stan: %s Ulica: %s Temat: %s Przełącz na jÄ™zyk: %s Data/czas w oknie logowania: %s UIN UIN: %s Aktualizuj szczegóły Interfejs użytkownika Użytkownicy tylko ze zdjÄ™ciami: %s Edycja listy ignorowanych Edycja listy niewidzialnoÅ›ci Edycja listy widzialnoÅ›ci Praca URL do eksportu XML: %s Twoje szczegóły %s Kod: %s [Ctrl-X zapisz, Esc anuluj] [aim] AOL TOC [gg] Gadu-Gadu [icq] sieć ICQ [irc] IRC [jab] Jabber [lj] LiveJournal [msn] MS Messenger [yahoo] YAIM z hasÅ‚o: priorytet: adres serwera: uin: nazwa użytkownika: ! inna kopia centerim jest już uruchomiona! nie można siÄ™ połączyć, mniej niż 10kB wolnego na dysku! wolne miejsce na dysku poniżej 10k, rozłączono! w przeciwnym wypadku można utracić wiadomoÅ›ci i konfiguracjÄ™! wsparcie dla %s zostaÅ‚o usuniÄ™te w trakcie kompilacji! może to powodować problemy. pid %lu%lu min%s od %s, otrzymano %s%s zostaÅ‚ zdeopowany przez %s.%s zostaÅ‚ wykopany przez %s%s dostaÅ‚ opa od %s.%s zabraÅ‚ nam opa.%s wszedÅ‚.%s wyszedÅ‚%s daÅ‚ nam opa.%s lub %s zamykaj, Góra/Dół i PgUp/PgDn przewijaj%s do %s zostaÅ‚o zostawione w kolejce%s do %s, wysÅ‚ano %s%s do URL-i, %s zewnÄ™trzne programy, %s zamknij%s do URL-i, %s peÅ‚ny ekran, %s zamknij%s jest nieobecny%s: jest nieobecny%s: jest obecny ze statusem %s(domyÅ›lny)(brak/wÅ‚asny)* Autoryzacja: * ProÅ›ba o autoryzacjÄ™: * Kontakty: * Transfer plików* SMS: + %s zostaÅ‚ dodany do listy+ [%02d:%02d:%02d] otrzymano nowÄ… pocztÄ™, %d wiadomoÅ›ci+ [%s] automatycznie oznacz jako %s+ [%s] status odtworzony+ [aim] połączenie siÄ™ nie udaÅ‚o: %s+ [aim] wysÅ‚ano hasÅ‚o+ [aim] brak połączenia z serwerem+ [gg] nieznany host %s+ [gg] połączenie nie udaÅ‚o siÄ™+ [gg] lista połączeÅ„+ [gg] połączenie z serwerem nie udaÅ‚o siÄ™+ [gg] brak powodu nieobecnoÅ›ci od %s, %s+ [icq] nie można siÄ™ połączyć: + [icq] rozłączono+ [icq] SMS nie zostaÅ‚ dostarczony do %s+ [icq] SMS nie zostaÅ‚ dostarczony do %s, %s+ [irc] połączenie siÄ™ nie udaÅ‚o: %s+ [irc] zmieniono ksywkÄ™+ [irc] wysÅ‚ano hasÅ‚o+ [irc] brak połączenia z serwerem+ [jab] błąd %d+ [jab] błąd %d: %s+ [jab] brak powodu nieobecnoÅ›ci od %s, %s+ [jab] nie można podłączyć siÄ™ do serwera+ [jab] wyrejestrowywanie z agenta %s+ [lj] %s zostaÅ‚ dodany do listy przyjaciół+ [lj] HTTP nie powiodÅ‚o siÄ™: %s+ [lj] nie można byÅ‚o dodać przyjaciela+ [lj] błąd kasowania przyjaciela+ [lj] logowanie nie powiodÅ‚o siÄ™: %s+ [lj] błąd wysyÅ‚ania: %s+ [lj] wysÅ‚ano poprawnie, id %s+ [lj] użytkownik zostaÅ‚ usuniÄ™ty z Twojej listy przyjaciół+ [lj] sprawdzenie użytkownika zakoÅ„czono+ [msn] zakoÅ„czono wypisywanie listy użytkowników, znaleziono %d + [msn] nieczytana poczta: %d w inbox, %d w folderach+ [yahoo] wykryto inne zalogowanie+ [yahoo] nie można siÄ™ połączyć: + [yahoo] nie można zalogować: konto zostaÅ‚o zablokowane+ [yahoo] nie można zalogować: błędna nazwa użytkownika lub hasÅ‚o+ [yahoo] bezpoÅ›rednie połączenie nie powiodÅ‚o siÄ™+ [yahoo] e-mail od %s, %s+ [yahoo] wychodzenie z konferencji %s+ [yahoo] serwer zamknÄ…Å‚ połączenie+ nie można pobrać powodów nieobecnoÅ›ci, jeÅ›li nie jesteÅ› podłączony+ ostatnia wiadomość od %s+ uruchomiono komendÄ™ %s+ otrzymano nowÄ… pocztÄ™, %d wiadomoÅ›ci+ bieżący kontekst nie zawiera URL-i + brak zdefiniowanych akcji zewnÄ™trznych dla %s+ brak historii dla %s+ konfiguracja %s zmieniÅ‚a siÄ™, odÅ›wieżono+ użytkownik powróciÅ‚+ w celu ponownej aktywacji odwiedź %s+ użytkownik %s jest już na liÅ›cie+ musisz być zalogowany20 coÅ›Drugi email30 coÅ›40 coÅ›50 plus60 i wiÄ™cejO...AkceptujDodaj Dodaj do listyAdresWiekWiek: KwiCzy na pewno chcesz usunąć %s?Czy na pewno chcesz usunąć tÄ™ grupÄ™?SieAutor: Automatyczne oznaczanie 'Nieobecny' (0 - wyłącz) po (min): Automatyczne oznaczanie 'NiedostÄ™pny' (0 - wyłącz) po (min): Automatycznie dołączono do konferencjiNieobecnyPowód nieobecnoÅ›ci:TÅ‚o/PrzeszÅ‚ośćData ur.Zablokuj wiadomoÅ›ci z kanaÅ‚uPrzerwijNie można usunąć aktywnego transferuKategoria: KomórkaKomórka: ZmieÅ„ZmieÅ„ status Historia rozmowyTemat kanaÅ‚u teraz to: %sKanaÅ‚: Kodowanie z którego zmieniać: Kodowanie na które zmieniać: SprawdźCzÄ™stotliwość sprawdzania: Powtórz nowe hasÅ‚o: Powtórz wpisane hasÅ‚o: Miasto: KomentarzKomentarze: FirmaFirma: ÅÄ…czenie z serwerem %s ...Kontakt do dodaniaBieżący czÅ‚onkowie konferencji: Aktualny nastrój: Teraz gra: Twój statusNie przeszkadzaćGruDomyÅ›lny serwer konferencyjny JabberaDziaÅ‚DziaÅ‚: Opis: SzczegółyWykryj dźwiÄ™kRozłączonoZakoÅ„czonoUsuÅ„ najpierw informacje o koncie!Email: EmailEmail: EdycjaSzczegóły Pusta proÅ›ba o autoryzacjÄ™KodowanieData urodzenia (DD-MM-YYYY): Historia zdarzeÅ„OdbiorcyOpcje wysyÅ‚ania zdarzeÅ„: ZewnÄ™trzne akcje..Nie udaÅ‚o siÄ™FaxFax: LutKobieta Info o nieobecnoÅ›ci Pobierz wersjÄ™ Pobieranie szczegółów Status transferu plikuImiÄ™: WymuÅ› sprawdzenieChęć pogadaniaCzÄ™stośćPrzyjaciel (czyj)ImiÄ™ i nazwiskoPrzekazanie dalejGryPÅ‚ećOgólny Chat ogólnyOpcje ogólne:DalejIdź do kontaktu.. Serwer proxy HTTP: Uchwyt Ukryj nieobecnych użytkownikówHistoria dla %s, %d zdarzeÅ„DomStrona domowaStrona domowa: NaprawdÄ™ podoba mi siÄ™ domyÅ›lny w %s powód nieobecnoÅ›ci %s %s NaprawdÄ™ podoba mi siÄ™ domyÅ›lny profil AIM w centerim %s.Ignorować wszystko od %s?Lista ignorowanychIgnoruj użytkownika%s przychodzÄ…ce od %sInformacjaInformacje o %sZainteresowaniaUkrytyLista niewidocznoÅ›ciZaproszenie do konferencjiStyWejdź/UtwórzLipCzeSÅ‚owa kluczowe: Wykopany przez %s z powodu: %sLJJÄ™zykiOstatni IPOstatnio sprawdzonoNazwisko: Ostatni wynikOstatnio widzianoÅÄ…czeÅÄ…cze: Wypisz ksywkiZaÅ‚adujLokalizacjaMężczyznaMarPrzenieÅ› wszystkich zaznaczonych użytkowników do..MajWiadomośćWiadomość z serwera: Komórka: WiÄ™cejPrzenieÅ› do kontaktówNiedostÄ™pnyNazwisko Nazwa grupy do utworzenia: Nazwa/TytuÅ‚: Nazwa: NigdyOtrzymano nowy UIN, %luNowa nazwa dla grupy: Nowa ksywka: Nowe hasÅ‚o: Nowa nazwa profilu: Nowe szukanieNastÄ™pneNastÄ™pne sprawdzenieKsywkaUstaw ksywkÄ™: Ksywka: NiepodaneLisTerazZajÄ™tyPaźRozłączonyOKStary emailNa kanaÅ‚ach: PrzyłączonyOtwórzUporzÄ…dkuj grupy kontaktów%s wychodzÄ…ce do %sOdpowiedź PING od użytkownika: %d sekHasÅ‚o musi mieć przynajmniej 6 znakówMusisz podać hasÅ‚oHasÅ‚o: HasÅ‚a nie sÄ… takie sameZakres portów do używania w komunikacji jeden-do-jednego (min-max): TelefonTelefon: ProszÄ™ dołącz do mojej konferencjiPosada: WyÅ›lijTemat wpisu: PoprzednieOpublikowano: Dokumentacja RSSLosowy Użytkownik do RozmowyOtrzymane %sOdrzućUsuÅ„Usunąć %s także z listy kontaktów?UsuÅ„ %d kontaktów z listy kontaktów?UsuÅ„ZmieÅ„ ZmieÅ„ nazwÄ™OdpowiedźRezultat zewnÄ™trznej akcji %s:ÅšciÄ…gnijÅšciÄ…gnijPowtarzanie...RomanserosyjskiSMS Serwer poczty SMTP: Wyniki szukania [zakoÅ„czono]SzukajSzukanie kontaktów..Szukam mężczyznSzukam kobietWybierzWybierz grupÄ™, do której chcesz dodać użytkownikaWybierz grupÄ™, do której przenieść użytkownikaWybierz kontakty, które chcesz dodać do listyWybierz kontakty, które chcesz przenieśćWyÅ›lijWyÅ›lij wiadomość WyÅ›lij URLWyÅ›lij kontaktyWyÅ›lij kontakty..WysyÅ‚anie żądaniaWysÅ‚ane %sWrzSerwer: Pokaż nieobecnych użytkownikówStan: Ulica: StudenciJabber ID zostaÅ‚ poprawnie zarejestrowanyLista użytkowników, którzy majÄ… CiÄ™ zapisanego jako ich przyjaciela:Profil o takiej nazwie już istnieje. Czy chcesz go zastÄ…pić?Druga strona używa %sDany katalog nie istniejeW danym katalogu nie można zapisywaćUżytkownik %s (%s) dodaÅ‚ CiÄ™ do swojej listy przyjaciół Adres dziennika: %sUżytkownik %s odrzuciÅ‚ Twoje zaproszenie do konferencjiUżytkownik %s zaprasza CiÄ™ do konferencji %s o temacie: %sUżytkownik %s dołączyÅ‚ do konferencjiUżytkownik %s opuÅ›ciÅ‚ konferencjÄ™Użytkownik %s usunÄ…Å‚ CiÄ™ ze swojej listy przyjaciół Adres dziennika: %sUżytkownik ma dziÅ› urodzinyUżytkownik zaakceptowaÅ‚ TwojÄ… proÅ›bÄ™ o autoryzacjÄ™Użytkownik dodaÅ‚ CiÄ™ do swojej listy kontaktowejUżytkownik zmieniÅ‚ ksywkÄ™ z %s na %sUżytkownik nie ma informacji w profiluUżytkownik odrzuciÅ‚ TwojÄ… proÅ›bÄ™ o autoryzacjÄ™ z powodu: Użytkownik usunÄ…Å‚ CiÄ™ z listy jego kontaktów (używajÄ…c jÄ™zyka Jabbera, odsubskrybowaÅ‚ CiÄ™)Użytkownik chce siÄ™ zapisać do otrzymywania Twojej widocznoÅ›ci sieciowejTo jest Twoje konto LiveJournal. Użyj go doUpÅ‚ynÄ…Å‚ czas oczekiwania na nowy UIN. Powtórzyć?Strefa czasowaTytuÅ‚TytuÅ‚Próba zarejestrowania %s w %s...UIN: URLURL: URL-e w bieżącym kontekÅ›cie Odblokuj wiadomoÅ›ci z kanaÅ‚uNie można siÄ™ połączyć Nie ignorujUżycie: Info o użytkownikuSzczegółyWersjaLista widocznoÅ›ciProszÄ™ poczekać. Ustawienia osobiste nie zostaÅ‚y jeszcze pobranePracaNieprawidÅ‚owy Jabber IDZÅ‚a ksywka, nie można zarejestrowaćMusisz siÄ™ najpierw rozłączyć z serwisem!Musisz być zalogowany do sieci Gadu-Gadu, żeby zaktualizować swoje daneMusisz być zalogowany do sieci ICQ, żeby móc zaktualizować szczegółyMusisz być zalogowany do sieci Jabber, żeby zaktualizować swoje daneMusisz być zalogowany do sieci MSN, żeby zaktualizować TwojÄ… ksywkÄ™Pobrano Twoje szczegółyKodKod: przerwijdodawanie %s do listy kontaktów[aim] połączenie siÄ™ nie udaÅ‚owedle życzeniaautoryzacjaNieobecnypowód nieobecnoÅ›cizÅ‚e hasÅ‚ozÅ‚a nazwa użytkownikaniebieskiPrzerwijWyczyśćnie można siÄ™ połączyćzmieniÅ‚ siÄ™ nasz status %s na %s z %skomentarz: łączenie z serweremkontaktynie można utworzyć gniazda TCP/IPnie można znaleźć nazwy serweranie można pobraćciemnydnikatalog, w którym zostanÄ… nagrane pliki: wyłączonerozłączononie zmieniajzakoÅ„czonowykryto podwójne logowaniee-mailbłądzdarzeniebłąd wysyÅ‚ania zdarzenia: nie można utworzyć katalogu dla kontaktubłąd wysyÅ‚ania zdarzenia: za maÅ‚o parametrówbłąd wysyÅ‚ania zdarzenia: tylko UIN-y sÄ… pozwolone w protokole icqbłąd wysyÅ‚ania zdarzenia: nieznany typ IMbłąd wysyÅ‚ania zdarzenia: nieznany typ zdarzeniazaczÄ™to logowanie zdarzeÅ„wykonano zewnÄ™trznÄ… komendÄ™ %s, zwrócony kod = %dwykonano zewnÄ™trznÄ… rÄ™cznÄ… komendÄ™ %s, zwrócony kod = %dnazwa pliku: nazwa pliku: plikitylko dla przyjaciółwidok na caÅ‚y ekrangodziny[icq] powód rozłączeniazignorowaneprzychodzÄ…ce %s od %sinicjalizacjaPrzyłączZaÅ‚adujzalogowanozakoÅ„czono Å›ciÄ…ganie listy czÅ‚onków, znaleziono %dwiadomośćminutyTryb 1Tryb 2W dółW górÄ™n/anowa przyjazna ksywka MSN: niebrakpowiadomieniewychodzÄ…ce %s do %shasÅ‚o zostaÅ‚o zmienionehasÅ‚o: wysyÅ‚ania nowych wpisów w Twoim dzienniku.prywatnypubliczny (widoczny dla wszystkich)UsuÅ„powód: %srejestracja nie jest wspieranausuwanie %s z listy kontaktówZapiszzakoÅ„czono wyszukiwanie, znaleziono %dwyszukiwanie dla:ustawiony przez %sproblem z gniazdem TCP/IPkarta dźwiÄ™kowagÅ‚oÅ›nikstartbłąd zmiany statusu: sukceswiadomość byÅ‚a: zbyt czÄ™ste połączenia, włączona czasowa ochronanieznany typ IMpodano nieznany znak statusuInfo o użytkowniku %snazwa użytkownika lub hasÅ‚o nieprawidÅ‚owesprawdź wprowadzonÄ… nazwÄ™ serwera i portpracazÅ‚y XMLtakjesteÅ› tu opemcenterim-4.22.10/po/POTFILES.in0000644000175000001440000000213311461606612012600 00000000000000src/centerim.cc src/hooks/rsshook.cc src/hooks/HTTPClient.cc src/hooks/yahoohook.cc src/hooks/jabberhook.cc src/hooks/aimhook.cc src/hooks/icqhook.cc src/hooks/gaduhook.cc src/hooks/irchook.cc src/hooks/ljhook.cc src/hooks/msnhook.cc src/hooks/abstracthook.cc src/icqcontact.cc src/icqgroups.cc src/eventmanager.cc src/icqdialogs.cc src/icqhist.cc src/imexternal.cc src/imcontact.cc src/imlogger.cc src/accountmanager.cc src/icqcontacts.cc src/icqmlist.cc src/imcontroller.cc src/icqconf.cc src/imevents.cc src/impgp.cc src/imotr.cc src/icqface.cc src/centermain.cc src/icqgroup.cc src/icqmlist.h src/imcontroller.h src/icqcommon.h src/hooks/ljhook.h src/hooks/rsshook.h src/hooks/HTTPClient.h src/hooks/yahoohook.h src/hooks/aimhook.h src/hooks/msnhook.h src/hooks/jabberhook.h src/hooks/gaduhook.h src/hooks/icqhook.h src/hooks/irchook.h src/hooks/abstracthook.h src/icqcontacts.h src/centerim.h src/icqgroup.h src/imcontact.h src/accountmanager.h src/eventmanager.h src/imevents.h src/icqcontact.h src/imlogger.h src/icqconf.h src/impgp.h src/imotr.h src/icqface.h src/icqgroups.h src/icqhist.h src/imexternal.h centerim-4.22.10/po/pt_BR.po0000644000175000001440000023511211473011457012376 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR , YEAR. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 2.0.0\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2002-09-10 01:22+0300\n" "Last-Translator: Paulo Oliveira Filho \n" "Language-Team: Brazilian \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: iso-8859-1\n" #: src/centerim.cc:138 #, fuzzy msgid "password: " msgstr "Senha: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" "F2/M opções do contato atual, F3/S mudar status do ICQ, F4/G ações gerais, Q " "sair" #: src/centerim.cc:274 #, fuzzy, c-format msgid "Ignore all events from %s?" msgstr "Ignorar todos os eventos de %s (%lu)?" #: src/centerim.cc:278 #, fuzzy, c-format msgid "Remove %s from the contact list as well?" msgstr "+ conectando para o servidor ICQ" #: src/centerim.cc:312 #, fuzzy, c-format msgid "Are you sure want to remove %s?" msgstr "Você tem certeza que deseja remover %s (%lu)?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Novo apelido a exibir: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "" #: src/centerim.cc:460 src/accountmanager.cc:255 #, fuzzy msgid "away message" msgstr "Homepage" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "" #: src/centerim.cc:692 src/centerim.cc:747 #, fuzzy, c-format msgid "+ new mail arrived, %d messages" msgstr "+ novo mail chegou, %d mensagens" #: src/centerim.cc:694 src/centerim.cc:749 #, fuzzy, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ novo mail chegou, %d mensagens" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ última msg de %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "" #: src/centerim.cc:1008 #, fuzzy msgid "Mobile number: " msgstr "nome do arquivo: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "" #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "" #: src/centerim.cc:1315 #, fuzzy, c-format msgid "+ no history items for %s" msgstr "+ não existem items no histórico para %s, %lu" #: src/centerim.cc:1341 #, fuzzy, c-format msgid "+ user %s is already on the list" msgstr "+ %lu foi adicionar para a lista" #: src/centerim.cc:1353 #, fuzzy msgid "Select a group to add the user to" msgstr "Selecione os contatos para adicionar a lista" #: src/centerim.cc:1385 #, fuzzy, c-format msgid "+ %s has been added to the list" msgstr "+ %lu foi adicionar para a lista" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ o usuário está de volta" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "" #: src/centerim.cc:1488 #, fuzzy, c-format msgid "+ [%s] automatically set %s" msgstr "+ automaticamente setar NÃO DISPONÃVEL (n/a)" #: src/centerim.cc:1490 #, fuzzy msgid "away" msgstr "Afastado (away)" #: src/centerim.cc:1490 msgid "n/a" msgstr "" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "" #: src/centerim.cc:1772 #, fuzzy msgid "Select contacts to move" msgstr "Selecione os contatos para adicionar a lista" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "" #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "não alterar" #: src/hooks/rsshook.cc:380 msgid "success" msgstr "" #: src/hooks/rsshook.cc:400 #, fuzzy msgid "Title: " msgstr "Título" #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "" #: src/hooks/rsshook.cc:402 #, fuzzy msgid "Category: " msgstr "Cidade: " #: src/hooks/rsshook.cc:403 #, fuzzy msgid "Author: " msgstr "Pedido de autorização de %lu" #: src/hooks/rsshook.cc:405 #, fuzzy msgid "Description: " msgstr "Posição: " #: src/hooks/rsshook.cc:407 #, fuzzy msgid "Link: " msgstr "novo UIN" #: src/hooks/rsshook.cc:408 #, fuzzy msgid "Comments: " msgstr "comentário: " #: src/hooks/yahoohook.cc:175 #, fuzzy msgid "+ [yahoo] cannot connect: " msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "" #: src/hooks/yahoohook.cc:448 #, fuzzy, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "" #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "" #: src/hooks/yahoohook.cc:802 #, fuzzy msgid "+ [yahoo] another logon detected" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:809 #, fuzzy msgid "+ [yahoo] server closed socket" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "" #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 #, fuzzy msgid "The user has added you to his/her contact list" msgstr "adicionou você a lista de contatos dele" #: src/hooks/yahoohook.cc:1036 #, fuzzy msgid "the message was: " msgstr "Homepage" #: src/hooks/yahoohook.cc:1054 #, fuzzy, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1154 #, fuzzy msgid "+ [yahoo] direct connection failed" msgstr "+ desconectado" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 msgid "The user has buzzed you" msgstr "" #: src/hooks/jabberhook.cc:360 #, fuzzy msgid "+ [jab] unable to connect to the server" msgstr "+ não foi possível conectar ao servidor ICQ" #: src/hooks/jabberhook.cc:649 #, fuzzy, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ conectando para o servidor ICQ" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 #, fuzzy msgid "Away message:" msgstr "Homepage" #: src/hooks/jabberhook.cc:766 #, fuzzy, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "" #: src/hooks/jabberhook.cc:819 #, fuzzy msgid "Unable to connect" msgstr "+ não foi possível conectar ao servidor ICQ" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, fuzzy, c-format msgid "+ [jab] error %d" msgstr "+ conectando para o servidor ICQ" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, fuzzy, c-format msgid "+ [jab] error %d: %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" #: src/hooks/aimhook.cc:89 #, fuzzy msgid "+ [aim] unable to connect to the server" msgstr "+ não foi possível conectar ao servidor ICQ" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "" #: src/hooks/aimhook.cc:375 #, fuzzy msgid "aim connection failed" msgstr "+ conectando para o servidor ICQ" #: src/hooks/aimhook.cc:377 #, fuzzy, c-format msgid "+ [aim] connect failed: %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "" #: src/hooks/aimhook.cc:503 #, fuzzy msgid "+ [aim] password sent" msgstr "Senha: " #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "" #: src/hooks/icqhook.cc:1053 #, fuzzy msgid "bad username" msgstr " Username do Proxy : %s " #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "" #: src/hooks/icqhook.cc:1055 #, fuzzy msgid "bad password" msgstr "Senha: " #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ conectando para o servidor ICQ" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] disconnected" msgstr "+ desconectado" #: src/hooks/icqhook.cc:1076 #, fuzzy msgid "icq disconnection reason" msgstr "+ desconectado" #: src/hooks/icqhook.cc:1254 #, fuzzy msgid "The user has accepted your authorization request" msgstr "adicionou você a lista de contatos dele" #: src/hooks/icqhook.cc:1258 #, fuzzy msgid "The user has rejected your authorization request; the message was: " msgstr "Pedido de autorização de %lu" #: src/hooks/icqhook.cc:1313 #, fuzzy, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ arquivo %s para %s, %lu enviado" #: src/hooks/icqhook.cc:1316 #, fuzzy, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ arquivo %s para %s, %lu enviado" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ conectando para o servidor ICQ" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "" #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ conectando para o servidor ICQ" #: src/hooks/gaduhook.cc:164 #, fuzzy, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/gaduhook.cc:218 #, fuzzy msgid "+ [gg] connection to the server failed" msgstr "+ conectando para o servidor ICQ" #: src/hooks/gaduhook.cc:291 #, fuzzy msgid "+ [gg] connection lost" msgstr "+ conectando para o servidor ICQ" #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/irchook.cc:146 #, fuzzy msgid "+ [irc] unable to connect to the server" msgstr "+ não foi possível conectar ao servidor ICQ" #: src/hooks/irchook.cc:815 #, fuzzy, c-format msgid "+ [irc] connect failed: %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "" #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "" #: src/hooks/irchook.cc:1290 #, fuzzy msgid "+ [irc] password sent" msgstr "Senha: " #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "Senha: " #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "" #: src/hooks/irchook.cc:1442 #, fuzzy, c-format msgid "%s has joined." msgstr "Ignorar" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, fuzzy, c-format msgid "reason: %s" msgstr "Enviado em %s" #: src/hooks/irchook.cc:1489 #, fuzzy, c-format msgid "%s has been kicked by %s" msgstr "+ %lu foi adicionar para a lista" #: src/hooks/irchook.cc:1518 #, fuzzy, c-format msgid "Channel topic now is: %s" msgstr "Alterar" #: src/hooks/irchook.cc:1523 #, fuzzy, c-format msgid "set by %s" msgstr "Enviado em %s" #: src/hooks/irchook.cc:1541 #, fuzzy, c-format msgid "%s has been opped by %s." msgstr "+ %lu foi adicionar para a lista" #: src/hooks/irchook.cc:1557 #, fuzzy, c-format msgid "%s has been deopped by %s." msgstr "+ %lu foi adicionar para a lista" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "" #: src/hooks/ljhook.cc:511 #, fuzzy msgid "cannot connect" msgstr "+ conectando para o servidor ICQ" #: src/hooks/ljhook.cc:512 #, fuzzy, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "" #: src/hooks/ljhook.cc:572 #, fuzzy, c-format msgid "+ [lj] login failed: %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "" #: src/hooks/ljhook.cc:578 #, fuzzy, c-format msgid "+ [lj] post error: %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/ljhook.cc:677 #, fuzzy, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "adicionou você a lista de contatos dele" #: src/hooks/ljhook.cc:687 #, fuzzy, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "adicionou você a lista de contatos dele" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "" #: src/hooks/ljhook.cc:722 #, fuzzy, c-format msgid "+ [lj] %s was added to friends" msgstr "+ %lu foi adicionar para a lista" #: src/hooks/msnhook.cc:430 #, fuzzy, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ conectando para o servidor ICQ" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "" #: src/hooks/msnhook.cc:799 #, fuzzy, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ conectando para o servidor ICQ" #: src/hooks/msnhook.cc:905 #, fuzzy msgid "+ [msn] cannot connect: " msgstr "+ conectando para o servidor ICQ" #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "" #: src/hooks/abstracthook.cc:355 #, fuzzy msgid "connecting to the server" msgstr "+ conectando para o servidor ICQ" #: src/hooks/abstracthook.cc:356 #, fuzzy msgid "logged in" msgstr "+ conectado" #: src/hooks/abstracthook.cc:357 #, fuzzy, c-format msgid "search finished, %d found" msgstr "+ conectando para o servidor ICQ" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "" #: src/hooks/abstracthook.cc:359 #, fuzzy msgid "disconnected" msgstr "Desconectado" #: src/hooks/abstracthook.cc:360 #, fuzzy, c-format msgid "adding %s to the contacts" msgstr "+ conectando para o servidor ICQ" #: src/hooks/abstracthook.cc:361 #, fuzzy, c-format msgid "removing %s from the contacts" msgstr "+ conectando para o servidor ICQ" #: src/hooks/abstracthook.cc:362 #, fuzzy, c-format msgid "members list fetching finished, %d found" msgstr "+ conectando para o servidor ICQ" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Jan" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Fev" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Mar" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Abr" #: src/icqcontact.cc:854 msgid "May" msgstr "Mai" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Jun" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Jul" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Ago" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Set" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Out" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Nov" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Dez" #: src/icqgroups.cc:66 #, fuzzy msgid "General" msgstr " Inf. gerais " #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Enviado em %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "" #: src/icqdialogs.cc:50 msgid "unknown" msgstr "" #: src/icqdialogs.cc:58 #, fuzzy msgid "General Chat" msgstr " Inf. gerais " #: src/icqdialogs.cc:59 msgid "Romance" msgstr "" #: src/icqdialogs.cc:60 #, fuzzy msgid "Games" msgstr "Nome" #: src/icqdialogs.cc:61 msgid "Students" msgstr "" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Nome" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr "" #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Remover" #: src/icqdialogs.cc:120 msgid "Load" msgstr "" #: src/icqdialogs.cc:205 #, fuzzy msgid "+ you must be logged in first" msgstr "+ conectado" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #, fuzzy msgid "cLear" msgstr "Celular" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Alterar" #: src/icqdialogs.cc:229 #, fuzzy msgid "Search/Add" msgstr "Nova pesquisa" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "" #: src/icqdialogs.cc:248 #, fuzzy msgid " Find/add user(s) " msgstr " Pesquisar/adicionar usuários" #: src/icqdialogs.cc:249 #, fuzzy msgid " Join/create a channel/conference " msgstr "não alterar" #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr "" #: src/icqdialogs.cc:299 #, fuzzy msgid " Network " msgstr " Trabalho " #: src/icqdialogs.cc:307 #, fuzzy msgid " UIN " msgstr "UIN: " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Detalhes " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Apelido : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Primeiro nome : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Último nome : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, fuzzy, c-format msgid " Age range : %s " msgstr " Idade : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Sexo : %s " #: src/icqdialogs.cc:328 #, fuzzy, c-format msgid " Language : %s " msgstr " 3o. idioma : %s " #: src/icqdialogs.cc:332 #, fuzzy msgid " Location " msgstr "Local" #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Cidade : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Estado : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " País : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Trabalho " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Companhia : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Departamento : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Posição : %s " #: src/icqdialogs.cc:346 #, fuzzy msgid " Online only " msgstr "Online" #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr "" #: src/icqdialogs.cc:357 #, fuzzy msgid " Keywords " msgstr " Trabalho " #: src/icqdialogs.cc:366 #, fuzzy msgid " Nickname " msgstr "Apelido: " #: src/icqdialogs.cc:372 msgid " Search service " msgstr "" #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr "" #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 #, fuzzy msgid " Feed Parameters " msgstr " Andamento do registro " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr "" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr "" #: src/icqdialogs.cc:398 #, fuzzy, c-format msgid " Channel : %s " msgstr "Alterar" #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, fuzzy, c-format msgid " Name : %s " msgstr " Apelido : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr "" #: src/icqdialogs.cc:416 #, fuzzy, c-format msgid " Keywords : %s " msgstr " Trabalho " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 #, fuzzy msgid " Options " msgstr "Local" #: src/icqdialogs.cc:422 #, fuzzy, c-format msgid " Users with photos only : %s " msgstr " Posição : %s " #: src/icqdialogs.cc:423 #, fuzzy, c-format msgid " Look for online only : %s " msgstr "Online" #: src/icqdialogs.cc:428 #, fuzzy msgid " Show users who have you on their list " msgstr "+ %lu foi adicionar para a lista" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr "" #: src/icqdialogs.cc:438 src/imcontroller.cc:87 #, fuzzy msgid " Password " msgstr "Senha: " #: src/icqdialogs.cc:443 #, fuzzy msgid " Service " msgstr "Nunca" #: src/icqdialogs.cc:472 #, fuzzy msgid "New profile name: " msgstr "nome do arquivo: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Apelido: " #: src/icqdialogs.cc:504 #, fuzzy msgid "Name/Title: " msgstr "Nome" #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-mail: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Primeiro nome: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Último nome: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Cidade: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Estado: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Empresa: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Departamento: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Posição: " #: src/icqdialogs.cc:519 #, fuzzy msgid "Channel: " msgstr "Alterar" #: src/icqdialogs.cc:520 #, fuzzy msgid "Name: " msgstr "Nome" #: src/icqdialogs.cc:522 #, fuzzy msgid "Keywords: " msgstr "Senha: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Senha: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 #, fuzzy msgid "URL: " msgstr "UIN: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "" #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Inf. gerais " #: src/icqdialogs.cc:595 #, fuzzy msgid " Registration service " msgstr " Andamento do registro " #: src/icqdialogs.cc:599 #, fuzzy msgid " Registration parameters " msgstr " Andamento do registro " #: src/icqdialogs.cc:622 #, fuzzy, c-format msgid " Change password : %s " msgstr " Repita a senha : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr "" #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Idade : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Casa " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Endereço : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " CEP : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefone : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Celular : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Homepage : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Mais detalhes " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1o. idioma : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2o. idioma : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3o. idioma : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr "" #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr "" #: src/icqdialogs.cc:682 #, fuzzy, c-format msgid " Random chat group : %s " msgstr " 2o. idioma : %s " #: src/icqdialogs.cc:684 #, fuzzy, c-format msgid " Authorization required : %s " msgstr "Pedido de autorização de %lu" #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Estado : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " Sobre " #: src/icqdialogs.cc:727 #, fuzzy msgid "Fetching your details" msgstr "Pegando seus detalhes do ICQ" #: src/icqdialogs.cc:741 #, fuzzy, c-format msgid " Your %s details " msgstr " Seus detalhes do ICQ " #: src/icqdialogs.cc:744 #, fuzzy, c-format msgid " %s: details " msgstr " Detalhes do ICQ de %s " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Pronto" #: src/icqdialogs.cc:775 #, fuzzy msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Espere um momento. Seus detalhes do ICQ não foram pegos ainda" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-mail: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Entre nascimento (DD-MM-AAAA): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Idade: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Endereço: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "CEP: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefone: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Celular: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Homepage: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Sobre" #: src/icqdialogs.cc:869 #, fuzzy msgid "New password: " msgstr "Senha: " #: src/icqdialogs.cc:872 #, fuzzy msgid "Check the new password: " msgstr " Repita a senha : %s " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 #, fuzzy msgid "none" msgstr "Pronto" #: src/icqdialogs.cc:1007 #, fuzzy msgid " [Ctrl-X save, Esc cancel] " msgstr " Sobre [Ctrl-X salva, Esc cancela] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Enviar arquivo(s) para %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Adicionar" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Comentário" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Enviar" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Arquivos " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Comentário " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "nome do arquivo: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "comentário: " #: src/icqdialogs.cc:1163 #, fuzzy msgid "None" msgstr "Pronto" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " Opções de configuração centerim" #: src/icqdialogs.cc:1218 #, fuzzy msgid " User interface " msgstr " Username do Proxy : %s " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Alterar dispositivo de som para : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Alterar esquema de cores para : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr "Pedido de autorização de %lu" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Departamento : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr "Alterar" #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Estado : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr "" #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr "" #: src/icqdialogs.cc:1231 #, c-format msgid " Enable vi bindings: %s " msgstr "" #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr "" #: src/icqdialogs.cc:1241 #, fuzzy, c-format msgid " Switch to language preset : %s " msgstr " 1o. idioma : %s " #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Departamento : %s " #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Departamento : %s " #: src/icqdialogs.cc:1246 #, fuzzy, c-format msgid " For protocols : %s" msgstr " Posição : %s " #: src/icqdialogs.cc:1249 #, fuzzy msgid " Contact list " msgstr "Contatos de %s, %lu" #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr "" #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Estado : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Ocultar usuários offline : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-spam: destruir mensagens de quem não está na lista: %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr "Pedido de autorização de %lu" #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Mencionar (quote) mensagem original na resposta : %s " #: src/icqdialogs.cc:1257 #, fuzzy, c-format msgid " Check the local mailbox : %s " msgstr " Repita a senha : %s " #: src/icqdialogs.cc:1258 #, fuzzy, c-format msgid " Remember passwords : %s " msgstr " Lembrar da senha do ICQ : %s " #: src/icqdialogs.cc:1259 #, fuzzy, c-format msgid " Edit away message on status change : %s " msgstr " Mencionar (quote) mensagem original na resposta : %s " #: src/icqdialogs.cc:1266 #, fuzzy, c-format msgid " Chat messaging mode for : %s" msgstr " Mencionar (quote) mensagem original na resposta : %s " #: src/icqdialogs.cc:1272 #, fuzzy, c-format msgid " Enter key sends message for : %s" msgstr " Mencionar (quote) mensagem original na resposta : %s " #: src/icqdialogs.cc:1275 #, fuzzy, c-format msgid " Chat messaging mode : %s " msgstr " Mencionar (quote) mensagem original na resposta : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr "" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, c-format msgid " Color contacts according to: %s " msgstr "" #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Comunicações " #: src/icqdialogs.cc:1287 #, fuzzy, c-format msgid " SMTP server : %s " msgstr " Endereço do servidor : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " Endereço do servidor : %s " #: src/icqdialogs.cc:1289 #, fuzzy, c-format msgid " HTTP proxy server : %s " msgstr " Endereço do servidor : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr "" #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr "" #: src/icqdialogs.cc:1299 #, fuzzy msgid " Logging " msgstr " Telefone : %s " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr "" #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr "" #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr "" #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr "" #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Automaticam. setar para afastado (Away) em (min.) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Automaticam. setar para não disponível (N/A) em (min.) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Automaticam. setar para não disponível (N/A) em (min.) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Endereço : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Período p/ setar afastado (Away) automaticamente (0 - desativa): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Período p/ setar não disponível (N/A) automaticamente (0 - desativa): " #: src/icqdialogs.cc:1370 #, fuzzy msgid "SMTP server hostname: " msgstr " Username do Proxy : %s " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "" #: src/icqdialogs.cc:1394 #, fuzzy msgid "HTTP proxy server hostname: " msgstr " Username do Proxy : %s " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "" #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr " Username do Proxy : %s " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Pedido de autorização de %lu" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 #, fuzzy msgid "Your details have been fetched" msgstr "Seus detalhes do ICQ foram pegos" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "" #: src/icqdialogs.cc:1704 #, fuzzy msgid "Rename" msgstr "Remover" #: src/icqdialogs.cc:1704 #, fuzzy msgid "rEmove" msgstr "Remover" #: src/icqdialogs.cc:1704 #, fuzzy msgid "move Up" msgstr "Remover" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr "" #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "" #: src/icqdialogs.cc:1745 #, fuzzy msgid "New name for the group: " msgstr "Novo apelido a exibir: " #: src/icqdialogs.cc:1760 #, fuzzy msgid "Are you sure want to remove the group?" msgstr "Você tem certeza que deseja remover %s (%lu)?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "" #: src/icqdialogs.cc:1826 #, fuzzy msgid "Cancel" msgstr "Alterar" #: src/icqdialogs.cc:1855 #, fuzzy, c-format msgid " Incoming from %s " msgstr "Contatos de %s, %lu" #: src/icqdialogs.cc:1857 #, fuzzy, c-format msgid " Outgoing to %s " msgstr "Escrevendo mensagem para %s, %lu" #: src/icqdialogs.cc:1865 msgid "init" msgstr "" #: src/icqdialogs.cc:1866 msgid "start" msgstr "" #: src/icqdialogs.cc:1867 #, fuzzy msgid "work" msgstr "Trabalho" #: src/icqdialogs.cc:1868 #, fuzzy msgid "done" msgstr "Pronto" #: src/icqdialogs.cc:1869 msgid "err" msgstr "" #: src/icqdialogs.cc:1870 #, fuzzy msgid "abort" msgstr "Sobre" #: src/icqdialogs.cc:1877 #, fuzzy msgid " of " msgstr " Trabalho " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "" #: src/icqdialogs.cc:2023 msgid "private" msgstr "" #: src/icqdialogs.cc:2025 #, fuzzy msgid "friends only" msgstr "Feminino" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr "" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "" #: src/icqdialogs.cc:2040 #, fuzzy msgid "cAncel" msgstr "Alterar" #: src/icqdialogs.cc:2052 #, fuzzy, c-format msgid " Post to journal : %s " msgstr " Posição : %s " #: src/icqdialogs.cc:2053 #, fuzzy, c-format msgid " Subject : %s " msgstr " Endereço do servidor : %s " #: src/icqdialogs.cc:2058 #, fuzzy, c-format msgid " Security : %s " msgstr " Endereço do servidor : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr "" #: src/icqdialogs.cc:2063 #, fuzzy, c-format msgid " Mood : %s " msgstr " Telefone : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "" #: src/icqdialogs.cc:2064 #, fuzzy, c-format msgid " Custom mood : %s " msgstr " Último nome : %s " #: src/icqdialogs.cc:2066 #, fuzzy, c-format msgid " Music : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:2067 #, fuzzy, c-format msgid " Picture : %s " msgstr " Endereço do servidor : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Idade : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr "" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr "" #: src/icqdialogs.cc:2073 #, fuzzy, c-format msgid " Disallow comments : %s " msgstr " Departamento : %s " #: src/icqdialogs.cc:2074 #, fuzzy, c-format msgid " Backdated entry : %s " msgstr " Sexo : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "" #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "" #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "" #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr "Contatos de %s, %lu" #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "" "Pesquisa Rápida: digite para pesquisar, Alt-S pesquisa novamente, Enter " "termina" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr "" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Offline" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Online" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Invisível" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Livre para batepapo" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Não perturbe (dnd)" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Ocupado" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] Não disponível (n/a)" #: src/imcontact.cc:117 src/imlogger.cc:41 #, fuzzy msgid "Away" msgstr "Afastado (away)" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "" #: src/imlogger.cc:39 msgid "N/A" msgstr "" #: src/imlogger.cc:49 #, fuzzy msgid "message" msgstr "Homepage" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "" #: src/imlogger.cc:51 msgid "SMS" msgstr "" #: src/imlogger.cc:52 msgid "authorization" msgstr "" #: src/imlogger.cc:53 #, fuzzy msgid "e-mail" msgstr "E-mail" #: src/imlogger.cc:54 #, fuzzy msgid "notification" msgstr "Local" #: src/imlogger.cc:55 #, fuzzy msgid "contacts" msgstr "Mover para contatos" #: src/imlogger.cc:56 #, fuzzy msgid "files" msgstr " Arquivos " #: src/imlogger.cc:57 #, fuzzy msgid "event" msgstr "Nunca" #: src/imlogger.cc:79 msgid "events log started" msgstr "" #: src/imlogger.cc:110 #, fuzzy, c-format msgid "outgoing %s to %s" msgstr "Escrevendo mensagem para %s, %lu" #: src/imlogger.cc:111 #, fuzzy, c-format msgid "incoming %s from %s" msgstr "Contatos de %s, %lu" #: src/imlogger.cc:123 #, fuzzy msgid "ignored" msgstr "Ignorar" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "Enviado em %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr "" #: src/accountmanager.cc:97 #, fuzzy, c-format msgid " Server : %s " msgstr " Endereço do servidor : %s " #: src/accountmanager.cc:100 #, fuzzy, c-format msgid " Secured : %s " msgstr " Endereço do servidor : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, fuzzy, c-format msgid " Login : %s " msgstr " Telefone : %s " #: src/accountmanager.cc:118 #, fuzzy, c-format msgid " Password (optional) : %s " msgstr " Senha para definir : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Senha : %s " #: src/accountmanager.cc:124 #, fuzzy, c-format msgid " Priority : %s " msgstr " Cidade : %s " #: src/accountmanager.cc:129 #, fuzzy, c-format msgid " Import friend list : %s " msgstr " Departamento : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Senha para definir : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " Estado : %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Estado : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr "" #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Sexo : %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Trabalho " #: src/accountmanager.cc:168 #, fuzzy msgid " Change nickname " msgstr "Apelido: " #: src/accountmanager.cc:169 #, fuzzy msgid " Update user details " msgstr " Atualizar seus detalhes" #: src/accountmanager.cc:172 #, fuzzy msgid " Set away message " msgstr "Homepage" #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr "" #: src/accountmanager.cc:200 #, fuzzy msgid " user name: " msgstr " Username do Proxy : %s " #: src/accountmanager.cc:205 #, fuzzy msgid " uin: " msgstr "novo UIN" #: src/accountmanager.cc:210 src/accountmanager.cc:266 #, fuzzy msgid " password: " msgstr "Senha: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "" #: src/accountmanager.cc:232 #, fuzzy msgid "You have to disconnect the service first!" msgstr "+ não foi possível conectar ao servidor ICQ" #: src/accountmanager.cc:241 #, fuzzy msgid " server address: " msgstr " Endereço do servidor ICQ : %s " #: src/accountmanager.cc:285 msgid " priority: " msgstr "" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, fuzzy, c-format msgid " Register on the %s network " msgstr " Registrar na rede ICQ " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Senha para definir : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Repita a senha : %s " #: src/imcontroller.cc:93 #, fuzzy, c-format msgid " Server to use : %s " msgstr " Endereço do servidor : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Repita a senha digitada: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Apelido para definir: " #: src/imcontroller.cc:108 #, fuzzy msgid "Server: " msgstr "Nunca" #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Senhas não conferem" #: src/imcontroller.cc:116 #, fuzzy msgid "Password must be entered" msgstr "Repita a senha digitada: " #: src/imcontroller.cc:118 #, fuzzy msgid "Password must be at least 6 chars long" msgstr "Repita a senha digitada: " #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Andamento do registro " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Conectando ao servidor %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Enviando pedido" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Tempo expirou enquanto esperava por um novo UIN. Tentar novamente?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Tentando novamente.." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Novo UIN recebido, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Desconectado" #: src/imcontroller.cc:179 #, fuzzy msgid "Unable to connect to icq server. Retry?" msgstr "Não foi possível conectar ao servidor ICQ. Tentar novamente?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "" #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "" #: src/imcontroller.cc:228 #, fuzzy msgid "Failed" msgstr "Feminino" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "" #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "" #: src/imcontroller.cc:336 #, fuzzy msgid "registration is not supported" msgstr " Andamento do registro " #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "" #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "" #: src/icqconf.cc:1610 #, fuzzy, c-format msgid "%s to %s has been put to the queue" msgstr "+ %lu foi adicionar para a lista" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "" #: src/icqconf.cc:1680 #, fuzzy msgid "Usage: " msgstr "Idade: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 #, fuzzy msgid "General options:" msgstr " Inf. gerais " #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr "" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr "" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 #, fuzzy msgid " --help display this stuff" msgstr " Alterar status do ICQ s" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr "" #: src/icqconf.cc:1692 #, fuzzy msgid "Events sending options:" msgstr " Opções de configuração centerim" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr "" #: src/icqconf.cc:1694 msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr "" #: src/icqconf.cc:1695 msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" #: src/icqconf.cc:1700 msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "" #: src/imevents.cc:297 #, fuzzy msgid "Empty authorization request message" msgstr "Pedido de autorização de %lu" #: src/imevents.cc:321 #, fuzzy msgid "* Authorization request : " msgstr "Pedido de autorização de %lu" #: src/imevents.cc:322 #, fuzzy msgid "* Authorization : " msgstr "Pedido de autorização de %lu" #: src/imevents.cc:381 msgid "* SMS : " msgstr "" #: src/imevents.cc:517 #, fuzzy msgid "* Contacts : " msgstr "Contatos de %s, %lu" #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr " Ignorar usuário" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Inf. gerais" #: src/imotr.cc:122 src/imotr.cc:315 msgid " accountname: " msgstr "" #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Posição : %s " #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " Username do Proxy : %s " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "sim" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "não" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "sim" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Sobre " #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " Posição : %s " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Idade: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " Posição : %s " #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Sobre " #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "sim" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "Nov" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr "Nunca" #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "" #: src/imotr.cc:588 msgid "Unknown" msgstr "" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Masculino" #: src/icqface.cc:53 msgid "Female" msgstr "Feminino" #: src/icqface.cc:56 msgid "Not specified" msgstr "Não especificado" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "Próxima" #: src/icqface.cc:63 msgid "Fwd" msgstr "Encaminhar" #: src/icqface.cc:64 msgid "Reply" msgstr "Responder" #: src/icqface.cc:65 msgid "Open" msgstr "" #: src/icqface.cc:66 msgid "Accept" msgstr "Aceitar" #: src/icqface.cc:67 msgid "Reject" msgstr "" #: src/icqface.cc:68 msgid "User info" msgstr "" #: src/icqface.cc:70 msgid "Prev" msgstr "" #: src/icqface.cc:78 msgid "sound card" msgstr "placa de som" #: src/icqface.cc:79 msgid "speaker" msgstr "alto-falante interno" #: src/icqface.cc:80 msgid "disable" msgstr "desativado" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "não alterar" #: src/icqface.cc:88 msgid "dark" msgstr "escuro" #: src/icqface.cc:89 msgid "blue" msgstr "azul" #: src/icqface.cc:97 msgid "protocol" msgstr "" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "Alterar" #: src/icqface.cc:118 #, fuzzy msgid "mode 1" msgstr " Modo " #: src/icqface.cc:119 #, fuzzy msgid "mode 2" msgstr " Modo " #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "" #: src/icqface.cc:274 #, fuzzy msgid "Send an URL" msgstr " Enviar uma URL u" #: src/icqface.cc:275 msgid " Send an SMS" msgstr "" #: src/icqface.cc:276 #, fuzzy msgid "Send contacts" msgstr "Mover para contatos" #: src/icqface.cc:277 #, fuzzy msgid " Request authorization" msgstr "Pedido de autorização de %lu" #: src/icqface.cc:278 #, fuzzy msgid "Edit details" msgstr " Editar detalhes" #: src/icqface.cc:279 #, fuzzy msgid "Fetch away message" msgstr "Homepage" #: src/icqface.cc:280 #, fuzzy msgid "Add to list" msgstr " Adicionar para lista a" #: src/icqface.cc:281 #, fuzzy msgid "Rename contact" msgstr " Enviar uma URL u" #: src/icqface.cc:282 msgid " Move to group.." msgstr "" #: src/icqface.cc:283 msgid " Ping" msgstr "" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "" #: src/icqface.cc:285 #, fuzzy msgid " Send file(s)" msgstr " Enviar arquivo(s) para %s, %lu " #: src/icqface.cc:286 msgid " Invite to conference.." msgstr "" #: src/icqface.cc:293 #, fuzzy msgid " Send a channel message enter" msgstr " Enviar mensagem enter" #: src/icqface.cc:294 #, fuzzy msgid "Channel chat history" msgstr " Histórico de eventos h" #: src/icqface.cc:295 #, fuzzy msgid " Remove channel del" msgstr " Remover usuário del" #: src/icqface.cc:296 #, fuzzy msgid " Join channel" msgstr "não alterar" #: src/icqface.cc:297 #, fuzzy msgid " Leave channel" msgstr "Alterar" #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Último nome: " #: src/icqface.cc:301 #, fuzzy msgid "UnBlock channel messages" msgstr " Enviar mensagem enter" #: src/icqface.cc:303 #, fuzzy msgid "Block channel messages" msgstr " Enviar mensagem enter" #: src/icqface.cc:310 #, fuzzy msgid "Send a message" msgstr "Homepage" #: src/icqface.cc:312 #, fuzzy msgid "Event history" msgstr " Histórico de eventos h" #: src/icqface.cc:313 #, fuzzy msgid "Remove user" msgstr "Remover" #: src/icqface.cc:314 #, fuzzy msgid "User's details" msgstr " Detalhes do usuário ?" #: src/icqface.cc:315 msgid "External actions.." msgstr "" #: src/icqface.cc:318 #, fuzzy msgid "Unset ignore user" msgstr " Remover usuário del" #: src/icqface.cc:318 #, fuzzy msgid "Ignore user" msgstr " Ignorar usuário" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 #, fuzzy msgid "Force check" msgstr " Remover usuário del" #: src/icqface.cc:435 #, fuzzy msgid "Change status" msgstr "Alterar" #: src/icqface.cc:436 #, fuzzy msgid "Go to contact.." msgstr "Mover para contatos" #: src/icqface.cc:437 msgid " Accounts.." msgstr "" #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " Opções de configuração centerim" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr "" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Pesquisar/adicionar usuários" #: src/icqface.cc:445 #, fuzzy msgid " Join channel/conference" msgstr "não alterar" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr "" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Exibir/editar lista de ignorar" #: src/icqface.cc:451 #, fuzzy msgid " View/edit invisible list" msgstr " Exibir/editar lista de visibilidade" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Exibir/editar lista de visibilidade" #: src/icqface.cc:455 #, fuzzy msgid "Show offline users" msgstr " Ocultar usuários offline : %s " #: src/icqface.cc:457 #, fuzzy msgid "Hide offline users" msgstr " Ocultar usuários offline : %s " #: src/icqface.cc:460 #, fuzzy msgid " Organize contact groups" msgstr "Contatos de %s, %lu" #: src/icqface.cc:461 msgid " Mass group move.." msgstr "" #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Detalhes" #: src/icqface.cc:905 #, fuzzy msgid "Message" msgstr "Homepage" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Nova pesquisa" #: src/icqface.cc:924 #, fuzzy msgid "Contact to add" msgstr "Contatos de %s, %lu" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "" #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "" #: src/icqface.cc:1016 #, fuzzy, c-format msgid "Information about %s" msgstr "Informação sobre %lu, %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Apelido" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr " Ignorar usuário" #: src/icqface.cc:1116 msgid "not found" msgstr "" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2o. e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "E-mail ant." #: src/icqface.cc:1134 msgid "Gender" msgstr "Sexo" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Nascimento" #: src/icqface.cc:1136 msgid "Age" msgstr "Idade" #: src/icqface.cc:1137 msgid "Languages" msgstr "Idiomas" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Último IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Visto em" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Nunca" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "Enviar" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr " Arquivos " #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Mover para contatos" #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "Pedido de autorização de %lu" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Endereço" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Local" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "CEP" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefone" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Celular" #: src/icqface.cc:1259 msgid "Timezone" msgstr "" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Homepage" #: src/icqface.cc:1300 msgid "Company" msgstr "Empresa" #: src/icqface.cc:1301 msgid "Department" msgstr "Departamento" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Título" #: src/icqface.cc:1346 msgid "Interests" msgstr "Interesses" #: src/icqface.cc:1358 #, fuzzy msgid "Background" msgstr "Experiência/Passado" #: src/icqface.cc:1376 #, fuzzy msgid "Handle" msgstr "Masculino" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "" #: src/icqface.cc:1378 msgid "Version" msgstr "" #: src/icqface.cc:1379 msgid "Encoding" msgstr "" #: src/icqface.cc:1382 msgid "Link" msgstr "" #: src/icqface.cc:1384 msgid "Frequency" msgstr "" #: src/icqface.cc:1385 #, fuzzy msgid "Last check" msgstr "Visto em" #: src/icqface.cc:1386 msgid "Next check" msgstr "" #: src/icqface.cc:1387 #, fuzzy msgid "Last result" msgstr "Visto em" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "" #: src/icqface.cc:1404 #, fuzzy msgid "Now" msgstr "Nov" #: src/icqface.cc:1423 #, fuzzy msgid "Full name" msgstr "nome do arquivo: " #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "" #: src/icqface.cc:1456 msgid "Check" msgstr "" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Editar" #: src/icqface.cc:1456 msgid "LJ" msgstr "" #: src/icqface.cc:1460 #, fuzzy msgid "Retreive" msgstr "Pegar" #: src/icqface.cc:1466 #, fuzzy msgid "Friend of" msgstr "Feminino" #: src/icqface.cc:1472 msgid "Home" msgstr "Casa" #: src/icqface.cc:1472 msgid "Work" msgstr "Trabalho" #: src/icqface.cc:1472 msgid "More" msgstr "Mais detalhes" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Pegar" #: src/icqface.cc:1573 #, fuzzy msgid " [icq] ICQ network" msgstr " Registrar na rede ICQ " #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr "" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr "" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr "" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr "" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr "" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr "" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr "" #: src/icqface.cc:1623 #, fuzzy msgid " Already logged in only" msgstr "+ conectado" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr "" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr "" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Mover para contatos" #: src/icqface.cc:1952 #, fuzzy msgid "Ignore list" msgstr "LISTA DE IGNORAR do ICQ (ignore list)" #: src/icqface.cc:1953 #, fuzzy msgid "Visible list" msgstr "LISTA DE VISIBILIDADE do ICQ (visible list)" #: src/icqface.cc:1954 #, fuzzy msgid "Invisible list" msgstr "LISTA DE INVISIBILIDADE do ICQ (invisible list)" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Selecione os contatos para adicionar a lista" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Destinatários do evento" #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "" "Pesquisa Rápida: digite para pesquisar, Alt-S pesquisa novamente, Enter " "termina" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr "Contatos de %s, %lu" #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "Ctrl-X envia, Ctrl-P múltiplos destinatários, Ctrl-O histórico, Alt-? " "detalhes, ESC cancela" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "Ctrl-X envia, Ctrl-P múltiplos destinatários, Ctrl-O histórico, Alt-? " "detalhes, ESC cancela" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr "Escrevendo mensagem para %s, %lu" #: src/icqface.cc:2610 #, fuzzy msgid "Send contacts.." msgstr "Mover para contatos" #: src/icqface.cc:2670 #, fuzzy msgid "file name: " msgstr "nome do arquivo: " #: src/icqface.cc:3131 #, fuzzy, c-format msgid "Outgoing %s to %s" msgstr "Escrevendo mensagem para %s, %lu" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Enviado em %s" #: src/icqface.cc:3135 #, fuzzy, c-format msgid "Incoming %s from %s" msgstr "Contatos de %s, %lu" #: src/icqface.cc:3136 #, fuzzy, c-format msgid "Received on %s" msgstr "%s, recebida em %s" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "" #: src/icqface.cc:3229 #, fuzzy, c-format msgid "%s from %s, received on %s" msgstr "%s, recebida em %s" #: src/icqface.cc:3230 #, fuzzy, c-format msgid "%s to %s, sent on %s" msgstr "Enviado em %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "" #: src/icqface.cc:3339 #, c-format msgid "%s search, %s again, %s cancel" msgstr "" #: src/icqface.cc:3348 #, fuzzy msgid "search for: " msgstr "+ pesquisa realizada" #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ conectando para o servidor ICQ" #~ msgid " [o] Online" #~ msgstr " [o] Online" #~ msgid " [_] Offline" #~ msgstr " [_] Offline" #~ msgid " [a] Away" #~ msgstr " [a] Afastado (away)" #~ msgid " [c] Occupied" #~ msgstr " [c] Ocupado" #~ msgid " [f] Free for chat" #~ msgstr " [f] Livre para batepapo" #~ msgid " [i] Invisible" #~ msgstr " [i] Invisível" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Repita a senha : %s " #, fuzzy #~ msgid " Convert from : %s " #~ msgstr " País : %s " #, fuzzy #~ msgid " Convert to : %s " #~ msgstr " País : %s " #, fuzzy #~ msgid "URLs, " #~ msgstr "UIN: " #, fuzzy #~ msgid " details, " #~ msgstr " Detalhes " #, fuzzy #~ msgid " cancel" #~ msgstr "Alterar" #, fuzzy #~ msgid "search, " #~ msgstr "+ pesquisa realizada" #, fuzzy #~ msgid " esc cancel" #~ msgstr "Alterar" #, fuzzy #~ msgid "contact menu, " #~ msgstr "Mover para contatos" #, fuzzy #~ msgid "general actions, " #~ msgstr " Inf. gerais " #, fuzzy #~ msgid " Send contacts c" #~ msgstr " Enviar uma URL u" #, fuzzy #~ msgid " Edit details e" #~ msgstr " Detalhes do usuário ?" #, fuzzy #~ msgid " List nicknames ?" #~ msgstr " Ocultar usuários offline : %s " #, fuzzy #~ msgid " Block channel messages i" #~ msgstr " Enviar mensagem enter" #~ msgid " Send a message enter" #~ msgstr " Enviar mensagem enter" #~ msgid " Remove user del" #~ msgstr " Remover usuário del" #, fuzzy #~ msgid " Ignore user i" #~ msgstr " Remover usuário del" #, fuzzy #~ msgid " Remove feed del" #~ msgstr " Remover usuário del" #, fuzzy #~ msgid " Unset ignore feed i" #~ msgstr " Remover usuário del" #, fuzzy #~ msgid " Ignore feed i" #~ msgstr " Remover usuário del" #, fuzzy #~ msgid " Change status s" #~ msgstr " Alterar status do ICQ s" #~ msgid " Go to contact.. alt-s" #~ msgstr " Ir para contato.. alt-s" #, fuzzy #~ msgid " Show offline users F5" #~ msgstr " Renomear usuário r" #, fuzzy #~ msgid " Hide offline users F5" #~ msgstr " Ocultar usuários offline : %s " #, fuzzy #~ msgid " Russian win/koi translation for : %s" #~ msgstr " Tradução russo win1251-koi8 necessária : %s " #, fuzzy #~ msgid " Russian win/koi translation : %s " #~ msgstr " Tradução russo win1251-koi8 necessária : %s " #, fuzzy #~ msgid "+ [yahoo] connecting to the server" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [yahoo] disconnected" #~ msgstr "+ desconectado" #, fuzzy #~ msgid "+ [yahoo] adding %s to the contacts" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [yahoo] removing %s from the contacts" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [yahoo] logged in" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [jab] connecting to the server" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [jab] adding %s to the contacts" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [jab] removing %s from the contacts" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [jab] logged in" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [jab] disconnected" #~ msgstr "+ desconectado" #, fuzzy #~ msgid "+ [aim] connecting to the server" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [aim] removing %s from the contacts" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [aim] logged in" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [aim] disconnected" #~ msgstr "+ desconectado" #, fuzzy #~ msgid "+ [icq] connecting to the server" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [icq] logged in" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [irc] connecting to the server" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [irc] logged in" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [irc] disconnected" #~ msgstr "+ desconectado" #, fuzzy #~ msgid "+ [lj] disconnected" #~ msgstr "+ desconectado" #, fuzzy #~ msgid " Synchronize contact list " #~ msgstr "Contatos de %s, %lu" #, fuzzy #~ msgid " Contact list synchronization " #~ msgstr "Contatos de %s, %lu" #, fuzzy #~ msgid "No contacts to be synchronized" #~ msgstr "Contatos de %s, %lu" #, fuzzy #~ msgid "Friend list" #~ msgstr "LISTA DE IGNORAR do ICQ (ignore list)" #, fuzzy #~ msgid "+ [msn] connecting to the server" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [msn] logged in" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [msn] disconnected" #~ msgstr "+ desconectado" #, fuzzy #~ msgid "+ [yahoo] %s: started typing" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [yahoo] %s: stopped typing" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [msn] %s: stopped typing" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [msn] %s: started typing" #~ msgstr "+ conectado" #, fuzzy #~ msgid "+ [jab] incorrect jabber id" #~ msgstr "+ desconectado" #~ msgid " enter to select a file, esc to cancel " #~ msgstr " ENTER para selecionar um arquivo, ESC para cancelar " #, fuzzy #~ msgid " space to select a directory, esc to cancel " #~ msgstr " ENTER para selecionar um arquivo, ESC para cancelar " #~ msgid "SOCKS proxy server to use: " #~ msgstr "Servidor de proxy SOCKS a ser usado: " #~ msgid "SOCKS proxy user name: " #~ msgstr "Username do proxy SOCKS: " #~ msgid "SOCKS proxy password: " #~ msgstr "Senha do proxy SOCKS: " #, fuzzy #~ msgid "+ [msn] unable to connect to the server" #~ msgstr "+ não foi possível conectar ao servidor ICQ" #, fuzzy #~ msgid "+ [msn] connecting with %s" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid " IRC channels manager " #~ msgstr "Alterar" #, fuzzy #~ msgid "Password" #~ msgstr "Senha: " #, fuzzy #~ msgid "Show" #~ msgstr "Telefone" #, fuzzy #~ msgid " Channels " #~ msgstr "Alterar" #, fuzzy #~ msgid "shown" #~ msgstr "Telefone" #, fuzzy #~ msgid "+ [aim] disconnected from the network" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "+ [irc] disconnected from the network" #~ msgstr "+ conectando para o servidor ICQ" #, fuzzy #~ msgid "Show on the list" #~ msgstr "Contatos de %s, %lu" #, fuzzy #~ msgid "+ the notification has been sent to %lu" #~ msgstr "+ autorização enviada para %lu" #, fuzzy #~ msgid "+ [yahoo] unable to connect to the server" #~ msgstr "+ não foi possível conectar ao servidor ICQ" #, fuzzy #~ msgid "Ctrl-X send, Ctrl-O history, Alt-? details, ESC exit" #~ msgstr "" #~ "Ctrl-X envia, Ctrl-P múltiplos destinatários, Ctrl-O histórico, Alt-? " #~ "detalhes, ESC cancela" centerim-4.22.10/po/de.gmo0000644000175000001440000015423711473011460012126 00000000000000Þ•$<?\2XC+YC…C™C­CÁCÕCéCýCKD6]D1”D5ÆD-üD/*EIZE8¤EWÝEG5Fh}F=æFH$G mG{GG£G·G*×GH H H !H-H CHNH_HnH'†H.®H6ÝH-I#BIfI}II­I*ÄI)ïI4JNJaJxJ‰J£J¹JÒJëJ. K8KJKaKKŽK©KÇK!àKL!L ;LGL!^L €LŠL›LªL¹LÈLÛL0íL M(M)GMqMŠM ‘M ŸM)­M-×M+N)1N[N"tN—N!¶N ØN æNñNOO#O6OFOUOgO {O ˆO –O O©O½OÖOðO÷OPP6PIP aPoP"ˆP"«PÎP ãPîPþPQQ.QGQYQ!lQŽQ £Q®Q ÇQ ÑQÞQúQ R R)R0R AR NR ZR gR#qR •R R°R ÎR.ÜR S S'S@S QS\SwS‡S žS«SºSÀS)ÝSTT.T>T MTYT'hT TžT¾TÒT ëTöTU-UEU\UvUŒU¬UÃUÚUíUVV-V>VMV]VuVˆV ¨V µVÃV ÝVëV W WW3W'LWtW ŒW™W¯W ¾W ßW#ëW!X1XIX OXZXlX ‚X £X¯XÀXÈX æXòX Y#Y;YBYXYjYzY –Y£Y²YÂY ÕY àYîYZ Z"Z 'Z 3Z?ZQZ XZ5eZ#›Z+¿Z2ëZ1[0P[+["­[ Ð[ Ü[è[Eý[C\^\y\’\«\¾\ Í\Ù\ê\2ÿ\2]JQ]Jœ]"ç] ^)^*I^t^„^•^ µ^ ¿^Í^à^ û^ __"_.B_q_0_À_Ü_ó_`'$`L`e`~`&•`"¼`ß`Aö`8aMafaƒaža)¹aãa'ùa!b2b#Gb'kb'“b»bÚbñb c)cAc'Wc6c¶cÒcëc0d17d idŠdC¥déd4e65e.le"›e¾e#Ûeÿe*fIf \f}f$f$Âfçf,g.gAg Zg{g ™g ¦g ±g ¾gËgÓg Ügægìgógüg h hhhh"h&Bhihmh vh—h·h Òh Þhìhi i i !i+iBi1Ii {i†ii i §iµiÊi ãi"íi j1jEjKj]j vj)—jÁjÈj ÐjÛj ãjíj k k=kLk`kwk{k k' k Èk Ók àkîk ök ll'l$Glll#ql•lžl¥l®l ³l#Àläl íl÷lmm :mHmYmqm„m‹mm•m™m m³mÆmÜmñm úm n n !n +n 5n?nCnInPn Xnen vnƒnŒnœn²nÏnÖnén oo o7"o9Zo”o ¯o »oÇoÛoào õo ÿo pp/p 3p?pCp GpRpkp npxp €p ‹p —p £p­pÀpÅpÌpÛpàpépüpqq#q'q/qIqYq^qoqsq xq ™q¦q­q³qÉqâqùqr r&r +r6r?r Qr\r _r mrwr~r ƒr ‘rŸr£r§r°r´r¼r ¿r ÊrØrßrär ür ss(svGv Pv[vcvkvov†v›v ±v¼v Ñv Ývëv!òv"w"7wZwrwww †w ’w w°w ÀwËwÏwäwíwxxx,x=xFx)[x4…xGºxy&y'@yJhy?³yHóy% S `l}'–.¾@í=.#l ±Íë,‘3/‘Hc‘¬‘¾‘Þ‘"ð‘ ’ ’8’Q’1n’ ’´’Ì’ ë’ø’ “!“+:“!f“"ˆ“ «“·“Γ é“õ“ ” ” ”*”G”+W” ƒ”"”5°”æ” • • •7'•-_•*•(¸• á•"–%–(D–m– |–‡–˜– ¸––à– ý– ——.—D— U—a—j—~—!—— ¹—Ä—Ô—è—˜˜5˜F˜8a˜"š˜½˜Ô˜è˜ ™™™/™K™_™ t™•™ °™»™ Õ™ ß™ì™ý™š,š<šCš \š iš uš ‚š#š ±š½š Íš Úš.çš›/›?›[› m›x›“›£›¹› țԛڛ9ú›4œCœ]œrœ ˆœ•œ(¥œΜ)çœ*HWu§¾Øöž%-žSžfž„ž”ž ©ž¶žÇžÙž ÷ž"Ÿ;ŸJŸ\Ÿ xŸ†ŸœŸ¥ŸŸÛŸ-÷Ÿ%  B N  ] j  Š  – ·  × ø  þ  ¡#¡-C¡q¡ Œ¡ 𡦡 á"Ñ¡$ô¡"¢<¢D¢Z¢ m¢#x¢ œ¢ª¢¹¢É¢ Ý¢ è¢ö¢£ £*£ 0£<£M£_£f£@v£-·£3å£K¤1e¤:—¤=Ò¤+¥<¥ M¥Y¥Zl¥Ç¥à¥ö¥¦$¦ 6¦C¦S¦e¦J{¦#ƦVê¦XA§/š§ʧ,ã§%¨6¨F¨W¨ u¨€¨¨¡¨ ¼¨ʨÞ¨#ç¨6 ©2B©5u©«©É©%驪2)ª\ª {ªœª+·ª)ãª$ «N2«« «%¾«%ä« ¬'$¬L¬,f¬“¬¥¬*»¬2欭,7­d­.ƒ­(²­Û­û­*®;@®|®&›®®;Ü®7¯$P¯(u¯Už¯ô¯6°BJ°8°+ưò°# ±+1±1]±±ª±&»±â±(ü±%%²8K²„²Ÿ²'¼²ä²³ ³³³³$³*³;³A³ J³U³[³q³y³³‡³ ‹³'¬³Ô³سà³+ÿ³%+´ Q´ ]´k´´…´ ˜´ ¤´¯´ Ë´1Õ´ µµµ!µ)µ8µNµdµ7lµ6¤µÛµïµ÷µ#¶'7¶5_¶•¶ ¶ §¶µ¶»¶öâ¶%ú¶ ·+·;· X·f· j·)‹· µ· ¿·Ë·Ú· â·ð· ¸1¸3D¸x¸&¸¦¸®¸´¸ ¼¸ǸÚ¸ õ¸ÿ¸$¹3¹.:¹i¹¹’¹ª¹¼¹˹ϹÕ¹Ù¹â¹ù¹ º'º@º HºRºeº vº ‚º º ™º¦º ­º ¸º º̺ æºôºûº»)»F»K»)g»‘»™» ¢»B­»>ð»"/¼ R¼`¼t¼ˆ¼¼ ¤¼ ¯¼º¼ʼã¼ç¼ú¼þ¼½½0½3½ <½F½ W½b½r½‚½š½Ÿ½¦½»½Á½Ž ؽâ½0ç½¾ ¾&¾ =¾K¾P¾d¾u¾%z¾  ¾­¾´¾¸¾Ͼë¾ ¿¿ -¿8¿A¿ S¿]¿ t¿€¿…¿ œ¿¨¿±¿·¿È¿Ø¿Ü¿â¿ê¿î¿ö¿ ù¿ ÀÀÀ!À <À FÀTÀhÀ†ÀDÀ.âÀÁ(Á(<Á,eÁ’Á ²Á#½Á"áÁ ÂÂ!ÂA JÂUÂZ jÂtÂ?‰ÂÉÂÑÂå ôÂÃ, Ã,8Ãeà xÃà –Ã. Ã Ïà ðÃúà ÄÄÄ#Ä'Ä?ÄXÄqÄ„Ä–Ä§Ä ·ÄÂÄ1àÄ*Å=Å]ÅdÅ zňśŠ®Å¼ÅÌÅÐÅçÅðÅ ÆÆ(Æ 8Æ BÆLÆ+dÆ9ÆKÊÆÇ.3Ç/bÇX’Ç;ëÇM'È-uÈ+£ÈUÏÈ!%É)GÉ/qÉ5¡É,×É(ÊZ-Ê@ˆÊ"ÉÊ@ìÊ-Ë6Ë<Ë-DËrËxË|˂ˇˡË=ÁË ÿË Ì 'Ì 4Ì ?ÌLÌ \ÌgÌ oÌ2|̷̯̾Ì:ÑÌ Í(ÍD8ÍB}ÍAÀÍ>ÎAÎ]ÎaÎ gÎ$ˆÎ"­ÎKÐÎ2Ï,OÏ |Ï+‡Ï/³Ï ãÏíÏ Ð +Ð 8ÐFÐOÐaÐsЉРŽÐ˜Ð¡Ð#¾Ð âÐîÐÑ!Ñ!*Ñ(LÑuшÑÑ)”Ñ ¾ÑËÑ ßÑíÑôÑ ÒÒÒ ÒE5Ò*{Ò2¦Ò#ÙÒ/ýÒ-Ó2CÓ9vÓ °Ó ¼ÓÈÓÐÓ ÙÓåÓõÓ!ýÓÔ $Ô.ÔBÔUÔZÔ_ÔdÔ#tÔ ˜Ô¢Ô§Ô¯Ô ·Ô ÂÔÌÔÝÔõÔ(úÔ##ÕGÕMÕ\ÕlÕ}Õ$“Õ ¸ÕÃÕßÕ4öÕ+Ö 2Ö <Ö]Ö fÖ%pÖ –Ö ·ÖÁÖ ÜÖéÖòÖ× ××+×1×8×N×U×h× q×{×"‹× ®×¸×0Í×%þ×($ØMØ"TØ wØ„Ø‡ØØèT¤¬ O^g]Ëß>Ï Z,$˜Â(¼õŸˆ°ìÂ`ŒŽÛe»î7bo}ýp¾Љ*ªí!fwG\Žå aÝ÷ªË ¿ù¸KiH é:ÙYw0çrÉuDVæ„gFsØ8ïa¹h,߬`\ØhëM˜«ëŠáÜ^à" %xeñœVÚ„štß:dfIšã£9ÈH€Ê~Q¯Ûè¿aBv °}ä›pPýö=n€ÄÕ8­`”–êë{óX”t+4€×W´ÜÔE!µÆ¡¬áA²§÷L¥k"w©#™K¦˜õôjšð ™æXÍ Ã_*ÚT¸²i–h”ÃÞ|º;ö#yωLÀøN5‰Ñ6=´K¼ó ýCüá[­î7Ž"rÝ0ðФd2ŠÔz›=Ö È'&³¥A]¼¶-Ó̃ÞvòYÊÏO“Ó]¡ÅçY5Ùxùÿ†Õ©.—A>N »B«fP FSˆ½ÝìÆ9¢/<Jjµ¹{¨Hé…LGòÊM‘3}l$œ¢~Ò-m´"­±ƒ„À>ð¾rû·³Å@X¸+ê’Ô/b1Ÿ#þ\ÑÐóã½øV)&.4uÒkÄâñ²ž:C§[ªô¹c U¾#íÖCþRB< ȶcnÓ™üú6Ûeû0 FZ±‘’Z%[()®ïù7Nqú³Î ïIü 濺2Ÿ3oœ¯ËJ81%jí 'ÑiÂ?ˆ»£ή‚Õ$Ìþÿ'SâD,c‚{¡Pž lÅ<x6¯Œò-·u×Ä^Q‹º D§àÁRÁ“ •ÒzE·¥†R3¶•ÿŒÃ‚W&JÌs°Ç®IQ.yU¢ÚÖ—sätgž÷É âmz~ÙÍSགྷøåbqç dƨök‘¨…m“+ *yìǦ›ä‡õ@Í G1…?ñ×@_?‹|±Eúô‹ln—)î’U$‡!Фã;(å9•2†pµ!ûoÜqÎW–è; ÀêÉéMØ/«‡|4O5T©Ç£v¦Þ_Á You can verify it in the OTR options. accountname: primary: protocol: recipient: secondary: title: username: --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --debug, -d enables debug info logging --help display this stuff --no-xtitles, -T disable xterm titles --offline, -o set all protocols status to offline upon start --version, -v show the program version info -S, --status change the current IM status. Status; o, _, a, d, n, c, f, i -n, --number mobile number to send an event to (sms only) -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, jab, rss, lj, gg or infocard -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Account: Account: Accounts.. Active fingerprint: Age : %s Age range : %s All protocols Already logged in only Always online non-IM contacts for : %s Anti-spam: ignore authorization requests: %s Anti-spam: kill msgs from users not on the list : %s Anti-spam: use captcha to identify bots: %s Arrange contacts into groups : %s Ask before quit : %s Assign PGP key.. Authorization required : %s Auto Presence Status Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Automatically set N/A when screen is detached : %s Avatar file : %s Backdated entry : %s Birthdate : %s CENTERIM %s UNSENT: %lu Cellular phone : %s CenterIM config options CenterIM configuration Change color scheme to : %s Change default request authorization message Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Chat panel height : %d Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Codepages conversion Color contacts according to: %s Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable vi bindings: %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users Fingerprint: First name : %s For protocols : %s Forget key Gender : %s General Groups HTTP browser : %s HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Import friend list : %s Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Joined since the last check only Key passphrase: %s Keywords Keywords : %s Language : %s Last name : %s Leave channel Left panel width : %d Link an RSS feed Link an RSS feed LiveJournal posting: attributes Local charset : %s Location Log panel height : %d Logging Login : %s Look for online only : %s Mass group move.. Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network NickServ password (optional) : %s Nickname Nickname : %s OTR options and fingerprints Online only Online/offline events in the log window : %s OpenPGP key: %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Please type 'yes' or 'no': Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Priority : %s Private keys Protocol: Protocol: Proxy only for HTTP (rss and lj) : %s Public keys Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remote charset : %s Remove channel del Request authorization Request receipts: %s SMTP server : %s Screen socket path : %s Search parameters Search profiles Search service Secured : %s Security : %s Select PGP key to use Send OS info: %s Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Set external status Show opened chats : %s Show users who have you on their list Sort contacts by : %s State : %s Street address : %s Subject : %s Switch to language preset : %s Tags : %s Timestamps in the log window : %s Timestamps include seconds : %s Turn PGP encryption %s UIN UIN : %s Unassign PGP key Update user details Use X to report idle time : %s Use no key User interface User: Users with photos only : %s Verified: View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [OPTION]... [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM of password: priority: server address: uin: user name: ! Correct path or disable screen auto presence change! Screen socket path doesn't exist!! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu" not found%lu minutes%s [%s] comes online%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit%s from %s, received on %s%s has been deopped by %s.%s has been kicked by %s%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s is now %s, was %s%s or %s to close, Up/Down and PgUp/PgDn to scroll%s search, %s again, %s cancel%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb%s to %s has been put to the queue%s to %s, sent on %s%s to URLs, %s external actions, %s close%s to URLs, %s to full-screenize, %s close%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ ERROR: captcha disabled: no questions found!+ Set N/A after screen detach+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [gg] cannot resolve %s+ [gg] connection failed+ [gg] connection lost+ [gg] connection to the server failed+ [gg] no away message from %s, %s+ [icq] cannot connect+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nick password sent+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] cannot connect: + [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)+ [yahoo] cannot login+ [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] cannot login: username doesn't exist+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ [yahoo] server closed socket+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ new mail arrived, %d messages+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptActivityAddAdd to listAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAvatar fileAvatar file: Awaiting authorizationAwayAway message:BackgroundBirthdateBlock channel messagesCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChange statusChannel chat historyChannel topic now is: %sChannel: Charset to convert messages from: Charset to convert messages to: Chat panel height: CheckCheck frequency: Check the new password: Check the password you entered: Choosen screen socket path doesn't exist!City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DNDDecDefault Jabber conference serverDefault authorization request message: DepartmentDepartment: Description: DetailsDetect musicDisconnectedDo not disturbDo you want to forget the selected key?Do you want verify the selected key?DoneDrop the account information first!E-Mail: E-mailE-mail: EditEdit detailsEmpty authorization request messageEncodingEncryptedEnter birthdate (DD-MM-YYYY): ErrorError calculating FingerprintEvent historyEvent recipientsEvents sending options:External actions..FailedFaxFax: FebFemaleFetch away messageFetch version infoFetching your detailsFile transfer statusFinishedFirst name: Force checkFree for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:German UTF-8Go aheadGo to contact..HTTP browser to use: HTTP proxy server hostname: HandleHide offline usersHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIgnore userIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLeft panel width: LinkLink: List nicknamesLoadLocationLog panel height: MaleMarMass move selected users to..MayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: NoNo EncryptionNo JabberNo OTRNoneNot availableNot specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOut for LunchOutgoing %sOutgoing %s to %sPGP encrypt error: PGP key passphrase: PGP key search: type to find, %s find again, Enter finishPGP key selection: %s for quick lookupPGP passphrase required: PGP sign error: PING reply from the user: %d second(s)Password must be at least 6 chars longPassword must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: PlaintextPlease join my conference.PolishPosition: PostPosting subject: PrevPublished on: QuickSearch: type to find, %s find again, Enter finishRSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?Remove userRenameRename contactReplyReport bugs to http://bugzilla.centerim.org/.Result of the external action %s:RetreiveRetrieveRetrying..RomanceRussianSMSSMTP server hostname: Screen socket path: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSelect contacts to moveSendSend a messageSend an URLSend contactsSend contacts..Sending requestSent on %sSepServer-based contactServer: Show offline usersState: Status and ActivityStatus and NameStreet address: StudentsTags for the entry: The Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesThis is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnBlock channel messagesUnable to connectUnable to connect to icq server. Retry?UnknownUnset ignore userUnverifiedUsage: User infoUser's detailsVerifiedVersionVisible listWait a moment. Your details haven't been fetched yetWarningWorkWrong Jabber ID!Wrong nickname given, cannot registerYesYou have to disconnect the service first!You must be logged to the Gadu-Gadu network to update your detailsYou must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: [OTR] Connection is insecure...[OTR] Connection is now secure...[OTR] Ending secure session with "[OTR] Error while encrypting message... no message sent![OTR] Error: At the moment, only jabber is supported[OTR] Error: inject_message_cb, recipient "[OTR] Log: [OTR] Received unknown fingerprint from "[OTR] Trying to start a secure session with "abortadding %s to the contactsaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: connecting to the servercontact list quick searchcontactscould not create socketcould not resolve hostnamecouldn't fetchdarkdaysdirectory to save the file(s) to: disabledisconnecteddon't changedonedual login detectede-mailerreventevent from %s (%s)event sending error: error creating directory for the contactevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfoundfriends onlyfull-screen viewhoursicq disconnection reasonidleignoredincoming %s from %sincorrect PGP passphraseinitlInklOadlogged inmembers list fetching finished, %d foundmessageminmode 1mode 2move Downmove Upn/anew MSN friendly nick: nono or tag foundno or tag foundnonenot foundnot usednotificationoutgoing %s to %spassword was changed successfullypassword: pgp key quick searchpgp key selectionpost new entries to your journal.privateprotocolpublic (visible to all)rEmovereason: %sregistration is not supportedremoving %s from the contactssAvesearch finished, %d foundsearch for: secondsset by %ssocket problemssound cardspeakerstartstatusstatus change error: successthe message was: turboingunknownunknown IM typeunknown status character was givenuseduser info for %susername and password mismatchverify the hostname and portverify the pager host and port enteredworkwrong or tagwrong XMLyesyes/noyou are an op hereProject-Id-Version: centerim 4.22.6 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2009-11-19 23:05+0100 Last-Translator: Boris Petersen Language-Team: German Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Du kannst das in den OTR Optionen prüfen Accountname: Primär: Protokoll: recipient: Sekundär: Titel: Benutzername: --ascii, -a benutze ASCII-Charachters für Fenster und die UI-Kontrolle --basdir, -b setzt einen individuellen Grundordner --bind, -B binde an eine bestimmte IP --debug, -d gibt debug und Fehlermeldungen aus --help zeigt diese Hilfe an --no-xtitles, -T keine xterm Titel --offline, -o setze beim Start alle Protokolle auf offline --version, -v zeigt die Programmversion an -S, --status ändert den aktuellen Status; o, _, a, d, n, c, f, i -n, --number Handynummer um eine SMS zu senden -p, --poro Protokoll, das kan sein: icq, yahoo, msn, aim, irc, jab, rss, lj, gg oder infocard -s, --send Ereignis Typ; das können sein: msg, sms oder url -t, --to UIN oder Nick der Zielperson %s: Details 1. Sprache : %s 2. Sprache : %s 3. Sprache : %s bestätigen, abbrechen oder bestätigen, abbrechen Über Konto: Konto: Konten...Aktiver Fingerprint: Alter : %s Alter: %s Alle Protokolle Nur bereits eingeloggte Always online non-IM contacts for : %s Anti-Spam: Ignoriere Berechtigungsanfrage: %s Anti-spam: Lösche Nachr. von Leuten außerhalb der Liste : %s Anti-Spam: benutze ein Captcha um Bots zu identifizieren: %s Kontakte in Listen einteilen : %s Fragen vor dem Schliessen : %s PGP Schlüssel zuweisen... Berechtigung benötigt : %s Auto Presence Status Automatisch »weg« nach (Min.) : %d Automatisch »nicht verfügbar« nach (Min.) : %d Automatisch »nicht verfügbar« nachdem dem screen detached wurde : %s Avatardatei: %s Zurückliegender Eintrag : %s Geburtstag : %s CenterIM %s NICHT VERSENDET: %lu Handy : %s CenterIM Einstellungen CenterIM Konfiguration Ändere Farbschema in : %s Ändere standard Autorisierungsanfragennachricht? Spitzname ändern Passwort ändern : %s Ändere Soundausgabe zu : %s Kanal : %s Chat Modus : %s Chat Modus für : %s Chat Höhe : %d Überprüfungshäufigkeit (Minuten) : %lu Überprüfe lokale Mailbox : %s Überprüfung des Passworts : %s Stadt: %s Codepages conversion Färbe Kontakte nach: %s Kommentar Kommunikation Firma: %s Kontaktliste Land: %s individuelle Stimmung : %s Abteilung: %s Detaillierte Logs in ~/.centerim/log : %s Details verhindere auto formatierung : %s verhindere das senden von Kommentaren per email : %s Kommentare verbieten : %s löschen E-Mail: %s Email : %s Abwesenheitsnotiz bei Statusänderung bearbeiten : %s Bidirektionale Sprachunterstützung : %s Emacs keybingings im Texteditor : %s Erlaube peer-to-peer Kommunikation : %s Aktiviere vi Tastenbindung: %s Enable web status indicator : %s Enter sendet Nachricht : %s Mit Enter Nachrichten verschicken : %s Fancy Stuff Fax : %s Feed Parameter Überwachung Dateiübertragung Dateien Benutzer suchen/hinzufügen Benutzer suchen/hinzufügenFingerprint: Vorname: %s Für Protokoll : %s vergiss den Schüssel Geschlecht: %s Allgemein Listen HTTP Browser : %s HTTP Proxyserver : %s Verstecke Offline Benutzer : %s zu Hause Homepage : %s IM Accountmanager Importiere Freundesliste : %s Eingehend von %s In Konferenz einladen... Kanal beitreten Kanal/Konferenz beitreten einem/n Kanal / eine/r Konferenz beitrehten / erstellen Joined since the last check only Schlüsselparole: %s Schlüsselwörter Schlüsselwörter : %s Sprache: %s Nachname: %s Kanal verlassen Breite linkes Fenster : %d RSS Feed verlinken RSS Feed verlinken LiveJournal posting: Attribute Lokaler Zeichensatz : %s Herkunft Log-Höhe : %d Logging Login : %s Nur online : %s Gruppen Massenverschiebung... Verschiedenes Stimmung : %s Mehr In Liste verschieben... Musik : %s Name : %s Name/Titel Netzwerk NickServ Passwort (optional) : %s Spitzname Spitzname: %s OTR Optionen Nur Online Online/Offline Ereignisse im Logfenster : %s OpenPGP Schlüssel: %s Einstellungen Kontaktlisten organisieren Ausgehend an %s Passwort Passwort (optional) : %s Passwort : %s Neues Passwort : %s Telefon : %s Bild : %s Ping Bitte tippe 'ja' oder 'nein': Portrange die für peer-to-peer benutzt werden soll : %s Position: %s Zum Journal senden : %s Dringlichkeit : %s Privater Schlüssel Protokoll: Protokoll: Proxy nur für HTTP (rss und lj) : %s Öffentlicher Schlüssel Zitiere Nachrichten beim Antworten : %s zufällige Chat Gruppe Zufällige Chat-Gruppe : %s Registrieren Im %s Netzwerk registrieren Registrierungsparameter Registrierungsvorgang Registrierungsdienst Speichere Passwort : %s Entfernter Zeichensatz : %s Lösche Kanal del Berechtigung anfordern Empfangsbestätigung anfordern : %s SMTP Server : %s Pfad zum Screen Socket : %s Suchparameter Durchsuche Profile Suchdienst gesichert : %s Sicherheit : %s Wähle einen PGP Schlüssel Sende Betriebssysteminfos : %s Sende eine Kanalnachricht enter SMS versenden Datei(en) senden Sende Datei(en) an %s, %lu Server : %s Server Adresse : %s Dienst Abwesenheitsnotiz eingeben Setzte externen Status Zeige offene Chats an : %s Zeige Benutzer die Dich auf der Liste haben Sortiere Kontakte nach: %s Staat: %s Straße : %s Thema : %s Wechsel zu Sprache : %s Tags : %s Zeitstempel im Logfenster : %s Zeitstempel mit Sekunden : %s Schalte PGP Verschlüsselung %s UIN UIN : %s PGP Schlüssel entfernen Benutzerdetails aktualisieren Verwende X um Untätigkeit festzustellen : %s Benutze keinen Schlüssel Oberfläche Benutzer: Nur Benutzer mit Foto : %s Bestätigt: Betrachte/bearbeite Ignorierliste Betrachte/bearbeite Unsichtbarliste Betrachte/bearbeite Sichtbarliste Beruf XML export URL : %s Deine %s Details PLZ : %s [Ctrl-X speichern, Esc abbrechen] [OPTIONEN]... [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ Netzwerk [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM von Passwort: Dringlichkeit: Server Adresse: UIN: Benutzername: ! Korrigiere Pfad oder schalte screen's auto-status-Änderung ab! Der Pfad zum Screen Socket existiert nicht!! Eine weitere laufende Kopie von centerim entdeckt! Verbindung nicht herstellbar, der freie Plattenplatz ist geringer als 10k! Weniger als 10k Plattenplatz frei, gehe offline! oder wir werden Ereignisse oder Konigurationen verlieren! Unterstützung für %s wurde beim Programmbau ausgeschaltet! Das könnte Probleme verursachen. PID %lu" nicht gefunden%lu Minuten%s [%s] kam online%s Kontakt-Menü, %s Ändere Status, %s Allgemeine Aktionen, %s/%s vor/zurück, %s Beenden%s von%s, erhalten am %s%s wurde von %s deopt%s wurde von %s gekickt%s wurde von %s geopt%s hat dich deopt%s tritt ein%s ist gegangen%s hat dich geopt%s ist nun %s, war %s%s oder %s zum schließen, Hoch/Runter und Bildhoch/Bildrunter zum srollen%s suchen, %s nochmal, %s abbrechen%s senden, %s mehrere, %s/%s vor/zurück, %s Gesch., %s URLs, %s vergrößern, %s info%s senden, %s mehrere, %s/%s vor/zurück, %s Gesch., %s URLs, %s vergrößern, %s Mitgl.%s nach %s wurde der Warteschlange hinzugefügt%s zu %s, gesendet am %s%s zu URLs. %s externe Aktion, %s schließen%s zu URLs, %s Vollbild, %s abbrechen%s ging offline%s: ging offline%s: kam online, mit status %s(standard)(nichts/eigen)* Berechtigung : * Berechtigungsanfrage : * Kontakte : * Dateiübertragung* SMS : + %s wurde in die Liste aufgenommen+ FEHLER: Captcha ausgeschaltet: keine Frage gefunden!+ setze nich verfügbar nach screen detached wurde+ [%02d:%02d:%02d] Neue Mail erhalten, %d Nachrichten+ [%s] Automatisch %s gesetzt+ [%s] Status wiederhergestellt+ [aim] Verbindung fehlgeschlagen: %s+ [aim] Passwort gesendet+ [aim] Kein Verbindungsaufbau zum Server möglich+ [gg] Kann %s nicht auflösen+ [gg] Verbindung fehlgeschlagen+ [gg] Verbindung verloren+ [gg] Verbindung zum Server fehlgeschlagen+ [gg] Keine Abwesenheitsnotiz von %s, %s+ [icq] Verbindung nicht herstellbar+ [icq] bekomme keine Abwesenheitsnotiz von %s, %s (vielleicht keine gesetzt?)+ [icq] Verbindung getrennt+ [icq] SMS an %s fehlgeschlagen+ [icq] SMS fehlgeschlagen an: %s, %s+ [irc] Verbindung fehlgeschlagen: %s+ [irc] Passwort gesendet+ [irc] Spitzname erfolgreich geändert+ [irc] Passwort gesendet+ [irc] Keine Verbindung zum Server möglich+ [jab] Fehler %d+ [jab] Fehler %d: %s+ [jab] keine Abwesenheitsnotiz von %s, %s+ [jab] Kein Verbindungsaufbau zum Server möglich+ [jab] melde vom %s Agent ab+ [lj] %s wurde zu den Freunden hinzugefügt+ [lj] HTTP fehlgeschlagen: %s+ [lj] Freund konnte nicht hinzugefügt werden+ [lj] Fehler beim Löschen des Freundes+ [lj] Login fehlgeschlagen: %s+ [lj] schreib Fehler: %s+ [lj] erfolgreich geposted, die id ist %s+ [lj] Der Benutzer wurde von deiner Freundesliste entfernt+ [lj] Benutzer lookup beendet+ [msn] Verbindung nicht herstellbar: + [msn] E-Mail von %s, %s+ [msn] Umgekehrtes Benutzer auflisten beendet, %d gefunden+ [msn] Ungelesene E-Mail: %d im Eingang, %d in Ordnern+ [yahoo] ein weiterer Login erkannt+ [yahoo] Verbindung nicht herstellbar: + [yahoo] kann Abwesenheitsnotiz von %s, %s nicht bekommen (vielleicht keine gesetzt)+ [yahoo] Kein login möglich + [yahoo] Enloggen umöglich: Das Konto wurde gesperrt+ [yahoo] Einloggen unmöglich: Benutzer und Passwort passen nicht+ [yahoo] Einloggen unmöglich: Benutzer existiert nicht+ [yahoo] Direkte Verbindung fehlgeschlagen+ [yahoo] Email von %s, %s+ [yahoo] verlasse die %s Konferenz+ [yahoo] Server hat den Socket geschlossen+ kann keine Abwesenheitsnotiz holen wenn offline+ Letzte Nachricht von: %s+ %s ausgeführt+ Neue E-Mail erhalten, %d Nachrichten+ hier gibt es keine URLs+ keine externe Aktion für %s definiert+ keine vergangenen Einträge für %s+ Die %s-Konfiguration wurde geändert, wird neu geladen+ Der Benutzer ist zurück+ Zum Entsperren %s besuchen+ %s befindet sich bereits in der Liste+ Du musst dich erst einloggenÜ-202. EmailÜ-30Ü-40Ü-50Ü-60ÜberannehmenAktivitätHinz.Zur Liste hinzufügenAdresseAlterAlter: AprWillst du %s wirklich entfernen?Willst du die Liste wirklich entfernen?AugAutor: Auto-»weg«-Dauer (0 = aus): Auto-»nicht-verfügbar«-Dauer (0 = aus): Automatisch der Konferenz beigetretenAvatardateiAvatardatei: erwarte AutorisierungwegAbwesenheitsnotiz:HintergrundGeburtstagKanalnachrichten blockierenAbbrechenKann keine Übertragung entfernen die noch läuftKategorie: HandyHandy: ÄndernStatus ändernVergangene EreignisseDas Topic ist nun: %sKanal: Charset aus dem Nachrichten konvertiert werden sollen: Charset in das Nachrichten konvertiert werden sollen: Chatfenster Höhe: PrüfenÜberbrüfungshäufigkeit: Überprüfung des neuen Passworts: Überpfrüfe das eingegebene Passwort: Der gewählte Pfad zum Screen Socket existiert nicht!Stadt: KommentarBemerkungen: FirmaFirma: Verbinde mit dem Server %s ...Kontakt zum HinzufügenDerzeitige Konferenzmitglieder sind: Stimmung: Spiele gerade: Individuelle Statusnachrichtnicht störenDezStandard Jabber-Konferenz ServerStandard Autorisierungsanfragennachricht:AbteilungAbteilung: Beschreibung: Detailserkenne MusikVerbindung getrenntnicht störenWillst du den ausgewählten Schlüssel vergessen?Willst du den ausgewählten Schlüssel bestätigen?FertigLösche erst die Accountinformationen!Email: EmailEmail: BearbeitenDetails bearbeitenLeere BerechtigungsanfrageKodierungVerschlüsseltGeburtsdatum eingeben (TT-MM-JJJJ): FehlerFehler während des berechnen des FingerprintsVergangene EreignisseEreignisempfängerEreignis Sendeoptionen:Externe Aktion...fehlgeschlagenFaxFax: FebweiblichHole AbwesenheitsnotizHole VersionsinfoDeine Details werden geholtDatenübertragungsstatusBeendetVorname: Prüfung erzwingenfrei zum ChattenHäufigkeitFreund vonGanzer NameweiterleitenSpieleGeschlechtAllgemeinAllgemeinAllgemeine Einstellungen:Deutsch UTF-8WeiterGehe zu Kontakt...Browser der benutzt wird: Name des HTTP Proxyservers: NameOffline Benutzer versteckenGeschichte von %s, %d Aktionen insgesammtZuhauseHomepageHomepage: Mir gefällt die Standard %s Abwesenheitsnotiz von %s %s wirklich.Das Standard-AIM-Profil von centerim %s gefällt mir wirklich.Alle Handlungen von %s ignorieren?IgnorierlisteBenutzer ignorierenAnkommend %s von %sInfoInformationen über %sInteressenunsichtbarUnsichtbarlisteIn Konferenz einladen...Janbetreten/erstellenJulJunSchlüsselwörter: Gekickt von %s; Grund: %sLJSprachenLetzte IPZuletzt geprüftNachname: Letzes ErgebnisZuletzt gesehenLinkes Fenster Breite: LinkLink: Spitznamen auflistenLadenOrtLogfenster Höhe: männlichMärGewählte Benutzer gemeinsam verschieben nach...MaiNachrichtNachricht vom Server: Handynummer: MehrVersch. zu Kontaktenicht verfügbarNameName für eine zu erstellende Liste: Name/Titel: Name: NieNeue UIN erhalten, %luNeuer Name für die Liste: Neuer Nickname zum anzeigen: Neues Passwort: Neuer Profilname: Neue SuchenächsteNächste PrüfungSpitznameSpitzname einstellen: Spitzname: NeinKeine VerschlüsselungKein JabberKein OTRkeinenicht verfügbarnicht angegebenNovJetztbesetztOktofflineOkalte EmailIn Kanälen: onlineöffnenOrganisiere Kontaktgruppenzum EssenRausgehend %sRausgehend %s an %sPGP Verschlüsselungsfehler: PGP Schlüsselparole: PGP Schlüsselsuche: Tippen zum Finden, %s wieder Suchen, Enter EndePGP Schlüssel Auswahl: %s für schnelle SuchePGP Parole benötigt: PGP Signierfehler: PING Antwort vom Benutzer: %d Sekunde(n)Passwort muss mindestens 6 Zeichen lang seinPasswort muss eingegeben werdenPasswort: Passwörter stimmen nicht überein!Peer-to-peer Portrange (min-max): TelefonTelefon: KlartextBitte trete meiner Konferenz bei.PolnischPosition: PostPosting Thema: vorherigeVeröffentlicht am: Schnellsuche: Tippen um zu finden, %s wieder Suchen, Enter EndeRSS docZufälliger ChatterErhalten am %szurückweisenLöschen%s ebenfalls aus der Kontaktliste entfernen?Entferne die %d Kontakte auch aus der Liste?Benutzer entfernenUmbenennenKontakt umbenennenantwortenFehlerberichte an http://bugzilla.centerim.orgErgebnis der externen Aktion %s:EmpfangenEmpfangeWiederhole...RomantikRussischSMSName des SMTP Servers: Pfad zum Screen Socket: Suchergebnisse [beendet]Suchen/HinzufügenSuche Kontakte...Suchende MännerSuchende FrauenAuswählenWähle Liste für den KontaktWähle Liste aus, in die der Benutzer kommen sollWähle Kontakte zum Aufnehmen in die ListeWähle Kontakte zum VerschiebensendenEine Nachricht sendenURL versendenKontakte versendenKontakte senden...Sende AnfrageGeschickt am %sSepserverseitiger KontaktServer: Offline Benutzer anzeigenStaat: Status und AktivitätStatus und NameStraße: StudentenTags für den Eintrag: Die Jabber ID wurde erfolgreich registriertDie folgenden Benutzer haben dich als Freund aufgeführt:Das Profil mit diesem Namen existiert bereits. Willst Du es überschreiben?Die Gegenstelle verwendet %sDas angegebene Verzeichnis ist nicht vorhandenDas angegebene Verzeichnis ist nicht schreibbarDer Benutzer %s (%s) hat dich in ihre/seine Kontaktliste aufgenommen Journaladresse: %sDer Benutzer %s hat deine Einladung zur Konferenz abgelehntDer Benutzer %s hat dich in die %s-Konferenz eingeladen, das Thema lautet: %sDer Benutzer %s ist der Konferenz beigetretenDer Benutzer %s hat die Konferenz verlassenDer Benutzer %s hat dich von seiner/ihrer Freundesliste entfernt Journal-Adresse: %sDer Benutzer hat heute GeburtstagDer Benutzer hat deine Anfrage akzeptiertHat dich in ihre/seine Kontaktliste aufgenommenDer Benutzer änderte seinen Spitznamen von %s auf %sDer Benutzer hat keine Profil Informationen.Der Benutzer hat deine Anfrage abgelehntDer Benutzer hat dich von seiner Kontaktliste entfernt (abbestellt, in der Jabber-Sprache)Der Benutzer möchte deinen Anwesenheitsstatus verfolgen dürfenDies ist dein LifeJournal Account.Zeitüberschreitung beim warten auf eine neue UIN. Wiederholen?ZeitzoneTitelTitel: Registrierung von %s bei %s wird versucht ...UIN: URLURL: URLsKanalnachrichten erlaubenKein Verbindungsaufbau möglichVerbindungsaufbau zum ICQ Server nicht möglich. Wiederholen?unbekanntBenutzer nichtmehr ignorierenunbestätigtGebrauch: BenutzerinfoBenutzerdetailsbestätigtVersionSichtbalisteBitte Warten. Deine Details sind noch nicht geholtWarnungArbeitFalsche Jabber ID!Falscher Spitzname angegeben, Registrierung nicht möglichJaErst die Verbindung zum Service trennen!Du musst dich bei Gadu-Gadu einloggen um deine Details zu bearbeitenDu musst dich erst bei ICQ einloggen um die Details zu beartbeitenDu musst dich bei Jabber einloggen um Deine Details zu bearbeitenDu musst dich bei MSN einloggen um Deine Details zu bearbeitenDeine Details wurden geholtPLZPLZ: [OTR] Verbindung ist unsicher...[OTR] Verbindung ist jetzt sicher...[OTR] beende sichere Sitzung mit "[OTR] Fehler beim Verschlüsseln der Nachricht... keine Nachricht gesendet![OTR] Fehler: Derzeit wird nur Jabber unterstützt[OTR] Fehler: inject_message_cb, recipient "[OTR] Log:[OTR] Empfing unbekannten Fingerprint von "[OTR] Versuche sichere Sitzung mit " zu startenAbbrechenfüge %s der Kontaktliste hinzuaim-Verbindung fehlgeschlagenwie verlangtAutorisierungabwesendAbwesenheitsnotizfalsches PasswortFalscher BenutzernameblauAbbrechenLöschenVerbindung nicht herstellbarverändere %s Status von %s nach %sKommentar: Verbinde mit dem ServerKontaktlisten-SchnellsucheKontakteSocket kann nicht erstellt werdenRechnername kann nicht aufgelöst werdenkonnte nicht holendunkelTageVerzeichnis zum Speichern von Datei(en): deaktivierenVerbindung getrenntnicht ändernFertigdoppeltes Login gefundenEmailerrEreignisEreignis von %s (%s)Ereignissendefehler: konnte für diesen Kontakt keinen Ordner anlegenEreignissendefehler: nicht genug ParameterEreignissendefehler: bei ICQ sind nur UINs erlaubtEreignissendefehler: unkown IM-typeEreignis-sende-Fehler: unbekannter Ereignis-TypEreignislog gestartetführte externe Aktion %s aus, es kam zurück = %dexternes Handbuch aufrufen %s, gab folgendes zurück = %dDateiname: Dateiname: Dateiengefundennur FreundeVollbildansichtStundenGrund der ICQ-Verbindungstrennungidleignoriertankommend %s von %sfalsche PGP ParoleinitLinklAdeloggte sich einMitgliederliste geholt, %d gefundenNachrichtMin.Modus 1Modus 2nach untennach obennicht verfügbarneuer MSN Friendly Nickneinkein oder Tag gefundenkein oder Tag gefundenkeinenicht gefundennicht verwendetBenachrichtigungrausgehend %s nach %sPasswort wurde erfolgreich geändertPasswort: PGP Schlüssel SchnellsuchePGP Schlüssel Auswahlbenutze Ihn um Einträge an Dein Journal zu schickenprivatProtokollöffentlich (sichtbar für alle)LöschenGrund: %sRegistrierung wird nicht unterstütztentferne %s von der KontaktlistespeichernSuche beendet, %d gefundensuche nach: Sekundengesetzt von %sSocket ProlemeSoundkartePC LautsprecherStartStatusStatuswechselfehler: ErfolgDie Nachricht war:turboingunbekanntunknown IM typeunknown status character was givenverwendetBenutzerinfo für %sBenutzername und Passwort stimmen nicht übereinüberprüfe den Hostname und den PortÜberprüfe den Host und Port des PagersArbeitfalscher oder Tagfalsches XMLjaja/neinDu bist hier opcenterim-4.22.10/po/insert-header.sin0000644000175000001440000000124011473011430014255 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } centerim-4.22.10/po/bg.gmo0000644000175000001440000020460211473011460012116 00000000000000Þ•$<?\2XC+YC…C™C­CÁCÕCéCýCKD6]D1”D5ÆD-üD/*EIZE8¤EWÝEG5Fh}F=æFH$G mG{GG£G·G*×GH H H !H-H CHNH_HnH'†H.®H6ÝH-I#BIfI}II­I*ÄI)ïI4JNJaJxJ‰J£J¹JÒJëJ. K8KJKaKKŽK©KÇK!àKL!L ;LGL!^L €LŠL›LªL¹LÈLÛL0íL M(M)GMqMŠM ‘M ŸM)­M-×M+N)1N[N"tN—N!¶N ØN æNñNOO#O6OFOUOgO {O ˆO –O O©O½OÖOðO÷OPP6PIP aPoP"ˆP"«PÎP ãPîPþPQQ.QGQYQ!lQŽQ £Q®Q ÇQ ÑQÞQúQ R R)R0R AR NR ZR gR#qR •R R°R ÎR.ÜR S S'S@S QS\SwS‡S žS«SºSÀS)ÝSTT.T>T MTYT'hT TžT¾TÒT ëTöTU-UEU\UvUŒU¬UÃUÚUíUVV-V>VMV]VuVˆV ¨V µVÃV ÝVëV W WW3W'LWtW ŒW™W¯W ¾W ßW#ëW!X1XIX OXZXlX ‚X £X¯XÀXÈX æXòX Y#Y;YBYXYjYzY –Y£Y²YÂY ÕY àYîYZ Z"Z 'Z 3Z?ZQZ XZ5eZ#›Z+¿Z2ëZ1[0P[+["­[ Ð[ Ü[è[Eý[C\^\y\’\«\¾\ Í\Ù\ê\2ÿ\2]JQ]Jœ]"ç] ^)^*I^t^„^•^ µ^ ¿^Í^à^ û^ __"_.B_q_0_À_Ü_ó_`'$`L`e`~`&•`"¼`ß`Aö`8aMafaƒaža)¹aãa'ùa!b2b#Gb'kb'“b»bÚbñb c)cAc'Wc6c¶cÒcëc0d17d idŠdC¥déd4e65e.le"›e¾e#Ûeÿe*fIf \f}f$f$Âfçf,g.gAg Zg{g ™g ¦g ±g ¾gËgÓg Ügægìgógüg h hhhh"h&Bhihmh vh—h·h Òh Þhìhi i i !i+iBi1Ii {i†ii i §iµiÊi ãi"íi j1jEjKj]j vj)—jÁjÈj ÐjÛj ãjíj k k=kLk`kwk{k k' k Èk Ók àkîk ök ll'l$Glll#ql•lžl¥l®l ³l#Àläl íl÷lmm :mHmYmqm„m‹mm•m™m m³mÆmÜmñm úm n n !n +n 5n?nCnInPn Xnen vnƒnŒnœn²nÏnÖnén oo o7"o9Zo”o ¯o »oÇoÛoào õo ÿo pp/p 3p?pCp GpRpkp npxp €p ‹p —p £p­pÀpÅpÌpÛpàpépüpqq#q'q/qIqYq^qoqsq xq ™q¦q­q³qÉqâqùqr r&r +r6r?r Qr\r _r mrwr~r ƒr ‘rŸr£r§r°r´r¼r ¿r ÊrØrßrär ür ss(svGv Pv[vcvkvov†v›v ±v¼v Ñv Ývëv!òv"w"7wZwrwww †w ’w w°w ÀwËwÏwäwíwxxx,x=xFx)[x4…xGºxy&y'@yJhy?³yHóy%8ŒdwŒ;ÜŒ^vwRîuAŽh·Ž• l¶|# µËá-÷<%‘b‘r‘‘‘‘2£‘Ö‘&ê‘ ’+2’<^’L›’{è’Sd“8¸“3ñ“%”5D”>z”F¹”:•N;•Š•"ž•Á•)Ü•$–!+–!M–8o–P¨–ù–'—BA—„—2–—É—-ç—?˜7U˜&˜´˜KĘ4™E™W™o™!‡™©™.¿™î™7š8šGHšUš,æš ›!› 1›o?›>¯›,î›Fœ)bœ3Œœ>Àœ6ÿœ6Q'a@‰Ê/Ú/ ž#:ž ^žlž‰ž ¤ž ²ž ¼žÈž%âžAŸJŸRŸ*jŸ:•ŸП埠. J Ih !² Ô í  ¡¡/¡0L¡}¡›¡-»¡%é¡¢-/¢ ]¢k¢<‡¢+Ä¢ ð¢ü¢£! £B£ V£d£ v£3‚£ ¶£Ä£8Ø£¤G(¤p¤ ‡¤>“¤Ò¤ ñ¤*ÿ¤*¥>¥R¥h¥€¥6†¥5½¥ó¥/ ¦;¦U¦p¦ƒ¦7—¦ Ϧ>ð¦,/§-\§Ч.£§1Ò§¨+¨&H¨#o¨+“¨&¿¨(権2(©'[©#ƒ©!§©É©ç©5ª-7ª1eª—ª ¬ª6ͪ«&« ?«6M«%„«4ª«pß«0P¬ ¬¢¬´¬YĬ­A2­4t­*©­ Ô­ à­ë­N ®aY®!»®.Ý® ¯9#¯]¯Ir¯E¼¯A°D°$S°x°˜°'·°ß°ð°ÿ°± &± 1±?±Q± e±s±y±‰±Ÿ± °±$¾±mã±AQ²R“²cæ²VJ³O¡³añ³?S´“´¬´½´†Õ´$\µ;µ#½µ;áµ4¶R¶a¶3r¶¦¶TŶ3·‡N·Ö·LX¸(¥¸Fθ:¹P¹c¹+w¹£¹ Á¹̹-蹺",ºOº*Xºfƒº8êºN#»0r».£»-Ò»4¼?5¼6u¼*¬¼$×¼?ü¼F<½)ƒ½o­½¾:8¾>s¾-²¾Hà¾;)¿4e¿?š¿Ú¿ò¿GÀ?VÀ5–À/ÌÀ:üÀ,7Á1dÁ.–ÁÅÁ0ÝÁNÂB]Â* ÂËÂdèÂQMÃ=ŸÃ-ÝÃq Ä-}ÄQ«ÄtýÄnrÅ<áÅÆ%=Æ/cÆz“Æ-Ç/<Ç=lÇ<ªÇBçÇF*ÈWqÈ(ÉÈ<òÈ>/É+nɚɩɹÉÈÉ×ÉêÉýÉÊ"Ê9Ê HÊUÊ tÊ Ê ŒÊ šÊA¥ÊNçÊ 6Ë CË3PË0„Ë/µË åË òË(Ì )Ì+7ÌcÌ}Ì9‘Ì ËÌlÖÌCÍXÍvÍ –Í¡Í#ÀÍ&äÍ ÎLÎJeÎ*°ÎÛÎ&ìÎ)Ï9=ÏSwÏ ËÏÖÏçÏüÏ Ð' ÐHÐ dÐ(…ЮÐ9ÍÐÑ Ñ41Ñ@fÑ §Ñ ²Ñ¿ÑÒÑçÑÒÒ@/Ò@pÒ ±ÒE¾Ò ÓÓ Ó"Ó#7ÓS[Ó¯ÓÀÓ+ÕÓ ÔYÔ&hÔÔ=¤ÔâÔÕÕ Õ%Õ 6Õ=CÕÕ3¡Õ8ÕÕÖ!Ö*ÖJÖgÖvÖŠÖœÖ­Ö¶Ö½Ö ÆÖÔÖïÖ×"× 6×.W׆×;—×:ÓרØ1Ø~DØjÃØ<.ÙPkÙ)¼ÙæÙÚ Ú&Ú7Ú9FÚ€Ú ›Ú¨Ú¾ÚÅÚÌÚ7æÚÛ !Û,Û!KÛmÛ!~Û Û,¼Û éÛöÛÜ$Ü7Ü*VÜ ÜŒÜB•ÜØÜßÜ'òÜÝ:Ý$AÝfÝyÝH€ÝÉÝÚÝ ãÝ!ðÝ$Þ!7ÞYÞ%pÞ–Þ®Þ!¿Þ áÞ îÞüÞ ßß.ß >ßKßTßiß~ßߖߟ߰ßÁ߯ßÚßìß üß; àEàZàqà0à!Àà‰âàElá#²á&ÖáZýá@Xâ6™âÐâ&ßâ`ãgãvã‡ã7›ãÓãèãûãä0äAä~_äÞä0ûä,å EåPåEcåT©å#þå"æ'9æaæAræ7´æ ìæ úæçç 1ç<ç!@ç'bç?ŠçÊç&êçè.è KèKXè^¤èOéESé™é!¨éÊé(Þé*ê$2êWêrê$…êªê=¹ê÷êë2ë IëVë#gëG‹ëiÓër=ì1°ìAâìQ$í}víHôíK=î0‰î4ºîïî:oïiªïlðEðGÇð‘ñU¡ñc÷ñF[òD¢òçòÿòó3#óWó]ó'aó/‰ó=¹ó!÷óPôjôAôÁôØôëô0ôô%õ 8õSEõe™õÿõ ö)öHAöŠöGöo×öUG÷o÷a ø;oø«øÃø7Ýø<ù>RùŠ‘ùKú;hú¤úN¹úTû ]û4hû%ûÃûÕû ìû*úû%ü.?ünü uü€ü!•ü<·üôü"ý?*ýjý7{ýG³ý&ûý "þ-þ<4þqþ‚þ—þ ­þ3ºþîþ ÷þÿÿP3ÿ>„ÿJÃÿ%14fT…VÚ1H_n!ž À5Í-G e r!’L´  ! .;Yw{–<›5Ø,E\7z²1Á"óA Xe1v ¨µ5È4þ 36>u†•+¥Ñë þ 4K Z{Ž#¢BÆ 1EP.–7Åý3 @ Q  V !` èT¤¬ O^g]Ëß>Ï Z,$˜Â(¼õŸˆ°ìÂ`ŒŽÛe»î7bo}ýp¾Љ*ªí!fwG\Žå aÝ÷ªË ¿ù¸KiH é:ÙYw0çrÉuDVæ„gFsØ8ïa¹h,߬`\ØhëM˜«ëŠáÜ^à" %xeñœVÚ„štß:dfIšã£9ÈH€Ê~Q¯Ûè¿aBv °}ä›pPýö=n€ÄÕ8­`”–êë{óX”t+4€×W´ÜÔE!µÆ¡¬áA²§÷L¥k"w©#™K¦˜õôjšð ™æXÍ Ã_*ÚT¸²i–h”ÃÞ|º;ö#yωLÀøN5‰Ñ6=´K¼ó ýCüá[­î7Ž"rÝ0ðФd2ŠÔz›=Ö È'&³¥A]¼¶-Ó̃ÞvòYÊÏO“Ó]¡ÅçY5Ùxùÿ†Õ©.—A>N »B«fP FSˆ½ÝìÆ9¢/<Jjµ¹{¨Hé…LGòÊM‘3}l$œ¢~Ò-m´"­±ƒ„À>ð¾rû·³Å@X¸+ê’Ô/b1Ÿ#þ\ÑÐóã½øV)&.4uÒkÄâñ²ž:C§[ªô¹c U¾#íÖCþRB< ȶcnÓ™üú6Ûeû0 FZ±‘’Z%[()®ïù7Nqú³Î ïIü 濺2Ÿ3oœ¯ËJ81%jí 'ÑiÂ?ˆ»£ή‚Õ$Ìþÿ'SâD,c‚{¡Pž lÅ<x6¯Œò-·u×Ä^Q‹º D§àÁRÁ“ •ÒzE·¥†R3¶•ÿŒÃ‚W&JÌs°Ç®IQ.yU¢ÚÖ—sätgž÷É âmz~ÙÍSགྷøåbqç dƨök‘¨…m“+ *yìǦ›ä‡õ@Í G1…?ñ×@_?‹|±Eúô‹ln—)î’U$‡!Фã;(å9•2†pµ!ûoÜqÎW–è; ÀêÉéMØ/«‡|4O5T©Ç£v¦Þ_Á You can verify it in the OTR options. accountname: primary: protocol: recipient: secondary: title: username: --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --debug, -d enables debug info logging --help display this stuff --no-xtitles, -T disable xterm titles --offline, -o set all protocols status to offline upon start --version, -v show the program version info -S, --status change the current IM status. Status; o, _, a, d, n, c, f, i -n, --number mobile number to send an event to (sms only) -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, jab, rss, lj, gg or infocard -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Account: Account: Accounts.. Active fingerprint: Age : %s Age range : %s All protocols Already logged in only Always online non-IM contacts for : %s Anti-spam: ignore authorization requests: %s Anti-spam: kill msgs from users not on the list : %s Anti-spam: use captcha to identify bots: %s Arrange contacts into groups : %s Ask before quit : %s Assign PGP key.. Authorization required : %s Auto Presence Status Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Automatically set N/A when screen is detached : %s Avatar file : %s Backdated entry : %s Birthdate : %s CENTERIM %s UNSENT: %lu Cellular phone : %s CenterIM config options CenterIM configuration Change color scheme to : %s Change default request authorization message Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Chat panel height : %d Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Codepages conversion Color contacts according to: %s Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable vi bindings: %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users Fingerprint: First name : %s For protocols : %s Forget key Gender : %s General Groups HTTP browser : %s HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Import friend list : %s Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Joined since the last check only Key passphrase: %s Keywords Keywords : %s Language : %s Last name : %s Leave channel Left panel width : %d Link an RSS feed Link an RSS feed LiveJournal posting: attributes Local charset : %s Location Log panel height : %d Logging Login : %s Look for online only : %s Mass group move.. Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network NickServ password (optional) : %s Nickname Nickname : %s OTR options and fingerprints Online only Online/offline events in the log window : %s OpenPGP key: %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Please type 'yes' or 'no': Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Priority : %s Private keys Protocol: Protocol: Proxy only for HTTP (rss and lj) : %s Public keys Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remote charset : %s Remove channel del Request authorization Request receipts: %s SMTP server : %s Screen socket path : %s Search parameters Search profiles Search service Secured : %s Security : %s Select PGP key to use Send OS info: %s Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Set external status Show opened chats : %s Show users who have you on their list Sort contacts by : %s State : %s Street address : %s Subject : %s Switch to language preset : %s Tags : %s Timestamps in the log window : %s Timestamps include seconds : %s Turn PGP encryption %s UIN UIN : %s Unassign PGP key Update user details Use X to report idle time : %s Use no key User interface User: Users with photos only : %s Verified: View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [OPTION]... [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM of password: priority: server address: uin: user name: ! Correct path or disable screen auto presence change! Screen socket path doesn't exist!! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu" not found%lu minutes%s [%s] comes online%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit%s from %s, received on %s%s has been deopped by %s.%s has been kicked by %s%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s is now %s, was %s%s or %s to close, Up/Down and PgUp/PgDn to scroll%s search, %s again, %s cancel%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb%s to %s has been put to the queue%s to %s, sent on %s%s to URLs, %s external actions, %s close%s to URLs, %s to full-screenize, %s close%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ ERROR: captcha disabled: no questions found!+ Set N/A after screen detach+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [gg] cannot resolve %s+ [gg] connection failed+ [gg] connection lost+ [gg] connection to the server failed+ [gg] no away message from %s, %s+ [icq] cannot connect+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nick password sent+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] cannot connect: + [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)+ [yahoo] cannot login+ [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] cannot login: username doesn't exist+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ [yahoo] server closed socket+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ new mail arrived, %d messages+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptActivityAddAdd to listAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAvatar fileAvatar file: Awaiting authorizationAwayAway message:BackgroundBirthdateBlock channel messagesCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChange statusChannel chat historyChannel topic now is: %sChannel: Charset to convert messages from: Charset to convert messages to: Chat panel height: CheckCheck frequency: Check the new password: Check the password you entered: Choosen screen socket path doesn't exist!City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DNDDecDefault Jabber conference serverDefault authorization request message: DepartmentDepartment: Description: DetailsDetect musicDisconnectedDo not disturbDo you want to forget the selected key?Do you want verify the selected key?DoneDrop the account information first!E-Mail: E-mailE-mail: EditEdit detailsEmpty authorization request messageEncodingEncryptedEnter birthdate (DD-MM-YYYY): ErrorError calculating FingerprintEvent historyEvent recipientsEvents sending options:External actions..FailedFaxFax: FebFemaleFetch away messageFetch version infoFetching your detailsFile transfer statusFinishedFirst name: Force checkFree for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:German UTF-8Go aheadGo to contact..HTTP browser to use: HTTP proxy server hostname: HandleHide offline usersHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIgnore userIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLeft panel width: LinkLink: List nicknamesLoadLocationLog panel height: MaleMarMass move selected users to..MayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: NoNo EncryptionNo JabberNo OTRNoneNot availableNot specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOut for LunchOutgoing %sOutgoing %s to %sPGP encrypt error: PGP key passphrase: PGP key search: type to find, %s find again, Enter finishPGP key selection: %s for quick lookupPGP passphrase required: PGP sign error: PING reply from the user: %d second(s)Password must be at least 6 chars longPassword must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: PlaintextPlease join my conference.PolishPosition: PostPosting subject: PrevPublished on: QuickSearch: type to find, %s find again, Enter finishRSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?Remove userRenameRename contactReplyReport bugs to http://bugzilla.centerim.org/.Result of the external action %s:RetreiveRetrieveRetrying..RomanceRussianSMSSMTP server hostname: Screen socket path: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSelect contacts to moveSendSend a messageSend an URLSend contactsSend contacts..Sending requestSent on %sSepServer-based contactServer: Show offline usersState: Status and ActivityStatus and NameStreet address: StudentsTags for the entry: The Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesThis is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnBlock channel messagesUnable to connectUnable to connect to icq server. Retry?UnknownUnset ignore userUnverifiedUsage: User infoUser's detailsVerifiedVersionVisible listWait a moment. Your details haven't been fetched yetWarningWorkWrong Jabber ID!Wrong nickname given, cannot registerYesYou have to disconnect the service first!You must be logged to the Gadu-Gadu network to update your detailsYou must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: [OTR] Connection is insecure...[OTR] Connection is now secure...[OTR] Ending secure session with "[OTR] Error while encrypting message... no message sent![OTR] Error: At the moment, only jabber is supported[OTR] Error: inject_message_cb, recipient "[OTR] Log: [OTR] Received unknown fingerprint from "[OTR] Trying to start a secure session with "abortadding %s to the contactsaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: connecting to the servercontact list quick searchcontactscould not create socketcould not resolve hostnamecouldn't fetchdarkdaysdirectory to save the file(s) to: disabledisconnecteddon't changedonedual login detectede-mailerreventevent from %s (%s)event sending error: error creating directory for the contactevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfoundfriends onlyfull-screen viewhoursicq disconnection reasonidleignoredincoming %s from %sincorrect PGP passphraseinitlInklOadlogged inmembers list fetching finished, %d foundmessageminmode 1mode 2move Downmove Upn/anew MSN friendly nick: nono or tag foundno or tag foundnonenot foundnot usednotificationoutgoing %s to %spassword was changed successfullypassword: pgp key quick searchpgp key selectionpost new entries to your journal.privateprotocolpublic (visible to all)rEmovereason: %sregistration is not supportedremoving %s from the contactssAvesearch finished, %d foundsearch for: secondsset by %ssocket problemssound cardspeakerstartstatusstatus change error: successthe message was: turboingunknownunknown IM typeunknown status character was givenuseduser info for %susername and password mismatchverify the hostname and portverify the pager host and port enteredworkwrong or tagwrong XMLyesyes/noyou are an op hereProject-Id-Version: bg Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2010-02-22 12:59+0100 Last-Translator: Damyan Yordanov Language-Team: Bulgarian Language: bg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: KBabel 1.0.2 Можеш да го провериш при OTR опциите. име на акаунта: първично: протокол: получател: вторично: заглавие: потребителÑко име: --ascii, -a използвай ASCII Ñимволи за прозорците и рамките --basedir, -b <път> задай друга базова Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ --bind, -B IP за входÑщи връзки --debug, -d активирай запиÑването на debug Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ --help покажи този екран --no-xtitles, -T деактивирай заглавиÑта на терминала --offline, -o Ñложи ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ñ„Ð»Ð°Ð¹Ð½ на вÑички протоколи при Ñтарт --version, -v покажи верÑиÑта на програмата -S, --status <ÑтатуÑ> Ñмени Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° IM. СтатуÑ; o, _, a, d, n, c, f, i -n, --number <тел. ном.> мобилен номер на Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ (Ñамо за sms) -p, --proto <протокол> тип на протокола; може да бъде icq, yahoo, msn, aim, irc, jab, rss, lj, gg или infocard -s, --send <тип> тип на Ñъобщението; може да бъде msg, sms или url -t, --to <получател> UIN или прÑкор на Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ (завиÑи от протокола) %s: детайли 1ви език : %s 2ри език : %s 3ти език : %s потвърди, откажи или потвърди, откажи ОтноÑно Ðкаунт: Ðкаунт: Ðкаунти.. Ðктивен пръÑтов отпечатък: Години : %s ВъзраÑтова група : %s Ð’Ñички протоколи Само в които Ñъм влÑзъл Винаги онлайн не-IM контакти за: %s Anti-spam: игнорирай иÑÐºÐ°Ð½Ð¸Ñ Ð·Ð° Ð°ÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ %s Anti-spam: Ðе приемай ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ потребители, които не Ñа в ÑпиÑъка: %s Anti-spam: използвай captcha, за да откриваш ботове: %s Подреди контактите в групи : %s Попитай преди изключване: %s Прибави PGP ключ.. Ðеобходима е Ð°ÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : %s Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·Ð° автоматично приÑÑŠÑтвие Ðвтоматично към 'нÑма ме' Ñлед (мин) : %d Ðвтоматично към N/A Ñлед (мин) : %d Ðвтоматично към N/A, когато screen-a e откачен: %s Ðватар : %s Предишен Ð·Ð°Ð¿Ð¸Ñ : %s Рожден ден : %s CENTERIM %s ÐЕИЗПРÐТЕÐИ: %lu Мобилен телефон : %s ÐаÑтройки на CenterIM ÐаÑтройки на CenterIM ПромÑна на цветовата Ñхема : %s Смени Ñъобщението за иÑкане на Ð°ÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¡Ð¼Ñна на прÑкора СмÑна на паролата : %s ПромÑна на звуковото уÑтройÑтво : %s Канал : %s Чат режим при ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ : %s Чат режим за : %s ВиÑочина на чат-панела %d ЧеÑтота на проверката (минути) : %lu ПроверÑвай локалната поща : %s Провери паролата : %s Град : %s Преобразуване на Ñтраниците за кодиране Оцвети контактите Ñпоред: %s Коментар Комуникации ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ : %s СпиÑък Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸ Държава : %s СобÑтвено наÑтроение : %s Отдел : %s Подробен журнал в ~/.centerim/log : %s Детайли Изключи автоматичното форматиране : %s Изключи изпращането на коментари по пощата : %s Забрани коментарите : %s Изтрий Поща : %s Поща: %s ПроменÑй Ñъобщението за отÑÑŠÑтвие при промÑна на ÑтатуÑа: %s Използване на двупоÑочен език : %s Включи emacs редактора : %s Включи Ñвързване между клиенти (p2p) : %s Включи vi редактора : %s Вкючване на web индикатор : %s Клавишът Enter изпраща ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ : %s Изпращай Ñъобщение Ñ enter за: %s Смешни нещица Ð¤Ð°ÐºÑ : %s Параметри на подпиÑа Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð½Ð° транÑферираните файлове Файлове Ðамери/добави потребител Ðамери/добави потребител ПръÑтов отпечатък: Име : %s За протоколи: %s Забрави ключа Пол : %s Общи Групи HTTP броузър: %s HTTP прокÑи Ñървър : %s Скрий вÑички офлайн потребители : %s Дом Страница : %s Мениджър на акаунтите Импортирай ÑпиÑък Ñ Ð¿Ñ€Ð¸Ñтели: %s Идващ от %s Покана за чат.. Влез в канала Влез в канал/ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ð’Ð»ÐµÐ·/Ñъздай чат Влизали Ñамо преди поÑледната проверка Парола за ключа: %s Ключови думи Ключови думи %s Език : %s Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ : %s ÐапуÑни канала Широчина на Ð»ÐµÐ²Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»: %d Връзка към RSS feed ДобавÑне на RSS feed LiveJournal поÑтинг: атрибути Локален енкодинг: %s МеÑтонахождение ВиÑочина на лог-панела %d Журнал Потребител : %s ТърÑи Ñамо онлайн потребители: %s ПремеÑти цÑлата група.. Други ÐаÑтроение : %s Още ПремеÑти в група.. Музика : %s Име : %s Ðазвание Мрежа NickServ парола (опционално) : %s ПрÑкор ПрÑкор : %s OTR опции и пръÑтови отпечатъци Само онлайн ВходÑщи/изходÑщи ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð² журнала : %s ОpenPGP ключ: %s Опции Управление на групите Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸ Заминаващ към %s Парола Парола (опционално) : %s Парола : %s Парола : %s Телефон : %s Картинка : %s Ping ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´Ð¸ 'yes [да]' или 'no [не]' Диапазон за портовете (p2p) : %s ДлъжноÑÑ‚ : %s Публикувай към журнал : %s Приоритет : %s Лични ключове Протокол: Протокол: ПрокÑи Ñамо за HTTP (при rss и lj): %s Публични ключове Цитирай Ñъобщение при отговор : %s Произволна група за чат Произволна чат група : %s РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð ÐµÐ³Ð¸Ñтриране в мрежата %s Параметри за региÑтриране РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð£Ñлуга за региÑтриране Запомни паролите : %s Външен енкодинг: %s Изтрий канала del ПоиÑкай Ð°ÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð˜Ð·Ð¸Ñкай получаване: %s SMTP Ñървър : %s Път към адреÑа на Ñокета: %s Параметри за търÑене ТърÑене на профили УÑлуга за търÑене ПодÑигурено : %s СигурноÑÑ‚ : %s Избери кой PGP ключ да ползваш Изпращай OS информациÑ: %s Изпрати чат-Ñъобщение enter Изпрати SMS Изпрати файл(ове) Изпращане на файл(ове) на %s, %lu Сървър : %s Използвай Ñървър : %s УÑлуга Сложи Ñъобщение за отÑÑŠÑтвие Сложи външен ÑÑ‚Ð°Ñ‚ÑƒÑ ÐŸÐ¾ÐºÐ°Ð¶Ð¸ отворените чатове: %s Покажи потребителите, които Ñа те включили в техните ÑпиÑъци Сортирай контактите по: %s Щат/ÐŸÑ€Ð¾Ð²Ð¸Ð½Ñ†Ð¸Ñ : %s ÐÐ´Ñ€ÐµÑ : %s Тема : %s Превключи на предефинирани наÑтройки за език: %s Тагове : %s Дата и време при Ð·Ð°Ð¿Ð¸Ñ Ð² журнала : %s Журнала показва и Ñекунди: %s Включи PGP криптиране: %s UIN (ICQ#) UIN : %s Премахни PGP ключ ОбновÑване на потребителÑката Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð˜Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð¹ X за да Ñъобщаваш времето за бездейÑтвие: %s Ðе използвай ключ ПотребителÑки Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»: Само потребители ÑÑŠÑ Ñнимки: %s Проверено: Виж/редактирай ÑпиÑъка на игнорираните Виж/редактирай ÑпиÑъка на невидимите Виж/редактирай ÑпиÑъка на видимите Работа ÐÐ´Ñ€ÐµÑ XML екÑпорт : %s Твоите %s детайли ПощенÑки код : %s [Ctrl-X запиÑ, Esc отмÑна] [ОПЦИЯ]... [aim] AOL TOC [gg] Gadu-Gadu [icq] Мрежа ICQ [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM от парола: приоритет: Ñървър : номер: потребителÑко име: ! Промени Ð¿ÑŠÑ‚Ñ Ð¸Ð»Ð¸ деактивирай автоматичната промÑна на screen! Ðе ÑъщеÑтува път към Ñокета на screen!! беше открито друго Ñтартирано копие на centerim! невъзможна връзка, Ñвободното мÑÑто на диÑка е под 10к! Ñвободното мÑÑто на диÑка е под 10к, изключване! иначе може да Ñе изгубÑÑ‚ ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð¸ промени! поддръжката за %s е била изключена при компилирането! това може да Ñъздаде проблем. pid %lu" не е открито%lu минути%s [%s] е онлайн%s контакт-меню, %s ÑтатуÑ, %s главно меню, %s/%s Ñледващ/предишен чат, %s напуÑни%s от %s, получено на %s%s вече не е оператор, Ñвален от %s.%s беше изритан от %s.%s беше назначен за оператор от %s.%s ни взе операторÑките права%s влезе.%s излезе.%s ни даде операторÑки права.%s е Ñега %s, беше %s%s или %s за затварÑне, Up/Down и PgUp/PgDn за Ñкролиране%s търÑене, %s отново, %s откажи%s изпрати, %s на повече, %s/%s пр/Ñл чат, %s иÑториÑ, %s URLs, %s разшири, %s информациÑ%s изпрати, %s на повече, %s/%s пр/Ñл чат, %s иÑториÑ, %s URLs, %s разшири, %s членове%s към %s беше поÑтавен в ÑпиÑъка ÑÑŠÑ Ð·Ð°Ð´Ð°Ñ‡Ð¸%s към %s, изпратено на %s%s за URLs, %s за външни програми, %s затвори%s за URLs, %s на цÑл екран, %s затвори%s е офлайн%s: е офлайн%s: е онлайн, ÑÑŠÑ ÑÑ‚Ð°Ñ‚ÑƒÑ %sпо подразбиране(нÑма)* ÐÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : * ИÑкане на Ð°ÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : * Контакти : * изпращане на файл* SMS : + %s бе добавен в ÑпиÑъка+ ГРЕШКÐ: деактивиране на captchа: не бÑха намерени въпроÑи!+ Сложи N/A Ñлед откачане на screen-a+ [%02d:%02d:%02d] нова поща приÑтигна, %d ÑъобщениÑ+ [%s] автоматичен преход в %s+ [%s] ÑтатуÑÑŠÑ‚ възÑтановен+ [aim] невъзможна връзка: %s+ [aim] паролата беше изпратена+ [aim] невъзможна връзка ÑÑŠÑ Ñървъра+ [gg] не може да открие IP-то на %s+ [gg] връзката неуÑпешна+ [gg] изгубена връзка+ [jab] невъзможна връзка ÑÑŠÑ Ñървъра+ [gg] нÑма Ñъобщение за отÑÑŠÑтвие на %s, %s+ [icq] невъзможна връзка+ [icq] невъзможно изтеглÑне на Ñъобщението за отÑÑŠÑтвие на %s, %s+ [icq] изключено+ [icq] не може да Ñе изпрати SMS до %s+ [icq] не може да Ñе изпрати SMS до %s, %s+ [irc] невъзможна връзка: %s+ [irc] паролата за прÑкора беше изпратена+ [irc] прÑкора беше Ñменен уÑпешно+ [irc] паролата беше изпратена+ [irc] невъзможна връзка ÑÑŠÑ Ñървъра+ [jab] грешка %d+ [jab] грешка %d: %s+ [jab] нÑма Ñъобщение за отÑÑŠÑтвие на %s, %s+ [jab] невъзможна връзка ÑÑŠÑ Ñървъра+ [jab] %s беше изтрит от ÑпиÑъка+ [lj] %s бе добавен в ÑпиÑъка+ [li] невъзможна връзка чрез HTTP: %s+ [lj] невъзможно добавÑне+ [lj] грешка при изтриването+ [lj] невъзможно влизане: %s+ [lj] грешка: %s+ [lj] изпратено уÑпешно, id: %s+ [lj] Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð±ÐµÑˆÐµ изтрит от Ñ‚Ð²Ð¾Ñ ÑпиÑък+ [li] търÑенето на потребител завърши+ [msn] невъзможна връзка:+ [msn] поща от %s, %s+ [msn] обратен потребителÑки ÑпиÑък завършен, %d намерени+ [msn] непрочетена поща: %d в inbox, %d в други папки+ [yahoo] беше открито двойно влизане+ [yahoo] невъзможна връзка: + [yahoo] невъзможно изтеглÑне на Ñъобщението за отÑÑŠÑтвие на %s, %s+ [yahoo] невъзможно влизане+ [yahoo] невъзможно влизане: акаунта е блокиран+ [yahoo] невъзможно влизане: грешна парола и/или потребителÑко име+ [yahoo] невъзможно влизане: потребителÑкото име не ÑъщеÑтвува+ [yahoo] директната връзка пропадна+ [yahoo] поща от %s, %s+ [yahoo] изход от чата %s+ [yahoo] Ñървър: затворен socket+ не може да Ñе прочете Ñъобщението му за отÑÑŠÑтвие, когато е офлайн+ поÑледно Ñъобщение от %s+ Ñтартирана е командата %s+ нова поща приÑтигна, %d ÑъобщениÑ+ нÑма връзки за Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑÑ‚+ не Ñа зададени външни програми за %s+ нÑма предишни ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² архива от %s+ конфигурациÑта %s беше променена, презареждане+ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ñе върна+ за да активираш наново, поÑети %s+ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s вече е в ÑпиÑъка ви+ първо трÑбва да влезеш20 и нещо2-ра поща30 и нещо40 и нещо50 и нагоре60 и нагоре<без прÑкор>ОтноÑноПотвържениеДейноÑтДобавиДобави в ÑпиÑъкаÐдреÑГодиниГодини:ÐприлСигурен ли Ñи, че иÑкаш да изтриеш %s?Сигурен ли Ñи, че иÑкаш да изтриеш групата ?ÐвгуÑÑ‚Ðвтор: 'ÐÑма ме' Ñлед (0 - изключено): Ðвто N/A Ñлед (0 - изключено): Ðвтоматично влизане в чатÐватарÐватар:Чакане на ауторизациÑÐÑма меÑъобщение за отÑÑŠÑтвие:Предишен опитРожден денБлокирай ÑъобщениÑта от каналаОтказТранÑфера не може да Ñе премахне, когато е вÑе още в прогреÑКатегориÑ: Мобилен телефонМобилен телефон: СмÑнаСмÑна на ÑтатуÑаÐрхив на чат каналаТемата на канала е: %s Канал: Енкодинг за да преобразуваш ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚:Енкодинг да преобразуваш ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÑŠÐ¼: ВиÑочина на чат-панела:ПроверкаЧеÑтота за проверка: Провери новата парола:Проверка на въведената парола: Ð˜Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð¿ÑŠÑ‚ към Ñокета на screen не ÑъщеÑтвува!Град: КоментарКоментари: КомпаниÑКомпаниÑ: Връзка ÑÑŠÑ Ñървър %s ...Добави контактУчаÑтници в чата: ÐаÑтроение в момента: Ð’ момента Ñвири: Индивидуално ÑÑ‚Ð°Ñ‚ÑƒÑ Ñъобщение:Ðе Ме ЗакачайДекемвриСтандартен Jabber Ñървър за чатСъобщение за иÑкане на ауторизациÑОтделОтдел: ОпиÑание: ИнформациÑОткрий музикаИзключванеÐе ме тормозиИÑкаш ли да забравиш Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡?ИÑкаш ли да провериш Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡?ГотовоПърво изтрий информациÑта за акаунта!Поща: ПощаПоща:РедактирайРедактирай детайлиПразно Ñъобщение за изиÑкване на ауторизациÑКодиранеКриптираноДата на раждане (DD-MM-YYYY): ГрешкаГрешка при изчиÑлÑването на пръÑÑ‚Ð¾Ð²Ð¸Ñ Ð¾Ñ‚Ð¿ÐµÑ‡Ð°Ñ‚ÑŠÐºÐрхив на ÑъобщениÑтаПолучателиОпции при изпращане на Ñъобщение:Външни програмиПропаднаФакÑФакÑ: ФевруариЖенÑкиПрочети Ñъобщението за отÑÑŠÑтвиеПоиÑкай верÑиÑтаИзтеглÑне на твоите детайлиМонитор за транÑфер на файловеЗавършеноИме: Извърши проверкаСвободен за чатЧеÑтотаПриÑтел наПълно имеПрепратиИгриПолОбщиОбщ чатОÑновни опции:ÐемÑки UTF-8ПродължиОтиди при контакт..Име на HTTP броузър:Име на HTTP прокÑи Ñървъра: ÐазваниеСкрий вÑички офлайн потребителиИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° %s, вÑички %d ÑъобщениÑДомЛична ÑтраницаСтраница: Ðа мен ми хареÑва Ñтандартното Ñъобщение за отÑÑŠÑтвие %s в centerim на %s %s.Ðа мен наиÑтина ми хареÑва ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ AIM профил на centerim %s.Да игнорирам ли ÑъобщениÑта от %s?СпиÑък Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð°Ð½Ð¸Ñ‚Ðµ контакти (игнорирани)Игнорирай потребителÑВходÑщи %s от %sÐ˜Ð½Ñ„Ð¾Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° %sИнтереÑиÐевидимДа не те виждат (невидим ÑпиÑък)Покана за чат..ЯнуариВлез/СъздайЮлиЮниКлючови думи: Изритан от канала %s; причина: %sLJЕзициПоÑледен IP-адреÑПредишна проверкаФамилиÑ: ПоÑледен резултатПоÑледно видÑнШирочина на Ð»ÐµÐ²Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»:ВръзкаВръзка: СпиÑък Ñ Ð¿Ñ€ÑкориЗарежданеМеÑтонахождениеВиÑочина на лог-панела:МъжкиМартПремеÑти вÑички избрани контакти в..МайСъобщениеСъобщение от Ñървъра:Мобилен телефон: ОщеПремеÑти в контактиÐе Ñъм тукИмеИме на групата, коÑто иÑкаш да Ñъздадеш:ЗаглавиеИме: ÐикогаÐов UIN е получен, %luÐово име на групата:Покажи нов прÑкор:Ðова парола:Ðово име на профила: Ðово търÑенеСледващоСледваща проверкаПрÑкорПрÑкор:ПрÑкор: ÐеÐÑма криптиранеÐÑма JabberÐÑма OTRÐÑмаÐедоÑтъпенÐе е указанÐоемвриСегаЗаетОктомвриИзключенОкСтара пощаВ канали: Ðа линиÑОтвориУправление на контактните групиÐа обÑд ÑъмЗаминаващ %s ИзходÑщи %s към %sгрешка при PGP криптиранетоПарола за PGP ключа:търÑене на PGP ключове: напиши за да търÑиш, %s за повторно търÑене, Enter за крайИзбиране на PGP ключ: %s за бързо търÑенеВъведи парола за PGP:грешка при PGP подпиÑаPING отговор от Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð±Ðµ получен за %d ÑекундиПаролата трÑбва да е от поне 6 знакаПаролата трÑбва да е въведенаПарола: Паролите не ÑвъпадатДиапазон на портовете за прÑка връзка (p2p) (мин-макÑ): ТелефонТелефон: Прав текÑÑ‚ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¸Ñъедини Ñе към Ð¼Ð¾Ñ Ñ‡Ð°Ñ‚ÐŸÑƒÐ±Ð»Ð¸ÐºÑƒÐ²Ð°Ð¹Ð”Ð»ÑŠÐ¶Ð½Ð¾ÑÑ‚: ПубликувайТема на поÑтинга:ПредишноПубликувано на: Бързо търÑене: напиши какво търÑиш, %s за повторно търÑене, Enter за крайRSS документациÑПроизволен чат потребителПолучено на %sОтказИзтриванеДа Ð¸Ð·Ñ‚Ñ€Ð¸Ñ Ð»Ð¸ %s и от ÑпиÑъка Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸?Желаеш ли да изтриеш %d и от ÑпиÑъка Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸?Изтрий потребителÑПреименувайПреименувай контактаОтговориИзпращай грешки на http://bugzilla.centerim.org/.Резултат от външна програма %s:Обнови ОбновиПовторение..РомантикаРуÑкиSMSИме на SMTP Ñървъра: Път към Ñокета на screen:Резултати от търÑенето [завършено]ТърÑене/ДобавÑнеТърÑене на контакти..ТърÑене на мъжеТърÑене на жениИзбериИзбери група, в коÑто да добавиш контактаИзбери група, в коÑто да бъде премеÑтен потребителÑИзбери контакти, които да добавиш в ÑпиÑъкаИзбери контактите, които да премеÑтишИзпратиИзпрати ÑъобщениеИзпрати URL Изпращане на контактиИзпращане на контакти..Изпращане на заÑвкаИзпратено на %sСептемвриКонтакти на ÑървъраСървър: Покажи вÑички офлайн потребителиЩат/ПровинциÑ: Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸ ДейноÑÑ‚Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸ ИмеÐдреÑ: СтудентиТагове за елемента:РегиÑтрациÑта на Jabber ID премина уÑпешноСледните потребители те имат в ÑпиÑъците Ñи като приÑтел:Профил Ñ Ñ‚Ð°ÐºÐ¾Ð²Ð° име вече ÑъщеÑтвува. ИÑкаш ли да го презапишеш?ОтÑрещната Ñтрана ползва %sУказаната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ ÑъщеÑтвуваВ указаната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ може да Ñе запиÑÐ²Ð°ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s (%s) те добави към нейниÑ/Ð½ÐµÐ³Ð¾Ð²Ð¸Ñ ÑпиÑък Журнал адреÑ: %sÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s отказа поканата ти за Ñ‡Ð°Ñ‚ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s те кани на чат %s, Темата е: %sÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s влезе в Ñ‡Ð°Ñ‚Ð°ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s излезе от Ñ‡Ð°Ñ‚Ð°ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s те e премахнал от ÑпиÑъка Ñи Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸. Журнал адреÑ: %sÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð¼Ð° рожден ден днеÑÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð°Ð´Ðµ разрешение за да го добавиш в ÑпиÑъка ÑÐ¸ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð²Ð¸ добави към нейниÑ/Ð½ÐµÐ³Ð¾Ð²Ð¸Ñ ÑпиÑък Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ñи Ñмени прÑкора от %s на %sÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð½Ñма Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð² профила.ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° да даде разрешение за да го добавиш в ÑпиÑъка Ñи; обÑÑнение: ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð²Ð¸ изтри от ÑÐ²Ð¾Ñ ÑпиÑък Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¶ÐµÐ»Ð°Ðµ абонамент за Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑтатуÑа виТова е Ñ‚Ð²Ð¾Ñ LiveJournal account. Използвай го даВремето за заÑвката изтече, повторно?Времева зонаДлъжноÑтЗаглавие: Опит за региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ %s на %s ...UIN: URLВръзка(Уеб Страница): Връзки в Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑтДеблокирай ÑъобщениÑта от каналаÐевъзможна връзкаÐевъзможна Ñвързване Ñ ICQ Ñървъра. Повторно?неизвеÑтноПремахни "игнориран" за потребителÑÐепровереноУпотреба: Ð˜Ð½Ñ„Ð¾Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° потребителÑПровереноВерÑиÑДа те виждат при ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼ (видим ÑпиÑък)Изчакайте един момент. ИнформациÑта още не е изтеглена.ПредупреждениеРаботаГрешно Jabber ID!Грешен прÑкор, невъзможно региÑтриранеДаПърво трÑбва да Ñе изключиш от Ñървъра!ТрÑбва да Ñи на Ð»Ð¸Ð½Ð¸Ñ Ð·Ð° да можеш да промениш информациÑта ÑиТрÑбва да Ñи на Ð»Ð¸Ð½Ð¸Ñ Ð·Ð° промениш информациÑтаТрÑбва да Ñи на Ð»Ð¸Ð½Ð¸Ñ Ð·Ð° да можеш да промениш информациÑта ÑиТрÑбва да Ñи на Ð»Ð¸Ð½Ð¸Ñ Ð·Ð° да можеш да Ñмениш прÑкора ÑиИнформациÑта е получена уÑпешноПощенÑки кодПощенÑки код: [OTR] Връзката е неподÑигурена...[OTR] Връзката е вече подÑигурена...[OTR] Край на подÑигурената ÑеÑÐ¸Ñ Ñ "[OTR] Грешка при криптирането на Ñъобщението... Ñъобщението не беше изпратено![OTR] Грешка: в момента Ñе поддържа Ñамо jabber[OTR] Грешка: inject_message_cb, получател "[OTR] Журнал: [OTR] Получен непознат пръÑтов отпечатък от "[OTR] Опит за Ñтартиране на подÑигурена ÑеÑÐ¸Ñ Ñ "отказдобавÑне на %s към контактитеaim връзката пропаднапо заÑвкаауторизациÑнÑма меÑъобщение за отÑÑŠÑтвиегрешна паролагрешно потребителÑко имеÑинОтказИзчиÑтваненевъзможна връзкапромÑна на Ñ‚Ð²Ð¾Ñ %s ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° %s от %sкоментар: връзка ÑÑŠÑ Ñървърабързо търÑене в ÑпиÑъка Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸Ð½ÐµÐ²ÑŠÐ·Ð¼Ð¾Ð¶Ð½Ð¾ Ñъздаване на Ñокетневъзможно да Ñе определи IP-то на хоÑтане може да Ñе Ð¸Ð·Ñ‚ÐµÐ³Ð»Ð¸Ñ‚ÑŠÐ¼ÐµÐ½Ð´Ð½Ð¸Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° файл(ове): изключенизключванебез промÑнаготовооткрито беше двойно влизанепощагрешкаÑъбитиеполучетно от %s (%s)грешка при Ñъздаването на папка за контактагрешка: нÑма доÑтатъчно параметригрешка: Ñамо UIN Ñа разрешени Ñ ICQ протоколгрешка: неизвеÑтен IMгрешка: неизвеÑтно Ñъбитиеначало на журналÑтартриане на външна команда %s, изходен код = %dÑтартиране на външна програма %s, изходен код = %dиме на файл: име на файл: файловенамереноÑамо за приÑтеливиж на пълен екранчаÑовепричина за изключването на icqбездейÑтващигнориранвходÑщо %s от %sГрешна PGP паролавръзкаДобавиЗарежданевлизането уÑпешноизтеглÑнето на ÑпиÑъка Ñвърши, %d намерениÑъобщениеминутирежим 1режим 2ПремеÑти надолуПремеÑти нагореn/aнов MSN friendly nick: нене беше намерен таг или не беше открит или тагнÑманенамеренонеизползваноизвеÑÑ‚ÑванеизходÑщо %s към %sпаролата беше Ñменена уÑпешнопарола: бързо търÑене на pgp ключовеизбиране на pgp ключпрати нови елементи към Ñ‚Ð²Ð¾Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñ‡Ð°ÑтнопротоколдоÑтъпно (видимо за вÑички)Изтрийпричина: %sрегиÑтрациÑта не Ñе поддържаизтриване на %s от контактитеЗапиÑтърÑенето завърши, %d намеренитърÑене: Ñекундиавтор - %sкомуникационен проблемзвукова картаговорителÑтартÑтатуÑгрешка при ÑмÑна на ÑтатуÑа: уÑпешноÑъобщението беше:уÑкорениенеизвеÑтнoнеизвеÑтен тип на IMнеизвеÑтен Ñимвол зададен за ÑтатуÑÐ¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¾Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° потребител %sгрешна парола и/или потребителÑко имепроверка на хоÑта и портапровери името на хоÑта и портапрогреÑнеправилен таг или грешен XMLдада/неТи Ñи оператор тукcenterim-4.22.10/po/ro.gmo0000644000175000001440000005431111473011460012146 00000000000000Þ•wÔ ÷Œh iw‹Ÿ³ » ÇÒ6ã# > *\ )‡ ±  Ø ö !#!>!]! w! ƒ!!ž!­!¼!Ë!0Ý! "" " -");"-e""“" ¶"Á"É"Ü"ì" þ" ###9#@#P#"e# ˆ#“#£# ´# ¿#Ì#Ü#ã# ô# $ $$ %$ 3$>$N$ e$r$‚$¢$¶$ Ï$Ú$ò$ %,%C%V%h% ˆ%•% ¯%½%Ò% å%ò%& &&/&@&W&q&‰&&¢&²&Î&Ý& ð&û& ' ')';' B'+O'1{'0­'"Þ'"($(4(E(e(x(“(œ(0¼(í( ) );)'Q)y)Ž)§)Ä))ß)' *1*4L*6*¸*#Õ**ù*$+$7+\+v+‰+ ¢+ Ã+ Ð+ Û+ è+õ+ý+, ,,,,#,),-,&M,t, x,™,¹,Ô, Ù, ç, ò,ü,-- - '-H-O-W- _-i- ‰-ª-®- ²- ½-Ê- Ò-ß-#ä-...!.#&.J.i.z.~.„.ˆ..¥. ®. ».É.Í.Ó.Ú. â.ï.ø.// &/71/9i/£/ ¾/Ê/Þ/ã/ ø/ 0 000#0 '020 K0U0 ]0 i0s0x00†0Š0Ž0–0¦0«0¼0À0 Å0æ0í0ó0 1"191 L1W1\1e1 w1 ‚11”11¡1©1 ¬1 ·1Å1Ì1Ñ1é1û1 2262<2 D2O2`2o2v2}2„2Š2 “2ž2¦2ª2Á2 ×2â2 ÷2 33!3":3"]3€3…3 •3 3¤3­3µ3Æ3GÏ3H4%`4#†4ª40È4.ù4-(5$V5C{5'¿5ç5ð5ö5ü56 6 *6476l6)q6;›6×6ö6 ÿ6 7 7 -7;7 @7 M7 Z7g7l7#r7 –7 7¸7Ó7Ø7 à7í7*ô7<8$\8'8©8 ¼8Ç8à8è8ü89 99 9!9)9-909 59B9 T9_9f9„9 ‰9–9 ¦9±9¹9Ï9á9ê9"ú9:&<:c:©g: <<0<A<R< [<f<u<5Ž<'Ä<ì<0=/9=i==$–=)»= å=ò=>/> I> V>c>r> ‚> >›>/®> Þ> è> ô> ?7?4H?/}? ­? ¸?Ã?á?ý? @ @ !@#+@O@X@h@!}@Ÿ@ ¯@ ½@ É@ Ô@ á@ ë@÷@ AA A*A :AHAQA`AxA‡A —A¸AÌAåA÷AB )BJB]BpBB ¡B®B ÎBÜBõB C C(C .C9CMCeC!ƒC¥C ÅCÐCäC"÷CD)D =DHD \D jDuD‡DD# D0ÄD5õD'+E"SEvE†E–EµEÅEÜE åE+F2FKFbFF'šFÂFÕF òFG#2G'VG!~G5 G@ÖGH"5H.XH‡H! HÂHÞH÷H(I ?I KI UI aImIuI~I…IŽI–IžI §I²I%¶I$ÜIJ)J(/J"XJ{J €JJ”J ¥J³JÃJÌJÔJòJ úJK KK6KRKVK ZK fKtK |K‡K0ŒK½KÆKÍK ÖK$àK'L -L9L=LCLGLNLfL oLyLL‘L˜LœL ¤L ±L&½LäLëL ôL7ÿL.7MfM …M“M§M¬MÂM ËMÕMçMëMïMóMNN %N0N7N KNUN^NfNjNnN tN €NŠNœN N¥NºN ÁNÌNäNøNOO .O9OBO VO aOnOrOyO}O…O ˆO •O£OªO"³OÖOçO þOP!P )P 3P>P OP\PeP mPzP€P†P •PŸP£PºP×PæPüPQ Q$+Q#PQ,tQ¡Q©Q ºQÇQËQÔQ ÛQ åQ=ïQB-R-pR'žR ÆR2çR.S1IS{SC–S-ÚSTTTT!T=TTT0dT•T'žT=ÆTU $U 0U>U UU bUmU rU~UU¡UªU'²U ÚUçUÿU V $V 2V=V*DV*oVšV&ºVáVýV W&W.W BWLWRWZW bW lWvWzW}W ƒWŽW ŸW©W!±W ÓWÝWæWöWXX(X9X BX-PX~X'žXÆX ž7¶Q²80F¡ð$ÂãÒ)ÔÌ»KL­DuVÕÑæªh2ïœÜý¥-’3ä-¾oÊ~Íw9/W%(ohI&F÷ÖÁ[¢1,“R!Z'E}f±PvzJp^, Š_`/HXQ<+J¦0V<aD·wñY|SI(&)Žß=•¼³ AK° b.ƒUÈÛ3AiO^%#[Éõr@ŒÓ¨º]Ÿ¹5'—"Ïk@ëW˜ ;guqikM:éÅPC66ec8l™?†£cn">N]ÿ©ò ÝÞxpøT Nmn?2.S9\凬êj+Rsþjàt T‘ì{4ór´;§XGdm7«L:пaB„M…¯ çY!ô`¤5˸½= Uv–Æ1îqû \‰ ‹ÎÚGè4ÃÄ_>Oö›ü”CBZ×Háfâgˆšb®*‚e€Ùyù#ÀØE*dµ tÇsíú$l %s: details 1st language : %s 2nd language : %s 3rd language : %s About Accounts.. Age : %s Age range : %s Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Birthdate : %s Cellular phone : %s Change color scheme to : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Check the local mailbox : %s Check the password : %s City : %s Comment Communications Company : %s Contact list Country : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable web status indicator : %s Fax : %s Files Find/add user(s) Find/add users First name : %s Gender : %s General Groups Hide offline users : %s Home Homepage : %s IM account manager Joined since the last check only Keywords Language : %s Last name : %s Location Login : %s Miscellaneous More Move to group.. Name : %s Network Nickname Nickname : %s Online only Password Password : %s Password to set : %s Phone : %s Position : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Registration progress Remember passwords : %s Remove channel del Request authorization SMTP server : %s Search profiles Send a channel message enter Send an SMS Send file(s) to %s, %lu Server : %s Server to use : %s Set away message State : %s Street address : %s UIN UIN : %s Update user details User interface View/edit ignore list View/edit invisible list View/edit visible list Work Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [icq] ICQ network [irc] IRC [msn] M$ Messenger [yahoo] YAIM password: server address: uin: user name: ! another running copy of centerim detected! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! this may cause problems. pid %lu%s to %s has been put to the queue%s went offline%s: went offline%s: went online, with status %s* Authorization : * Authorization request : * SMS : + %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] unable to connect to the server+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ cannot fetch away messages being offline+ last msg from %s+ no URLs within the current context+ no history items for %s+ the user is back+ to reactivate visit %s+ user %s is already on the list20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateCellularCellular phone: ChangeChannel: Check the password you entered: City: CommentCompanyCompany: Connecting to the server %s ...Current conference members are: DNDDecDepartmentDepartment: DetailsDisconnectedDoneDrop the account information first!E-Mail: E-mailE-mail: EditEmpty authorization request messageEnter birthdate (DD-MM-YYYY): Event recipientsFaxFax: FebFemaleFetching your detailsFinishedFirst name: Free for chatFwdGamesGenderGeneralGeneral ChatGo aheadHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listJanJulJunKeywords: Kicked by %s; reason: %sLanguagesLast IPLast name: Last seenLoadLocationMaleMarMayMessageMobile number: MoreMove to contactsN/ANameName for a group to be created: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New profile name: New searchNextNicknameNickname to set: Nickname: Not specifiedNovOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %s to %sPassword must be enteredPassword: Passwords do not matchPhonePhone: Position: Random Chat UserReceived on %sRejectRemoveRenameReplyRetrieveRetrying..RomanceSMSSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSendSending requestSent on %sSepServer: State: Street address: StudentsThe profile with this name already exists. Do you want to overwrite it?The user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: Timed out waiting for a new uin. Retry?TimezoneTitleUIN: URLURLs within the current contextUser infoVisible listWait a moment. Your details haven't been fetched yetWorkYou have to disconnect the service first!You must be logged to the ICQ network to update the detailsYour details have been fetchedZip codeZip code: aim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecLearchanged our %s status to %s from %scomment: could not create socketcould not resolve hostnamedarkdisabledon't changee-mailevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedfilename: icq disconnection reasonignoredincoming %s from %slOadmessagemode 1mode 2move Downmove Upn/anononenotificationoutgoing %s to %spassword: rEmoveregistration is not supportedsAvesearch for: socket problemssound cardspeakerstatus change error: the message was: turboingunknown IM typeunknown status character was givenusername and password mismatchverify the pager host and port enteredyesProject-Id-Version: centerim 4.8.3 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2002-09-10 22:43+0200 Last-Translator: Ovidiu GhineÅ£ Language-Team: Romanian Language: ro MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s: detalii 1a limbă : %s 2a limbă : %s 3a limbă : %s Despre Conturi.. Vârsta : %s Interval vârstă : %s Anti-spam: omoară mesajele de la necunoscuÅ£i : %s Aranjează contactele in grupuri : %s Cerere de autorizare : %s Schimbare automată statut în Away (min) : %d Schimbare automată status în N/A (min) : %d Ziua de naÅŸtere : %s Telefon mobil : %s Schimbă schema de culori în : %s Schimbă dispozitivul de sunet în : %s Canal : %s Mod chat al mesajelor : %s Verifică poÅŸta locală : %s Verificare parolă : %s OraÅŸ : %s Comentariu ComunicaÅ£ii Companie : %s Contacte Å¢ară : %s Departament : %s Evenimente detaliate în ~/.centerim/log : %s Detalii Renunţă E-mail : %s E-mail : %s Editează mesajul robot la schimbarea statulului : %s Activează suportul bidirecÅ£ional pt. limbă : %s Activează indicatorul web al statutului : %s Fax : %s FiÅŸiere Caută/adaugă utilizator(i) Caută/adaugă utilizatori Prenume : %s Gen : %s General Grupuri Ascunde utilizatorii offline : %s Acasă Homepage : %s IM manager conturi SosiÅ£i de la ultima verificare Cuvinte cheie Limbă : %s Nume : %s LocaÅ£ie Login : %s Diverse Mai multe Mută in grupul.. Nume : %s ReÅ£ea Nickname Nickname : %s Doar online Parolă Parolă : %s Parolă de setat : %s Telefon : %s FuncÅ£ie : %s Citează mesajul la reply : %s Random chat group Random chat group : %s ÃŽnregistrează Progres înregistrare Salvează parolele : %s Åžterge canalul del Cere autorizaÅ£ie Server SMTP : %s Caută profile Trimite mesaj canalului enter Trimite SMS Trimite fiÅŸier(e) lui %s, %lu Server : %s Server de folosit : %s Setează mesajul robot Stat : %s Adresa : %s UIN UIN : %s Editează detalii InterfaÅ£a utilizator Vezi/editează lista ignoră Vezi/editează lista invizibilă Vezi/editează lista vizibilă Serviciu Detaliile dvs. %s Cod poÅŸtal : %s [Ctrl-X salvează, Esc anulează] [aim] AOL TOC [icq] reÅ£eaua ICQ [irc] IRC [msn] M$ Messenger [yahoo] YAIM parolă: adresă server: uin: nume utilizator: ! rulează incă o copie a centerim! spaÅ£iu pe disk mai mic de 10k, mergem offline! altfel am putea pierdem evenimente si configuraÅ£ii! aceasta poate cauza probleme. pid %lu%s pentru %s a fost pus la poÅŸtă%s este offline%s este offline%s este online, cu statului %s* Autorizare : * Cerere autorizare : * SMS : + %s a fost adăugat la contacte+ [%02d:%02d:%02d] poÅŸtă nouă, %d mesaje+ [%s] setăm automat %s+ [%s] status restored+ [aim] conectare eÅŸuată: %s+ [aim] parolă trimisă+ [aim] conectare la server imposibilă+ [icq] deconectat+ [icq] SMS eÅŸuat pentru %s+ [icq] SMS eÅŸuat pentru %s, %s+ [irc] conectare eÅŸuată: %s+ [irc] nickname schimbat cu succes+ [irc] conectare la server imposibilă+ [yahoo] conectare imposibilă: + [yahoo] conectare imposibilă: contul a fost blocat+ [yahoo] conectare imposibilă: username si parolă nepotrivite+ [yahoo] e-mail de la %s, %s+ [yahoo] părăsim conferinÅ£a %s+ fiind offline nu puteÅ£i prelua mesaje robot+ ultimul mesaj de la %s+ nici un URL in contextul curent+ arhiva lui %s este goală+ utilizatorul a revenit+ pt. a reactiva vizitează %s+ utilizatorul %s este deja în contacte20 ÅŸi ceva2a e-mail30 ÅŸi ceva40 ÅŸi ceva50 plusPeste 60DespreAcceptăAdaugăAdresăVârstăVârstă: AprSigur doriÅ£i să-l ÅŸtergeÅ£i pe %s?Sigur doriÅ£i să ÅŸtergeÅ£i grupul?AugPerioadă auto-Away (0 - dezactivează): Perioadă auto-N/A (0 - dezactivează): Ne auto-alăturăm la conferinţăAwayMesaj robot:TrecutZiua de naÅŸtereTelefon mobilTelefon mobil: SchimbăCanal: Verifică parola introdusă: OraÅŸ: ComentariuCompanieCompanie: Conectare la serverul %s ...Membrii conferinÅ£ei sunt: DNDDecDepartamentDepartament: DetaliiDeconectatGataRenunţă la informaÅ£iile contului mai întăi!E-mail: E-mailE-mail: EditeazăCerere de autorizare fară conÅ£inutIntrodu ziua de naÅŸtere (ZZ-LL-AAAA): DestinatariFaxFax: FebFemeiePreluăm detaliile dvs.TerminatPrenume: Dispus la discuÅ£iiFwdJocuriGenGeneralGeneral ChatTot inainteArhivă pt. %s, %d evenimente in totalAcasăHomepageHomepage: ÃŽmi place la nebunie mesajul robot pentru %s al %s %s.ÃŽmi place enorm profilul AIM al centerim %s. Ignoră evenimentele de la %s?Lista ignorăPrimesc %s de la %sInfoInformaÅ£ii despre %sIntereseInvizibilLista invizibilăIanIunIunCuvinte cheie: Dat afară de %s; motiv: %sLimbiUltimul IPNume: Ultima dată văzutÃŽncarcăLocaÅ£ieBărbatMarMaiMesajNr. mobil: Mai multeMută la contacteN/ANumeNume grup de creat: Nume: NiciodatăAm primit noul uin, %luNume nou pt. grup: Noul nickname: Numele noului profil: Căutare nouăUrmătorulNicknameNickname de setat: Nickname: NespecificatNoiOcupatOctOfflineOkE-mail vechiPe canalele: OnlineDeschideOrganizează grupurile de contacteTrimit %s lui %sIntroduceÅ£i o parolăParolă: Parolele nu se potrivescTelefonTelefon: FuncÅ£ie: Random Chat UserPrimit pe %sRespindeÅžtergeRedenumeÅŸteReplyPreiaReîncercare..RomantismSMSHostname SMTP server: Rezultatele cautării [gata]Caută/AdaugăCăutăm contactele..Căutând bărbatCăutând femeieSelecteazăSelectaÅ£i grupul in care-l adaugămSelectaÅ£i un grup in care-l mutămSelectează contactele de adăugat la listăTrimiteTrimitem cerereaTrimis pe %sSepServer: Stat: Adresă: StudenÅ£iExistă un profil cu acest nume. DoriÅ£i să-l suprascrieÅ£i?Utilizatorul %s v-ă invită la conferinÅ£a %s, subiectul este: %sUtilizatorul %s s-a alăturat la conferinţăUtilizatorul %s a părăsit conferinÅ£aAstăzi este ziua utilizatoruluiUtilizatorul a acceptat cererea dvs. de autorizareUtilizatorul v-a adăugat la contactele lui/eiUtilizatorul ÅŸi-a schimbat nick-ul din %s în %sUtilizatorul nu are profilUtilizatorul a respins cererea dvs. de autorizare; mesajul a fost: Timpul aÅŸtepare uin a expirat. Reîncercăm?Fus orarTitluUIN: URLURL-uri in contextul curentInformaÅ£ii utilizatorLista vizibilăStai puÅ£in. Detaliile nu au fost incă preluateServiciuTrebuie să te deconectezi mai întăi!Trebuie să fii conectat la reÅ£eaua ICQ pt a edita detaliileDetaliile dvs. au fost preluateCod poÅŸtalCod poÅŸtal: aim conectare eÅŸuatăas requestedautorizareawaymesaj robotparolă greÅŸităusername greÅŸitalbastruÅŸtergene-am schimbat statutul %s din %s in %scomentariu: could not create socketcould not resolve hostnameintunecatdezactiveazănu schimbae-maileroare eveniment: parametrii insuficienÅ£ieroare eveniment: icq permite doar UIN-urieroare eveniment: IM necunoscuteroare eveniment: eveniment necunoscutpornim log-ul evenimentelornume fiÅŸier: icq motive de deconectareignoratprimesc %s de la %sîncarcămesajmodul 1modul 2mută josmută sUsn/anunimicnotificaretrimit %s lui %sparolă: ÅŸtErgeînregistrarea nu este suportatăsAlveazăcaută: socket problemsplacă de sunetspeakereroare schimbare statut: mesajul a fost: turboingIM necunoscutcaracter necunoscut pt. schimbarea statululuiusername si parolă nepotriviteverificaÅ£i host-ul ÅŸi portul introdusdacenterim-4.22.10/po/es.gmo0000644000175000001440000006644011473011460012143 00000000000000Þ•­„ Aìð#Kñ#6=$-t$G¢$=ê$H(% q%%“%§%»% Ã% Ï%Ú%6ë%#"&F&*d&)&¹&Ê&à&þ&'.'='X'w' ‘' '§'¸'Ç'Ö'å'0÷' ((2( 9( G()U(-("­( Ð(Û(ó(û()) 0) >)H)Q)k)r)‚)—)ª) Â)"Ð) ó)þ)** .* 9*F*V*]* n* z* „** Ÿ*­*Æ* ×*â*ý* + $+1+7+G+g+{+ ”+Ÿ+·+Ñ+ñ+,,-, M, Z,h, ‚,,¥,'¸, à,í,- --*-;-R-l-„-‹--­-É-Ø- ë-ö- .. .).;. B.+O.1{.0­."Þ."/$/4/E/e/x/ “/¡/±/º/0Ú/ 0'0>0Y0'o0—0¬0Å0â0)ý0'1'=10e1–14±16æ12#:2*^2‰2$œ2Á2,Û233 43 U3 b3 m3 z3‡33 ˜3¢3¨3¯3³3»3¿3Å3É3&é34 454U4p4 u4 ƒ4 Ž4˜41Ÿ4Ñ4Ú4ë4 ò4 ü45$5,5 45>5 ^55–5š5 ž5 ©5¶5 ¾5Ë5#Ð5ô5ý56 6#666U6f6~6‚6ˆ6Œ6“6©6¾6 Ç6 Ô6â6æ6ì6ó6 û677"7B7G7 P77[79“7Í7 è7ô78 8 "8 ,868E8\8`8d8 h8s8 Œ8–8 ž8 ª8´8¹8Â8Ç8Ë8Ï8×8ç8ì8ý89 9'9.949J9c9z9 9˜99¦9 ¸9 Ã9Ñ9Õ9Þ9â9ê9 í9 ø9: ::*:&<:c: |:‡:ž:¤:¬: Ç:Ò:×:è:÷:þ:; ;; ;&;.;2;I; _;j; ; ‹;™;! ;"Â;"å;< << -<8<<<E<M<^<Gg<¯<&Æ<'í<?=HU=%ž=#Ä=è=0>.7>-f>$”>C¹>'ý>%?.?4?:?>?^? f? p?4}?²?)·?;á?A@_@~@ ‡@’@˜@ ®@ »@É@ Î@ Û@ è@õ@ú@#A $A.A7AOAjA"oA’A šA§A¬A³A*·A<âA$B'DBlB-B ­B ¹BÄBÊBãBëBÿBC CCC C)C1C5CMCPC UCbC tCC†C¤C ©C¶C ÆCÑCÙCßCõCDD" DCD&bD‰DŽD¦’D\9FF–F6ÝFMGCbGK¦GòGHH%H7H ?H JHVH?kH#«HÏH<îH8+IdIwI#I´I&ÄI ëI$øI(JFJ eJ sJ€J‘J£J ¸JÅJ>ÙJ K #K /K =K9KK5…K(»K äK'ïK L"L>L WLeL tL~L&‡L®L¶LÎLìLMM+.MZM kMyM‰M šM§MÀMÉMÐM âMðMöM þM N#NBN YNgN…N˜N¸NÉNÏN0àNO+O IOUOmOŠOªO¾OÓOåOPP'PEPUP pP,‘P ¾PÌPÞP äP ïPQ&QEQeQ ƒQQ¡Q ·QØQçQ öQR R#R(R7RRRYR2nR=¡R@ßR) S JSkSS"˜S»SÎSîSýST#!T3ET&yT T·TÕT-ñTU4ULUhU2†U¹U-ÕU7V;V;[VV—VîV' WE1WwW(W'¸W:àWX2X+OX {X …X X šX ¤X¯X·XÆXÌXÔX ÜXçXìXóX%÷X+YIY-MY){Y-¥YÓYÛY ðY úYZ<ZLZTZhZpZ&xZŸZ ¨Z ³Z ¾ZËZ-éZ [8[;[?[G[V[ _[l[.r[¡[ª[±[¹[,À[-í[\0\O\S\Y\]\f\"\ ¢\­\¶\É\Í\Ô\Ü\ ä\ñ\]& ]4] :] D]AP]>’]"Ñ]ô]^ ^%^ ;^ E^O^c^{^^ƒ^‡^˜^µ^ ½^ Ç^Ò^è^ í^ ø^__ __2_7_I_M_(T_}_†_Œ_¤_Á_Ù_ó_ ` ``(`0`@`D`L`P`X` [`f`w`~`„`¢`)º`ä` aa .a 8a"Da gasa|a–a¥a®a ·a Áa ËaÕaäaìa$ða$b:bIb^bob €b/Œb0¼b-íbc"c5c HcVc Zcec nc {c;‡cÃc$Ýc/dC2dFvd*½d*ède4/e1de&–e+½eCée9-fgfofwf}ff¡f§f·f;Éfg( gD6g@{g!¼g Þg ègôgügh $h2h:hNheh‚h‡h*h ºh ÇhÑh"éh i&i :i HiSiYi`i5diGši-âi1jBj4_j”j¨j¼j Åjæjïj kkk%k,k3kCkTkXkvkyk kk §kµk!¾kàk èkõk ll#l+lJl[ldl0{l2¬l4ßlmm/Ê"(Vc[Ä SYÇ0§Ý|“¢ö¡_|+ZòL §v¾8$¥‡aNr­.¨4R^„‡®»Þ#89m´ø‚Xb.\š†a‚ß–~éj¼1¯Ã,Ž%Q±6#j2¤O?w¶MEZ Y˜Ó7uA-Š·õþW¨ûo qÜLá™yHSoV©–*†À>äBl)p:b‘¬5Ág€v©ÅE"[f]hNÑñè`Îsœ'leÒ‰…C“U¤z¸˜•QR¢Ícóô Ø015 Ú6kªx?Ë{› ‹ d”ŒJ^¬}æ;;{µp’ƒÈAÖîð­ŠM)Æ™iêG‘n½D~,ïù3K:d¦ŽK@ŒOªŸtFý’DPíë!Õœ—¿žk4—Cfmüƒ-<zì%ÛgyúhWH2ˆâ!wU>e=<£‹°«xÐXž›n ]¡Ÿ+3I( £«=”&*sˆ/t…_ iÿ²9à•ÌšÔJ€Ï`&ºÙI¥„P‰G¦$'å׳rT¹É ãFçT÷Bu} \ q7@ --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --help display this stuff -n, --number mobile number to send an event to (sms only) -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s About Accounts.. Age : %s Age range : %s Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Birthdate : %s Cellular phone : %s Change color scheme to : %s Change nickname Change sound device to : %s Channel : %s Chat messaging mode : %s Check the local mailbox : %s Check the password : %s City : %s Comment Communications Company : %s Contact list Country : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable web status indicator : %s Fax : %s File transfers monitor Files Find/add user(s) Find/add users First name : %s Gender : %s General Groups Hide offline users : %s Home Homepage : %s IM account manager Incoming from %s Invite to conference.. Join channel Joined since the last check only Keywords Language : %s Last name : %s Leave channel Location Login : %s Miscellaneous More Move to group.. Name : %s Network Nickname Nickname : %s Online only Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Ping Position : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Registration progress Remember passwords : %s Remove channel del Request authorization SMTP server : %s Search profiles Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Set away message Show users who have you on their list State : %s Street address : %s UIN UIN : %s Update user details User interface View/edit ignore list View/edit invisible list View/edit visible list Work Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [icq] ICQ network [irc] IRC [msn] M$ Messenger [yahoo] YAIM of password: server address: uin: user name: ! another running copy of centerim detected! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! this may cause problems. pid %lu%s to %s has been put to the queue%s went offline%s: went offline%s: went online, with status %s* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [msn] reverse users listing finished, %d found+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ cannot fetch away messages being offline+ last msg from %s+ no URLs within the current context+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateCancelCannot remove a transfer which is in progress nowCellularCellular phone: ChangeChannel: Check the password you entered: City: CommentCompanyCompany: Connecting to the server %s ...Current conference members are: Custom status message:DNDDecDepartmentDepartment: DetailsDisconnectedDoneDrop the account information first!E-Mail: E-mailE-mail: EditEmpty authorization request messageEnter birthdate (DD-MM-YYYY): Event recipientsEvents sending options:FaxFax: FebFemaleFetching your detailsFile transfer statusFinishedFirst name: Free for chatFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJulJunKeywords: Kicked by %s; reason: %sLanguagesLast IPLast name: Last seenLoadLocationMaleMarMayMessageMobile number: MoreMove to contactsN/ANameName for a group to be created: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New profile name: New searchNextNicknameNickname to set: Nickname: Not specifiedNovOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %s to %sPING reply from the user: %d second(s)Password must be enteredPassword: Passwords do not matchPhonePhone: Please join my conference.Position: PrevRandom Chat UserReceived on %sRejectRemoveRenameReplyRetrieveRetrying..RomanceSMSSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSendSend contacts..Sending requestSent on %sSepServer: State: Street address: StudentsThe profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: Timed out waiting for a new uin. Retry?TimezoneTitleUIN: URLURLs within the current contextUsage: User infoVisible listWait a moment. Your details haven't been fetched yetWorkYou have to disconnect the service first!You must be logged to the ICQ network to update the detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: abortaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecLearchanged our %s status to %s from %scomment: contactscould not create socketcould not resolve hostnamedarkdirectory to save the file(s) to: disabledon't changedonee-mailerrevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dfile name: filename: filesicq disconnection reasonignoredincoming %s from %sinitlOadmessagemode 1mode 2move Downmove Upn/anew MSN friendly nick: nononenotificationoutgoing %s to %spassword: rEmoveregistration is not supportedsAvesearch for: socket problemssound cardspeakerstartstatus change error: the message was: turboingunknown IM typeunknown status character was givenusername and password mismatchverify the pager host and port enteredworkyesProject-Id-Version: centerim 4.8.7 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2002-11-05 03:52-0500 Last-Translator: Leonardo Boshell Language-Team: Spanish Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -ascii, -a usar caracteres ASCII para las ventanas y controles de la interfaz --basedir, -b establecer un directorio base personalizado --help desplegar esta información -n, --number <#tel> número de móvil a quien enviarle un evento (sms) -s, --send tipo de evento; puede ser msg, sms o url -t, --to UIN de destino o alias (depende en el protocolo) %s: detalles 1er idioma : %s 2do idioma : %s 3er idioma : %s Sobre Cuentas.. Edad : %s Rango de edad : %s Anti-spam: evitar mensajes de usuarios fuera de la lista : %s Acomodar contactos en grupos : %s Autorización requerida : %s Periodo para cambiar automáticamente a Ausente (min) : %d Periodo para cambiar automáticamente a N/D (min) : %d Cumpleaños : %s Teléfono celular : %s Cambiar esquema de colores a : %s Cambiar Alias Cambiar dispositivo de sonido a : %s Canal : %s Modo de mensajería tipo chat : %s Revisar la cuenta de correo local : %s Confirme la contraseña : %s Ciudad : %s Comentario Comunicaciones Compañía : %s Lista de contactos País : %s Departamento : %s Registro detallado de eventos del IM en ~/.centerim/log : %s Detalles Abandonar E-Mail : %s E-Mail : %s Editar el mensaje de ausencia al cambiar de status : %s Habilitar soporte para idiomas bidireccionales : %s Habilitar indicator de status web : %s Fax : %s Monitoreo de transferencias de archivo Archivos Buscar/agregar usuario(s) Buscar/agregar usuarios Nombre : %s Género : %s General Grupos Esconder usuarios desconectados : %s Hogar Página personal : %s Administrador de cuentas IM Evento entrante de %s Invitar a conferencia.. Unirse al canal Nuevos desde el último chequeo solamente Palabras clave Idioma : %s Apellido : %s Abandonar canal Ubicación Nombre de usuario : %s Varios Más Mover al grupo.. Nombre : %s Red Alias Alias : %s Conectado únicamente Organizar grupos de contactos Evento saliente a %s Contraseña Contraseña (opcional) : %s Contraseña : %s Contraseña a establecer : %s Teléfono : %s Ping Posición : %s Citar el mensaje original en la respuesta : %s Grupo de chat aleatorio Grupo de chat aletario : %s Registrar Progreso del registro Recordar contraseñas : %s Eliminar canal delPedir autorización Servidor SMTP : %s Buscar perfiles Enviar mensaje al canal enter Enviar un SMS Enviar archivo(s) Enviar archivo(s) a %s, %lu Servidor : %s Servidor a utilizar : %s Establecer mensaje de ausencia Mostrar usuarios que lo tienen en su lista Estado : %s Dirección : %s UIN UIN : %s Actualizar detalles de usuario Interfaz de usuario Ver/editar lista de ignorados Ver/editar lista de invisibles Ver/editar lista de visibles Trabajo Sus detalles de %s Código postal : %s [Ctrl-X guardar, Esc cancelar] [aim] AOL TOC [icq] Red ICQ [irc] IRC [msn] M$ Messenger [yahoo] YAIM de contraseña: dirección del servidor: uin: nombre de usuario: ! se detectó otra copia de centerim ejecutándose! el espacio libre en disco es menos de 10k, desconectándose! de otro modo pueden perderse eventos y datos de configuración! esto puede ocasionar problemas. pid %lu%s a %s ha sido colocado en cola%s se ha desconectado%s: se ha desconectado%s: se ha conectado, con status %s* Autorización : * Petición de autorización : * Contactos : * Transferencia de archivo* SMS : + %s ha sido agregado(a) a la lista+ [%02d:%02d:%02d] llegó nuevo correo, %d mensajes+ [%s] automáticamente estableció %s+ Status [%s] retomado+ [aim] conexión fallida: %s+ [aim] contraseña enviada+ [aim] no fue posible conectarse al servidor+ [icq] desconectado+ [icq] falló SMS a %s+ [icq] falló SMS a %s, %s+ [irc] conexión fallida: %s+ [irc] el alias fue modificado satisfactoriamente+ [irc] contraseña enviada+ [irc] no fue posible conectarse al servidor+ [msn] terminó el listado de usuarios, %d encontrados+ [yahoo] no puede conectarse: + [yahoo] no puede iniciar sesión: la cuenta fue bloqueada+ [yahoo] no puede iniciar sesión: no coinciden el nombre de usuario y la contraseña+ [yahoo] e-mail de %s, %s+ [yahoo] abandonando la conferencia %s+ no se pueden consutar los mensajes de ausencia estando desconectado+ ultimo mensaje de: %s+ no hay URLs dentro del contexto actual+ no hay ítems en el historial para %s+ la configuración de %s fue modificada, cargada de nuevo+ el usuario ha vuelto+ para reactivarla visite %s+ el usuario %s ya se encuentra en la lista20 y algo2do e-mail30 y algo40 y algoMás de 5060-másSobreAceptarAgregarDirecciónEdadEdad: Abr¿Está seguro que desea eliminar %s?¿Está seguro que desea eliminar el grupo?AgoPeriodo de Auto Ausente (0 - deshabilitado): Periodo de Auto N/D (0 - deshabilitado): Se ingresó automáticamente a la conferenciaAusenteMensaje de ausencia:TrasfondoCumpleañosCancelarNo puede eliminar una transferencia que ya está en progresoCelularTeléfono celular: CambiarCanal: Confirme la contraseña que ingresó: Ciudad: ComentarioCompañíaCompañía: Conectando al servidor %s ...Los miembros actuales de la conferencia son: Mensaje de status personalizado:NMDicDepart.Departamento: DetallesDesconectadoHechoAbandone la información de la cuenta primero!E-Mail: E-MailE-Mail:EditarMensaje de solicitud de autorización vacíoIngrese su fecha de nacimiento (DD-MM-YYYY): Receptores de eventoOpciones de envío de eventos:FaxFax: FebFemeninoConsultando sus detallesStatus de transferencia de archivoFinalizadoNombre: Libre para chatearFwdJuegosGéneroGeneralChat GeneralOpciones generales:ProsigaHistorial para %s, %d eventos en totalHogarSitio webSitio web: De veras me gusta el mensaje de ausencia por defecto %s de %s %s.De veras me gusta el perfil de AIM por defecto de centerim %s.¿Ignorar todos los eventos de %s?Lista de ignoradosEvento entrante %s de %sInfoInformación sobre %sInteresesInvisibleLista de invisiblesInvitar a conferencia..EneJulJunPalabras clave: Expulsado por %s; razón: %sIdiomasUltimo IPApellido: Visto por última vezLeerUbicaciónMasculinoMarMayMensajeNúmero de dispositivo móvil: MásMover a contactosN/DNombreNombre para el grupo que se va a crear: Nombre: NuncaNuevo UIN recibido, %luNuevo nombre para el grupo: Nuevo alias a mostrar: Nuevo nombre del perfil: Nueva búsquedaSiguienteAliasAlias a establecer: Alias: No especificadoNovOcupadoOctOfflineOk3er e-mailEn los canales: OnlineAbrirOrganizar grupos de contactosEvento saliente %s a %srespuesta PING del usuario: %d segundo(s)Debe ingresar una contraseñaContraseña: Las contraseñas no coincidenTeléfonoTeléfono: Por favor únase a mi conferencia.Posición: AnteriorUsuario de Chat AleatorioRecibido en %sRechazarEliminarRenombrarResponderConsultarReintentando..RomanceSMSNombre de servidor anfitrión SMTP: Resultados de búsqueda [finalizado]Buscar/AgregarBuscando contactos..Buscando HombresBuscando MujeresSeleccionarSeleccione un grupo en donde agregar al usuarioSeleccione un grupo hacia donde mover al usuarioSeleccionar contactos para agregar a la listaEnviarEnviar contactos..Enviando solicitudEnviado en %sSepServidor: Estado: Dirección: EstudiantesEl perfil con ese nombre ya existe. ¿Desea sobrescribirlo?El remoto está usando %sEl directorio especificado no existeEl directorio especificado no se puede escribirEl usuario %s ha rechazado su invitación a unirse a la conferenciaEl usuario %s lo ha invitado a la conferencia %s, el tema allí es: %sEl usuario %s se ha unido a la conferenciaEl usuario %s ha abandonado la conferenciaEl usuario cumple años hoyEl usuario ha aceptado su petición de autorizaciónEl usuario lo ha agregado a su lista de contactosEl usuario cambió su alias de %s a %sEl usuario no tiene información de perfil.El usuario rechazó su petición de autorización; el mensaje fue: Tiempo de espera agotado para un nuevo uin. ¿Reintentar?HorarioTítuloUIN: URLURLs dentro del contexto actualUso: Info de usuarioLista de visiblesEspere un momento. Sus detalles no han sido recuperados aunTrabajoDebe desconectarse del servicio primero!Debe encontrarse conectado a la red ICQ para actualizar los detallesDebe encontrarse conectado a la red MSN para actualizar el aliasSus detalles han sido recuperadosCód. ZipCód. Zip: abortarconexión con aim fallócomo se pidióautorizaciónausentemensaje de ausenciacontraseña incorrectanombre de usuario incorrectoazulLimpiarmodificado nuestro status %s a %s desde %scomentario: contactosno se pudo crear socketno se pudo resolver nombre de hostoscurodirectorio en donde guardar archivos: deshabilitadono cambiarhechoe-mailerrevento enviando error: no son suficientes parámetrosevento enviando error: solo UINs están permitidos con el protocolo icqevento enviando error: tipo de IM desconocidoevento enviando error: tipo de evento desconocidoregistro de eventos iniciadoejecutada acción externa %s, código retornado = %dnombre de archivo: nombre de archivo: archivosrazón de la desconexión en icqignoradoevento entrante %s de %sinicializarleer (O)mensajemodo 1modo 2(D) mover abajo(U) mover arriban/dnuevo alias amistoso de MSN: noningunonotificaciónevento saliente %s a %scontraseña: Eliminarel registro no está implementadoguArdarbuscar por: problemas de sockettarjeta de sonidospeakeriniciarerror en el cambio de status: el mensaje fue: turboingtipo de IM desconocidofue entregado un carácter de status desconocidono coinciden el nombre de usuario y la contraseñaverifique el host y puerto ingresado del localizadortrabajosícenterim-4.22.10/po/zh_CN.gmo0000644000175000001440000012553011473011457012537 00000000000000Þ•¬|—Ü*89K996…91¼95î9-$:/R:I‚:8Ì:G;=M;H‹; Ô;â;ö; <<*><i< q< }<ˆ<™<¨<'À<6è<#=C=U=*s=)ž=È=ß=ð=>$>6>M>k>z>•>!³>Õ>ô> ?? 1?;?L?[?j?y?Œ?0ž? Ï?Ù?)ø?"@;@ B@ P@)^@-ˆ@+¶@)â@" A/A!NA pA ~A‰A›A³A»AÎAÞAðA B BB%B>BXB_BoB„BžB±B ÉB×B"ðBC (C3CCCSCdCsC…C!˜CºC ÏC ÚC äCñC D D 0DF^FrF ‹F–F³FÍFåFüFG,GLGcGvGŠGœG­G¼GÌGäG H HH 9HGH \HfH'yH ¡H®HÄH ÓH#ôHI0I 6IAISI iIuI†I¤I»IÕIíIôI JJ,JHJWJgJ zJ …J“J¥J ¹JÇJ ÌJ ØJäJöJ ýJ+ K26K1iK0›K+ÌK"øK L'LBL]LvLL¢L ±L½L2ÎLM" MCM)XM*‚M­M½MÎM îM øMNN 4NBNRN[N0{N¬NÈNßNúN'O8OQOjO&O"¨OËOâO÷OP-P)HPrP'ˆP°PÁP#ÖP'úP'"QJQiQ€Q›Q¸QÐQ'æQ6RERaRzR0•R1ÆR øRS44S6iS" SÃS#àST*#TNT aT‚T$¢T$ÇTìT,U3UFU _U€U žU «U ¶U ÃUÐUØU áUëUñUøU üUVVVVV&>VeViV rV“V³VÎV ÓV áV ìVöV W1W FWQWZWkW rW€W•W ®W"¸W ÛWüWXX -XNXUX ]XhX pXzXšX ©XÊXÙXðXôX øX Y $Y 1Y?Y GY TYaYpY#uY™Y¢Y©Y²Y ·Y#ÄYèYñY ZZ/ZGZZZaZeZkZoZvZ‰ZœZ²Z ÇZ ÔZ àZ îZ øZ [ [[[[ %[2[C[L[\[y[Œ[¬[±[ º[7Å[9ý[7\ R\ ^\j\~\ƒ\ ˜\ ¢\¬\»\Ò\ Ö\â\æ\ ê\õ\] ]] #] .] :] F]P]U]\]k]p]y]~]‚] ]¤]¬]Æ]Ö]Û]ì]ð] õ] ^#^*^0^F^_^v^…^ ˜^£^ ¨^³^¼^ Î^Ù^ Þ^ ì^ú^þ^_ ___ _ %_3_:_?_ W_c_u_‰_9ž_&Ø_ÿ_`&*`&Q`x` ‘`œ`#³`×`Ý`å`a aaa)a.a6=ata|aaœa£a(ªa5Óa bbb+b!1bSb\b ebpbxb€b„b›b ±b¼b Ñb Ýbëb!òb"c"7cZcrcwc †c ’c c°c ÀcËcÏcØcëcócd) d47dGld´d&Ëd'òdJe?eeH¥e%îe#fI8f‚f0 f.Ñf-g$.gCSg\—g+ôg' hHhQhWh_hh…h‰hh¯hÈh'Úhii i&i5i =i4Jii„i%•i)»iBåi;(j?djA¤jæjk kkk9k Ok \kjk ok |k ‰k–k›k¢k¨k#·k Ûkåkþkl!l9lTlclhl"mll ˜l ¥l²l·lËlÒlÖl=Ül*m<Em$‚m'§mÏm-âm4n En Qn\nbn hnun†nŒn¥n­nÁnÚnßnän én(óno$o(o/o 6o@oHoLodogo lovo oŒo!žo ÀoËoào!òopp4p ;pFpdp‚p‡p ¡p®p ¶pÀp ÐpÛpãpépÿpqq"q"2qUqZqkqŠq&§qÎq ÓqÝqáqôqRús6Mt0„t-µt-ãt=uKOu3›u<ÏuF vJSvžv ³vÁvÕvév)w1w :w Dw Rw `wnww0žwÏwìwx7x/Mx}x x žx¬xÉxØxìx yy2y%LyryŒy  y®yÂyËy Ôyây ñyÿy z9$z^zmz#‰z­zÅz Îz Üz+êz{56{l{"…{"¨{"Ë{î{ ÿ{ ||0|9|O| d|o| †|”||¦|Â|ß| è|ö| }%}4} J}X}%m}“} ¨}´} Ä} Ò}Ý}ì}~~;~R~ a~ m~{~”~ª~ ³~Á~Ê~ Ú~ è~ö~%5 >L8[”© ²ÀÐÙ ö€ € +€9€#?€ c€q€‡€&˜€¿€߀ô€0?Tcw#Ž ²ÀÖåù‚‚*‚&C‚ j‚ x‚†‚‚´‚ ˂Ղ5邃.ƒ BƒPƒ,mƒšƒ¯ƒ µƒÀƒÒƒíƒýƒ%„5„Q„p„Œ„•„ª„½„Ñ„ï„þ„… … +…9…K… _…m… s… }…Š…… ¤…'±…+Ù…&†/,†$\††›†&£†ʆè†ü†‡ 1‡ >‡K‡._‡#އ²‡#Ò‡0ö‡/'ˆ Wˆ dˆ!rˆ ”ˆ ˆ °ˆ¼ˆΈàˆïˆøˆ+‰?‰V‰j‰ƒ‰›‰¹‰Љí‰% Š*0Š[ŠsŠˆŠ!¦ŠÈŠ áŠ‹‹8‹J‹+a‹‹$«‹Ћð‹ Œ"'ŒJŒbŒ"{Œ7žŒÖŒêŒ#;&Hb(«Ô+í7ŽQŽ%nޔޝŽ,ÏŽ!üŽ1Lk‰(¨Ñæø % 2 @ MZ j t€‡Ž•¨¯¶¿'Æî ‘ ‘+‘(F‘o‘‚‘‰‘™‘ ‘§‘½‘2Ä‘÷‘’’’ ’%’8’O’X’q’Š’‘’ ’°’¿’È’Ï’Ø’ß’è’ “!“2“A“Y“ ]“g“…“Œ“ •“ Ÿ“ ¬“¹“ À“͓ԓñ“ú“” ””%”;”B”^”q””•”¤”«”²”»””Ɣٔ씕• • +•8•?•F•M•T•[•b• i• v• „•Ž•£•À•%Ö•ü•– –,–.@–$o– ”–¡–±–Ê–Ñ–ä–ë–ò–———.—5— <—I—h—k—r—‚—•— ›—¨—»— — Ì—Ù— á—î—ò—ù—˜˜%˜7˜F˜M˜`˜g˜n˜ƒ˜ ”˜ž˜¥˜¸˜ ǘ Ó˜ߘ õ˜ ÿ˜ ™™ ™)™2™9™ @™ J™T™[™b™i™p™ w™…™•™œ™ £™ °™º™Ë™Þ™Cô™(8šaš{š'Žš¶šÒšåšîš.þš-›4›=› T›^›g›o› ~›ˆ›Hš› ã›î›œœœ'&œ-Nœ|œŒœ ”œ¡œ¨œÇœΜ Õœ ✠ïœùœ$4 C MW^w¬Ë Ò Ü éö ž žž &ž2ž HžRžaž"hž2‹ž:¾žùžŸ+ŸNJŸ(™Ÿ6ŸùŸ L3 € '™ 3Á %õ $¡2@¡Vs¡"Ê¡#í¡¢¢¢!(¢J¢P¢T¢Z¢q¢ „¢%‘¢·¢Í¢ Ü¢é¢ü¢ £,£=£D£^£}£2Ž£%Á£/ç£,¤D¤ c¤p¤¤†¤ ¤ ±¤¾¤Ť ̤ Ù¤æ¤ ¥¥¥¥,/¥\¥e¥x¥‹¥’¥¥¥ ¾¥ ˥إܥû¥¦ ¦¦¦0¦7¦>¦6E¦!|¦7ž¦(Ö¦*ÿ¦*§(=§(f§ § ›§§§®§ µ§ §ϧÖ§ç§î§ ¨$¨+¨3¨;¨*B¨m¨t¨ x¨ ‚¨ Œ¨ —¨¢¨¦¨·¨»¨ ¨ ̨Ö¨ ݨ먩 ©$©-6© d©'n©–© ž©ª©éã©!ë© ªª ª(ª 8ª BªLªSªiª pª}ª„ª˜ª ®ª¸ªϪîª$«,« 3«A«E« ÉŠ & ,—ꯣUê”Çlï÷?„Q ¨„5žˆ»ý`*Û¾'J ÇMÜf é]Á}½o¥à0›‹—uC³x™‚Årh1”2X0Q¨áI3>Ÿ¬7;Œq&:.« °¢7wa)(y-–ÜZ|'Ò²ì=fR.Έ ,úÖ{V&@bo¨#¯"Ì ‰´cK…lm=<žÏþ$®-ÐÃ$óxÓu1«ÿ©8S«^×õäæß›sÍe+/ÏÚ~c5–Æ{ØúEyü>v¦r®nñ~ ĘÛÃzk8K+ª[æd,§`sWÁ+dÞp‰*P/ÓˆŠŽHD34Dl$L•MѦr£ÎÊ9YCphuLë³ÿjŒ?ÂíA–5ݧGµ"À’ƒ!‡†­L.¬4 ÉÞðaóÄÌBŒRÙ<“^ò9‡CéŠ:Ê×ÖàfíüSŽ´*6H²h`¥Õ(¶¡ðET‰ “ ¤jSx!-ëb9¢NDçAO^ª¿nen·]¼tÐT…w‘j€F™Â g%O©=O{!gbãÔv[%¡Iºg¤ªXzýZÕeçX¹y_Ú¶‹ßÙåNV3o¤È/»¸£A6@©|•Ñ ¿s÷ËRk Nƒ 1~™¦¢d} k¥Í#Ž\Y’\Ëži}¬zì2mù'UEH˜î † ø:_ïG †ôÅÆ“Uqš7Ÿ;ãt•FVœ·"cGôù½š˜6qYâÝ‚(€I’@2BÒ‚°ömÈšÀ;?P0Ô‘pû‘]ºî›‡¹Jœ¾­P”å[M<ƒB4û±\F_8vøQœtKŸâJZ„)±aiñ|)á§WöW%èwi—þäòè¼µ¡>€ØT…õ¸‹# --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --debug, -d enables debug info logging --help display this stuff --no-xtitles, -T disable xterm titles --offline, -o set all protocols status to offline upon start --version, -v show the program version info -n, --number mobile number to send an event to (sms only) -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Accounts.. Age : %s Age range : %s All protocols Already logged in only Always online non-IM contacts for : %s Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Assign PGP key.. Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Backdated entry : %s Birthdate : %s Cellular phone : %s Change color scheme to : %s Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Codepages conversion Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users First name : %s For protocols : %s Gender : %s General Groups HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Import friend list : %s Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Key passphrase: %s Keywords Keywords : %s Language : %s Last name : %s Leave channel Link an RSS feed Link an RSS feed LiveJournal posting: attributes Local charset : %s Location Logging Login : %s Look for online only : %s Mass group move.. Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network NickServ password (optional) : %s Nickname Nickname : %s Online only Online/offline events in the log window : %s OpenPGP key: %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Priority : %s Proxy only for HTTP (rss and lj) : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remote charset : %s Remove channel del Request authorization SMTP server : %s Search parameters Search profiles Search service Secured : %s Security : %s Select PGP key to use Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Show users who have you on their list State : %s Street address : %s Subject : %s Switch to language preset : %s Timestamps in the log window : %s Turn PGP encryption %s UIN UIN : %s Unassign PGP key Update user details Use no key User interface Users with photos only : %s View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM of password: priority: server address: uin: user name: ! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu%lu minutes%s from %s, received on %s%s has been deopped by %s.%s has been kicked by %s%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s or %s to close, Up/Down and PgUp/PgDn to scroll%s search, %s again, %s cancel%s to %s has been put to the queue%s to %s, sent on %s%s to URLs, %s external actions, %s close%s to URLs, %s to full-screenize, %s close%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [gg] cannot resolve %s+ [gg] connection failed+ [gg] connection lost+ [gg] connection to the server failed+ [gg] no away message from %s, %s+ [icq] cannot connect+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] cannot connect: + [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ [yahoo] server closed socket+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ new mail arrived, %d messages+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAdd to listAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateBlock channel messagesCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChange statusChannel chat historyChannel topic now is: %sChannel: Charset to convert messages from: Charset to convert messages to: CheckCheck frequency: Check the new password: Check the password you entered: City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Custom status message:DNDDecDefault Jabber conference serverDepartmentDepartment: Description: DetailsDetect musicDisconnectedDo not disturbDoneDrop the account information first!E-Mail: E-mailE-mail: EditEdit detailsEmpty authorization request messageEncodingEnter birthdate (DD-MM-YYYY): Event historyEvent recipientsEvents sending options:External actions..FailedFaxFax: FebFemaleFetch away messageFetch version infoFetching your detailsFile transfer statusFirst name: Force checkFree for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadGo to contact..HTTP proxy server hostname: Hide offline usersHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIgnore userIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLinkLink: List nicknamesLoadLocationMaleMarMass move selected users to..MayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: NoneNot availableNot specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %sOutgoing %s to %sPGP encrypt error: PGP key passphrase: PGP key search: type to find, %s find again, Enter finishPGP key selection: %s for quick lookupPGP passphrase required: PGP sign error: PING reply from the user: %d second(s)Password must be at least 6 chars longPassword must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: Please join my conference.PolishPosition: PostPosting subject: PrevPublished on: QuickSearch: type to find, %s find again, Enter finishRSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?Remove userRenameRename contactReplyResult of the external action %s:RetreiveRetrieveRetrying..RomanceRussianSMSSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSelect contacts to moveSendSend a messageSend an URLSend contactsSend contacts..Sending requestSent on %sSepServer: Show offline usersState: Street address: StudentsThe Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)This is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnBlock channel messagesUnable to connectUnable to connect to icq server. Retry?Unset ignore userUsage: User infoUser's detailsVersionVisible listWait a moment. Your details haven't been fetched yetWorkWrong Jabber ID!Wrong nickname given, cannot registerYou have to disconnect the service first!You must be logged to the Gadu-Gadu network to update your detailsYou must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: abortadding %s to the contactsaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: connecting to the servercontact list quick searchcontactscould not create socketcould not resolve hostnamecouldn't fetchdarkdaysdirectory to save the file(s) to: disabledisconnecteddon't changedonedual login detectede-mailerreventevent sending error: error creating directory for the contactevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfoundfriends onlyfull-screen viewhoursicq disconnection reasonignoredincoming %s from %sincorrect PGP passphraseinitlInklOadlogged inmembers list fetching finished, %d foundmessageminmode 1mode 2move Downmove Upn/anew MSN friendly nick: nononenot foundnot usednotificationoutgoing %s to %spassword was changed successfullypassword: pgp key quick searchpgp key selectionpost new entries to your journal.privatepublic (visible to all)rEmovereason: %sregistration is not supportedremoving %s from the contactssAvesearch finished, %d foundsearch for: secondsset by %ssocket problemssound cardspeakerstartstatus change error: successthe message was: turboingunknown IM typeunknown status character was givenuseduser info for %susername and password mismatchverify the hostname and portverify the pager host and port enteredworkwrong XMLyesyou are an op hereProject-Id-Version: centerim 4.20.0 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2005-02-04 11:12+0800 Last-Translator: Ying-Chieh Liao Language-Team: Chinese Language: zh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Chinese X-Poedit-Country: China --ascii, -a 使用 ASCII 字符æ¥ç»˜å‡ºè§†çª—以åŠä½¿ç”¨è€…ç•Œé¢ --basedir, -b 设置一个自定义目录 --bind, -B 使用自定义的 IP --debug, -d å¯åŠ¨é™¤é”™è®°å½• --help æ˜¾ç¤ºè¿™ä»½æ¶ˆæ¯ --no-xtitles, -T ä¸åŽ»ä¿®æ”¹ xterm 的视窗标题 --offline, -o å¯åŠ¨æ—¶å°†æ‰€æœ‰å议的状æ€éƒ½è®¾ä¸ºç¦»çº¿ --version, -v 显示程åºç‰ˆæœ¬èµ„讯 -n, --number 手机å·ç  (åªé™ç”¨åœ¨çŸ­ä¿¡) -s, --send 事件类型; å¯ä»¥æ˜¯ msg, sms 或是 url -t, --to 对象 UIN 或是昵称 (ä¾å议类型而异) %s 的详细资料 æ¯è¯­ : %s 第一外语 : %s 第二外语 : %s 确定, å–æ¶ˆ 或 确定, å–æ¶ˆ 关于 å¸å·.. 年龄 : %s 年龄 : %s 所有åè®® åªæœ‰å·²ç™»å½• æ°¸è¿œä¿æŒä¸Šçº¿çŠ¶æ€ : %s 防垃圾消æ¯: 删除éžå¥½å‹çš„æ¶ˆæ¯ : %s 分组分类显示法 : %s 指定 PGP 密钥... è¦æ±‚éªŒè¯ : %s è‡ªåŠ¨åˆ‡æ¢æŠŠçŠ¶æ€åˆ‡æ¢æˆå¤–出 (å•ä½åˆ†) : %d 自动把状æ€åˆ‡æ¢æˆ N/A (å•ä½åˆ†) : %d 过时æ¡ç›® : %s 生日 : %s 手机 : %s 改å˜è‰²å½©é…置为 : %s 修改昵称 ä¿®æ”¹å¯†ç  : %s 改å˜éŸ³æ•ˆè£…置为 : %s é¢‘é“ : %s èŠå¤©æ¶ˆæ¯æ¨¡å¼ : %s èŠå¤©æ¶ˆæ¯æ¨¡å¼ : %s 检查频率 (以分为å•ä½) : %lu 检查本地邮件 : %s ç¡®è®¤å¯†ç  : %s 城市 : %s 转æ¢è¯­ç³»é¡µç  附注 通讯 å…¬å¸ : %s 好å‹åˆ—表 国家 : %s 自定义心情 : %s 部门 : %s 在 ~/.centerim/log 中详注 IM 事件日志细节 : %s 详细资料 关闭自动格å¼åŒ– : %s 关闭由 e-mail 传递评论 : %s ä¸å…许评论 : %s åœç”¨ E-Mail : %s E-mail : %s åœ¨ä¿®æ”¹çŠ¶æ€æ—¶ä¿®æ”¹å¤–å‡ºæ¶ˆæ¯ : %s å¯åЍåŒå‘语言功能 : %s 在文字编辑器里å¯åЍ emacs 按键设置 : %s å¯åЍ P2P 通讯 : %s å¯åŠ¨ç½‘é¡µçŠ¶æ€æŒ‡ç¤ºå™¨ : %s 按 Enter 就把消æ¯é€å‡º : %s 按 Enter 就把消æ¯é€å‡º : %s 有趣的事物 传真 : %s 频é“傿•° 文件传输进度 文件 F找寻/æ–°å¢žå¥½å‹ æ‰¾å¯»/æ–°å¢žå¥½å‹ å : %s 对什么åè®® : %s 性别 : %s 一般 分组 HTTP ä»£ç†æœåС噍 : %s éšè—离线使用者 : %s ä½å®¶ 主页 : %s IM å¸å·ç®¡ç†å‘˜ 汇入好å‹åˆ—表 : %s 从 %s æ¥çš„ 邀请å‚加会议.. åŠ å…¥é¢‘é“ åŠ å…¥é¢‘é“/会议 J加入或新创一个频é“/会议 密钥通行ç : %s 关键字 关键字 : %s 语言 : %s å§“ : %s ç¦»å¼€é¢‘é“ é“¾æŽ¥ä¸€ä¸ª RSS æ¥æº 链接一个 RSS æ¥æº LiveJournal å¼ è´´ : 属性 本地字符集 : %s 地ç†ä½ç½® 记录中 å¸å· : %s åªå¯»æ‰¾åœ¨çº¿çš„ : %s 大é‡åˆ†ç»„转移.. æ‚项 心情 : %s å…¶ä»– 移至分组.. éŸ³ä¹ : %s åç§° : %s åç§°/头衔 网络 NickServ å¯†ç  (选择性的) : %s 昵称 昵称 : %s åªæ‰¾åœ¨çº¿ log 视窗中是å¦è¦æ˜¾ç¤º 上线/离线 æ¶ˆæ¯ : %s OpenPGP 密钥: %s 选项 åˆ†ç»„ç®¡ç† é€åˆ° %s 去 å¯†ç  å¯†ç  (选择性的) : %s å¯†ç  : %s æƒ³ä½¿ç”¨çš„å¯†ç  : %s ç”µè¯ : %s 照片 : %s Ping P2P å¯ä½¿ç”¨çš„ port 范围 : %s èŒç§° : %s 贴到 journal : %s 优先级 : %s HTTP Proxy (RSS å’Œ LJ 会用到) : %s åœ¨å›žå¤æ¶ˆæ¯æ—¶å¼•言 : %s éšæœºèŠå¤©åˆ†ç»„ éšæœºèŠå¤©åˆ†ç»„ : %s 注册 在 %s 网络上注册 æ³¨å†Œå‚æ•° 注册进行中... 注册æœåŠ¡ ä¿å­˜å¯†ç  : %s 远端字符集 : %s åˆ é™¤é¢‘é“ del 需è¦éªŒè¯ SMTP æœåС噍 : %s æœç´¢å‚æ•° æœç´¢ä¸ªäººèµ„æ–™ æœç´¢æœåŠ¡ 安全性 : %s 安全性 : %s 选择一份 PGP 密钥 å‘ä¸€ä¸ªé¢‘é“æ¶ˆæ¯ enter å‘é€çŸ­ä¿¡ å‘逿–‡ä»¶ 呿–‡ä»¶ç»™ %s, %lu æœåŠ¡å™¨åœ°å€ : %s æœåŠ¡å™¨åœ°å€ : %s æœåŠ¡ è®¾ç½®å¤–å‡ºæ¶ˆæ¯ æ˜¾ç¤ºåˆ°åº•æœ‰å“ªäº›äººæŠŠä½ åŠ åˆ°å¥½å‹åˆ—表中 çœ/å·ž : %s è¡—é“ä½å€ : %s 主题 : %s 切æ¢åˆ°é»˜è®¤è¯­è¨€ : %s log 视窗中是å¦è¦æ˜¾ç¤ºæ—¶é—´æˆ³ : %s è½¬æ¢ PGP 加密 %s UIN UIN : %s å–æ¶ˆ PGP 密钥 更新您的详细资料 ä¸ä½¿ç”¨å¯†é’¥ ä½¿ç”¨è€…ç•Œé¢ åªå¯»æ‰¾é™„照片的使用者 : %s 查看/编辑 忽略列表 查看/编辑 ä¸å¯è§†åˆ—表 查看/编辑 å¯è§†åˆ—表 工作 XML 汇出 URL : %s ä½ çš„ %s 资料 é‚®é€’åŒºå· : %s [Ctrl-X ä¿å­˜, Esc å–æ¶ˆ] [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ 网络 [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM çš„ 密ç : 优先级 : æœåŠ¡å™¨åœ°å€ : uin: 使用者: ! 有å¦ä¸€ä¸ª centerim 正在执行中! 硬盘空间ä¸åˆ° 10k 所以无法连接! 硬盘空间ä¸åˆ° 10k, 自动离线! å¦åˆ™å¯èƒ½ä¼šä¸¢å¤±é‡è¦æ¶ˆæ¯æˆ–是设置! 编译时没有加入 %s 的功能! pid %lu 会造æˆé—®é¢˜%lu 分在 %3$s 上收到从 %2$s æ¥çš„ %1$s%s 被 %s å–æ¶ˆäº† op æƒé™%s 被 %s 踢出去%s 被 %s 赋与 op æƒé™%s å–æ¶ˆæˆ‘çš„ op æƒé™%s 加入了%s 离开了%s 给我 op æƒé™%s 或 %s 关闭, Up/Down å’Œ PgUp/PgDn 翻页%s æœç´¢, %s 冿œç´¢,%s å–æ¶ˆ%s 到 %s 已被放入队列中在 %3$s 上é€å‡ºç»™ %2$s çš„ %1$s%s 链接 URL, %s 外部指令, %s 关闭%s 连到网å€,%s å…¨å±, %s 关闭%s 离线了%s: 离线了%s: 上线了, ç›®å‰çŠ¶æ€æ˜¯ %s(默认值)(æ— /自定义)* éªŒè¯ : * è¦æ±‚éªŒè¯ : * 好å‹åˆ—表 : * 文件传输* SMS : + %s 已被加入列表中+ [%02d:%02d:%02d] 收到新信, å…± %d å°+ [%s] 自动设置 %s+ [%s] 状æ€å›žå­˜+ [aim] 连接失败: %s+ [aim] 密ç å·²é€å‡º+ [aim] 无法连接æœåС噍+ [gg] 无法查明 %s+ [gg] æœåŠ¡å™¨è¿žæŽ¥å¤±è´¥+ [gg] æœåŠ¡å™¨è¿žæŽ¥ä¸­æ–­+ [gg] 连接æœåŠ¡å™¨æ—¶å‘生问题+ [gg] 无法å–å¾— %s, %s 的外出消æ¯+ [icq] 无法连接 : + [icq] 连接中断+ [icq] 无法传短信给 %s+ [icq] 无法传短信给 %s, %s+ [irc] 连接失败: %s+ [irc] 昵称æˆåŠŸåœ°ä¿®æ”¹äº†+ [irc] 密ç å·²é€å‡º+ [irc] 无法连接æœåС噍+ [jab] 错误 %d+ [jab] 错误 %d : %s+ [jab] 无法å–å¾— %s, %s 的外出消æ¯+ [jab] 无法连接æœåС噍+ [jab] 在 %s agent 处喿¶ˆç™»å½•+ [lj] %s 已被加入列表中+ [lj] HTTP 连接失败: %s+ [lj] 无法新增好å‹+ [lj] åˆ é™¤å¥½å‹æ—¶å‘生错误+ [lj] 登录失败: %s+ [lj] 张贴错误 : %s+ [lj] å¼ è´´æˆåŠŸï¼Œä»£å·æ˜¯ %s+ [lj] å·²ç»ä»Žæ‚¨çš„好å‹åˆ—表中删除该使用者+ [lj] æœç´¢ç»“æŸ+ [msn] 无法连接 : + [msn] 从 %s, %s 寄æ¥çš„ e-mail+ [msn] åå‘使用者列表已å–回, 找到 %d 笔资料+ [msn] 未读信件 : 收件匣中有 %d å°, 其他信匣中有 %d å°+ [yahoo] 检查到从其他地方上线+ [yahoo] 无法连接: + [yahoo] 无法登录 : 该å¸å·è¢«åœç”¨+ [yahoo] 无法登录 : 使用者å称和密ç ä¸ç¬¦+ [yahoo] 无法直接连接+ [yahoo] 从 %s, %s 寄æ¥çš„ e-mail+ [yahoo] 离开 %s 会议+ [yahoo] æœåŠ¡å™¨å…³é—­é“¾æŽ¥+ ä¸èƒ½åœ¨ç¦»çº¿çжæ€ä¸‹è¯»å–外出消æ¯+ 最åŽçš„æ¶ˆæ¯æ˜¯ %s ä¼ æ¥çš„+ 执行 %s 指令+ 收到新信, å…± %d å°+ ç›®å‰çš„æ¶ˆæ¯ä¸­æ²¡æœ‰ URL+ %s 没有定义外部动作+ 与 %s 之间无消æ¯è®°å½•+ %s 的设置已修改, 釿–°è½½å…¥ä¸­+ 对方已ç»å›žæ¥+ 釿–°æŸ¥çœ‹ %s+ %s 已在列表中+ 必需先登录系统二å多å²åˆ«çš„ e-mail三å多å²å››å多å²äº”åå²ä»¥ä¸Š60 以上<无昵称>关于接å—加入加入好å‹åˆ—表ä½å€å¹´é¾„年龄: 四月真的è¦å°† %s ç”±åˆ—è¡¨ä¸­åˆ é™¤å— ?确定è¦åˆ é™¤åˆ†ç»„å— ?八月作者 : 闲置自动外出时间 (0 表ä¸ä½¿ç”¨): 闲置自动N/Aæ—¶é—´ (0 表ä¸ä½¿ç”¨): è‡ªåŠ¨åŠ å…¥ä¼šè®®å¤–å‡ºå¤–å‡ºæ¶ˆæ¯ : èƒŒæ™¯ç”Ÿæ—¥ä¸æ˜¾ç¤ºé¢‘铿¶ˆæ¯å–消这个å‘é€è¿‡ç¨‹å·²ç»åœ¨è¿›è¡Œä¸­, ä¸èƒ½ç§»é™¤ç±»åˆ«: 手机手机: C修改改å˜çжæ€é¢‘é“历å²è®°å½•频é“主题是 : %s 频é“: 消æ¯åŽŸå§‹å­—ç¬¦é›† : 消æ¯è½¬æ¢å­—符集 : 检查检查频率 :ç¡®è®¤å¯†ç  : 验è¯å¯†ç : 城市: 附注附注: å…¬å¸å…¬å¸: 连接至æœåС噍 %s ...æ–°å¢žå¥½å‹ ç›®å‰å‚加会议的æˆå‘˜æœ‰ : ç›®å‰å¿ƒæƒ… :è‡ªå®šä¹‰çŠ¶æ€æ¶ˆæ¯ :DNDå二月默认的 Jabber 会议主机部门部门: æè¿° : è¯¦ç»†èµ„æ–™éŸ³ä¹æ£€æŸ¥æ–­çº¿ä¸è¦æ‰“扰完æˆå¿…需先丢弃å¸å·èµ„æ–™!E-Mail: E-mailE-mail: 编辑编辑详细资料 空白的验è¯è¦æ±‚ç¼–ç è¾“入生日 (DD-MM-YYYY): 事件历å²è®°å½•事件接å—者事件å‘é€é€‰é¡¹:外部动作..失败传真传真: 二月女抓å–外出消æ¯èŽ·å–版本信æ¯ä¸‹è½½ä½ çš„详细资料文件传输状æ€å: 强制检查欢迎èŠå¤©é¢‘率好å‹å…¨åè½¬é€æ¸¸æˆæ€§åˆ«ä¸€èˆ¬ä¸€èˆ¬èŠå¤©ä¸€èˆ¬é€‰é¡¹:直接åšç§»è‡³å¥½å‹åˆ—表..HTTP ä»£ç†æœåŠ¡å™¨åœ°å€: éšè—离线使用者与 %s 的历å²è®°å½•, 共有 %d 笔ä½å®¶ä¸»é¡µé¦–页: 我很喜欢默认的 %s å¤–å‡ºæ¶ˆæ¯ %s %s.我很喜欢 centerim 默认的 AIM 资讯 %s.忽略所有æ¥è‡ª %s 的消æ¯å— ?忽略列表忽略使用者收到 %s, 从 %s ä¼ æ¥èµ„讯%s 的详细资料兴趣éšèº«ä¸å¯è§†åˆ—表邀请加入会议..一月J加入/C新创七月六月关键字 : 被 %s 踢出 ; ç†ç”±æ˜¯ : %sLJ语言最åŽä¸Šçº¿ IPæœ€åŽæ£€æŸ¥æ—¶é—´å§“: 上次结果最åŽä¸Šçº¿æ—¶é—´é“¾æŽ¥é“¾æŽ¥ : 列出昵称L载入地ç†ä½ç½®ç”·ä¸‰æœˆå°†é€‰å–的使用者移至..äº”æœˆæ¶ˆæ¯æœåŠ¡å™¨æ¶ˆæ¯ :手机å·ç : 其他移至好å‹åˆ—表没空å字新增分组åç§°: åç§°/头衔 : åç§° : 从未新的 UIN 是 %lu新分组å: 新昵称: 新密ç : 新设置文件å : æ–°æœç´¢ä¸‹ä¸€ä¸ªä¸‹ä¸€ä¸ªæ£€æŸ¥æ˜µç§°æ˜µç§°: 昵称: 没有没空未指定åä¸€æœˆç«‹åˆ»å¾ˆå¿™åæœˆç¦»çº¿ç¡®è®¤æ—§çš„ e-mailç™»å½•é¢‘é“ : 上线开å¯ç®¡ç†åˆ†ç»„é€åˆ° %så‘é€ %s ç»™ %sPGP 加密错误: PGP 密钥通行ç : PGP 密钥æœç´¢: æœç´¢å¥½å‹, %s 冿‰¾ä¸€æ¬¡, Enter ç»“æŸæœç´¢é€‰æ‹© PGP 密钥: 快速查看请用 %s请输入 PGP 通行ç : PGP ç­¾å错误: 从使用者æ¥çš„ PING 回应 : %d 秒密ç è‡³å°‘è¦æœ‰ 6 个字必需输入密ç å¯†ç : 密ç ä¸ç¬¦åˆP2P å¯ä½¿ç”¨çš„ port 范围 (最å°-最大): 电è¯ç”µè¯: 请加入我的会议.波兰的èŒä½: P张贴张贴主题 :å‰ä¸€é¡¹åœ¨å“ªé‡Œå‘布 :好å‹é€ŸæŸ¥: æœç´¢å¥½å‹, %s 冿‰¾ä¸€æ¬¡, Enter ç»“æŸæœç´¢RSS æ–‡ä»¶éšæœºé€‰å–èŠå¤©å¯¹è±¡ä»Ž %s 接收到退回移除也把 %s 从好å‹åˆ—è¡¨ä¸­åˆ é™¤å— ?也把 %d 好å‹ä»Žå¥½å‹åˆ—è¡¨ä¸­ç§»é™¤å— ?移除使用者Ræ›´å好勿›´å回å¤%s 外部动作的结果是 : 接收接收é‡è¯•中...爱情故事俄国的短信SMTP æœåС噍: æœç´¢ç»“æžœ [æ— ]Sæœç´¢/A新增æœç´¢å¥½å‹..找男人找女人选择把使用者加入分组改å˜ä½¿ç”¨è€…分组选择加入列表的è”系人选择è¦ç§»åŠ¨åˆ†ç»„çš„å¥½å‹å‘é€é€æ¶ˆæ¯å‘é€ç½‘å€å‘é€å¥½å‹å‘é€å¥½å‹..é€å‡ºè¯·æ±‚å‘é€è‡³ %s乿œˆæœåС噍: 显示离线使用者çœ/å·ž: è¡—é“ä½å€: 学生Jabber ID å·²ç»æˆåŠŸåœ°æ³¨å†Œäº†ä¸‹åˆ—ä½¿ç”¨è€…å°†ä½ åŠ è¿›ä»–ä»¬çš„å¥½å‹åˆ—表 :å·²ç»æœ‰ä¸€ä¸ªåŒå的设置文件å了. è¦è¦†ç›–å— ?远端机器使用 %s所指定的目录ä¸å­˜åœ¨æ‰€æŒ‡å®šçš„目录ä¸å¯å†™å…¥ä½¿ç”¨è€… %s (%s) å·±ç»å°†ä½ åŠ å…¥ä»–çš„å¥½å‹åˆ—表中 Journal åœ°å€ : %s使用者 %s æ‹’ç»äº†ä½ çš„会议邀请使用者 %s 邀请你加入 %s 会议, 主题是 : %s使用者 %s 加入会议中使用者 %s 离开会议了使用者 %s å·±ç»å°†ä½ ä»Žä»–的好å‹åˆ—表中移除 Journal åœ°å€ : %sè¯¥ä½¿ç”¨è€…ä»Šå¤©ç”Ÿæ—¥è¯¥ä½¿ç”¨è€…å·²åŒæ„你的验è¯è¦æ±‚该使用者己ç»å°†ä½ åŠ å…¥ä»–çš„å¥½å‹åˆ—表中该使用者把昵称从 %s æ¢æˆ %s该使用者没有å¯å–得的资讯该使用者拒ç»ä½ çš„验è¯è¦æ±‚, ç†ç”±æ˜¯ : 该使用者把你从好å‹åˆ—表中移除 (以 Jabber çš„è¯æ¥è¯´å°±æ˜¯ unsubscribe)这是你的 LiveJournal å¸å·ã€‚注册新使用者超时。é‡è¯• ?时区èŒè¡”主题: å°è¯•在 %2$s 中注册 %1$s ...UIN: URLURL: ç›®å‰æ¶ˆæ¯ä¸­çš„ URLæ˜¾ç¤ºé¢‘é“æ¶ˆæ¯æ— æ³•连接无法连接 icq æœåŠ¡å™¨ã€‚é‡è¯• ?ä¸å¿½ç•¥è¯¥ä½¿ç”¨è€…使用方法: 用户信æ¯å¯¹æ–¹è¯¦ç»†èµ„料版本å¯è§†åˆ—表ç¨å¾…片刻, 您的详细资料尚未下载工作错误的 Jabber ä»£ç  !无法注册有问题的昵称必需先离线!在更新资料å‰å¿…需先登录 Gadu-Gadu 网络在更新资料å‰å¿…需先登录 ICQ在更新资料å‰å¿…需先登录 Jabber 网络在修改昵称å‰å¿…需先登录 MSN 网络您的详细资料已下载完邮递区å·é‚®é€’区å·: 失败把 %s 加入好å‹åˆ—表AIM 连接失败如您所愿验è¯å¤–出外出消æ¯å¯†ç é”™è¯¯ä¸æ­£ç¡®çš„使用者å称尊贵的è“Aå–æ¶ˆL清除无法连接 : 把您的 %1$s 状æ€ä»Ž %3$s åˆ‡æ¢æˆ %2$s附注: 连接æœåС噍䏭好å‹åˆ—è¡¨é€ŸæŸ¥å¥½å‹æ— æ³•建立连接无法å解主机å称无法读å–高雅的黑天把文件存到哪个目录 : å…³æŽ‰æ–­çº¿ä¸æ”¹å˜å®Œæˆæ£€æŸ¥åˆ°é‡å¤ç™»å½•E-mail错误事件事件å‘é€é”™è¯¯ : 无法新增该使用者的目录事件å‘é€é”™è¯¯ : 傿•°ä¸è¶³äº‹ä»¶å‘é€é”™è¯¯ : åªæœ‰åœ¨ ICQ åè®®æ‰èƒ½ä¼  UINs事件å‘é€é”™è¯¯ : 䏿˜Žçš„ IM 类型事件å‘é€é”™è¯¯ : 䏿˜Žçš„事件类型开始事件纪录执行外部命令 %s, è¿”å›žä»£ç  = %d执行外部命令 %s, è¿”å›žä»£ç  = %d文件å: 文件å: 文件找到åªç»™å¥½å‹å…¨å±æŸ¥çœ‹å°æ—¶ICQ 中断原因忽略收到 %2$s ä¼ æ¥çš„ %1$s䏿­£ç¡®çš„ PGP 通行ç å¯å§‹I链接O载入登录æˆå‘˜åˆ—表已å–回, 找到 %d 笔资料消æ¯åˆ†ç¬¬ 1 型第 2 åž‹Då‘下移Uå‘上移N/AMSN 新昵称 : 妿²¡æœ‰æœªå¯»èŽ·æœªä½¿ç”¨æé†’é€ %s ç»™ %så¯†ç æˆåŠŸåœ°ä¿®æ”¹äº†å¯†ç : PGP 密钥快速æœç´¢é€‰æ‹© PGP 密钥用它æ¥åœ¨ä½ çš„ journal 里张贴消æ¯ã€‚ç§æœ‰çš„公开的 (所有人都å¯ä»¥çœ‹å¾—到)E移除ç†ç”± : %s注册目å‰å°šæœªæ”¯æŒæŠŠ %s 从好å‹åˆ—表中删除Aä¿å­˜æœç´¢ç»“æŸ, 找到 %d 笔资料æœç´¢: ç§’ç”± %s 设置连接有问题音效å¡PC å–‡å­å¼€å§‹çŠ¶æ€æ”¹å˜æœ‰è¯¯ : æˆåŠŸæ¶ˆæ¯æ˜¯ : åŠ é€Ÿä¸æ˜Žçš„ IM ç±»åž‹ä¸æ˜Žçš„状æ€å­—符已使用使用者 %s 的信æ¯ä½¿ç”¨è€…å称和密ç ä¸ç¬¦éªŒè¯ä¸»æœºååŠç«¯å£éªŒè¯æ‰€è¾“入的主机ååŠç«¯å£å·¥ä½œé”™è¯¯çš„ XML是你是这里的 opcenterim-4.22.10/po/en@boldquot.header0000644000175000001440000000247111473011430014445 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # centerim-4.22.10/po/stamp-po0000644000175000001440000000001211473011460012472 00000000000000timestamp centerim-4.22.10/po/it.po0000644000175000001440000030054211473011457012004 00000000000000# CenterIM Italian translation template # Copyright (C) 2007 Stéphane Bisinger # First translation by Leandro Noferini # Updated by Stéphane Bisinger Dec, 2007 # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 3.13.3\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2001-07-08 05:03+02:00\n" "Last-Translator: Stéphane Bisinger \n" "Language-Team: Italiano \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/centerim.cc:138 #, fuzzy msgid "password: " msgstr "Password: " # src/centerim.cc:201 #: src/centerim.cc:174 #, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" "%s opzioni contatto, %s cambia lo stato, %s menu generale, %s/%s finestra " "prec/succ, %s esci" # src/centerim.cc:241 #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Ignorare tutti gli eventi provenienti da %s?" # src/icqhook.cc:73 #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "Rimuovere %s anche dalla lista dei contatti?" # src/centerim.cc:285 #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Sei sicuro di voler eliminare %s?" # src/centerim.cc:292 #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Nuovo nick da mostrare: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Seleziona un gruppo in cui spostare l'utente" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ impossibile recuperare il messaggio di away quando non si è connessi" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! impossibile connettersi, lo spazio libero su disco è inferiore a 10k" # src/icqface.cc:598 src/icqface.cc:655 #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "messaggio di away" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! il supporto per %s è stato disabilitato alla compilazione" # src/centerim.cc:549 #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ è arrivata nuova posta, %d messaggi" # src/centerim.cc:549 #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] è arrivata nuova posta, %d messaggi" # src/centerim.cc:550 #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ ultimo messaggio da %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ il file di configurazione %s è stato modificato" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! rilevata un'altra copia di centerim in esecuzione" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! questo potrebbe causare problemi. pid %lu" # src/icqdialogs.cc:561 #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Numero di cellulare: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "Cartella in cui salvare i files: " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "La cartella specificata non è scrivibile" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "La cartella specificata non esiste" # src/icqface.cc:1613 #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ nessuna conversazione salvata per %s" # src/icqface.cc:1151 #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ l'utente %s è già in lista" # src/icqface.cc:1682 #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Seleziona il gruppo a cui aggiungere l'utente" # src/icqface.cc:1151 #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s è stato aggiunto alla lista" # src/icqhook.cc:594 #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ l'utente è tornato" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] stato ripristinato" # src/icqhook.cc:587 #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] impostato automaticamente in %s" # src/icqface.cc:874 #: src/centerim.cc:1490 #, fuzzy msgid "away" msgstr "Assente" #: src/centerim.cc:1490 msgid "n/a" msgstr "Non disponibile" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" "+ Stato impostato su Non Disponibile dopo aver effettuato il detach di screen" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "! Il percorso alla socket di screen non esiste!" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" "! Correggere il percorso o disabilitare il cambio automatico di stato con " "screen" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "" # src/icqface.cc:1682 #: src/centerim.cc:1772 #, fuzzy msgid "Select contacts to move" msgstr "Seleziona i contatti da aggiungere alla lista" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "" #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "" # src/icqface.cc:22 src/icqface.cc:28 #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "non cambiare" #: src/hooks/rsshook.cc:380 msgid "success" msgstr "" # src/icqface.cc:651 #: src/hooks/rsshook.cc:400 #, fuzzy msgid "Title: " msgstr "Titolo" #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "" # src/icqdialogs.cc:372 src/icqdialogs.cc:381 #: src/hooks/rsshook.cc:402 #, fuzzy msgid "Category: " msgstr "Città: " # src/icqface.cc:1187 #: src/hooks/rsshook.cc:403 #, fuzzy msgid "Author: " msgstr "Richiesta autorizzazione da %lu" # src/icqdialogs.cc:388 #: src/hooks/rsshook.cc:405 #, fuzzy msgid "Description: " msgstr "Posizione: " # src/icqdialogs.cc:45 #: src/hooks/rsshook.cc:407 #, fuzzy msgid "Link: " msgstr "nuovo uin" # src/icqdialogs.cc:568 #: src/hooks/rsshook.cc:408 #, fuzzy msgid "Comments: " msgstr "commento: " # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:175 #, fuzzy msgid "+ [yahoo] cannot connect: " msgstr "+ connessione al server icq" #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:448 #, fuzzy, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ connessione al server icq" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "" #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ connessione al server icq" #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ connessione al server icq" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:802 #, fuzzy msgid "+ [yahoo] another logon detected" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:809 #, fuzzy msgid "+ [yahoo] server closed socket" msgstr "+ connessione al server icq" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "" #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "" # src/icqhook.cc:245 #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 #, fuzzy msgid "The user has added you to his/her contact list" msgstr "sei stato aggiunto alla sua lista di contatti" # src/icqface.cc:598 src/icqface.cc:655 #: src/hooks/yahoohook.cc:1036 #, fuzzy msgid "the message was: " msgstr "homepage" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1054 #, fuzzy, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ connessione al server icq" # src/icqhook.cc:145 #: src/hooks/yahoohook.cc:1154 #, fuzzy msgid "+ [yahoo] direct connection failed" msgstr "+ disconnesso" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ connessione al server icq" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 msgid "The user has buzzed you" msgstr "" # src/icqhook.cc:79 #: src/hooks/jabberhook.cc:360 #, fuzzy msgid "+ [jab] unable to connect to the server" msgstr "+ impossibile connettersi al server icq" # src/icqhook.cc:73 #: src/hooks/jabberhook.cc:649 #, fuzzy, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ connessione al server icq" # src/icqface.cc:598 src/icqface.cc:655 #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 #, fuzzy msgid "Away message:" msgstr "homepage" # src/icqhook.cc:73 #: src/hooks/jabberhook.cc:766 #, fuzzy, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ connessione al server icq" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "" # src/icqhook.cc:79 #: src/hooks/jabberhook.cc:819 #, fuzzy msgid "Unable to connect" msgstr "+ impossibile connettersi al server icq" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "" # src/icqhook.cc:73 #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, fuzzy, c-format msgid "+ [jab] error %d" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, fuzzy, c-format msgid "+ [jab] error %d: %s" msgstr "+ connessione al server icq" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" # src/icqhook.cc:79 #: src/hooks/aimhook.cc:89 #, fuzzy msgid "+ [aim] unable to connect to the server" msgstr "+ impossibile connettersi al server icq" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "" # src/icqhook.cc:73 #: src/hooks/aimhook.cc:375 #, fuzzy msgid "aim connection failed" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/aimhook.cc:377 #, fuzzy, c-format msgid "+ [aim] connect failed: %s" msgstr "+ connessione al server icq" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "" # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/hooks/aimhook.cc:503 #, fuzzy msgid "+ [aim] password sent" msgstr "Password: " #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "" # src/icqdialogs.cc:73 src/icqdialogs.cc:639 #: src/hooks/icqhook.cc:1053 #, fuzzy msgid "bad username" msgstr " Nome utente per il proxy : %s " #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "" # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/hooks/icqhook.cc:1055 #, fuzzy msgid "bad password" msgstr "Password: " #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" # src/icqhook.cc:73 #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ connessione al server icq" # src/icqhook.cc:145 #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] disconnected" msgstr "+ disconnesso" # src/icqhook.cc:145 #: src/hooks/icqhook.cc:1076 #, fuzzy msgid "icq disconnection reason" msgstr "+ disconnesso" # src/icqhook.cc:245 #: src/hooks/icqhook.cc:1254 #, fuzzy msgid "The user has accepted your authorization request" msgstr "sei stato aggiunto alla sua lista di contatti" # src/icqface.cc:1187 #: src/hooks/icqhook.cc:1258 #, fuzzy msgid "The user has rejected your authorization request; the message was: " msgstr "Richiesta autorizzazione da %lu" # src/icqhook.cc:489 #: src/hooks/icqhook.cc:1313 #, fuzzy, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ file %s per %s, %lu inviato" # src/icqhook.cc:489 #: src/hooks/icqhook.cc:1316 #, fuzzy, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ file %s per %s, %lu inviato" # src/icqhook.cc:73 #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ connessione al server icq" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "" # src/icqhook.cc:73 #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/gaduhook.cc:164 #, fuzzy, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/gaduhook.cc:218 #, fuzzy msgid "+ [gg] connection to the server failed" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/gaduhook.cc:291 #, fuzzy msgid "+ [gg] connection lost" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ connessione al server icq" # src/icqhook.cc:79 #: src/hooks/irchook.cc:146 #, fuzzy msgid "+ [irc] unable to connect to the server" msgstr "+ impossibile connettersi al server icq" # src/icqhook.cc:73 #: src/hooks/irchook.cc:815 #, fuzzy, c-format msgid "+ [irc] connect failed: %s" msgstr "+ connessione al server icq" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "" #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "" # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/hooks/irchook.cc:1290 #, fuzzy msgid "+ [irc] password sent" msgstr "Password: " # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "Password: " #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "" # src/icqface.cc:1192 #: src/hooks/irchook.cc:1442 #, fuzzy, c-format msgid "%s has joined." msgstr "Ignora" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "" # src/icqface.cc:1337 src/icqface.cc:1387 #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, fuzzy, c-format msgid "reason: %s" msgstr "Inviato su %s" # src/icqface.cc:1151 #: src/hooks/irchook.cc:1489 #, fuzzy, c-format msgid "%s has been kicked by %s" msgstr "+ %lu è stato aggiunto alla lista" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/hooks/irchook.cc:1518 #, fuzzy, c-format msgid "Channel topic now is: %s" msgstr "Cambia" # src/icqface.cc:1337 src/icqface.cc:1387 #: src/hooks/irchook.cc:1523 #, fuzzy, c-format msgid "set by %s" msgstr "Inviato su %s" # src/icqface.cc:1151 #: src/hooks/irchook.cc:1541 #, fuzzy, c-format msgid "%s has been opped by %s." msgstr "+ %lu è stato aggiunto alla lista" # src/icqface.cc:1151 #: src/hooks/irchook.cc:1557 #, fuzzy, c-format msgid "%s has been deopped by %s." msgstr "+ %lu è stato aggiunto alla lista" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "" # src/icqhook.cc:73 #: src/hooks/ljhook.cc:511 #, fuzzy msgid "cannot connect" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/ljhook.cc:512 #, fuzzy, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ connessione al server icq" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "" # src/icqhook.cc:73 #: src/hooks/ljhook.cc:572 #, fuzzy, c-format msgid "+ [lj] login failed: %s" msgstr "+ connessione al server icq" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "" # src/icqhook.cc:73 #: src/hooks/ljhook.cc:578 #, fuzzy, c-format msgid "+ [lj] post error: %s" msgstr "+ connessione al server icq" # src/icqhook.cc:245 #: src/hooks/ljhook.cc:677 #, fuzzy, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "sei stato aggiunto alla sua lista di contatti" # src/icqhook.cc:245 #: src/hooks/ljhook.cc:687 #, fuzzy, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "sei stato aggiunto alla sua lista di contatti" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "" # src/icqface.cc:1151 #: src/hooks/ljhook.cc:722 #, fuzzy, c-format msgid "+ [lj] %s was added to friends" msgstr "+ %lu è stato aggiunto alla lista" # src/icqhook.cc:73 #: src/hooks/msnhook.cc:430 #, fuzzy, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ connessione al server icq" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "" # src/icqhook.cc:73 #: src/hooks/msnhook.cc:799 #, fuzzy, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/msnhook.cc:905 #, fuzzy msgid "+ [msn] cannot connect: " msgstr "+ connessione al server icq" #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "" # src/icqhook.cc:73 #: src/hooks/abstracthook.cc:355 #, fuzzy msgid "connecting to the server" msgstr "+ connessione al server icq" # src/icqhook.cc:123 #: src/hooks/abstracthook.cc:356 #, fuzzy msgid "logged in" msgstr "+ connesso a" # src/icqhook.cc:73 #: src/hooks/abstracthook.cc:357 #, fuzzy, c-format msgid "search finished, %d found" msgstr "+ connessione al server icq" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "" # src/centerim.cc:169 #: src/hooks/abstracthook.cc:359 #, fuzzy msgid "disconnected" msgstr "Scollegato" # src/icqhook.cc:73 #: src/hooks/abstracthook.cc:360 #, fuzzy, c-format msgid "adding %s to the contacts" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/abstracthook.cc:361 #, fuzzy, c-format msgid "removing %s from the contacts" msgstr "+ connessione al server icq" # src/icqhook.cc:73 #: src/hooks/abstracthook.cc:362 #, fuzzy, c-format msgid "members list fetching finished, %d found" msgstr "+ connessione al server icq" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "" # src/icqface.cc:48 #: src/icqcontact.cc:853 msgid "Jan" msgstr "Gen" # src/icqface.cc:49 #: src/icqcontact.cc:853 msgid "Feb" msgstr "Feb" # src/icqface.cc:50 #: src/icqcontact.cc:853 msgid "Mar" msgstr "Mar" # src/icqface.cc:51 #: src/icqcontact.cc:853 msgid "Apr" msgstr "Apr" # src/icqface.cc:52 #: src/icqcontact.cc:854 msgid "May" msgstr "Mag" # src/icqface.cc:53 #: src/icqcontact.cc:854 msgid "Jun" msgstr "Giu" # src/icqface.cc:54 #: src/icqcontact.cc:854 msgid "Jul" msgstr "Lug" # src/icqface.cc:55 #: src/icqcontact.cc:854 msgid "Aug" msgstr "Ago" # src/icqface.cc:56 #: src/icqcontact.cc:855 msgid "Sep" msgstr "Set" # src/icqface.cc:57 #: src/icqcontact.cc:855 msgid "Oct" msgstr "Ott" # src/icqface.cc:58 #: src/icqcontact.cc:855 msgid "Nov" msgstr "Nov" # src/icqface.cc:59 #: src/icqcontact.cc:855 msgid "Dec" msgstr "Dic" # src/icqdialogs.cc:242 #: src/icqgroups.cc:66 #, fuzzy msgid "General" msgstr " Generale " # src/icqface.cc:1337 src/icqface.cc:1387 #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Inviato su %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "" #: src/icqdialogs.cc:50 msgid "unknown" msgstr "" # src/icqdialogs.cc:242 #: src/icqdialogs.cc:58 #, fuzzy msgid "General Chat" msgstr " Generale " #: src/icqdialogs.cc:59 msgid "Romance" msgstr "" # src/icqface.cc:532 #: src/icqdialogs.cc:60 #, fuzzy msgid "Games" msgstr "Nome" #: src/icqdialogs.cc:61 msgid "Students" msgstr "" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" # src/icqface.cc:532 #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Nome" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr "" # src/icqdialogs.cc:539 src/icqface.cc:1656 #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Elimina" #: src/icqdialogs.cc:120 msgid "Load" msgstr "" # src/icqhook.cc:123 #: src/icqdialogs.cc:205 #, fuzzy msgid "+ you must be logged in first" msgstr "+ connesso a" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "" # src/icqface.cc:597 #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #, fuzzy msgid "cLear" msgstr "Cellulare" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Cambia" # src/icqface.cc:445 #: src/icqdialogs.cc:229 #, fuzzy msgid "Search/Add" msgstr " Nuova ricerca" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "" # src/icqface.cc:262 #: src/icqdialogs.cc:248 #, fuzzy msgid " Find/add user(s) " msgstr " Cerca/Aggiungi utenti" # src/icqface.cc:22 src/icqface.cc:28 #: src/icqdialogs.cc:249 #, fuzzy msgid " Join/create a channel/conference " msgstr "non cambiare" #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr "" # src/icqdialogs.cc:244 #: src/icqdialogs.cc:299 #, fuzzy msgid " Network " msgstr " Work " # src/icqdialogs.cc:200 #: src/icqdialogs.cc:307 #, fuzzy msgid " UIN " msgstr "UIN: " # src/icqdialogs.cc:41 #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Dettagli " # src/icqdialogs.cc:56 src/icqdialogs.cc:189 src/icqdialogs.cc:248 #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Soprannome : %s " # src/icqdialogs.cc:57 src/icqdialogs.cc:190 #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail : %s " # src/icqdialogs.cc:58 src/icqdialogs.cc:191 src/icqdialogs.cc:249 #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Nome : %s " # src/icqdialogs.cc:59 src/icqdialogs.cc:192 src/icqdialogs.cc:250 #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Cognome : %s " # src/icqdialogs.cc:256 #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, fuzzy, c-format msgid " Age range : %s " msgstr " Età : %s " # src/icqdialogs.cc:254 #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Sesso : %s " # src/icqdialogs.cc:282 #: src/icqdialogs.cc:328 #, fuzzy, c-format msgid " Language : %s " msgstr " 3° Lingua : %s " # src/icqface.cc:593 src/icqface.cc:645 #: src/icqdialogs.cc:332 #, fuzzy msgid " Location " msgstr "Posizione" # src/icqdialogs.cc:258 src/icqdialogs.cc:267 #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Città : %s " # src/icqdialogs.cc:259 src/icqdialogs.cc:268 #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Stato (Regione) : %s " # src/icqdialogs.cc:260 src/icqdialogs.cc:269 #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Paese : %s " # src/icqdialogs.cc:244 #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Work " # src/icqdialogs.cc:271 #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Compagnia : %s " # src/icqdialogs.cc:272 #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Dipartimento : %s " # src/icqdialogs.cc:274 #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Posizione : %s " # src/icqface.cc:875 #: src/icqdialogs.cc:346 #, fuzzy msgid " Online only " msgstr "Connesso" #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr "" # src/icqdialogs.cc:244 #: src/icqdialogs.cc:357 #, fuzzy msgid " Keywords " msgstr " Work " # src/icqdialogs.cc:201 src/icqdialogs.cc:341 #: src/icqdialogs.cc:366 #, fuzzy msgid " Nickname " msgstr "Soprannome: " #: src/icqdialogs.cc:372 msgid " Search service " msgstr "" #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr "" # src/centerim.cc:115 #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 #, fuzzy msgid " Feed Parameters " msgstr " Stato della registrazione " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr "" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr "" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/icqdialogs.cc:398 #, fuzzy, c-format msgid " Channel : %s " msgstr "Cambia" # src/icqdialogs.cc:56 src/icqdialogs.cc:189 src/icqdialogs.cc:248 #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, fuzzy, c-format msgid " Name : %s " msgstr " Soprannome : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr "" # src/icqdialogs.cc:244 #: src/icqdialogs.cc:416 #, fuzzy, c-format msgid " Keywords : %s " msgstr " Work " # src/icqface.cc:593 src/icqface.cc:645 #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 #, fuzzy msgid " Options " msgstr "Posizione" # src/icqdialogs.cc:274 #: src/icqdialogs.cc:422 #, fuzzy, c-format msgid " Users with photos only : %s " msgstr " Posizione : %s " # src/icqface.cc:875 #: src/icqdialogs.cc:423 #, fuzzy, c-format msgid " Look for online only : %s " msgstr "Connesso" # src/icqface.cc:1151 #: src/icqdialogs.cc:428 #, fuzzy msgid " Show users who have you on their list " msgstr "+ %lu è stato aggiunto alla lista" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr "" # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/icqdialogs.cc:438 src/imcontroller.cc:87 #, fuzzy msgid " Password " msgstr "Password: " # src/icqface.cc:572 #: src/icqdialogs.cc:443 #, fuzzy msgid " Service " msgstr "Mai" # src/icqdialogs.cc:561 #: src/icqdialogs.cc:472 #, fuzzy msgid "New profile name: " msgstr "nome file: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "" # src/icqdialogs.cc:200 #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " # src/icqdialogs.cc:201 src/icqdialogs.cc:341 #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Soprannome: " # src/icqface.cc:532 #: src/icqdialogs.cc:504 #, fuzzy msgid "Name/Title: " msgstr "Nome" # src/icqdialogs.cc:90 src/icqdialogs.cc:202 #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-Mail: " # src/icqdialogs.cc:91 src/icqdialogs.cc:203 src/icqdialogs.cc:344 #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Nome: " # src/icqdialogs.cc:92 src/icqdialogs.cc:204 src/icqdialogs.cc:345 #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Cognome: " # src/icqdialogs.cc:372 src/icqdialogs.cc:381 #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Città: " # src/icqdialogs.cc:373 src/icqdialogs.cc:382 #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Stato (Regione): " # src/icqdialogs.cc:385 #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Compagnia: " # src/icqdialogs.cc:386 #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Dipartimento: " # src/icqdialogs.cc:388 #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Posizione: " # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/icqdialogs.cc:519 #, fuzzy msgid "Channel: " msgstr "Cambia" # src/icqface.cc:532 #: src/icqdialogs.cc:520 #, fuzzy msgid "Name: " msgstr "Nome" # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/icqdialogs.cc:522 #, fuzzy msgid "Keywords: " msgstr "Password: " # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Password: " # src/icqdialogs.cc:200 #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 #, fuzzy msgid "URL: " msgstr "UIN: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "" #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" # src/icqdialogs.cc:242 #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Generale " # src/centerim.cc:115 #: src/icqdialogs.cc:595 #, fuzzy msgid " Registration service " msgstr " Stato della registrazione " # src/centerim.cc:115 #: src/icqdialogs.cc:599 #, fuzzy msgid " Registration parameters " msgstr " Stato della registrazione " # src/icqdialogs.cc:55 src/icqdialogs.cc:75 #: src/icqdialogs.cc:622 #, fuzzy, c-format msgid " Change password : %s " msgstr " Controlla la password : %s " # src/icqdialogs.cc:251 #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-Mail : %s " # src/icqdialogs.cc:255 #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Data di nascita : %s " # src/icqdialogs.cc:256 #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Età : %s " # src/icqdialogs.cc:243 #: src/icqdialogs.cc:639 msgid " Home " msgstr " Casa " # src/icqdialogs.cc:261 src/icqdialogs.cc:270 #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Indirizzo : %s " # src/icqdialogs.cc:262 #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " CAP : %s " # src/icqdialogs.cc:263 src/icqdialogs.cc:276 #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefono : %s " # src/icqdialogs.cc:264 src/icqdialogs.cc:277 #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " # src/icqdialogs.cc:265 #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Numero cellulare : %s " # src/icqdialogs.cc:275 src/icqdialogs.cc:279 #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Homepage : %s " # src/icqdialogs.cc:245 #: src/icqdialogs.cc:666 msgid " More " msgstr " Altre " # src/icqdialogs.cc:280 #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1° Lingua : %s " # src/icqdialogs.cc:281 #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2° Lingua : %s " # src/icqdialogs.cc:282 #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3° Lingua : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr "" #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr "" # src/icqdialogs.cc:281 #: src/icqdialogs.cc:682 #, fuzzy, c-format msgid " Random chat group : %s " msgstr " 2° Lingua : %s " # src/icqface.cc:1187 #: src/icqdialogs.cc:684 #, fuzzy, c-format msgid " Authorization required : %s " msgstr "Richiesta autorizzazione da %lu" # src/icqdialogs.cc:259 src/icqdialogs.cc:268 #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Stato (Regione) : %s " # src/icqdialogs.cc:246 #: src/icqdialogs.cc:709 msgid " About " msgstr " Note " # src/centerim.cc:401 #: src/icqdialogs.cc:727 #, fuzzy msgid "Fetching your details" msgstr "Sto scaricando i tuoi dettagli ICQ" # src/icqdialogs.cc:301 #: src/icqdialogs.cc:741 #, fuzzy, c-format msgid " Your %s details " msgstr " I tuoi dettagli ICQ " # src/icqdialogs.cc:303 #: src/icqdialogs.cc:744 #, fuzzy, c-format msgid " %s: details " msgstr " I dettagli ICQ di %s " # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 src/icqface.cc:1314 src/icqface.cc:1394 # src/icqface.cc:1440 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Fatto" # src/icqdialogs.cc:336 #: src/icqdialogs.cc:775 #, fuzzy msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Attendi un attimo, i tuoi dettagli ICQ non sono ancora stati scaricati" # src/icqdialogs.cc:346 #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-Mail: " # src/icqdialogs.cc:352 #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Immetti la data di nascita (GG-MM-AAAA): " # src/icqdialogs.cc:370 #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Età: " # src/icqdialogs.cc:375 src/icqdialogs.cc:384 #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Indirizzo: " # src/icqdialogs.cc:376 #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "CAP" # src/icqdialogs.cc:377 src/icqdialogs.cc:390 #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefono: " # src/icqdialogs.cc:378 src/icqdialogs.cc:391 #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " # src/icqdialogs.cc:379 #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Numero di cellulare: " # src/icqdialogs.cc:389 src/icqdialogs.cc:393 #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Homepage: " # src/icqface.cc:768 #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Note" # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/icqdialogs.cc:869 #, fuzzy msgid "New password: " msgstr "Password: " # src/icqdialogs.cc:55 src/icqdialogs.cc:75 #: src/icqdialogs.cc:872 #, fuzzy msgid "Check the new password: " msgstr " Controlla la password : %s " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 src/icqface.cc:1314 src/icqface.cc:1394 # src/icqface.cc:1440 #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 #, fuzzy msgid "none" msgstr "Fatto" # src/icqdialogs.cc:496 #: src/icqdialogs.cc:1007 #, fuzzy msgid " [Ctrl-X save, Esc cancel] " msgstr " A proposito [Ctrl-X salva, Esc annulla] " # src/icqdialogs.cc:529 #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Invia il/i file a %s, %lu " # src/icqdialogs.cc:539 src/icqface.cc:444 src/icqface.cc:1481 # src/icqface.cc:1656 #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Aggiungi" # src/icqdialogs.cc:539 #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Commento" # src/icqdialogs.cc:539 #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Invia" # src/icqdialogs.cc:548 #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Files " # src/icqdialogs.cc:549 #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Commento " # src/icqdialogs.cc:561 #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "nome file: " # src/icqdialogs.cc:568 #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "commento: " # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 src/icqface.cc:1314 src/icqface.cc:1394 # src/icqface.cc:1440 #: src/icqdialogs.cc:1163 #, fuzzy msgid "None" msgstr "Fatto" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" # src/icqface.cc:263 #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " Opzioni di configurazione centerim" # src/icqdialogs.cc:73 src/icqdialogs.cc:639 #: src/icqdialogs.cc:1218 #, fuzzy msgid " User interface " msgstr " Nome utente per il proxy : %s " # src/icqdialogs.cc:621 #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Cambia il dispositivo per il suono : %s " # src/icqdialogs.cc:622 #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Cambia lo schema dei colori : %s " # src/icqface.cc:1187 #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr "Richiesta autorizzazione da %lu" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" # src/icqdialogs.cc:272 #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Dipartimento : %s " # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr "Cambia" # src/icqdialogs.cc:259 src/icqdialogs.cc:268 #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Stato (Regione) : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr "" #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr "" #: src/icqdialogs.cc:1231 #, c-format msgid " Enable vi bindings: %s " msgstr "" #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr "" # src/icqdialogs.cc:280 #: src/icqdialogs.cc:1241 #, fuzzy, c-format msgid " Switch to language preset : %s " msgstr " 1° Lingua : %s " # src/icqdialogs.cc:272 #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Dipartimento : %s " # src/icqdialogs.cc:272 #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Dipartimento : %s " # src/icqdialogs.cc:274 #: src/icqdialogs.cc:1246 #, fuzzy, c-format msgid " For protocols : %s" msgstr " Posizione : %s " # src/icqface.cc:1474 #: src/icqdialogs.cc:1249 #, fuzzy msgid " Contact list " msgstr "Contatti da %s, %lu" #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr "" # src/icqdialogs.cc:259 src/icqdialogs.cc:268 #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Stato (Regione) : %s " # src/icqdialogs.cc:627 #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Nascondi gli utenti sconnessi : %s " # src/icqdialogs.cc:630 #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-spam: elimina i messaggi da utenti non elencati : %s " # src/icqface.cc:1187 #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr "Richiesta autorizzazione da %lu" #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" # src/icqdialogs.cc:628 #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Quota il messaggio rispondendo : %s " # src/icqdialogs.cc:55 src/icqdialogs.cc:75 #: src/icqdialogs.cc:1257 #, fuzzy, c-format msgid " Check the local mailbox : %s " msgstr " Controlla la password : %s " # src/icqdialogs.cc:66 src/icqdialogs.cc:629 #: src/icqdialogs.cc:1258 #, fuzzy, c-format msgid " Remember passwords : %s " msgstr " Memorizza la password ICQ : %s " # src/icqdialogs.cc:628 #: src/icqdialogs.cc:1259 #, fuzzy, c-format msgid " Edit away message on status change : %s " msgstr " Quota il messaggio rispondendo : %s " # src/icqdialogs.cc:628 #: src/icqdialogs.cc:1266 #, fuzzy, c-format msgid " Chat messaging mode for : %s" msgstr " Quota il messaggio rispondendo : %s " # src/icqdialogs.cc:628 #: src/icqdialogs.cc:1272 #, fuzzy, c-format msgid " Enter key sends message for : %s" msgstr " Quota il messaggio rispondendo : %s " # src/icqdialogs.cc:628 #: src/icqdialogs.cc:1275 #, fuzzy, c-format msgid " Chat messaging mode : %s " msgstr " Quota il messaggio rispondendo : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr "" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, c-format msgid " Color contacts according to: %s " msgstr "" # src/icqdialogs.cc:619 #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Comunicazioni " # src/icqdialogs.cc:47 #: src/icqdialogs.cc:1287 #, fuzzy, c-format msgid " SMTP server : %s " msgstr " Indirizzo del server : %s " # src/icqdialogs.cc:47 #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " Indirizzo del server : %s " # src/icqdialogs.cc:47 #: src/icqdialogs.cc:1289 #, fuzzy, c-format msgid " HTTP proxy server : %s " msgstr " Indirizzo del server : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr "" #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr "" # src/icqdialogs.cc:263 src/icqdialogs.cc:276 #: src/icqdialogs.cc:1299 #, fuzzy msgid " Logging " msgstr " Telefono : %s " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr "" #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr "" #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr "" #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr "" #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" # src/icqdialogs.cc:624 #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Assente automaticamente (minuti) : %d " # src/icqdialogs.cc:625 #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " N/A automaticamente (minuti) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" # src/icqdialogs.cc:625 #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " N/A automaticamente (minuti) : %d " # src/icqdialogs.cc:261 src/icqdialogs.cc:270 #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Indirizzo : %s " # src/icqdialogs.cc:662 #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "" " Intervallo per assumere automaticamente lo stato Assente (0 - " "disabilitato): " # src/icqdialogs.cc:666 #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "" " Intervallo per assumere automaticamente lo stato N/A (0 - disabilitato): " # src/icqdialogs.cc:73 src/icqdialogs.cc:639 #: src/icqdialogs.cc:1370 #, fuzzy msgid "SMTP server hostname: " msgstr " Nome utente per il proxy : %s " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "" # src/icqdialogs.cc:73 src/icqdialogs.cc:639 #: src/icqdialogs.cc:1394 #, fuzzy msgid "HTTP proxy server hostname: " msgstr " Nome utente per il proxy : %s " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "" # src/icqdialogs.cc:73 src/icqdialogs.cc:639 #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr " Nome utente per il proxy : %s " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" # src/icqface.cc:1187 #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Richiesta autorizzazione da %lu" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" # src/icqdialogs.cc:731 #: src/icqdialogs.cc:1668 #, fuzzy msgid "Your details have been fetched" msgstr "I tuoi dettagli ICQ sono stati scaricati" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "" # src/icqdialogs.cc:539 src/icqface.cc:1656 #: src/icqdialogs.cc:1704 #, fuzzy msgid "Rename" msgstr "Elimina" # src/icqdialogs.cc:539 src/icqface.cc:1656 #: src/icqdialogs.cc:1704 #, fuzzy msgid "rEmove" msgstr "Elimina" # src/icqdialogs.cc:539 src/icqface.cc:1656 #: src/icqdialogs.cc:1704 #, fuzzy msgid "move Up" msgstr "Elimina" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr "" #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "" # src/centerim.cc:292 #: src/icqdialogs.cc:1745 #, fuzzy msgid "New name for the group: " msgstr "Nuovo soprannome da mostrare: " # src/centerim.cc:285 #: src/icqdialogs.cc:1760 #, fuzzy msgid "Are you sure want to remove the group?" msgstr "Sei sicuro di voler eliminare %s (%lu)?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/icqdialogs.cc:1826 #, fuzzy msgid "Cancel" msgstr "Cambia" # src/icqface.cc:1474 #: src/icqdialogs.cc:1855 #, fuzzy, c-format msgid " Incoming from %s " msgstr "Contatti da %s, %lu" # src/icqface.cc:1097 #: src/icqdialogs.cc:1857 #, fuzzy, c-format msgid " Outgoing to %s " msgstr "Scrittura messaggio per %s, %lu" #: src/icqdialogs.cc:1865 msgid "init" msgstr "" #: src/icqdialogs.cc:1866 msgid "start" msgstr "" # src/icqface.cc:768 #: src/icqdialogs.cc:1867 #, fuzzy msgid "work" msgstr "Lavoro" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 src/icqface.cc:1314 src/icqface.cc:1394 # src/icqface.cc:1440 #: src/icqdialogs.cc:1868 #, fuzzy msgid "done" msgstr "Fatto" #: src/icqdialogs.cc:1869 msgid "err" msgstr "" # src/icqface.cc:768 #: src/icqdialogs.cc:1870 #, fuzzy msgid "abort" msgstr "Note" # src/icqdialogs.cc:244 #: src/icqdialogs.cc:1877 #, fuzzy msgid " of " msgstr " Work " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "" #: src/icqdialogs.cc:2023 msgid "private" msgstr "" # src/icqface.cc:33 #: src/icqdialogs.cc:2025 #, fuzzy msgid "friends only" msgstr "Femmina" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr "" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/icqdialogs.cc:2040 #, fuzzy msgid "cAncel" msgstr "Cambia" # src/icqdialogs.cc:274 #: src/icqdialogs.cc:2052 #, fuzzy, c-format msgid " Post to journal : %s " msgstr " Posizione : %s " # src/icqdialogs.cc:47 #: src/icqdialogs.cc:2053 #, fuzzy, c-format msgid " Subject : %s " msgstr " Indirizzo del server : %s " # src/icqdialogs.cc:47 #: src/icqdialogs.cc:2058 #, fuzzy, c-format msgid " Security : %s " msgstr " Indirizzo del server : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr "" # src/icqdialogs.cc:263 src/icqdialogs.cc:276 #: src/icqdialogs.cc:2063 #, fuzzy, c-format msgid " Mood : %s " msgstr " Telefono : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "" # src/icqdialogs.cc:59 src/icqdialogs.cc:192 src/icqdialogs.cc:250 #: src/icqdialogs.cc:2064 #, fuzzy, c-format msgid " Custom mood : %s " msgstr " Cognome : %s " # src/icqdialogs.cc:57 src/icqdialogs.cc:190 #: src/icqdialogs.cc:2066 #, fuzzy, c-format msgid " Music : %s " msgstr " E-Mail : %s " # src/icqdialogs.cc:47 #: src/icqdialogs.cc:2067 #, fuzzy, c-format msgid " Picture : %s " msgstr " Indirizzo del server : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "" # src/icqdialogs.cc:256 #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Età : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr "" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr "" # src/icqdialogs.cc:272 #: src/icqdialogs.cc:2073 #, fuzzy, c-format msgid " Disallow comments : %s " msgstr " Dipartimento : %s " # src/icqdialogs.cc:255 #: src/icqdialogs.cc:2074 #, fuzzy, c-format msgid " Backdated entry : %s " msgstr " Data di nascita : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "" #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "" #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "" # src/icqface.cc:1474 #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr "Contatti da %s, %lu" # src/icqface.cc:1859 #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "Ricerca Rapida: digita la richiesta, Alt-S cerca ancora, Invio termina" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr "" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "" # src/icqface.cc:868 #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Sconnesso" # src/icqface.cc:875 #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Connesso" # src/icqface.cc:869 #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Invisibile" # src/icqface.cc:870 #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Disponibile per chat" # src/icqface.cc:831 #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Non disturbare" # src/icqface.cc:872 #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Occupato" # src/icqface.cc:832 #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] Non disponibile" # src/icqface.cc:874 #: src/imcontact.cc:117 src/imlogger.cc:41 #, fuzzy msgid "Away" msgstr "Assente" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "" #: src/imlogger.cc:39 msgid "N/A" msgstr "" # src/icqface.cc:598 src/icqface.cc:655 #: src/imlogger.cc:49 #, fuzzy msgid "message" msgstr "homepage" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "" #: src/imlogger.cc:51 msgid "SMS" msgstr "" #: src/imlogger.cc:52 msgid "authorization" msgstr "" # src/icqface.cc:533 #: src/imlogger.cc:53 #, fuzzy msgid "e-mail" msgstr "E-mail" # src/icqface.cc:593 src/icqface.cc:645 #: src/imlogger.cc:54 #, fuzzy msgid "notification" msgstr "Posizione" # src/icqface.cc:1656 #: src/imlogger.cc:55 #, fuzzy msgid "contacts" msgstr "Vai ai contatti" # src/icqdialogs.cc:548 #: src/imlogger.cc:56 #, fuzzy msgid "files" msgstr " Files " # src/icqface.cc:572 #: src/imlogger.cc:57 #, fuzzy msgid "event" msgstr "Mai" #: src/imlogger.cc:79 msgid "events log started" msgstr "" # src/icqface.cc:1097 #: src/imlogger.cc:110 #, fuzzy, c-format msgid "outgoing %s to %s" msgstr "Scrittura messaggio per %s, %lu" # src/icqface.cc:1474 #: src/imlogger.cc:111 #, fuzzy, c-format msgid "incoming %s from %s" msgstr "Contatti da %s, %lu" # src/icqface.cc:1192 #: src/imlogger.cc:123 #, fuzzy msgid "ignored" msgstr "Ignora" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "" # src/icqface.cc:1337 src/icqface.cc:1387 #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "Inviato su %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr "" # src/icqdialogs.cc:47 #: src/accountmanager.cc:97 #, fuzzy, c-format msgid " Server : %s " msgstr " Indirizzo del server : %s " # src/icqdialogs.cc:47 #: src/accountmanager.cc:100 #, fuzzy, c-format msgid " Secured : %s " msgstr " Indirizzo del server : %s " # src/icqdialogs.cc:61 src/icqdialogs.cc:188 #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " # src/icqdialogs.cc:263 src/icqdialogs.cc:276 #: src/accountmanager.cc:112 #, fuzzy, c-format msgid " Login : %s " msgstr " Telefono : %s " # src/icqdialogs.cc:54 #: src/accountmanager.cc:118 #, fuzzy, c-format msgid " Password (optional) : %s " msgstr " Password da impostare : %s " # src/icqdialogs.cc:62 #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Password : %s " # src/icqdialogs.cc:258 src/icqdialogs.cc:267 #: src/accountmanager.cc:124 #, fuzzy, c-format msgid " Priority : %s " msgstr " Città : %s " # src/icqdialogs.cc:272 #: src/accountmanager.cc:129 #, fuzzy, c-format msgid " Import friend list : %s " msgstr " Dipartimento : %s " # src/icqdialogs.cc:54 #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Password da impostare : %s " # src/icqdialogs.cc:259 src/icqdialogs.cc:268 #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " Stato (Regione) : %s " # src/icqdialogs.cc:259 src/icqdialogs.cc:268 #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Stato (Regione) : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr "" # src/icqdialogs.cc:254 #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Sesso : %s " # src/icqdialogs.cc:244 #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Work " # src/icqdialogs.cc:201 src/icqdialogs.cc:341 #: src/accountmanager.cc:168 #, fuzzy msgid " Change nickname " msgstr "Soprannome: " # src/icqface.cc:261 #: src/accountmanager.cc:169 #, fuzzy msgid " Update user details " msgstr " Aggiorna i tuoi dettagli" # src/icqface.cc:598 src/icqface.cc:655 #: src/accountmanager.cc:172 #, fuzzy msgid " Set away message " msgstr "homepage" #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr "" # src/icqdialogs.cc:73 src/icqdialogs.cc:639 #: src/accountmanager.cc:200 #, fuzzy msgid " user name: " msgstr " Nome utente per il proxy : %s " # src/icqdialogs.cc:45 #: src/accountmanager.cc:205 #, fuzzy msgid " uin: " msgstr "nuovo uin" # src/centerim.cc:65 src/icqdialogs.cc:87 #: src/accountmanager.cc:210 src/accountmanager.cc:266 #, fuzzy msgid " password: " msgstr "Password: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "" # src/icqhook.cc:79 #: src/accountmanager.cc:232 #, fuzzy msgid "You have to disconnect the service first!" msgstr "+ impossibile connettersi al server icq" # src/icqdialogs.cc:632 #: src/accountmanager.cc:241 #, fuzzy msgid " server address: " msgstr " Indirizzo server ICQ : %s " #: src/accountmanager.cc:285 msgid " priority: " msgstr "" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" # src/icqdialogs.cc:28 #: src/imcontroller.cc:65 #, fuzzy, c-format msgid " Register on the %s network " msgstr " Registrati nel network ICQ " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "" # src/icqdialogs.cc:54 #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Password da impostare : %s " # src/icqdialogs.cc:55 src/icqdialogs.cc:75 #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Controlla la password : %s " # src/icqdialogs.cc:47 #: src/imcontroller.cc:93 #, fuzzy, c-format msgid " Server to use : %s " msgstr " Indirizzo del server : %s " # src/icqdialogs.cc:88 #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Controlla la password immessa: " # src/icqdialogs.cc:89 #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Soprannome da impostare: " # src/icqface.cc:572 #: src/imcontroller.cc:108 #, fuzzy msgid "Server: " msgstr "Mai" # src/icqdialogs.cc:135 #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Le password non corrispondono" # src/icqdialogs.cc:88 #: src/imcontroller.cc:116 #, fuzzy msgid "Password must be entered" msgstr "Controlla la password immessa: " # src/icqdialogs.cc:88 #: src/imcontroller.cc:118 #, fuzzy msgid "Password must be at least 6 chars long" msgstr "Controlla la password immessa: " # src/centerim.cc:115 #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Stato della registrazione " # src/centerim.cc:130 #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Connessione al server %s ..." # src/centerim.cc:135 #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Invio la richiesta" # src/centerim.cc:146 #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Il tempo per registrare l'uin è scaduto. Riprovo?" # src/centerim.cc:149 #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Nuovo tentativo.." # src/centerim.cc:164 #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Ricevuto un nuovo UIN, %lu" # src/centerim.cc:169 #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Scollegato" # src/centerim.cc:174 #: src/imcontroller.cc:179 #, fuzzy msgid "Unable to connect to icq server. Retry?" msgstr "Non riesco a connettermi al server icq. Riprovo?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "" #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "" # src/icqface.cc:33 #: src/imcontroller.cc:228 #, fuzzy msgid "Failed" msgstr "Femmina" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "" #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "" # src/centerim.cc:115 #: src/imcontroller.cc:336 #, fuzzy msgid "registration is not supported" msgstr " Stato della registrazione " #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "" #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "" # src/icqface.cc:1151 #: src/icqconf.cc:1610 #, fuzzy, c-format msgid "%s to %s has been put to the queue" msgstr "+ %lu è stato aggiunto alla lista" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "" # src/icqdialogs.cc:370 #: src/icqconf.cc:1680 #, fuzzy msgid "Usage: " msgstr "Età: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" # src/icqdialogs.cc:242 #: src/icqconf.cc:1682 #, fuzzy msgid "General options:" msgstr " Generale " #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr "" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr "" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" # src/icqface.cc:259 #: src/icqconf.cc:1689 #, fuzzy msgid " --help display this stuff" msgstr " Cambia lo stato ICQ s" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr "" # src/icqface.cc:263 #: src/icqconf.cc:1692 #, fuzzy msgid "Events sending options:" msgstr " Opzioni di configurazione centerim" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr "" #: src/icqconf.cc:1694 msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr "" #: src/icqconf.cc:1695 msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" #: src/icqconf.cc:1700 msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "" # src/icqface.cc:1187 #: src/imevents.cc:297 #, fuzzy msgid "Empty authorization request message" msgstr "Richiesta autorizzazione da %lu" # src/icqface.cc:1187 #: src/imevents.cc:321 #, fuzzy msgid "* Authorization request : " msgstr "Richiesta autorizzazione da %lu" # src/icqface.cc:1187 #: src/imevents.cc:322 #, fuzzy msgid "* Authorization : " msgstr "Richiesta autorizzazione da %lu" #: src/imevents.cc:381 msgid "* SMS : " msgstr "" # src/icqface.cc:1474 #: src/imevents.cc:517 #, fuzzy msgid "* Contacts : " msgstr "Contatti da %s, %lu" #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" # src/icqface.cc:177 src/icqface.cc:194 #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr " Ignora l'utente" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" # src/icqface.cc:768 #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Info" #: src/imotr.cc:122 src/imotr.cc:315 msgid " accountname: " msgstr "" # src/icqdialogs.cc:274 #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Posizione : %s " # src/icqdialogs.cc:73 src/icqdialogs.cc:639 #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " Nome utente per il proxy : %s " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" # src/icqface.cc:15 #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "sì" # src/icqface.cc:15 #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "no" # src/icqface.cc:15 #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "sì" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" # src/icqdialogs.cc:246 #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Note " # src/icqdialogs.cc:274 #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " Posizione : %s " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" # src/icqdialogs.cc:370 #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Età: " # src/icqdialogs.cc:274 #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " Posizione : %s " # src/icqdialogs.cc:246 #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Note " # src/icqface.cc:15 #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "sì" # src/icqface.cc:58 #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "Nov" # src/icqface.cc:572 #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr "Mai" #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "" #: src/imotr.cc:588 msgid "Unknown" msgstr "" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" # src/icqface.cc:34 #: src/icqface.cc:52 msgid "Male" msgstr "Maschio" # src/icqface.cc:33 #: src/icqface.cc:53 msgid "Female" msgstr "Femmina" # src/icqface.cc:35 #: src/icqface.cc:56 msgid "Not specified" msgstr "Non specificato" # src/icqface.cc:1192 src/icqface.cc:1202 src/icqface.cc:1436 # src/icqface.cc:1482 #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" # src/icqface.cc:1202 src/icqface.cc:1318 src/icqface.cc:1397 # src/icqface.cc:1440 src/icqface.cc:1482 #: src/icqface.cc:62 msgid "Next" msgstr "Prossimo" # src/icqface.cc:1314 src/icqface.cc:1318 src/icqface.cc:1394 # src/icqface.cc:1397 #: src/icqface.cc:63 msgid "Fwd" msgstr "Avanti" # src/icqface.cc:1314 src/icqface.cc:1318 #: src/icqface.cc:64 msgid "Reply" msgstr "rispondi" # src/icqface.cc:1394 src/icqface.cc:1397 #: src/icqface.cc:65 msgid "Open" msgstr "Apri" # src/icqface.cc:1191 src/icqface.cc:1439 #: src/icqface.cc:66 msgid "Accept" msgstr "Accetta" #: src/icqface.cc:67 msgid "Reject" msgstr "" #: src/icqface.cc:68 msgid "User info" msgstr "" #: src/icqface.cc:70 msgid "Prev" msgstr "" # src/icqface.cc:19 #: src/icqface.cc:78 msgid "sound card" msgstr "scheda sonora" # src/icqface.cc:20 #: src/icqface.cc:79 msgid "speaker" msgstr "altoparlante" # src/icqface.cc:21 #: src/icqface.cc:80 msgid "disable" msgstr "disabilita" # src/icqface.cc:22 src/icqface.cc:28 #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "non cambiare" # src/icqface.cc:26 #: src/icqface.cc:88 msgid "dark" msgstr "scuro" # src/icqface.cc:27 #: src/icqface.cc:89 msgid "blue" msgstr "blu" #: src/icqface.cc:97 msgid "protocol" msgstr "" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "Cambia" # src/icqdialogs.cc:40 #: src/icqface.cc:118 #, fuzzy msgid "mode 1" msgstr " Modo " # src/icqdialogs.cc:40 #: src/icqface.cc:119 #, fuzzy msgid "mode 2" msgstr " Modo " #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "" # src/icqface.cc:170 #: src/icqface.cc:274 #, fuzzy msgid "Send an URL" msgstr " Invia un url u" #: src/icqface.cc:275 msgid " Send an SMS" msgstr "" # src/icqface.cc:1656 #: src/icqface.cc:276 #, fuzzy msgid "Send contacts" msgstr "Vai ai contatti" # src/icqface.cc:1187 #: src/icqface.cc:277 #, fuzzy msgid " Request authorization" msgstr "Richiesta autorizzazione da %lu" # src/icqface.cc:204 #: src/icqface.cc:278 #, fuzzy msgid "Edit details" msgstr " Modifica i dettagli" # src/icqface.cc:598 src/icqface.cc:655 #: src/icqface.cc:279 #, fuzzy msgid "Fetch away message" msgstr "homepage" # src/icqface.cc:189 #: src/icqface.cc:280 #, fuzzy msgid "Add to list" msgstr " Aggiungi alla lista a" # src/icqface.cc:170 #: src/icqface.cc:281 #, fuzzy msgid "Rename contact" msgstr " Invia un url u" #: src/icqface.cc:282 msgid " Move to group.." msgstr "" #: src/icqface.cc:283 msgid " Ping" msgstr "" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "" # src/icqdialogs.cc:529 #: src/icqface.cc:285 #, fuzzy msgid " Send file(s)" msgstr " Invia il/i file a %s, %lu " #: src/icqface.cc:286 msgid " Invite to conference.." msgstr "" # src/icqface.cc:169 src/icqface.cc:186 #: src/icqface.cc:293 #, fuzzy msgid " Send a channel message enter" msgstr " Invia un messaggio invio" # src/icqface.cc:167 src/icqface.cc:175 src/icqface.cc:192 #: src/icqface.cc:294 #, fuzzy msgid "Channel chat history" msgstr " Storico eventi h" # src/icqface.cc:176 src/icqface.cc:193 src/icqface.cc:203 #: src/icqface.cc:295 #, fuzzy msgid " Remove channel del" msgstr " Elimina l'utente canc" # src/icqface.cc:22 src/icqface.cc:28 #: src/icqface.cc:296 #, fuzzy msgid " Join channel" msgstr "non cambiare" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/icqface.cc:297 #, fuzzy msgid " Leave channel" msgstr "Cambia" # src/icqdialogs.cc:92 src/icqdialogs.cc:204 src/icqdialogs.cc:345 #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Cognome: " # src/icqface.cc:169 src/icqface.cc:186 #: src/icqface.cc:301 #, fuzzy msgid "UnBlock channel messages" msgstr " Invia un messaggio invio" # src/icqface.cc:169 src/icqface.cc:186 #: src/icqface.cc:303 #, fuzzy msgid "Block channel messages" msgstr " Invia un messaggio invio" # src/icqface.cc:598 src/icqface.cc:655 #: src/icqface.cc:310 #, fuzzy msgid "Send a message" msgstr "homepage" # src/icqface.cc:167 src/icqface.cc:175 src/icqface.cc:192 #: src/icqface.cc:312 #, fuzzy msgid "Event history" msgstr " Storico eventi h" # src/icqdialogs.cc:539 src/icqface.cc:1656 #: src/icqface.cc:313 #, fuzzy msgid "Remove user" msgstr "Elimina" # src/icqface.cc:174 src/icqface.cc:191 src/icqface.cc:202 #: src/icqface.cc:314 #, fuzzy msgid "User's details" msgstr " Dettagli dell'utente ?" #: src/icqface.cc:315 msgid "External actions.." msgstr "" # src/icqface.cc:176 src/icqface.cc:193 src/icqface.cc:203 #: src/icqface.cc:318 #, fuzzy msgid "Unset ignore user" msgstr " Elimina l'utente canc" # src/icqface.cc:177 src/icqface.cc:194 #: src/icqface.cc:318 #, fuzzy msgid "Ignore user" msgstr " Ignora l'utente" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" # src/icqface.cc:176 src/icqface.cc:193 src/icqface.cc:203 #: src/icqface.cc:328 #, fuzzy msgid "Force check" msgstr " Elimina l'utente canc" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #: src/icqface.cc:435 #, fuzzy msgid "Change status" msgstr "Cambia" # src/icqface.cc:1656 #: src/icqface.cc:436 #, fuzzy msgid "Go to contact.." msgstr "Vai ai contatti" #: src/icqface.cc:437 msgid " Accounts.." msgstr "" # src/icqface.cc:263 #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " Opzioni di configurazione centerim" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr "" # src/icqface.cc:262 #: src/icqface.cc:444 msgid " Find/add users" msgstr " Cerca/Aggiungi utenti" # src/icqface.cc:22 src/icqface.cc:28 #: src/icqface.cc:445 #, fuzzy msgid " Join channel/conference" msgstr "non cambiare" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr "" # src/icqface.cc:266 #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Vedi/Modifica la lista ignorati" # src/icqface.cc:267 #: src/icqface.cc:451 #, fuzzy msgid " View/edit invisible list" msgstr " Vedi/Modifica la lista visibili" # src/icqface.cc:267 #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Vedi/Modifica la lista visibili" # src/icqdialogs.cc:627 #: src/icqface.cc:455 #, fuzzy msgid "Show offline users" msgstr " Nascondi gli utenti sconnessi : %s " # src/icqdialogs.cc:627 #: src/icqface.cc:457 #, fuzzy msgid "Hide offline users" msgstr " Nascondi gli utenti sconnessi : %s " # src/icqface.cc:1474 #: src/icqface.cc:460 #, fuzzy msgid " Organize contact groups" msgstr "Contatti da %s, %lu" #: src/icqface.cc:461 msgid " Mass group move.." msgstr "" # src/icqface.cc:444 src/icqface.cc:1191 src/icqface.cc:1201 # src/icqface.cc:1481 src/icqface.cc:1656 #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Dettagli" # src/icqface.cc:598 src/icqface.cc:655 #: src/icqface.cc:905 #, fuzzy msgid "Message" msgstr "homepage" # src/icqface.cc:445 #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr " Nuova ricerca" # src/icqface.cc:1474 #: src/icqface.cc:924 #, fuzzy msgid "Contact to add" msgstr "Contatti da %s, %lu" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "" #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "" # src/icqface.cc:490 #: src/icqface.cc:1016 #, fuzzy, c-format msgid "Information about %s" msgstr "Informazioni su %lu, %s" # src/icqface.cc:531 #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Soprannome" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" # src/icqface.cc:177 src/icqface.cc:194 #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr " Ignora l'utente" #: src/icqface.cc:1116 msgid "not found" msgstr "" # src/icqface.cc:533 #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail" # src/icqface.cc:534 #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2° e-mail" # src/icqface.cc:535 #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Vecchio" # src/icqface.cc:536 #: src/icqface.cc:1134 msgid "Gender" msgstr "Sesso" # src/icqface.cc:537 #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Data nascita" # src/icqface.cc:538 #: src/icqface.cc:1136 msgid "Age" msgstr "Età" # src/icqface.cc:539 #: src/icqface.cc:1137 msgid "Languages" msgstr "Lingue" # src/icqface.cc:540 #: src/icqface.cc:1138 msgid "Last IP" msgstr "Ultimo IP" # src/icqface.cc:570 #: src/icqface.cc:1161 msgid "Last seen" msgstr "Visto" # src/icqface.cc:572 #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Mai" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" # src/icqdialogs.cc:539 #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "Invia" # src/icqdialogs.cc:548 #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr " Files " # src/icqface.cc:1656 #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Vai ai contatti" # src/icqface.cc:1187 #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "Richiesta autorizzazione da %lu" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" # src/icqface.cc:592 src/icqface.cc:644 #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Indirizzo" # src/icqface.cc:593 src/icqface.cc:645 #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Posizione" # src/icqface.cc:594 src/icqface.cc:646 #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "CAP" # src/icqface.cc:595 src/icqface.cc:653 #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefono" # src/icqface.cc:596 src/icqface.cc:654 #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" # src/icqface.cc:597 #: src/icqface.cc:1258 msgid "Cellular" msgstr "Cellulare" #: src/icqface.cc:1259 msgid "Timezone" msgstr "" # src/icqface.cc:598 src/icqface.cc:655 #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "homepage" # src/icqface.cc:648 #: src/icqface.cc:1300 msgid "Company" msgstr "Compagnia" # src/icqface.cc:649 #: src/icqface.cc:1301 msgid "Department" msgstr "Dipartimento" # src/icqface.cc:651 #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Titolo" # src/icqface.cc:722 #: src/icqface.cc:1346 msgid "Interests" msgstr "Interessi" # src/icqface.cc:740 #: src/icqface.cc:1358 #, fuzzy msgid "Background" msgstr "Background/Passato" # src/icqface.cc:34 #: src/icqface.cc:1376 #, fuzzy msgid "Handle" msgstr "Maschio" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "" #: src/icqface.cc:1378 msgid "Version" msgstr "" #: src/icqface.cc:1379 msgid "Encoding" msgstr "" #: src/icqface.cc:1382 msgid "Link" msgstr "" #: src/icqface.cc:1384 msgid "Frequency" msgstr "" # src/icqface.cc:570 #: src/icqface.cc:1385 #, fuzzy msgid "Last check" msgstr "Visto" #: src/icqface.cc:1386 msgid "Next check" msgstr "" # src/icqface.cc:570 #: src/icqface.cc:1387 #, fuzzy msgid "Last result" msgstr "Visto" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "" # src/icqface.cc:58 #: src/icqface.cc:1404 #, fuzzy msgid "Now" msgstr "Nov" # src/icqdialogs.cc:561 #: src/icqface.cc:1423 #, fuzzy msgid "Full name" msgstr "nome file: " # src/icqface.cc:762 src/icqface.cc:1307 #: src/icqface.cc:1442 #, fuzzy, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "F2 per URL, ESC chiude" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "" #: src/icqface.cc:1456 msgid "Check" msgstr "" # src/icqface.cc:769 #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Modifica" #: src/icqface.cc:1456 msgid "LJ" msgstr "" # src/icqface.cc:769 #: src/icqface.cc:1460 #, fuzzy msgid "Retreive" msgstr "Scarica" # src/icqface.cc:33 #: src/icqface.cc:1466 #, fuzzy msgid "Friend of" msgstr "Femmina" # src/icqface.cc:768 #: src/icqface.cc:1472 msgid "Home" msgstr "Casa" # src/icqface.cc:768 #: src/icqface.cc:1472 msgid "Work" msgstr "Lavoro" # src/icqface.cc:768 #: src/icqface.cc:1472 msgid "More" msgstr "Altre" # src/icqface.cc:769 #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Scarica" # src/icqdialogs.cc:28 #: src/icqface.cc:1573 #, fuzzy msgid " [icq] ICQ network" msgstr " Registrati nel network ICQ " #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr "" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr "" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr "" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr "" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr "" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr "" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr "" # src/icqhook.cc:123 #: src/icqface.cc:1623 #, fuzzy msgid " Already logged in only" msgstr "+ connesso a" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr "" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr "" # src/icqface.cc:1656 #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Vai ai contatti" # src/icqface.cc:1667 #: src/icqface.cc:1952 #, fuzzy msgid "Ignore list" msgstr "Lista Ignorati ICQ" # src/icqface.cc:1668 #: src/icqface.cc:1953 #, fuzzy msgid "Visible list" msgstr "Lista Visibili ICQ" # src/icqface.cc:1668 #: src/icqface.cc:1954 #, fuzzy msgid "Invisible list" msgstr "Lista Invisibili ICQ" # src/icqface.cc:1682 #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Seleziona i contatti da aggiungere alla lista" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "" # src/icqface.cc:1736 #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Contenitori eventi" # src/icqface.cc:1859 #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "Ricerca Rapida: digita la richiesta, Alt-S cerca ancora, Invio termina" # src/icqface.cc:1474 #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr "Contatti da %s, %lu" # src/icqface.cc:1962 #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ nessun URL all'interno del contesto corrente" # src/icqface.cc:1975 #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URL all'interno del contesto corrente" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "" # src/icqface.cc:1055 src/icqface.cc:1099 #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "Ctrl-X invia, Ctrl-F multipli, Ctrl-O storico, Alt-? dettagli, ESC annulla" # src/icqface.cc:1055 src/icqface.cc:1099 #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "Ctrl-X invia, Ctrl-F multipli, Ctrl-O storico, Alt-? dettagli, ESC annulla" # src/icqface.cc:1097 #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr "Scrittura messaggio per %s, %lu" # src/icqface.cc:1656 #: src/icqface.cc:2610 #, fuzzy msgid "Send contacts.." msgstr "Vai ai contatti" # src/icqdialogs.cc:561 #: src/icqface.cc:2670 #, fuzzy msgid "file name: " msgstr "nome file: " # src/icqface.cc:1097 #: src/icqface.cc:3131 #, fuzzy, c-format msgid "Outgoing %s to %s" msgstr "Scrittura messaggio per %s, %lu" # src/icqface.cc:1337 src/icqface.cc:1387 #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Inviato su %s" # src/icqface.cc:1474 #: src/icqface.cc:3135 #, fuzzy, c-format msgid "Incoming %s from %s" msgstr "Contatti da %s, %lu" # src/icqface.cc:1327 src/icqface.cc:1377 #: src/icqface.cc:3136 #, fuzzy, c-format msgid "Received on %s" msgstr "%s, ricevuto su %s" # src/icqface.cc:762 src/icqface.cc:1307 #: src/icqface.cc:3182 #, fuzzy, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "F2 per URL, ESC chiude" # src/icqface.cc:1327 src/icqface.cc:1377 #: src/icqface.cc:3229 #, fuzzy, c-format msgid "%s from %s, received on %s" msgstr "%s, ricevuto su %s" # src/icqface.cc:1337 src/icqface.cc:1387 #: src/icqface.cc:3230 #, fuzzy, c-format msgid "%s to %s, sent on %s" msgstr "Inviato su %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "" # src/icqface.cc:1584 #: src/icqface.cc:3339 #, fuzzy, c-format msgid "%s search, %s again, %s cancel" msgstr "S Cerca, L Ancora, ESC annulla" # src/icqface.cc:1589 #: src/icqface.cc:3348 msgid "search for: " msgstr "cerca: " # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ connessione al server icq" # src/icqface.cc:828 #~ msgid " [o] Online" #~ msgstr " [o] Connesso" # src/icqface.cc:829 #~ msgid " [_] Offline" #~ msgstr " [_] Sconnesso" # src/icqface.cc:830 #~ msgid " [a] Away" #~ msgstr " [a] Assente" # src/icqface.cc:833 #~ msgid " [c] Occupied" #~ msgstr " [c] Occupato" # src/icqface.cc:834 #~ msgid " [f] Free for chat" #~ msgstr " [f] Disponibile per chat" # src/icqface.cc:835 #~ msgid " [i] Invisible" #~ msgstr " [i] Invisibile" # src/icqdialogs.cc:55 src/icqdialogs.cc:75 #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Controlla la password : %s " # src/icqdialogs.cc:260 src/icqdialogs.cc:269 #, fuzzy #~ msgid " Convert from : %s " #~ msgstr " Paese : %s " # src/icqdialogs.cc:260 src/icqdialogs.cc:269 #, fuzzy #~ msgid " Convert to : %s " #~ msgstr " Paese : %s " # src/icqface.cc:762 src/icqface.cc:1307 #, fuzzy #~ msgid "to URLs, " #~ msgstr "F2 per URL, ESC chiude" # src/icqdialogs.cc:200 #, fuzzy #~ msgid "URLs, " #~ msgstr "UIN: " # src/icqdialogs.cc:41 #, fuzzy #~ msgid " details, " #~ msgstr " Dettagli " # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #, fuzzy #~ msgid " cancel" #~ msgstr "Cambia" # src/icqface.cc:1589 #, fuzzy #~ msgid "search, " #~ msgstr "cerca: " # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #, fuzzy #~ msgid " esc cancel" #~ msgstr "Cambia" # src/icqface.cc:1656 #, fuzzy #~ msgid "contact menu, " #~ msgstr "Vai ai contatti" # src/icqdialogs.cc:242 #, fuzzy #~ msgid "general actions, " #~ msgstr " Generale " # src/icqface.cc:170 #, fuzzy #~ msgid " Send contacts c" #~ msgstr " Invia un url u" # src/icqface.cc:174 src/icqface.cc:191 src/icqface.cc:202 #, fuzzy #~ msgid " Edit details e" #~ msgstr " Dettagli dell'utente ?" # src/icqdialogs.cc:627 #, fuzzy #~ msgid " List nicknames ?" #~ msgstr " Nascondi gli utenti sconnessi : %s " # src/icqface.cc:169 src/icqface.cc:186 #, fuzzy #~ msgid " Block channel messages i" #~ msgstr " Invia un messaggio invio" # src/icqface.cc:169 src/icqface.cc:186 #~ msgid " Send a message enter" #~ msgstr " Invia un messaggio invio" # src/icqface.cc:176 src/icqface.cc:193 src/icqface.cc:203 #~ msgid " Remove user del" #~ msgstr " Elimina l'utente canc" # src/icqface.cc:176 src/icqface.cc:193 src/icqface.cc:203 #, fuzzy #~ msgid " Ignore user i" #~ msgstr " Elimina l'utente canc" # src/icqface.cc:176 src/icqface.cc:193 src/icqface.cc:203 #, fuzzy #~ msgid " Remove feed del" #~ msgstr " Elimina l'utente canc" # src/icqface.cc:176 src/icqface.cc:193 src/icqface.cc:203 #, fuzzy #~ msgid " Unset ignore feed i" #~ msgstr " Elimina l'utente canc" # src/icqface.cc:176 src/icqface.cc:193 src/icqface.cc:203 #, fuzzy #~ msgid " Ignore feed i" #~ msgstr " Elimina l'utente canc" # src/icqface.cc:259 #, fuzzy #~ msgid " Change status s" #~ msgstr " Cambia lo stato ICQ s" # src/icqface.cc:260 #~ msgid " Go to contact.. alt-s" #~ msgstr " Vai al contatto.. alt-s" # src/icqface.cc:178 #, fuzzy #~ msgid " Show offline users F5" #~ msgstr " Rinomina l'utente r" # src/icqdialogs.cc:627 #, fuzzy #~ msgid " Hide offline users F5" #~ msgstr " Nascondi gli utenti sconnessi : %s " # src/icqdialogs.cc:51 src/icqdialogs.cc:626 #, fuzzy #~ msgid " Russian win/koi translation for : %s" #~ msgstr " La mappatura russa win1251-koi8 è necessaria : %s " # src/icqdialogs.cc:51 src/icqdialogs.cc:626 #, fuzzy #~ msgid " Russian win/koi translation : %s " #~ msgstr " La mappatura russa win1251-koi8 è necessaria : %s " # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [yahoo] connecting to the server" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:145 #, fuzzy #~ msgid "+ [yahoo] disconnected" #~ msgstr "+ disconnesso" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [yahoo] adding %s to the contacts" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [yahoo] removing %s from the contacts" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [yahoo] logged in" #~ msgstr "+ connesso a" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [jab] connecting to the server" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [jab] adding %s to the contacts" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [jab] removing %s from the contacts" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [jab] logged in" #~ msgstr "+ connesso a" # src/icqhook.cc:145 #, fuzzy #~ msgid "+ [jab] disconnected" #~ msgstr "+ disconnesso" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [aim] connecting to the server" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [aim] removing %s from the contacts" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [aim] logged in" #~ msgstr "+ connesso a" # src/icqhook.cc:145 #, fuzzy #~ msgid "+ [aim] disconnected" #~ msgstr "+ disconnesso" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [icq] connecting to the server" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [icq] logged in" #~ msgstr "+ connesso a" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [irc] connecting to the server" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [irc] logged in" #~ msgstr "+ connesso a" # src/icqhook.cc:145 #, fuzzy #~ msgid "+ [irc] disconnected" #~ msgstr "+ disconnesso" # src/icqhook.cc:145 #, fuzzy #~ msgid "+ [lj] disconnected" #~ msgstr "+ disconnesso" # src/icqface.cc:1474 #, fuzzy #~ msgid " Synchronize contact list " #~ msgstr "Contatti da %s, %lu" # src/icqface.cc:1474 #, fuzzy #~ msgid " Contact list synchronization " #~ msgstr "Contatti da %s, %lu" # src/icqface.cc:1474 #, fuzzy #~ msgid "No contacts to be synchronized" #~ msgstr "Contatti da %s, %lu" # src/icqface.cc:1667 #, fuzzy #~ msgid "Friend list" #~ msgstr "Lista Ignorati ICQ" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [msn] connecting to the server" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [msn] logged in" #~ msgstr "+ connesso a" # src/icqhook.cc:145 #, fuzzy #~ msgid "+ [msn] disconnected" #~ msgstr "+ disconnesso" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [yahoo] %s: started typing" #~ msgstr "+ connesso a" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [yahoo] %s: stopped typing" #~ msgstr "+ connesso a" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [msn] %s: stopped typing" #~ msgstr "+ connesso a" # src/icqhook.cc:123 #, fuzzy #~ msgid "+ [msn] %s: started typing" #~ msgstr "+ connesso a" # src/icqhook.cc:145 #, fuzzy #~ msgid "+ [jab] incorrect jabber id" #~ msgstr "+ disconnesso" # src/icqface.cc:908 #~ msgid " enter to select a file, esc to cancel " #~ msgstr " invio per selezionare un file, esc per annullare " # src/icqface.cc:908 #, fuzzy #~ msgid " space to select a directory, esc to cancel " #~ msgstr " invio per selezionare un file, esc per annullare " # src/icqdialogs.cc:116 src/icqdialogs.cc:677 #~ msgid "SOCKS proxy server to use: " #~ msgstr "Server proxy SOCKS da usare: " # src/icqdialogs.cc:124 src/icqdialogs.cc:681 #~ msgid "SOCKS proxy user name: " #~ msgstr "Nome utente proxy SOCKS: " # src/icqdialogs.cc:120 src/icqdialogs.cc:685 #~ msgid "SOCKS proxy password: " #~ msgstr "Password proxy SOCKS: " # src/icqhook.cc:79 #, fuzzy #~ msgid "+ [msn] unable to connect to the server" #~ msgstr "+ impossibile connettersi al server icq" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [msn] connecting with %s" #~ msgstr "+ connessione al server icq" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #, fuzzy #~ msgid " IRC channels manager " #~ msgstr "Cambia" # src/centerim.cc:65 src/icqdialogs.cc:87 #, fuzzy #~ msgid "Password" #~ msgstr "Password: " # src/icqface.cc:595 src/icqface.cc:653 #, fuzzy #~ msgid "Show" #~ msgstr "Telefono" # src/icqdialogs.cc:36 src/icqdialogs.cc:178 src/icqdialogs.cc:312 # src/icqdialogs.cc:609 #, fuzzy #~ msgid " Channels " #~ msgstr "Cambia" # src/icqface.cc:595 src/icqface.cc:653 #, fuzzy #~ msgid "shown" #~ msgstr "Telefono" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [aim] disconnected from the network" #~ msgstr "+ connessione al server icq" # src/icqhook.cc:73 #, fuzzy #~ msgid "+ [irc] disconnected from the network" #~ msgstr "+ connessione al server icq" # src/icqface.cc:1474 #, fuzzy #~ msgid "Show on the list" #~ msgstr "Contatti da %s, %lu" # src/icqface.cc:1157 #, fuzzy #~ msgid "+ the notification has been sent to %lu" #~ msgstr "+ autorizzazione inviata a %lu" # src/icqhook.cc:79 #, fuzzy #~ msgid "+ [yahoo] unable to connect to the server" #~ msgstr "+ impossibile connettersi al server icq" # src/icqface.cc:1055 src/icqface.cc:1099 #, fuzzy #~ msgid "Ctrl-X send, Ctrl-O history, Alt-? details, ESC exit" #~ msgstr "" #~ "Ctrl-X invia, Ctrl-F multipli, Ctrl-O storico, Alt-? dettagli, ESC annulla" centerim-4.22.10/po/zh_TW.gmo0000644000175000001440000014174111473011457012573 00000000000000Þ•08@+9@e@y@@¡@µ@É@Ý@Kñ@6=A1tA5¦A-ÜA/ BI:B8„BW½BGCh]C=ÆCHD MD[DoDƒD—D*·DâD êD õD E E #E.E?ENE'fE.ŽE6½E-ôE#"FFFXFvF*F)¸F4âFG.G?GYGoGˆG¡G¿GÑGèGHH0HNH!gH‰H¨H ÂHÎH!åH II"I1I@IOIbI0tI ¥I¯I)ÎIøIJ J &J)4J-^J+ŒJ)¸J"âJK!$K FK TK_KqK‰K‘K¤K´KÃKÕK éK öK LLL+LDL^LeLuLŠL¤L·L ÏLÝL"öLM .M9MIMYMjMyM’M¤M!·MÙM îMùM N N)NENXN hNtN{N ŒN ™N ¥N ²N#¼N àNëNûN O.'OVO hOrO‹O œO§OÂOÒO éOöOP P)(PRPbPyP‰P ˜P¤P'³P ÛPéP QQ 6QAQ^QxQQ§QÁQ×Q÷QR!R;RORaRrRR‘R©R ÉR ÖRäR þR S !S+S'>S fSsS‰S ˜S#¹S!ÝSÿST T(T:T PT\TmTuT “TŸT¶TÐTèTïTUU'UCURUbU uU €UŽU U ´UÂU ÇU ÓUßUñU øU5V#;V+_V2‹V1¾V0ðV+!W"MW pW |WˆWEWãWþWX2XKX^X mXyXŠX2ŸXÒXJñXJ `k€!’´¼ÅÝ äï €+€0€ J€W€ _€i€ y€„€Œ€’€™€¯€·€É€Ò€Ú€"ê€ #B&_† ‹•™ ³-ºƒèƒ„„.„E„[„q„Rˆ„3Û„-…-=…-k…=™…K×…3#†^W†<¶†nó†Fb‡J©‡ô‡ ˆˆ+ˆ?ˆ)]ˆ‡ˆ ˆ ›ˆ ¦ˆ°ˆ Áˆ ψ ݈ëˆüˆ%‰0A‰1r‰¤‰Á‰Ö‰ê‰7ÿ‰/7Š3gЛР®Š¼Š ܊ꊋ‹7‹F‹Z‹w‹†‹ ‹º‹%Ñ‹÷‹Œ (Œ6ŒJŒgŒpŒ yŒ‡Œ –Œ¤Œ ¸Œ9ÆŒ#+Og p ~+Œ¸5ØŽ"'Ž"JŽ"mŽŽ ¡Ž¯Ž¾ŽÕŽÞŽôŽ 6 ES\e{—´ ½Ëàú -%Bh }‰ ™ §²ÁÕî‘$‘8‘G‘ Y‘ e‘s‘Œ‘¢‘ «‘¹‘‘ Ò‘ à‘î‘þ‘%’-’ 6’D’Y’8h’¡’¶’ ¿’Í’Ý’æ’ ““ *“ 8“F“L“#h“ Œ“š“°“Á“Гá“'ô“”+”K”`”z”ƒ”œ”«”À”Ï”ã”#÷” •)•?•[•j•{•Š•›•¬•&Å• ì• ú•––3– J–T–5h–ž–­– Á–Ï–/ì–—<—Q— W—b—t——Ÿ— ±—%¿— å—ó—˜.˜J˜S˜h˜{˜˜­˜¼˜̘ Þ˜ é˜÷˜ ™ ™+™ 1™ ;™H™[™ b™4o™!¤™'Æ™+î™&š/Aš$qš–š °š¼šÄšVÖš&-›T›r›†›¡› »› ț՛é›.œ#2œaVœa¸œ#:0^2  Ï!Ý ÿ ž ž$ž6žHžWž`ž+{ž%§ž+ÍžùžŸ$Ÿ=ŸUŸsŸŠŸ§Ÿ%ÄŸ*꟠- B !` ‚  › ¼ Ô ò ¡+¡G¡$e¡Š¡ª¡Ç¡"á¡¢¢"5¢7X¢¢¤¢#¼¢;à¢H£(e£Ž£+§£7Ó£ ¤%(¤N¤i¤,‰¤!¶¤ؤ뤥%¥C¥(b¥‹¥ ¥²¥Ç¥ ߥ ì¥ ú¥ ¦¦ $¦ .¦:¦A¦H¦O¦b¦i¦p¦y¦'€¦¨¦æ ʦ+Ô¦(§)§<§C§S§Z§a§w§2~§±§º§Á§ʧ Ò§ß§ò§ ¨¨(¨>¨Q¨X¨g¨w¨,†¨³¨¼¨ę̀Ó¨ܨ ö¨!©&©5©E©Z© ^©h©†©© –©  © ­©º© Á©#Ë©#頻ª7ª@ªGªPªWªkªªˆªª«ª²ªΪáªñª«««"«+«2«6«I«\«u«ˆ«« •« ¢«¯«¶«½«Ä«Ë«Ò«Ù« à« í« û«¬¬,¬I¬%_¬…¬Œ¬“¬,œ¬.ɬ$ø¬ ­*­:­S­Z­m­t­{­‹­ ­§­·­¾­ Å­Ò­ñ­ô­û­ ®® $®1®D®T® [® e®r® z® ‡®•®™® ®¾®Å®Ì®Þ®í®ô®¯¯¯*¯ ;¯E¯L¯_¯ n¯ z¯†¯ ™¯ £¯­¯½¯įͯÖ¯ Ú¯ ä¯ ò¯ý¯° ° °°&°-°4°;° B°P°`°g° n° {° ˆ° ’° °³°Cɰ( ±6±P±'c±‹±§±º±ñ.Ó±² ²²² 0²:²C²K² Z²d²Hv² ¿²ʲã²ô²û²'³-*³X³h³ p³}³„³£³ª³ ±³ ¾³ ˳Õ³ܳó³ ´´.´ =´ G´Q´X´q´‡´£´´ É´ Ó´ à´í´ ü´ µµ µ&µ <µFµUµ"\µ2µ:²µíµ¶¶N>¶(¶6¶¶í¶ ·L'·t·'·3µ·%é·$¸24¸Vg¸"¾¸#ḹ ¹¹!¹>¹D¹H¹N¹e¹ x¹%…¹«¹²¹ ȹÒ¹á¹ñ¹ ºº º,"ºOºVº]ºwº–ºšº2«º%Þº/»,4»a» }»Š»™»¸»%×»6ý»24¼-g¼ •¼%¡¼+Ǽó¼ú¼½ %½2½9½ @½ M½Z½ v½ƒ½‹½“½,£½нÙ½ì½ÿ½¾¾ 2¾ ?¾L¾P¾o¾v¾ }¾‡¾޾¤¾«¾²¾6¹¾!ð¾7¿(J¿*s¿ž¿%±¿%׿ý¿ÀÀÀ À*À:ÀAÀRÀYÀtÀÀ–ÀžÀ¦À*­ÀØÀßÀ ãÀ íÀ ÷À Á ÁÁ"Á&Á -Á 7ÁAÁ HÁVÁ oÁyÁÁ-¢Á ÐÁÚÁ'áÁ  ÂÂ6ÂVÂ!^€‰ › «Â µÂ¿ÂÆÂÍÂã êÂ÷ÂþÂÃà /Ã9ÃPÃoÃ$ˆÃ­Ã ´ÃÂÃÆÃÎÃZ*È•Q7]p)‡CÉ Ð %ë³óõûUIõDéÌÔà/™÷ü!…°÷-¼Ÿ÷®ä’PÎ}r2öê"œŽ‹á+$¥¹ž¾6Oµ¾å¸Gq §>ÞTÁØÃ†¥DôÙ†M;§ç¯·}‘] ‰e©–轊MÛ˜a¹.˵ìffí¹9=IvF?«OvÃkYßë½*ØÄÁn)5>‡Cxù3ì?2£µ·hÜås<š#Ê:ªúQ3aWRìS“`]K©"Ëï$l+ÕÀ&ÿ°.òÓ_„€ÿ[+/.¿¢4HdJïΗ&Ô>§U¿&ªsÑÒp`jêgæd©mWhŠY±ýÄá¾~(œƒàÕô:4Ñ=òލÈJñ® ¯Ç‘^mÄ$È{‡ªÇ[ÉpoJͲRé¼8±ÖzùÕ‹|ݶåó¨<l¬hcPÛeV¦'¡ô´é eÀΑmX· ›@É£óinºýQº`ÌÌÞ×€6ã  ÓîSu(2ùxÆ@º =âøFõ¤nvEþK^~›«¸ÒÙXøÅ»0—fê’8îûa„-š¯Êˆ€³|•N„¿3¢Ÿrã-ï­ ëHiV–žÜcyDj"­rŒ¢q²ð ñE†Nþ~Úßqg“y40cGÏdà 1¥o%#0x •ˆ;¨/!kL‰Ö ZâW⃠wT®ût»¦³_øÁ˜ÓÙ\#Y[Z,ËzÅ{Ïg)V‚Ô×ÐUþ£KÂ'äÛ˜üæ5E¶í—´CÍIÂúj»ãØoßwç«Ñ7ÚAzÝÊÞ‚¡S_謞b<Œb¤A¦½¸öü%ÀÝŠT“ÚÒÇýLá8ÿ×¶t1(,î\B?¡yð,XèÆ’btw´R|9Ÿk'äƒMl:çœPŽÐ‚”ñ –Nu57¼ö°”òBs™L;™ ”A…Ö}‹ ŤÜH…@æíFˆ‰GÆO­Í*š\!i±u›ðú1à²6Œ{Ï9¬ B ^ You can verify it in the OTR options. accountname: primary: protocol: recipient: secondary: title: username: --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --debug, -d enables debug info logging --help display this stuff --no-xtitles, -T disable xterm titles --offline, -o set all protocols status to offline upon start --version, -v show the program version info -S, --status change the current IM status. Status; o, _, a, d, n, c, f, i -n, --number mobile number to send an event to (sms only) -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, jab, rss, lj, gg or infocard -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Account: Account: Accounts.. Active fingerprint: Age : %s Age range : %s All protocols Already logged in only Always online non-IM contacts for : %s Anti-spam: ignore authorization requests: %s Anti-spam: kill msgs from users not on the list : %s Anti-spam: use captcha to identify bots: %s Arrange contacts into groups : %s Assign PGP key.. Authorization required : %s Auto Presence Status Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Automatically set N/A when screen is detached : %s Backdated entry : %s Birthdate : %s CENTERIM %s UNSENT: %lu Cellular phone : %s CenterIM config options CenterIM configuration Change color scheme to : %s Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Chat panel height : %d Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Codepages conversion Color contacts according to: %s Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users Fingerprint: First name : %s For protocols : %s Forget key Gender : %s General Groups HTTP browser : %s HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Import friend list : %s Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Key passphrase: %s Keywords Keywords : %s Language : %s Last name : %s Leave channel Left panel width : %d Link an RSS feed Link an RSS feed LiveJournal posting: attributes Local charset : %s Location Log panel height : %d Logging Login : %s Look for online only : %s Mass group move.. Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network NickServ password (optional) : %s Nickname Nickname : %s OTR options and fingerprints Online only Online/offline events in the log window : %s OpenPGP key: %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Please type 'yes' or 'no': Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Priority : %s Private keys Protocol: Protocol: Proxy only for HTTP (rss and lj) : %s Public keys Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remote charset : %s Remove channel del Request authorization SMTP server : %s Screen socket path : %s Search parameters Search profiles Search service Secured : %s Security : %s Select PGP key to use Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Show users who have you on their list State : %s Street address : %s Subject : %s Switch to language preset : %s Timestamps in the log window : %s Timestamps include seconds : %s Turn PGP encryption %s UIN UIN : %s Unassign PGP key Update user details Use no key User interface User: Users with photos only : %s Verified: View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM of password: priority: server address: uin: user name: ! Correct path or disable screen auto presence change! Screen socket path doesn't exist!! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu" not found%lu minutes%s [%s] comes online%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit%s from %s, received on %s%s has been deopped by %s.%s has been kicked by %s%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s is now %s, was %s%s or %s to close, Up/Down and PgUp/PgDn to scroll%s search, %s again, %s cancel%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb%s to %s has been put to the queue%s to %s, sent on %s%s to URLs, %s external actions, %s close%s to URLs, %s to full-screenize, %s close%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ ERROR: captcha disabled: no questions found!+ Set N/A after screen detach+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [gg] cannot resolve %s+ [gg] connection failed+ [gg] connection lost+ [gg] connection to the server failed+ [gg] no away message from %s, %s+ [icq] cannot connect+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] cannot connect: + [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ [yahoo] server closed socket+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ new mail arrived, %d messages+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAdd to listAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateBlock channel messagesCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChange statusChannel chat historyChannel topic now is: %sChannel: Charset to convert messages from: Charset to convert messages to: Chat panel height: CheckCheck frequency: Check the new password: Check the password you entered: Choosen screen socket path doesn't exist!City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DNDDecDefault Jabber conference serverDepartmentDepartment: Description: DetailsDetect musicDisconnectedDo not disturbDo you want to forget the selected key?Do you want verify the selected key?DoneDrop the account information first!E-Mail: E-mailE-mail: EditEdit detailsEmpty authorization request messageEncodingEncryptedEnter birthdate (DD-MM-YYYY): ErrorError calculating FingerprintEvent historyEvent recipientsEvents sending options:External actions..FailedFaxFax: FebFemaleFetch away messageFetch version infoFetching your detailsFile transfer statusFinishedFirst name: Force checkFree for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadGo to contact..HTTP browser to use: HTTP proxy server hostname: Hide offline usersHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIgnore userIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLeft panel width: LinkLink: List nicknamesLoadLocationLog panel height: MaleMarMass move selected users to..MayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: NoNo EncryptionNo JabberNo OTRNoneNot availableNot specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOut for LunchOutgoing %sOutgoing %s to %sPGP encrypt error: PGP key passphrase: PGP key search: type to find, %s find again, Enter finishPGP key selection: %s for quick lookupPGP passphrase required: PGP sign error: PING reply from the user: %d second(s)Password must be at least 6 chars longPassword must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: PlaintextPlease join my conference.PolishPosition: PostPosting subject: PrevPublished on: QuickSearch: type to find, %s find again, Enter finishRSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?Remove userRenameRename contactReplyResult of the external action %s:RetreiveRetrieveRetrying..RomanceRussianSMSSMTP server hostname: Screen socket path: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSelect contacts to moveSendSend a messageSend an URLSend contactsSend contacts..Sending requestSent on %sSepServer: Show offline usersState: Street address: StudentsThe Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)This is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnBlock channel messagesUnable to connectUnable to connect to icq server. Retry?UnknownUnset ignore userUnverifiedUsage: User infoUser's detailsVerifiedVersionVisible listWait a moment. Your details haven't been fetched yetWarningWorkWrong Jabber ID!Wrong nickname given, cannot registerYesYou have to disconnect the service first!You must be logged to the Gadu-Gadu network to update your detailsYou must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: [OTR] Connection is insecure...[OTR] Connection is now secure...[OTR] Ending secure session with "[OTR] Error while encrypting message... no message sent![OTR] Error: At the moment, only jabber is supported[OTR] Error: inject_message_cb, recipient "[OTR] Log: [OTR] Received unknown fingerprint from "[OTR] Trying to start a secure session with "abortadding %s to the contactsaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: connecting to the servercontact list quick searchcontactscould not create socketcould not resolve hostnamecouldn't fetchdarkdaysdirectory to save the file(s) to: disabledisconnecteddon't changedonedual login detectede-mailerreventevent sending error: error creating directory for the contactevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfoundfriends onlyfull-screen viewhoursicq disconnection reasonignoredincoming %s from %sincorrect PGP passphraseinitlInklOadlogged inmembers list fetching finished, %d foundmessageminmode 1mode 2move Downmove Upn/anew MSN friendly nick: nononenot foundnot usednotificationoutgoing %s to %spassword was changed successfullypassword: pgp key quick searchpgp key selectionpost new entries to your journal.privateprotocolpublic (visible to all)rEmovereason: %sregistration is not supportedremoving %s from the contactssAvesearch finished, %d foundsearch for: secondsset by %ssocket problemssound cardspeakerstartstatusstatus change error: successthe message was: turboingunknownunknown IM typeunknown status character was givenuseduser info for %susername and password mismatchverify the hostname and portverify the pager host and port enteredworkwrong XMLyesyes/noyou are an op hereProject-Id-Version: centerim 4.22.1 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2007-11-05 17:09+0800 Last-Translator: Ying-Chieh Liao Language-Team: Chinese Language: zh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Chinese X-Poedit-Country: TAIWAN ä½ å¯ä»¥åœ¨ OTR é¸é …裡進行確èª. 帳號å稱 : ä¸»è¦ : 通訊å”定 : 收件者: æ¬¡è¦ : 標題 : 使用者 : --ascii, -a 使用 ASCII 字元來繪出視窗以åŠä½¿ç”¨è€…ä»‹é¢ --basedir, -b 設定一個自訂目錄 --bind, -B 使用自訂的 IP --debug, -d 啟動除錯資訊 --help é¡¯ç¤ºé€™ä»½è¨Šæ¯ --no-xtitles, -T ä¸åŽ»ä¿®æ”¹ xterm 的視窗標題 --offline, -o 啟動時將所有å”定的狀態都設為離線 --version, -v 顯示程å¼ç‰ˆæœ¬è³‡è¨Š -S, --status 設定目å‰çš„ IM 狀態. 狀態å¯ä»¥æ˜¯ : o, _, a, d, n, c, f, i -n, --number 手機號碼 (åªé™ç”¨åœ¨çŸ­è¨Š) -p, --proto å”定類型; å¯ä»¥æ˜¯ icq, yahoo, msn, aim, irc, jab, rss, lj, gg 或是 infocard -s, --send 事件類型; å¯ä»¥æ˜¯ msg, sms 或是 url -t, --to å°è±¡ UIN 或是暱稱 (ä¾å”定類型而異) %s 的詳細資料 æ¯èªž : %s 第一外語 : %s 第二外語 : %s 確定, å–æ¶ˆ 或 確定, å–æ¶ˆ 關於 帳號 : 帳號 : 帳號.. 啟動指紋 : 年齡 : %s 年齡 : %s 所有å”定 åªæœ‰å·²ç™»å…¥ æ°¸é ä¿æŒä¸Šç·šç‹€æ…‹ : %s å垃圾 : 忽略èªè­‰è«‹æ±‚ : %s 防垃圾訊æ¯: 刪除éžå¥½å‹çš„è¨Šæ¯ : %s 防垃圾 : 用 CAPTCHA 來識別機器人 : %s 群組分類顯示法 : %s 指定 PGP 金鑰... è¦æ±‚èªè­‰ : %s 自動上線狀態 è‡ªå‹•åˆ‡æ›æŠŠç‹€æ…‹åˆ‡æ›æˆæš«é›¢ (å–®ä½åˆ†) : %d è‡ªå‹•æŠŠç‹€æ…‹åˆ‡æ›æˆ N/A (å–®ä½åˆ†) : %d ç•¶ screen é›¢ç·šæ™‚è‡ªå‹•æŠŠç‹€æ…‹åˆ‡æ›æˆ : %s éŽæ™‚æ¢ç›® : %s 生日 : %s CENTERIM %s 未é€è¨Šæ¯: %lu 手機 : %s CenterIM 設定é¸é … CenterIM 設定é¸é … 改變色彩é…置為 : %s 變更暱稱 變更密碼 : %s 改變音效è£ç½®ç‚º : %s é »é“ : %s èŠå¤©è¨Šæ¯æ¨¡å¼ : %s èŠå¤©è¨Šæ¯æ¨¡å¼ : %s èŠå¤©çª—欄高 : %d 檢查頻率 (以分為單ä½) : %lu 檢查本地端郵件 : %s 確èªå¯†ç¢¼ : %s 城市 : %s 轉æ›èªžç³»é ç¢¼ 群組分類顯示法 : %s 附註 通訊 å…¬å¸ : %s 好å‹åå–® 國家 : %s 自訂心情 : %s 部門 : %s 在 ~/.centerim/log 中詳註 IM 事件日誌細節 : %s 詳細資料 關閉自動格å¼åŒ– : %s 關閉由 e-mail 傳éžè©•è«– : %s ä¸å…許評論 : %s åœç”¨ E-Mail : %s E-mail : %s åœ¨è®Šæ›´ç‹€æ…‹æ™‚ä¿®æ”¹æš«é›¢è¨Šæ¯ : %s 啟動雙å‘語言功能 : %s 在文字編輯器裡啟動 emacs 按éµè¨­å®š : %s 啟動 P2P 通訊 : %s 啟動網é ç‹€æ…‹æŒ‡ç¤ºå™¨ : %s 按 Enter 就把訊æ¯é€å‡º : %s 按 Enter 就把訊æ¯é€å‡º : %s 有趣的事物 傳真 : %s é »é“åƒæ•¸ 檔案傳輸顯示器 檔案 F找尋/æ–°å¢žå¥½å‹ æ‰¾å°‹/æ–°å¢žå¥½å‹ æŒ‡ç´‹ : å : %s å°ä»€éº¼å”定 : %s 忘記金鑰 性別 : %s 一般 群組 HTTP ç€è¦½å™¨ : %s HTTP 代ç†ä¼ºæœå™¨ : %s éš±è—離線使用者 : %s ä½å®¶ ç¶²é  : %s IM 帳號管ç†å“¡ 匯入好å‹åå–® : %s 從 %s 來的 邀請åƒåŠ æœƒè­°.. åŠ å…¥é »é“ åŠ å…¥é »é“/會議 J加入或新創一個頻é“/會議 金鑰通行碼: %s é—œéµå­— é—œéµå­— : %s 語言 : %s å§“ : %s é›¢é–‹é »é“ å·¦å´æ¬„寬 : %d 連çµä¸€å€‹ RSS ä¾†æº é€£çµä¸€å€‹ RSS ä¾†æº LiveJournal 張貼 : 屬性 本地字集 : %s 地ç†ä½ç½® Log 欄高 : %d 記錄中 帳號 : %s åªå°‹æ‰¾ç·šä¸Šçš„ : %s 大é‡ç¾¤çµ„轉移.. 雜項 心情 : %s å…¶ä»– 移至群組.. 音樂 : %s å稱 : %s å稱/頭銜 網路 NickServ 密碼 (鏿“‡æ€§çš„) : %s 暱稱 暱稱 : %s OTR é¸é …和指紋 åªæ‰¾ä¸Šç·š log 視窗中是å¦è¦é¡¯ç¤º 上線/離線 資訊 : %s OpenPGP 金鑰: %s é¸é … ç¾¤çµ„ç®¡ç† é€åˆ° %s 去 密碼 密碼 (鏿“‡æ€§çš„) : %s 密碼 : %s 想使用的密碼 : %s 電話 : %s 照片 : %s Ping 請輸入 'yes' 或 'no' : P2P å¯ä½¿ç”¨çš„ port ç¯„åœ : %s è·ç¨± : %s 貼到 journal : %s 優先權 : %s ç§å¯†é‡‘é‘° 通訊å”定 : 通訊å”定 : HTTP Proxy (RSS å’Œ LJ 會用到) : %s 公開金鑰 åœ¨å›žè¦†è¨Šæ¯æ™‚引言 : %s 亂數èŠå¤©ç¾¤çµ„ 亂數èŠå¤©ç¾¤çµ„ : %s 註冊 在 %s 網路上註冊 è¨»å†Šåƒæ•¸ 註冊進行中... 註冊æœå‹™ 儲存密碼 : %s é ç«¯å­—集 : %s åˆªé™¤é »é“ del 需è¦èªè­‰ SMTP 伺æœå™¨ : %s Screen socket 路徑 : %s æœå°‹åƒæ•¸ æœå°‹è¨­å®šæª” æœå°‹æœå‹™ 安全性 : %s 安全性 : %s 鏿“‡ä¸€ä»½ PGP 金鑰 丟一個頻é“è¨Šæ¯ enter 傳é€ç°¡è¨Š 傳逿ª”案 傳檔給 %s, %lu 伺æœå™¨ä½å€ : %s 伺æœå™¨ä½å€ : %s æœå‹™ è¨­å®šæš«é›¢è¨Šæ¯ é¡¯ç¤ºåˆ°åº•æœ‰å“ªäº›äººæŠŠä½ åŠ åˆ°å¥½å‹åˆ—表中 çœ/å·ž : %s è¡—é“ä½å€ : %s 主題 : %s 切æ›åˆ°é è¨­èªžè¨€ : %s log 視窗中是å¦è¦é¡¯ç¤ºæ™‚間戳記 : %s 時間戳記記錄到秒 : %s è½‰æ› PGP 加密 %s UIN UIN : %s å–æ¶ˆ PGP 金鑰 更新您的詳細資料 ä¸ä½¿ç”¨é‡‘é‘° ä½¿ç”¨è€…ä»‹é¢ ä½¿ç”¨è€… : åªå°‹æ‰¾é™„照片的使用者 : %s 已驗證 : 檢視/編輯 忽略åå–® 檢視/編輯 ä¸å¯è¦–åå–® 檢視/編輯 å¯è¦–åå–® 工作 XML 匯出 URL : %s ä½ çš„ %s 資料 郵éžå€è™Ÿ : %s [Ctrl-X 儲存, Esc å–æ¶ˆ] [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ 網路 [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM çš„ 密碼: 優先權 : 伺æœå™¨ä½å€ : uin: 使用者: ! è«‹ä¿®æ­£è·¯å¾‘æˆ–å–æ¶ˆ screen è‡ªå‹•åµæ¸¬åŠŸèƒ½! Screen socket 路徑ä¸å­˜åœ¨ !! 有å¦ä¸€éš» centerim 正在執行中! ç£ç¢Ÿç©ºé–“ä¸åˆ° 10k 所以無法連線! ç£ç¢Ÿç©ºé–“ä¸åˆ° 10k, 自動離線! å¦å‰‡å¯èƒ½æœƒéºå¤±é‡è¦è¨Šæ¯æˆ–是設定! 編譯時沒有加入 %s 的功能! pid %lu 會造æˆå•題" 未尋ç²%lu 分%s [%s] 上線了%s 好å‹åå–®é¸å–®, %s 變æ›ç‹€æ…‹, %s 一般é¸å–®, %s/%s å‰å¾Œè¨Šæ¯, %s 離開在 %3$s 上收到從 %2$s 來的 %1$s%s 被 %s å–æ¶ˆäº† op 權é™%s 被 %s 踢出去%s 被 %s 賦與 op 權é™%s å–æ¶ˆæˆ‘çš„ op 權é™%s 加入了%s 離開了%s 給我 op 權é™%1$s 從 %3$s æ”¹æˆ %2$s%s 或 %s 關閉, Up/Down å’Œ PgUp/PgDn æ²é %s æœå°‹, %s 冿œå°‹,%s å–æ¶ˆ%s é€å‡º, %s 多人短訊, %s/%s å‰å¾Œè¨Šæ¯, %s éŽçœ¼é›²ç…™, %s URLs, %s 全螢幕, %s 資訊%s é€å‡º, %s 多人短訊, %s/%s å‰å¾Œè¨Šæ¯, %s éŽçœ¼é›²ç…™, %s URLs, %s 全螢幕, %s æˆå“¡%s 到 %s 已被放入佇列中在 %3$s 上é€å‡ºçµ¦ %2$s çš„ %1$s%s é€£çµ URL, %s 外部指令, %s 關閉%s 連到網å€,%s 全螢幕, %s 關閉%s 離線了%s: 離線了%s: 上線了, ç›®å‰ç‹€æ…‹æ˜¯ %s(é è¨­å€¼)(ç„¡/自訂)* èªè­‰ : * è¦æ±‚èªè­‰ : * 好å‹åå–® : * 檔案傳輸* SMS : + %s 已被加入å單中+ ERROR: CAPTCHA å–æ¶ˆ : å•題ä¸å­˜åœ¨ !+ screen é›¢ç·šæ™‚æŠŠç‹€æ…‹è¨­æˆ N/A+ [%02d:%02d:%02d] 收到新信, å…± %d å°+ [%s] 自動設定 %s+ [%s] 狀態回存+ [aim] 連線失敗: %s+ [aim] 密碼已é€å‡º+ [aim] 無法連接伺æœå™¨+ [gg] 無法查明 %s+ [gg] 伺æœå™¨é€£ç·šå¤±æ•—+ [gg] 伺æœå™¨é€£ç·šä¸­æ–·+ [gg] 連接伺æœå™¨æ™‚發生å•題+ [gg] 無法å–å¾— %s, %s 的暫離訊æ¯+ [icq] 無法連線 : + [icq] 連線中斷+ [icq] 無法傳簡訊給 %s+ [icq] 無法傳簡訊給 %s, %s+ [irc] 連線失敗: %s+ [irc] 暱稱æˆåŠŸåœ°è®Šæ›´äº†+ [irc] 密碼已é€å‡º+ [irc] 無法連接伺æœå™¨+ [jab] 錯誤 %d+ [jab] 錯誤 %d : %s+ [jab] 無法å–å¾— %s, %s 的暫離訊æ¯+ [jab] 無法連接伺æœå™¨+ [jab] 在 %s agent è™•å–æ¶ˆç™»éŒ„+ [lj] %s 已被加入å單中+ [lj] HTTP 連線失敗: %s+ [lj] 無法新增好å‹+ [lj] åˆªé™¤å¥½å‹æ™‚發生錯誤+ [lj] 登入失敗: %s+ [lj] 張貼錯誤 : %s+ [lj] 張貼æˆåŠŸï¼Œä»£è™Ÿæ˜¯ %s+ [lj] 已經從您的好å‹åˆ—表中刪除該使用者+ [lj] æœå°‹çµæŸ+ [msn] 無法連線 : + [msn] 從 %s, %s 寄來的 e-mail+ [msn] åå‘使用者列表已å–回, 找到 %d 筆資料+ [msn] 未讀信件 : 收件匣中有 %d å°, 其他信匣中有 %d å°+ [yahoo] 嵿¸¬åˆ°å¾žå…¶ä»–地方上線+ [yahoo] 無法連線: + [yahoo] 無法登入 : 該帳號被åœç”¨+ [yahoo] 無法登入 : 使用者å稱和密碼ä¸ç¬¦+ [yahoo] 無法直接連線+ [yahoo] 從 %s, %s 寄來的 e-mail+ [yahoo] 離開 %s 會議+ [yahoo] 伺æœå™¨é—œé–‰é€£çµ+ ä¸èƒ½åœ¨é›¢ç·šç‹€æ…‹ä¸‹è®€å–暫離訊æ¯+ æœ€å¾Œçš„è¨Šæ¯æ˜¯ %s 傳來的+ 執行 %s 指令+ 收到新信, å…± %d å°+ ç›®å‰çš„訊æ¯ä¸­æ²’有 URL+ %s 沒有定義外部動作+ 與 %s 之間無訊æ¯è¨˜éŒ„+ %s 的設定已變更, 釿–°è¼‰å…¥ä¸­+ å°æ–¹å·²ç¶“回來+ 釿–°æª¢è¦– %s+ %s 已在å單中+ 必需先登入系統二å多歲別的 e-mail三å多歲四åå¤šæ­²äº”åæ­²ä»¥ä¸Š60 以上<無暱稱>關於接å—加入加入好å‹åå–®ä½å€å¹´é½¡å¹´é½¡: 四月真的è¦å°‡ %s ç”±å單中刪除嗎 ?確定è¦åˆªé™¤ç¾¤çµ„å—Ž ?八月作者 : 閒置自動暫離時間 (0 表ä¸ä½¿ç”¨): 閒置自動N/A時間 (0 表ä¸ä½¿ç”¨): è‡ªå‹•åŠ å…¥æœƒè­°æš«é›¢æš«é›¢è¨Šæ¯ : 背景生日ä¸é¡¯ç¤ºé »é“訊æ¯å–消這個傳é€éŽç¨‹å·²ç¶“在進行中, ä¸èƒ½ç§»é™¤é¡žåˆ¥: 手機手機: C修改改變狀態頻é“éŽå¾€é›²ç…™é »é“主題是 : %s é »é“: 訊æ¯åŽŸå§‹å­—é›† : 訊æ¯è½‰æ›å­—集 : èŠå¤©çª—欄高 : 檢查檢查頻率 :確èªå¯†ç¢¼ : 驗證密碼: 所指定的 screen socket 路徑ä¸å­˜åœ¨ !城市: 附註附註: å…¬å¸å…¬å¸: 連線至伺æœå™¨ %s ...æ–°å¢žå¥½å‹ ç›®å‰åƒåŠ æœƒè­°çš„æˆå“¡æœ‰ : ç›®å‰å¿ƒæƒ… :ç¾æ­£æ’­æ”¾ : è‡ªè¨‚ç‹€æ…‹è¨Šæ¯ :DNDå二月é è¨­çš„ Jabber 會議主機部門部門: æè¿° : è©³ç´°è³‡æ–™éŸ³æ¨‚åµæ¸¬æ–·ç·šä¸è¦åµæƒ³è¦å¿˜æŽ‰æ‰€é¸å–之金鑰嗎 ?想è¦é©—證所é¸å–之金鑰嗎 ?完æˆå¿…需先丟棄帳號資料!E-Mail: E-mailE-mail: 編輯編輯詳細資料 空白的èªè­‰è¦æ±‚編碼密文輸入生日 (DD-MM-YYYY): 錯誤計算指紋時發生錯誤事件éŽå¾€é›²ç…™äº‹ä»¶æŽ¥å—者事件傳é€é¸é …:外部動作..失敗傳真傳真: äºŒæœˆå¥³æŠ“å–æš«é›¢è¨Šæ¯æ“·å–版本資訊下載你的詳細資料檔案傳輸狀態完æˆå: 強迫檢查歡迎èŠå¤©é »çއ好å‹å…¨å轉é€éŠæˆ²æ€§åˆ¥ä¸€èˆ¬ä¸€èˆ¬èŠå¤©ä¸€èˆ¬é¸é …:直接åšç§»è‡³å¥½å‹åå–®..HTTP ç€è¦½å™¨ : HTTP 代ç†ä¼ºæœå™¨ä½å€: éš±è—離線使用者與 %s çš„éŽå¾€é›²ç…™, 共有 %d ç­†ä½å®¶é¦–é é¦–é : 我很喜歡é è¨­çš„ %s æš«é›¢è¨Šæ¯ %s %s.我很喜歡 centerim é è¨­çš„ AIM 資訊 %s.忽略所有來自 %s 的事件嗎 ?忽略å單忽略使用者收到 %s, 從 %s 傳來資訊%s 的詳細資料興趣隱形ä¸å¯è¦–å單邀請加入會議..一月J加入/C新創七月六月關éµå­— : 被 %s 踢出 ; ç†ç”±æ˜¯ : %sLJ語言最後上線 IP最後檢查時間姓: ä¸Šæ¬¡çµæžœæœ€å¾Œä¸Šç·šæ™‚間左崿¬„寬 : 連çµé€£çµ : 列出暱稱L載入地ç†ä½ç½®Log 欄高 : 男三月將é¸å–的使用者移至..五月訊æ¯ä¼ºæœå™¨è¨Šæ¯ :手機號碼: 其他移至好å‹å單沒空å字新增群組å稱: å稱/頭銜 : å稱 : 從未新的 UIN 是 %lu新群組å: 新暱稱: 新密碼: 新設定檔å : æ–°æœå°‹ä¸‹ä¸€å€‹ä¸‹ä¸€å€‹æª¢æŸ¥æš±ç¨±æš±ç¨±: 暱稱: 妿œªåŠ å¯†æ²’æœ‰ Jabber沒有 OTR沒有沒空未指定åä¸€æœˆç«‹åˆ»å¾ˆå¿™åæœˆé›¢ç·šç¢ºèªèˆŠçš„ e-mailç™»å…¥é »é“ : 上線開啟管ç†ç¾¤çµ„外出åƒé£¯é€åˆ° %sé€ %s 給 %sPGP 加密錯誤: PGP 金鑰通行碼: PGP 金鑰æœå°‹: æœå°‹å¥½å‹, %s 冿‰¾ä¸€æ¬¡, Enter çµæŸæœå°‹é¸æ“‡ PGP 金鑰: 快速檢視請用 %s請輸入 PGP 通行碼: PGP ç°½å錯誤: 從使用者來的 PING 回應 : %d ç§’å¯†ç¢¼è‡³å°‘è¦æœ‰ 6 個字必需輸入密碼密碼: 密碼ä¸ç¬¦åˆP2P å¯ä½¿ç”¨çš„ port ç¯„åœ (最å°-最大): 電話電話: 明文請加入我的會議.波蘭的è·ä½: P張貼張貼主題 :å‰ä¸€é …在哪裡發佈 :好å‹é€ŸæŸ¥: æœå°‹å¥½å‹, %s 冿‰¾ä¸€æ¬¡, Enter çµæŸæœå°‹RSS 文件亂數é¸å–èŠå¤©å°è±¡å¾ž %s 接收到退回移除也把 %s 從好å‹å單中刪除嗎 ?也把 %d 好å‹å¾žå¥½å‹åˆ—表中移除嗎 ?移除使用者Ræ›´å好勿›´å回覆%s å¤–éƒ¨å‹•ä½œçš„çµæžœæ˜¯ : 接收接收é‡è©¦ä¸­...愛情故事俄國的簡訊SMTP 伺æœå™¨ä½å€: Screen socket 路徑 : æœå°‹çµæžœ [ç„¡]Sæœå°‹/A新增æœå°‹å¥½å‹..æ‰¾ç”·äººæ‰¾å¥³äººé¸æ“‡æŠŠä½¿ç”¨è€…åŠ å…¥ç¾¤çµ„æ”¹è®Šä½¿ç”¨è€…ç¾¤çµ„é¸æ“‡åŠ å…¥åå–®çš„åˆ—è¡¨é¸æ“‡è¦ç§»å‹•群組的好å‹å‚³é€é€è¨Šæ¯å‚³é€ç¶²å€å‚³é€å¥½å‹å‚³é€å¥½å‹..é€å‡ºè«‹æ±‚é€è‡³ %s乿œˆä¼ºæœå™¨: 顯示離線使用者çœ/å·ž: è¡—é“ä½å€: 學生Jabber ID 已經æˆåŠŸåœ°è¨»å†Šäº†ä¸‹åˆ—ä½¿ç”¨è€…å°‡ä½ åŠ é€²ä»–å€‘çš„å¥½å‹åå–® :已經有一個åŒå的設定檔了. è¦è¦†è“‹éŽåŽ»å—Ž ?é ç«¯æ©Ÿå™¨ä½¿ç”¨ %s所指定的目錄ä¸å­˜åœ¨æ‰€æŒ‡å®šçš„目錄ä¸å¯å¯«å…¥ä½¿ç”¨è€… %s (%s) 己經將你加入他的好å‹å單中 Journal ä½å€ : %s使用者 %s 婉拒了你的會議邀請使用者 %s 邀請你加入 %s 會議, 主題是 : %s使用者 %s 加入會議中使用者 %s 離開會議了使用者 %s 己經將你從他的好å‹å單中移除 Journal ä½å€ : %sè©²ä½¿ç”¨è€…ä»Šå¤©ç”Ÿæ—¥è©²ä½¿ç”¨è€…å·²åŒæ„ä½ çš„èªè­‰è¦æ±‚該使用者己經將你加入他的好å‹å單中該使用者把暱稱從 %s æ›æˆ %s該使用者沒有å¯å–得的資訊該使用者拒絕你的èªè­‰è¦æ±‚, ç†ç”±æ˜¯ : 該使用者把你從好å‹åˆ—表中移除 (以 Jabber 的話來說就是 unsubscribe)這是你的 LiveJournal 帳號。註冊新使用者逾時。é‡è©¦ ?時å€è·éŠœä¸»é¡Œ: åšè©¦åœ¨ %2$s 中註冊 %1$s ...UIN: URLURL: ç›®å‰è¨Šæ¯ä¸­çš„ URL顯示頻é“訊æ¯ç„¡æ³•連接無法連接 icq 伺æœå™¨ã€‚é‡è©¦ ?䏿˜Žä¸å¿½ç•¥è©²ä½¿ç”¨è€…未驗證使用方法: ä½¿ç”¨è€…è³‡è¨Šå°æ–¹è©³ç´°è³‡æ–™å·²é©—證版本å¯è¦–åå–®ç¨å¾…片刻, 您的詳細資料尚未傳回警告工作錯誤的 Jabber 代碼 !無法註冊有å•題的暱稱是必需先離線!在更新資料å‰å¿…需先登入 Gadu-Gadu 網路在更新資料å‰å¿…需先登入 ICQ在更新資料å‰å¿…需先登入 Jabber 網路在修改暱稱å‰å¿…需先登入 MSN 網路您的詳細資料已傳回郵éžå€è™Ÿéƒµéžå€è™Ÿ: [OTR] 連線ç¾åœ¨æœªåР坆...[OTR] 連線ç¾åœ¨å·²åР坆...[OTR] çµæŸåŠ å¯†é€£ç·š, å°è±¡æ˜¯ "[OTR] åŠ å¯†è¨Šæ¯æ™‚發生錯誤... è¨Šæ¯æœªé€å‡º ![OTR] 錯誤 : ç›®å‰åªæœ‰ jabber æ”¯æ´æ­¤åŠŸèƒ½[OTR] 錯誤 : inject_message_cb, 收件者 "[OTR] Log: [OTR] æ”¶åˆ°ä¸æ˜Žçš„æŒ‡ç´‹, 來自 "[OTR] 試著建立加密連線, å°è±¡æ˜¯ "失敗把 %s 加入好å‹åå–®AIM 連線失敗如您所願èªè­‰æš«é›¢æš«é›¢è¨Šæ¯å¯†ç¢¼éŒ¯èª¤ä¸æ­£ç¢ºçš„使用者å稱尊貴的è—Aå–æ¶ˆL清除無法連線 : 把您的 %1$s 狀態從 %3$s åˆ‡æ›æˆ %2$s附註: 連接伺æœå™¨ä¸­å¥½å‹å單速查好å‹ç„¡æ³•建立連線無法å解主機å稱無法讀å–高雅的黑天把檔案存到哪個目錄 : é—œæŽ‰æ–·ç·šä¸æ”¹è®Šå®Œæˆåµæ¸¬åˆ°é‡è¤‡ç™»å…¥E-mail錯誤事件事件傳é€éŒ¯èª¤ : 無法新增該使用者的目錄事件傳é€éŒ¯èª¤ : åƒæ•¸ä¸è¶³äº‹ä»¶å‚³é€éŒ¯èª¤ : åªæœ‰åœ¨ ICQ å”定æ‰èƒ½å‚³ UINs事件傳é€éŒ¯èª¤ : 䏿˜Žçš„ IM 型態事件傳é€éŒ¯èª¤ : 䏿˜Žçš„事件型態開始事件紀錄執行外部命令 %s, 回傳碼 = %d執行外部命令 %s, 回傳碼 = %d檔å: 檔å: 檔案尋ç²åªçµ¦å¥½å‹å…¨èž¢å¹•æª¢è¦–å°æ™‚ICQ 中斷原因忽略收到 %2$s 傳來的 %1$s䏿­£ç¢ºçš„ PGP 通行碼啟始I連çµO載入登入æˆå“¡åˆ—表已å–回, 找到 %d 筆資料訊æ¯åˆ†ç¬¬ 1 型第 2 åž‹Då‘下移Uå‘上移N/AMSN 新暱稱 : 妿²’æœ‰æœªå°‹ç²æœªä½¿ç”¨æé†’é€ %s 給 %s密碼æˆåŠŸåœ°è®Šæ›´äº†å¯†ç¢¼ : PGP 金鑰快速æœå°‹é¸æ“‡ PGP 金鑰用它來在你的 journal 裡張貼訊æ¯ã€‚ç§æœ‰çš„å”定公開的 (所有人都å¯ä»¥çœ‹å¾—到)E移除ç†ç”± : %s註冊目å‰å°šæœªæ”¯æ´æŠŠ %s 從好å‹å單中刪除A儲存æœå°‹çµæŸ, 找到 %d 筆資料æœå°‹: ç§’ç”± %s 設定連線有å•題音效å¡PC å–‡å­é–‹å§‹ç‹€æ…‹ç‹€æ…‹å­—元有誤 : æˆåŠŸè¨Šæ¯æ˜¯ : åŠ é€Ÿä¸æ˜Žä¸æ˜Žçš„ IM åž‹æ…‹ä¸æ˜Žçš„狀態字元已使用使用者 %s 的資訊使用者å稱和密碼ä¸ç¬¦é©—證主機ååŠåŸ è™Ÿé©—證所輸入的主機ååŠåŸ è™Ÿå·¥ä½œéŒ¯èª¤çš„ XML是是/å¦ä½ æ˜¯é€™è£¡çš„ opcenterim-4.22.10/po/en@quot.header0000644000175000001440000000226311473011430013603 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # centerim-4.22.10/po/es.po0000644000175000001440000025513511473011457012006 00000000000000# Spanish translation of centerim. # Copyright (C) 2002 Free Software Foundation, Inc. # C4_ , 2002. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.8.7\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2002-11-05 03:52-0500\n" "Last-Translator: Leonardo Boshell \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "contraseña: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" "F2/M menú de contactos actual, F3/S cambiar status, F4/G generalidades, Q " "salir" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "¿Ignorar todos los eventos de %s?" #: src/centerim.cc:278 #, fuzzy, c-format msgid "Remove %s from the contact list as well?" msgstr "+ [aim] removiendo %s de los contactos" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "¿Está seguro que desea eliminar %s?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Nuevo alias a mostrar: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Seleccione un grupo hacia donde mover al usuario" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ no se pueden consutar los mensajes de ausencia estando desconectado" #: src/centerim.cc:427 #, fuzzy msgid "! cannot connect, free disk space is less than 10k" msgstr "! el espacio libre en disco es menos de 10k, desconectándose" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "mensaje de ausencia" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "" #: src/centerim.cc:692 src/centerim.cc:747 #, fuzzy, c-format msgid "+ new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] llegó nuevo correo, %d mensajes" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] llegó nuevo correo, %d mensajes" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ ultimo mensaje de: %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ la configuración de %s fue modificada, cargada de nuevo" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! se detectó otra copia de centerim ejecutándose" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! esto puede ocasionar problemas. pid %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Número de dispositivo móvil: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "directorio en donde guardar archivos: " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "El directorio especificado no se puede escribir" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "El directorio especificado no existe" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ no hay ítems en el historial para %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ el usuario %s ya se encuentra en la lista" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Seleccione un grupo en donde agregar al usuario" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s ha sido agregado(a) a la lista" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ el usuario ha vuelto" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ Status [%s] retomado" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] automáticamente estableció %s" #: src/centerim.cc:1490 msgid "away" msgstr "ausente" #: src/centerim.cc:1490 msgid "n/a" msgstr "n/d" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! el espacio libre en disco es menos de 10k, desconectándose" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! de otro modo pueden perderse eventos y datos de configuración" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "Invitar a conferencia.." #: src/centerim.cc:1772 #, fuzzy msgid "Select contacts to move" msgstr "Seleccionar contactos para agregar a la lista" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "" #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "En los canales: " #: src/hooks/rsshook.cc:380 msgid "success" msgstr "" #: src/hooks/rsshook.cc:400 #, fuzzy msgid "Title: " msgstr "Título" #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "" #: src/hooks/rsshook.cc:402 #, fuzzy msgid "Category: " msgstr "Ciudad: " #: src/hooks/rsshook.cc:403 #, fuzzy msgid "Author: " msgstr "* Autorización : " #: src/hooks/rsshook.cc:405 #, fuzzy msgid "Description: " msgstr "Posición: " #: src/hooks/rsshook.cc:407 #, fuzzy msgid "Link: " msgstr " uin: " #: src/hooks/rsshook.cc:408 #, fuzzy msgid "Comments: " msgstr "comentario: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "no se pudo resolver nombre de host" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "no se pudo crear socket" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "verifique el host y puerto ingresado del localizador" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] abandonando la conferencia %s" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "Por favor únase a mi conferencia." #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Mensaje de status personalizado:" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] no se puede consultar el mensaje de ausencia de %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "" "+ [yahoo] no puede iniciar sesión: no coinciden el nombre de usuario y la " "contraseña" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "" "+ [yahoo] no puede iniciar sesión: no coinciden el nombre de usuario y la " "contraseña" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] no puede iniciar sesión: la cuenta fue bloqueada" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ para reactivarla visite %s" #: src/hooks/yahoohook.cc:802 #, fuzzy msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/yahoohook.cc:809 #, fuzzy msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] error: %s" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "El usuario %s lo ha invitado a la conferencia %s, el tema allí es: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "Los miembros actuales de la conferencia son: " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Se ingresó automáticamente a la conferencia" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "El usuario %s ha rechazado su invitación a unirse a la conferencia" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "El usuario %s se ha unido a la conferencia" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "El usuario %s ha abandonado la conferencia" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "El usuario lo ha agregado a su lista de contactos" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "el mensaje fue: " #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] e-mail de %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] sistema: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] error: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] error: %s" #: src/hooks/yahoohook.cc:1154 #, fuzzy msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] desconectado" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] error: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] error: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] error: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "El usuario cumple años hoy" #: src/hooks/jabberhook.cc:360 #, fuzzy msgid "+ [jab] unable to connect to the server" msgstr "+ [aim] no fue posible conectarse al servidor" #: src/hooks/jabberhook.cc:649 #, fuzzy, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [aim] removiendo %s de los contactos" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Mensaje de ausencia:" #: src/hooks/jabberhook.cc:766 #, fuzzy, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [yahoo] no se puede consultar el mensaje de ausencia de %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "" #: src/hooks/jabberhook.cc:819 #, fuzzy msgid "Unable to connect" msgstr "no fue posible conectarse al servidor del servicio" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "El remoto está usando %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, fuzzy, c-format msgid "+ [jab] error %d" msgstr "+ [yahoo] error: %s" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, fuzzy, c-format msgid "+ [jab] error %d: %s" msgstr "+ [yahoo] error: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] no fue posible conectarse al servidor" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "De veras me gusta el perfil de AIM por defecto de centerim %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "conexión con aim falló" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] conexión fallida: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "El usuario no tiene información de perfil." #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] contraseña enviada" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "como se pidió" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "problemas de socket" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "nombre de usuario incorrecto" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "turboing" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "contraseña incorrecta" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "no coinciden el nombre de usuario y la contraseña" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] desconectado" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "razón de la desconexión en icq" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "El usuario ha aceptado su petición de autorización" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "El usuario rechazó su petición de autorización; el mensaje fue: " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] falló SMS a %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] falló SMS a %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] no se puede consultar el mensaje de ausencia de %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Usuario de Chat Aleatorio" #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ [msn] conexión proveniente de %s" #: src/hooks/gaduhook.cc:164 #, fuzzy, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/gaduhook.cc:218 #, fuzzy msgid "+ [gg] connection to the server failed" msgstr "+ [aim] conectándose al servidor" #: src/hooks/gaduhook.cc:291 #, fuzzy msgid "+ [gg] connection lost" msgstr "+ [msn] conexión proveniente de %s" #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [yahoo] no se puede consultar el mensaje de ausencia de %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] no fue posible conectarse al servidor" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] conexión fallida: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] el alias fue modificado satisfactoriamente" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "En los canales: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Expulsado por %s; razón: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "El usuario cambió su alias de %s a %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] contraseña enviada" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] contraseña enviada" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "respuesta PING del usuario: %d segundo(s)" #: src/hooks/irchook.cc:1442 #, fuzzy, c-format msgid "%s has joined." msgstr "vinculado" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, fuzzy, c-format msgid "reason: %s" msgstr "Enviado en %s" #: src/hooks/irchook.cc:1489 #, fuzzy, c-format msgid "%s has been kicked by %s" msgstr "+ %s ha sido agregado(a) a la lista" #: src/hooks/irchook.cc:1518 #, fuzzy, c-format msgid "Channel topic now is: %s" msgstr " Canal : %s " #: src/hooks/irchook.cc:1523 #, fuzzy, c-format msgid "set by %s" msgstr "Enviado en %s" #: src/hooks/irchook.cc:1541 #, fuzzy, c-format msgid "%s has been opped by %s." msgstr "+ %s ha sido agregado(a) a la lista" #: src/hooks/irchook.cc:1557 #, fuzzy, c-format msgid "%s has been deopped by %s." msgstr "+ %s ha sido agregado(a) a la lista" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 #, fuzzy msgid "+ [lj] user lookup finished" msgstr "+ [icq] búsqueda en las páginas blancas finalizada, %d resultados" #: src/hooks/ljhook.cc:511 #, fuzzy msgid "cannot connect" msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/ljhook.cc:512 #, fuzzy, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [aim] conexión fallida: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "" #: src/hooks/ljhook.cc:572 #, fuzzy, c-format msgid "+ [lj] login failed: %s" msgstr "+ [aim] conexión fallida: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "" #: src/hooks/ljhook.cc:578 #, fuzzy, c-format msgid "+ [lj] post error: %s" msgstr "+ [yahoo] error: %s" #: src/hooks/ljhook.cc:677 #, fuzzy, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "El usuario lo ha agregado a su lista de contactos" #: src/hooks/ljhook.cc:687 #, fuzzy, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "El usuario %s lo ha invitado a la conferencia %s, el tema allí es: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "" #: src/hooks/ljhook.cc:722 #, fuzzy, c-format msgid "+ [lj] %s was added to friends" msgstr "+ %s ha sido agregado(a) a la lista" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] terminó el listado de usuarios, %d encontrados" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "" #: src/hooks/msnhook.cc:799 #, fuzzy, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] e-mail de %s <%s>, %s" #: src/hooks/msnhook.cc:905 #, fuzzy msgid "+ [msn] cannot connect: " msgstr "+ [yahoo] no puede conectarse: " #: src/hooks/msnhook.cc:929 #, fuzzy msgid "verify the hostname and port" msgstr "verifique el host y puerto ingresado del localizador" #: src/hooks/abstracthook.cc:355 #, fuzzy msgid "connecting to the server" msgstr "+ [aim] conectándose al servidor" #: src/hooks/abstracthook.cc:356 #, fuzzy msgid "logged in" msgstr "+ [aim] conectado" #: src/hooks/abstracthook.cc:357 #, fuzzy, c-format msgid "search finished, %d found" msgstr "+ [icq] búsqueda en las páginas blancas finalizada, %d resultados" #: src/hooks/abstracthook.cc:358 #, fuzzy msgid "password was changed successfully" msgstr "+ [aim] la contraseña fue modificada satisfactoriamente" #: src/hooks/abstracthook.cc:359 #, fuzzy msgid "disconnected" msgstr "Desconectado" #: src/hooks/abstracthook.cc:360 #, fuzzy, c-format msgid "adding %s to the contacts" msgstr "+ [aim] agregando %s a los contactos" #: src/hooks/abstracthook.cc:361 #, fuzzy, c-format msgid "removing %s from the contacts" msgstr "+ [msn] removiendo %s de los contactos" #: src/hooks/abstracthook.cc:362 #, fuzzy, c-format msgid "members list fetching finished, %d found" msgstr "+ [yahoo] terminó la consulta de la lista de miembros, %d encontrados" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "El usuario cumple años hoy" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Ene" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Feb" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Mar" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Abr" #: src/icqcontact.cc:854 msgid "May" msgstr "May" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Jun" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Jul" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Ago" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Sep" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Oct" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Nov" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Dic" #: src/icqgroups.cc:66 msgid "General" msgstr "General" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Enviado en %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60-más" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "tipo de IM desconocido" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Chat General" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Romance" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Juegos" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Estudiantes" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "20 y algo" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "30 y algo" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "40 y algo" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "Más de 50" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "Buscando Mujeres" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Buscando Hombres" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Nombre" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Buscar perfiles " #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Eliminar" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Leer" #: src/icqdialogs.cc:205 #, fuzzy msgid "+ you must be logged in first" msgstr "+ debe estar conectado para buscar/agregar usuarios" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "leer (O)" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "guArdar" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "Limpiar" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Cambiar" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Buscar/Agregar" #: src/icqdialogs.cc:234 #, fuzzy msgid "Join/Create" msgstr "Unirse/Abandonar" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Buscar/agregar usuario(s) " #: src/icqdialogs.cc:249 #, fuzzy msgid " Join/create a channel/conference " msgstr " Unirse al canal" #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr "" #: src/icqdialogs.cc:299 msgid " Network " msgstr " Red " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Detalles " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Alias : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Nombre : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Apellido : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Rango de edad : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Género : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Idioma : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " Ubicación " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Ciudad : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Estado : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " País : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Trabajo " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Compañía : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Departamento : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Posición : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Conectado únicamente " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Grupo de chat aleatorio " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Palabras clave " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Alias " #: src/icqdialogs.cc:372 #, fuzzy msgid " Search service " msgstr " Buscar perfiles " #: src/icqdialogs.cc:375 #, fuzzy msgid " Search parameters " msgstr " Buscar perfiles " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 #, fuzzy msgid " Feed Parameters " msgstr " Buscar perfiles " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr "" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr "" #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Canal : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Nombre : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " Nuevos desde el último chequeo solamente " #: src/icqdialogs.cc:416 #, fuzzy, c-format msgid " Keywords : %s " msgstr " Palabras clave " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 #, fuzzy msgid " Options " msgstr " Ubicación " #: src/icqdialogs.cc:422 #, fuzzy, c-format msgid " Users with photos only : %s " msgstr " Posición : %s " #: src/icqdialogs.cc:423 #, fuzzy, c-format msgid " Look for online only : %s " msgstr " Conectado únicamente " #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Mostrar usuarios que lo tienen en su lista " #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr "" #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Contraseña " #: src/icqdialogs.cc:443 #, fuzzy msgid " Service " msgstr " Buscar perfiles " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Nuevo nombre del perfil: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "El perfil con ese nombre ya existe. ¿Desea sobrescribirlo?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Alias: " #: src/icqdialogs.cc:504 #, fuzzy msgid "Name/Title: " msgstr "Nombre: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-Mail: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Nombre: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Apellido: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Ciudad: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Estado: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Compañía: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Departamento: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Posición: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Canal: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Nombre: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Palabras clave: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Contraseña: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 #, fuzzy msgid "URL: " msgstr "URL" #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "" #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " General " #: src/icqdialogs.cc:595 #, fuzzy msgid " Registration service " msgstr " Progreso del registro " #: src/icqdialogs.cc:599 #, fuzzy msgid " Registration parameters " msgstr " Progreso del registro " #: src/icqdialogs.cc:622 #, fuzzy, c-format msgid " Change password : %s " msgstr " Confirme la contraseña : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Cumpleaños : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Edad : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Hogar " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Dirección : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Código postal : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Teléfono : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Teléfono celular : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Página personal : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Más " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1er idioma : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2do idioma : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3er idioma : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Varios " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Habilitar indicator de status web : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Grupo de chat aletario : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Autorización requerida : %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Estado : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " Sobre " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Consultando sus detalles" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Sus detalles de %s" #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: detalles " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Hecho" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Espere un momento. Sus detalles no han sido recuperados aun" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-Mail:" #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Ingrese su fecha de nacimiento (DD-MM-YYYY): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Edad: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Dirección: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "Cód. Zip: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Teléfono: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Teléfono celular: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Sitio web: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Sobre" #: src/icqdialogs.cc:869 #, fuzzy msgid "New password: " msgstr " contraseña: " #: src/icqdialogs.cc:872 #, fuzzy msgid "Check the new password: " msgstr " Confirme la contraseña : %s " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "ninguno" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X guardar, Esc cancelar] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Enviar archivo(s) a %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Agregar" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Comentario" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Enviar" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Archivos " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Comentario " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "nombre de archivo: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "comentario: " #: src/icqdialogs.cc:1163 #, fuzzy msgid "None" msgstr "Hecho" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " Configuración de centerim " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Interfaz de usuario " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Cambiar dispositivo de sonido a : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Cambiar esquema de colores a : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr "Pedir autorización" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Departamento : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " Canal : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Acomodar contactos en grupos : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Habilitar soporte para idiomas bidireccionales : %s " #: src/icqdialogs.cc:1230 #, fuzzy, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Habilitar indicator de status web : %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " Habilitar indicator de status web : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr "" #: src/icqdialogs.cc:1241 #, fuzzy, c-format msgid " Switch to language preset : %s " msgstr " 1er idioma : %s " #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Departamento : %s " #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Departamento : %s " #: src/icqdialogs.cc:1246 #, fuzzy, c-format msgid " For protocols : %s" msgstr " Posición : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Lista de contactos " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Acomodar contactos en grupos : %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Acomodar contactos en grupos : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Esconder usuarios desconectados : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-spam: evitar mensajes de usuarios fuera de la lista : %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Autorización requerida : %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Citar el mensaje original en la respuesta : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Revisar la cuenta de correo local : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Recordar contraseñas : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Editar el mensaje de ausencia al cambiar de status : %s " #: src/icqdialogs.cc:1266 #, fuzzy, c-format msgid " Chat messaging mode for : %s" msgstr " Modo de mensajería tipo chat : %s " #: src/icqdialogs.cc:1272 #, fuzzy, c-format msgid " Enter key sends message for : %s" msgstr " Citar el mensaje original en la respuesta : %s " #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Modo de mensajería tipo chat : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr "" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " Acomodar contactos en grupos : %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Comunicaciones " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " Servidor SMTP : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " Servidor SMTP : %s " #: src/icqdialogs.cc:1289 #, fuzzy, c-format msgid " HTTP proxy server : %s " msgstr " Servidor SMTP : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, fuzzy, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Habilitar indicator de status web : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr "" #: src/icqdialogs.cc:1299 #, fuzzy msgid " Logging " msgstr " Nombre de usuario : %s " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr "" #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr "" #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr "" #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Registro detallado de eventos del IM en ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Periodo para cambiar automáticamente a Ausente (min) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Periodo para cambiar automáticamente a N/D (min) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Periodo para cambiar automáticamente a N/D (min) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Dirección : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Periodo de Auto Ausente (0 - deshabilitado): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Periodo de Auto N/D (0 - deshabilitado): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "Nombre de servidor anfitrión SMTP: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "" #: src/icqdialogs.cc:1394 #, fuzzy msgid "HTTP proxy server hostname: " msgstr "Nombre de servidor anfitrión SMTP: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "" #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "Nombre de servidor anfitrión SMTP: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Mensaje de solicitud de autorización vacío" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Sus detalles han sido recuperados" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Organizar grupos de contactos" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Renombrar" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "Eliminar" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "(U) mover arriba" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "(D) mover abajo" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Seleccionar" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Grupos " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Nombre para el grupo que se va a crear: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Nuevo nombre para el grupo: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "¿Está seguro que desea eliminar el grupo?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Status de transferencia de archivo" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Cancelar" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " Evento entrante de %s " #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " Evento saliente a %s " #: src/icqdialogs.cc:1865 msgid "init" msgstr "inicializar" #: src/icqdialogs.cc:1866 msgid "start" msgstr "iniciar" #: src/icqdialogs.cc:1867 msgid "work" msgstr "trabajo" #: src/icqdialogs.cc:1868 msgid "done" msgstr "hecho" #: src/icqdialogs.cc:1869 msgid "err" msgstr "err" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "abortar" #: src/icqdialogs.cc:1877 msgid " of " msgstr " de " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "No puede eliminar una transferencia que ya está en progreso" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "" #: src/icqdialogs.cc:2023 msgid "private" msgstr "" #: src/icqdialogs.cc:2025 #, fuzzy msgid "friends only" msgstr "Femenino" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr "" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "" #: src/icqdialogs.cc:2040 #, fuzzy msgid "cAncel" msgstr "Cancelar" #: src/icqdialogs.cc:2052 #, fuzzy, c-format msgid " Post to journal : %s " msgstr " Posición : %s " #: src/icqdialogs.cc:2053 #, fuzzy, c-format msgid " Subject : %s " msgstr " Servidor : %s " #: src/icqdialogs.cc:2058 #, fuzzy, c-format msgid " Security : %s " msgstr " Servidor : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr "" #: src/icqdialogs.cc:2063 #, fuzzy, c-format msgid " Mood : %s " msgstr " Nombre de usuario : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "" #: src/icqdialogs.cc:2064 #, fuzzy, c-format msgid " Custom mood : %s " msgstr " Apellido : %s " #: src/icqdialogs.cc:2066 #, fuzzy, c-format msgid " Music : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:2067 #, fuzzy, c-format msgid " Picture : %s " msgstr " Servidor : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Edad : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr "" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr "" #: src/icqdialogs.cc:2073 #, fuzzy, c-format msgid " Disallow comments : %s " msgstr " Departamento : %s " #: src/icqdialogs.cc:2074 #, fuzzy, c-format msgid " Backdated entry : %s " msgstr " Cumpleaños : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "" #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "" #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "" #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr " Lista de contactos " #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "" "BúsquedaRápida: escriba para buscar, Alt-S buscar de nuevo, Enter terminar" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 #, fuzzy msgid " Use no key" msgstr "Info de usuario" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, fuzzy, c-format msgid "executed external manual action %s, return code = %d" msgstr "ejecutada acción externa %s, código retornado = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "ejecutada acción externa %s, código retornado = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Offline" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Online" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Invisible" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Libre para chatear" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] No molestar" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Ocupado" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] No disponible" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "Ausente" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "NM" #: src/imlogger.cc:39 msgid "N/A" msgstr "N/D" #: src/imlogger.cc:49 msgid "message" msgstr "mensaje" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "autorización" #: src/imlogger.cc:53 msgid "e-mail" msgstr "e-mail" #: src/imlogger.cc:54 msgid "notification" msgstr "notificación" #: src/imlogger.cc:55 msgid "contacts" msgstr "contactos" #: src/imlogger.cc:56 msgid "files" msgstr "archivos" #: src/imlogger.cc:57 #, fuzzy msgid "event" msgstr "Nunca" #: src/imlogger.cc:79 msgid "events log started" msgstr "registro de eventos iniciado" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "evento saliente %s a %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "evento entrante %s de %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "ignorado" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s se ha desconectado" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "Enviado en %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: se ha conectado, con status %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: se ha desconectado" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "modificado nuestro status %s a %s desde %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " Administrador de cuentas IM " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Servidor : %s " #: src/accountmanager.cc:100 #, fuzzy, c-format msgid " Secured : %s " msgstr " Servidor : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Nombre de usuario : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Contraseña (opcional) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Contraseña : %s " #: src/accountmanager.cc:124 #, fuzzy, c-format msgid " Priority : %s " msgstr " Ciudad : %s " #: src/accountmanager.cc:129 #, fuzzy, c-format msgid " Import friend list : %s " msgstr " Departamento : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Contraseña (opcional) : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " Acomodar contactos en grupos : %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Acomodar contactos en grupos : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " Registrar " #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Género : %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Palabras clave " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " Cambiar Alias " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Actualizar detalles de usuario " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Establecer mensaje de ausencia " #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Abandonar " #: src/accountmanager.cc:200 msgid " user name: " msgstr " nombre de usuario: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " contraseña: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Abandone la información de la cuenta primero!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Debe desconectarse del servicio primero!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " dirección del servidor: " #: src/accountmanager.cc:285 msgid " priority: " msgstr "" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, fuzzy, c-format msgid " Register on the %s network " msgstr " Registro en la red ICQ " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Prosiga" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Contraseña a establecer : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Confirme la contraseña : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Servidor a utilizar : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Confirme la contraseña que ingresó: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Alias a establecer: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Servidor: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Las contraseñas no coinciden" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Debe ingresar una contraseña" #: src/imcontroller.cc:118 #, fuzzy msgid "Password must be at least 6 chars long" msgstr "Debe ingresar una contraseña" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Progreso del registro " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Conectando al servidor %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Enviando solicitud" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Tiempo de espera agotado para un nuevo uin. ¿Reintentar?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Reintentando.." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Nuevo UIN recibido, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Desconectado" #: src/imcontroller.cc:179 #, fuzzy msgid "Unable to connect to icq server. Retry?" msgstr "No fue posible conectarse al servidor icq. ¿Reintentar?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "" #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "" #: src/imcontroller.cc:228 #, fuzzy msgid "Failed" msgstr "Femenino" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Debe encontrarse conectado a la red ICQ para actualizar los detalles" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "nuevo alias amistoso de MSN: " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "Debe encontrarse conectado a la red MSN para actualizar el alias" #: src/imcontroller.cc:301 #, fuzzy msgid "You must be logged to the Jabber network to update your details" msgstr "Debe encontrarse conectado a la red ICQ para actualizar los detalles" #: src/imcontroller.cc:318 #, fuzzy msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "Debe encontrarse conectado a la red ICQ para actualizar los detalles" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "el registro no está implementado" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "De veras me gusta el mensaje de ausencia por defecto %s de %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, fuzzy, c-format msgid "+ launched the %s action command" msgstr "+ lanzado el comando openurl" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "evento enviando error: no son suficientes parámetros" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "evento enviando error: solo UINs están permitidos con el protocolo icq" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "evento enviando error: tipo de IM desconocido" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "evento enviando error: tipo de evento desconocido" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s a %s ha sido colocado en cola" #: src/icqconf.cc:1616 #, fuzzy msgid "event sending error: error creating directory for the contact" msgstr "evento enviando error: no son suficientes parámetros" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "fue entregado un carácter de status desconocido" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "tipo de IM desconocido" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "error en el cambio de status: " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Uso: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "Opciones generales:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " -ascii, -a usar caracteres ASCII para las ventanas y " "controles de la interfaz" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b establecer un directorio base personalizado" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr "" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help desplegar esta información" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr "" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Opciones de envío de eventos:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr " -s, --send tipo de evento; puede ser msg, sms o url" #: src/icqconf.cc:1694 #, fuzzy msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr " -S, --status cambiar el status actual del IM" #: src/icqconf.cc:1695 #, fuzzy msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto tipo de protocolo; puede ser icq, yahoo, msn, aim " "o irc" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" " -t, --to UIN de destino o alias (depende en el protocolo)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" " -n, --number <#tel> número de móvil a quien enviarle un evento (sms)" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Comunicar fallos a http://bugzilla.centerim.org." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Mensaje de solicitud de autorización vacío" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* Petición de autorización : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* Autorización : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Contactos : " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* Transferencia de archivo" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "no vinculado" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Info" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " Administrador de cuentas IM " #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Posición : %s " #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " nombre de usuario: " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "sí" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "no" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "sí" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Cuentas.." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " Posición : %s " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Uso: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " Posición : %s " #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Cuentas.." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "sí" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "Nov" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " Buscar perfiles " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "Finalizado" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "tipo de IM desconocido" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Masculino" #: src/icqface.cc:53 msgid "Female" msgstr "Femenino" #: src/icqface.cc:56 msgid "Not specified" msgstr "No especificado" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "Siguiente" #: src/icqface.cc:63 msgid "Fwd" msgstr "Fwd" #: src/icqface.cc:64 msgid "Reply" msgstr "Responder" #: src/icqface.cc:65 msgid "Open" msgstr "Abrir" #: src/icqface.cc:66 msgid "Accept" msgstr "Aceptar" #: src/icqface.cc:67 msgid "Reject" msgstr "Rechazar" #: src/icqface.cc:68 msgid "User info" msgstr "Info de usuario" #: src/icqface.cc:70 msgid "Prev" msgstr "Anterior" #: src/icqface.cc:78 msgid "sound card" msgstr "tarjeta de sonido" #: src/icqface.cc:79 msgid "speaker" msgstr "speaker" #: src/icqface.cc:80 msgid "disable" msgstr "deshabilitado" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "no cambiar" #: src/icqface.cc:88 msgid "dark" msgstr "oscuro" #: src/icqface.cc:89 msgid "blue" msgstr "azul" #: src/icqface.cc:97 msgid "protocol" msgstr "" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "iniciar" #: src/icqface.cc:118 msgid "mode 1" msgstr "modo 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "modo 2" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "" #: src/icqface.cc:274 #, fuzzy msgid "Send an URL" msgstr " Enviar un SMS" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " Enviar un SMS" #: src/icqface.cc:276 #, fuzzy msgid "Send contacts" msgstr "Enviar contactos.." #: src/icqface.cc:277 msgid " Request authorization" msgstr "Pedir autorización" #: src/icqface.cc:278 #, fuzzy msgid "Edit details" msgstr " Editar detalles" #: src/icqface.cc:279 #, fuzzy msgid "Fetch away message" msgstr " Mensaje de ausencia f" #: src/icqface.cc:280 #, fuzzy msgid "Add to list" msgstr " Agregar a la lista a" #: src/icqface.cc:281 #, fuzzy msgid "Rename contact" msgstr " Renombrar contacto r" #: src/icqface.cc:282 msgid " Move to group.." msgstr " Mover al grupo.." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 #, fuzzy msgid "Fetch version info" msgstr " Consultar datos de la versión" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " Enviar archivo(s)" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " Invitar a conferencia.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Enviar mensaje al canal enter" #: src/icqface.cc:294 #, fuzzy msgid "Channel chat history" msgstr " Historia del canal de chat h" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Eliminar canal del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Unirse al canal" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Abandonar canal" #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Apellido: " #: src/icqface.cc:301 #, fuzzy msgid "UnBlock channel messages" msgstr " Enviar mensaje al canal enter" #: src/icqface.cc:303 #, fuzzy msgid "Block channel messages" msgstr " Enviar mensaje al canal enter" #: src/icqface.cc:310 #, fuzzy msgid "Send a message" msgstr " Establecer mensaje de ausencia " #: src/icqface.cc:312 #, fuzzy msgid "Event history" msgstr " Historial de eventos h" #: src/icqface.cc:313 #, fuzzy msgid "Remove user" msgstr "Eliminar" #: src/icqface.cc:314 #, fuzzy msgid "User's details" msgstr " Detalles de usuario ?" #: src/icqface.cc:315 msgid "External actions.." msgstr "" #: src/icqface.cc:318 #, fuzzy msgid "Unset ignore user" msgstr " Ignorar usuario i" #: src/icqface.cc:318 #, fuzzy msgid "Ignore user" msgstr " Ignorar usuario" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 #, fuzzy msgid "Force check" msgstr " Ignorar usuario i" #: src/icqface.cc:435 #, fuzzy msgid "Change status" msgstr "Cambiar" #: src/icqface.cc:436 #, fuzzy msgid "Go to contact.." msgstr "Mover a contactos" #: src/icqface.cc:437 msgid " Accounts.." msgstr " Cuentas.." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " Valores de configuración de centerim" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Monitoreo de transferencias de archivo" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Buscar/agregar usuarios" #: src/icqface.cc:445 #, fuzzy msgid " Join channel/conference" msgstr " Unirse al canal" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr "" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Ver/editar lista de ignorados" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Ver/editar lista de invisibles" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Ver/editar lista de visibles" #: src/icqface.cc:455 #, fuzzy msgid "Show offline users" msgstr " Esconder usuarios desconectados : %s " #: src/icqface.cc:457 #, fuzzy msgid "Hide offline users" msgstr " Esconder usuarios desconectados : %s " #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " Organizar grupos de contactos" #: src/icqface.cc:461 msgid " Mass group move.." msgstr "" #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Detalles" #: src/icqface.cc:905 msgid "Message" msgstr "Mensaje" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Nueva búsqueda" #: src/icqface.cc:924 #, fuzzy msgid "Contact to add" msgstr " Lista de contactos " #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Buscando contactos.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Resultados de búsqueda [finalizado]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Información sobre %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Alias" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr "no vinculado" #: src/icqface.cc:1116 #, fuzzy msgid "not found" msgstr "no vinculado" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-Mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2do e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "3er e-mail" #: src/icqface.cc:1134 msgid "Gender" msgstr "Género" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Cumpleaños" #: src/icqface.cc:1136 msgid "Age" msgstr "Edad" #: src/icqface.cc:1137 msgid "Languages" msgstr "Idiomas" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Ultimo IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Visto por última vez" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Nunca" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "Enviar" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "archivos" #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Enviar contactos.." #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "autorización" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Dirección" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Ubicación" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "Cód. Zip" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Teléfono" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Celular" #: src/icqface.cc:1259 msgid "Timezone" msgstr "Horario" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Sitio web" #: src/icqface.cc:1300 msgid "Company" msgstr "Compañía" #: src/icqface.cc:1301 msgid "Department" msgstr "Depart." #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Título" #: src/icqface.cc:1346 msgid "Interests" msgstr "Intereses" #: src/icqface.cc:1358 msgid "Background" msgstr "Trasfondo" #: src/icqface.cc:1376 #, fuzzy msgid "Handle" msgstr "Masculino" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "" #: src/icqface.cc:1378 msgid "Version" msgstr "" #: src/icqface.cc:1379 msgid "Encoding" msgstr "" #: src/icqface.cc:1382 msgid "Link" msgstr "" #: src/icqface.cc:1384 msgid "Frequency" msgstr "" #: src/icqface.cc:1385 #, fuzzy msgid "Last check" msgstr "Visto por última vez" #: src/icqface.cc:1386 msgid "Next check" msgstr "" #: src/icqface.cc:1387 #, fuzzy msgid "Last result" msgstr "como se pidió" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "" #: src/icqface.cc:1404 #, fuzzy msgid "Now" msgstr "Nov" #: src/icqface.cc:1423 #, fuzzy msgid "Full name" msgstr "nombre de archivo: " #: src/icqface.cc:1442 #, fuzzy, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "F2 para URLs, ESC cerrar" #: src/icqface.cc:1447 #, fuzzy, c-format msgid "user info for %s" msgstr "Info de usuario" #: src/icqface.cc:1456 msgid "Check" msgstr "" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Editar" #: src/icqface.cc:1456 msgid "LJ" msgstr "" #: src/icqface.cc:1460 #, fuzzy msgid "Retreive" msgstr "Consultar" #: src/icqface.cc:1466 #, fuzzy msgid "Friend of" msgstr "Femenino" #: src/icqface.cc:1472 msgid "Home" msgstr "Hogar" #: src/icqface.cc:1472 msgid "Work" msgstr "Trabajo" #: src/icqface.cc:1472 msgid "More" msgstr "Más" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Consultar" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] Red ICQ" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr "" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr "" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr "" #: src/icqface.cc:1623 #, fuzzy msgid " Already logged in only" msgstr "ya se encuentra conectado" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr "" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr "" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Mover a contactos" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Lista de ignorados" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Lista de visibles" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Lista de invisibles" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Seleccionar contactos para agregar a la lista" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Receptores de evento" #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "" "BúsquedaRápida: escriba para buscar, Alt-S buscar de nuevo, Enter terminar" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr " Lista de contactos " #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ no hay URLs dentro del contexto actual" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URLs dentro del contexto actual" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "Ctrl-X enviar, Ctrl-P múltiple, Ctrl-O historial, Alt-? miembros, ESC " "cancelar" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "Ctrl-X enviar, Ctrl-P múltiple, Ctrl-O historial, Alt-? detalles, ESC " "cancelar" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr " Evento saliente a %s " #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Enviar contactos.." #: src/icqface.cc:2670 msgid "file name: " msgstr "nombre de archivo: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "Evento saliente %s a %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Enviado en %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "Evento entrante %s de %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Recibido en %s" #: src/icqface.cc:3182 #, fuzzy, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "F2 para URLs, ESC cerrar" #: src/icqface.cc:3229 #, fuzzy, c-format msgid "%s from %s, received on %s" msgstr "Recibido en %s" #: src/icqface.cc:3230 #, fuzzy, c-format msgid "%s to %s, sent on %s" msgstr "Enviado en %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "Historial para %s, %d eventos en total" #: src/icqface.cc:3339 #, fuzzy, c-format msgid "%s search, %s again, %s cancel" msgstr "/ buscar, N repetir, ESC cancelar" #: src/icqface.cc:3348 msgid "search for: " msgstr "buscar por: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] sistema: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] e-mail de %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s se ha conectado, con status %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s ha cambiado su status a %s desde %s" #~ msgid " [o] Online" #~ msgstr " [o] Conectado" #~ msgid " [_] Offline" #~ msgstr " [_] Desconectado" #~ msgid " [a] Away" #~ msgstr " [a] Ausente" #~ msgid " [c] Occupied" #~ msgstr " [c] Ocupado" #~ msgid " [f] Free for chat" #~ msgstr " [f] Libre para charlar" #~ msgid " [i] Invisible" #~ msgstr " [i] Invisible" #~ msgid "+ [irc] password was requested, but it's not set" #~ msgstr "+ [irc] una contraseña fue solicitada, pero no se ha ingresado" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Confirme la contraseña : %s " #, fuzzy #~ msgid " Convert from : %s " #~ msgstr " País : %s " #, fuzzy #~ msgid " Convert to : %s " #~ msgstr " País : %s " #~ msgid "Your friendly nickname has been changed to %s" #~ msgstr "Su alias amistoso ha sido cambiado a %s" #~ msgid "already logged" #~ msgstr "ya se encuentra conectado" #~ msgid "" #~ "event sending error: the destination contact doesn't exist on your list" #~ msgstr "evento enviando error: el contacto de destino no existe en su lista" #, fuzzy #~ msgid "to URLs, " #~ msgstr "F2 para URLs, ESC cerrar" #, fuzzy #~ msgid "URLs, " #~ msgstr "URL" #, fuzzy #~ msgid " details, " #~ msgstr " Detalles " #, fuzzy #~ msgid " cancel" #~ msgstr "Cancelar" #, fuzzy #~ msgid "search, " #~ msgstr "buscar por: " #, fuzzy #~ msgid " esc cancel" #~ msgstr " Abandonar canal" #, fuzzy #~ msgid "contact menu, " #~ msgstr "contactos" #, fuzzy #~ msgid "change status, " #~ msgstr "%s ha cambiado su status a %s desde %s" #, fuzzy #~ msgid "general actions, " #~ msgstr "Opciones generales:" #~ msgid " Store contact list server-side : %s " #~ msgstr " Almacenar lista de contactos en el servidor : %s " #~ msgid " Send an URL u" #~ msgstr " Enviar una URL u" #~ msgid " Send contacts c" #~ msgstr " Enviar contactos c" #~ msgid " Edit details e" #~ msgstr " Editar detalles e" #~ msgid " List nicknames ?" #~ msgstr " Listar alias ?" #, fuzzy #~ msgid " Block channel messages i" #~ msgstr " Enviar mensaje al canal enter" #~ msgid " Send a message enter" #~ msgstr " Enviar un mensaje enter" #~ msgid " Remove user del" #~ msgstr " Eliminar usuario del" #~ msgid " Ignore user i" #~ msgstr " Ignorar usuario i" #, fuzzy #~ msgid " Remove feed del" #~ msgstr " Eliminar usuario del" #, fuzzy #~ msgid " Unset ignore feed i" #~ msgstr " Ignorar usuario i" #, fuzzy #~ msgid " Ignore feed i" #~ msgstr " Ignorar usuario i" #~ msgid " Change status s" #~ msgstr " Cambiar status s" #~ msgid " Go to contact.. alt-s" #~ msgstr " Ir al contacto.. alt-s" #~ msgid " Show offline users F5" #~ msgstr " Mostrar usuarios desconectados F5" #~ msgid " Hide offline users F5" #~ msgstr " Esconder usuarios desconectados F5" #, fuzzy #~ msgid " Russian win/koi translation for : %s" #~ msgstr " Traduccion al ruso con win1251-koi8 necesaria : %s " #, fuzzy #~ msgid " Russian win/koi translation : %s " #~ msgstr " Traduccion al ruso con win1251-koi8 necesaria : %s " #~ msgid "+ [yahoo] connecting to the server" #~ msgstr "+ [yahoo] conectándose al servidor" #~ msgid "+ [yahoo] disconnected" #~ msgstr "+ [yahoo] desconectado" #~ msgid "+ [yahoo] adding %s to the contacts" #~ msgstr "+ [yahoo] agregando %s a los contactos" #~ msgid "+ [yahoo] removing %s from the contacts" #~ msgstr "+ [yahoo] removiendo %s de los contactos" #~ msgid "+ [yahoo] logged in" #~ msgstr "+ [yahoo] conectado" #, fuzzy #~ msgid "+ [yahoo] search finished, %d found" #~ msgstr "+ [icq] búsqueda en las páginas blancas finalizada, %d resultados" #, fuzzy #~ msgid "+ [jab] connecting to the server" #~ msgstr "+ [aim] conectándose al servidor" #, fuzzy #~ msgid "+ [jab] adding %s to the contacts" #~ msgstr "+ [aim] agregando %s a los contactos" #, fuzzy #~ msgid "+ [jab] removing %s from the contacts" #~ msgstr "+ [aim] removiendo %s de los contactos" #, fuzzy #~ msgid "+ [jab] conference list fetching finished, %d found" #~ msgstr "" #~ "+ [yahoo] terminó la consulta de la lista de miembros, %d encontrados" #, fuzzy #~ msgid "+ [jab] search finished, %d found" #~ msgstr "+ [icq] búsqueda en las páginas blancas finalizada, %d resultados" #, fuzzy #~ msgid "+ [jab] logged in" #~ msgstr "+ [aim] conectado" #, fuzzy #~ msgid "+ [jab] disconnected" #~ msgstr "+ [yahoo] desconectado" #~ msgid "+ [aim] connecting to the server" #~ msgstr "+ [aim] conectándose al servidor" #~ msgid "+ [aim] removing %s from the contacts" #~ msgstr "+ [aim] removiendo %s de los contactos" #~ msgid "+ [aim] logged in" #~ msgstr "+ [aim] conectado" #, fuzzy #~ msgid "+ [aim] disconnected" #~ msgstr "+ [icq] desconectado" #~ msgid "+ [aim] password was changed successfully" #~ msgstr "+ [aim] la contraseña fue modificada satisfactoriamente" #~ msgid "+ [icq] connecting to the server" #~ msgstr "+ [icq] conectándose al servidor" #~ msgid "+ [icq] logged in" #~ msgstr "+ [icq] conectado" #~ msgid "+ [irc] connecting to the server" #~ msgstr "+ [irc] conectándose al servidor" #~ msgid "+ [irc] channel members list fetching finished, %d found" #~ msgstr "" #~ "+ [irc] terminó la consulta de la lista de miembros del canal, %d " #~ "encontrados" #~ msgid "+ [irc] logged in" #~ msgstr "+ [irc] conectado" #, fuzzy #~ msgid "+ [irc] disconnected" #~ msgstr "+ [icq] desconectado" #, fuzzy #~ msgid "+ [lj] disconnected" #~ msgstr "+ [yahoo] desconectado" #~ msgid " Synchronize contact list " #~ msgstr " Sincronizar lista de contactos " #~ msgid "You must be logged in to preform the synchronization" #~ msgstr "Debe estar conectado para realizar la sincronización" #~ msgid " Contact list synchronization " #~ msgstr " Sincronización de lista de contactos " #~ msgid "Starting the synchronization process" #~ msgstr "Iniciando el proceso de sincronización" #~ msgid "Attempt #%d" #~ msgstr "Intento #%d" #~ msgid ".. %d already synchronized, %d contacts to be stored" #~ msgstr ".. %d ya sincronizados, %d contactos a almacenarse" #~ msgid "Too many attempts, gave up" #~ msgstr "Demasiados intentos, desistió" #~ msgid " Uploading buddies " #~ msgstr " Cargando contactos " #, fuzzy #~ msgid "No contacts to be synchronized" #~ msgstr "No hay contactos a sincronizar" #~ msgid ".. all of them are already stored server-side" #~ msgstr ".. todos ellos ya están almacenados en el servidor" #~ msgid "%d contacts are do be stored server-side. Add them now?" #~ msgstr "%d contactos se almacenarán en el servidor. ¿Agregarlos ahora?" #~ msgid ".. adding %s" #~ msgstr ".. agregando %s" #~ msgid "Cancelled" #~ msgstr "Cancelado" #, fuzzy #~ msgid "Friend list" #~ msgstr "Lista de ignorados" #~ msgid "+ [msn] connecting to the server" #~ msgstr "+ [msn] conectándose al servidor" #~ msgid "+ [msn] logged in" #~ msgstr "+ [msn] conectado" #~ msgid "+ [msn] disconnected" #~ msgstr "+ [msn] desconectado" #~ msgid "+ [yahoo] %s: started typing" #~ msgstr "+ [yahoo] %s: comenzó a escribir" #~ msgid "+ [yahoo] %s: stopped typing" #~ msgstr "+ [yahoo] %s: terminó de escribir" #, fuzzy #~ msgid "+ [msn] %s: stopped typing" #~ msgstr "+ [yahoo] %s: terminó de escribir" #, fuzzy #~ msgid "+ [msn] %s: started typing" #~ msgstr "+ [yahoo] %s: comenzó a escribir" #, fuzzy #~ msgid "+ [icq] %s has requested our away message" #~ msgstr "%s solicitó nuestro mensaje de ausencia, enviada la respuesta" #~ msgid "%s requested our away message, sent the response" #~ msgstr "%s solicitó nuestro mensaje de ausencia, enviada la respuesta" #~ msgid " [all] All of them" #~ msgstr " [all] Todos ellos" #, fuzzy #~ msgid "+ [jab] incorrect jabber id" #~ msgstr "+ [yahoo] desconectado" #~ msgid " enter to select a file, esc to cancel " #~ msgstr " enter para seleccionar un archivo, esc para cancelar " #~ msgid " space to select a directory, esc to cancel " #~ msgstr " espacio para seleccionar un directorio, esc para cancelar " #~ msgid "SOCKS proxy server to use: " #~ msgstr "servidor SOCKS proxy a usar: " #~ msgid "SOCKS proxy user name: " #~ msgstr "Nombre de usuario SOCKS Proxy: " #~ msgid "SOCKS proxy password: " #~ msgstr "Contraseña SOCKS proxy: " #~ msgid "+ [msn] unable to connect to the server" #~ msgstr "+ [msn] no fue posible conectarse al servidor" #~ msgid "+ [msn] connecting with %s" #~ msgstr "+ [msn] conectándose con %s" #~ msgid " Channel manager " #~ msgstr " Administrador de canales " #~ msgid " IRC channels manager " #~ msgstr " Administrador de canales IRC " #~ msgid "Password" #~ msgstr "Contraseña" #~ msgid "Show" #~ msgstr "Mostrar" #~ msgid " Channels " #~ msgstr " Canales " #~ msgid "shown" #~ msgstr "mostrado" #~ msgid "hidden" #~ msgstr "oculto" #~ msgid "channel name to add: " #~ msgstr "nombre del canal a agregar: " #~ msgid "+ [aim] disconnected from the network" #~ msgstr "+ [aim] desconectado de la red" #~ msgid "+ [irc] disconnected from the network" #~ msgstr "+ [irc] desconectado de la red" #~ msgid "Show on the list" #~ msgstr "Mostrar en la lista" #~ msgid " Sound and colors " #~ msgstr " Sonido y colores " #~ msgid "Notify the user he/she has been added?" #~ msgstr "¿Notificar al usuario que él/ella ha sido agregado(a)?" #~ msgid "+ the notification has been sent to %lu" #~ msgstr "+ la notificación ha sido enviada a %lu" #~ msgid "+ initializing %s engine" #~ msgstr "+ inicializando motor %s" #~ msgid "+ [yahoo] unable to connect to the server" #~ msgstr "+ [yahoo] no fue posible conectarse al servidor" #~ msgid "+ [yahoo] disconnected from the network" #~ msgstr "+ [yahoo] desconectado de la red" #~ msgid "* %s" #~ msgstr "* %s" #~ msgid " IRC channels (join/leave) " #~ msgstr " Canales IRC (unirse/abandonar) " centerim-4.22.10/po/ChangeLog0000644000175000001440000000334411461606612012602 000000000000002006-12-22 gettextize * Makefile.in.in: New file, from gettext-0.16.1. * boldquot.sed: New file, from gettext-0.16.1. * en@boldquot.header: New file, from gettext-0.16.1. * en@quot.header: New file, from gettext-0.16.1. * insert-header.sin: New file, from gettext-0.16.1. * quot.sed: New file, from gettext-0.16.1. * remove-potcdate.sin: New file, from gettext-0.16.1. * Rules-quot: New file, from gettext-0.16.1. 2004-06-02 gettextize * Makefile.in.in: Upgrade to gettext-0.12.1. 2003-10-01 gettextize * Makefile.in.in: New file, from gettext-0.11.4. * boldquot.sed: New file, from gettext-0.11.4. * en@boldquot.header: New file, from gettext-0.11.4. * en@quot.header: New file, from gettext-0.11.4. * insert-header.sin: New file, from gettext-0.11.4. * quot.sed: New file, from gettext-0.11.4. * remove-potcdate.sin: New file, from gettext-0.11.4. * Rules-quot: New file, from gettext-0.11.4. 2003-04-05 gettextize * Makefile.in.in: Upgrade to gettext-0.11.1. * boldquot.sed: New file, from gettext-0.11.1. * en@boldquot.header: New file, from gettext-0.11.1. * en@quot.header: New file, from gettext-0.11.1. * insert-header.sin: New file, from gettext-0.11.1. * quot.sed: New file, from gettext-0.11.1. * remove-potcdate.sin: New file, from gettext-0.11.1. * Rules-quot: New file, from gettext-0.11.1. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. 2002-06-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. 2001-10-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. centerim-4.22.10/po/ru.po0000644000175000001440000026156111473011457012025 00000000000000# Russian messages for centerim. # Copyright (C) 2001 Free Software Foundation, Inc. # Konstantin Klyagin , 2001. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.20.0\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2004-02-08 01:22+0300\n" "Last-Translator: Konstantin Klyagin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "пароль: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "%s текущий контакт, %s Ñменить ÑтатуÑ, %s главное меню, %s выход" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Игнорировать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ %s?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "Удалить %s из ÑпиÑка контактов?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить %s?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Ðовый ник Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° в ÑпиÑке: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Выберите новую группу Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ невозможно запроÑить away-Ñообщение, будучи в offline" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! Ñвободного меÑта на диÑке оÑталоÑÑŒ < 10k, раÑÑоединение" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "away-Ñообщение" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! поддержка %s была выключена при Ñборке" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ получена Ð½Ð¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°, %d Ñообщений" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] получена Ð½Ð¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°, %d Ñообщений" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ поÑледнее Ñообщение от %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ %s изменена, перечитываем" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! обнаружена Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÑŽÑ‰Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ centerim" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! Ñто может вызвать проблемы. pid %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Ðомер мобильного телефона: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»(ов): " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "Ðе хватает прав на запиÑÑŒ Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð³Ð¾ каталога" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "Указанный каталог не ÑущеÑтвует" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ %s пуÑта" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ %s уже еÑть в ÑпиÑке" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Выберите группу Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s добавлен в ÑпиÑок" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ пользователь вернулÑÑ" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ð¾ÑÑтановлен" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] автоматичеÑкий переход в %s" #: src/centerim.cc:1490 msgid "away" msgstr "" #: src/centerim.cc:1490 msgid "n/a" msgstr "" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! Ñвободного меÑта на диÑке оÑталоÑÑŒ < 10k, раÑÑоединение" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! иначе мы можем терÑть ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¸ глючить" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "ПриглаÑить на конференцию.." #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "Выберите контакты Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "ПеремеÑтить выбранные контакты.." #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "ошибка ÑоединениÑ" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "неправильный XML" #: src/hooks/rsshook.cc:353 #, fuzzy msgid "no or tag found" msgstr "Ñ‚Ñг не найден" #: src/hooks/rsshook.cc:362 #, fuzzy msgid "no or tag found" msgstr "Ñ‚Ñг не найден" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "неправильный Ñ‚Ñг " #: src/hooks/rsshook.cc:380 msgid "success" msgstr "уÑпешно" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "Заголовок: " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "Опубликовано: " #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "КатегориÑ: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "Ðвтор: " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "ОпиÑание: " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "СÑылка: " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "Комментарии: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "невозможно определить IP хоÑта" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "невозможно Ñоздать Ñокет" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "проверьте Ð¸Ð¼Ñ Ñ…Ð¾Ñта и порт" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] выход Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð¸ %s" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "" #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "ПользовательÑкое ÑтатуÑ-Ñообщение:" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] невозможно запроÑить away-Ñообщение у %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: неправильный логин/пароль" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: неправильный логин/пароль" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: аккаунт заблокирован" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ чтобы реактивировать его, поÑетите %s" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] кто-то еще вошел под Ñтим ником" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] Ñервер закрыл Ñоединение" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "Пользователь %s приглаÑил Ð²Ð°Ñ Ð² конференцию %s, тема: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "УчаÑтники конференции: " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Ðвто-вход в конференцию ÑоÑтоÑлÑÑ" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "Пользователь %s ответил отказом на приглашение к конференции" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "Пользователь %s вошел в конференцию" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "Пользователь %s покинул конференцию" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "Пользователь добавил Ð²Ð°Ñ Ð² Ñвой ÑпиÑок контактов" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "Ñообщение:" #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] e-mail от %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] ÑиÑтема: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] ошибка: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] ошибка: %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] прÑмое Ñоединение не удалоÑÑŒ" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] ошибка: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] ошибка: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] невозможно ÑоединитьÑÑ: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] ошибка: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð´ÐµÐ½ÑŒ рождениÑ" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] невозможно ÑоединитьÑÑ Ñ Ñервером" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] отказываемÑÑ Ð¾Ñ‚ агента %s" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Away Ñообщение:" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] нет away-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñƒ %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "Ðеверный пÑевдоним, невозможно зарегиÑтрировать" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "Ðевозможно ÑоединитьÑÑ" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr ".. а мы пользуемÑÑ %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "Стандартный Jabber Ñервер конференций" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, c-format msgid "+ [jab] error %d" msgstr "+ [jab] ошибка %d" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] ошибка %d: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "Пользователь хочет получать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑтатуÑа в Ñети" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" "Пользователь удалил Ð²Ð°Ñ Ð¸Ð· ÑпиÑка контактов. ВыражаÑÑÑŒ Ñзыком Джаббера, " "\"отпиÑалÑÑ\" от ваÑ" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] невозможно ÑоединитьÑÑ Ñ Ñервером" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "" "Мне дейÑтвительно нравитÑÑ AIM profile, который centerim %s уÑтанавливает по " "умолчанию." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "aim не удалоÑÑŒ ÑоединитьÑÑ" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] не удалоÑÑŒ ÑоединитьÑÑ: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "У Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½ÐµÑ‚ профайл-информации." #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] пароль выÑлан" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "по запроÑу" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "коммуникационные проблемы" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "неправильное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "Ñлишком чаÑтые попытки" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "неправильный пароль" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "неÑовпадение имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролÑ" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "двойной вход" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] cannot connect" msgstr "+ [icq] ошибка ÑоединениÑ" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] раÑÑоединение" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "причина раÑÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ icq" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "Пользователь подтвердил Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° добавление в ÑпиÑок контактов" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "" "Пользователь отклонил Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° добавление в ÑпиÑок контактов; объÑÑнение: " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] невозможно отоÑлать SMS к %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] невозможно отоÑлать SMS к %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] невозможно запроÑить away-Ñообщение у %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Пользователь из random chat" #: src/hooks/gaduhook.cc:161 msgid "+ [gg] connection failed" msgstr "+ [gg] Ñоединение не удалоÑÑŒ" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [gg] не удалоÑÑŒ найти %s" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "+ [gg] Ñоединение Ñ Ñервером не удалоÑÑŒ" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "+ [gg] Ñоединение прервано" #: src/hooks/gaduhook.cc:404 #, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [gg] нет away-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñƒ %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] невозможно ÑоединитьÑÑ Ñ Ñервером" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] не удалоÑÑŒ ÑоединитьÑÑ: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] никнейм изменен уÑпешно" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Ðа каналах: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Выброшен Ñ ÐºÐ°Ð½Ð°Ð»Ð° оператором %s; причина: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "Пользователь поменÑл Ñвой ник Ñ %s на %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] пароль выÑлан" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] пароль выÑлан" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "Ответ на PING от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ‹Ð» получен за %d Ñекунд" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s вошел." #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s вышел." #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "причина: %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s был выброшен командой от %s." #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "УÑтановлена тема канала: %s " #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "автор - %s" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s назначен оператором по инициативе %s." #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s больше не оператор канала, %s ÑнÑл флаг." #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s уÑтановил нам ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°." #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "вы - оператор на Ñтом канале" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s ÑнÑл Ñ Ð½Ð°Ñ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] поиÑк завершен" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "невозможно ÑоединитьÑÑ" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] ошибка HTTP: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "Сообщение от Ñервера: " #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] не удалоÑÑŒ ÑоединитьÑÑ: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] отправлено удачно, id = %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] ошибка отправки: %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Пользователь %s (%s) добавил Ð²Ð°Ñ Ð² Ñвой ÑпиÑок друзей\n" "\n" "ÐÐ´Ñ€ÐµÑ ÐµÐ³Ð¾ журнала: %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Пользователь %s удалил Ð²Ð°Ñ Ð¸Ð· Ñвоего ÑпиÑка друзей\n" "\n" "ÐÐ´Ñ€ÐµÑ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð°: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка друзей" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] удаление из ÑпиÑка друзей прошло уÑпешно" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] добавление в ÑпиÑок друзей не удалоÑÑŒ" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s добавлен в ÑпиÑок друзей" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] чтение ÑпиÑка завершено, %d найдено" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "+ [msn] Ð½ÐµÑ‡Ð¸Ñ‚Ð°Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°: %d в inbox, %d в фолдерах" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] e-mail от %s, %s" #: src/hooks/msnhook.cc:905 msgid "+ [msn] cannot connect: " msgstr "+ [msn] невозможно ÑоединитьÑÑ: " #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "проверьте Ð¸Ð¼Ñ Ñ…Ð¾Ñта и порт" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "Ñоединение Ñ Ñервером" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "вход в ÑиÑтему ÑоÑтоÑлÑÑ" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "поиÑк завершен, %d найдено" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "пароль был изменен уÑпешно" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "раÑÑоединение" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "добавление %s в ÑпиÑок" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "удаление %s из ÑпиÑка" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "вывод ÑпиÑка завершен, %d найдено" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð´ÐµÐ½ÑŒ рождениÑ" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Янв" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Фев" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Мар" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Ðпр" #: src/icqcontact.cc:854 msgid "May" msgstr "Май" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Июн" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Июл" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Ðвг" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Сен" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Окт" #: src/icqcontact.cc:855 msgid "Nov" msgstr "ÐоÑ" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Дек" #: src/icqgroups.cc:66 msgid "General" msgstr "Свалка" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Ñообщение от %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60 и больше" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "неизвеÑтный тип IM Ñети" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Общий треп" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Романтика" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Игры" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Студенты" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "20-летние" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "30-летние" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "40-летние" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50 и больше" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "Ищущие женщины" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Ищущие мужчины" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "ИмÑ" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Профили поиÑка " #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Удалить" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Загрузить" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ вы должны войти в Ñеть прежде чем добавить кого-либо" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "Загрузить" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "Сохранить" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "ОчиÑтить" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Изменить" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "ПоиÑк" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "Зайти/Создать" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "Добавить" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " ПоиÑк/добавление контактов " #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " ПриÑоединитьÑÑ Ð¸Ð»Ð¸ Ñоздать конференцию " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " Добавить RSS подпиÑку " #: src/icqdialogs.cc:299 msgid " Network " msgstr " Сеть " #: src/icqdialogs.cc:307 msgid " UIN " msgstr "" #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Инфо " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Короткое Ð¸Ð¼Ñ (ник) : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Ð˜Ð¼Ñ : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " ВозраÑÑ‚ : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Пол : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Язык : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " МеÑтонахождение " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Город : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " ОблаÑть/штат/Ð¿Ñ€Ð¾Ð²Ð¸Ð½Ñ†Ð¸Ñ : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Страна : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Работа " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Отдел : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " ДолжноÑть : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Только на линии " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Группа random-чата " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Ключевые Ñлова " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Ðик " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " Служба поиÑка " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Параметры поиÑка " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " Параметры подпиÑки " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " ÐÐ´Ñ€ÐµÑ XML ÑкÑпорта : %s " #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " ЧаÑтота проверки (минуты) : %lu " #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Канал : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Ð˜Ð¼Ñ : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " Только вошедшие поÑле поÑледней проверки " #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " Ключевые Ñлова : %s " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " Опции " #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " Только Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñми : %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " Только на линии : %s " #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Показать тех, у кого в ÑпиÑке еÑть наш контакт " #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Ðазвание " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Пароль " #: src/icqdialogs.cc:443 msgid " Service " msgstr " Служба " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Ðазвание Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ поиÑка: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "ПоиÑк Ñ Ñ‚Ð°ÐºÐ¸Ð¼ имененм уже ÑущеÑтвует. ПерезапиÑать?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Ðик: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Ðазвание" #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-Mail: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "ИмÑ: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "ФамилиÑ: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Город: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "ОблаÑть/штат/провинциÑ: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "КомпаниÑ: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Отдел: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "ДолжноÑть: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Канал: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "ИмÑ: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Ключевые Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Пароль: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "" #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "ЧаÑтота проверки: " #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "Ðеправильный Jabber ID!" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Общие " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " Служба региÑтрации " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Параметры региÑтрации " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " Сменить пароль : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr "" #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Дата Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " ВозраÑÑ‚ : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Дом " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " ÐÐ´Ñ€ÐµÑ : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Ð˜Ð½Ð´ÐµÐºÑ : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Телефон : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Ð¤Ð°ÐºÑ : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Мобильный телефон : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Страничка : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Дополнительно " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1й Ñзык : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2й Ñзык : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3й Ñзык : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Прочее " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Включить web ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Группа random-чата : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Ðеобходима Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " ОблаÑть/штат/Ð¿Ñ€Ð¾Ð²Ð¸Ð½Ñ†Ð¸Ñ : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " О Ñебе " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Запрашиваем перÑональные детали.." #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Ваша %s Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: детали " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Готово" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Подождите минуточку. Ваша Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐµÑ‰Ðµ не получена" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "" #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Дата Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ (DD-MM-YYYY): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "ВозраÑÑ‚" #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "ÐдреÑ: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "ИндекÑ: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Телефон: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "ФакÑ: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Мобильный телефон: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Страничка: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "О Ñебе" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "Ðовый пароль: " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "Пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸: " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "нет" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X Ñохранить, Esc отмена] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " ПоÑылка файла(ов) %s, %lu" #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Добавить" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Комментарий" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "ПоÑлать" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Файлы " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Комментарий " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "комментарий: " #: src/icqdialogs.cc:1163 msgid "None" msgstr "Ðет" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "РуÑÑкий" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "ПольÑкий" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " ÐаÑтройки centerim " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Звуковое уÑтройÑтво : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñхема : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr " ЗапроÑить авторизацию" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " Канал : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Поддержка групп контактов : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Поддержка двунаправленных Ñзыков : %s " #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Кнопки а-Ð»Ñ emacs в редакторе : %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " Кнопки а-Ð»Ñ emacs в редакторе : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr " Перекодировка Ñообщений " #: src/icqdialogs.cc:1241 #, c-format msgid " Switch to language preset : %s " msgstr " УÑтановить автоматичеÑки Ð´Ð»Ñ : %s " #: src/icqdialogs.cc:1242 #, c-format msgid " Remote charset : %s " msgstr " Ð£Ð´Ð°Ð»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° : %s " #: src/icqdialogs.cc:1243 #, c-format msgid " Local charset : %s " msgstr " Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° : %s " #: src/icqdialogs.cc:1246 #, c-format msgid " For protocols : %s" msgstr " Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¾Ð² : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr "СпиÑок контактов " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Поддержка групп контактов : %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Поддержка групп контактов : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Ðе показывать тех, кто не на линии (offline) : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Ðе принимать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ юзеров, что не в ÑпиÑке : %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Ðеобходима Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Цитировать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ ответе : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " ПроверÑть локальный почтовый Ñщик : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Помнить пароли : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Редактировать away ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ переключении ÑтатуÑа : %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Чат-режим при общении Ð´Ð»Ñ : %s " #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " ОтÑылка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ нажатию Enter Ð´Ð»Ñ : %s " #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Чат-режим при общении : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " ОтÑылка Ñообщений по нажатию Enter : %s " #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr " Контакты вÑегда онлайн Ð´Ð»Ñ Ð½Ðµ-IM Ñетей : %s" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " Поддержка групп контактов : %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " СвÑзь " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " SMTP Ñервер : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " HTTP прокÑи-Ñервер : %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " HTTP прокÑи-Ñервер : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr " ИÑпользовать прокÑи только Ð´Ð»Ñ HTTP (rss и lj) : %s " #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " ПрÑмые ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ клиентами : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " Диапазон портов Ð´Ð»Ñ Ð¿Ñ€Ñмых Ñоединений : %s " #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " Журнал " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " Ð’Ñ€ÐµÐ¼Ñ Ñобытий в окошке лога : %s " #: src/icqdialogs.cc:1301 #, fuzzy, c-format msgid " Timestamps include seconds : %s " msgstr " Ð’Ñ€ÐµÐ¼Ñ Ñобытий в окошке лога : %s " #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " Входы-выходы пользователей в логе : %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Подробный журнал в ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " ÐвтоматичеÑки Away поÑле (мин) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " ÐвтоматичеÑки N/A поÑле (мин) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " ÐвтоматичеÑки N/A поÑле (мин) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " ÐÐ´Ñ€ÐµÑ : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr " Ðвто-away поÑле (0 - выкл): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr " Ðвто-N/A поÑле (0 - выкл): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "Ð˜Ð¼Ñ SMTP Ñервера: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "Диапазон портов Ð´Ð»Ñ Ð¿Ñ€Ñмых Ñоединений (мин-макÑ): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "Ð˜Ð¼Ñ HTTP прокÑи-Ñервера: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "ÐšÐ¾Ð´Ð¾Ð²Ð°Ñ Ñтраница, из которой конвертировать: " #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "ÐšÐ¾Ð´Ð¾Ð²Ð°Ñ Ñтраница, в которую конвертировать: " #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "Ð˜Ð¼Ñ HTTP прокÑи-Ñервера: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "ПуÑтое Ñообщение в запроÑе на авторизацию" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Ваша Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð° уÑпешно" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Управление группами контактов" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Изменить" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "Удалить" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "Вверх" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "Вниз" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Выбрать" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Группы " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Ðазвание Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ группы: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Ðовое Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить группу?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Монитор передачи файлов" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Отменить" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " Прием от %s " #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " ПоÑылка %s " #: src/icqdialogs.cc:1865 msgid "init" msgstr "ÑвÑзь" #: src/icqdialogs.cc:1866 msgid "start" msgstr "начало" #: src/icqdialogs.cc:1867 msgid "work" msgstr "прогреÑÑ" #: src/icqdialogs.cc:1868 msgid "done" msgstr "готов" #: src/icqdialogs.cc:1869 msgid "err" msgstr "ошибка" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "отменен" #: src/icqdialogs.cc:1877 msgid " of " msgstr " из " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "Ðевозможно удалить передачу, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÐµÑ‰Ðµ не закончилаÑÑŒ" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "Ð´Ð»Ñ Ð²Ñех" #: src/icqdialogs.cc:2023 msgid "private" msgstr "личное" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "только Ð´Ð»Ñ Ð´Ñ€ÑƒÐ·ÐµÐ¹" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr " Помещение запиÑи в журнал: аттрибуты " #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "Определить музыку" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "Отправить" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Отменить" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " ПомеÑтить в журнал : %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " Тема : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " Права доÑтупа : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " Ð’ÑÑÐºÐ°Ñ ÐºÑ€Ð°Ñота " #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " ÐаÑтроение : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(нет/Ñвой)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " Свой вариант наÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ : %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " Музыка : %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " Картинка : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(по умолчанию)" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " ВозраÑÑ‚ : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " Отключить автоформатирование : %s " #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " Отключить прием комментарием по e-mail : %s " #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " Отключить комментарии : %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " ПомеÑтить задним чиÑлом : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "Тема запиÑи: " #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "Играет в данный момент: " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "Текущее наÑтроение: " #: src/icqdialogs.cc:2094 #, fuzzy msgid "Tags for the entry: " msgstr "Сообщение от Ñервера: " #: src/icqdialogs.cc:2128 msgid "pgp key quick search" msgstr "быÑтрый поиÑк pgp-ключа" #: src/icqdialogs.cc:2130 #, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "" "БыÑтрый поиÑк PGP ключа: набирайте Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка, %s повторить, Enter завершить" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr " Выберите PGP ключ " #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr " Ðе иÑпользовать ключ" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "выбор pgp ключа" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "Выбор PGP ключа: %s Ð´Ð»Ñ Ð±Ñ‹Ñтрого поиÑка" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "запущена внешнÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° %s, код возврата = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "запущен внешний обработчик %s, код возврата = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Ðа линии" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "ÐевидимоÑть" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Ðе прочь поболтать" #: src/imcontact.cc:114 msgid "Do not disturb" msgstr "Ðе беÑпокоить" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "ЗанÑÑ‚" #: src/imcontact.cc:116 msgid "Not available" msgstr "ÐедоÑтупен" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "ОтÑутÑтвие" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "" #: src/imlogger.cc:39 msgid "N/A" msgstr "" #: src/imlogger.cc:49 msgid "message" msgstr "Ñообщение" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "" #: src/imlogger.cc:51 msgid "SMS" msgstr "" #: src/imlogger.cc:52 msgid "authorization" msgstr "авторизациÑ" #: src/imlogger.cc:53 msgid "e-mail" msgstr "" #: src/imlogger.cc:54 msgid "notification" msgstr "извещение" #: src/imlogger.cc:55 msgid "contacts" msgstr "контакты" #: src/imlogger.cc:56 msgid "files" msgstr "файлы" #: src/imlogger.cc:57 msgid "event" msgstr "Ñобытие" #: src/imlogger.cc:79 msgid "events log started" msgstr "журналирование начато" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "иÑходÑщее %s к %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "входÑщее %s от %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "проигнорировано" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s ушел" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "%s к %s, поÑлано %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: вышли в онлайн, Ñо ÑтатуÑом %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: ушли в оффлайн" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "поменÑли Ñвой %s ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° %s Ñ %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " Менеджер логинов " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Сервер : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " Защищенное Ñоединение : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Логин : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Пароль (не обÑзательно) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Пароль : %s " #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr " Приоритет : %s " #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr " Добавить друзей в контакт-лиÑÑ‚ : %s " #: src/accountmanager.cc:134 #, c-format msgid " NickServ password (optional) : %s " msgstr " Пароль NickServ (не обÑзательно) : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " Поддержка групп контактов : %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Поддержка групп контактов : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ " #: src/accountmanager.cc:155 #, c-format msgid " OpenPGP key: %s " msgstr " OpenPGP ключ : %s " #: src/accountmanager.cc:160 #, c-format msgid " Key passphrase: %s " msgstr " ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° : %s " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " Сменить friendly nickname " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Обновить Ñвою информацию " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " УÑтановить away-Ñообщение " #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Удалить " #: src/accountmanager.cc:200 msgid " user name: " msgstr " логин: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " номер: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " пароль: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Сначала удалите информацию о логине!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Сначала вы должны произвеÑти раÑÑоединение!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " Ñервер : " #: src/accountmanager.cc:285 msgid " priority: " msgstr " приоритет: " #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° Ð´Ð»Ñ PGP: " #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð² Ñети %s " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Поехали" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Пароль : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " ИÑпользовать Ñервер : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Контроль введенного паролÑ: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "УÑтановить ник: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Сервер: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Пароли не Ñовпадают" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Пароль должен быть указан" #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "Пароль должен быть как минимум 6 Ñимволов длиной" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Соединение Ñ Ñервером %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "ПоÑылка запроÑа" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ¸ иÑтекло. Повторить?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "ПовторÑем.." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Получен новый UIN, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "РаÑÑоединение" #: src/imcontroller.cc:179 msgid "Unable to connect to icq server. Retry?" msgstr "Ðевозможно ÑоединитьÑÑ Ñ Ñервером. Повторить попытку?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "Попытка зарегиÑтрировать %s на %s ..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Jabber ID прошла уÑпешно" #: src/imcontroller.cc:228 msgid "Failed" msgstr "Ðеудача" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Ð’Ñ‹ должны быть в он-лайн чтобы иметь возможноÑть обновлÑть информацию" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "новый MSN friendly nick: " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "Ð’Ñ‹ должны быть в он-лайн чтобы иметь возможноÑть Ñменить ник" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "Ð’Ñ‹ должны быть в он-лайн чтобы иметь возможноÑть обновлÑть информацию" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "Ð’Ñ‹ должны быть в он-лайн чтобы иметь возможноÑть обновлÑть информацию" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "" "Мне дейÑтвительно нравитÑÑ Ñообщение Ð´Ð»Ñ %s, которое centerim %s %s " "уÑтанавливает по умолчанию." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ команда %s запущена" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "ошибка отÑылки ÑобытиÑ: недоÑтаточно параметров" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "" "ошибка отÑылки ÑобытиÑ: Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð³Ð¾ протокола разрешены только номера " "(UIN)" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "ошибка отÑылки ÑобытиÑ: неизвеÑÑ‚Ð½Ð°Ñ IM Ñеть" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "ошибка отÑылки ÑобытиÑ: неизвеÑтный тип ÑобытиÑ" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "очередь пополнилаÑÑŒ на %s к %s" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "ошибка отÑылки ÑобытиÑ: невозможно Ñоздать каталог" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ð±ÑƒÐºÐ²Ð° Ð´Ð»Ñ ÑтатуÑа была задана" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "неизвеÑтный тип IM Ñети" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "ошибка Ñмены ÑтатуÑа: " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "ИÑпользование: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "ОÑновные опции:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " --ascii, -a иÑпользовать ASCII Ñимволы Ð´Ð»Ñ Ð¾ÐºÐ¾ÑˆÐµÐº и рамок" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b <путь> задать другую базовую директорию" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B IP Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ñщих Ñоединений" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr " --no-xtitles, -T не менÑть заголовок окна xterm" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" " --offline, -o уÑтановить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñех протоколов в offline при " "Ñтарте" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr " --debug, -d включить запиÑÑŒ отладочной информации" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help показать Ñтот Ñкран" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v показать верÑию программы" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Опции Ð´Ð»Ñ Ð¿Ð¾Ñылки Ñообщений:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr " -s, --send <тип> тип ÑообщениÑ; может быть msg, sms или url" #: src/icqconf.cc:1694 #, fuzzy msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr " -S, --status <ÑтатуÑ> Ñменить текущий ÑÑ‚Ð°Ñ‚ÑƒÑ Ð² одой из IM Ñетей" #: src/icqconf.cc:1695 #, fuzzy msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto <протокол> тип протокола; может быть icq, yahoo, aim, irc, " "jabber или lj" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" " -t, --to <назначение> UIN или nickname Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ (завиÑит от протокола)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr " -n, --number <тел.ном.> мобильный номер Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ (только Ð´Ð»Ñ sms)" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках приÑылать на http://bugzilla.centerim.org." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "ПуÑтое Ñообщение в запроÑе на авторизацию" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ð¸ : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "" #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Контакты : " #: src/imevents.cc:522 msgid "" msgstr "<нет ника>" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* Передача файлов" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° необходима Ð´Ð»Ñ PGP: " #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° Ð´Ð»Ñ PGP" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "Ошибка PGP-подпиÑи: " #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "Ошибка PGP-шифрованиÑ: " #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "не найден" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Инфо" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " Менеджер логинов " #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¾Ð² : %s " #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " логин: " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "да" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "нет" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "да" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Логины.." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " Ð’Ñе протоколы " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "ИÑпользование: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " Ð’Ñе протоколы " #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Логины.." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "да" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "ÐоÑ" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " Служба " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 #, fuzzy msgid "No Jabber" msgstr "Ðеправильный Jabber ID!" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "неизвеÑтный тип IM Ñети" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "МужÑкой" #: src/icqface.cc:53 msgid "Female" msgstr "ЖенÑкий" #: src/icqface.cc:56 msgid "Not specified" msgstr "Ðе указан" #: src/icqface.cc:61 msgid "Ok" msgstr "Ок" #: src/icqface.cc:62 msgid "Next" msgstr "След" #: src/icqface.cc:63 msgid "Fwd" msgstr "ПереÑлать" #: src/icqface.cc:64 msgid "Reply" msgstr "Ответ" #: src/icqface.cc:65 msgid "Open" msgstr "Открыть" #: src/icqface.cc:66 msgid "Accept" msgstr "Подтвердить" #: src/icqface.cc:67 msgid "Reject" msgstr "Отказать" #: src/icqface.cc:68 msgid "User info" msgstr "Инфо" #: src/icqface.cc:70 msgid "Prev" msgstr "Пред" #: src/icqface.cc:78 msgid "sound card" msgstr "зв. карта" #: src/icqface.cc:79 msgid "speaker" msgstr "динамик" #: src/icqface.cc:80 msgid "disable" msgstr "без звука" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "не менÑть" #: src/icqface.cc:88 msgid "dark" msgstr "темнаÑ" #: src/icqface.cc:89 msgid "blue" msgstr "ÑинÑÑ" #: src/icqface.cc:97 #, fuzzy msgid "protocol" msgstr " Ð’Ñе протоколы " #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "начало" #: src/icqface.cc:118 msgid "mode 1" msgstr "режим 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "режим 2" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "" #: src/icqface.cc:274 msgid "Send an URL" msgstr "ПоÑлать ÑÑылку" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " ПоÑлать SMS " #: src/icqface.cc:276 msgid "Send contacts" msgstr "ПоÑлать контакты" #: src/icqface.cc:277 msgid " Request authorization" msgstr " ЗапроÑить авторизацию" #: src/icqface.cc:278 msgid "Edit details" msgstr "Редакт. инфо" #: src/icqface.cc:279 msgid "Fetch away message" msgstr "Читать away-Ñообщение" #: src/icqface.cc:280 msgid "Add to list" msgstr "Добавить в ÑпиÑок" #: src/icqface.cc:281 msgid "Rename contact" msgstr "Переименовать контакт" #: src/icqface.cc:282 msgid " Move to group.." msgstr " ПеремеÑтить в группу.." #: src/icqface.cc:283 msgid " Ping" msgstr "" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "ЗапроÑить верÑию" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " ПоÑлать файл(Ñ‹)" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " ПриглаÑить на конференцию.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " ПоÑлать чат-Ñообщение enter" #: src/icqface.cc:294 msgid "Channel chat history" msgstr "Ðрхив чата на канале" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Удалить канал del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Войти на канал" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Покинуть канал" #: src/icqface.cc:298 msgid "List nicknames" msgstr "СпиÑок учаÑтников" #: src/icqface.cc:301 msgid "UnBlock channel messages" msgstr "Разблокировать канал" #: src/icqface.cc:303 msgid "Block channel messages" msgstr "Блокировать канал" #: src/icqface.cc:310 msgid "Send a message" msgstr "ПоÑлать Ñообщение" #: src/icqface.cc:312 msgid "Event history" msgstr "Ðрхив Ñообщений" #: src/icqface.cc:313 msgid "Remove user" msgstr "Удалить" #: src/icqface.cc:314 msgid "User's details" msgstr "ИнформациÑ" #: src/icqface.cc:315 msgid "External actions.." msgstr "Внешние программы.." #: src/icqface.cc:318 msgid "Unset ignore user" msgstr "Разблокировать контакт" #: src/icqface.cc:318 msgid "Ignore user" msgstr "Игнорировать" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr " Задать PGP ключ.." #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr " СброÑить PGP ключ" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr " УÑтановить PGP-шифрование %s" #: src/icqface.cc:328 msgid "Force check" msgstr "Проверить ÑейчаÑ" #: src/icqface.cc:435 msgid "Change status" msgstr "Сменить ÑтатуÑ" #: src/icqface.cc:436 msgid "Go to contact.." msgstr "Перейти к контакту.." #: src/icqface.cc:437 msgid " Accounts.." msgstr " Логины.." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " ÐаÑтройки" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Монитор переÑылки файлов " #: src/icqface.cc:444 msgid " Find/add users" msgstr " ПоиÑк пользователей" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " ПриÑоединитьÑÑ Ðº конференции" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " Добавить RSS подпиÑку" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Игнор. ÑпиÑок" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " СпиÑок invisible-контактов" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " СпиÑок visible-контактов" #: src/icqface.cc:455 msgid "Show offline users" msgstr "Показывать offline-пользователей" #: src/icqface.cc:457 msgid "Hide offline users" msgstr "Скрыть offline-пользователей" #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " Управление группами контактов" #: src/icqface.cc:461 msgid " Mass group move.." msgstr " МаÑÑовое перемещение.." #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Инфо" #: src/icqface.cc:905 msgid "Message" msgstr "Сообщение" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Ðовый поиÑк" #: src/icqface.cc:924 msgid "Contact to add" msgstr "Контакты Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "ПоиÑк контактов.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Результаты поиÑка [завершен]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Ðик" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "Это ваш логин на LiveJournal. Его можно иÑпользовать" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… запиÑей в ваш журнал." #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "Следующие пользователи добавили Ð²Ð°Ñ Ð² ÑпиÑки Ñвоих друзей: " #: src/icqface.cc:1112 msgid "found" msgstr "найден" #: src/icqface.cc:1114 msgid "used" msgstr "иÑпользуетÑÑ" #: src/icqface.cc:1114 msgid "not used" msgstr "не иÑпольз." #: src/icqface.cc:1116 msgid "not found" msgstr "не найден" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2-й e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Стар e-mail" #: src/icqface.cc:1134 msgid "Gender" msgstr "Пол" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Дата рожд" #: src/icqface.cc:1136 msgid "Age" msgstr "ВозраÑÑ‚" #: src/icqface.cc:1137 msgid "Languages" msgstr "Языки" #: src/icqface.cc:1138 msgid "Last IP" msgstr "IP-адреÑ" #: src/icqface.cc:1161 msgid "Last seen" msgstr "ПоÑвление" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Ðикогда" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "дней" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "чаÑов" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "мин" #: src/icqface.cc:1189 msgid "seconds" msgstr "Ñекунд" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "файлы" #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "ПоÑлать контакты" #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "авторизациÑ" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "ÐдреÑ" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "МеÑто" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "ИндекÑ" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Телефон" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "ФакÑ" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Мобильный" #: src/icqface.cc:1259 msgid "Timezone" msgstr "ВремÑ" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Страничка" #: src/icqface.cc:1300 msgid "Company" msgstr "КомпаниÑ" #: src/icqface.cc:1301 msgid "Department" msgstr "Отдел" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "ДолжноÑть" #: src/icqface.cc:1346 msgid "Interests" msgstr "ИнтереÑÑ‹" #: src/icqface.cc:1358 msgid "Background" msgstr "Прошлый опыт" #: src/icqface.cc:1376 msgid "Handle" msgstr "Ðазвание" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "" #: src/icqface.cc:1378 msgid "Version" msgstr "ВерÑиÑ" #: src/icqface.cc:1379 msgid "Encoding" msgstr "Кодировка" #: src/icqface.cc:1382 msgid "Link" msgstr "СÑылка" #: src/icqface.cc:1384 msgid "Frequency" msgstr "ЧаÑтота" #: src/icqface.cc:1385 msgid "Last check" msgstr "ПредыдущаÑ" #: src/icqface.cc:1386 msgid "Next check" msgstr "СледующаÑ" #: src/icqface.cc:1387 msgid "Last result" msgstr "Результат" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu минут" #: src/icqface.cc:1404 msgid "Now" msgstr "СейчаÑ" #: src/icqface.cc:1423 msgid "Full name" msgstr "Полное имÑ" #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "%s показать ÑÑылки, %s внешние программы, %s закрыть" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ %s" #: src/icqface.cc:1456 msgid "Check" msgstr "Проверить" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Редакт" #: src/icqface.cc:1456 msgid "LJ" msgstr "" #: src/icqface.cc:1460 msgid "Retreive" msgstr "Обновить" #: src/icqface.cc:1466 msgid "Friend of" msgstr "Ð’ друзьÑÑ… у" #: src/icqface.cc:1472 msgid "Home" msgstr "Дом" #: src/icqface.cc:1472 msgid "Work" msgstr "Работа" #: src/icqface.cc:1472 msgid "More" msgstr "Дополн" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Обновить" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] Сеть ICQ " #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr "" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr "" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr "" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr "" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr "" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr "" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr " Ð’Ñе протоколы " #: src/icqface.cc:1623 msgid " Already logged in only" msgstr " Уже Ñоединенные " #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " <пробел> или выбрать, отмена " #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " <пробел> выбрать, отмена " #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Ð’ контакт-лиÑÑ‚" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "СпиÑок игнорируемых пользователей" #: src/icqface.cc:1953 msgid "Visible list" msgstr "СпиÑок visible пользователей" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "СпиÑок invisible пользователей" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Выберите контакты Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑпиÑок" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "Желаете удалить Ñти %d контактов из ÑпиÑка тоже?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Получатели" #: src/icqface.cc:2269 #, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "БыÑтрый переход: набирайте Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка, %s повторить, Enter завершить" #: src/icqface.cc:2272 msgid "contact list quick search" msgstr "быÑтрый поиÑк по ÑпиÑку контактов" #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ не ни одной ÑÑылки в данном контекÑте" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "СÑылки в текущем контекÑте" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ внешние программы Ð´Ð»Ñ %s не определены" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "Результат работы внешней программы %s:" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "%s поÑл, %s получ, %s иÑториÑ, %s ÑÑылки, %s разверн, %s учаÑÑ‚, %s отмена" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "%s поÑл, %s получ, %s иÑториÑ, %s ÑÑылки, %s разверн, %s детали, %s отмена" #: src/icqface.cc:2477 #, c-format msgid "Outgoing %s" msgstr "Редактирование %s " #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Контакты Ð´Ð»Ñ Ð¾Ñ‚Ñылки.." #: src/icqface.cc:2670 msgid "file name: " msgstr "Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "ИÑходÑщее %s к %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "ПоÑлано %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "ВходÑщее %s от %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Получено %s" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "%s показать ÑÑылки, %s раÑкрыть в полный Ñкран, %s закрыть" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s от %s, получено %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s к %s, поÑлано %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "полный Ñкран" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "%s or %s закрыть, Вверх/Вниз и PgUp/PgDn Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¸" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ %s, вÑего %d Ñообщений" #: src/icqface.cc:3339 #, c-format msgid "%s search, %s again, %s cancel" msgstr "%s поиÑк, %s опÑть, %s отмена" #: src/icqface.cc:3348 msgid "search for: " msgstr "иÑкать: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] ÑиÑтема: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] e-mail от %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s поÑвилÑÑ Ð½Ð° линии, ÑÑ‚Ð°Ñ‚ÑƒÑ %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s поменÑл ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° %s Ñ %s" centerim-4.22.10/po/ms.po0000644000175000001440000024606111473011457012014 00000000000000# Bahasa Melayu translation of centericq # Copyright (C) 1998,1999 Free Software Foundation, Inc. # Khairulanuar Abd Majid , 2003 # Khairulanuar Abd Majid , 2002 # Khairulanuar Abd Majid , 2002 # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.6.9\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2003-07-01 14:44+0800\n" "Last-Translator: Khairulanuar Abd Majid \n" "Language-Team: Bahasa Melayu \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "kata laluan: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "F2/M menu rakan sekarang, F3/S tukar status, F4/G aksi am, Q keluar" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Abaikan semua acara dari %s?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "Keluarkan %s juga dari senarai rakan?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Anda pasti untuk membuang %s?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Nama pendek baru untuk dipaparkan: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Masukkan rakan ke kumpulan" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ gagal dapatkan mesej away kerana offline" #: src/centerim.cc:427 #, fuzzy msgid "! cannot connect, free disk space is less than 10k" msgstr "! ruang storan kurang dari 10k, offline" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "mesej away" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "" #: src/centerim.cc:692 src/centerim.cc:747 #, fuzzy, c-format msgid "+ new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] mail baru diterima, %d mesej" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] mail baru diterima, %d mesej" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ mesej terakhir dari %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ kofigurasi %s berubah, muat semula" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! ada centerim lain sedang dilarikan" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! ini mungkin menyebabkan masalah. pid %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Nombor telefon bimbit: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "fail akan disimpan di dalam direktori: " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "Direktori yang diberikan tidak dapat ditulis" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "Direktori yang diberikan tidak wujud" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ tiada sejarah bagi %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ pengguna %s telah berada dalam senarai rakan" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "PIlih kumpulan untuk masukkan rakan" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s telah dimasukkan ke senarai" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ pengguna telah kembali" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] status restored" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] telah ditetapkan secara automatik %s" #: src/centerim.cc:1490 msgid "away" msgstr "away" #: src/centerim.cc:1490 msgid "n/a" msgstr "n/a" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! ruang storan kurang dari 10k, offline" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! sebaliknya kita akan kehilangan data dan tetapan" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "Jemput ke perbincangan.." #: src/centerim.cc:1772 #, fuzzy msgid "Select contacts to move" msgstr "Pilih rakan untuk dimasukkan ke dalam senarai" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "" #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "Di channel: " #: src/hooks/rsshook.cc:380 msgid "success" msgstr "" #: src/hooks/rsshook.cc:400 #, fuzzy msgid "Title: " msgstr "Pangkat" #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "" #: src/hooks/rsshook.cc:402 #, fuzzy msgid "Category: " msgstr "Bandar: " #: src/hooks/rsshook.cc:403 #, fuzzy msgid "Author: " msgstr "* Pengesahan : " #: src/hooks/rsshook.cc:405 #, fuzzy msgid "Description: " msgstr "Jawatan: " #: src/hooks/rsshook.cc:407 #, fuzzy msgid "Link: " msgstr " uin: " #: src/hooks/rsshook.cc:408 #, fuzzy msgid "Comments: " msgstr "komen: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "gagal dapatkan nama hos" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "gagal membina soket" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "sahkan hos pager dan port yang dimasukkan" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] meninggalkan perbincangan %s" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "Sila sertai perbincangan saya." #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Mesej status kostum:" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] gagal dapatkan mesej away dari %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] gagal login: nama dan kata laluan tidak seragam" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] gagal login: nama dan kata laluan tidak seragam" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] gagal login: akaun anda dihalang" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ untuk aktifkan semula, lawat %s" #: src/hooks/yahoohook.cc:802 #, fuzzy msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/yahoohook.cc:809 #, fuzzy msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] ralat: %s" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "Pengguna %s telah mengajak anda ke perbincangan %s, tajuknya: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "Rakan perbincangan sekarang ialah: " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Auto-join perbincangan" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "Pengguna %s menolak jemputan anda untuk menyertai perbincangan" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "Pengguna %s telah menyertai perbincangan" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "Pengguna %s meninggalkan perbincangan" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "Pengguna telah menambah anda ke dalam senarai rakan" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "mesejnya ialah:" #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] emel dari %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] sistem: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] ralat: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] ralat: %s" #: src/hooks/yahoohook.cc:1154 #, fuzzy msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] diputuskan" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] ralat: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] ralat: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] ralat: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "Pengguna menyambut hari lahir hari ini" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] gagal menghubungi pelayan" #: src/hooks/jabberhook.cc:649 #, fuzzy, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] mengeluarkan %s dari senarai rakan" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Mesej away:" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] tiada mesej away dari %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "Nama pendek diberikan tidak sah, gagal mendaftar" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "Gagal menghubungi pelayan" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "Pengguna di sana menggunakan %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, fuzzy, c-format msgid "+ [jab] error %d" msgstr "+ [jab] ralat %d: %s" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] ralat %d: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "Pengguna ingin melanggan ke rangkaian anda yang terkini" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" "Pengguna telah mengeluarkan anda dari senarai rakannya (menyah-langgan anda, " "menggunakan bahasa Jabber" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] gagal menghubungi pelayan" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "Saya gemar menggunakan profil defaul AIM dari centerim %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "hubungan aim gagal" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] hubungan gagal: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "Pengguna tidak mempunyai profil maklumat." #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] kata laluan telah dihantar" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "seperti yang diminta" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "masalah soket" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "nama tidak sah" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "mencepat" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "katalaluan tidak sah" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "nama dan kata laluan tidak seragam" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] diputuskan" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "sebab icq ditamatkan" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "Pengguna telah menerima permintaan anda" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "Pengguna menolak permintaan anda; mesejnya ialah: " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] gagal SMS ke %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] gagal SMS ke %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] gagal dapatkan mesej away dari %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Pengguna Chat Rawak" #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ [jab] menghubungi pelayan" #: src/hooks/gaduhook.cc:164 #, fuzzy, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [msn] sambungan gagal: " #: src/hooks/gaduhook.cc:218 #, fuzzy msgid "+ [gg] connection to the server failed" msgstr "+ [jab] menghubungi pelayan" #: src/hooks/gaduhook.cc:291 #, fuzzy msgid "+ [gg] connection lost" msgstr "+ [jab] menghubungi pelayan" #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [jab] tiada mesej away dari %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] gagal menghubungi pelayan" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] hubungan gagal: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] nama pendek berjaya ditukar" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Di channel: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Ditendang oleh %s; sebab: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "Pengguna telah menukar nama pendek dari %s ke %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] kata laluan telah dihantar" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] kata laluan telah dihantar" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "Balasan PING dari pengguna: %d saat" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s telah menyertai." #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s telah keluar" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "sebab: %s" #: src/hooks/irchook.cc:1489 #, fuzzy, c-format msgid "%s has been kicked by %s" msgstr "%s telah diOPkan oleh %s." #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "Tajuk Channel sekarang ialah: %s" #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "ditetapkan oleh %s" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s telah diOPkan oleh %s." #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s telah di-nyah-OP oleh %s." #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s telah mengOPkan kita." #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s telah me-nyah-OPkan kita." #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 #, fuzzy msgid "+ [lj] user lookup finished" msgstr "+ [jab] carian selesai, %d ditemui" #: src/hooks/ljhook.cc:511 #, fuzzy msgid "cannot connect" msgstr "+ [msn] sambungan gagal: " #: src/hooks/ljhook.cc:512 #, fuzzy, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [aim] hubungan gagal: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "" #: src/hooks/ljhook.cc:572 #, fuzzy, c-format msgid "+ [lj] login failed: %s" msgstr "+ [aim] hubungan gagal: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "" #: src/hooks/ljhook.cc:578 #, fuzzy, c-format msgid "+ [lj] post error: %s" msgstr "+ [jab] ralat %d: %s" #: src/hooks/ljhook.cc:677 #, fuzzy, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "Pengguna telah menambah anda ke dalam senarai rakan" #: src/hooks/ljhook.cc:687 #, fuzzy, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "Pengguna %s telah mengajak anda ke perbincangan %s, tajuknya: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "" #: src/hooks/ljhook.cc:722 #, fuzzy, c-format msgid "+ [lj] %s was added to friends" msgstr "+ %s telah dimasukkan ke senarai" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msc] selesai reverse senarai pengguna, %d ditemui" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "+ [msn] email tidak dibaca: %d dalam inbox, %d dalam folder" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] emel dari %s, %s" #: src/hooks/msnhook.cc:905 #, fuzzy msgid "+ [msn] cannot connect: " msgstr "+ [yahoo] sambungan gagal: " #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "sahkan nama hos dan port" #: src/hooks/abstracthook.cc:355 #, fuzzy msgid "connecting to the server" msgstr "+ [jab] menghubungi pelayan" #: src/hooks/abstracthook.cc:356 #, fuzzy msgid "logged in" msgstr "+ [jab] log in" #: src/hooks/abstracthook.cc:357 #, fuzzy, c-format msgid "search finished, %d found" msgstr "+ [icq] carian selesai, %d ditemui" #: src/hooks/abstracthook.cc:358 #, fuzzy msgid "password was changed successfully" msgstr "+ [icq] kata laluan berjaya ditukar" #: src/hooks/abstracthook.cc:359 #, fuzzy msgid "disconnected" msgstr "Diputuskan" #: src/hooks/abstracthook.cc:360 #, fuzzy, c-format msgid "adding %s to the contacts" msgstr "+ [aim] menambah %s ke senarai rakan" #: src/hooks/abstracthook.cc:361 #, fuzzy, c-format msgid "removing %s from the contacts" msgstr "+ [msn] membuang %s dari senarai" #: src/hooks/abstracthook.cc:362 #, fuzzy, c-format msgid "members list fetching finished, %d found" msgstr "+ [yahoo] selesai mendapatkan senarai rakan, %d ditemui" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "Pengguna menyambut hari lahir hari ini" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Jan" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Feb" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Mac" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Apr" #: src/icqcontact.cc:854 msgid "May" msgstr "Mei" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Jun" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Jul" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Ogo" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Sep" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Okt" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Nov" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Dis" #: src/icqgroups.cc:66 msgid "General" msgstr "Am" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Dihantar pada %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60-ke atas" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "jenis IM tidak dikenali" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Sembang Am " #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Romantik" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Permainan" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Pelajar" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "20 an" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "30 an" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "40 an" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50 Ke atas" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "Mencari Wanita" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Mencari Lelaki" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Nama" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Profil carian " #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Buang" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Muat" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ anda mesti log in terlebih dahulu" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "mUat" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "simpAn" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "cLear" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Tukar" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Cari/Tambah" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "Masuk/Bina" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Cari/tambah pengguna " #: src/icqdialogs.cc:249 #, fuzzy msgid " Join/create a channel/conference " msgstr " Sertai membina channel/perbincangan " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr "" #: src/icqdialogs.cc:299 msgid " Network " msgstr " Network " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Maklumat " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Nama panggilan : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " Emel : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Nama : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Nama Keluarga : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Lingkungan umur : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Jantina : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Bahasa : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " Lokasi " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Bandar : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Negeri : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Negara : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Kerja " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Syarikat : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Jabatan : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Jawatan : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Online sahaja " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Kumpulan Chat Rawak" #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Katakunci " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Nama panggilan " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " Servis carian " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Parameter carian " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 #, fuzzy msgid " Feed Parameters " msgstr " Parameter carian " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr "" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr "" #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Channel : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Nama : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " Sertai sejak kali terakhir diperiksa sahaja" #: src/icqdialogs.cc:416 #, fuzzy, c-format msgid " Keywords : %s " msgstr " Katakunci " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 #, fuzzy msgid " Options " msgstr " Lokasi " #: src/icqdialogs.cc:422 #, fuzzy, c-format msgid " Users with photos only : %s " msgstr " Jawatan : %s " #: src/icqdialogs.cc:423 #, fuzzy, c-format msgid " Look for online only : %s " msgstr " Online sahaja " #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Tunjukkan pengguna yang menyenaraikan anda di dalam senarai mereka" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Nama/Title " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Kata Laluan " #: src/icqdialogs.cc:443 msgid " Service " msgstr " Servis " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Nama profil baru: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "Nama profil telah wujud. Anda ingin teruskan ?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Nama panggilan: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Nama/Title: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "Emel: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Nama: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Nama keluarga: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Bandar: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Negeri: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Syarikat: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Jabatan: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Jawatan: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Channel: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Nama: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Katakunci: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Kata laluan: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 #, fuzzy msgid "URL: " msgstr "URL" #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "" #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 #, fuzzy msgid " General " msgstr "Am" #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " Servis pendaftaran " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Parameter pendaftaran " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " Tukar kata laluan : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " Emel : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Tarikh Lahir : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Umur : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Rumah " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Jalan : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Poskod : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefon : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Faks : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Telefon Bimbit : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Laman Web : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Lagi " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " Bahasa Utama : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " Bahasa Kedua : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " Bahasa Ketiga : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Pelbagai " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr "" #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Kumpulan chat rawak : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Pengesahan diperlukan: %s" #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Negeri : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " Mengenai " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Dapatkan maklumat anda" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Maklumat %s anda " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: maklumat " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Siap" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Tunggu sebentar. Maklumat anda masih belum diperolehi" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "Emel: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Masukkan Tarikh Lahir (HH-BB-TTTT): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Umur: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Alamat: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "Poskod: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefon: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Faks: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Telefon Bimbit: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Laman Web: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Mengenai" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "Kata laluan baru: " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "Periksa kata laluan baru: " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "tiada" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X simpan, Esc batal] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Hantar fail ke %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Tambah" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Komen" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Hantar" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Fail " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Komen " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "nama fail: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "komen: " #: src/icqdialogs.cc:1163 #, fuzzy msgid "None" msgstr "Siap" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " Tetapan centerim " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Antaramuka pengguna " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Tukar peranti bunyi ke : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Tukar skima warna ke : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr " Minta pengesahan" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Jabatan : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " Channel : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Susun rakan ke dalam kumpulan : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr "" #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr "" #: src/icqdialogs.cc:1231 #, c-format msgid " Enable vi bindings: %s " msgstr "" #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr "" #: src/icqdialogs.cc:1241 #, fuzzy, c-format msgid " Switch to language preset : %s " msgstr " Bahasa Utama : %s " #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Jabatan : %s " #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Jabatan : %s " #: src/icqdialogs.cc:1246 #, fuzzy, c-format msgid " For protocols : %s" msgstr " Jawatan : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Senarai hubungan " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Susun rakan ke dalam kumpulan : %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Susun rakan ke dalam kumpulan : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Sembunyikan pengguna offline : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-spam: buang mesej dari pengguna yang tiada dalam senarai : %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Pengesahan diperlukan: %s" #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Quote mesej dalam balasan : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Periksa peti surat setempat : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Ingat kata laluan : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Edit mesej away pada perubahan status : %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Mod mesej chat bagi : %s " #: src/icqdialogs.cc:1272 #, fuzzy, c-format msgid " Enter key sends message for : %s" msgstr " Quote mesej dalam balasan : %s " #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Mod mesej chat : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr "" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " Susun rakan ke dalam kumpulan : %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Hubungan " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " Pelayan SMTP : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " Pelayan SMTP : %s " #: src/icqdialogs.cc:1289 #, fuzzy, c-format msgid " HTTP proxy server : %s " msgstr " Pelayan SMTP : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr "" #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr "" #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " Log " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " Stem masa di dalam tetingkap log : %s" #: src/icqdialogs.cc:1301 #, fuzzy, c-format msgid " Timestamps include seconds : %s " msgstr " Stem masa di dalam tetingkap log : %s" #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " Peristiwa online/offline di dalam tetingkap log : %s" #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Maklumat terperinci IM di dalam fail log ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Masa untuk menetapkan Away secara automatik (min) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Masa untuk menetapkan N/A secara automatik (min) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Masa untuk menetapkan N/A secara automatik (min) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Jalan : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Jangkamasa Auto Away (0 - matikan): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Jangkamasa Auto N.A (0 - matikan): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "Nama pelayan SMTP: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "" #: src/icqdialogs.cc:1394 #, fuzzy msgid "HTTP proxy server hostname: " msgstr "Nama pelayan SMTP: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "" #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "Nama pelayan SMTP: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Mesej permintaan pengesahan kosong" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Maklumat anda telah diperolehi" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Susunan kumpulan rakan" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Namakan semula" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "uBah" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "ke atas" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "ke bawah" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Pilih" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Kumpulan " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Nama kumpulan yang hendak dibuat: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Nama baru bagu kumpulan: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Adakah anda pasti untuk memadam kumpulan?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Status penghantaran fail" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Batal" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " Datang dari %s" #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " Keluar ke %s" #: src/icqdialogs.cc:1865 msgid "init" msgstr "mulaan" #: src/icqdialogs.cc:1866 msgid "start" msgstr "mula" #: src/icqdialogs.cc:1867 msgid "work" msgstr "kerja" #: src/icqdialogs.cc:1868 msgid "done" msgstr "selesai" #: src/icqdialogs.cc:1869 msgid "err" msgstr "err" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "batal" #: src/icqdialogs.cc:1877 msgid " of " msgstr " dari " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "Tidak boleh buang penghantaran yang sedang berlangsung sekarang" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "" #: src/icqdialogs.cc:2023 msgid "private" msgstr "" #: src/icqdialogs.cc:2025 #, fuzzy msgid "friends only" msgstr "Gagal" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr "" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "" #: src/icqdialogs.cc:2040 #, fuzzy msgid "cAncel" msgstr "Batal" #: src/icqdialogs.cc:2052 #, fuzzy, c-format msgid " Post to journal : %s " msgstr " Jawatan : %s " #: src/icqdialogs.cc:2053 #, fuzzy, c-format msgid " Subject : %s " msgstr " Selamat : %s " #: src/icqdialogs.cc:2058 #, fuzzy, c-format msgid " Security : %s " msgstr " Selamat : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr "" #: src/icqdialogs.cc:2063 #, fuzzy, c-format msgid " Mood : %s " msgstr " Login : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "" #: src/icqdialogs.cc:2064 #, fuzzy, c-format msgid " Custom mood : %s " msgstr " Nama Keluarga : %s " #: src/icqdialogs.cc:2066 #, fuzzy, c-format msgid " Music : %s " msgstr " Emel : %s " #: src/icqdialogs.cc:2067 #, fuzzy, c-format msgid " Picture : %s " msgstr " Selamat : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Umur : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr "" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr "" #: src/icqdialogs.cc:2073 #, fuzzy, c-format msgid " Disallow comments : %s " msgstr " Jabatan : %s " #: src/icqdialogs.cc:2074 #, fuzzy, c-format msgid " Backdated entry : %s " msgstr " Tarikh Lahir : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "" #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "" #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "" #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr " Senarai hubungan " #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "CarianCepat: taip untuk cari, Alt-S cari semula, Enter siap" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 #, fuzzy msgid " Use no key" msgstr "Maklumat pengguna" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "lakukan aksi luaran manual %s, return code = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "lakukan aksi luaran %s, return code = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Offline" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Online" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Sembunyi" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Sedia berborak" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Jangan ganggu" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Digunakan" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] Tiada" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "Away" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "DND" #: src/imlogger.cc:39 msgid "N/A" msgstr "N/A" #: src/imlogger.cc:49 msgid "message" msgstr "mesej" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "pengesahan" #: src/imlogger.cc:53 msgid "e-mail" msgstr "emel" #: src/imlogger.cc:54 msgid "notification" msgstr "pemberitahuan" #: src/imlogger.cc:55 msgid "contacts" msgstr "hubungan" #: src/imlogger.cc:56 msgid "files" msgstr "fail" #: src/imlogger.cc:57 #, fuzzy msgid "event" msgstr "Tidak pernah" #: src/imlogger.cc:79 msgid "events log started" msgstr "log peristiwa dimulakan" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "%s keluar ke %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "%s masuk dari %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "diabaikan" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s offline" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "%s kepada %s, dihantar pada %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: jadi online dengan status %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: ke offline" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "tukar status kita %s ke %s dari %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " Pengurus akaun IM " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Pelayan : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " Selamat : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Login : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Kata laluan (pilihan) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Katalaluan : %s " #: src/accountmanager.cc:124 #, fuzzy, c-format msgid " Priority : %s " msgstr " Bandar : %s " #: src/accountmanager.cc:129 #, fuzzy, c-format msgid " Import friend list : %s " msgstr " Jabatan : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Kata laluan (pilihan) : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " Susun rakan ke dalam kumpulan : %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Susun rakan ke dalam kumpulan : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " Daftar " #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Jantina : %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Katakunci " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " Tukar Nama pendek " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Kemaskini maklumat rakan " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Tetapkan mesej away " #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Buang " #: src/accountmanager.cc:200 msgid " user name: " msgstr " nama pengguna: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " kata laluan: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Buang maklumat akaun dahulu!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Putuskan servis terlebih dahulu!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " alamat pelayan: " #: src/accountmanager.cc:285 msgid " priority: " msgstr "" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " Daftar ke rangkaian %s " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Teruskan" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Tetapkan kata laluan : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Periksa kata laluan : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Pelayan yang hendak diguna : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Periksa kata laluan yang anda masukkan: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Nama samaran yang hendak ditetapkan: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Pelayan: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Kata laluan tidak sama" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Kata laluan mesti diisi" #: src/imcontroller.cc:118 #, fuzzy msgid "Password must be at least 6 chars long" msgstr "Kata laluan mesti diisi" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Progress pendaftaran " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Sedang menghubungi pelayan %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Sedang menghantar permintaan" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Masa tamat semasa menunggu UIN baru. Cuba lagi?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Sedan mencuba.." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "UIN baru diterima, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Diputuskan" #: src/imcontroller.cc:179 #, fuzzy msgid "Unable to connect to icq server. Retry?" msgstr "Gagal menghubungi pelayan icq. CUba lagi?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "Cubaan mendaftar %s di %s ..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "ID Jabber berjaya didaftarkan" #: src/imcontroller.cc:228 msgid "Failed" msgstr "Gagal" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Anda mesti log ke rangkaian ICQ untuk mengemaskini maklumat" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "nama pendek baru yang mesra MSN: " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "" "Anda mesti log ke rangkaian MSN untuk mengemaskini nama pendek yang mesra" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "Anda mesti log ke rangkaian Jabber untuk mengemaskini maklumat" #: src/imcontroller.cc:318 #, fuzzy msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "Anda mesti log ke rangkaian Jabber untuk mengemaskini maklumat" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "pendaftaran tidak disokong" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "Saya seronok dengan mesej away %s yang default bagi %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, fuzzy, c-format msgid "+ launched the %s action command" msgstr "+ melarikan arahan openurl" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "masalah menghantar peristiwa: parameter tidak mencukupi" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "masalah menghantar peristiwa: hanya UIN dibenarkan dengan protokol icq" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "masalah menghantar peristiwa: jenis IM tidak dikenali" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "masalah menghantar peristiwa: jenis peristiwa tidak diketahui" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s ke %s telah dimasukkan ke dalam queue" #: src/icqconf.cc:1616 #, fuzzy msgid "event sending error: error creating directory for the contact" msgstr "masalah menghantar peristiwa: parameter tidak mencukupi" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "terima aksara status yang tidak dikenali" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "jenis IM tidak dikenali" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "ralat menukar status: " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Penggunaan: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "Pilihan am:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " --ascii, -a gunakan aksara ASCII bagi tetingkap dan kawalan UI" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b tetapkan direktori asas" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr "" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help senaraikan benda ini" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v tunjukkan maklumat versi" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Pilihan penghantaran peristiwa:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr "" " -s, --send jenis peristiwa; samada msg, sms atau url" #: src/icqconf.cc:1694 #, fuzzy msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr " -S, --status tukar status IM sekarang" #: src/icqconf.cc:1695 #, fuzzy msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto jenis protokol; samada icq, yahoo, msn, aim, irc " "atau jabber" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" " -t, --to UIN atau nama pendek destinasi (bergantung kepada " "protokol)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" " -n, --number nombor telefon bagi menghantar peristiwa (sms " "sahaja)" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Laporkan pepijat ke http://bugzilla.centerim.org." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Mesej permintaan pengesahan kosong" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* Permintaan pengesahan : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* Pengesahan : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Rakan : " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* Pindahan fail" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "Sengarai abai" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Maklumat" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " Pengurus akaun IM " #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Jawatan : %s " #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " nama pengguna: " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "ya" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "tidak" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "ya" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Akaun.." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " Jawatan : %s " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Penggunaan: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " Jawatan : %s " #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Akaun.." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "ya" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "Nov" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " Servis " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 #, fuzzy msgid "No Jabber" msgstr " [jab] Jabber" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "Selesai" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "jenis IM tidak dikenali" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Lelaki" #: src/icqface.cc:53 msgid "Female" msgstr "Perempuan" #: src/icqface.cc:56 msgid "Not specified" msgstr "Tidak ditetapkan" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "Seterusnya" #: src/icqface.cc:63 msgid "Fwd" msgstr "Ke hadapan" #: src/icqface.cc:64 msgid "Reply" msgstr "Balas" #: src/icqface.cc:65 msgid "Open" msgstr "Buka" #: src/icqface.cc:66 msgid "Accept" msgstr "Terima" #: src/icqface.cc:67 msgid "Reject" msgstr "Tolak" #: src/icqface.cc:68 msgid "User info" msgstr "Maklumat pengguna" #: src/icqface.cc:70 msgid "Prev" msgstr "Kemudian" #: src/icqface.cc:78 msgid "sound card" msgstr "kad bunyi" #: src/icqface.cc:79 msgid "speaker" msgstr "speaker" #: src/icqface.cc:80 msgid "disable" msgstr "tidak aktif" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "jangan ubah" #: src/icqface.cc:88 msgid "dark" msgstr "gelap" #: src/icqface.cc:89 msgid "blue" msgstr "biru" #: src/icqface.cc:97 msgid "protocol" msgstr "" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "mula" #: src/icqface.cc:118 msgid "mode 1" msgstr "mod 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "mod 2" #: src/icqface.cc:249 #, fuzzy, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "centerim %s TIDAK DIHANTAR: %lu" #: src/icqface.cc:274 #, fuzzy msgid "Send an URL" msgstr " Hantar SMS" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " Hantar SMS" #: src/icqface.cc:276 #, fuzzy msgid "Send contacts" msgstr "Hantar rakan.." #: src/icqface.cc:277 msgid " Request authorization" msgstr " Minta pengesahan" #: src/icqface.cc:278 #, fuzzy msgid "Edit details" msgstr " Maklumat " #: src/icqface.cc:279 #, fuzzy msgid "Fetch away message" msgstr " Dapatkan mesej away f" #: src/icqface.cc:280 #, fuzzy msgid "Add to list" msgstr " Masukkan ke senarai a" #: src/icqface.cc:281 #, fuzzy msgid "Rename contact" msgstr " Namakan semula r" #: src/icqface.cc:282 msgid " Move to group.." msgstr " Pindah ke kumpulan.." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 #, fuzzy msgid "Fetch version info" msgstr " Dapatkan maklumat versi v" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " Hantar fail" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " Jemput ke perbincangan.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Hantar mesej channel enter" #: src/icqface.cc:294 #, fuzzy msgid "Channel chat history" msgstr " Sejarah chat h" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Buang channel del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Sertai channel" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Tinggalkan channel " #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Nama keluarga: " #: src/icqface.cc:301 #, fuzzy msgid "UnBlock channel messages" msgstr " Nyah-halang mesej channel i" #: src/icqface.cc:303 #, fuzzy msgid "Block channel messages" msgstr " Nyah-halang mesej channel i" #: src/icqface.cc:310 #, fuzzy msgid "Send a message" msgstr " Tetapkan mesej away " #: src/icqface.cc:312 #, fuzzy msgid "Event history" msgstr " Sejarah peristiwa h" #: src/icqface.cc:313 #, fuzzy msgid "Remove user" msgstr "Buang" #: src/icqface.cc:314 #, fuzzy msgid "User's details" msgstr " Maklumat rakan ?" #: src/icqface.cc:315 #, fuzzy msgid "External actions.." msgstr " Aksi luaran.. f6" #: src/icqface.cc:318 #, fuzzy msgid "Unset ignore user" msgstr " Buang abaian pengguna i" #: src/icqface.cc:318 #, fuzzy msgid "Ignore user" msgstr "Sengarai abai" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 #, fuzzy msgid "Force check" msgstr " Abai pengguna i" #: src/icqface.cc:435 #, fuzzy msgid "Change status" msgstr "Tukar" #: src/icqface.cc:436 #, fuzzy msgid "Go to contact.." msgstr "Pindah ke rakan" #: src/icqface.cc:437 msgid " Accounts.." msgstr " Akaun.." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " Pilihan Tetapan centerim" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Monitor pindahan fail" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Cari/Tambah rakan" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " Sertain channel/perbincangan" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr "" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Papar/edit senarai abai" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Papar/edit senarai invisible" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Papar/edit senarai nampak" #: src/icqface.cc:455 #, fuzzy msgid "Show offline users" msgstr " Sembunyikan pengguna offline : %s " #: src/icqface.cc:457 #, fuzzy msgid "Hide offline users" msgstr " Sembunyikan pengguna offline : %s " #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " Susunan kumpulan rakan" #: src/icqface.cc:461 msgid " Mass group move.." msgstr "" #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Maklumat" #: src/icqface.cc:905 msgid "Message" msgstr "Mesej" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Carian baru" #: src/icqface.cc:924 msgid "Contact to add" msgstr "Rakan ingin ditambah" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Mencari rakan.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Keputusan carian [selesai]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Maklumat mengenai %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Nama pendek" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr "Sengarai abai" #: src/icqface.cc:1116 msgid "not found" msgstr "" #: src/icqface.cc:1131 msgid "E-mail" msgstr "Emel" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "Emel ke-2" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Emel lama" #: src/icqface.cc:1134 msgid "Gender" msgstr "Jantina" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Tarikh Lahir" #: src/icqface.cc:1136 msgid "Age" msgstr "Umur" #: src/icqface.cc:1137 msgid "Languages" msgstr "Bahasa" #: src/icqface.cc:1138 msgid "Last IP" msgstr "IP Terakhir" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Kali terakhir ditemui" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Tidak pernah" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "Hantar" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "fail" #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Hantar rakan.." #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "pengesahan" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Alamat" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Lokasi" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "Poskod" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefon" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Faks" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Telefon Bimbit" #: src/icqface.cc:1259 msgid "Timezone" msgstr "Zon Masa" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Laman Web" #: src/icqface.cc:1300 msgid "Company" msgstr "Syarikat" #: src/icqface.cc:1301 msgid "Department" msgstr "Jabatan" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Pangkat" #: src/icqface.cc:1346 msgid "Interests" msgstr "Minat" #: src/icqface.cc:1358 msgid "Background" msgstr "Latarbelakang" #: src/icqface.cc:1376 #, fuzzy msgid "Handle" msgstr "Lelaki" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "" #: src/icqface.cc:1378 msgid "Version" msgstr "" #: src/icqface.cc:1379 msgid "Encoding" msgstr "" #: src/icqface.cc:1382 msgid "Link" msgstr "" #: src/icqface.cc:1384 msgid "Frequency" msgstr "" #: src/icqface.cc:1385 #, fuzzy msgid "Last check" msgstr "Kali terakhir ditemui" #: src/icqface.cc:1386 msgid "Next check" msgstr "" #: src/icqface.cc:1387 #, fuzzy msgid "Last result" msgstr "seperti yang diminta" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "" #: src/icqface.cc:1404 #, fuzzy msgid "Now" msgstr "Nov" #: src/icqface.cc:1423 #, fuzzy msgid "Full name" msgstr "nama fail: " #: src/icqface.cc:1442 #, fuzzy, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "F2 ke URL, F6 aksi luaran, ESC tutup" #: src/icqface.cc:1447 #, fuzzy, c-format msgid "user info for %s" msgstr "Maklumat pengguna" #: src/icqface.cc:1456 msgid "Check" msgstr "" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Edit" #: src/icqface.cc:1456 msgid "LJ" msgstr "" #: src/icqface.cc:1460 #, fuzzy msgid "Retreive" msgstr "Ambil" #: src/icqface.cc:1466 #, fuzzy msgid "Friend of" msgstr "Gagal" #: src/icqface.cc:1472 msgid "Home" msgstr "Rumah" #: src/icqface.cc:1472 msgid "Work" msgstr "Kerja" #: src/icqface.cc:1472 msgid "More" msgstr "Lagi" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Ambil" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] rangkaian ICQ" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr "" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr "" #: src/icqface.cc:1623 #, fuzzy msgid " Already logged in only" msgstr "telah log" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr "" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr "" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Pindah ke rakan" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Sengarai abai" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Senarai Nampak" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Senarai Limunan" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Pilih rakan untuk dimasukkan ke dalam senarai" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "Buang %d rakan dari senarai rakan?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Penerima peristiwa" #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "CarianCepat: taip untuk cari, Alt-S cari semula, Enter siap" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr " Senarai hubungan " #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ tiada URL di dalam konteks sekaran" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URL dalam konteks sekarang" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ tiada aksi luaran ditetapkan bagi %s" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "Keputusan bagi aksi luaran %s:" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "^X hantar, ^P ramai, ^O sejarah, F2 URLs, F9 expand, Alt-? rakan, ESC batal" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "^X hantar, ^P ramai, ^O sejarah, F2 URLs, F9 expand, Alt-? selanjutnya, ESC " "batal" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr " Keluar ke %s" #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Hantar rakan.." #: src/icqface.cc:2670 msgid "file name: " msgstr "nama fail: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "%s keluar ke %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Dihantar pada %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "%s masuk dari %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Diterima pada %s" #: src/icqface.cc:3182 #, fuzzy, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "F2 ke URL, F9 ke full-screenize, ESC tutup" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s dari %s, diterima pada %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s kepada %s, dihantar pada %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "Sejarah bagi %s, %d semuanya" #: src/icqface.cc:3339 #, fuzzy, c-format msgid "%s search, %s again, %s cancel" msgstr "/ cari, N lagi, ESC batal" #: src/icqface.cc:3348 msgid "search for: " msgstr "cari bagi: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] sistem: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] emel dari %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s online dengan status %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s tukar status ke %s dari %s" #~ msgid " [o] Online" #~ msgstr " [o] Online" #~ msgid " [_] Offline" #~ msgstr " [_] Offline" #~ msgid " [a] Away" #~ msgstr " [a] Away" #~ msgid " [c] Occupied" #~ msgstr " [c] Sedang digunakan" #~ msgid " [f] Free for chat" #~ msgstr " [f] Boleh le sembang" #~ msgid " [i] Invisible" #~ msgstr " [i] Limunan" #~ msgid "+ [irc] password was requested, but it's not set" #~ msgstr "+ [irc] kata laluan telah diminta, tetapi tidak ditetapkan" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Periksa kata laluan : %s " #, fuzzy #~ msgid " Convert from : %s " #~ msgstr " Negara : %s " #, fuzzy #~ msgid " Convert to : %s " #~ msgstr " Negara : %s " #~ msgid "Your friendly nickname has been changed to %s" #~ msgstr "Nama pendek anda telah ditukar ke %s" #~ msgid "already logged" #~ msgstr "telah log" #~ msgid "" #~ "event sending error: the destination contact doesn't exist on your list" #~ msgstr "" #~ "masalah menghantar peristiwa: maklumat penerima tiada dalam senarai anda" #, fuzzy #~ msgid "URLs, " #~ msgstr "URL" #, fuzzy #~ msgid " details, " #~ msgstr " Maklumat " #, fuzzy #~ msgid " cancel" #~ msgstr "Batal" #, fuzzy #~ msgid "search, " #~ msgstr "cari bagi: " #, fuzzy #~ msgid " esc cancel" #~ msgstr " Tinggalkan channel " #, fuzzy #~ msgid "contact menu, " #~ msgstr "hubungan" #, fuzzy #~ msgid "change status, " #~ msgstr "%s tukar status ke %s dari %s" #, fuzzy #~ msgid "general actions, " #~ msgstr "Pilihan am:" #~ msgid " Store contact list server-side : %s " #~ msgstr " Simpan senarai rakan ke pelayan : %s " #~ msgid " Send an URL u" #~ msgstr " Hantar URL u" #~ msgid " Send contacts c" #~ msgstr " Hantar rakan c" #~ msgid " Edit details e" #~ msgstr " Edit maklumat e" #~ msgid " List nicknames ?" #~ msgstr " Senarai nama pendek ?" #~ msgid " Block channel messages i" #~ msgstr " Halang mesej channel i" #~ msgid " Send a message enter" #~ msgstr " Hantar mesej enter" #~ msgid " Remove user del" #~ msgstr " Buang pengguna del" #~ msgid " Ignore user i" #~ msgstr " Abai pengguna i" #, fuzzy #~ msgid " Remove feed del" #~ msgstr " Buang pengguna del" #, fuzzy #~ msgid " Unset ignore feed i" #~ msgstr " Buang abaian pengguna i" #, fuzzy #~ msgid " Ignore feed i" #~ msgstr " Abai pengguna i" #~ msgid " Change status s" #~ msgstr " Tukar status s" #~ msgid " Go to contact.. alt-s" #~ msgstr " Ke rakan... alt-s" #~ msgid " Show offline users F5" #~ msgstr " Paparkan rakan offline F5" #~ msgid " Hide offline users F5" #~ msgstr " Sembunyikan rakan offline F5" #~ msgid "ESC or F9 to close" #~ msgstr "ESC atau F9 untuk tutup" #~ msgid " Russian win/koi translation for : %s" #~ msgstr " Alihbahasa Russia win/koi bagi : %s " #~ msgid " Russian win/koi translation : %s " #~ msgstr " Alihbahasa Russia win/koi : %s " #~ msgid "+ [yahoo] connecting to the server" #~ msgstr "+ [yahoo] menghubungi pelayan" #~ msgid "+ [yahoo] disconnected" #~ msgstr "+ [yahoo] diputuskan" #~ msgid "+ [yahoo] adding %s to the contacts" #~ msgstr "+ [yahoo] masukkan %s ke senarai rakan" #~ msgid "+ [yahoo] removing %s from the contacts" #~ msgstr "+ [yahoo] keluarkan %s dari senarai rakan" #~ msgid "+ [yahoo] logged in" #~ msgstr "+ [yahoo] log in" #, fuzzy #~ msgid "+ [yahoo] search finished, %d found" #~ msgstr "+ [jab] carian selesai, %d ditemui" #~ msgid "+ [jab] connecting to the server" #~ msgstr "+ [jab] menghubungi pelayan" #~ msgid "+ [jab] adding %s to the contacts" #~ msgstr "+ [jab] menambah %s ke senarai rakan" #~ msgid "+ [jab] removing %s from the contacts" #~ msgstr "+ [jab] mengeluarkan %s dari senarai rakan" #~ msgid "+ [jab] conference list fetching finished, %d found" #~ msgstr "+ [jab] selesai mendapatkan senarai perbincangan, %d ditemui" #~ msgid "+ [jab] search finished, %d found" #~ msgstr "+ [jab] carian selesai, %d ditemui" #~ msgid "+ [jab] logged in" #~ msgstr "+ [jab] log in" #~ msgid "+ [jab] disconnected" #~ msgstr "+ [jab] diputuskan" #~ msgid "+ [aim] connecting to the server" #~ msgstr "+ [aim] menghubungi pelayan" #~ msgid "+ [aim] removing %s from the contacts" #~ msgstr "+ [aim] mengeluarkan %s dari senarai rakan" #~ msgid "+ [aim] logged in" #~ msgstr "+ [aim] log in" #~ msgid "+ [aim] disconnected" #~ msgstr "+ [aim] diputuskan" #~ msgid "+ [aim] password was changed successfully" #~ msgstr "+ [aim] kata laluan berjaya ditukar" #~ msgid "+ [icq] connecting to the server" #~ msgstr "+ [icq] menghubungi pelayan" #~ msgid "+ [icq] logged in" #~ msgstr "+ [icq] log in" #~ msgid "+ [irc] connecting to the server" #~ msgstr "+ [irc] menghubungi pelayan" #~ msgid "+ [irc] channel members list fetching finished, %d found" #~ msgstr "+ [irc] senarai rakan dalam channel telah didapatkan, %d ditemui" #~ msgid "+ [irc] logged in" #~ msgstr "+ [irc] log in" #~ msgid "+ [irc] disconnected" #~ msgstr "+ [irc] diputuskan" #, fuzzy #~ msgid "+ [lj] disconnected" #~ msgstr "+ [jab] diputuskan" #~ msgid " Synchronize contact list " #~ msgstr " Sinkronisasi senarai hubungan " #~ msgid "You must be logged in to preform the synchronization" #~ msgstr "Anda mesti log in untuk melakukan sinkronisasi" #~ msgid " Contact list synchronization " #~ msgstr " Sinkronisasi senarai hubungan " #~ msgid "Starting the synchronization process" #~ msgstr "Memulakan prosesn sinkronisasi" #~ msgid "Attempt #%d" #~ msgstr "Percubaan #%d" #~ msgid ".. %d already synchronized, %d contacts to be stored" #~ msgstr ".. %d telah disinkronisasi, %d akan disimpan" #~ msgid "Too many attempts, gave up" #~ msgstr "Terlalu banyak percubaan, mengalah" #~ msgid " Uploading buddies " #~ msgstr " Memuatkan buddies " #~ msgid "No contacts to be synchronized" #~ msgstr "Tiada rakan untuk disinkronisasi" #~ msgid ".. all of them are already stored server-side" #~ msgstr ".. semuanya telah disimpan ke pelayan" #~ msgid "%d contacts are do be stored server-side. Add them now?" #~ msgstr "%d rakan akan disimpan ke pelayan. Tambah sekarang?" #~ msgid ".. adding %s" #~ msgstr ".. menambah %s" #~ msgid "Cancelled" #~ msgstr "Dibatalkan" #, fuzzy #~ msgid "Friend list" #~ msgstr "Sengarai abai" #~ msgid "+ [msn] connecting to the server" #~ msgstr "+ [msn] menghubungi pelayan" #~ msgid "+ [msn] logged in" #~ msgstr "+ [msn] log in" #~ msgid "+ [msn] disconnected" #~ msgstr "+ [msn] diputuskan" #~ msgid "+ [yahoo] %s: started typing" #~ msgstr "+ [yahoo] %s: mula menaip" #~ msgid "+ [yahoo] %s: stopped typing" #~ msgstr "+ [yahoo] %s: berhenti menaip" #~ msgid "+ [msn] %s: stopped typing" #~ msgstr "+ [msn] %s: berhenti menaip" #~ msgid "+ [msn] %s: started typing" #~ msgstr "+ [msn] %s: mula menaip" #~ msgid " Typing notifications in the log window : %s " #~ msgstr " Pemberitahuan menaip di dalam tetingkap log : %s" #, fuzzy #~ msgid "+ [icq] %s has requested our away message" #~ msgstr "%s meminta mesej away anda, jawapan sudah dihantar" #~ msgid "%s requested our away message, sent the response" #~ msgstr "%s meminta mesej away anda, jawapan sudah dihantar" #~ msgid " [all] All of them" #~ msgstr " [all] Semuanya" #~ msgid "+ [jab] incorrect jabber id" #~ msgstr "+ [jab] id jabber tidak sah" #~ msgid " enter to select a file, esc to cancel " #~ msgstr " enter untuk memilih fail, esc untuk batal " #~ msgid " space to select a directory, esc to cancel " #~ msgstr " space untuk memilih direktori, esc untuk batal " centerim-4.22.10/po/hu.gmo0000644000175000001440000011304311473011460012140 00000000000000Þ•B,<$P0KQ0601Ô0-1841Gm1=µ1Hó1 <2J2^2r2†2*¦2Ñ2 Ù2 å2ð2336(3#_3ƒ3*¡3)Ì3ö3 4444R4d4{4™4¨4Ã4!á45"5 <5 H5R5c5r555£50µ5 æ5ð5)696R6 Y6 g6)u6-Ÿ6+Í6)ù6"#7F7!e7 ‡7 •7 7²7Ê7Ò7å7õ7 8 88(8A8[8b8r8‡8š8 ²8À8"Ù8"ü8 9*9:9J9[9j9|9 9 š9 ¤9±9Í9 Ý9é9ð9 : : : ': 1:<: L:.Z: ‰:“:¬: ½:È:ã:ó: ;;&;),;V;f;};;±; Ê;Õ;ò; <$<;<U<u<Œ<Ÿ<³<Å<Ö<å<õ< = "=0= J=X= m=w='Š= ²=¿=Õ=#ä=> >>/>@>^>u>>§>®>Ä>Ö>æ>?? $? /?=?O? c? q? }?‰?›? ¢?+¯?2Û?1@0@@+q@"@ À@Ì@ç@AA4AGA VAbA"sA–A«A»AÌA ìA öABB 2B@BPBYB0yBªBÆBÝBøB'C6CKCdCC)œCÆC'ÜCD#D'=D'eDD¬DÃDÞDûDE')E6QEˆE ¤EÅE4àE6F"LFoF#ŒF*°FÛF îF$G$4GYG,sG G³G ÌGíG H H #H 0H=HEH NHXH^HeHiHqHuH{HH&ŸHÆHÊH ÓHôHI/I 4I BI MIWI1^I I›I¤IµI¼I ÕIßIåI÷I J1J8J @JKJ SJ]J}J ŒJ­J¼JÐJçJëJ ïJ K K (K6K >K KKXK#]KKŠK‘KšK#ŸKÃKÌKëKüKLLL%L)L0LFL[L dL qL L ‰L “LL¡L§L®L ¶LÃLÔLÝLúLM!M&M /M7:M9rM¬M ÇMÓMçMìM N NN$N;N ?NKNON SN^NwN zN„N ŒN —N £N ¯N¹N¾NÅNÊNÓNØNÜNàNèNOOO(O,O 1O RO_OfOlO‚O›O²OÁO ÔOßO äOïOøO P P#P'P+P4P8P@P CP NP\PcPhP€P&’P¹P ÒPÝP#ôPQQ&Q AQLQQQcQhQwQQQŸQ¦Q(­Q5ÖQ RR!R;RDR MRXR`RdR{R ‘RœR ±R ½RËR!ÒR"ôR"S:S?SOS _SjSnSwSSS)™S4ÃSGøS@T&WT'~TJ¦T?ñTH1U%zU# UIÄUV0,V.]V-ŒV$ºVCßV\#W<€W+½W'éWXX X(XHXNXRXXXxXŠX ’XœX ¤X4±XæX%ëX)Y;;Y?wYA·YùYZ !Z,Z2Z HZ UZcZ hZ uZ ‚ZZ”Z›Z¡Z#°Z ÔZÞZçZÿZ[)[".[Q[ Y[f[k[r[v[*|[<§[$ä[' \1\-D\4r\ §\ ³\¾\ Ä\Ñ\ê\ò\] ]]]] &]0]8]<]T]W] \]i] {]!†]¨]°]È] Ï]Ú]ø] ý] ^^ $^/^7^=^S^[^m^v^"†^©^&È^ï^ ô^þ^_Ã_]Ù`47a:la2§a<ÚaLbMdbC²b öbcc#c&3c3Zc Žc ™c §c²cÅc×c>ëc(*dSd8rd8«d#ädee-eEeae|eeŸe²e'Åe"íef+f :fHfZf lfzf‰fœf6­f äf#ïf#g7gWg^g pg6~g#µg3Ùg, h(:h/ch0“hÄh ÍhØhïh i%i#>ibiui ‡i •i¡i(Àiéi òijj-jGj"[j-~j)¬j Öjâjôjkk0kHkak hkukˆkšk £k¯kÁk Ûk èkôk l l!l 5l+Cl olylŽl Ÿl©lÉlØlöl mm2mJm[m&vmm·m Öm ãmn#nBnSn"qn”n«nÉnÜnínoo"-oPo_o"to—o¦oÂoÓoCão 'p 5p Ap#Opsp yp„p™p&³pÚp*õp& qGqOq dqrqŠqªq¹q Îq Ùqçqùq r r&r5rFrMrar?yr8¹rDòr:7sArs´s½s%Ùsÿs$t#:t ^t kt xt$™t¾t Öt ãtðt uu#u5uQubuxuu3šu#Îuòu$ v.v+Hvtv‹v"ªv$Ív&òvw/3wcw$ww+œw.Èw÷wx$*xOx$ox”x(®xA×x#y1=y&oyC–yDÚy,zLz)kz@•zÖzïz/{*8{$c{/ˆ{¸{Ö{ï{ |,| 1|;|@|E|J| O|[|d|l|u|z|~|„|‰|¦|¹| ½|FÇ|L}'[}ƒ}Š}š} ©} ³}5Á} ÷}~ ~ ~"#~ F~Q~V~r~ ˆ~©~ ²~ ¾~Ì~ Õ~"à~6EYrv$zŸ ¨ ³¾ Ç Õâ-è€ €+€ 4€A€ ]€%g€€¢€ ½€È€Ì€Ò€Ö€Ú€ï€ &4 ;G P \ gq u ™Ÿ¾ Ãäëò8û>4‚s‚ ’‚ž‚´‚"¹‚Ü‚ ð‚ý‚ƒ/ƒ3ƒDƒIƒ Nƒ-\ƒŠƒƒ •ƒ  ƒªƒ ¹ƒ ÃуÖƒ ݃èƒíƒôƒúƒÿƒ„ $„1„:„I„X„]„z„„”„™„©„ »„ ƄԄ ç„ ô„ … …… 6… D…R…V… […e…i…q… t… …Ž…•……±…&Ä…ë… †!†$6†[† c† m† ކ š†¥†®†¶† ¿†6Ɇ ‡ ‡ ‡+&‡CR‡–‡Ÿ‡§‡LJ͇Ó‡ê‡ò‡ö‡ˆˆ-ˆ Eˆ Qˆ \ˆgˆ ~ˆ$Šˆ¯ˆµˆψ äˆòˆ øˆ‰ ‰‰)‰AD‰2†‰¹‰&Ù‰"ŠT#Š)xŠ.¢Š!ÑŠóŠS‹c‹4|‹<±‹,î‹1ŒBMŒyŒD >O4Ž ÃÍÒ5ÙŽŽŽŽ>Ž UŽbŽxŽ€Ž5ŽÅŽ(ËŽ.ôŽI#KmI¹ " -; Z dqx‹š³ ¸ÅÍ2è ‘ )‘/5‘'e‘‘ ‘$¨‘Í‘ Ô‘á‘ç‘î‘ó‘)ü‘E&’,l’2™’Ì’:â’:“ X“ d“ p“z“‹“£“¼“ Ò“à“è“ð“÷“þ“”””5”9”?”G” Z”!d”†”” ­” ¹”Ôá” æ”ñ”• • *•6•)>•h• p• |•‡•œ•¸•!Ø•ú• – –– þßô£Åë‡‰Ø ï+n7"ÏG%§Ã-\élàÒ É­62#YŽìo*`!užûf¼) 4'È@F ¦Åãçè,îmôp&rL#[ ÛÏõùæĶòähÞË}7ls¹$óM<§Æ&1xq¼KûŸäkj¥<— Ë3,>³þÐ\Öëœtx­|½¬"ÊbªQ6¿Zú¶e3á¿5’*Pï Ü©0N`B?‰Š÷=c ð_ƒdEÚ¹pC†ÁßCKÒ+5ˆ: ’$¡« /,јí÷”Œ˜]Rµ 8Í×5m¾Xã…H-¸‘¨ÂG NÇköÖTq¯"-XæDc?[Ó¸gº(µwiU¯‡'¨ýñd#/B&2â41‚ÿ@Y^É €ŽÙˆ9¢øJ0Û…¥/r±w~õåz‹–{½>VQÝ7ÞyŠ®v„Æ 8FУ 0Œ–™ù¤J^saöÍ2St>¬gîW1ðuÀ›3ê°.*;áàØéb² çO:.„üÿ.´פLÂhÓ«EA)o¾‚'Ê(V•‹í¡ø)‘IóÕ{´œyÎSAAH;|»4²ú;“›@ÌÔªèa»±$Á°}<ž8z%ÇZ=—Ù(R:· WOÔ”6!f%³]ýT+ȃ9ÑIPìòiĺ9ÎåÀÌnñÕ©BM®?šÝâ!v†€ ¦šÚŸüU ¢™ÕÜ·D_“êe=~j --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --help display this stuff --version, -v show the program version info -n, --number mobile number to send an event to (sms only) -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Accounts.. Age : %s Age range : %s All protocols Already logged in only Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Backdated entry : %s Birthdate : %s Cellular phone : %s Change color scheme to : %s Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users First name : %s Gender : %s General Groups HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Joined since the last check only Keywords Keywords : %s Language : %s Last name : %s Leave channel Link an RSS feed Link an RSS feed Location Logging Login : %s Look for online only : %s Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network Nickname Nickname : %s Online only Online/offline events in the log window : %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remove channel del Request authorization SMTP server : %s Search parameters Search profiles Search service Secured : %s Security : %s Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Show users who have you on their list State : %s Street address : %s Subject : %s Timestamps in the log window : %s UIN UIN : %s Update user details User interface Users with photos only : %s View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM password: priority: server address: uin: user name: ! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu%lu minutes%s from %s, received on %s%s has been deopped by %s.%s has been kicked by %s%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s to %s has been put to the queue%s to %s, sent on %s%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChannel topic now is: %sChannel: CheckCheck frequency: Check the new password: Check the password you entered: City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DNDDecDefault Jabber conference serverDepartmentDepartment: Description: DetailsDetect musicDisconnectedDoneDrop the account information first!E-Mail: E-mailE-mail: EditEmpty authorization request messageEncodingEnter birthdate (DD-MM-YYYY): Event recipientsEvents sending options:FailedFaxFax: FebFemaleFetching your detailsFile transfer statusFinishedFirst name: Free for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadHTTP proxy server hostname: HandleHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLinkLink: LoadLocationMaleMarMayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: Not specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %s to %sPING reply from the user: %d second(s)Password must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: Please join my conference.Position: PostPosting subject: PrevPublished on: RSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?RenameReplyResult of the external action %s:RetreiveRetrieveRetrying..RomanceSMSSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSendSend contacts..Sending requestSent on %sSepServer: State: Street address: StudentsThe Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesThis is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnable to connectUsage: User infoVersionVisible listWait a moment. Your details haven't been fetched yetWorkWrong nickname given, cannot registerYou have to disconnect the service first!You must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: abortaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: contactscould not create socketcould not resolve hostnamecouldn't fetchdarkdirectory to save the file(s) to: disabledon't changedonee-mailerreventevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfriends onlyicq disconnection reasonignoredincoming %s from %slInklOadmessagemode 1mode 2move Downmove Upn/anew MSN friendly nick: nononenotificationoutgoing %s to %spassword: post new entries to your journal.privatepublic (visible to all)rEmovereason: %sregistration is not supportedsAvesearch for: set by %ssocket problemssound cardspeakerstartstatus change error: successthe message was: turboingunknown IM typeunknown status character was givenusername and password mismatchverify the pager host and port enteredworkwrong XMLyesyou are an op hereProject-Id-Version: centerim 2.0.0 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2004-01-12 20:47+0100 Last-Translator: Mihály Gyulai Language-Team: hungarian Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --ascii, -a ASCII karakterek használata ablakok és egyebek beállításához --basedir, -b <útvonal> alapkönyvtár megadása --bind, -B helyi IP cím hozzárendelés --help megjelenik ez a szöveg --version, -v a program verziójának kiírása -n, --number eseményközlés céljaként megadott mobilszám -s, --send az eseménytípus lehet: üzenet, SMS vagy URL -t, --to a protokolltól függÅ‘en UIN vagy név %s: adatai 1. nyelv : %s 2. nyelv : %s 3. nyelv : %s : jóváhagy, : mégse vagy : jóváhagy, : mégse Névjegy Azonosítók Kor : %s Korhatár : %s Minden protokoll már bejelentkezve Anti-spam: üzenet tiltása a listán nem szereplÅ‘ktÅ‘l: %s Kapcsolatok csoportokba rendezése: %s Azonosítás szükséges: %s Távollét automatikus beállítása (perc után) : %d 'Nem elérhetÅ‘' automatikus beállítása (perc) : %d Visszadátumozott bejegyzés: %s Szülinap : %s Mobiltelefon : %s Színbeállítás: %s Azonosító módosítása Jelszó módosítás: %s Hangeszköz : %s Csatorna : %s Üzenetmód : %s Üzenetmód : %s EllenÅ‘rzés gyakorisága (perc): %lu Helyi postaláda figyelése : %s JelszóellenÅ‘rzés : %s Város : %s Megjegyzés Kapcsolódások Cégnév : %s Kapcsolatok Ország : %s Egyéni kedv: %s Részleg : %s Részletes naplózás a ~/.centerim/log fájlban: %s Részlet Auto-formázás kikapcsolása: %s Email üzenetek kikapcsolása: %s Megjegyzés kikapcsolása: %s Elvet E-Mail : %s E-mail : %s Ãllapotváltás esetén az indok szerkesztése : %s Kétirányú nyelvtámogatás: %s Emacs gombok engedélyezése a szerkesztÅ‘ben: %s Peer-to-peer kapcsolat engedélyezése: %s Web állapotjelzÅ‘ engedélyezése: %s Az Enter gombbal elküldjük az üzenetet: %s Az Enter gombbal elküldjük az üzenetet : %s Egyéb Fax : %s Csatornaparaméterek Fájltovábbítás figyelése Fájlok Felhasználó keresés, hozzáadás Felhasználó keresés/hozzáadás Keresztnév : %s Nem : %s Ãltalános Csoportok HTTP proxy kiszolgáló : %s Offline felhasználók elrejtése : %s Otthon Honlap : %s IM felhasználókezelÅ‘ BejövÅ‘ innen: %s Konferenciára hívás.. Belépés szobába Belépés szobába/konferenciára Csatorna/konferencia belépés/létrehozás Az utolsó ellenÅ‘rzés óta lépett be Kulcsszó Kulcsszavak: %s Nyelv : %s Vezetéknév : %s Kilépés szobából RSS csatorna megadása RSS csatorna megadása Hely Naplózás Azonosító : %s Csak online: %s Egyéb Kedv : %s További adatok Ãthelyezés csoportba.. Zene : %s Név : %s Név/megnevezés Hálózat Azonosító Azonosító : %s Csak online Online/offline események a naplóban: %s Opciók Csoportok kezelése KimenÅ‘ ide: %s Jelszó Jelszó (nem kötelezÅ‘) : %s Jelszó : %s Beállítandó jelszó : %s Telefon : %s Kép : %s Ping Peer-to-peer kapcsolathoz kapuk tartománya : %s Beosztás : %s Bejegyzés küldése: %s Üzenetet idézni a válasznál : %s Véletlenszerű csoport Véletlenszerű csoport : %s Bejegyzés Bejegyzés a(z) %s hálózatba Regisztrációs paraméterek A bejegyzés folyamatban van Regisztráció Jelszavak megjegyzése : %s Csatorna eltávolítása Del Azonosítás kérése LevelezÅ‘ SMTP szerver : %s Adatlap keresés Adatlap keresés Szolgáltatás keresés Biztonságos : %s Biztonság : %s Csatornaüzenet küldése Enter SMS küldése Fájl(ok) küldése Fájl(ok) küldése ide: %s, %lu Szerver : %s Használandó szerver: %s Szolgáltatás Távollét oka Azok a felhasználók, akiknél szereplünk a kapcsolatai között Megye : %s Cím : %s Tárgy : %s IdÅ‘bélyeg a napló-ablakban: %s UIN UIN : %s Adatok frissítése Felhasználói felület Csak fényképes felhasználók : %s Tiltólista szerkesztése Láthatatlanok listájának szerkesztése Láthatók listájának szerkesztése Munka XML export URL : %s %s adataink Irányítószám : %s [Ctrl-X mentés, Esc mégsem] [aim] AOL TOC [icq] ICQ hálózat [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM jelszó: elsÅ‘bbség: szerver címe: uin: felhasználónév:! több centerim is fut! a szabad lemezterület 10 kB alatt van, nem lehet csatlakozni! a szabad lemezterület 10 kB alatt van, lecsatlakozás! a lemez betelése naplók és beállítások elvesztéséhez vezet%s támogatása a program futtatása elÅ‘tt le lett tiltva! ez működési problémákat okozhat. Processz azonosító: %lu%lu perc%s innen: %s, érkezett: %s%s levéve az op-listáról %s által%s kirúgva %s által%s felvéve az op-listára %s által%s megszüntette az op-státusunkat%s belépett%s kilépett%s felvett minket az op-listára%s %s részére bekerült a pufferbe%s ide: %s, küldve: %s%s kilépett%s kilépett%s belépett, állapota: %s(alap)(nincs/egyéni)* Azonosítás : * Azonosítási kérelem : * Kapcsolatok : * Fájl továbbítás* SMS : + %s felvéve a listára+ [%02d:%02d:%02d] új levél érkezett, %d üzenet+ [%s] automatikusan beállítva %s+ [%s] visszaállítva+ [aim] sikertelen kapcsolódás: %s+ [aim] jelszó elküldve+ [aim] nem lehet kapcsolódni a szerverhez+ [icq] lekapcsolódva+ [icq] sikertelen SMS ide: %s+ [icq] sikertelen SMS ide: %s, %s+ [irc] sikertelen kapcsolódás: %s+ [irc] az azonosító megváltoztatva+ [irc] jelszó elküldve+ [irc] a kapcsolódás a szerverhez sikertelen+ [jab] hiba %d: %s+ [jab] nincs távolléti ok: %s, %s+ [jab] nem lehet kapcsolódni a szerverhez+ [jab] eltávolítás a %s regisztrációból+ [lj] %s felvéve a listára+ [lj] HTTP hiba: %s+ [lj] nem lehet barátot hozzáadni+ [lj] hiba barát törlésekor+ [lj] sikertelen bejelentkezés: %s+ [lj] küldési hiba: %s+ [lj] sikeres küldés. Azonosító: %s+ [lj] a felhasználót eltávolítottuk a barátok listájáról+ [lj] felhasználó keresés vége+ [yahoo] már van egy kapcsolódás a szerverhez+ [yahoo] a kapcsolódás sikertelen: + [yahoo] sikertelen bejelentkezés: a bejelentkezést letiltották+ [yahoo] sikertelen bejelentkezés: hibás azonosító vagy jelszó+ [yahoo] közvetlen kapcsolat nem sikerült+ [yahoo] e-mail innen: %s, %s+ [yahoo] kilépés a %s konferenciából+ Offline felhasználótól nem kérhetÅ‘ le a távolléti indok+ %s legutóbbi üzenete+ %s művelet elindítva+ Nincs URL hivatkozás az aktuális szövegben+ nincs külsÅ‘ művelet megadva ehhez: %s+ nincs napló a következÅ‘höz: %s+ %s beállítása megváltozott, betöltés...+ a felhasználó visszajött+ engedélyezés itt: %s+ %s már szerepel a listán+ elÅ‘ször be kell jelentkezni20 +2. e-mail30 +40 +50 +60 +NévjegyElfogadHozzáadCímKorKor: ÃprBiztosan eltávolítja? (%s)Csoport törlése?AugSzerzÅ‘: Távollét automatikus bekapcsolásának idÅ‘tartama (0 - letiltás): 'Nem elérhetÅ‘' automatikus bekapcsolásának idÅ‘tartama (0 - letiltás): Automatikusan belépve a konferenciáraTávolTávollét oka:Háttér/MúltSzülinapMegszakításFolyamatban lévÅ‘ átvitelt nem tudunk megszakítaniKategória: MobilMobiltelefon: MódosítA csatorna témája mostantól: %sCsatorna: Ell.EllenÅ‘rzés gyakorisága: JelszóellenÅ‘rzés: A beírt jelszó ellenÅ‘rzése: Város: Megjegyzésmegjegyzés: CégnévCégnév: Kapcsolódás a szerverhez: %s ...Kapcsolatot hozzáadA konferencián résztvevÅ‘k:Mostani kedv: Jelenleg játszva: Egyéni állapotszöveg:DNDDecAlap Jabber konferencia-kiszolgálóRészlegRészleg: Leírás: RészletZene keresésLeválasztvaKészElÅ‘bb az azonosító adatait kell törölni.E-Mail: E-mail címE-mail: SzerkesztésNincs azonosítási üzenetKódolásSzületési dátum (NN-HH-ÉÉÉÉ): Esemény címzettjeiEseményküldési opciók:sikertelenFaxFax: FebNÅ‘Adataink letöltéseFájltovábbítás állapotaA művelet befejezÅ‘döttKeresztnév: RáérGyakoriságBarátjaTeljes névTovábbítJátékokNemÃltalánosÃltalánosÃltalánosMehetHTTP proxy kiszolgáló neve: Név%s napló, összesen %d eseményOtthonHonlapHonlap: Meg vagyok elégedve az alap %s távolléti okkal: %s %sMeg vagyok elégedve a centerim alap AIM beállításaival %s.Események tiltása innen: %s?TiltólistaBejövÅ‘ %s innen: %sInfoInformáció a következÅ‘rÅ‘l: %sÉrdeklÅ‘dési körLáthatatlanLáthatatlanlistaKonferenciára való hívás...JanBelép/létrehozJúlJúnKulcsszavak: Kirúgva a csatornáról %s által, indok: %sLJNyelvekUtolsó IPUtoljáraVezetéknév: EredményUtolsó loginLinkLink: BetöltésHelyFérfiMárcMájÜzenetÜzenet a kiszolgálótól: Mobil szám:TovábbiKapcsolatokhozNem elérhetÅ‘NévLétrehozandó csoport neve:Név/megnevezés: Név: SohaAz új UIN: %luÚj csoportnév: Új név: Új jelszó: Új adatlap neve: Új keresésKövetkezÅ‘LegközelebbAzonosítóBeállítandó azonosító: Azonosító: Nincs megadvaNovmostElfoglaltOktOfflineOkRégi e-mailCsatornák: OnlineMegnyitCsoportok kezeléseKimenÅ‘ %s ide: %sPING válasz a kiszolgálótól: %d mpA jelszó megadása kötelezÅ‘Jelszó: A megadott jelszavak nem egyeznekPeer-to-peer kaputartomány (port): TelefonTelefon: Csatlakozzon a konferenciámhoz.Beosztás: PostázásTárgy: ElÅ‘zÅ‘Kiadva: RSS doku.Véletlenszerű beszélgetÅ‘partner (Random Chat User)Fogadva: %sVisszautasítEltávolít%s eltávolítása a kapcsolatok közül isA(z) %d kapcsolato(ka)t eltávolítani a kapcsolatok listáról is?ÃtnevezVálasz%s külsÅ‘ művelet eredménye:FogadFogadÚjrapróbálkozás...RománcSMSSMTP szerver: Keresés kész. Keres/HozzáadKapcsolatok keresése..Pasit keresNÅ‘t keresKiválasztCsoport kiválasztásaCélcsoportKapcsolatok hozzáadása a listáhozKüldKapcsolatok elküldése..Kérelem elküldéseElküldve: %sSzeptSzerver: Megye: Cím: TanulókA Jabber azonosító bejegyzése sikeres!A következÅ‘ felhasználók minket a baráti listájukra vettek:Már létezik adatlap ezen a néven. Felülírjuk?A távoli gép ezt használ: %sA megadott könyvtárnév nem létezikA megadott könyvtár nem írhatóA(z) %s (%s) felhasználó hozzáadott a barátai listájához Bejegyzés címe: %s%s nem akar csatlakozni a konferenciához%s meghívja a(z) %s konferenciára, téma: %s%s csatlakozott a konferenciához%s elhagyta a konferenciátA(z) %s felhasználó eltávolított a barátai listájáról Bejegyzés címe: %sMa van a születésnapjaA felhasználó elfogadta az azonosítási kérelmetA felhasználó felvette az azonosítónkat a kapcsolataihoz%s megváltoztatta a nevét, az új név: %sA felhasználó nem adott meg személyes adatokatA felhasználó megtagadta az azonosítási kérelmet. Az üzenet:A felhasználó eltávolított minket a kapcsolati-listájáról ('leiratkozott' rólunk a Jabber szóhasználat szerint)A felhasználó rendszeres értesítést kíván a jelenlétünkrÅ‘lEz a 'LiveJournal' bejegyzések listája. Ezt lehet használniIdÅ‘túllépés az új UIN-ra várakozáskor. Újra?IdÅ‘zónaNévNév: %s bejegyzésének megkezdése a(z) %s hálózatba...UIN: URLURL: URL hivatkozások a szövegbenNem lehet kapcsolódniHasználat: Felhasználói adatokVerzióLáthatólistaEgy pillanat, az adataink letöltése folyamatban vanMunkaHibás becenév, nem lehet regisztrálniElÅ‘bb a szolgáltatóról kell lecsatlakozni!Az adatok frissítéséhez elÅ‘bb be kell jelentkezni az ICQ hálózatba.Az adatok frissítéséhez elÅ‘bb be kell jelentkezni a Jabber hálózatba.Az adatok frissítéséhez elÅ‘bb be kell jelentkezni az MSN hálózatba.Az adataink letöltveIr.számIr.szám: megszakítás[aim] sikertelen kapcsolódáskérésreazonosításTávoltávollét üzenethibás jelszóhibás felhasználónévkékMegszakítvaTöröla kapcsolódás sikertelen%s állapotunk átállítva, most %s, korábban %smegjegyzés: kapcsolatokhálózati foglalat létrehozása nem sikerülta gépnév visszafejtése nem sikerültnem lehet leszednisötétkönyvtárnév a fájlmentéséhez: letiltváltozatlanKészE-mailhibaeseményeseményküldési hiba: kevés paramétereseményküldési hiba: csak az UIN engedélyezett az icq protokolloneseményküldési hiba: ismeretlen IM típuseseményküldési hiba: ismeretlen esemény típusnaplózás elindítvaKülsÅ‘ művelet végrehajtva: %s, visszatérési kód: %dKülsÅ‘ művelet végrehajtva: %s, visszatérési kód: %dfájlnév: fájlnév: Fájlok csak ismerÅ‘sökicq lekapcsolódás okafigyelmen kívül hagyvabejövÅ‘ %s innen: %sKapcsolódásBetöltüzenetmód 1mód 2LefeléFelfelénem elérhetőúj MSN baráti név: nemnincsjelzéskimenÅ‘ %s ide: %sjelszó: új bejegyzések rögzítésére.magánnyilvános (mindenki láthatja)Eltávolítindok: %sa bejegyzés nincs támogatvaMentkeresés: beállítva %s általhálózati problémákhangkártyahangszórókezdésaz állapot megváltoztatása sikertelen:sikeresaz üzenet:turbózásismeretlen IM típusismeretlen állapotkarakterhibás azonosító vagy jelszóa gépnév és kapu ellenÅ‘rzésemunkahibás XMLigenitt operátor vagycenterim-4.22.10/po/centerim.pot0000644000175000001440000016720511473011457013371 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Konstantin Klyagin # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #: src/hooks/jabberhook.cc:2088 #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "" #: src/centerim.cc:174 #, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "" #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "" #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "" #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "" #: src/centerim.cc:1490 msgid "away" msgstr "" #: src/centerim.cc:1490 msgid "n/a" msgstr "" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "" #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "" #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:368 msgid "wrong or tag" msgstr "" #: src/hooks/rsshook.cc:380 msgid "success" msgstr "" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "" #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "" #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "" #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "" #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "" #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "" #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "" #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "" #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "" #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "" #: src/hooks/yahoohook.cc:703 #, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "" #: src/hooks/yahoohook.cc:779 msgid "+ [yahoo] cannot login" msgstr "" #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "" #: src/hooks/yahoohook.cc:791 msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "" #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "" #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "" #: src/hooks/yahoohook.cc:1061 #, c-format msgid "+ [yahoo] system (%s): %s" msgstr "" #: src/hooks/yahoohook.cc:1070 #, c-format msgid "+ [yahoo] fatal error: %s" msgstr "" #: src/hooks/yahoohook.cc:1074 #, c-format msgid "[yahoo] error %s" msgstr "" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "" #: src/hooks/yahoohook.cc:1195 msgid "+ [yahoo] chat_cat_xml" msgstr "" #: src/hooks/yahoohook.cc:1199 msgid "+ [yahoo] chat_join" msgstr "" #: src/hooks/yahoohook.cc:1203 msgid "+ [yahoo] chat_userjoin" msgstr "" #: src/hooks/yahoohook.cc:1207 msgid "+ [yahoo] chat_userleave" msgstr "" #: src/hooks/yahoohook.cc:1211 #, c-format msgid "+ [yahoo] chat_message from %s" msgstr "" #: src/hooks/yahoohook.cc:1257 msgid "+ [yahoo] chat_yahooerror" msgstr "" #: src/hooks/yahoohook.cc:1261 msgid "+ [yahoo] chat_yahoologout" msgstr "" #: src/hooks/yahoohook.cc:1265 msgid "+ [yahoo] yahoo connect" msgstr "" #: src/hooks/yahoohook.cc:1273 #, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 msgid "The user has buzzed you" msgstr "" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, c-format msgid "+ [jab] error %d" msgstr "" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "" #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "" #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] cannot connect" msgstr "" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "" #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "" #: src/hooks/icqhook.cc:1331 #, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "" #: src/hooks/gaduhook.cc:161 msgid "+ [gg] connection failed" msgstr "" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "" #: src/hooks/gaduhook.cc:404 #, c-format msgid "+ [gg] no away message from %s, %s" msgstr "" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "" #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "" #: src/hooks/irchook.cc:1299 msgid "+ [irc] nick password sent" msgstr "" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "" #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "" #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "" #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "" #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "" #: src/hooks/msnhook.cc:905 msgid "+ [msn] cannot connect: " msgstr "" #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "" #: src/icqcontact.cc:853 msgid "Jan" msgstr "" #: src/icqcontact.cc:853 msgid "Feb" msgstr "" #: src/icqcontact.cc:853 msgid "Mar" msgstr "" #: src/icqcontact.cc:853 msgid "Apr" msgstr "" #: src/icqcontact.cc:854 msgid "May" msgstr "" #: src/icqcontact.cc:854 msgid "Jun" msgstr "" #: src/icqcontact.cc:854 msgid "Jul" msgstr "" #: src/icqcontact.cc:854 msgid "Aug" msgstr "" #: src/icqcontact.cc:855 msgid "Sep" msgstr "" #: src/icqcontact.cc:855 msgid "Oct" msgstr "" #: src/icqcontact.cc:855 msgid "Nov" msgstr "" #: src/icqcontact.cc:855 msgid "Dec" msgstr "" #: src/icqgroups.cc:66 msgid "General" msgstr "" #: src/eventmanager.cc:124 #, c-format msgid "event from %s (%s)" msgstr "" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "" #: src/icqdialogs.cc:50 msgid "unknown" msgstr "" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "" #: src/icqdialogs.cc:60 msgid "Games" msgstr "" #: src/icqdialogs.cc:61 msgid "Students" msgstr "" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr "" #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "" #: src/icqdialogs.cc:120 msgid "Load" msgstr "" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr "" #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr "" #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr "" #: src/icqdialogs.cc:299 msgid " Network " msgstr "" #: src/icqdialogs.cc:307 msgid " UIN " msgstr "" #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr "" #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr "" #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr "" #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr "" #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr "" #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr "" #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr "" #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr "" #: src/icqdialogs.cc:332 msgid " Location " msgstr "" #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr "" #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr "" #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr "" #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr "" #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr "" #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr "" #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr "" #: src/icqdialogs.cc:346 msgid " Online only " msgstr "" #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr "" #: src/icqdialogs.cc:357 msgid " Keywords " msgstr "" #: src/icqdialogs.cc:366 msgid " Nickname " msgstr "" #: src/icqdialogs.cc:372 msgid " Search service " msgstr "" #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr "" #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr "" #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr "" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr "" #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr "" #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr "" #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr "" #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr "" #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr "" #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr "" #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr "" #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr "" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr "" #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr "" #: src/icqdialogs.cc:443 msgid " Service " msgstr "" #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "" #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "" #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "" #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "" #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "" #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "" #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "" #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "" #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "" #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "" #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "" #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "" #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "" #: src/icqdialogs.cc:520 msgid "Name: " msgstr "" #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "" #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "" #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "" #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "" #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr "" #: src/icqdialogs.cc:595 msgid " Registration service " msgstr "" #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr "" #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr "" #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr "" #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr "" #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr "" #: src/icqdialogs.cc:639 msgid " Home " msgstr "" #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr "" #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr "" #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr "" #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr "" #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr "" #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr "" #: src/icqdialogs.cc:666 msgid " More " msgstr "" #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr "" #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr "" #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr "" #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr "" #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr "" #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr "" #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr "" #: src/icqdialogs.cc:698 #, c-format msgid " Avatar file : %s " msgstr "" #: src/icqdialogs.cc:709 msgid " About " msgstr "" #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr "" #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr "" #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "" #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "" #: src/icqdialogs.cc:820 msgid "Age: " msgstr "" #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "" #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "" #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "" #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "" #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "" #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "" #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "" #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "" #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr "" #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr "" #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "" #: src/icqdialogs.cc:1067 msgid " Files " msgstr "" #: src/icqdialogs.cc:1068 msgid " Comment " msgstr "" #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "" #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "" #: src/icqdialogs.cc:1163 msgid "None" msgstr "" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 msgid " CenterIM configuration " msgstr "" #: src/icqdialogs.cc:1218 msgid " User interface " msgstr "" #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr "" #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr "" #: src/icqdialogs.cc:1221 msgid " Change default request authorization message " msgstr "" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, c-format msgid " Log panel height : %d " msgstr "" #: src/icqdialogs.cc:1224 #, c-format msgid " Chat panel height : %d " msgstr "" #: src/icqdialogs.cc:1225 #, c-format msgid " Show opened chats : %s " msgstr "" #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr "" #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr "" #: src/icqdialogs.cc:1231 #, c-format msgid " Enable vi bindings: %s " msgstr "" #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr "" #: src/icqdialogs.cc:1241 #, c-format msgid " Switch to language preset : %s " msgstr "" #: src/icqdialogs.cc:1242 #, c-format msgid " Remote charset : %s " msgstr "" #: src/icqdialogs.cc:1243 #, c-format msgid " Local charset : %s " msgstr "" #: src/icqdialogs.cc:1246 #, c-format msgid " For protocols : %s" msgstr "" #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr "" #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr "" #: src/icqdialogs.cc:1251 #, c-format msgid " Sort contacts by : %s " msgstr "" #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr "" #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr "" #: src/icqdialogs.cc:1254 #, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr "" #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr "" #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr "" #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr "" #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr "" #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr "" #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr "" #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr "" #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr "" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, c-format msgid " Color contacts according to: %s " msgstr "" #: src/icqdialogs.cc:1286 msgid " Communications " msgstr "" #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr "" #: src/icqdialogs.cc:1288 #, c-format msgid " HTTP browser : %s " msgstr "" #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr "" #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr "" #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr "" #: src/icqdialogs.cc:1299 msgid " Logging " msgstr "" #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr "" #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr "" #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr "" #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr "" #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr "" #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr "" #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr "" #: src/icqdialogs.cc:1313 #, c-format msgid " Screen socket path : %s " msgstr "" #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "" #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "" #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "" #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "" #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "" #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "" #: src/icqdialogs.cc:1446 msgid "HTTP browser to use: " msgstr "" #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 msgid "Default authorization request message: " msgstr "" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr "" #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "" #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "" #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr "" #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr "" #: src/icqdialogs.cc:1865 msgid "init" msgstr "" #: src/icqdialogs.cc:1866 msgid "start" msgstr "" #: src/icqdialogs.cc:1867 msgid "work" msgstr "" #: src/icqdialogs.cc:1868 msgid "done" msgstr "" #: src/icqdialogs.cc:1869 msgid "err" msgstr "" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "" #: src/icqdialogs.cc:1877 msgid " of " msgstr "" #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "" #: src/icqdialogs.cc:2023 msgid "private" msgstr "" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr "" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr "" #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr "" #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr "" #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr "" #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr "" #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr "" #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr "" #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr "" #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "" #: src/icqdialogs.cc:2068 #, c-format msgid " Tags : %s " msgstr "" #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr "" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr "" #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr "" #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr "" #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "" #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "" #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "" #: src/icqdialogs.cc:2128 msgid "pgp key quick search" msgstr "" #: src/icqdialogs.cc:2130 #, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr "" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "" #: src/imcontact.cc:114 msgid "Do not disturb" msgstr "" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "" #: src/imcontact.cc:116 msgid "Not available" msgstr "" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "" #: src/imlogger.cc:39 msgid "N/A" msgstr "" #: src/imlogger.cc:49 msgid "message" msgstr "" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "" #: src/imlogger.cc:51 msgid "SMS" msgstr "" #: src/imlogger.cc:52 msgid "authorization" msgstr "" #: src/imlogger.cc:53 msgid "e-mail" msgstr "" #: src/imlogger.cc:54 msgid "notification" msgstr "" #: src/imlogger.cc:55 msgid "contacts" msgstr "" #: src/imlogger.cc:56 msgid "files" msgstr "" #: src/imlogger.cc:57 msgid "event" msgstr "" #: src/imlogger.cc:79 msgid "events log started" msgstr "" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "" #: src/imlogger.cc:123 msgid "ignored" msgstr "" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "" #: src/imlogger.cc:141 #, c-format msgid "%s is now %s, was %s" msgstr "" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr "" #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr "" #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr "" #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr "" #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr "" #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr "" #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr "" #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr "" #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr "" #: src/accountmanager.cc:134 #, c-format msgid " NickServ password (optional) : %s " msgstr "" #: src/accountmanager.cc:141 #, c-format msgid " Request receipts: %s " msgstr "" #: src/accountmanager.cc:146 #, c-format msgid " Send OS info: %s " msgstr "" #: src/accountmanager.cc:150 msgid " Register " msgstr "" #: src/accountmanager.cc:155 #, c-format msgid " OpenPGP key: %s " msgstr "" #: src/accountmanager.cc:160 #, c-format msgid " Key passphrase: %s " msgstr "" #: src/accountmanager.cc:168 msgid " Change nickname " msgstr "" #: src/accountmanager.cc:169 msgid " Update user details " msgstr "" #: src/accountmanager.cc:172 msgid " Set away message " msgstr "" #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr "" #: src/accountmanager.cc:200 msgid " user name: " msgstr "" #: src/accountmanager.cc:205 msgid " uin: " msgstr "" #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr "" #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "" #: src/accountmanager.cc:241 msgid " server address: " msgstr "" #: src/accountmanager.cc:285 msgid " priority: " msgstr "" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr "" #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr "" #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr "" #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr "" #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "" #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "" #: src/imcontroller.cc:108 msgid "Server: " msgstr "" #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "" #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr "" #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "" #: src/imcontroller.cc:144 msgid "Sending request" msgstr "" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "" #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "" #: src/imcontroller.cc:179 msgid "Unable to connect to icq server. Retry?" msgstr "" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "" #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "" #: src/imcontroller.cc:228 msgid "Failed" msgstr "" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "" #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "" #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "" #: src/icqconf.cc:1680 msgid "Usage: " msgstr "" #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr "" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr "" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr "" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr "" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr "" #: src/icqconf.cc:1694 msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr "" #: src/icqconf.cc:1695 msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" #: src/icqconf.cc:1700 msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "" #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "" #: src/imevents.cc:322 msgid "* Authorization : " msgstr "" #: src/imevents.cc:381 msgid "* SMS : " msgstr "" #: src/imevents.cc:517 msgid "* Contacts : " msgstr "" #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 msgid "\" not found" msgstr "" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "" #: src/imotr.cc:122 src/imotr.cc:315 msgid " accountname: " msgstr "" #: src/imotr.cc:123 msgid " protocol: " msgstr "" #: src/imotr.cc:124 msgid " username: " msgstr "" #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 msgid "yes/no" msgstr "" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 msgid " Account: " msgstr "" #: src/imotr.cc:473 msgid " Protocol: " msgstr "" #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 msgid " User: " msgstr "" #: src/imotr.cc:489 msgid " Protocol: " msgstr "" #: src/imotr.cc:490 msgid " Account: " msgstr "" #: src/imotr.cc:495 msgid "Yes" msgstr "" #: src/imotr.cc:495 msgid "No" msgstr "" #: src/imotr.cc:499 msgid " Verified: " msgstr "" #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "" #: src/imotr.cc:588 msgid "Unknown" msgstr "" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "" #: src/icqface.cc:53 msgid "Female" msgstr "" #: src/icqface.cc:56 msgid "Not specified" msgstr "" #: src/icqface.cc:61 msgid "Ok" msgstr "" #: src/icqface.cc:62 msgid "Next" msgstr "" #: src/icqface.cc:63 msgid "Fwd" msgstr "" #: src/icqface.cc:64 msgid "Reply" msgstr "" #: src/icqface.cc:65 msgid "Open" msgstr "" #: src/icqface.cc:66 msgid "Accept" msgstr "" #: src/icqface.cc:67 msgid "Reject" msgstr "" #: src/icqface.cc:68 msgid "User info" msgstr "" #: src/icqface.cc:70 msgid "Prev" msgstr "" #: src/icqface.cc:78 msgid "sound card" msgstr "" #: src/icqface.cc:79 msgid "speaker" msgstr "" #: src/icqface.cc:80 msgid "disable" msgstr "" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "" #: src/icqface.cc:88 msgid "dark" msgstr "" #: src/icqface.cc:89 msgid "blue" msgstr "" #: src/icqface.cc:97 msgid "protocol" msgstr "" #: src/icqface.cc:98 msgid "status" msgstr "" #: src/icqface.cc:118 msgid "mode 1" msgstr "" #: src/icqface.cc:119 msgid "mode 2" msgstr "" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "" #: src/icqface.cc:274 msgid "Send an URL" msgstr "" #: src/icqface.cc:275 msgid " Send an SMS" msgstr "" #: src/icqface.cc:276 msgid "Send contacts" msgstr "" #: src/icqface.cc:277 msgid " Request authorization" msgstr "" #: src/icqface.cc:278 msgid "Edit details" msgstr "" #: src/icqface.cc:279 msgid "Fetch away message" msgstr "" #: src/icqface.cc:280 msgid "Add to list" msgstr "" #: src/icqface.cc:281 msgid "Rename contact" msgstr "" #: src/icqface.cc:282 msgid " Move to group.." msgstr "" #: src/icqface.cc:283 msgid " Ping" msgstr "" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "" #: src/icqface.cc:285 msgid " Send file(s)" msgstr "" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr "" #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr "" #: src/icqface.cc:294 msgid "Channel chat history" msgstr "" #: src/icqface.cc:295 msgid " Remove channel del" msgstr "" #: src/icqface.cc:296 msgid " Join channel" msgstr "" #: src/icqface.cc:297 msgid " Leave channel" msgstr "" #: src/icqface.cc:298 msgid "List nicknames" msgstr "" #: src/icqface.cc:301 msgid "UnBlock channel messages" msgstr "" #: src/icqface.cc:303 msgid "Block channel messages" msgstr "" #: src/icqface.cc:310 msgid "Send a message" msgstr "" #: src/icqface.cc:312 msgid "Event history" msgstr "" #: src/icqface.cc:313 msgid "Remove user" msgstr "" #: src/icqface.cc:314 msgid "User's details" msgstr "" #: src/icqface.cc:315 msgid "External actions.." msgstr "" #: src/icqface.cc:318 msgid "Unset ignore user" msgstr "" #: src/icqface.cc:318 msgid "Ignore user" msgstr "" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 msgid "Force check" msgstr "" #: src/icqface.cc:435 msgid "Change status" msgstr "" #: src/icqface.cc:436 msgid "Go to contact.." msgstr "" #: src/icqface.cc:437 msgid " Accounts.." msgstr "" #: src/icqface.cc:438 msgid " CenterIM config options" msgstr "" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr "" #: src/icqface.cc:444 msgid " Find/add users" msgstr "" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr "" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr "" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr "" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr "" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr "" #: src/icqface.cc:455 msgid "Show offline users" msgstr "" #: src/icqface.cc:457 msgid "Hide offline users" msgstr "" #: src/icqface.cc:460 msgid " Organize contact groups" msgstr "" #: src/icqface.cc:461 msgid " Mass group move.." msgstr "" #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "" #: src/icqface.cc:905 msgid "Message" msgstr "" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "" #: src/icqface.cc:924 msgid "Contact to add" msgstr "" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "" #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 msgid "not used" msgstr "" #: src/icqface.cc:1116 msgid "not found" msgstr "" #: src/icqface.cc:1131 msgid "E-mail" msgstr "" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "" #: src/icqface.cc:1134 msgid "Gender" msgstr "" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "" #: src/icqface.cc:1136 msgid "Age" msgstr "" #: src/icqface.cc:1137 msgid "Languages" msgstr "" #: src/icqface.cc:1138 msgid "Last IP" msgstr "" #: src/icqface.cc:1161 msgid "Last seen" msgstr "" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 msgid "seconds" msgstr "" #: src/icqface.cc:1212 msgid "idle" msgstr "" #: src/icqface.cc:1221 msgid "Server-based contact" msgstr "" #: src/icqface.cc:1226 msgid "Awaiting authorization" msgstr "" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "" #: src/icqface.cc:1258 msgid "Cellular" msgstr "" #: src/icqface.cc:1259 msgid "Timezone" msgstr "" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "" #: src/icqface.cc:1300 msgid "Company" msgstr "" #: src/icqface.cc:1301 msgid "Department" msgstr "" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "" #: src/icqface.cc:1346 msgid "Interests" msgstr "" #: src/icqface.cc:1358 msgid "Background" msgstr "" #: src/icqface.cc:1376 msgid "Handle" msgstr "" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "" #: src/icqface.cc:1378 msgid "Version" msgstr "" #: src/icqface.cc:1379 msgid "Encoding" msgstr "" #: src/icqface.cc:1382 msgid "Link" msgstr "" #: src/icqface.cc:1384 msgid "Frequency" msgstr "" #: src/icqface.cc:1385 msgid "Last check" msgstr "" #: src/icqface.cc:1386 msgid "Next check" msgstr "" #: src/icqface.cc:1387 msgid "Last result" msgstr "" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "" #: src/icqface.cc:1404 msgid "Now" msgstr "" #: src/icqface.cc:1423 msgid "Full name" msgstr "" #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "" #: src/icqface.cc:1456 msgid "Check" msgstr "" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "" #: src/icqface.cc:1456 msgid "LJ" msgstr "" #: src/icqface.cc:1460 msgid "Retreive" msgstr "" #: src/icqface.cc:1466 msgid "Friend of" msgstr "" #: src/icqface.cc:1472 msgid "Home" msgstr "" #: src/icqface.cc:1472 msgid "Work" msgstr "" #: src/icqface.cc:1472 msgid "More" msgstr "" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr "" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr "" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr "" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr "" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr "" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr "" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr "" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr "" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr "" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr "" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr "" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "" #: src/icqface.cc:1953 msgid "Visible list" msgstr "" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "" #: src/icqface.cc:2269 #, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "" #: src/icqface.cc:2272 msgid "contact list quick search" msgstr "" #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "" #: src/icqface.cc:2441 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" #: src/icqface.cc:2442 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" #: src/icqface.cc:2477 #, c-format msgid "Outgoing %s" msgstr "" #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "" #: src/icqface.cc:2670 msgid "file name: " msgstr "" #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "" #: src/icqface.cc:3339 #, c-format msgid "%s search, %s again, %s cancel" msgstr "" #: src/icqface.cc:3348 msgid "search for: " msgstr "" centerim-4.22.10/po/it.gmo0000644000175000001440000002627111473011460012146 00000000000000Þ•À !5I] e6p*§)Òü #A_ y … ¯¾ Ð Ú è ö  + 9C]dt…Œœ¬ ÃÐà 2? U`w–5¦#Ü+2,+_"‹E®ô02c*–ÁÔ$ô,3` s ”Ÿ¥¬°¸¼ÂÆæ ê  +5>O Vw~† Ž˜¸ ¼ ÇÔ Üéî÷þ +<@FJ Q ^lpw| …« ° ºÄÈÌ ÐÚ â îø #49?U lw|… — ¢°´½ÁÉ Ì×Þ ãî  (%NT ]!h"Š"­ÐÕ åðôü& '4'\„аµ ¾ ÉÖ Ûå"ê   "-1 4 ALT¶X!3E L;X'”#¼à÷")2\ y ‡’¢ ³À Ô ß í û  % 1 > $I n u … ” œ ® ¾ Û ë %ü "!>!Z!q! ‚! ! ®!Ï! Ö!Pá!/2"3b"G–"<Þ"+#\G#!¤#MÆ#7$&L$s$G$Õ$&î$.%&D%2k%ž%´% Ó%Þ%ã%ë% ô%þ%& &!&0&N4&Jƒ& Î& Û&å&û&'"'+' 4' >'J'g' k'x'‡' '›'¡'ª'±'º')Ã'í'(( ((((2(9(?(D( M(,X(…( Š( ”(Ÿ(£(§(«( ²( ¼(Æ( Ì(Ö(Þ(â(æ(ü())))6)O)^) g)r) Œ)™)©)­)¶) º)Ä)Ç)Ï)Ø) Ý)è)* * *&*,.*[*d*l*-~*,¬*-Ù*+ + +.+2+ D+"P+)s+2+Ð+×+%Ý+, ,,,$, (,3,!9, [, f, s,,,’, š, ¨,µ,…ŸŒ1œu²$ ?Q8¸ƒo¥%®žª¡M¢·2wLE7Išp¿h‘¤c­º=†¬e'[•~C›4˜T¦¾j»\#3xy/O£FG;-b.„i™¶¨nA—"NB(K«la´À,^µ&`¼W‡ Sr]RP°Š‹_fk±“§½Ž@¹<z‰ 0>’”vˆs¯+t:}{ *g€H–|d ³YU5ZmVX! )‚9q©J6D  1st language : %s 2nd language : %s 3rd language : %s About Age : %s Anti-spam: kill msgs from users not on the list : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Birthdate : %s Cellular phone : %s Change color scheme to : %s Change sound device to : %s Check the password : %s City : %s Comment Communications Company : %s Country : %s Department : %s Details E-Mail : %s E-mail : %s Fax : %s Files Find/add users First name : %s Gender : %s General Hide offline users : %s Home Homepage : %s Last name : %s More Nickname : %s Password : %s Password to set : %s Phone : %s Position : %s Quote a message on reply : %s Registration progress Send file(s) to %s, %lu State : %s Street address : %s UIN : %s View/edit ignore list View/edit visible list Work Zip code : %s ! Correct path or disable screen auto presence change! Screen socket path doesn't exist!! another running copy of centerim detected! cannot connect, free disk space is less than 10k! support for %s was disabled at build time! this may cause problems. pid %lu%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit+ %s has been added to the list+ Set N/A after screen detach+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ cannot fetch away messages being offline+ last msg from %s+ new mail arrived, %d messages+ no URLs within the current context+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ user %s is already on the list2nd e-mailAboutAcceptAddAddressAgeAge: AprAre you sure want to remove %s?AugAuto Away period (0 - disable): Auto N/A period (0 - disable): BirthdateCellularCellular phone: ChangeCheck the password you entered: City: CommentCompanyCompany: Connecting to the server %s ...DecDepartmentDepartment: DetailsDisconnectedDoneE-Mail: E-mailE-mail: EditEnter birthdate (DD-MM-YYYY): Event recipientsFaxFax: FebFemaleFirst name: Free for chatFwdGenderHomeHomepageHomepage: Ignore all events from %s?InfoInterestsInvisibleJanJulJunLanguagesLast IPLast name: Last seenLocationMaleMarMayMobile number: MoreMove to contactsNameNeverNew UIN received, %luNew nickname to show: New searchNextNicknameNickname to set: Nickname: Not specifiedNovOccupiedOctOfflineOkOld e-mailOnlineOpenPassword: Passwords do not matchPhonePhone: Position: RemoveRemove %s from the contact list as well?ReplyRetrieveRetrying..Select a group to add the user toSelect a group to move the user toSelect contacts to add to the listSendSending requestSent on %sSepState: Street address: The specified directory does not existThe specified directory is not writableTimed out waiting for a new uin. Retry?TitleUIN: URLs within the current contextWorkZip codeZip code: away messagebluecomment: darkdirectory to save the file(s) to: disabledon't changefilename: n/anosearch for: sound cardspeakeryesProject-Id-Version: centerim 3.13.3 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2001-07-08 05:03+02:00 Last-Translator: Stéphane Bisinger Language-Team: Italiano Language: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 1° Lingua : %s 2° Lingua : %s 3° Lingua : %s Note Età : %s Anti-spam: elimina i messaggi da utenti non elencati : %s Assente automaticamente (minuti) : %d N/A automaticamente (minuti) : %d Data di nascita : %s Numero cellulare : %s Cambia lo schema dei colori : %s Cambia il dispositivo per il suono : %s Controlla la password : %s Città : %s Commento Comunicazioni Compagnia : %s Paese : %s Dipartimento : %s Dettagli E-Mail : %s E-Mail : %s Fax : %s Files Cerca/Aggiungi utenti Nome : %s Sesso : %s Generale Nascondi gli utenti sconnessi : %s Casa Homepage : %s Cognome : %s Altre Soprannome : %s Password : %s Password da impostare : %s Telefono : %s Posizione : %s Quota il messaggio rispondendo : %s Stato della registrazione Invia il/i file a %s, %lu Stato (Regione) : %s Indirizzo : %s UIN : %s Vedi/Modifica la lista ignorati Vedi/Modifica la lista visibili Work CAP : %s ! Correggere il percorso o disabilitare il cambio automatico di stato con screen! Il percorso alla socket di screen non esiste!! rilevata un'altra copia di centerim in esecuzione! impossibile connettersi, lo spazio libero su disco è inferiore a 10k! il supporto per %s è stato disabilitato alla compilazione! questo potrebbe causare problemi. pid %lu%s opzioni contatto, %s cambia lo stato, %s menu generale, %s/%s finestra prec/succ, %s esci+ %s è stato aggiunto alla lista+ Stato impostato su Non Disponibile dopo aver effettuato il detach di screen+ [%02d:%02d:%02d] è arrivata nuova posta, %d messaggi+ [%s] impostato automaticamente in %s+ [%s] stato ripristinato+ impossibile recuperare il messaggio di away quando non si è connessi+ ultimo messaggio da %s+ è arrivata nuova posta, %d messaggi+ nessun URL all'interno del contesto corrente+ nessuna conversazione salvata per %s+ il file di configurazione %s è stato modificato+ l'utente è tornato+ l'utente %s è già in lista2° e-mailNoteAccettaAggiungiIndirizzoEtàEtà: AprSei sicuro di voler eliminare %s?Ago Intervallo per assumere automaticamente lo stato Assente (0 - disabilitato): Intervallo per assumere automaticamente lo stato N/A (0 - disabilitato): Data nascitaCellulareNumero di cellulare: CambiaControlla la password immessa: Città: CommentoCompagniaCompagnia: Connessione al server %s ...DicDipartimentoDipartimento: DettagliScollegatoFattoE-Mail: E-mailE-Mail: ModificaImmetti la data di nascita (GG-MM-AAAA): Contenitori eventiFaxFax: FebFemminaNome: Disponibile per chatAvantiSessoCasahomepageHomepage: Ignorare tutti gli eventi provenienti da %s?InfoInteressiInvisibileGenLugGiuLingueUltimo IPCognome: VistoPosizioneMaschioMarMagNumero di cellulare: AltreVai ai contattiNomeMaiRicevuto un nuovo UIN, %luNuovo nick da mostrare: Nuova ricercaProssimoSoprannomeSoprannome da impostare: Soprannome: Non specificatoNovOccupatoOttSconnessoOkVecchioConnessoApriPassword: Le password non corrispondonoTelefonoTelefono: Posizione: EliminaRimuovere %s anche dalla lista dei contatti?rispondiScaricaNuovo tentativo..Seleziona il gruppo a cui aggiungere l'utenteSeleziona un gruppo in cui spostare l'utenteSeleziona i contatti da aggiungere alla listaInviaInvio la richiestaInviato su %sSetStato (Regione): Indirizzo: La cartella specificata non esisteLa cartella specificata non è scrivibileIl tempo per registrare l'uin è scaduto. Riprovo?TitoloUIN: URL all'interno del contesto correnteLavoroCAPCAPmessaggio di awayblucommento: scuroCartella in cui salvare i files: disabilitanon cambiarenome file: Non disponibilenocerca: scheda sonoraaltoparlantesìcenterim-4.22.10/po/hu.po0000644000175000001440000025103511473011457012006 00000000000000# CENTERICQ HUNGARIAN TEXTS - CENTERICQ MAGYAR SZÖVEGEI # Copyright (C) 2003 Free Software Foundation, Inc. # Ferenc Veres , 2002. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 2.0.0\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2004-01-12 20:47+0100\n" "Last-Translator: Mihály Gyulai \n" "Language-Team: hungarian \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "jelszó: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "F2/M kapcsolat menü, F3/S állapot, F4/G műveletek, Q kilépés" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Események tiltása innen: %s?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "%s eltávolítása a kapcsolatok közül is" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Biztosan eltávolítja? (%s)" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Új név: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Célcsoport" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ Offline felhasználótól nem kérhetÅ‘ le a távolléti indok" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! a szabad lemezterület 10 kB alatt van, nem lehet csatlakozni" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "távollét üzenet" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "%s támogatása a program futtatása elÅ‘tt le lett tiltva" #: src/centerim.cc:692 src/centerim.cc:747 #, fuzzy, c-format msgid "+ new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] új levél érkezett, %d üzenet" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] új levél érkezett, %d üzenet" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ %s legutóbbi üzenete" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ %s beállítása megváltozott, betöltés..." #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! több centerim is fut" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! ez működési problémákat okozhat. Processz azonosító: %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Mobil szám:" #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "könyvtárnév a fájlmentéséhez: " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "A megadott könyvtár nem írható" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "A megadott könyvtárnév nem létezik" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ nincs napló a következÅ‘höz: %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ %s már szerepel a listán" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Csoport kiválasztása" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s felvéve a listára" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ a felhasználó visszajött" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] visszaállítva" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] automatikusan beállítva %s" #: src/centerim.cc:1490 msgid "away" msgstr "Távol" #: src/centerim.cc:1490 msgid "n/a" msgstr "nem elérhetÅ‘" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! a szabad lemezterület 10 kB alatt van, lecsatlakozás" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! a lemez betelése naplók és beállítások elvesztéséhez vezet" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "Konferenciára való hívás..." #: src/centerim.cc:1772 #, fuzzy msgid "Select contacts to move" msgstr "Kapcsolatok hozzáadása a listához" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "" #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "nem lehet leszedni" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "hibás XML" #: src/hooks/rsshook.cc:353 #, fuzzy msgid "no or tag found" msgstr "nincs tag" #: src/hooks/rsshook.cc:362 #, fuzzy msgid "no or tag found" msgstr "nincs tag" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "hibás tag" #: src/hooks/rsshook.cc:380 msgid "success" msgstr "sikeres" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "Név: " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "Kiadva: " #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "Kategória: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "SzerzÅ‘: " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "Leírás: " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "Link: " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "megjegyzés: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "a gépnév visszafejtése nem sikerült" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "hálózati foglalat létrehozása nem sikerült" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "a gépnév és kapu ellenÅ‘rzése" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] kilépés a %s konferenciából" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "Csatlakozzon a konferenciámhoz." #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Egyéni állapotszöveg:" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] a távolléti ok lekérdezése sikertelen: %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] sikertelen bejelentkezés: hibás azonosító vagy jelszó" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] sikertelen bejelentkezés: hibás azonosító vagy jelszó" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] sikertelen bejelentkezés: a bejelentkezést letiltották" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ engedélyezés itt: %s" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] már van egy kapcsolódás a szerverhez" #: src/hooks/yahoohook.cc:809 #, fuzzy msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] hiba: %s" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "%s meghívja a(z) %s konferenciára, téma: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "A konferencián résztvevÅ‘k:" #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Automatikusan belépve a konferenciára" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "%s nem akar csatlakozni a konferenciához" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "%s csatlakozott a konferenciához" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "%s elhagyta a konferenciát" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "A felhasználó felvette az azonosítónkat a kapcsolataihoz" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "az üzenet:" #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] e-mail innen: %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] rendszer: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] hiba: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] hiba: %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] közvetlen kapcsolat nem sikerült" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] hiba: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] hiba: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] hiba: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "Ma van a születésnapja" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] nem lehet kapcsolódni a szerverhez" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] eltávolítás a %s regisztrációból" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Távollét oka:" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] nincs távolléti ok: %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "Hibás becenév, nem lehet regisztrálni" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "Nem lehet kapcsolódni" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "A távoli gép ezt használ: %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "Alap Jabber konferencia-kiszolgáló" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, fuzzy, c-format msgid "+ [jab] error %d" msgstr "+ [jab] hiba %d: %s" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] hiba %d: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "A felhasználó rendszeres értesítést kíván a jelenlétünkrÅ‘l" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" "A felhasználó eltávolított minket a kapcsolati-listájáról ('leiratkozott' " "rólunk a Jabber szóhasználat szerint)" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] nem lehet kapcsolódni a szerverhez" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "Meg vagyok elégedve a centerim alap AIM beállításaival %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "[aim] sikertelen kapcsolódás" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] sikertelen kapcsolódás: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "A felhasználó nem adott meg személyes adatokat" #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] jelszó elküldve" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "kérésre" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "hálózati problémák" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "hibás felhasználónév" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "turbózás" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "hibás jelszó" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "hibás azonosító vagy jelszó" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] lekapcsolódva" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "icq lekapcsolódás oka" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "A felhasználó elfogadta az azonosítási kérelmet" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "A felhasználó megtagadta az azonosítási kérelmet. Az üzenet:" #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] sikertelen SMS ide: %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] sikertelen SMS ide: %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] a távolléti ok lekérdezése sikertelen innen: %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Véletlenszerű beszélgetÅ‘partner (Random Chat User)" #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ [lj] kapcsolódás a szerverhez" #: src/hooks/gaduhook.cc:164 #, fuzzy, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [irc] sikertelen kapcsolódás: %s" #: src/hooks/gaduhook.cc:218 #, fuzzy msgid "+ [gg] connection to the server failed" msgstr "+ [lj] kapcsolódás a szerverhez" #: src/hooks/gaduhook.cc:291 #, fuzzy msgid "+ [gg] connection lost" msgstr "+ [lj] kapcsolódás a szerverhez" #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [jab] nincs távolléti ok: %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] a kapcsolódás a szerverhez sikertelen" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] sikertelen kapcsolódás: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] az azonosító megváltoztatva" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Csatornák: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Kirúgva a csatornáról %s által, indok: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "%s megváltoztatta a nevét, az új név: %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] jelszó elküldve" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] jelszó elküldve" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "PING válasz a kiszolgálótól: %d mp" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s belépett" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s kilépett" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "indok: %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s kirúgva %s által" #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "A csatorna témája mostantól: %s" #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "beállítva %s által" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s felvéve az op-listára %s által" #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s levéve az op-listáról %s által" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s felvett minket az op-listára" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "itt operátor vagy" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s megszüntette az op-státusunkat" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] felhasználó keresés vége" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "a kapcsolódás sikertelen" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] HTTP hiba: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "Üzenet a kiszolgálótól: " #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] sikertelen bejelentkezés: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] sikeres küldés. Azonosító: %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] küldési hiba: %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "A(z) %s (%s) felhasználó hozzáadott a barátai listájához\n" "\n" "Bejegyzés címe: %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "A(z) %s felhasználó eltávolított a barátai listájáról\n" "\n" "Bejegyzés címe: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] hiba barát törlésekor" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] a felhasználót eltávolítottuk a barátok listájáról" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] nem lehet barátot hozzáadni" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s felvéve a listára" #: src/hooks/msnhook.cc:430 #, fuzzy, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [yahoo] névsor leszedése kész, %d darab" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "" #: src/hooks/msnhook.cc:799 #, fuzzy, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [yahoo] e-mail innen: %s, %s" #: src/hooks/msnhook.cc:905 #, fuzzy msgid "+ [msn] cannot connect: " msgstr "+ [yahoo] a kapcsolódás sikertelen: " #: src/hooks/msnhook.cc:929 #, fuzzy msgid "verify the hostname and port" msgstr "a gépnév és kapu ellenÅ‘rzése" #: src/hooks/abstracthook.cc:355 #, fuzzy msgid "connecting to the server" msgstr "+ [lj] kapcsolódás a szerverhez" #: src/hooks/abstracthook.cc:356 #, fuzzy msgid "logged in" msgstr "+ [lj] bejelentkezve" #: src/hooks/abstracthook.cc:357 #, fuzzy, c-format msgid "search finished, %d found" msgstr "+ [icq] a keresés befejezÅ‘dött, %d találat van" #: src/hooks/abstracthook.cc:358 #, fuzzy msgid "password was changed successfully" msgstr "+ [icq] a jelszóváltoztatás rendben" #: src/hooks/abstracthook.cc:359 #, fuzzy msgid "disconnected" msgstr "Leválasztva" #: src/hooks/abstracthook.cc:360 #, fuzzy, c-format msgid "adding %s to the contacts" msgstr "+ [aim] %s hozzáadása a kapcsolatokhoz" #: src/hooks/abstracthook.cc:361 #, fuzzy, c-format msgid "removing %s from the contacts" msgstr "+ [aim] %s eltávolítása a kapcsolatok közül" #: src/hooks/abstracthook.cc:362 #, fuzzy, c-format msgid "members list fetching finished, %d found" msgstr "+ [yahoo] névsor leszedése kész, %d darab" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "Ma van a születésnapja" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Jan" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Feb" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Márc" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Ãpr" #: src/icqcontact.cc:854 msgid "May" msgstr "Máj" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Jún" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Júl" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Aug" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Szept" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Okt" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Nov" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Dec" #: src/icqgroups.cc:66 msgid "General" msgstr "Ãltalános" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Elküldve: %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60 +" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "ismeretlen IM típus" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Ãltalános" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Románc" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Játékok" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Tanulók" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "20 +" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "30 +" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "40 +" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50 +" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "NÅ‘t keres" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Pasit keres" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Név" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr "Adatlap keresés" #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Eltávolít" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Betöltés" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ elÅ‘ször be kell jelentkezni" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "Betölt" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "Ment" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "Töröl" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Módosít" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Keres/Hozzáad" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "Belép/létrehoz" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "Kapcsolódás" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Felhasználó keresés, hozzáadás " #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " Csatorna/konferencia belépés/létrehozás " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " RSS csatorna megadása " #: src/icqdialogs.cc:299 msgid " Network " msgstr " Hálózat " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Részlet " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Azonosító : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Keresztnév : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Vezetéknév : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Korhatár : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Nem : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Nyelv : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " Hely " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Város : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Megye : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Ország : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Munka " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Cégnév : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Részleg : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Beosztás : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Csak online " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Véletlenszerű csoport " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Kulcsszó " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Azonosító " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " Szolgáltatás keresés " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Adatlap keresés " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " Csatornaparaméterek " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " XML export URL : %s" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " EllenÅ‘rzés gyakorisága (perc): %lu " #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Csatorna : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Név : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " Az utolsó ellenÅ‘rzés óta lépett be " #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " Kulcsszavak: %s " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " Opciók " #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " Csak fényképes felhasználók : %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " Csak online: %s " #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Azok a felhasználók, akiknél szereplünk a kapcsolatai között" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Név/megnevezés " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Jelszó " #: src/icqdialogs.cc:443 msgid " Service " msgstr " Szolgáltatás " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Új adatlap neve: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "Már létezik adatlap ezen a néven. Felülírjuk?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Azonosító: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Név/megnevezés: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-Mail: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Keresztnév: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Vezetéknév: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Város: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Megye: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Cégnév: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Részleg: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Beosztás: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Csatorna: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Név: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Kulcsszavak: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Jelszó: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "URL: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "EllenÅ‘rzés gyakorisága: " #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Ãltalános " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " Regisztráció " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Regisztrációs paraméterek " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " Jelszó módosítás: %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Szülinap : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Kor : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Otthon " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Cím : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Irányítószám : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefon : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Mobiltelefon : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Honlap : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " További adatok " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1. nyelv : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2. nyelv : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3. nyelv : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Egyéb " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Web állapotjelzÅ‘ engedélyezése: %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Véletlenszerű csoport : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Azonosítás szükséges: %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Megye : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " Névjegy " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Adataink letöltése" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " %s adataink " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: adatai " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Kész" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Egy pillanat, az adataink letöltése folyamatban van" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-mail: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Születési dátum (NN-HH-ÉÉÉÉ): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Kor: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Cím: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "Ir.szám: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefon: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Mobiltelefon: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Honlap: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Névjegy" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "Új jelszó: " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "JelszóellenÅ‘rzés: " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "nincs" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X mentés, Esc mégsem] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Fájl(ok) küldése ide: %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Hozzáad" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Megjegyzés" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Küld" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Fájlok " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Megjegyzés " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "fájlnév: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "megjegyzés: " #: src/icqdialogs.cc:1163 #, fuzzy msgid "None" msgstr "Kész" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "" #: src/icqdialogs.cc:1165 #, fuzzy msgid "Polish" msgstr "Postázás" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " centerim beállítások " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Felhasználói felület " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Hangeszköz : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Színbeállítás: %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr " Azonosítás kérése" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Karakterkészlet : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " Csatorna : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Kapcsolatok csoportokba rendezése: %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Kétirányú nyelvtámogatás: %s " #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Emacs gombok engedélyezése a szerkesztÅ‘ben: %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " Emacs gombok engedélyezése a szerkesztÅ‘ben: %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr "" #: src/icqdialogs.cc:1241 #, fuzzy, c-format msgid " Switch to language preset : %s " msgstr " 1. nyelv : %s " #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Karakterkészlet : %s " #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Karakterkészlet : %s " #: src/icqdialogs.cc:1246 #, fuzzy, c-format msgid " For protocols : %s" msgstr " Minden protokoll" #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Kapcsolatok " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Kapcsolatok csoportokba rendezése: %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Kapcsolatok csoportokba rendezése: %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Offline felhasználók elrejtése : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-spam: üzenet tiltása a listán nem szereplÅ‘ktÅ‘l: %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Azonosítás szükséges: %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Üzenetet idézni a válasznál : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Helyi postaláda figyelése : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Jelszavak megjegyzése : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Ãllapotváltás esetén az indok szerkesztése : %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Üzenetmód : %s " #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " Az Enter gombbal elküldjük az üzenetet : %s " #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Üzenetmód : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " Az Enter gombbal elküldjük az üzenetet: %s " #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " Kapcsolatok csoportokba rendezése: %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Kapcsolódások " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " LevelezÅ‘ SMTP szerver : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " HTTP proxy kiszolgáló : %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " HTTP proxy kiszolgáló : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Peer-to-peer kapcsolat engedélyezése: %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " Peer-to-peer kapcsolathoz kapuk tartománya : %s " #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " Naplózás " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " IdÅ‘bélyeg a napló-ablakban: %s " #: src/icqdialogs.cc:1301 #, fuzzy, c-format msgid " Timestamps include seconds : %s " msgstr " IdÅ‘bélyeg a napló-ablakban: %s " #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " Online/offline események a naplóban: %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Részletes naplózás a ~/.centerim/log fájlban: %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Távollét automatikus beállítása (perc után) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " 'Nem elérhetÅ‘' automatikus beállítása (perc) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " 'Nem elérhetÅ‘' automatikus beállítása (perc) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Cím : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Távollét automatikus bekapcsolásának idÅ‘tartama (0 - letiltás): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "'Nem elérhetÅ‘' automatikus bekapcsolásának idÅ‘tartama (0 - letiltás): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "SMTP szerver: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "Peer-to-peer kaputartomány (port): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "HTTP proxy kiszolgáló neve: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "" #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "HTTP proxy kiszolgáló neve: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Nincs azonosítási üzenet" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Az adataink letöltve" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Csoportok kezelése" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Ãtnevez" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "Eltávolít" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "Felfelé" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "Lefelé" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Kiválaszt" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Csoportok " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Létrehozandó csoport neve:" #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Új csoportnév: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Csoport törlése?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Fájltovábbítás állapota" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Megszakítás" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " BejövÅ‘ innen: %s" #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " KimenÅ‘ ide: %s" #: src/icqdialogs.cc:1865 msgid "init" msgstr "" #: src/icqdialogs.cc:1866 msgid "start" msgstr "kezdés" #: src/icqdialogs.cc:1867 msgid "work" msgstr "munka" #: src/icqdialogs.cc:1868 msgid "done" msgstr "Kész" #: src/icqdialogs.cc:1869 msgid "err" msgstr "hiba" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "megszakítás" #: src/icqdialogs.cc:1877 msgid " of " msgstr "" #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "Folyamatban lévÅ‘ átvitelt nem tudunk megszakítani" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "nyilvános (mindenki láthatja)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "magán" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "csak ismerÅ‘sök" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr "" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "Zene keresés" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "Postázás" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Megszakítva" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " Bejegyzés küldése: %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " Tárgy : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " Biztonság : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " Egyéb " #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " Kedv : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(nincs/egyéni)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " Egyéni kedv: %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " Zene : %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " Kép : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(alap)" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Kor : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " Auto-formázás kikapcsolása: %s " #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " Email üzenetek kikapcsolása: %s " #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " Megjegyzés kikapcsolása: %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " Visszadátumozott bejegyzés: %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "Tárgy: " #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "Jelenleg játszva: " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "Mostani kedv: " #: src/icqdialogs.cc:2094 #, fuzzy msgid "Tags for the entry: " msgstr "Üzenet a kiszolgálótól: " #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr " Kapcsolatok " #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "Keresés: Alt-S újra keres, Enter befejez" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 #, fuzzy msgid " Use no key" msgstr "Felhasználói adatok" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "KülsÅ‘ művelet végrehajtva: %s, visszatérési kód: %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "KülsÅ‘ művelet végrehajtva: %s, visszatérési kód: %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Offline" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Online" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Láthatatlan" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Ráér" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Ne zavarjanak" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Elfoglalt" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] Nem vagyok elérhetÅ‘" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "Távol" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "DND" #: src/imlogger.cc:39 msgid "N/A" msgstr "Nem elérhetÅ‘" #: src/imlogger.cc:49 msgid "message" msgstr "üzenet" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "azonosítás" #: src/imlogger.cc:53 msgid "e-mail" msgstr "E-mail" #: src/imlogger.cc:54 msgid "notification" msgstr "jelzés" #: src/imlogger.cc:55 msgid "contacts" msgstr "kapcsolatok" #: src/imlogger.cc:56 msgid "files" msgstr " Fájlok " #: src/imlogger.cc:57 msgid "event" msgstr "esemény" #: src/imlogger.cc:79 msgid "events log started" msgstr "naplózás elindítva" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "kimenÅ‘ %s ide: %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "bejövÅ‘ %s innen: %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "figyelmen kívül hagyva" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s kilépett" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "%s ide: %s, küldve: %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s belépett, állapota: %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s kilépett" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "%s állapotunk átállítva, most %s, korábban %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " IM felhasználókezelÅ‘" #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Szerver : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " Biztonságos : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Azonosító : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Jelszó (nem kötelezÅ‘) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Jelszó : %s " #: src/accountmanager.cc:124 #, fuzzy, c-format msgid " Priority : %s " msgstr " Város : %s " #: src/accountmanager.cc:129 #, fuzzy, c-format msgid " Import friend list : %s " msgstr " Részleg : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Jelszó (nem kötelezÅ‘) : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " Kapcsolatok csoportokba rendezése: %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Kapcsolatok csoportokba rendezése: %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " Bejegyzés " #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Nem : %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Kulcsszavak: %s " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " Azonosító módosítása " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Adatok frissítése" #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Távollét oka" #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Elvet" #: src/accountmanager.cc:200 msgid " user name: " msgstr " felhasználónév:" #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " jelszó: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "ElÅ‘bb az azonosító adatait kell törölni." #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "ElÅ‘bb a szolgáltatóról kell lecsatlakozni!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " szerver címe: " #: src/accountmanager.cc:285 msgid " priority: " msgstr " elsÅ‘bbség: " #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " Bejegyzés a(z) %s hálózatba " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Mehet" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Beállítandó jelszó : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " JelszóellenÅ‘rzés : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Használandó szerver: %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "A beírt jelszó ellenÅ‘rzése: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Beállítandó azonosító: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Szerver: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "A megadott jelszavak nem egyeznek" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "A jelszó megadása kötelezÅ‘" #: src/imcontroller.cc:118 #, fuzzy msgid "Password must be at least 6 chars long" msgstr "A jelszó megadása kötelezÅ‘" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " A bejegyzés folyamatban van " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Kapcsolódás a szerverhez: %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Kérelem elküldése" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "IdÅ‘túllépés az új UIN-ra várakozáskor. Újra?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Újrapróbálkozás..." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Az új UIN: %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Leválasztva" #: src/imcontroller.cc:179 #, fuzzy msgid "Unable to connect to icq server. Retry?" msgstr "Kapcsolódás az ICQ szerverhez sikertelen. Újra?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "%s bejegyzésének megkezdése a(z) %s hálózatba..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "A Jabber azonosító bejegyzése sikeres!" #: src/imcontroller.cc:228 msgid "Failed" msgstr "sikertelen" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Az adatok frissítéséhez elÅ‘bb be kell jelentkezni az ICQ hálózatba." #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "új MSN baráti név: " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "Az adatok frissítéséhez elÅ‘bb be kell jelentkezni az MSN hálózatba." #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "Az adatok frissítéséhez elÅ‘bb be kell jelentkezni a Jabber hálózatba." #: src/imcontroller.cc:318 #, fuzzy msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "Az adatok frissítéséhez elÅ‘bb be kell jelentkezni a Jabber hálózatba." #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "a bejegyzés nincs támogatva" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "Meg vagyok elégedve az alap %s távolléti okkal: %s %s" #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ %s művelet elindítva" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "eseményküldési hiba: kevés paraméter" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "eseményküldési hiba: csak az UIN engedélyezett az icq protokollon" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "eseményküldési hiba: ismeretlen IM típus" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "eseményküldési hiba: ismeretlen esemény típus" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s %s részére bekerült a pufferbe" #: src/icqconf.cc:1616 #, fuzzy msgid "event sending error: error creating directory for the contact" msgstr "eseményküldési hiba: kevés paraméter" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "ismeretlen állapotkarakter" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "ismeretlen IM típus" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "az állapot megváltoztatása sikertelen:" #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Használat: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "Ãltalános" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " --ascii, -a ASCII karakterek használata ablakok és egyebek " "beállításához" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b <útvonal> alapkönyvtár megadása" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B helyi IP cím hozzárendelés" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help megjelenik ez a szöveg" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v a program verziójának kiírása" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Eseményküldési opciók:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr "" " -s, --send az eseménytípus lehet: üzenet, SMS vagy URL" #: src/icqconf.cc:1694 #, fuzzy msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr " -S, --status <állapot> IM állapot módosítása" #: src/icqconf.cc:1695 #, fuzzy msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto protokol típus; lehet ICQ, YAHOO, AIM,IRC, JABBER " "vagy lj" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr " -t, --to a protokolltól függÅ‘en UIN vagy név" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr " -n, --number eseményközlés céljaként megadott mobilszám" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Hibák jelentése angolul ide: http://bugzilla.centerim.org." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Nincs azonosítási üzenet" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* Azonosítási kérelem : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* Azonosítás : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Kapcsolatok : " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* Fájl továbbítás" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "nincs tag" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Info" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " IM felhasználókezelÅ‘" #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " Minden protokoll" #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " felhasználónév:" #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "igen" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "nem" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "igen" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Azonosítók" #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " Minden protokoll" #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Használat: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " Minden protokoll" #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Azonosítók" #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "igen" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "Nov" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " Szolgáltatás " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 #, fuzzy msgid "No Jabber" msgstr " [jab] Jabber" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "A művelet befejezÅ‘dött" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "ismeretlen IM típus" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Férfi" #: src/icqface.cc:53 msgid "Female" msgstr "NÅ‘" #: src/icqface.cc:56 msgid "Not specified" msgstr "Nincs megadva" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "KövetkezÅ‘" #: src/icqface.cc:63 msgid "Fwd" msgstr "Továbbít" #: src/icqface.cc:64 msgid "Reply" msgstr "Válasz" #: src/icqface.cc:65 msgid "Open" msgstr "Megnyit" #: src/icqface.cc:66 msgid "Accept" msgstr "Elfogad" #: src/icqface.cc:67 msgid "Reject" msgstr "Visszautasít" #: src/icqface.cc:68 msgid "User info" msgstr "Felhasználói adatok" #: src/icqface.cc:70 msgid "Prev" msgstr "ElÅ‘zÅ‘" #: src/icqface.cc:78 msgid "sound card" msgstr "hangkártya" #: src/icqface.cc:79 msgid "speaker" msgstr "hangszóró" #: src/icqface.cc:80 msgid "disable" msgstr "letilt" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "változatlan" #: src/icqface.cc:88 msgid "dark" msgstr "sötét" #: src/icqface.cc:89 msgid "blue" msgstr "kék" #: src/icqface.cc:97 #, fuzzy msgid "protocol" msgstr " Minden protokoll" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "kezdés" #: src/icqface.cc:118 msgid "mode 1" msgstr "mód 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "mód 2" #: src/icqface.cc:249 #, fuzzy, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "centerim %s NEM ELKÜLDÖTT: %lu" #: src/icqface.cc:274 #, fuzzy msgid "Send an URL" msgstr " SMS küldése" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " SMS küldése" #: src/icqface.cc:276 #, fuzzy msgid "Send contacts" msgstr "Kapcsolatok elküldése.." #: src/icqface.cc:277 msgid " Request authorization" msgstr " Azonosítás kérése" #: src/icqface.cc:278 #, fuzzy msgid "Edit details" msgstr " Részlet " #: src/icqface.cc:279 #, fuzzy msgid "Fetch away message" msgstr " Távollét oka f" #: src/icqface.cc:280 #, fuzzy msgid "Add to list" msgstr " Hozzáadás a listához a" #: src/icqface.cc:281 #, fuzzy msgid "Rename contact" msgstr " Ãtnevez r" #: src/icqface.cc:282 msgid " Move to group.." msgstr " Ãthelyezés csoportba.." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 #, fuzzy msgid "Fetch version info" msgstr " Verzió lekérdezése v" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " Fájl(ok) küldése" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " Konferenciára hívás.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Csatornaüzenet küldése Enter" #: src/icqface.cc:294 #, fuzzy msgid "Channel chat history" msgstr " Csatorna eseménynapló h" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Csatorna eltávolítása Del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Belépés szobába" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Kilépés szobából" #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Vezetéknév: " #: src/icqface.cc:301 #, fuzzy msgid "UnBlock channel messages" msgstr " " #: src/icqface.cc:303 #, fuzzy msgid "Block channel messages" msgstr " " #: src/icqface.cc:310 #, fuzzy msgid "Send a message" msgstr " Távollét oka" #: src/icqface.cc:312 #, fuzzy msgid "Event history" msgstr " Eseménynapló h" #: src/icqface.cc:313 #, fuzzy msgid "Remove user" msgstr "Eltávolít" #: src/icqface.cc:314 #, fuzzy msgid "User's details" msgstr " Felhasználó adatai ?" #: src/icqface.cc:315 #, fuzzy msgid "External actions.." msgstr " KülsÅ‘ művelet F6" #: src/icqface.cc:318 #, fuzzy msgid "Unset ignore user" msgstr " Felhasználó tiltás/ki i" #: src/icqface.cc:318 #, fuzzy msgid "Ignore user" msgstr "Tiltólista" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 #, fuzzy msgid "Force check" msgstr " Lekérdezés most" #: src/icqface.cc:435 #, fuzzy msgid "Change status" msgstr "Módosít" #: src/icqface.cc:436 #, fuzzy msgid "Go to contact.." msgstr "Kapcsolatokhoz" #: src/icqface.cc:437 msgid " Accounts.." msgstr " Azonosítók" #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " centerim beállítások" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Fájltovábbítás figyelése" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Felhasználó keresés/hozzáadás" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " Belépés szobába/konferenciára" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " RSS csatorna megadása" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Tiltólista szerkesztése" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Láthatatlanok listájának szerkesztése" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Láthatók listájának szerkesztése" #: src/icqface.cc:455 #, fuzzy msgid "Show offline users" msgstr " Offline felhasználók elrejtése : %s " #: src/icqface.cc:457 #, fuzzy msgid "Hide offline users" msgstr " Offline felhasználók elrejtése : %s " #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " Csoportok kezelése" #: src/icqface.cc:461 msgid " Mass group move.." msgstr "" #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Részlet" #: src/icqface.cc:905 msgid "Message" msgstr "Üzenet" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Új keresés" #: src/icqface.cc:924 msgid "Contact to add" msgstr "Kapcsolatot hozzáad" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Kapcsolatok keresése.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Keresés kész. " #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Információ a következÅ‘rÅ‘l: %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Azonosító" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "Ez a 'LiveJournal' bejegyzések listája. Ezt lehet használni" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "új bejegyzések rögzítésére." #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "A következÅ‘ felhasználók minket a baráti listájukra vettek:" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr "Tiltólista" #: src/icqface.cc:1116 #, fuzzy msgid "not found" msgstr "nincs tag" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail cím" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2. e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Régi e-mail" #: src/icqface.cc:1134 msgid "Gender" msgstr "Nem" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Szülinap" #: src/icqface.cc:1136 msgid "Age" msgstr "Kor" #: src/icqface.cc:1137 msgid "Languages" msgstr "Nyelvek" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Utolsó IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Utolsó login" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Soha" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "Küld" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr " Fájlok " #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Kapcsolatok elküldése.." #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "azonosítás" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Cím" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Hely" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "Ir.szám" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefon" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Mobil" #: src/icqface.cc:1259 msgid "Timezone" msgstr "IdÅ‘zóna" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Honlap" #: src/icqface.cc:1300 msgid "Company" msgstr "Cégnév" #: src/icqface.cc:1301 msgid "Department" msgstr "Részleg" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Név" #: src/icqface.cc:1346 msgid "Interests" msgstr "ÉrdeklÅ‘dési kör" #: src/icqface.cc:1358 msgid "Background" msgstr "Háttér/Múlt" #: src/icqface.cc:1376 msgid "Handle" msgstr "Név" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "RSS doku." #: src/icqface.cc:1378 msgid "Version" msgstr "Verzió" #: src/icqface.cc:1379 msgid "Encoding" msgstr "Kódolás" #: src/icqface.cc:1382 msgid "Link" msgstr "Link" #: src/icqface.cc:1384 msgid "Frequency" msgstr "Gyakoriság" #: src/icqface.cc:1385 msgid "Last check" msgstr "Utoljára" #: src/icqface.cc:1386 msgid "Next check" msgstr "Legközelebb" #: src/icqface.cc:1387 msgid "Last result" msgstr "Eredmény" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu perc" #: src/icqface.cc:1404 msgid "Now" msgstr "most" #: src/icqface.cc:1423 msgid "Full name" msgstr "Teljes név" #: src/icqface.cc:1442 #, fuzzy, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "F2 URL, F6 külsÅ‘ művelet, Esc mégsem" #: src/icqface.cc:1447 #, fuzzy, c-format msgid "user info for %s" msgstr "Felhasználói adatok" #: src/icqface.cc:1456 msgid "Check" msgstr "Ell." #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Szerkesztés" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "Fogad" #: src/icqface.cc:1466 msgid "Friend of" msgstr "Barátja" #: src/icqface.cc:1472 msgid "Home" msgstr "Otthon" #: src/icqface.cc:1472 msgid "Work" msgstr "Munka" #: src/icqface.cc:1472 msgid "More" msgstr "További" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Fogad" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] ICQ hálózat" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr " Minden protokoll" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr " már bejelentkezve" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " vagy : jóváhagy, : mégse" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " : jóváhagy, : mégse" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Kapcsolatokhoz" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Tiltólista" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Láthatólista" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Láthatatlanlista" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Kapcsolatok hozzáadása a listához" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "A(z) %d kapcsolato(ka)t eltávolítani a kapcsolatok listáról is?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Esemény címzettjei" #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "Keresés: Alt-S újra keres, Enter befejez" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr " Kapcsolatok " #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ Nincs URL hivatkozás az aktuális szövegben" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URL hivatkozások a szövegben" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ nincs külsÅ‘ művelet megadva ehhez: %s" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "%s külsÅ‘ művelet eredménye:" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "^X küldés, ^P többeknek, ^O napló, F2 URL, F9 kifejt, Alt-? tagok, ESC mégsem" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "^X küldés, ^P többeknek, ^O napló, F2 URL, F9 kifejt, Alt-? részletek, ESC " "mégsem" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr " KimenÅ‘ ide: %s" #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Kapcsolatok elküldése.." #: src/icqface.cc:2670 msgid "file name: " msgstr "fájlnév: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "KimenÅ‘ %s ide: %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Elküldve: %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "BejövÅ‘ %s innen: %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Fogadva: %s" #: src/icqface.cc:3182 #, fuzzy, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "F2 URL, F9 teljes képernyÅ‘, Esc mégsem" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s innen: %s, érkezett: %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s ide: %s, küldve: %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "%s napló, összesen %d esemény" #: src/icqface.cc:3339 #, fuzzy, c-format msgid "%s search, %s again, %s cancel" msgstr "/ keresés, N újra, Esc mégsem" #: src/icqface.cc:3348 msgid "search for: " msgstr "keresés: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] rendszer: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] e-mail innen: %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s belépett, állapot: %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s állapota megváltozott: %s volt, most pedig %s" #~ msgid " [o] Online" #~ msgstr " [o] Online vagyok" #~ msgid " [_] Offline" #~ msgstr " [_] Offline vagyok" #~ msgid " [a] Away" #~ msgstr " [a] Távol vagyok" #~ msgid " [c] Occupied" #~ msgstr " [c] El vagyok foglalva" #~ msgid " [f] Free for chat" #~ msgstr " [f] Ráérek" #~ msgid " [i] Invisible" #~ msgstr " [i] Láthatatlan maradok" #~ msgid "+ [irc] password was requested, but it's not set" #~ msgstr "+ [irc] jelszó szükséges, de nincs beállítva" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " JelszóellenÅ‘rzés : %s " #, fuzzy #~ msgid " Convert from : %s " #~ msgstr " Ország : %s " #, fuzzy #~ msgid " Convert to : %s " #~ msgstr " Ország : %s " #~ msgid "Your friendly nickname has been changed to %s" #~ msgstr "A baráti név sikeresen módosult erre: %s" #~ msgid "already logged" #~ msgstr "már bejelentkezve" #~ msgid "" #~ "event sending error: the destination contact doesn't exist on your list" #~ msgstr "eseményküldési hiba: a címzett nem szerepel a kapcsolatok között" #, fuzzy #~ msgid "URLs, " #~ msgstr "URL: " #, fuzzy #~ msgid " details, " #~ msgstr " Részlet " #, fuzzy #~ msgid " cancel" #~ msgstr "Megszakítás" #, fuzzy #~ msgid "search, " #~ msgstr "keresés: " #, fuzzy #~ msgid " esc cancel" #~ msgstr " Kilépés szobából" #, fuzzy #~ msgid "contact menu, " #~ msgstr "kapcsolatok" #, fuzzy #~ msgid "change status, " #~ msgstr "%s állapota megváltozott: %s volt, most pedig %s" #, fuzzy #~ msgid "general actions, " #~ msgstr "Ãltalános" #~ msgid " Store contact list server-side : %s " #~ msgstr " Kapcsolatok tárolása a szerveren: %s " #~ msgid " Send an URL u" #~ msgstr " URL küldése u" #~ msgid " Send contacts c" #~ msgstr " Kapcsolatok küldése c" #~ msgid " Edit details e" #~ msgstr " Adatok szerkesztése e" #~ msgid " List nicknames ?" #~ msgstr " Felh. nevek listázása ?" #~ msgid " Block channel messages i" #~ msgstr " " #~ msgid " Send a message enter" #~ msgstr " Üzenetírás Enter" #~ msgid " Remove user del" #~ msgstr " Felh. eltávolítása Del" #~ msgid " Ignore user i" #~ msgstr " Felhasználó tiltása i" #~ msgid " Remove feed del" #~ msgstr " Csatorna törlése del" #~ msgid " Feed information ?" #~ msgstr " Csatorna információ ?" #, fuzzy #~ msgid " Force check c" #~ msgstr " Csatorna tiltása i" #~ msgid " Unset ignore feed i" #~ msgstr " Csatorna tiltás/ki i" #~ msgid " Ignore feed i" #~ msgstr " Csatorna tiltása i" #~ msgid " Change status s" #~ msgstr " Ãllapot megváltoztatása s" #~ msgid " Go to contact.. alt-s" #~ msgstr " Kapcsolat keresése alt-s" #~ msgid " Show offline users F5" #~ msgstr " Offline felhasználók megjelenítése F5" #~ msgid " Hide offline users F5" #~ msgstr " Offline felhasználók elrejtése F5" #~ msgid "ESC or F9 to close" #~ msgstr "ESC vagy F9 bezár" #~ msgid " Russian win/koi translation for : %s" #~ msgstr " Orosz win1251-koi8 átalakítás : %s " #~ msgid " Russian win/koi translation : %s " #~ msgstr " Orosz win1251-koi8 átalakítás : %s " #~ msgid "Default charset: " #~ msgstr "Karakterkészlet: " #~ msgid "+ [yahoo] connecting to the server" #~ msgstr "+ [yahoo] kapcsolódás a szerverhez" #~ msgid "+ [yahoo] disconnected" #~ msgstr "+ [yahoo] leválasztva" #~ msgid "+ [yahoo] adding %s to the contacts" #~ msgstr "+ [yahoo] %s hozzáadása a kapcsolatokhoz" #~ msgid "+ [yahoo] removing %s from the contacts" #~ msgstr "+ [yahoo] %s eltávolítása a kapcsolatok közül" #~ msgid "+ [yahoo] logged in" #~ msgstr "+ [yahoo] bejelentkezve" #~ msgid "+ [yahoo] search finished, %d found" #~ msgstr "+ [yahoo] a keresés befejezÅ‘dött, %d találat van" #~ msgid "+ [jab] connecting to the server" #~ msgstr "+ [jab] kapcsolódás a szerverhez" #~ msgid "+ [jab] adding %s to the contacts" #~ msgstr "+ [jab] %s hozzáadása a kapcsolatokhoz" #~ msgid "+ [jab] removing %s from the contacts" #~ msgstr "+ [jab] %s eltávolítása a kapcsolatok közül" #~ msgid "+ [jab] conference list fetching finished, %d found" #~ msgstr "+ [jab] konferencia-lista lekérdezés kész: %d darab" #~ msgid "+ [jab] search finished, %d found" #~ msgstr "+ [jab] a keresés befejezÅ‘dött, %d találat van" #~ msgid "+ [jab] logged in" #~ msgstr "+ [jab] bejelentkezve" #~ msgid "+ [jab] disconnected" #~ msgstr "+ [jab] leválasztva" #~ msgid "+ [aim] connecting to the server" #~ msgstr "+ [aim] kapcsolódás a szerverhez" #~ msgid "+ [aim] logged in" #~ msgstr "+ [aim] bejelentkezve" #~ msgid "+ [aim] disconnected" #~ msgstr "+ [aim] lekapcsolódva" #~ msgid "+ [aim] password was changed successfully" #~ msgstr "+ [aim] a jelszóváltoztatás rendben" #~ msgid "+ [icq] connecting to the server" #~ msgstr "+ [icq] kapcsolódás a szerverhez" #~ msgid "+ [icq] logged in" #~ msgstr "+ [icq] bejelentkezve" #~ msgid "+ [irc] connecting to the server" #~ msgstr "+ [irc] kapcsolódás a szerverhez" #~ msgid "+ [irc] channel members list fetching finished, %d found" #~ msgstr "+ [irc] a csatornán lévÅ‘k száma: %d" #~ msgid "+ [irc] logged in" #~ msgstr "+ [irc] bejelentkezve" #~ msgid "+ [irc] disconnected" #~ msgstr "+ [irc] lekapcsolódva" #~ msgid "+ [lj] disconnected" #~ msgstr "+ [lj] leválasztva" #~ msgid " Synchronize contact list " #~ msgstr " Kapcsolati lista szinkronizálása" #~ msgid "You must be logged in to preform the synchronization" #~ msgstr "A szinkronizáláshoz elÅ‘bb be kell jelentkezni" #~ msgid " Contact list synchronization " #~ msgstr " Kapcsolatok listájának szinkronizálása " #~ msgid "Starting the synchronization process" #~ msgstr "Szinkronizáció indítása" #~ msgid "Attempt #%d" #~ msgstr "Próbálkozás: %d" #~ msgid ".. %d already synchronized, %d contacts to be stored" #~ msgstr ".. %d szinkronizálva, %d kapcsolat tárolása" #~ msgid "Too many attempts, gave up" #~ msgstr "Túl sok sikertelen probálkozás, feladva" #~ msgid " Uploading buddies " #~ msgstr " Kapcsolatok feltöltése " #~ msgid "No contacts to be synchronized" #~ msgstr "Nincs szinkronizálandó kapcsolat" #~ msgid ".. all of them are already stored server-side" #~ msgstr ".. már mind szerepel a szerveren" #~ msgid "%d contacts are do be stored server-side. Add them now?" #~ msgstr "%d kapcsolat tárolása a szerveren. Mehet?" #~ msgid ".. adding %s" #~ msgstr "... %s hozzáadása" #~ msgid "Cancelled" #~ msgstr "Megszakítva" #~ msgid "Timed out" #~ msgstr "IdÅ‘ lejárt" centerim-4.22.10/po/uk.po0000644000175000001440000026562611473011457012024 00000000000000# УкраїнÑький переклад Ð´Ð»Ñ centerim. # Copyright (C) 2002 Free Software Foundation, Inc. # Olexander Kunytsa , 2001. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.7.2\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2002-06-12 12:15+0300\n" "Last-Translator: Cawko Xakep \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/centerim.cc:138 msgid "password: " msgstr "пароль: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "F2/M меню кориÑтувача, F3/S зміна ÑтатуÑу, F4/G головне меню, Q вихід" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Ігнорувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s?" #: src/centerim.cc:278 #, fuzzy, c-format msgid "Remove %s from the contact list as well?" msgstr "+ [aim] видалÑємо %s з контактів" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Справді видалити %s?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Показувати під такою Кличкою: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Виберіть групу, в Ñку треба переміÑтити кориÑтувача" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ не можу витÑгти автоповідомленнÑ, коли не підключені до Ñерверу" #: src/centerim.cc:427 #, fuzzy msgid "! cannot connect, free disk space is less than 10k" msgstr "! на диÑку менше 10К вільного проÑтору, відключємоÑÑ" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "автоповідомленнÑ" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "" #: src/centerim.cc:692 src/centerim.cc:747 #, fuzzy, c-format msgid "+ new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] нова пошта! %d лиÑтів" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] нова пошта! %d лиÑтів" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ оÑтаннє Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! Вже одна ÐºÐ¾Ð¿Ñ–Ñ centerim працює" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! це може призвеÑти до проблем. номер процеÑу %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Ðомер мобіли: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "" #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ Ñ–ÑÑ‚Ð¾Ñ€Ñ–Ñ Ð·Ð°Ð¼Ð¾Ð²Ñ‡ÑƒÑ” про %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ %s вже у контакт-ліÑті" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Виберіть групу, в Ñку треба переміÑтити кориÑтувача" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s додано у контакт-ліÑÑ‚" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ кориÑтувач повернувÑÑ" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] авто зміна ÑтатуÑу: %s" #: src/centerim.cc:1490 msgid "away" msgstr "відійшoв" #: src/centerim.cc:1490 msgid "n/a" msgstr "н/д" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! на диÑку менше 10К вільного проÑтору, відключємоÑÑ" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! інакше можна втратити конфігурацію та облік подій" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "" #: src/centerim.cc:1772 #, fuzzy msgid "Select contacts to move" msgstr "Виберіть контакти щоби додати в ліÑÑ‚" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "" #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "Ðа каналах: " #: src/hooks/rsshook.cc:380 msgid "success" msgstr "" #: src/hooks/rsshook.cc:400 #, fuzzy msgid "Title: " msgstr "ПоÑада" #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "" #: src/hooks/rsshook.cc:402 #, fuzzy msgid "Category: " msgstr "МіÑто: " #: src/hooks/rsshook.cc:403 #, fuzzy msgid "Author: " msgstr "авторизаціÑ" #: src/hooks/rsshook.cc:405 #, fuzzy msgid "Description: " msgstr "ПоÑада: " #: src/hooks/rsshook.cc:407 #, fuzzy msgid "Link: " msgstr " uin: " #: src/hooks/rsshook.cc:408 #, fuzzy msgid "Comments: " msgstr "коментар: " #: src/hooks/yahoohook.cc:175 #, fuzzy msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "" #: src/hooks/yahoohook.cc:448 #, fuzzy, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñерверу" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "" #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] не можу витÑгти Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/yahoohook.cc:785 #, fuzzy msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "невірні пароль та ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "невірні пароль та ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "" #: src/hooks/yahoohook.cc:802 #, fuzzy msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/yahoohook.cc:809 #, fuzzy msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "" #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 #, fuzzy msgid "The user has added you to his/her contact list" msgstr "* КориÑтувач додав Ð’Ð°Ñ Ð´Ð¾ Ñвого контакт-ліÑта" #: src/hooks/yahoohook.cc:1036 #, fuzzy msgid "the message was: " msgstr "* ÐвтоповідомленнÑ:" #: src/hooks/yahoohook.cc:1054 #, fuzzy, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [msn] електронна пошта від %s <%s>, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/yahoohook.cc:1154 #, fuzzy msgid "+ [yahoo] direct connection failed" msgstr "+ [icq] від'єднано" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 msgid "The user has buzzed you" msgstr "" #: src/hooks/jabberhook.cc:360 #, fuzzy msgid "+ [jab] unable to connect to the server" msgstr "+ [aim] не можу законектитиÑÑ" #: src/hooks/jabberhook.cc:649 #, fuzzy, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [aim] видалÑємо %s з контактів" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 #, fuzzy msgid "Away message:" msgstr "* ÐвтоповідомленнÑ:" #: src/hooks/jabberhook.cc:766 #, fuzzy, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [icq] не можу витÑгти Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "" #: src/hooks/jabberhook.cc:819 #, fuzzy msgid "Unable to connect" msgstr "не можу під'єднатиÑÑ Ð´Ð¾ Ñервера" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, fuzzy, c-format msgid "+ [jab] error %d" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, fuzzy, c-format msgid "+ [jab] error %d: %s" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] не можу законектитиÑÑ" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "Мені подобаєтьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¸Ð¹ AIM-профіль centerim %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "збій під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ мережі aim" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] невдале під'єднаннÑ: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "Ðа цього кориÑтувача немає профілю." #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] пароль відіÑлано" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "Ñк запитувалоÑÑ" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "проблеми socket'ів" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "невірне ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "зачаÑті Ñпроби" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "невірний пароль" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "невірні пароль та ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] від'єднано" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "причина від'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ icq" #: src/hooks/icqhook.cc:1254 #, fuzzy msgid "The user has accepted your authorization request" msgstr "* КориÑтувач додав Ð’Ð°Ñ Ð´Ð¾ Ñвого контакт-ліÑта" #: src/hooks/icqhook.cc:1258 #, fuzzy msgid "The user has rejected your authorization request; the message was: " msgstr "Порожній запит авторизації" #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] збій відÑÐ¸Ð»Ð°Ð½Ð½Ñ SMS до %s, %s" #: src/hooks/icqhook.cc:1316 #, fuzzy, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] збій відÑÐ¸Ð»Ð°Ð½Ð½Ñ SMS до %s, %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] не можу витÑгти Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "" #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ [msn] з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· %s" #: src/hooks/gaduhook.cc:164 #, fuzzy, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/gaduhook.cc:218 #, fuzzy msgid "+ [gg] connection to the server failed" msgstr "+ [aim] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñерверу" #: src/hooks/gaduhook.cc:291 #, fuzzy msgid "+ [gg] connection lost" msgstr "+ [msn] з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· %s" #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [icq] не можу витÑгти Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] не можу законектитиÑÑ" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] невдале під'єднаннÑ: %s" #: src/hooks/irchook.cc:832 #, fuzzy msgid "+ [irc] nickname was changed successfully" msgstr "+ [aim] вдала зміна паролю" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Ðа каналах: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "" #: src/hooks/irchook.cc:1290 #, fuzzy msgid "+ [irc] password sent" msgstr "+ [aim] пароль відіÑлано" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [aim] пароль відіÑлано" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "" #: src/hooks/irchook.cc:1442 #, fuzzy, c-format msgid "%s has joined." msgstr "ігноруєтьÑÑ" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, fuzzy, c-format msgid "reason: %s" msgstr "ВідіÑлано %s" #: src/hooks/irchook.cc:1489 #, fuzzy, c-format msgid "%s has been kicked by %s" msgstr "+ %s додано у контакт-ліÑÑ‚" #: src/hooks/irchook.cc:1518 #, fuzzy, c-format msgid "Channel topic now is: %s" msgstr " Канал : %s " #: src/hooks/irchook.cc:1523 #, fuzzy, c-format msgid "set by %s" msgstr "ВідіÑлано %s" #: src/hooks/irchook.cc:1541 #, fuzzy, c-format msgid "%s has been opped by %s." msgstr "+ %s додано у контакт-ліÑÑ‚" #: src/hooks/irchook.cc:1557 #, fuzzy, c-format msgid "%s has been deopped by %s." msgstr "+ %s додано у контакт-ліÑÑ‚" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 #, fuzzy msgid "+ [lj] user lookup finished" msgstr "+ [icq] пошук завершено, знайдено %d кориÑтувачів" #: src/hooks/ljhook.cc:511 #, fuzzy msgid "cannot connect" msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/ljhook.cc:512 #, fuzzy, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [aim] невдале під'єднаннÑ: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "" #: src/hooks/ljhook.cc:572 #, fuzzy, c-format msgid "+ [lj] login failed: %s" msgstr "+ [aim] невдале під'єднаннÑ: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "" #: src/hooks/ljhook.cc:578 #, fuzzy, c-format msgid "+ [lj] post error: %s" msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #: src/hooks/ljhook.cc:677 #, fuzzy, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "* КориÑтувач додав Ð’Ð°Ñ Ð´Ð¾ Ñвого контакт-ліÑта" #: src/hooks/ljhook.cc:687 #, fuzzy, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "* КориÑтувач додав Ð’Ð°Ñ Ð´Ð¾ Ñвого контакт-ліÑта" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "" #: src/hooks/ljhook.cc:722 #, fuzzy, c-format msgid "+ [lj] %s was added to friends" msgstr "+ %s додано у контакт-ліÑÑ‚" #: src/hooks/msnhook.cc:430 #, fuzzy, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [irc] Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑпиÑку каналу завершено, знайдено %d кориÑтувачів" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "" #: src/hooks/msnhook.cc:799 #, fuzzy, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] електронна пошта від %s <%s>, %s" #: src/hooks/msnhook.cc:905 #, fuzzy msgid "+ [msn] cannot connect: " msgstr "+ [yahoo] додаємо %s в контакти" #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "" #: src/hooks/abstracthook.cc:355 #, fuzzy msgid "connecting to the server" msgstr "+ [aim] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñерверу" #: src/hooks/abstracthook.cc:356 #, fuzzy msgid "logged in" msgstr "+ [aim] законектилиÑÑ" #: src/hooks/abstracthook.cc:357 #, fuzzy, c-format msgid "search finished, %d found" msgstr "+ [icq] пошук завершено, знайдено %d кориÑтувачів" #: src/hooks/abstracthook.cc:358 #, fuzzy msgid "password was changed successfully" msgstr "+ [aim] вдала зміна паролю" #: src/hooks/abstracthook.cc:359 #, fuzzy msgid "disconnected" msgstr "Від'єднано" #: src/hooks/abstracthook.cc:360 #, fuzzy, c-format msgid "adding %s to the contacts" msgstr "+ [aim] додаємо %s в контакти" #: src/hooks/abstracthook.cc:361 #, fuzzy, c-format msgid "removing %s from the contacts" msgstr "+ [msn] видалÑємо %s з контактів" #: src/hooks/abstracthook.cc:362 #, fuzzy, c-format msgid "members list fetching finished, %d found" msgstr "+ [irc] Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑпиÑку каналу завершено, знайдено %d кориÑтувачів" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Січ" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Лют" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Бер" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Кві" #: src/icqcontact.cc:854 msgid "May" msgstr "Тра" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Чер" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Лип" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Сер" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Вер" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Жов" #: src/icqcontact.cc:855 msgid "Nov" msgstr "ЛиÑ" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Гру" #: src/icqgroups.cc:66 msgid "General" msgstr "Загальне" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "ВідіÑлано %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60 та далі" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "невідомий тип комунікатора" #: src/icqdialogs.cc:58 #, fuzzy msgid "General Chat" msgstr " Загальне " #: src/icqdialogs.cc:59 msgid "Romance" msgstr "" #: src/icqdialogs.cc:60 #, fuzzy msgid "Games" msgstr "Ім'Ñ" #: src/icqdialogs.cc:61 msgid "Students" msgstr "" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Ім'Ñ" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr "" #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Видалити" #: src/icqdialogs.cc:120 msgid "Load" msgstr "" #: src/icqdialogs.cc:205 #, fuzzy msgid "+ you must be logged in first" msgstr "+ Ñлід під'єднатиÑÑ Ñпочатку" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "очиÑтити" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Змінити" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Шукати/додати" #: src/icqdialogs.cc:234 #, fuzzy msgid "Join/Create" msgstr "(ПриєднатиÑÑ/Залишити)" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Пошук кориÑтувачів" #: src/icqdialogs.cc:249 #, fuzzy msgid " Join/create a channel/conference " msgstr "Ðа каналах: " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr "" #: src/icqdialogs.cc:299 msgid " Network " msgstr " Мережа " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Кличкa : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " ÐдреÑа ел.пошти : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Iм'Ñ : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Прізвище : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Вікова ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ñ–Ñ : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Стать : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Мова : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " МіÑце " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " МіÑто : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Штат : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Країна : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Робота " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " ÐšÐ¾Ð¼Ð¿Ð°Ð½Ñ–Ñ : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Відділ : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " ПоÑада : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Лише підключені " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr "" #: src/icqdialogs.cc:357 #, fuzzy msgid " Keywords " msgstr " Мережа " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Кличка " #: src/icqdialogs.cc:372 msgid " Search service " msgstr "" #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr "" #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 #, fuzzy msgid " Feed Parameters " msgstr " РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr "" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr "" #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Канал : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Ім'Ñ : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr "" #: src/icqdialogs.cc:416 #, fuzzy, c-format msgid " Keywords : %s " msgstr " Мережа " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 #, fuzzy msgid " Options " msgstr " МіÑце " #: src/icqdialogs.cc:422 #, fuzzy, c-format msgid " Users with photos only : %s " msgstr " ПоÑада : %s " #: src/icqdialogs.cc:423 #, fuzzy, c-format msgid " Look for online only : %s " msgstr " Лише підключені " #: src/icqdialogs.cc:428 #, fuzzy msgid " Show users who have you on their list " msgstr "+ %s вже у контакт-ліÑті" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr "" #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Пароль " #: src/icqdialogs.cc:443 #, fuzzy msgid " Service " msgstr "Сервер: " #: src/icqdialogs.cc:472 #, fuzzy msgid "New profile name: " msgstr "Ñкий файл: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Кличка: " #: src/icqdialogs.cc:504 #, fuzzy msgid "Name/Title: " msgstr "Ім'Ñ: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "ÐдреÑа електронної пошти: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Ім'Ñ: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Прізвище: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "МіÑто: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Штат: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "КомпаніÑ: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Відділ: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "ПоÑада: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Канал: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Ім'Ñ: " #: src/icqdialogs.cc:522 #, fuzzy msgid "Keywords: " msgstr "пароль: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Пароль: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 #, fuzzy msgid "URL: " msgstr "URL" #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "" #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Загальне " #: src/icqdialogs.cc:595 #, fuzzy msgid " Registration service " msgstr " РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ " #: src/icqdialogs.cc:599 #, fuzzy msgid " Registration parameters " msgstr " РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ " #: src/icqdialogs.cc:622 #, fuzzy, c-format msgid " Change password : %s " msgstr " Пароль ще раз : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " ÐдреÑа ел.пошти : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Дата Ð½Ð°Ñ€Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Вік : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " ÐдреÑа " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " ÐдреÑа : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Поштовий Ñ–Ð½Ð´ÐµÐºÑ : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Телефон : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Ð¤Ð°ÐºÑ : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Мобіла : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " ІнтереÑи " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " Мова N1 : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " Мова N2 : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " Мова N3 : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Різне " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr "" #: src/icqdialogs.cc:682 #, fuzzy, c-format msgid " Random chat group : %s " msgstr " ВпрорÑдковувати контакти в групи: %s " #: src/icqdialogs.cc:684 #, fuzzy, c-format msgid " Authorization required : %s " msgstr "авторизаціÑ" #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Штат : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " Про " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð’Ð°ÑˆÐ¾Ñ— інформації кориÑтувача" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " %s Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ð²Ð°Ñ " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ %s " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Гаразд" # #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Зачекайте... Ваше інфо вÑе ще не отримано" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "ÐдреÑа ел.пошти: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Дата Вашого Ð½Ð°Ñ€Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ (дд-мм-рррр): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Вік: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "ÐдреÑа: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "Поштовий індекÑ: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Телефон: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "ФакÑ: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Мобіла: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Про" #: src/icqdialogs.cc:869 #, fuzzy msgid "New password: " msgstr " пароль: " #: src/icqdialogs.cc:872 #, fuzzy msgid "Check the new password: " msgstr " Пароль ще раз : %s " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "нема" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [^X зберегти, Esc ÑкаÑувати] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " ВідіÑлати файли Ð´Ð»Ñ %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Додати" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Коментар" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "ВідіÑлати" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Файли " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Коментар " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "Ñкий файл: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "коментар: " #: src/icqdialogs.cc:1163 #, fuzzy msgid "None" msgstr "Гаразд" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " Параметри centerim" #: src/icqdialogs.cc:1218 #, fuzzy msgid " User interface " msgstr " ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Звуковий приÑтрій : %s" #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Палітра кольорів : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr "авторизаціÑ" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Відділ : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " Канал : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " ВпрорÑдковувати контакти в групи: %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr "" #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr "" #: src/icqdialogs.cc:1231 #, c-format msgid " Enable vi bindings: %s " msgstr "" #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr "" #: src/icqdialogs.cc:1241 #, fuzzy, c-format msgid " Switch to language preset : %s " msgstr " Мова N1 : %s " #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Відділ : %s " #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Відділ : %s " #: src/icqdialogs.cc:1246 #, fuzzy, c-format msgid " For protocols : %s" msgstr " ПоÑада : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Контакт-ліÑÑ‚ " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " ВпрорÑдковувати контакти в групи: %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " ВпрорÑдковувати контакти в групи: %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Ðе показувати відключених : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Відкидати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ тих, хто не в контакт-лиÑті : %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr "авторизаціÑ" #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Цитувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñƒ відповіді : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " ПеревірÑти поштову Ñкриньку : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Запам'Ñтовувати паролі : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Редагувати Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ зміні ÑтатуÑу : %s " #: src/icqdialogs.cc:1266 #, fuzzy, c-format msgid " Chat messaging mode for : %s" msgstr " Режим балачки: %s " #: src/icqdialogs.cc:1272 #, fuzzy, c-format msgid " Enter key sends message for : %s" msgstr " Цитувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñƒ відповіді : %s " #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Режим балачки: %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr "" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " ВпрорÑдковувати контакти в групи: %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Мережа " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " Поштовий Ñервер: %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " Поштовий Ñервер: %s " #: src/icqdialogs.cc:1289 #, fuzzy, c-format msgid " HTTP proxy server : %s " msgstr " Поштовий Ñервер: %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr "" #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr "" #: src/icqdialogs.cc:1299 #, fuzzy msgid " Logging " msgstr " Логін : %s " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr "" #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr "" #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr "" #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Детальний протокол подій в ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Змінювати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° 'Відійшов' через %d хвилин " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Змінювати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° 'ÐедocÑжний' через %d хвилин " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Змінювати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° 'ÐедocÑжний' через %d хвилин " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " ÐдреÑа : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Період автоматичної зміни ÑтатуÑу на 'Відійшов' (0 - Ñкинути): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Період автоматичної зміни ÑтатуÑу на 'ÐедоÑÑжний' (0 - Ñкинути): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "ÐдреÑа поштового Ñерверу: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "" #: src/icqdialogs.cc:1394 #, fuzzy msgid "HTTP proxy server hostname: " msgstr "ÐдреÑа поштового Ñерверу: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "" #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "ÐдреÑа поштового Ñерверу: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Порожній запит авторизації" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Отримано вашу інформацію кориÑтувача" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "ВпорÑдкувати контакти в групи" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Переіменувати" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "Видалити" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "поÑунути вгору" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "поÑунути вниз" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Вибрати" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Групи " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Ðазва Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— групи: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Ðова назва групи: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Справді видалити групу?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "" #: src/icqdialogs.cc:1826 #, fuzzy msgid "Cancel" msgstr "Змінити" #: src/icqdialogs.cc:1855 #, fuzzy, c-format msgid " Incoming from %s " msgstr "Вхідне %s від %s" #: src/icqdialogs.cc:1857 #, fuzzy, c-format msgid " Outgoing to %s " msgstr "Вихідне %s до %s" #: src/icqdialogs.cc:1865 msgid "init" msgstr "" #: src/icqdialogs.cc:1866 msgid "start" msgstr "" #: src/icqdialogs.cc:1867 #, fuzzy msgid "work" msgstr "Робота" #: src/icqdialogs.cc:1868 #, fuzzy msgid "done" msgstr "Гаразд" #: src/icqdialogs.cc:1869 msgid "err" msgstr "" #: src/icqdialogs.cc:1870 #, fuzzy msgid "abort" msgstr "Про" #: src/icqdialogs.cc:1877 #, fuzzy msgid " of " msgstr " Відкинути " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "" #: src/icqdialogs.cc:2023 msgid "private" msgstr "" #: src/icqdialogs.cc:2025 #, fuzzy msgid "friends only" msgstr "Жіноча" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr "" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "" #: src/icqdialogs.cc:2040 #, fuzzy msgid "cAncel" msgstr "Змінити" #: src/icqdialogs.cc:2052 #, fuzzy, c-format msgid " Post to journal : %s " msgstr " ПоÑада : %s " #: src/icqdialogs.cc:2053 #, fuzzy, c-format msgid " Subject : %s " msgstr " Сервер : %s " #: src/icqdialogs.cc:2058 #, fuzzy, c-format msgid " Security : %s " msgstr " Сервер : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr "" #: src/icqdialogs.cc:2063 #, fuzzy, c-format msgid " Mood : %s " msgstr " Логін : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "" #: src/icqdialogs.cc:2064 #, fuzzy, c-format msgid " Custom mood : %s " msgstr " Прізвище : %s " #: src/icqdialogs.cc:2066 #, fuzzy, c-format msgid " Music : %s " msgstr " ÐдреÑа ел.пошти : %s " #: src/icqdialogs.cc:2067 #, fuzzy, c-format msgid " Picture : %s " msgstr " Сервер : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Вік : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr "" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr "" #: src/icqdialogs.cc:2073 #, fuzzy, c-format msgid " Disallow comments : %s " msgstr " Відділ : %s " #: src/icqdialogs.cc:2074 #, fuzzy, c-format msgid " Backdated entry : %s " msgstr " Дата Ð½Ð°Ñ€Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "" #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "" #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "" #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr " Контакт-ліÑÑ‚ " #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "ШвидкийПошук: набирайте, Meta-S знову шукати, Enter закінчити" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr "" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, fuzzy, c-format msgid "executed external manual action %s, return code = %d" msgstr "виконано розширену дію %s" #: src/imexternal.cc:160 #, fuzzy, c-format msgid "executed external action %s, return code = %d" msgstr "виконано розширену дію %s" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Відключений" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Ð’ ефірі" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Ðевидимий" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Xoчу попатÑкати!" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Ðе турбувaти" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "ЗайнÑтий" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] ÐедocÑжний" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "Відійшoв" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "Ðе турбувати" #: src/imlogger.cc:39 msgid "N/A" msgstr "ÐедоÑÑжний" #: src/imlogger.cc:49 msgid "message" msgstr "повідомленнÑ" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "СМС" #: src/imlogger.cc:52 msgid "authorization" msgstr "авторизаціÑ" #: src/imlogger.cc:53 msgid "e-mail" msgstr "e-mail" #: src/imlogger.cc:54 #, fuzzy msgid "notification" msgstr "МіÑце" #: src/imlogger.cc:55 #, fuzzy msgid "contacts" msgstr "Ð’ контакт-ліÑÑ‚" #: src/imlogger.cc:56 #, fuzzy msgid "files" msgstr " Файли " #: src/imlogger.cc:57 #, fuzzy msgid "event" msgstr "Ðіколи" #: src/imlogger.cc:79 msgid "events log started" msgstr "почато протокол" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "вихідне %s до %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "вхідне %s від %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "ігноруєтьÑÑ" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s від'єднавÑÑ" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "ВідіÑлано %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: під'єднавÑÑ, ÑÑ‚Ð°Ñ‚ÑƒÑ %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: від'єднавÑÑ" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "змінено наш %s ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° %s з %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " РозпорÑдник акаунтів " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Сервер : %s " #: src/accountmanager.cc:100 #, fuzzy, c-format msgid " Secured : %s " msgstr " Сервер : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Логін : %s " #: src/accountmanager.cc:118 #, fuzzy, c-format msgid " Password (optional) : %s " msgstr " Ðовий пароль : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Пароль : %s " #: src/accountmanager.cc:124 #, fuzzy, c-format msgid " Priority : %s " msgstr " МіÑто : %s " #: src/accountmanager.cc:129 #, fuzzy, c-format msgid " Import friend list : %s " msgstr " Відділ : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Ðовий пароль : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " ВпрорÑдковувати контакти в групи: %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " ВпрорÑдковувати контакти в групи: %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " ЗареєÑтруватиÑÑ " #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Стать : %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Мережа " #: src/accountmanager.cc:168 #, fuzzy msgid " Change nickname " msgstr " Кличка " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Поновити Ваше інфо " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " ÐадіÑлати Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ " #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Відкинути " #: src/accountmanager.cc:200 msgid " user name: " msgstr " ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " пароль: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Спочатку треба Ñкинути інформацію про акаунт" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Спочатку треба від'єднатиÑÑ Ð²Ñ–Ð´ ÑервіÑу!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " адреÑа Ñерверу: " #: src/accountmanager.cc:285 msgid " priority: " msgstr "" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, fuzzy, c-format msgid " Register on the %s network " msgstr " РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð² мережі ICQ " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Йдіть геть" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Ðовий пароль : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Пароль ще раз : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Сервер: %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Введіть вдруге той Ñамий пароль: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "ЗареєÑтруватиÑÑ Ð· кличкою: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Сервер: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Паролі не Ñпівпадають!" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Слід ввеÑти пароль" #: src/imcontroller.cc:118 #, fuzzy msgid "Password must be at least 6 chars long" msgstr "Слід ввеÑти пароль" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "КонектимоÑÑ Ð´Ð¾ Ñерверу %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Помилка Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтрації. Спробувати ще?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Ðова Ñпроба..." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Отримано новий номер UIN, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Від'єднано" #: src/imcontroller.cc:179 #, fuzzy msgid "Unable to connect to icq server. Retry?" msgstr "Ðе можу під'єднатиÑÑ Ð´Ð¾ Ñерверу ICQ. Спробувати ще?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "" #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "" #: src/imcontroller.cc:228 #, fuzzy msgid "Failed" msgstr "Жіноча" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Треба бути під'єднаним до мережі ICQ щоби поновити інформацію" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "" #: src/imcontroller.cc:284 #, fuzzy msgid "You must be logged to the MSN network to update the friendly nick" msgstr "Треба бути під'єднаним до мережі ICQ щоби поновити інформацію" #: src/imcontroller.cc:301 #, fuzzy msgid "You must be logged to the Jabber network to update your details" msgstr "Треба бути під'єднаним до мережі ICQ щоби поновити інформацію" #: src/imcontroller.cc:318 #, fuzzy msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "Треба бути під'єднаним до мережі ICQ щоби поновити інформацію" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "реєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð½Ðµ підтримуєтьÑÑ" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "Мені подобаєтьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð²Ðµ %s Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "помилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: недоÑтатньо параметрів" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "помилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: в icq-протоколі дозволÑютьÑÑ Ð»Ð¸ÑˆÐµ UIN'и" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "помилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: невідомий тип програми" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "помилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: невідомий тип події" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s до %s поÑтавлено в чергу" #: src/icqconf.cc:1616 #, fuzzy msgid "event sending error: error creating directory for the contact" msgstr "помилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: недоÑтатньо параметрів" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "невідомий ÑтатуÑний Ñимвол" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "невідомий тип комунікатора" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "помилка зміни ÑтатуÑу: " #: src/icqconf.cc:1680 #, fuzzy msgid "Usage: " msgstr "Вік: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 #, fuzzy msgid "General options:" msgstr " Загальне " #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr "" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr "" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 #, fuzzy msgid " --help display this stuff" msgstr " Змінити ÑÑ‚Ð°Ñ‚ÑƒÑ s" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr "" #: src/icqconf.cc:1692 #, fuzzy msgid "Events sending options:" msgstr " Параметри centerim" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr "" #: src/icqconf.cc:1694 msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr "" #: src/icqconf.cc:1695 msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" #: src/icqconf.cc:1700 msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "" #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Порожній запит авторизації" #: src/imevents.cc:321 #, fuzzy msgid "* Authorization request : " msgstr "авторизаціÑ" #: src/imevents.cc:322 #, fuzzy msgid "* Authorization : " msgstr "авторизаціÑ" #: src/imevents.cc:381 msgid "* SMS : " msgstr "" #: src/imevents.cc:517 #, fuzzy msgid "* Contacts : " msgstr " Контакт-ліÑÑ‚ " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr " Ігнорувати кориÑтувача" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Інфо" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " РозпорÑдник акаунтів " #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " ПоÑада : %s " #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "так" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "ні" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "так" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Ðккаунти.." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " ПоÑада : %s " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Вік: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " ПоÑада : %s " #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Ðккаунти.." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "так" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "ЛиÑ" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr "Сервер: " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "невідомий тип комунікатора" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Чоловіча" #: src/icqface.cc:53 msgid "Female" msgstr "Жіноча" #: src/icqface.cc:56 msgid "Not specified" msgstr "Ðе вказано" #: src/icqface.cc:61 msgid "Ok" msgstr "OK" #: src/icqface.cc:62 msgid "Next" msgstr "Далі" #: src/icqface.cc:63 msgid "Fwd" msgstr "ПереÑлати" #: src/icqface.cc:64 msgid "Reply" msgstr "ВідповіÑти" #: src/icqface.cc:65 msgid "Open" msgstr "Відкрити" #: src/icqface.cc:66 msgid "Accept" msgstr "ПрийнÑти" #: src/icqface.cc:67 msgid "Reject" msgstr "Відкинути" #: src/icqface.cc:68 msgid "User info" msgstr "" #: src/icqface.cc:70 msgid "Prev" msgstr "" #: src/icqface.cc:78 msgid "sound card" msgstr "звукова карта" #: src/icqface.cc:79 msgid "speaker" msgstr "динамік" #: src/icqface.cc:80 msgid "disable" msgstr "без звуку" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "без зміни" #: src/icqface.cc:88 msgid "dark" msgstr "темна" #: src/icqface.cc:89 msgid "blue" msgstr "блакитна" #: src/icqface.cc:97 msgid "protocol" msgstr "" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "Змінити" #: src/icqface.cc:118 msgid "mode 1" msgstr "режим 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "режим 2" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "" #: src/icqface.cc:274 #, fuzzy msgid "Send an URL" msgstr " ÐадіÑлати СМС" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " ÐадіÑлати СМС" #: src/icqface.cc:276 #, fuzzy msgid "Send contacts" msgstr "Ð’ контакт-ліÑÑ‚" #: src/icqface.cc:277 #, fuzzy msgid " Request authorization" msgstr "авторизаціÑ" #: src/icqface.cc:278 #, fuzzy msgid "Edit details" msgstr " Редагувати інфо" #: src/icqface.cc:279 #, fuzzy msgid "Fetch away message" msgstr " ВитÑгти автоповідомленнÑ" #: src/icqface.cc:280 #, fuzzy msgid "Add to list" msgstr " Додати в контакт-ліÑÑ‚ a" #: src/icqface.cc:281 #, fuzzy msgid "Rename contact" msgstr " Переіменувати r" #: src/icqface.cc:282 msgid " Move to group.." msgstr " ПеренеÑти до групи.." #: src/icqface.cc:283 msgid " Ping" msgstr "" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "" #: src/icqface.cc:285 #, fuzzy msgid " Send file(s)" msgstr " ВідіÑлати файли Ð´Ð»Ñ %s, %lu " #: src/icqface.cc:286 msgid " Invite to conference.." msgstr "" #: src/icqface.cc:293 #, fuzzy msgid " Send a channel message enter" msgstr " ÐадіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ " #: src/icqface.cc:294 #, fuzzy msgid "Channel chat history" msgstr " ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ h" #: src/icqface.cc:295 #, fuzzy msgid " Remove channel del" msgstr " Видалити кориÑтувача del" #: src/icqface.cc:296 #, fuzzy msgid " Join channel" msgstr "Ðа каналах: " #: src/icqface.cc:297 msgid " Leave channel" msgstr "" #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Прізвище: " #: src/icqface.cc:301 #, fuzzy msgid "UnBlock channel messages" msgstr " ÐадіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ " #: src/icqface.cc:303 #, fuzzy msgid "Block channel messages" msgstr " ÐадіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ " #: src/icqface.cc:310 #, fuzzy msgid "Send a message" msgstr " ÐадіÑлати Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ " #: src/icqface.cc:312 #, fuzzy msgid "Event history" msgstr " ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ h" #: src/icqface.cc:313 #, fuzzy msgid "Remove user" msgstr "Видалити" #: src/icqface.cc:314 #, fuzzy msgid "User's details" msgstr " Інфо кориÑтувача ?" #: src/icqface.cc:315 msgid "External actions.." msgstr "" #: src/icqface.cc:318 #, fuzzy msgid "Unset ignore user" msgstr " Видалити кориÑтувача del" #: src/icqface.cc:318 #, fuzzy msgid "Ignore user" msgstr " Ігнорувати кориÑтувача" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 #, fuzzy msgid "Force check" msgstr " Видалити кориÑтувача del" #: src/icqface.cc:435 #, fuzzy msgid "Change status" msgstr "Змінити" #: src/icqface.cc:436 #, fuzzy msgid "Go to contact.." msgstr "Ð’ контакт-ліÑÑ‚" #: src/icqface.cc:437 msgid " Accounts.." msgstr " Ðккаунти.." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " Параметри centerim" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr "" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Пошук кориÑтувачів" #: src/icqface.cc:445 #, fuzzy msgid " Join channel/conference" msgstr "Ðа каналах: " #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr "" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Редагувати ÑпиÑок ігноруваннÑ" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Редагувати ÑпиÑок невидимоÑті" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Редагувати ÑпиÑок видимоÑті" #: src/icqface.cc:455 #, fuzzy msgid "Show offline users" msgstr " Ðе показувати відключених : %s " #: src/icqface.cc:457 #, fuzzy msgid "Hide offline users" msgstr " Ðе показувати відключених : %s " #: src/icqface.cc:460 #, fuzzy msgid " Organize contact groups" msgstr "ВпорÑдкувати контакти в групи" #: src/icqface.cc:461 msgid " Mass group move.." msgstr "" #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Інфо" #: src/icqface.cc:905 msgid "Message" msgstr "ПовідомленнÑ" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Ðовий пошук" #: src/icqface.cc:924 #, fuzzy msgid "Contact to add" msgstr " Контакт-ліÑÑ‚ " #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "" #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Кличка" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr " Ігнорувати кориÑтувача" #: src/icqface.cc:1116 msgid "not found" msgstr "" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "E-mail #2" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Старе мило" #: src/icqface.cc:1134 msgid "Gender" msgstr "Стать" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "ÐародженнÑ" #: src/icqface.cc:1136 msgid "Age" msgstr "Вік" #: src/icqface.cc:1137 msgid "Languages" msgstr "Мови" #: src/icqface.cc:1138 msgid "Last IP" msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "ВоÑтаннє" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Ðіколи" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "ВідіÑлати" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr " Файли " #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Ð’ контакт-ліÑÑ‚" #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "авторизаціÑ" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "ÐдреÑа" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "МіÑце" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "ІндекÑ" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Телефон" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "ФакÑ" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Мобіла" #: src/icqface.cc:1259 msgid "Timezone" msgstr "ЧаÑовий поÑÑ" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Сторінка" #: src/icqface.cc:1300 msgid "Company" msgstr "КомпаніÑ" #: src/icqface.cc:1301 msgid "Department" msgstr "Відділ" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "ПоÑада" #: src/icqface.cc:1346 msgid "Interests" msgstr "ІнтереÑи" #: src/icqface.cc:1358 msgid "Background" msgstr "Минуле" #: src/icqface.cc:1376 #, fuzzy msgid "Handle" msgstr "Чоловіча" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "" #: src/icqface.cc:1378 msgid "Version" msgstr "" #: src/icqface.cc:1379 msgid "Encoding" msgstr "" #: src/icqface.cc:1382 msgid "Link" msgstr "" #: src/icqface.cc:1384 msgid "Frequency" msgstr "" #: src/icqface.cc:1385 #, fuzzy msgid "Last check" msgstr "ВоÑтаннє" #: src/icqface.cc:1386 msgid "Next check" msgstr "" #: src/icqface.cc:1387 #, fuzzy msgid "Last result" msgstr "Ñк запитувалоÑÑ" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "" #: src/icqface.cc:1404 #, fuzzy msgid "Now" msgstr "ЛиÑ" #: src/icqface.cc:1423 #, fuzzy msgid "Full name" msgstr "Ñкий файл: " #: src/icqface.cc:1442 #, fuzzy, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "F2 йде за поÑиланнÑми, ESC закриває" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "" #: src/icqface.cc:1456 msgid "Check" msgstr "" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Редагувати" #: src/icqface.cc:1456 msgid "LJ" msgstr "" #: src/icqface.cc:1460 #, fuzzy msgid "Retreive" msgstr "Поновити" #: src/icqface.cc:1466 #, fuzzy msgid "Friend of" msgstr "Жіноча" #: src/icqface.cc:1472 msgid "Home" msgstr "Дім" #: src/icqface.cc:1472 msgid "Work" msgstr "Робота" #: src/icqface.cc:1472 msgid "More" msgstr "Додатково" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Поновити" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] Мережа ICQ " #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr "" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr "" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr "" #: src/icqface.cc:1623 #, fuzzy msgid " Already logged in only" msgstr "вже в мережі" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr "" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr "" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Ð’ контакт-ліÑÑ‚" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "СпиÑок ігноруваннÑ" #: src/icqface.cc:1953 msgid "Visible list" msgstr "СпиÑок видимоÑті" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "СпиÑок невидимоÑті" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Виберіть контакти щоби додати в ліÑÑ‚" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Отримувачі" #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "ШвидкийПошук: набирайте, Meta-S знову шукати, Enter закінчити" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr " Контакт-ліÑÑ‚ " #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ немає поÑилань" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² поточному повідомленні" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "^X відіÑлати, ^P багатьом, ^O Ñ–ÑторіÑ, Meta-? інфо, ESC ÑкаÑувати" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "^X відіÑлати, ^P багатьом, ^O Ñ–ÑторіÑ, Meta-? інфо, ESC ÑкаÑувати" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr "Вихідне %s до %s" #: src/icqface.cc:2610 #, fuzzy msgid "Send contacts.." msgstr "Ð’ контакт-ліÑÑ‚" #: src/icqface.cc:2670 #, fuzzy msgid "file name: " msgstr "Ñкий файл: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "Вихідне %s до %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "ВідіÑлано %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "Вхідне %s від %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Отримано %s" #: src/icqface.cc:3182 #, fuzzy, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "F2 йде за поÑиланнÑми, ESC закриває" #: src/icqface.cc:3229 #, fuzzy, c-format msgid "%s from %s, received on %s" msgstr "Отримано %s" #: src/icqface.cc:3230 #, fuzzy, c-format msgid "%s to %s, sent on %s" msgstr "ВідіÑлано %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð· %s, вÑього подій: %d" #: src/icqface.cc:3339 #, fuzzy, c-format msgid "%s search, %s again, %s cancel" msgstr "S Пошук, L знову, ESC - ÑкаÑувати" #: src/icqface.cc:3348 msgid "search for: " msgstr "шукати:" #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ принÑто" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [msn] електронна пошта від %s <%s>, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s під'єднавÑÑ, ÑÑ‚Ð°Ñ‚ÑƒÑ %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s змінив ÑÑ‚Ð°Ñ‚ÑƒÑ Ð· %s на %s" #~ msgid " [o] Online" #~ msgstr " [o] Ð’ ефірі" #~ msgid " [_] Offline" #~ msgstr " [_] Відключений" #~ msgid " [a] Away" #~ msgstr " [a] Відійшов" #~ msgid " [c] Occupied" #~ msgstr " [c] ЗайнÑтий" #~ msgid " [f] Free for chat" #~ msgstr " [f] Xoчу попатÑкати!" #~ msgid " [i] Invisible" #~ msgstr " [i] Ðевидимий" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Пароль ще раз : %s " #, fuzzy #~ msgid " Convert from : %s " #~ msgstr " Країна : %s " #, fuzzy #~ msgid " Convert to : %s " #~ msgstr " Країна : %s " #~ msgid "already logged" #~ msgstr "вже в мережі" #~ msgid "" #~ "event sending error: the destination contact doesn't exist on your list" #~ msgstr "помилка відÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ñ—: цільовий контакт не Ñ–Ñнує у вашому ліÑті" #, fuzzy #~ msgid "to URLs, " #~ msgstr "F2 йде за поÑиланнÑми, ESC закриває" #, fuzzy #~ msgid "URLs, " #~ msgstr "URL" #, fuzzy #~ msgid " details, " #~ msgstr " Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ " #, fuzzy #~ msgid " cancel" #~ msgstr "Змінити" #, fuzzy #~ msgid "search, " #~ msgstr "шукати:" #, fuzzy #~ msgid "contact menu, " #~ msgstr "Ð’ контакт-ліÑÑ‚" #, fuzzy #~ msgid "change status, " #~ msgstr "%s змінив ÑÑ‚Ð°Ñ‚ÑƒÑ Ð· %s на %s" #, fuzzy #~ msgid "general actions, " #~ msgstr " Загальне " #, fuzzy #~ msgid " Store contact list server-side : %s " #~ msgstr " ВпрорÑдковувати контакти в групи: %s " #~ msgid " Send an URL u" #~ msgstr " ÐадіÑлати URL u" #, fuzzy #~ msgid " Send contacts c" #~ msgstr " Переіменувати r" #, fuzzy #~ msgid " Edit details e" #~ msgstr " Інфо кориÑтувача ?" #, fuzzy #~ msgid " List nicknames ?" #~ msgstr " Приховати відлючених F5" #, fuzzy #~ msgid " Block channel messages i" #~ msgstr " ÐадіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ " #~ msgid " Send a message enter" #~ msgstr " ÐадіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ " #~ msgid " Remove user del" #~ msgstr " Видалити кориÑтувача del" #, fuzzy #~ msgid " Ignore user i" #~ msgstr " Видалити кориÑтувача del" #, fuzzy #~ msgid " Remove feed del" #~ msgstr " Видалити кориÑтувача del" #, fuzzy #~ msgid " Unset ignore feed i" #~ msgstr " Видалити кориÑтувача del" #, fuzzy #~ msgid " Ignore feed i" #~ msgstr " Видалити кориÑтувача del" #~ msgid " Change status s" #~ msgstr " Змінити ÑÑ‚Ð°Ñ‚ÑƒÑ s" #~ msgid " Go to contact.. alt-s" #~ msgstr " Перейти до контакту meta-s" #~ msgid " Show offline users F5" #~ msgstr " Показувати відключених F5" #~ msgid " Hide offline users F5" #~ msgstr " Приховати відлючених F5" #, fuzzy #~ msgid " Russian win/koi translation for : %s" #~ msgstr " ÐŸÐµÑ€ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¸Ñ€Ð¸Ð»Ð¸Ñ†Ñ– між Win1251 та Koi-8 : %s " #, fuzzy #~ msgid " Russian win/koi translation : %s " #~ msgstr " ÐŸÐµÑ€ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¸Ñ€Ð¸Ð»Ð¸Ñ†Ñ– між Win1251 та Koi-8 : %s " #~ msgid "+ [yahoo] connecting to the server" #~ msgstr "+ [yahoo] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñерверу" #, fuzzy #~ msgid "+ [yahoo] disconnected" #~ msgstr "+ [icq] від'єднано" #~ msgid "+ [yahoo] adding %s to the contacts" #~ msgstr "+ [yahoo] додаємо %s в контакти" #~ msgid "+ [yahoo] removing %s from the contacts" #~ msgstr "+ [yahoo] видалÑємо %s з контактів" #~ msgid "+ [yahoo] logged in" #~ msgstr "+ [yahoo] законектилиÑÑ" #, fuzzy #~ msgid "+ [yahoo] search finished, %d found" #~ msgstr "+ [icq] пошук завершено, знайдено %d кориÑтувачів" #, fuzzy #~ msgid "+ [jab] connecting to the server" #~ msgstr "+ [aim] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñерверу" #, fuzzy #~ msgid "+ [jab] adding %s to the contacts" #~ msgstr "+ [aim] додаємо %s в контакти" #, fuzzy #~ msgid "+ [jab] removing %s from the contacts" #~ msgstr "+ [aim] видалÑємо %s з контактів" #, fuzzy #~ msgid "+ [jab] conference list fetching finished, %d found" #~ msgstr "+ [irc] Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑпиÑку каналу завершено, знайдено %d кориÑтувачів" #, fuzzy #~ msgid "+ [jab] search finished, %d found" #~ msgstr "+ [icq] пошук завершено, знайдено %d кориÑтувачів" #, fuzzy #~ msgid "+ [jab] logged in" #~ msgstr "+ [aim] законектилиÑÑ" #, fuzzy #~ msgid "+ [jab] disconnected" #~ msgstr "+ [icq] від'єднано" #~ msgid "+ [aim] connecting to the server" #~ msgstr "+ [aim] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñерверу" #~ msgid "+ [aim] removing %s from the contacts" #~ msgstr "+ [aim] видалÑємо %s з контактів" #~ msgid "+ [aim] logged in" #~ msgstr "+ [aim] законектилиÑÑ" #, fuzzy #~ msgid "+ [aim] disconnected" #~ msgstr "+ [icq] від'єднано" #~ msgid "+ [aim] password was changed successfully" #~ msgstr "+ [aim] вдала зміна паролю" #~ msgid "+ [icq] connecting to the server" #~ msgstr "+ [icq] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñерверу" #~ msgid "+ [icq] logged in" #~ msgstr "+ [icq] законектилиÑÑ" #~ msgid "+ [irc] connecting to the server" #~ msgstr "+ [irc] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñерверу" #~ msgid "+ [irc] channel members list fetching finished, %d found" #~ msgstr "+ [irc] Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑпиÑку каналу завершено, знайдено %d кориÑтувачів" #~ msgid "+ [irc] logged in" #~ msgstr "+ [irc] законектилиÑÑ" #, fuzzy #~ msgid "+ [irc] disconnected" #~ msgstr "+ [icq] від'єднано" #, fuzzy #~ msgid "+ [lj] disconnected" #~ msgstr "+ [icq] від'єднано" #, fuzzy #~ msgid " Synchronize contact list " #~ msgstr " Контакт-ліÑÑ‚ " #, fuzzy #~ msgid "You must be logged in to preform the synchronization" #~ msgstr "+ Ñлід під'єднатиÑÑ Ñпочатку" #, fuzzy #~ msgid " Contact list synchronization " #~ msgstr " Контакт-ліÑÑ‚ " #, fuzzy #~ msgid "No contacts to be synchronized" #~ msgstr " Контакт-ліÑÑ‚ " #, fuzzy #~ msgid "Friend list" #~ msgstr "СпиÑок ігноруваннÑ" #~ msgid "+ [msn] connecting to the server" #~ msgstr "+ [msn] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ Ñерверу" #~ msgid "+ [msn] logged in" #~ msgstr "+ [msn] законектилиÑÑ" #~ msgid "+ [msn] disconnected" #~ msgstr "+ [msn] від'єднано" #, fuzzy #~ msgid "+ [yahoo] %s: started typing" #~ msgstr "+ [yahoo] законектилиÑÑ" #, fuzzy #~ msgid "+ [yahoo] %s: stopped typing" #~ msgstr "+ [yahoo] законектилиÑÑ" #, fuzzy #~ msgid "+ [msn] %s: stopped typing" #~ msgstr "+ [yahoo] законектилиÑÑ" #, fuzzy #~ msgid "+ [msn] %s: started typing" #~ msgstr "+ [yahoo] законектилиÑÑ" #, fuzzy #~ msgid "+ [icq] %s has requested our away message" #~ msgstr "%s - запит нашого автоповідомленнÑ, відіÑлано відповідь" #~ msgid "%s requested our away message, sent the response" #~ msgstr "%s - запит нашого автоповідомленнÑ, відіÑлано відповідь" #~ msgid " [all] All of them" #~ msgstr " [вÑÑ–] Ð’ÑÑ– з них" #, fuzzy #~ msgid "+ [jab] incorrect jabber id" #~ msgstr "+ [icq] від'єднано" #~ msgid " enter to select a file, esc to cancel " #~ msgstr " вибрати файл, ÑкаÑувати " #, fuzzy #~ msgid " space to select a directory, esc to cancel " #~ msgstr " вибрати файл, ÑкаÑувати " #~ msgid "SOCKS proxy server to use: " #~ msgstr "ВикориÑтовувати SOCKS-прокÑÑ–: " #~ msgid "SOCKS proxy user name: " #~ msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача SOCKS-прокÑÑ–: " #~ msgid "SOCKS proxy password: " #~ msgstr "Пароль кориÑтувача SOCKS-прокÑÑ–: " #~ msgid "+ [msn] unable to connect to the server" #~ msgstr "+ [msn] не можу законектитиÑÑ" #~ msgid "+ [msn] connecting with %s" #~ msgstr "+ [msn] під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ %s" #~ msgid " Channel manager " #~ msgstr " РозпорÑдник каналів " #, fuzzy #~ msgid " IRC channels manager " #~ msgstr " РозпорÑдник каналів " #, fuzzy #~ msgid "Password" #~ msgstr " Пароль " #, fuzzy #~ msgid "Show" #~ msgstr "Телефон" #~ msgid " Channels " #~ msgstr " Канали " #, fuzzy #~ msgid "shown" #~ msgstr "Телефон" #~ msgid "channel name to add: " #~ msgstr "додати канал: " #~ msgid "+ [aim] disconnected from the network" #~ msgstr "+ [aim] від'єднано від мережі" #~ msgid "+ [irc] disconnected from the network" #~ msgstr "+ [irc] від'єднано від мережі" #, fuzzy #~ msgid "Show on the list" #~ msgstr " Контакт-ліÑÑ‚ " #~ msgid " Sound and colors " #~ msgstr " Звук та кольори " #~ msgid "Notify the user he/she has been added?" #~ msgstr "Повідомити кориÑтувача, що його/Ñ—Ñ— додано?" #~ msgid "+ the notification has been sent to %lu" #~ msgstr "+ відÑлано Ð¾Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð»Ñ %lu" #~ msgid "+ initializing %s engine" #~ msgstr "+ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð²Ð¸Ð³ÑƒÐ½Ð° %s" #~ msgid "+ [yahoo] unable to connect to the server" #~ msgstr "+ [yahoo] не можу законектитиÑÑ" #~ msgid "+ [yahoo] disconnected from the network" #~ msgstr "+ [yahoo] від'єднано від мережі" #~ msgid " IRC channels (join/leave) " #~ msgstr " Канали IRC (приєднатиÑÑ/залишити) " centerim-4.22.10/po/ro.po0000644000175000001440000024576011473011457012022 00000000000000# Romanian messages for centericq # Copyright (C) 2002 Free Software Foundation, Inc. # Ovidiu GhineÅ£ September, 2002. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.8.3\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2002-09-10 22:43+0200\n" "Last-Translator: Ovidiu GhineÅ£ \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "parolă: " #: src/centerim.cc:174 #, fuzzy, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "F2/M meniu curent, F3/S schimbare status, F4/G meniu general, Q ieÅŸire" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Ignoră evenimentele de la %s?" #: src/centerim.cc:278 #, fuzzy, c-format msgid "Remove %s from the contact list as well?" msgstr "+ [aim] ÅŸtergem pe %s din contacte" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Sigur doriÅ£i să-l ÅŸtergeÅ£i pe %s?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Noul nickname: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "SelectaÅ£i un grup in care-l mutăm" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ fiind offline nu puteÅ£i prelua mesaje robot" #: src/centerim.cc:427 #, fuzzy msgid "! cannot connect, free disk space is less than 10k" msgstr "! spaÅ£iu pe disk mai mic de 10k, mergem offline" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "mesaj robot" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "" #: src/centerim.cc:692 src/centerim.cc:747 #, fuzzy, c-format msgid "+ new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] poÅŸtă nouă, %d mesaje" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] poÅŸtă nouă, %d mesaje" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ ultimul mesaj de la %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! rulează incă o copie a centerim" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! aceasta poate cauza probleme. pid %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Nr. mobil: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "" #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ arhiva lui %s este goală" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ utilizatorul %s este deja în contacte" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "SelectaÅ£i grupul in care-l adaugăm" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s a fost adăugat la contacte" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ utilizatorul a revenit" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] status restored" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] setăm automat %s" #: src/centerim.cc:1490 msgid "away" msgstr "away" #: src/centerim.cc:1490 msgid "n/a" msgstr "n/a" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! spaÅ£iu pe disk mai mic de 10k, mergem offline" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! altfel am putea pierdem evenimente si configuraÅ£ii" #: src/centerim.cc:1751 #, fuzzy msgid "Invite to conference.." msgstr "Ne auto-alăturăm la conferinţă" #: src/centerim.cc:1772 #, fuzzy msgid "Select contacts to move" msgstr "Selectează contactele de adăugat la listă" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "" #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "Pe canalele: " #: src/hooks/rsshook.cc:380 msgid "success" msgstr "" #: src/hooks/rsshook.cc:400 #, fuzzy msgid "Title: " msgstr "Titlu" #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "" #: src/hooks/rsshook.cc:402 #, fuzzy msgid "Category: " msgstr "OraÅŸ: " #: src/hooks/rsshook.cc:403 #, fuzzy msgid "Author: " msgstr "* Autorizare : " #: src/hooks/rsshook.cc:405 #, fuzzy msgid "Description: " msgstr "FuncÅ£ie: " #: src/hooks/rsshook.cc:407 #, fuzzy msgid "Link: " msgstr "uin: " #: src/hooks/rsshook.cc:408 #, fuzzy msgid "Comments: " msgstr "comentariu: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "could not resolve hostname" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "could not create socket" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "verificaÅ£i host-ul ÅŸi portul introdus" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] părăsim conferinÅ£a %s" #: src/hooks/yahoohook.cc:686 #, fuzzy msgid "Please join my conference." msgstr "Utilizatorul %s s-a alăturat la conferinţă" #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] nu pot prelua mesajul robot de la %s, %s" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] conectare imposibilă: username si parolă nepotrivite" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] conectare imposibilă: username si parolă nepotrivite" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] conectare imposibilă: contul a fost blocat" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ pt. a reactiva vizitează %s" #: src/hooks/yahoohook.cc:802 #, fuzzy msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/yahoohook.cc:809 #, fuzzy msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] eroare: %s" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "Utilizatorul %s v-ă invită la conferinÅ£a %s, subiectul este: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "Membrii conferinÅ£ei sunt: " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Ne auto-alăturăm la conferinţă" #: src/hooks/yahoohook.cc:967 #, fuzzy, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "Utilizatorul %s s-a alăturat la conferinţă" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "Utilizatorul %s s-a alăturat la conferinţă" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "Utilizatorul %s a părăsit conferinÅ£a" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "Utilizatorul v-a adăugat la contactele lui/ei" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "mesajul a fost: " #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] e-mail de la %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] sistem: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] eroare: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] eroare: %s" #: src/hooks/yahoohook.cc:1154 #, fuzzy msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] deconectat" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] eroare: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] eroare: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] eroare: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "Astăzi este ziua utilizatorului" #: src/hooks/jabberhook.cc:360 #, fuzzy msgid "+ [jab] unable to connect to the server" msgstr "+ [aim] conectare la server imposibilă" #: src/hooks/jabberhook.cc:649 #, fuzzy, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [aim] ÅŸtergem pe %s din contacte" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Mesaj robot:" #: src/hooks/jabberhook.cc:766 #, fuzzy, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [icq] nu pot prelua mesajul robot de la %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "" #: src/hooks/jabberhook.cc:819 #, fuzzy msgid "Unable to connect" msgstr "Mută la contacte" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, fuzzy, c-format msgid "+ [jab] error %d" msgstr "+ [yahoo] eroare: %s" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, fuzzy, c-format msgid "+ [jab] error %d: %s" msgstr "+ [yahoo] eroare: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] conectare la server imposibilă" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "ÃŽmi place enorm profilul AIM al centerim %s. " #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "aim conectare eÅŸuată" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] conectare eÅŸuată: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "Utilizatorul nu are profil" #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] parolă trimisă" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "as requested" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "socket problems" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "username greÅŸit" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "turboing" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "parolă greÅŸită" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "username si parolă nepotrivite" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "" #: src/hooks/icqhook.cc:1065 #, fuzzy msgid "+ [icq] cannot connect" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] deconectat" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "icq motive de deconectare" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "Utilizatorul a acceptat cererea dvs. de autorizare" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "Utilizatorul a respins cererea dvs. de autorizare; mesajul a fost: " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] SMS eÅŸuat pentru %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] SMS eÅŸuat pentru %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] nu pot prelua mesajul robot de la %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Random Chat User" #: src/hooks/gaduhook.cc:161 #, fuzzy msgid "+ [gg] connection failed" msgstr "+ [msn] conexiune de la %s" #: src/hooks/gaduhook.cc:164 #, fuzzy, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/gaduhook.cc:218 #, fuzzy msgid "+ [gg] connection to the server failed" msgstr "+ [aim] conectare la server" #: src/hooks/gaduhook.cc:291 #, fuzzy msgid "+ [gg] connection lost" msgstr "+ [msn] conexiune de la %s" #: src/hooks/gaduhook.cc:404 #, fuzzy, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [icq] nu pot prelua mesajul robot de la %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] conectare la server imposibilă" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] conectare eÅŸuată: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] nickname schimbat cu succes" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Pe canalele: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Dat afară de %s; motiv: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "Utilizatorul ÅŸi-a schimbat nick-ul din %s în %s" #: src/hooks/irchook.cc:1290 #, fuzzy msgid "+ [irc] password sent" msgstr "+ [aim] parolă trimisă" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [aim] parolă trimisă" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "" #: src/hooks/irchook.cc:1442 #, fuzzy, c-format msgid "%s has joined." msgstr "alăturat" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, fuzzy, c-format msgid "reason: %s" msgstr "Trimis pe %s" #: src/hooks/irchook.cc:1489 #, fuzzy, c-format msgid "%s has been kicked by %s" msgstr "+ %s a fost adăugat la contacte" #: src/hooks/irchook.cc:1518 #, fuzzy, c-format msgid "Channel topic now is: %s" msgstr " Canal : %s " #: src/hooks/irchook.cc:1523 #, fuzzy, c-format msgid "set by %s" msgstr "Trimis pe %s" #: src/hooks/irchook.cc:1541 #, fuzzy, c-format msgid "%s has been opped by %s." msgstr "+ %s a fost adăugat la contacte" #: src/hooks/irchook.cc:1557 #, fuzzy, c-format msgid "%s has been deopped by %s." msgstr "+ %s a fost adăugat la contacte" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 #, fuzzy msgid "+ [lj] user lookup finished" msgstr "+ [icq] căutarea în pagini albe s-a incheiat, %d rezultate" #: src/hooks/ljhook.cc:511 #, fuzzy msgid "cannot connect" msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/ljhook.cc:512 #, fuzzy, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [aim] conectare eÅŸuată: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "" #: src/hooks/ljhook.cc:572 #, fuzzy, c-format msgid "+ [lj] login failed: %s" msgstr "+ [aim] conectare eÅŸuată: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "" #: src/hooks/ljhook.cc:578 #, fuzzy, c-format msgid "+ [lj] post error: %s" msgstr "+ [yahoo] eroare: %s" #: src/hooks/ljhook.cc:677 #, fuzzy, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "Utilizatorul v-a adăugat la contactele lui/ei" #: src/hooks/ljhook.cc:687 #, fuzzy, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "Utilizatorul %s v-ă invită la conferinÅ£a %s, subiectul este: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "" #: src/hooks/ljhook.cc:722 #, fuzzy, c-format msgid "+ [lj] %s was added to friends" msgstr "+ %s a fost adăugat la contacte" #: src/hooks/msnhook.cc:430 #, fuzzy, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "" "+ [irc] preluarea listei membrilor canalului s-a încheiat, %d rezultate" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "" #: src/hooks/msnhook.cc:799 #, fuzzy, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] e-mail de la %s <%s>, %s" #: src/hooks/msnhook.cc:905 #, fuzzy msgid "+ [msn] cannot connect: " msgstr "+ [yahoo] conectare imposibilă: " #: src/hooks/msnhook.cc:929 #, fuzzy msgid "verify the hostname and port" msgstr "verificaÅ£i host-ul ÅŸi portul introdus" #: src/hooks/abstracthook.cc:355 #, fuzzy msgid "connecting to the server" msgstr "+ [aim] conectare la server" #: src/hooks/abstracthook.cc:356 #, fuzzy msgid "logged in" msgstr "+ [aim] conectat" #: src/hooks/abstracthook.cc:357 #, fuzzy, c-format msgid "search finished, %d found" msgstr "+ [icq] căutarea în pagini albe s-a incheiat, %d rezultate" #: src/hooks/abstracthook.cc:358 #, fuzzy msgid "password was changed successfully" msgstr "+ [aim] parolă schimbată cu succes" #: src/hooks/abstracthook.cc:359 #, fuzzy msgid "disconnected" msgstr "Deconectat" #: src/hooks/abstracthook.cc:360 #, fuzzy, c-format msgid "adding %s to the contacts" msgstr "+ [aim] adăugăm pe %s la contacte" #: src/hooks/abstracthook.cc:361 #, fuzzy, c-format msgid "removing %s from the contacts" msgstr "+ [msn] ÅŸtergem pe %s din contacte" #: src/hooks/abstracthook.cc:362 #, fuzzy, c-format msgid "members list fetching finished, %d found" msgstr "" "+ [irc] preluarea listei membrilor canalului s-a încheiat, %d rezultate" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "Astăzi este ziua utilizatorului" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Ian" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Feb" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Mar" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Apr" #: src/icqcontact.cc:854 msgid "May" msgstr "Mai" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Iun" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Iun" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Aug" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Sep" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Oct" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Noi" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Dec" #: src/icqgroups.cc:66 msgid "General" msgstr "General" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "Trimis pe %s" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "Peste 60" #: src/icqdialogs.cc:50 #, fuzzy msgid "unknown" msgstr "IM necunoscut" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "General Chat" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Romantism" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Jocuri" #: src/icqdialogs.cc:61 msgid "Students" msgstr "StudenÅ£i" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "20 ÅŸi ceva" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "30 ÅŸi ceva" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "40 ÅŸi ceva" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50 plus" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "Căutând femeie" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Căutând bărbat" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Nume" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Caută profile " #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Åžterge" #: src/icqdialogs.cc:120 msgid "Load" msgstr "ÃŽncarcă" #: src/icqdialogs.cc:205 #, fuzzy msgid "+ you must be logged in first" msgstr "+ trebuie să fii conectat pentru a căuta/adăuga utilizatori" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "încarcă" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "sAlvează" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "ÅŸterge" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Schimbă" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Caută/Adaugă" #: src/icqdialogs.cc:234 #, fuzzy msgid "Join/Create" msgstr "Alatură-te/părăseÅŸte" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Caută/adaugă utilizator(i)" #: src/icqdialogs.cc:249 #, fuzzy msgid " Join/create a channel/conference " msgstr "Pe canalele: " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr "" #: src/icqdialogs.cc:299 msgid " Network " msgstr " ReÅ£ea " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Detalii " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Nickname : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Prenume : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Nume : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Interval vârstă : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Gen : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Limbă : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " LocaÅ£ie " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " OraÅŸ : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Stat : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Å¢ară : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Serviciu " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Companie : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Departament : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " FuncÅ£ie : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Doar online " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Random chat group " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Cuvinte cheie " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Nickname " #: src/icqdialogs.cc:372 #, fuzzy msgid " Search service " msgstr " Caută profile " #: src/icqdialogs.cc:375 #, fuzzy msgid " Search parameters " msgstr " Caută profile " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 #, fuzzy msgid " Feed Parameters " msgstr " Caută profile " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr "" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr "" #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Canal : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Nume : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " SosiÅ£i de la ultima verificare " #: src/icqdialogs.cc:416 #, fuzzy, c-format msgid " Keywords : %s " msgstr " Cuvinte cheie " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 #, fuzzy msgid " Options " msgstr " LocaÅ£ie " #: src/icqdialogs.cc:422 #, fuzzy, c-format msgid " Users with photos only : %s " msgstr " FuncÅ£ie : %s " #: src/icqdialogs.cc:423 #, fuzzy, c-format msgid " Look for online only : %s " msgstr " Doar online " #: src/icqdialogs.cc:428 #, fuzzy msgid " Show users who have you on their list " msgstr "+ utilizatorul %s este deja în contacte" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr "" #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Parolă" #: src/icqdialogs.cc:443 #, fuzzy msgid " Service " msgstr " Caută profile " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Numele noului profil: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "Există un profil cu acest nume. DoriÅ£i să-l suprascrieÅ£i?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Nickname: " #: src/icqdialogs.cc:504 #, fuzzy msgid "Name/Title: " msgstr "Nume: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-mail: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Prenume: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Nume: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "OraÅŸ: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Stat: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Companie: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Departament: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "FuncÅ£ie: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Canal: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Nume: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Cuvinte cheie: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Parolă: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 #, fuzzy msgid "URL: " msgstr "URL" #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "" #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " General " #: src/icqdialogs.cc:595 #, fuzzy msgid " Registration service " msgstr " Progres înregistrare " #: src/icqdialogs.cc:599 #, fuzzy msgid " Registration parameters " msgstr " Progres înregistrare " #: src/icqdialogs.cc:622 #, fuzzy, c-format msgid " Change password : %s " msgstr " Verificare parolă : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Ziua de naÅŸtere : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Vârsta : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Acasă " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Adresa : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " Cod poÅŸtal : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefon : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Telefon mobil : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Homepage : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Mai multe " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1a limbă : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2a limbă : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3a limbă : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Diverse " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Activează indicatorul web al statutului : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Random chat group : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Cerere de autorizare : %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " Stat : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " Despre " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Preluăm detaliile dvs." #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Detaliile dvs. %s " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: detalii " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Gata" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Stai puÅ£in. Detaliile nu au fost incă preluate" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-mail: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Introdu ziua de naÅŸtere (ZZ-LL-AAAA): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Vârstă: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Adresă: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "Cod poÅŸtal: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefon: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Telefon mobil: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Homepage: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Despre" #: src/icqdialogs.cc:869 #, fuzzy msgid "New password: " msgstr " parolă: " #: src/icqdialogs.cc:872 #, fuzzy msgid "Check the new password: " msgstr " Verificare parolă : %s " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "nimic" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X salvează, Esc anulează]" #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Trimite fiÅŸier(e) lui %s, %lu" #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Adaugă" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Comentariu" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Trimite" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " FiÅŸiere " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Comentariu " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "nume fiÅŸier: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "comentariu: " #: src/icqdialogs.cc:1163 #, fuzzy msgid "None" msgstr "Gata" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 #, fuzzy msgid " CenterIM configuration " msgstr " Configurare centerim " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " InterfaÅ£a utilizator " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Schimbă dispozitivul de sunet în : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Schimbă schema de culori în : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr " Cere autorizaÅ£ie" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr "" #: src/icqdialogs.cc:1223 #, fuzzy, c-format msgid " Log panel height : %d " msgstr " Departament : %s " #: src/icqdialogs.cc:1224 #, fuzzy, c-format msgid " Chat panel height : %d " msgstr " Canal : %s " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " Aranjează contactele in grupuri : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Activează suportul bidirecÅ£ional pt. limbă : %s " #: src/icqdialogs.cc:1230 #, fuzzy, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Activează indicatorul web al statutului : %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " Activează indicatorul web al statutului : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr "" #: src/icqdialogs.cc:1241 #, fuzzy, c-format msgid " Switch to language preset : %s " msgstr " 1a limbă : %s " #: src/icqdialogs.cc:1242 #, fuzzy, c-format msgid " Remote charset : %s " msgstr " Departament : %s " #: src/icqdialogs.cc:1243 #, fuzzy, c-format msgid " Local charset : %s " msgstr " Departament : %s " #: src/icqdialogs.cc:1246 #, fuzzy, c-format msgid " For protocols : %s" msgstr " FuncÅ£ie : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Contacte " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Aranjează contactele in grupuri : %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " Aranjează contactele in grupuri : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Ascunde utilizatorii offline : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-spam: omoară mesajele de la necunoscuÅ£i : %s " #: src/icqdialogs.cc:1254 #, fuzzy, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Cerere de autorizare : %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr "" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Citează mesajul la reply : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Verifică poÅŸta locală : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Salvează parolele : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Editează mesajul robot la schimbarea statulului : %s " #: src/icqdialogs.cc:1266 #, fuzzy, c-format msgid " Chat messaging mode for : %s" msgstr " Mod chat al mesajelor : %s " #: src/icqdialogs.cc:1272 #, fuzzy, c-format msgid " Enter key sends message for : %s" msgstr " Citează mesajul la reply : %s " #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Mod chat al mesajelor : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr "" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr "" #: src/icqdialogs.cc:1284 #, fuzzy, c-format msgid " Color contacts according to: %s " msgstr " Aranjează contactele in grupuri : %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " ComunicaÅ£ii " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " Server SMTP : %s " #: src/icqdialogs.cc:1288 #, fuzzy, c-format msgid " HTTP browser : %s " msgstr " Server SMTP : %s " #: src/icqdialogs.cc:1289 #, fuzzy, c-format msgid " HTTP proxy server : %s " msgstr " Server SMTP : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr "" #: src/icqdialogs.cc:1294 #, fuzzy, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Activează indicatorul web al statutului : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr "" #: src/icqdialogs.cc:1299 #, fuzzy msgid " Logging " msgstr " Login : %s " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr "" #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr "" #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr "" #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Evenimente detaliate în ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr "" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Schimbare automată statut în Away (min) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Schimbare automată status în N/A (min) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, fuzzy, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Schimbare automată status în N/A (min) : %d " #: src/icqdialogs.cc:1313 #, fuzzy, c-format msgid " Screen socket path : %s " msgstr " Adresa : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Perioadă auto-Away (0 - dezactivează): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Perioadă auto-N/A (0 - dezactivează): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "Hostname SMTP server: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "" #: src/icqdialogs.cc:1394 #, fuzzy msgid "HTTP proxy server hostname: " msgstr "Hostname SMTP server: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "" #: src/icqdialogs.cc:1446 #, fuzzy msgid "HTTP browser to use: " msgstr "Hostname SMTP server: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "" #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "Cerere de autorizare fară conÅ£inut" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Detaliile dvs. au fost preluate" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Organizează grupurile de contacte" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "RedenumeÅŸte" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "ÅŸtErge" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "mută sUs" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "mută jos" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Selectează" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Grupuri " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Nume grup de creat: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Nume nou pt. grup: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Sigur doriÅ£i să ÅŸtergeÅ£i grupul?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "" #: src/icqdialogs.cc:1826 #, fuzzy msgid "Cancel" msgstr "Schimbă" #: src/icqdialogs.cc:1855 #, fuzzy, c-format msgid " Incoming from %s " msgstr "Primesc %s de la %s" #: src/icqdialogs.cc:1857 #, fuzzy, c-format msgid " Outgoing to %s " msgstr "Trimit %s lui %s" #: src/icqdialogs.cc:1865 msgid "init" msgstr "" #: src/icqdialogs.cc:1866 msgid "start" msgstr "" #: src/icqdialogs.cc:1867 #, fuzzy msgid "work" msgstr "Serviciu" #: src/icqdialogs.cc:1868 #, fuzzy msgid "done" msgstr "Gata" #: src/icqdialogs.cc:1869 msgid "err" msgstr "" #: src/icqdialogs.cc:1870 #, fuzzy msgid "abort" msgstr "Despre" #: src/icqdialogs.cc:1877 #, fuzzy msgid " of " msgstr " Renunţă " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "" #: src/icqdialogs.cc:2023 msgid "private" msgstr "" #: src/icqdialogs.cc:2025 #, fuzzy msgid "friends only" msgstr "Femeie" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr "" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "" #: src/icqdialogs.cc:2040 #, fuzzy msgid "cAncel" msgstr "Schimbă" #: src/icqdialogs.cc:2052 #, fuzzy, c-format msgid " Post to journal : %s " msgstr " FuncÅ£ie : %s " #: src/icqdialogs.cc:2053 #, fuzzy, c-format msgid " Subject : %s " msgstr " Server : %s " #: src/icqdialogs.cc:2058 #, fuzzy, c-format msgid " Security : %s " msgstr " Server : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr "" #: src/icqdialogs.cc:2063 #, fuzzy, c-format msgid " Mood : %s " msgstr " Login : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "" #: src/icqdialogs.cc:2064 #, fuzzy, c-format msgid " Custom mood : %s " msgstr " Nume : %s " #: src/icqdialogs.cc:2066 #, fuzzy, c-format msgid " Music : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:2067 #, fuzzy, c-format msgid " Picture : %s " msgstr " Server : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " Vârsta : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr "" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr "" #: src/icqdialogs.cc:2073 #, fuzzy, c-format msgid " Disallow comments : %s " msgstr " Departament : %s " #: src/icqdialogs.cc:2074 #, fuzzy, c-format msgid " Backdated entry : %s " msgstr " Ziua de naÅŸtere : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "" #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "" #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "" #: src/icqdialogs.cc:2128 #, fuzzy msgid "pgp key quick search" msgstr " Contacte " #: src/icqdialogs.cc:2130 #, fuzzy, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "CautareRapidă: tasteaza pt. găsire, Alt-S din nou, Enter gata" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "" #: src/icqdialogs.cc:2232 #, fuzzy msgid " Use no key" msgstr "InformaÅ£ii utilizator" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "" #: src/imexternal.cc:128 #, fuzzy, c-format msgid "executed external manual action %s, return code = %d" msgstr "s-a executat acÅ£iunea externă %s" #: src/imexternal.cc:160 #, fuzzy, c-format msgid "executed external action %s, return code = %d" msgstr "s-a executat acÅ£iunea externă %s" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Offline" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Online" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Invizibil" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Dispus la discuÅ£ii" #: src/imcontact.cc:114 #, fuzzy msgid "Do not disturb" msgstr " [d] Nu deranjaÅ£i" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Ocupat" #: src/imcontact.cc:116 #, fuzzy msgid "Not available" msgstr " [n] Nedisponibil" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "Away" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "" #: src/imlogger.cc:37 msgid "DND" msgstr "DND" #: src/imlogger.cc:39 msgid "N/A" msgstr "N/A" #: src/imlogger.cc:49 msgid "message" msgstr "mesaj" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "autorizare" #: src/imlogger.cc:53 msgid "e-mail" msgstr "e-mail" #: src/imlogger.cc:54 msgid "notification" msgstr "notificare" #: src/imlogger.cc:55 #, fuzzy msgid "contacts" msgstr "Mută la contacte" #: src/imlogger.cc:56 #, fuzzy msgid "files" msgstr " FiÅŸiere " #: src/imlogger.cc:57 #, fuzzy msgid "event" msgstr "Niciodată" #: src/imlogger.cc:79 msgid "events log started" msgstr "pornim log-ul evenimentelor" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "trimit %s lui %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "primesc %s de la %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "ignorat" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s este offline" #: src/imlogger.cc:141 #, fuzzy, c-format msgid "%s is now %s, was %s" msgstr "Trimis pe %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s este online, cu statului %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s este offline" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "ne-am schimbat statutul %s din %s in %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " IM manager conturi " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Server : %s " #: src/accountmanager.cc:100 #, fuzzy, c-format msgid " Secured : %s " msgstr " Server : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Login : %s " #: src/accountmanager.cc:118 #, fuzzy, c-format msgid " Password (optional) : %s " msgstr " Parolă de setat : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Parolă : %s " #: src/accountmanager.cc:124 #, fuzzy, c-format msgid " Priority : %s " msgstr " OraÅŸ : %s " #: src/accountmanager.cc:129 #, fuzzy, c-format msgid " Import friend list : %s " msgstr " Departament : %s " #: src/accountmanager.cc:134 #, fuzzy, c-format msgid " NickServ password (optional) : %s " msgstr " Parolă de setat : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " Aranjează contactele in grupuri : %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " Aranjează contactele in grupuri : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " ÃŽnregistrează " #: src/accountmanager.cc:155 #, fuzzy, c-format msgid " OpenPGP key: %s " msgstr " Gen : %s " #: src/accountmanager.cc:160 #, fuzzy, c-format msgid " Key passphrase: %s " msgstr " Cuvinte cheie " #: src/accountmanager.cc:168 #, fuzzy msgid " Change nickname " msgstr " Nickname " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Editează detalii " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Setează mesajul robot " #: src/accountmanager.cc:178 msgid " Set external status " msgstr "" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Renunţă " #: src/accountmanager.cc:200 msgid " user name: " msgstr " nume utilizator: " #: src/accountmanager.cc:205 msgid " uin: " msgstr "uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " parolă: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Renunţă la informaÅ£iile contului mai întăi!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Trebuie să te deconectezi mai întăi!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " adresă server: " #: src/accountmanager.cc:285 msgid " priority: " msgstr "" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "" #: src/imcontroller.cc:65 #, fuzzy, c-format msgid " Register on the %s network " msgstr " ÃŽnregistrare reÅ£ea ICQ" #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Tot inainte" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Parolă de setat : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Verificare parolă : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Server de folosit : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Verifică parola introdusă: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Nickname de setat: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Server: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Parolele nu se potrivesc" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "IntroduceÅ£i o parolă" #: src/imcontroller.cc:118 #, fuzzy msgid "Password must be at least 6 chars long" msgstr "IntroduceÅ£i o parolă" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Progres înregistrare " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Conectare la serverul %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Trimitem cererea" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Timpul aÅŸtepare uin a expirat. Reîncercăm?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Reîncercare.." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Am primit noul uin, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Deconectat" #: src/imcontroller.cc:179 #, fuzzy msgid "Unable to connect to icq server. Retry?" msgstr "Nu am putut contacta serverul icq. Reîncercăm?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "" #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "" #: src/imcontroller.cc:228 #, fuzzy msgid "Failed" msgstr "Femeie" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Trebuie să fii conectat la reÅ£eaua ICQ pt a edita detaliile" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "" #: src/imcontroller.cc:284 #, fuzzy msgid "You must be logged to the MSN network to update the friendly nick" msgstr "Trebuie să fii conectat la reÅ£eaua ICQ pt a edita detaliile" #: src/imcontroller.cc:301 #, fuzzy msgid "You must be logged to the Jabber network to update your details" msgstr "Trebuie să fii conectat la reÅ£eaua ICQ pt a edita detaliile" #: src/imcontroller.cc:318 #, fuzzy msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "Trebuie să fii conectat la reÅ£eaua ICQ pt a edita detaliile" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "înregistrarea nu este suportată" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "ÃŽmi place la nebunie mesajul robot pentru %s al %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "eroare eveniment: parametrii insuficienÅ£i" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "eroare eveniment: icq permite doar UIN-uri" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "eroare eveniment: IM necunoscut" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "eroare eveniment: eveniment necunoscut" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s pentru %s a fost pus la poÅŸtă" #: src/icqconf.cc:1616 #, fuzzy msgid "event sending error: error creating directory for the contact" msgstr "eroare eveniment: parametrii insuficienÅ£i" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "caracter necunoscut pt. schimbarea statulului" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "IM necunoscut" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "eroare schimbare statut: " #: src/icqconf.cc:1680 #, fuzzy msgid "Usage: " msgstr "Vârstă: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 #, fuzzy msgid "General options:" msgstr "General Chat" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr "" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr "" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr "" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr "" #: src/icqconf.cc:1689 #, fuzzy msgid " --help display this stuff" msgstr " Schimbă statului s" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr "" #: src/icqconf.cc:1692 #, fuzzy msgid "Events sending options:" msgstr " OpÅ£iuni configurare centerim" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr "" #: src/icqconf.cc:1694 msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr "" #: src/icqconf.cc:1695 msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr "" #: src/icqconf.cc:1700 msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "" #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Cerere de autorizare fară conÅ£inut" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* Cerere autorizare : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* Autorizare : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 #, fuzzy msgid "* Contacts : " msgstr " Contacte " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "" #: src/imotr.cc:99 #, fuzzy msgid "\" not found" msgstr "nealăturat" #: src/imotr.cc:114 msgid "Error" msgstr "" #: src/imotr.cc:116 msgid "Warning" msgstr "" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Info" #: src/imotr.cc:122 src/imotr.cc:315 #, fuzzy msgid " accountname: " msgstr " IM manager conturi " #: src/imotr.cc:123 #, fuzzy msgid " protocol: " msgstr " FuncÅ£ie : %s " #: src/imotr.cc:124 #, fuzzy msgid " username: " msgstr " nume utilizator: " #: src/imotr.cc:125 msgid " title: " msgstr "" #: src/imotr.cc:126 msgid " primary: " msgstr "" #: src/imotr.cc:127 msgid " secondary: " msgstr "" #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr "" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" #: src/imotr.cc:316 msgid " recipient: " msgstr "" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "" #: src/imotr.cc:413 #, fuzzy msgid "yes/no" msgstr "da" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "nu" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "da" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr "" #: src/imotr.cc:462 msgid " Private keys " msgstr "" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "" #: src/imotr.cc:472 #, fuzzy msgid " Account: " msgstr " Conturi.." #: src/imotr.cc:473 #, fuzzy msgid " Protocol: " msgstr " FuncÅ£ie : %s " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "" #: src/imotr.cc:481 msgid " Public keys " msgstr "" #: src/imotr.cc:488 #, fuzzy msgid " User: " msgstr "Vârstă: " #: src/imotr.cc:489 #, fuzzy msgid " Protocol: " msgstr " FuncÅ£ie : %s " #: src/imotr.cc:490 #, fuzzy msgid " Account: " msgstr " Conturi.." #: src/imotr.cc:495 #, fuzzy msgid "Yes" msgstr "da" #: src/imotr.cc:495 #, fuzzy msgid "No" msgstr "Noi" #: src/imotr.cc:499 #, fuzzy msgid " Verified: " msgstr " Caută profile " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "" #: src/imotr.cc:585 msgid "Plaintext" msgstr "" #: src/imotr.cc:586 msgid "Encrypted" msgstr "" #: src/imotr.cc:587 msgid "Finished" msgstr "Terminat" #: src/imotr.cc:588 #, fuzzy msgid "Unknown" msgstr "IM necunoscut" #: src/imotr.cc:611 msgid "No Encryption" msgstr "" #: src/imotr.cc:615 msgid "Verified" msgstr "" #: src/imotr.cc:617 msgid "Unverified" msgstr "" #: src/icqface.cc:52 msgid "Male" msgstr "Bărbat" #: src/icqface.cc:53 msgid "Female" msgstr "Femeie" #: src/icqface.cc:56 msgid "Not specified" msgstr "Nespecificat" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "Următorul" #: src/icqface.cc:63 msgid "Fwd" msgstr "Fwd" #: src/icqface.cc:64 msgid "Reply" msgstr "Reply" #: src/icqface.cc:65 msgid "Open" msgstr "Deschide" #: src/icqface.cc:66 msgid "Accept" msgstr "Acceptă" #: src/icqface.cc:67 msgid "Reject" msgstr "Respinde" #: src/icqface.cc:68 msgid "User info" msgstr "InformaÅ£ii utilizator" #: src/icqface.cc:70 msgid "Prev" msgstr "" #: src/icqface.cc:78 msgid "sound card" msgstr "placă de sunet" #: src/icqface.cc:79 msgid "speaker" msgstr "speaker" #: src/icqface.cc:80 msgid "disable" msgstr "dezactivează" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "nu schimba" #: src/icqface.cc:88 msgid "dark" msgstr "intunecat" #: src/icqface.cc:89 msgid "blue" msgstr "albastru" #: src/icqface.cc:97 msgid "protocol" msgstr "" #: src/icqface.cc:98 #, fuzzy msgid "status" msgstr "Schimbă" #: src/icqface.cc:118 msgid "mode 1" msgstr "modul 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "modul 2" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr "" #: src/icqface.cc:274 #, fuzzy msgid "Send an URL" msgstr " Trimite SMS" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " Trimite SMS" #: src/icqface.cc:276 #, fuzzy msgid "Send contacts" msgstr "Căutăm contactele.." #: src/icqface.cc:277 msgid " Request authorization" msgstr " Cere autorizaÅ£ie" #: src/icqface.cc:278 #, fuzzy msgid "Edit details" msgstr " Detalii " #: src/icqface.cc:279 #, fuzzy msgid "Fetch away message" msgstr " Preia mesajul robot f" #: src/icqface.cc:280 #, fuzzy msgid "Add to list" msgstr " Adaugă la contacte a" #: src/icqface.cc:281 #, fuzzy msgid "Rename contact" msgstr " RedenumeÅŸte contactul r" #: src/icqface.cc:282 msgid " Move to group.." msgstr " Mută in grupul.." #: src/icqface.cc:283 msgid " Ping" msgstr "" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "" #: src/icqface.cc:285 #, fuzzy msgid " Send file(s)" msgstr " Trimite fiÅŸier(e) lui %s, %lu" #: src/icqface.cc:286 #, fuzzy msgid " Invite to conference.." msgstr "Ne auto-alăturăm la conferinţă" #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Trimite mesaj canalului enter" #: src/icqface.cc:294 #, fuzzy msgid "Channel chat history" msgstr " Arhivă canal h" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Åžterge canalul del" #: src/icqface.cc:296 #, fuzzy msgid " Join channel" msgstr "Pe canalele: " #: src/icqface.cc:297 msgid " Leave channel" msgstr "" #: src/icqface.cc:298 #, fuzzy msgid "List nicknames" msgstr "Nume: " #: src/icqface.cc:301 #, fuzzy msgid "UnBlock channel messages" msgstr " Trimite mesaj canalului enter" #: src/icqface.cc:303 #, fuzzy msgid "Block channel messages" msgstr " Trimite mesaj canalului enter" #: src/icqface.cc:310 #, fuzzy msgid "Send a message" msgstr " Setează mesajul robot " #: src/icqface.cc:312 #, fuzzy msgid "Event history" msgstr " Arhivă h" #: src/icqface.cc:313 #, fuzzy msgid "Remove user" msgstr "Åžterge" #: src/icqface.cc:314 #, fuzzy msgid "User's details" msgstr " Detalii utilizator ?" #: src/icqface.cc:315 msgid "External actions.." msgstr "" #: src/icqface.cc:318 #, fuzzy msgid "Unset ignore user" msgstr " Ignoră utilizator i" #: src/icqface.cc:318 #, fuzzy msgid "Ignore user" msgstr "Lista ignoră" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "" #: src/icqface.cc:328 #, fuzzy msgid "Force check" msgstr " Ignoră utilizator i" #: src/icqface.cc:435 #, fuzzy msgid "Change status" msgstr "Schimbă" #: src/icqface.cc:436 #, fuzzy msgid "Go to contact.." msgstr "Mută la contacte" #: src/icqface.cc:437 msgid " Accounts.." msgstr " Conturi.." #: src/icqface.cc:438 #, fuzzy msgid " CenterIM config options" msgstr " OpÅ£iuni configurare centerim" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr "" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Caută/adaugă utilizatori" #: src/icqface.cc:445 #, fuzzy msgid " Join channel/conference" msgstr "Pe canalele: " #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr "" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Vezi/editează lista ignoră" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Vezi/editează lista invizibilă" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Vezi/editează lista vizibilă" #: src/icqface.cc:455 #, fuzzy msgid "Show offline users" msgstr " Ascunde utilizatorii offline : %s " #: src/icqface.cc:457 #, fuzzy msgid "Hide offline users" msgstr " Ascunde utilizatorii offline : %s " #: src/icqface.cc:460 #, fuzzy msgid " Organize contact groups" msgstr "Organizează grupurile de contacte" #: src/icqface.cc:461 msgid " Mass group move.." msgstr "" #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Detalii" #: src/icqface.cc:905 msgid "Message" msgstr "Mesaj" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Căutare nouă" #: src/icqface.cc:924 #, fuzzy msgid "Contact to add" msgstr " Contacte " #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Căutăm contactele.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Rezultatele cautării [gata]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "InformaÅ£ii despre %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Nickname" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "" #: src/icqface.cc:1112 msgid "found" msgstr "" #: src/icqface.cc:1114 msgid "used" msgstr "" #: src/icqface.cc:1114 #, fuzzy msgid "not used" msgstr "nealăturat" #: src/icqface.cc:1116 #, fuzzy msgid "not found" msgstr "nealăturat" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2a e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "E-mail vechi" #: src/icqface.cc:1134 msgid "Gender" msgstr "Gen" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Ziua de naÅŸtere" #: src/icqface.cc:1136 msgid "Age" msgstr "Vârstă" #: src/icqface.cc:1137 msgid "Languages" msgstr "Limbi" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Ultimul IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Ultima dată văzut" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Niciodată" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "" #: src/icqface.cc:1189 #, fuzzy msgid "seconds" msgstr "Trimite" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr " FiÅŸiere " #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "Căutăm contactele.." #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "autorizare" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Adresă" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "LocaÅ£ie" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "Cod poÅŸtal" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefon" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Telefon mobil" #: src/icqface.cc:1259 msgid "Timezone" msgstr "Fus orar" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Homepage" #: src/icqface.cc:1300 msgid "Company" msgstr "Companie" #: src/icqface.cc:1301 msgid "Department" msgstr "Departament" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Titlu" #: src/icqface.cc:1346 msgid "Interests" msgstr "Interese" #: src/icqface.cc:1358 msgid "Background" msgstr "Trecut" #: src/icqface.cc:1376 #, fuzzy msgid "Handle" msgstr "Bărbat" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "" #: src/icqface.cc:1378 msgid "Version" msgstr "" #: src/icqface.cc:1379 msgid "Encoding" msgstr "" #: src/icqface.cc:1382 msgid "Link" msgstr "" #: src/icqface.cc:1384 msgid "Frequency" msgstr "" #: src/icqface.cc:1385 #, fuzzy msgid "Last check" msgstr "Ultima dată văzut" #: src/icqface.cc:1386 msgid "Next check" msgstr "" #: src/icqface.cc:1387 #, fuzzy msgid "Last result" msgstr "as requested" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "" #: src/icqface.cc:1404 #, fuzzy msgid "Now" msgstr "Noi" #: src/icqface.cc:1423 #, fuzzy msgid "Full name" msgstr "nume fiÅŸier: " #: src/icqface.cc:1442 #, fuzzy, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "F2 pt URL-uri, ESC inchide" #: src/icqface.cc:1447 #, fuzzy, c-format msgid "user info for %s" msgstr "InformaÅ£ii utilizator" #: src/icqface.cc:1456 msgid "Check" msgstr "" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Editează" #: src/icqface.cc:1456 msgid "LJ" msgstr "" #: src/icqface.cc:1460 #, fuzzy msgid "Retreive" msgstr "Preia" #: src/icqface.cc:1466 #, fuzzy msgid "Friend of" msgstr "Femeie" #: src/icqface.cc:1472 msgid "Home" msgstr "Acasă" #: src/icqface.cc:1472 msgid "Work" msgstr "Serviciu" #: src/icqface.cc:1472 msgid "More" msgstr "Mai multe" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Preia" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] reÅ£eaua ICQ" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr "" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr "" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr "" #: src/icqface.cc:1622 msgid " All protocols" msgstr "" #: src/icqface.cc:1623 #, fuzzy msgid " Already logged in only" msgstr "deja conectat" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr "" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr "" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Mută la contacte" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Lista ignoră" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Lista vizibilă" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Lista invizibilă" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Selectează contactele de adăugat la listă" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Destinatari" #: src/icqface.cc:2269 #, fuzzy, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "CautareRapidă: tasteaza pt. găsire, Alt-S din nou, Enter gata" #: src/icqface.cc:2272 #, fuzzy msgid "contact list quick search" msgstr " Contacte " #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ nici un URL in contextul curent" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URL-uri in contextul curent" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "" #: src/icqface.cc:2441 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "Ctrl-X trimite, Ctrl-P multiplu, Ctrl-O arhivă, Alt-? detalii, ESC anulează" #: src/icqface.cc:2442 #, fuzzy, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "Ctrl-X trimite, Ctrl-P multiplu, Ctrl-O arhivă, Alt-? detalii, ESC anulează" #: src/icqface.cc:2477 #, fuzzy, c-format msgid "Outgoing %s" msgstr "Trimit %s lui %s" #: src/icqface.cc:2610 #, fuzzy msgid "Send contacts.." msgstr "Căutăm contactele.." #: src/icqface.cc:2670 #, fuzzy msgid "file name: " msgstr "nume fiÅŸier: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "Trimit %s lui %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Trimis pe %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "Primesc %s de la %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Primit pe %s" #: src/icqface.cc:3182 #, fuzzy, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "F2 pt URL-uri, ESC inchide" #: src/icqface.cc:3229 #, fuzzy, c-format msgid "%s from %s, received on %s" msgstr "Primit pe %s" #: src/icqface.cc:3230 #, fuzzy, c-format msgid "%s to %s, sent on %s" msgstr "Trimis pe %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "Arhivă pt. %s, %d evenimente in total" #: src/icqface.cc:3339 #, fuzzy, c-format msgid "%s search, %s again, %s cancel" msgstr "S caută, L din nou, ESC anulează" #: src/icqface.cc:3348 msgid "search for: " msgstr "caută: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] sistem: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] e-mail de la %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s este online, cu statului %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s ÅŸi-a schimbat statutul in %s din %s" #~ msgid " [o] Online" #~ msgstr " [o] Online" #~ msgid " [_] Offline" #~ msgstr " [_] Offline" #~ msgid " [a] Away" #~ msgstr " [a] Away" #~ msgid " [c] Occupied" #~ msgstr " [c] Ocupat" #~ msgid " [f] Free for chat" #~ msgstr " [f] Deschis la discuÅ£ii" #~ msgid " [i] Invisible" #~ msgstr " [i] Invizibil" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Verificare parolă : %s " #, fuzzy #~ msgid " Convert from : %s " #~ msgstr " Å¢ară : %s " #, fuzzy #~ msgid " Convert to : %s " #~ msgstr " Å¢ară : %s " #~ msgid "already logged" #~ msgstr "deja conectat" #~ msgid "" #~ "event sending error: the destination contact doesn't exist on your list" #~ msgstr "eroare eveniment: destinatoarul nu este in contactele dvs." #, fuzzy #~ msgid "to URLs, " #~ msgstr "F2 pt URL-uri, ESC inchide" #, fuzzy #~ msgid "URLs, " #~ msgstr "URL" #, fuzzy #~ msgid " details, " #~ msgstr " Detalii " #, fuzzy #~ msgid " cancel" #~ msgstr "Schimbă" #, fuzzy #~ msgid "search, " #~ msgstr "caută: " #, fuzzy #~ msgid "contact menu, " #~ msgstr "Mută la contacte" #, fuzzy #~ msgid "change status, " #~ msgstr "%s ÅŸi-a schimbat statutul in %s din %s" #, fuzzy #~ msgid "general actions, " #~ msgstr "General Chat" #~ msgid " Store contact list server-side : %s " #~ msgstr " Salvează contactele pe server : %s " #~ msgid " Send an URL u" #~ msgstr " Trimite URL u" #, fuzzy #~ msgid " Send contacts c" #~ msgstr " RedenumeÅŸte contactul r" #~ msgid " Edit details e" #~ msgstr " Editează detalii e" #, fuzzy #~ msgid " List nicknames ?" #~ msgstr " Ascunde utilizatorii offline F5" #, fuzzy #~ msgid " Block channel messages i" #~ msgstr " Trimite mesaj canalului enter" #~ msgid " Send a message enter" #~ msgstr " Trimite mesaj enter" #~ msgid " Remove user del" #~ msgstr " Åžterge utilizator del" #~ msgid " Ignore user i" #~ msgstr " Ignoră utilizator i" #, fuzzy #~ msgid " Remove feed del" #~ msgstr " Åžterge utilizator del" #, fuzzy #~ msgid " Unset ignore feed i" #~ msgstr " Ignoră utilizator i" #, fuzzy #~ msgid " Ignore feed i" #~ msgstr " Ignoră utilizator i" #~ msgid " Change status s" #~ msgstr " Schimbă statului s" #~ msgid " Go to contact.. alt-s" #~ msgstr " Du-te la contactul.. alt-s" #~ msgid " Show offline users F5" #~ msgstr " Arată utilizatorii offline F5" #~ msgid " Hide offline users F5" #~ msgstr " Ascunde utilizatorii offline F5" #, fuzzy #~ msgid " Russian win/koi translation for : %s" #~ msgstr " Este necesară transformarea win1251-koi8 : %s " #, fuzzy #~ msgid " Russian win/koi translation : %s " #~ msgstr " Este necesară transformarea win1251-koi8 : %s " #~ msgid "+ [yahoo] connecting to the server" #~ msgstr "+ [yahoo] conectare la server" #~ msgid "+ [yahoo] disconnected" #~ msgstr "+ [yahoo] deconectat" #~ msgid "+ [yahoo] adding %s to the contacts" #~ msgstr "+ [yahoo] adăugăm %s la contacte" #~ msgid "+ [yahoo] removing %s from the contacts" #~ msgstr "+ [yahoo] ÅŸtergem pe %s din contacte" #~ msgid "+ [yahoo] logged in" #~ msgstr "+ [yahoo] conectat" #, fuzzy #~ msgid "+ [yahoo] search finished, %d found" #~ msgstr "+ [icq] căutarea în pagini albe s-a incheiat, %d rezultate" #, fuzzy #~ msgid "+ [jab] connecting to the server" #~ msgstr "+ [aim] conectare la server" #, fuzzy #~ msgid "+ [jab] adding %s to the contacts" #~ msgstr "+ [aim] adăugăm pe %s la contacte" #, fuzzy #~ msgid "+ [jab] removing %s from the contacts" #~ msgstr "+ [aim] ÅŸtergem pe %s din contacte" #, fuzzy #~ msgid "+ [jab] conference list fetching finished, %d found" #~ msgstr "" #~ "+ [irc] preluarea listei membrilor canalului s-a încheiat, %d rezultate" #, fuzzy #~ msgid "+ [jab] search finished, %d found" #~ msgstr "+ [icq] căutarea în pagini albe s-a incheiat, %d rezultate" #, fuzzy #~ msgid "+ [jab] logged in" #~ msgstr "+ [aim] conectat" #, fuzzy #~ msgid "+ [jab] disconnected" #~ msgstr "+ [yahoo] deconectat" #~ msgid "+ [aim] connecting to the server" #~ msgstr "+ [aim] conectare la server" #~ msgid "+ [aim] removing %s from the contacts" #~ msgstr "+ [aim] ÅŸtergem pe %s din contacte" #~ msgid "+ [aim] logged in" #~ msgstr "+ [aim] conectat" #, fuzzy #~ msgid "+ [aim] disconnected" #~ msgstr "+ [icq] deconectat" #~ msgid "+ [aim] password was changed successfully" #~ msgstr "+ [aim] parolă schimbată cu succes" #~ msgid "+ [icq] connecting to the server" #~ msgstr "+ [icq] conectare la server" #~ msgid "+ [icq] logged in" #~ msgstr "+ [icq] conectat" #~ msgid "+ [irc] connecting to the server" #~ msgstr "+ [irc] conectare la server" #~ msgid "+ [irc] channel members list fetching finished, %d found" #~ msgstr "" #~ "+ [irc] preluarea listei membrilor canalului s-a încheiat, %d rezultate" #~ msgid "+ [irc] logged in" #~ msgstr "+ [irc] conectat" #, fuzzy #~ msgid "+ [irc] disconnected" #~ msgstr "+ [icq] deconectat" #, fuzzy #~ msgid "+ [lj] disconnected" #~ msgstr "+ [yahoo] deconectat" #~ msgid " Synchronize contact list " #~ msgstr " Sincronizare contacte " #~ msgid "You must be logged in to preform the synchronization" #~ msgstr "Trebuie să fii conectat pt. a face sincronizarea" #~ msgid " Contact list synchronization " #~ msgstr " Sincronizare contacte " #~ msgid "Starting the synchronization process" #~ msgstr "ÃŽncepe procesul de sincronizare" #~ msgid "Attempt #%d" #~ msgstr "ÃŽncercarea #%d" #~ msgid ".. %d already synchronized, %d contacts to be stored" #~ msgstr ".. %d deja sincronizat, %d contacte de stocat" #~ msgid "Too many attempts, gave up" #~ msgstr "Prea multe încercări, renunÅ£" #~ msgid " Uploading buddies " #~ msgstr " Uploading buddies " #, fuzzy #~ msgid "No contacts to be synchronized" #~ msgstr " Sincronizare contacte " #, fuzzy #~ msgid ".. all of them are already stored server-side" #~ msgstr "Nici un contact de sincronizat; toate sunt stocate pe server" #~ msgid "%d contacts are do be stored server-side. Add them now?" #~ msgstr "%d contacte de stocat pe server. Le adaugăm acum?" #~ msgid ".. adding %s" #~ msgstr ".. adăugăm %s" #, fuzzy #~ msgid "Friend list" #~ msgstr "Lista ignoră" #~ msgid "+ [msn] connecting to the server" #~ msgstr "+ [msn] conectare la server" #~ msgid "+ [msn] logged in" #~ msgstr "+ [msn] conectat" #~ msgid "+ [msn] disconnected" #~ msgstr "+ [msn] deconectat" #~ msgid "+ [yahoo] %s: started typing" #~ msgstr "+ [yahoo] %s: a inceput sa tasteze" #~ msgid "+ [yahoo] %s: stopped typing" #~ msgstr "+ [yahoo] %s: s-a oprit din tastat" #, fuzzy #~ msgid "+ [msn] %s: stopped typing" #~ msgstr "+ [yahoo] %s: s-a oprit din tastat" #, fuzzy #~ msgid "+ [msn] %s: started typing" #~ msgstr "+ [yahoo] %s: a inceput sa tasteze" #, fuzzy #~ msgid "+ [icq] %s has requested our away message" #~ msgstr "%s a cerut mesajul nostru robot, am trimis răspunsul" #~ msgid "%s requested our away message, sent the response" #~ msgstr "%s a cerut mesajul nostru robot, am trimis răspunsul" #~ msgid " [all] All of them" #~ msgstr " [all] Toate" #, fuzzy #~ msgid "+ [jab] incorrect jabber id" #~ msgstr "+ [yahoo] deconectat" #~ msgid " enter to select a file, esc to cancel " #~ msgstr " enter pt. a selecta un fiÅŸier, esc pt. anulare " #, fuzzy #~ msgid " space to select a directory, esc to cancel " #~ msgstr " enter pt. a selecta un fiÅŸier, esc pt. anulare " #~ msgid "SOCKS proxy server to use: " #~ msgstr "Server SOCKS server de folosit: " #~ msgid "SOCKS proxy user name: " #~ msgstr "Nume utilizator al SOCKS proxy: " #~ msgid "SOCKS proxy password: " #~ msgstr "Parolă SOCKS proxy" #~ msgid "+ [msn] unable to connect to the server" #~ msgstr "+ [msn] conectare la server imposibilă" #~ msgid "+ [msn] connecting with %s" #~ msgstr "+ [msn] conectare cu %s" #~ msgid " Channel manager " #~ msgstr " Manager canale " #~ msgid " IRC channels manager " #~ msgstr " Manager canale IRC" #, fuzzy #~ msgid "Password" #~ msgstr " Parolă" #, fuzzy #~ msgid "Show" #~ msgstr "vizibil" #~ msgid " Channels " #~ msgstr " Canale " #~ msgid "shown" #~ msgstr "vizibil" #~ msgid "hidden" #~ msgstr "invizibil" #~ msgid "channel name to add: " #~ msgstr "nume canal de adăugat: " #~ msgid "+ [aim] disconnected from the network" #~ msgstr "+ [aim] deconectat de la reÅ£ea" #~ msgid "+ [irc] disconnected from the network" #~ msgstr "+ [irc] deconectat de la reÅ£ea" #~ msgid "Show on the list" #~ msgstr "Arată în listă" centerim-4.22.10/po/de.po0000644000175000001440000023623611473011457011770 00000000000000# German translation of centerim # Copyright (C) 2005 Gerfried Fuchs # Florian Müller , 2001. # Gerfried Fuchs , 2005. # Boris Petersen , 2007. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.22.6\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2009-11-19 23:05+0100\n" "Last-Translator: Boris Petersen \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "Passwort: " #: src/centerim.cc:174 #, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" "%s Kontakt-Menü, %s Ändere Status, %s Allgemeine Aktionen, %s/%s vor/zurück, " "%s Beenden" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Alle Handlungen von %s ignorieren?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "%s ebenfalls aus der Kontaktliste entfernen?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Willst du %s wirklich entfernen?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Neuer Nickname zum anzeigen: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Wähle Liste aus, in die der Benutzer kommen soll" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ kann keine Abwesenheitsnotiz holen wenn offline" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "" "! Verbindung nicht herstellbar, der freie Plattenplatz ist geringer als 10k" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "Abwesenheitsnotiz" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! Unterstützung für %s wurde beim Programmbau ausgeschaltet" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ Neue E-Mail erhalten, %d Nachrichten" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] Neue Mail erhalten, %d Nachrichten" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ Letzte Nachricht von: %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ Die %s-Konfiguration wurde geändert, wird neu geladen" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! Eine weitere laufende Kopie von centerim entdeckt" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! Das könnte Probleme verursachen. PID %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Handynummer: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "Verzeichnis zum Speichern von Datei(en): " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "Das angegebene Verzeichnis ist nicht schreibbar" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "Das angegebene Verzeichnis ist nicht vorhanden" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ keine vergangenen Einträge für %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ %s befindet sich bereits in der Liste" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Wähle Liste für den Kontakt" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s wurde in die Liste aufgenommen" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ Der Benutzer ist zurück" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] Status wiederhergestellt" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] Automatisch %s gesetzt" #: src/centerim.cc:1490 msgid "away" msgstr "abwesend" #: src/centerim.cc:1490 msgid "n/a" msgstr "nicht verfügbar" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "+ setze nich verfügbar nach screen detached wurde" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "! Der Pfad zum Screen Socket existiert nicht!" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "! Korrigiere Pfad oder schalte screen's auto-status-Änderung ab" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! Weniger als 10k Plattenplatz frei, gehe offline" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! oder wir werden Ereignisse oder Konigurationen verlieren" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "In Konferenz einladen..." #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "Wähle Kontakte zum Verschieben" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "Gewählte Benutzer gemeinsam verschieben nach..." #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "konnte nicht holen" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "falsches XML" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "kein oder Tag gefunden" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "kein oder Tag gefunden" #: src/hooks/rsshook.cc:368 msgid "wrong or tag" msgstr "falscher oder Tag" #: src/hooks/rsshook.cc:380 msgid "success" msgstr "Erfolg" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "Titel: " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "Veröffentlicht am: " #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "Kategorie: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "Autor: " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "Beschreibung: " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "Link: " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "Bemerkungen: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] Verbindung nicht herstellbar: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "Rechnername kann nicht aufgelöst werden" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "Socket kann nicht erstellt werden" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "Überprüfe den Host und Port des Pagers" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] verlasse die %s Konferenz" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "Bitte trete meiner Konferenz bei." #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Individuelle Statusnachricht" #: src/hooks/yahoohook.cc:703 #, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "" "+ [yahoo] kann Abwesenheitsnotiz von %s, %s nicht bekommen (vielleicht keine " "gesetzt)" #: src/hooks/yahoohook.cc:779 msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] Kein login möglich " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] Einloggen unmöglich: Benutzer und Passwort passen nicht" #: src/hooks/yahoohook.cc:791 msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] Einloggen unmöglich: Benutzer existiert nicht" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] Enloggen umöglich: Das Konto wurde gesperrt" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ Zum Entsperren %s besuchen" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] ein weiterer Login erkannt" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] Server hat den Socket geschlossen" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "" "Der Benutzer %s hat dich in die %s-Konferenz eingeladen, das Thema lautet: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "Derzeitige Konferenzmitglieder sind: " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Automatisch der Konferenz beigetreten" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "Der Benutzer %s hat deine Einladung zur Konferenz abgelehnt" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "Der Benutzer %s ist der Konferenz beigetreten" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "Der Benutzer %s hat die Konferenz verlassen" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "Hat dich in ihre/seine Kontaktliste aufgenommen" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "Die Nachricht war:" #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] Email von %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] System: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] Fehler: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] Fehler: %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] Direkte Verbindung fehlgeschlagen" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] Kein login möglich " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] Kein login möglich " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] Kein login möglich " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] Kein login möglich " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] Fehler: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] Fehler: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] Kein login möglich " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] Verbindung nicht herstellbar: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] Fehler: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "Der Benutzer hat heute Geburtstag" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] Kein Verbindungsaufbau zum Server möglich" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] melde vom %s Agent ab" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Abwesenheitsnotiz:" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] keine Abwesenheitsnotiz von %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "Falscher Spitzname angegeben, Registrierung nicht möglich" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "Kein Verbindungsaufbau möglich" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "Die Gegenstelle verwendet %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "Standard Jabber-Konferenz Server" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, c-format msgid "+ [jab] error %d" msgstr "+ [jab] Fehler %d" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] Fehler %d: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "Der Benutzer möchte deinen Anwesenheitsstatus verfolgen dürfen" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" "Der Benutzer hat dich von seiner Kontaktliste entfernt (abbestellt, in der " "Jabber-Sprache)" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] Kein Verbindungsaufbau zum Server möglich" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "Das Standard-AIM-Profil von centerim %s gefällt mir wirklich." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "aim-Verbindung fehlgeschlagen" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] Verbindung fehlgeschlagen: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "Der Benutzer hat keine Profil Informationen." #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] Passwort gesendet" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "wie verlangt" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "Socket Proleme" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "Falscher Benutzername" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "turboing" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "falsches Passwort" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "Benutzername und Passwort stimmen nicht überein" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "doppeltes Login gefunden" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] cannot connect" msgstr "+ [icq] Verbindung nicht herstellbar" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] Verbindung getrennt" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "Grund der ICQ-Verbindungstrennung" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "Der Benutzer hat deine Anfrage akzeptiert" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "Der Benutzer hat deine Anfrage abgelehnt" #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] SMS fehlgeschlagen an: %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] SMS an %s fehlgeschlagen" #: src/hooks/icqhook.cc:1331 #, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "" "+ [icq] bekomme keine Abwesenheitsnotiz von %s, %s (vielleicht keine " "gesetzt?)" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Zufälliger Chatter" #: src/hooks/gaduhook.cc:161 msgid "+ [gg] connection failed" msgstr "+ [gg] Verbindung fehlgeschlagen" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [gg] Kann %s nicht auflösen" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "+ [gg] Verbindung zum Server fehlgeschlagen" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "+ [gg] Verbindung verloren" #: src/hooks/gaduhook.cc:404 #, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [gg] Keine Abwesenheitsnotiz von %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] Keine Verbindung zum Server möglich" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] Verbindung fehlgeschlagen: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] Spitzname erfolgreich geändert" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "In Kanälen: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Gekickt von %s; Grund: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "Der Benutzer änderte seinen Spitznamen von %s auf %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] Passwort gesendet" #: src/hooks/irchook.cc:1299 msgid "+ [irc] nick password sent" msgstr "+ [irc] Passwort gesendet" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "PING Antwort vom Benutzer: %d Sekunde(n)" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s tritt ein" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s ist gegangen" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "Grund: %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s wurde von %s gekickt" #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "Das Topic ist nun: %s" #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "gesetzt von %s" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s wurde von %s geopt" #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s wurde von %s deopt" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s hat dich geopt" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "Du bist hier op" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s hat dich deopt" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] Benutzer lookup beendet" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "Verbindung nicht herstellbar" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] HTTP fehlgeschlagen: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "Nachricht vom Server: " #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] Login fehlgeschlagen: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] erfolgreich geposted, die id ist %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] schreib Fehler: %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Der Benutzer %s (%s) hat dich in ihre/seine Kontaktliste aufgenommen\n" "\n" "Journaladresse: %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Der Benutzer %s hat dich von seiner/ihrer Freundesliste entfernt\n" "\n" "Journal-Adresse: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] Fehler beim Löschen des Freundes" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] Der Benutzer wurde von deiner Freundesliste entfernt" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] Freund konnte nicht hinzugefügt werden" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s wurde zu den Freunden hinzugefügt" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] Umgekehrtes Benutzer auflisten beendet, %d gefunden" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "+ [msn] Ungelesene E-Mail: %d im Eingang, %d in Ordnern" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] E-Mail von %s, %s" #: src/hooks/msnhook.cc:905 msgid "+ [msn] cannot connect: " msgstr "+ [msn] Verbindung nicht herstellbar: " #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "überprüfe den Hostname und den Port" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "Verbinde mit dem Server" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "loggte sich ein" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "Suche beendet, %d gefunden" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "Passwort wurde erfolgreich geändert" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "Verbindung getrennt" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "füge %s der Kontaktliste hinzu" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "entferne %s von der Kontaktliste" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "Mitgliederliste geholt, %d gefunden" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "Der Benutzer hat heute Geburtstag" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Jan" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Feb" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Mär" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Apr" #: src/icqcontact.cc:854 msgid "May" msgstr "Mai" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Jun" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Jul" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Aug" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Sep" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Okt" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Nov" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Dez" #: src/icqgroups.cc:66 msgid "General" msgstr "Allgemein" #: src/eventmanager.cc:124 #, c-format msgid "event from %s (%s)" msgstr "Ereignis von %s (%s)" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "Ü-60" #: src/icqdialogs.cc:50 msgid "unknown" msgstr "unbekannt" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Allgemein" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Romantik" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Spiele" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Studenten" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "Ü-20" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "Ü-30" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "Ü-40" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "Ü-50" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "Suchende Frauen" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Suchende Männer" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "Status und Aktivität" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "Status und Name" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "Aktivität" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Name" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Durchsuche Profile " #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Löschen" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Laden" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ Du musst dich erst einloggen" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "lAde" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "speichern" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "Löschen" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "Ändern" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Suchen/Hinzufügen" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "betreten/erstellen" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "Link" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Benutzer suchen/hinzufügen " #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " einem/n Kanal / eine/r Konferenz beitrehten / erstellen" #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " RSS Feed verlinken " #: src/icqdialogs.cc:299 msgid " Network " msgstr " Netzwerk " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Details " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " Spitzname: %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail: %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Vorname: %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Nachname: %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " Alter: %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Geschlecht: %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Sprache: %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " Herkunft " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Stadt: %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Staat: %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Land: %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Beruf " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Firma: %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Abteilung: %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Position: %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Nur Online " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " zufällige Chat Gruppe " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Schlüsselwörter " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " Spitzname " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " Suchdienst " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Suchparameter " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " Feed Parameter " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " XML export URL : %s " #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " Überprüfungshäufigkeit (Minuten) : %lu " #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Kanal : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Name : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " Joined since the last check only " #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " Schlüsselwörter : %s " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " Einstellungen " #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " Nur Benutzer mit Foto : %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " Nur online : %s" #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Zeige Benutzer die Dich auf der Liste haben " #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Name/Titel " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Passwort " #: src/icqdialogs.cc:443 msgid " Service " msgstr " Dienst " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Neuer Profilname: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "" "Das Profil mit diesem Namen existiert bereits. Willst Du es überschreiben?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "Spitzname: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Name/Titel: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "Email: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Vorname: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Nachname: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Stadt: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Staat: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Firma: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Abteilung: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Position: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Kanal: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Name: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Schlüsselwörter: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Passwort: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "URL: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "Überbrüfungshäufigkeit: " #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "Falsche Jabber ID!" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Allgemein " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " Registrierungsdienst " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Registrierungsparameter " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " Passwort ändern : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " Email : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Geburtstag : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Alter : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " zu Hause " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Straße : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " PLZ : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefon : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Handy : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Homepage : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Mehr " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1. Sprache : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2. Sprache : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3. Sprache : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Verschiedenes " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Enable web status indicator : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Zufällige Chat-Gruppe : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Berechtigung benötigt : %s " #: src/icqdialogs.cc:698 #, c-format msgid " Avatar file : %s " msgstr " Avatardatei: %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " Über " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Deine Details werden geholt" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Deine %s Details " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: Details " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Fertig" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Bitte Warten. Deine Details sind noch nicht geholt" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "Email: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Geburtsdatum eingeben (TT-MM-JJJJ): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Alter: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Straße: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "PLZ: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefon: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Handy: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Homepage: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "Über" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "Neues Passwort: " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "Überprüfung des neuen Passworts: " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "Avatardatei: " #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "keine" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X speichern, Esc abbrechen] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Sende Datei(en) an %s, %lu" #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Hinz." #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Kommentar" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "senden" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Dateien " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Kommentar " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "Dateiname: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "Kommentar: " #: src/icqdialogs.cc:1163 msgid "None" msgstr "keine" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "Russisch" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "Polnisch" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "Deutsch UTF-8" #: src/icqdialogs.cc:1198 msgid " CenterIM configuration " msgstr " CenterIM Konfiguration " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Oberfläche " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " Ändere Soundausgabe zu : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " Ändere Farbschema in : %s " #: src/icqdialogs.cc:1221 msgid " Change default request authorization message " msgstr "Ändere standard Autorisierungsanfragennachricht?" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr " Breite linkes Fenster : %d" #: src/icqdialogs.cc:1223 #, c-format msgid " Log panel height : %d " msgstr " Log-Höhe : %d " #: src/icqdialogs.cc:1224 #, c-format msgid " Chat panel height : %d " msgstr " Chat Höhe : %d" #: src/icqdialogs.cc:1225 #, c-format msgid " Show opened chats : %s " msgstr " Zeige offene Chats an : %s" #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Bidirektionale Sprachunterstützung : %s" #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Emacs keybingings im Texteditor : %s" #: src/icqdialogs.cc:1231 #, c-format msgid " Enable vi bindings: %s " msgstr " Aktiviere vi Tastenbindung: %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr " Fragen vor dem Schliessen : %s " #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr " Codepages conversion " #: src/icqdialogs.cc:1241 #, c-format msgid " Switch to language preset : %s " msgstr " Wechsel zu Sprache : %s" #: src/icqdialogs.cc:1242 #, c-format msgid " Remote charset : %s " msgstr " Entfernter Zeichensatz : %s " #: src/icqdialogs.cc:1243 #, c-format msgid " Local charset : %s " msgstr " Lokaler Zeichensatz : %s " #: src/icqdialogs.cc:1246 #, c-format msgid " For protocols : %s" msgstr " Für Protokoll : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Kontaktliste" #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Kontakte in Listen einteilen : %s " #: src/icqdialogs.cc:1251 #, c-format msgid " Sort contacts by : %s " msgstr " Sortiere Kontakte nach: %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Verstecke Offline Benutzer : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Anti-spam: Lösche Nachr. von Leuten außerhalb der Liste : %s " #: src/icqdialogs.cc:1254 #, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Anti-Spam: Ignoriere Berechtigungsanfrage: %s" #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr " Anti-Spam: benutze ein Captcha um Bots zu identifizieren: %s" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Zitiere Nachrichten beim Antworten : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Überprüfe lokale Mailbox : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Speichere Passwort : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " Abwesenheitsnotiz bei Statusänderung bearbeiten : %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Chat Modus für : %s " #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " Mit Enter Nachrichten verschicken : %s " #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Chat Modus : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " Enter sendet Nachricht : %s " #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr " Always online non-IM contacts for : %s" #: src/icqdialogs.cc:1284 #, c-format msgid " Color contacts according to: %s " msgstr " Färbe Kontakte nach: %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Kommunikation " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " SMTP Server : %s " #: src/icqdialogs.cc:1288 #, c-format msgid " HTTP browser : %s " msgstr " HTTP Browser : %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " HTTP Proxyserver : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr " Proxy nur für HTTP (rss und lj) : %s " #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Erlaube peer-to-peer Kommunikation : %s" #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " Portrange die für peer-to-peer benutzt werden soll : %s" #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " Logging " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " Zeitstempel im Logfenster : %s " #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr " Zeitstempel mit Sekunden : %s " #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " Online/Offline Ereignisse im Logfenster : %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Detaillierte Logs in ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr " Auto Presence Status " #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Automatisch »weg« nach (Min.) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Automatisch »nicht verfügbar« nach (Min.) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "Verwende X um Untätigkeit festzustellen : %s" #: src/icqdialogs.cc:1311 #, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Automatisch »nicht verfügbar« nachdem dem screen detached wurde : %s" #: src/icqdialogs.cc:1313 #, c-format msgid " Screen socket path : %s " msgstr " Pfad zum Screen Socket : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Auto-»weg«-Dauer (0 = aus): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Auto-»nicht-verfügbar«-Dauer (0 = aus): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "Name des SMTP Servers: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "Peer-to-peer Portrange (min-max): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "Name des HTTP Proxyservers: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "Charset aus dem Nachrichten konvertiert werden sollen: " #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "Charset in das Nachrichten konvertiert werden sollen: " #: src/icqdialogs.cc:1446 msgid "HTTP browser to use: " msgstr "Browser der benutzt wird: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "Linkes Fenster Breite: " #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "Logfenster Höhe: " #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "Chatfenster Höhe: " #: src/icqdialogs.cc:1465 msgid "Default authorization request message: " msgstr "Standard Autorisierungsanfragennachricht:" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "Pfad zum Screen Socket: " #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "Der gewählte Pfad zum Screen Socket existiert nicht!" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "Deine Details wurden geholt" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Organisiere Kontaktgruppen" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Umbenennen" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "Löschen" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "nach oben" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "nach unten" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Auswählen" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Listen " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Name für eine zu erstellende Liste: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Neuer Name für die Liste: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Willst du die Liste wirklich entfernen?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Datenübertragungsstatus" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Abbrechen" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " Eingehend von %s " #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " Ausgehend an %s " #: src/icqdialogs.cc:1865 msgid "init" msgstr "init" #: src/icqdialogs.cc:1866 msgid "start" msgstr "Start" #: src/icqdialogs.cc:1867 msgid "work" msgstr "Arbeit" #: src/icqdialogs.cc:1868 msgid "done" msgstr "Fertig" #: src/icqdialogs.cc:1869 msgid "err" msgstr "err" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "Abbrechen" #: src/icqdialogs.cc:1877 msgid " of " msgstr " von " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "Kann keine Übertragung entfernen die noch läuft" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "öffentlich (sichtbar für alle)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "privat" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "nur Freunde" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr " LiveJournal posting: Attribute " #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "erkenne Musik" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "Post" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Abbrechen" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " Zum Journal senden : %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " Thema : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " Sicherheit : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " Fancy Stuff " #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " Stimmung : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(nichts/eigen)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " individuelle Stimmung : %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " Musik : %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " Bild : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(standard)" #: src/icqdialogs.cc:2068 #, c-format msgid " Tags : %s " msgstr " Tags : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " verhindere auto formatierung : %s" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " verhindere das senden von Kommentaren per email : %s" #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " Kommentare verbieten : %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " Zurückliegender Eintrag : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "Posting Thema: " #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "Spiele gerade: " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "Stimmung: " #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "Tags für den Eintrag: " #: src/icqdialogs.cc:2128 msgid "pgp key quick search" msgstr "PGP Schlüssel Schnellsuche" #: src/icqdialogs.cc:2130 #, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "PGP Schlüsselsuche: Tippen zum Finden, %s wieder Suchen, Enter Ende" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr " Wähle einen PGP Schlüssel " #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr " Benutze keinen Schlüssel" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "PGP Schlüssel Auswahl" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "PGP Schlüssel Auswahl: %s für schnelle Suche" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "externes Handbuch aufrufen %s, gab folgendes zurück = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "führte externe Aktion %s aus, es kam zurück = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "offline" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "online" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "unsichtbar" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "frei zum Chatten" #: src/imcontact.cc:114 msgid "Do not disturb" msgstr "nicht stören" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "besetzt" #: src/imcontact.cc:116 msgid "Not available" msgstr "nicht verfügbar" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "weg" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "zum Essen" #: src/imlogger.cc:37 msgid "DND" msgstr "nicht stören" #: src/imlogger.cc:39 msgid "N/A" msgstr "nicht verfügbar" #: src/imlogger.cc:49 msgid "message" msgstr "Nachricht" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "Autorisierung" #: src/imlogger.cc:53 msgid "e-mail" msgstr "Email" #: src/imlogger.cc:54 msgid "notification" msgstr "Benachrichtigung" #: src/imlogger.cc:55 msgid "contacts" msgstr "Kontakte" #: src/imlogger.cc:56 msgid "files" msgstr "Dateien" #: src/imlogger.cc:57 msgid "event" msgstr "Ereignis" #: src/imlogger.cc:79 msgid "events log started" msgstr "Ereignislog gestartet" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "rausgehend %s nach %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "ankommend %s von %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "ignoriert" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "%s [%s] kam online" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s ging offline" #: src/imlogger.cc:141 #, c-format msgid "%s is now %s, was %s" msgstr "%s ist nun %s, war %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: kam online, mit status %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: ging offline" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "verändere %s Status von %s nach %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " IM Accountmanager " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Server : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " gesichert : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Login : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Passwort (optional) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Passwort : %s " #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr " Dringlichkeit : %s " #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr " Importiere Freundesliste : %s " #: src/accountmanager.cc:134 #, c-format msgid " NickServ password (optional) : %s " msgstr " NickServ Passwort (optional) : %s " #: src/accountmanager.cc:141 #, c-format msgid " Request receipts: %s " msgstr " Empfangsbestätigung anfordern : %s " #: src/accountmanager.cc:146 #, c-format msgid " Send OS info: %s " msgstr " Sende Betriebssysteminfos : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " Registrieren " #: src/accountmanager.cc:155 #, c-format msgid " OpenPGP key: %s " msgstr " OpenPGP Schlüssel: %s " #: src/accountmanager.cc:160 #, c-format msgid " Key passphrase: %s " msgstr " Schlüsselparole: %s " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " Spitzname ändern " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Benutzerdetails aktualisieren " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Abwesenheitsnotiz eingeben " #: src/accountmanager.cc:178 msgid " Set external status " msgstr " Setzte externen Status " #: src/accountmanager.cc:181 msgid " Drop " msgstr " löschen " #: src/accountmanager.cc:200 msgid " user name: " msgstr " Benutzername: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " UIN: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " Passwort: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Lösche erst die Accountinformationen!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Erst die Verbindung zum Service trennen!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " Server Adresse: " #: src/accountmanager.cc:285 msgid " priority: " msgstr " Dringlichkeit: " #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "PGP Schlüsselparole: " #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " Im %s Netzwerk registrieren " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Weiter" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Neues Passwort : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Überprüfung des Passworts : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Server Adresse : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Überpfrüfe das eingegebene Passwort: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Spitzname einstellen: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Server: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Passwörter stimmen nicht überein!" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Passwort muss eingegeben werden" #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "Passwort muss mindestens 6 Zeichen lang sein" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " Registrierungsvorgang " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Verbinde mit dem Server %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Sende Anfrage" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Zeitüberschreitung beim warten auf eine neue UIN. Wiederholen?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Wiederhole..." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Neue UIN erhalten, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Verbindung getrennt" #: src/imcontroller.cc:179 msgid "Unable to connect to icq server. Retry?" msgstr "Verbindungsaufbau zum ICQ Server nicht möglich. Wiederholen?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "Registrierung von %s bei %s wird versucht ..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "Die Jabber ID wurde erfolgreich registriert" #: src/imcontroller.cc:228 msgid "Failed" msgstr "fehlgeschlagen" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Du musst dich erst bei ICQ einloggen um die Details zu beartbeiten" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "neuer MSN Friendly Nick" #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "Du musst dich bei MSN einloggen um Deine Details zu bearbeiten" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "Du musst dich bei Jabber einloggen um Deine Details zu bearbeiten" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "Du musst dich bei Gadu-Gadu einloggen um deine Details zu bearbeiten" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "Registrierung wird nicht unterstützt" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "Mir gefällt die Standard %s Abwesenheitsnotiz von %s %s wirklich." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "+ FEHLER: Captcha ausgeschaltet: keine Frage gefunden!" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ %s ausgeführt" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "Ereignissendefehler: nicht genug Parameter" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "Ereignissendefehler: bei ICQ sind nur UINs erlaubt" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "Ereignissendefehler: unkown IM-type" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "Ereignis-sende-Fehler: unbekannter Ereignis-Typ" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s nach %s wurde der Warteschlange hinzugefügt" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "Ereignissendefehler: konnte für diesen Kontakt keinen Ordner anlegen" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "unknown status character was given" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "unknown IM type" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "Statuswechselfehler: " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Gebrauch: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "[OPTIONEN]..." #: src/icqconf.cc:1682 msgid "General options:" msgstr "Allgemeine Einstellungen:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " --ascii, -a benutze ASCII-Charachters für Fenster und die UI-" "Kontrolle" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basdir, -b setzt einen individuellen Grundordner" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B binde an eine bestimmte IP" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr " --no-xtitles, -T keine xterm Titel" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" " --offline, -o setze beim Start alle Protokolle auf offline" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr " --debug, -d gibt debug und Fehlermeldungen aus" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help zeigt diese Hilfe an" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v zeigt die Programmversion an" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Ereignis Sendeoptionen:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr "" " -s, --send Ereignis Typ; das können sein: msg, sms oder url" #: src/icqconf.cc:1694 msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr "" " -S, --status ändert den aktuellen Status; o, _, a, d, n, c, f, " "i" #: src/icqconf.cc:1695 msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --poro Protokoll, das kan sein: icq, yahoo, msn, aim, " "irc, jab, rss, lj, gg oder infocard" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr " -t, --to UIN oder Nick der Zielperson" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr " -n, --number Handynummer um eine SMS zu senden" #: src/icqconf.cc:1700 msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Fehlerberichte an http://bugzilla.centerim.org" #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Leere Berechtigungsanfrage" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr " * Berechtigungsanfrage : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* Berechtigung : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Kontakte : " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* Dateiübertragung" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "PGP Parole benötigt: " #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "falsche PGP Parole" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "PGP Signierfehler: " #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "PGP Verschlüsselungsfehler: " #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "[OTR] Fehler: inject_message_cb, recipient \"" #: src/imotr.cc:99 msgid "\" not found" msgstr "\" nicht gefunden" #: src/imotr.cc:114 msgid "Error" msgstr "Fehler" #: src/imotr.cc:116 msgid "Warning" msgstr "Warnung" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Info" #: src/imotr.cc:122 src/imotr.cc:315 msgid " accountname: " msgstr " Accountname: " #: src/imotr.cc:123 msgid " protocol: " msgstr " Protokoll: " #: src/imotr.cc:124 msgid " username: " msgstr " Benutzername: " #: src/imotr.cc:125 msgid " title: " msgstr " Titel: " #: src/imotr.cc:126 msgid " primary: " msgstr " Primär: " #: src/imotr.cc:127 msgid " secondary: " msgstr " Sekundär: " #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "[OTR] Empfing unbekannten Fingerprint von \"" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr " Du kannst das in den OTR Optionen prüfen" #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "[OTR] Verbindung ist jetzt sicher..." #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "[OTR] Verbindung ist unsicher..." #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "[OTR] Log:" #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" "[OTR] Fehler beim Verschlüsseln der Nachricht... keine Nachricht gesendet!" #: src/imotr.cc:316 msgid " recipient: " msgstr " recipient:" #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "[OTR] Fehler: Derzeit wird nur Jabber unterstützt" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "[OTR] Versuche sichere Sitzung mit \" zu starten" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "[OTR] beende sichere Sitzung mit \"" #: src/imotr.cc:413 msgid "yes/no" msgstr "ja/nein" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "nein" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "ja" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr " Bitte tippe 'ja' oder 'nein': " #: src/imotr.cc:462 msgid " Private keys " msgstr " Privater Schlüssel " #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "Fehler während des berechnen des Fingerprints" #: src/imotr.cc:472 msgid " Account: " msgstr " Konto: " #: src/imotr.cc:473 msgid " Protocol: " msgstr " Protokoll: " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr "Fingerprint:" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr "vergiss den Schüssel" #: src/imotr.cc:481 msgid " Public keys " msgstr "Öffentlicher Schlüssel" #: src/imotr.cc:488 msgid " User: " msgstr " Benutzer: " #: src/imotr.cc:489 msgid " Protocol: " msgstr " Protokoll: " #: src/imotr.cc:490 msgid " Account: " msgstr " Konto: " #: src/imotr.cc:495 msgid "Yes" msgstr "Ja" #: src/imotr.cc:495 msgid "No" msgstr "Nein" #: src/imotr.cc:499 msgid " Verified: " msgstr " Bestätigt: " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr "Aktiver Fingerprint:" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "Willst du den ausgewählten Schlüssel vergessen?" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "Willst du den ausgewählten Schlüssel bestätigen?" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "Kein Jabber" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "Kein OTR" #: src/imotr.cc:585 msgid "Plaintext" msgstr "Klartext" #: src/imotr.cc:586 msgid "Encrypted" msgstr "Verschlüsselt" #: src/imotr.cc:587 msgid "Finished" msgstr "Beendet" #: src/imotr.cc:588 msgid "Unknown" msgstr "unbekannt" #: src/imotr.cc:611 msgid "No Encryption" msgstr "Keine Verschlüsselung" #: src/imotr.cc:615 msgid "Verified" msgstr "bestätigt" #: src/imotr.cc:617 msgid "Unverified" msgstr "unbestätigt" #: src/icqface.cc:52 msgid "Male" msgstr "männlich" #: src/icqface.cc:53 msgid "Female" msgstr "weiblich" #: src/icqface.cc:56 msgid "Not specified" msgstr "nicht angegeben" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "nächste" #: src/icqface.cc:63 msgid "Fwd" msgstr "weiterleiten" #: src/icqface.cc:64 msgid "Reply" msgstr "antworten" #: src/icqface.cc:65 msgid "Open" msgstr "öffnen" #: src/icqface.cc:66 msgid "Accept" msgstr "annehmen" #: src/icqface.cc:67 msgid "Reject" msgstr "zurückweisen" #: src/icqface.cc:68 msgid "User info" msgstr "Benutzerinfo" #: src/icqface.cc:70 msgid "Prev" msgstr "vorherige" #: src/icqface.cc:78 msgid "sound card" msgstr "Soundkarte" #: src/icqface.cc:79 msgid "speaker" msgstr "PC Lautsprecher" #: src/icqface.cc:80 msgid "disable" msgstr "deaktivieren" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "nicht ändern" #: src/icqface.cc:88 msgid "dark" msgstr "dunkel" #: src/icqface.cc:89 msgid "blue" msgstr "blau" #: src/icqface.cc:97 msgid "protocol" msgstr "Protokoll" #: src/icqface.cc:98 msgid "status" msgstr "Status" #: src/icqface.cc:118 msgid "mode 1" msgstr "Modus 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "Modus 2" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr " CenterIM %s NICHT VERSENDET: %lu" #: src/icqface.cc:274 msgid "Send an URL" msgstr "URL versenden" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " SMS versenden" #: src/icqface.cc:276 msgid "Send contacts" msgstr "Kontakte versenden" #: src/icqface.cc:277 msgid " Request authorization" msgstr " Berechtigung anfordern" #: src/icqface.cc:278 msgid "Edit details" msgstr "Details bearbeiten" #: src/icqface.cc:279 msgid "Fetch away message" msgstr "Hole Abwesenheitsnotiz" #: src/icqface.cc:280 msgid "Add to list" msgstr "Zur Liste hinzufügen" #: src/icqface.cc:281 msgid "Rename contact" msgstr "Kontakt umbenennen" #: src/icqface.cc:282 msgid " Move to group.." msgstr " In Liste verschieben..." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "Hole Versionsinfo" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " Datei(en) senden" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " In Konferenz einladen..." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Sende eine Kanalnachricht enter" #: src/icqface.cc:294 msgid "Channel chat history" msgstr "Vergangene Ereignisse" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Lösche Kanal del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Kanal beitreten" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Kanal verlassen" #: src/icqface.cc:298 msgid "List nicknames" msgstr "Spitznamen auflisten" #: src/icqface.cc:301 msgid "UnBlock channel messages" msgstr "Kanalnachrichten erlauben" #: src/icqface.cc:303 msgid "Block channel messages" msgstr "Kanalnachrichten blockieren" #: src/icqface.cc:310 msgid "Send a message" msgstr "Eine Nachricht senden" #: src/icqface.cc:312 msgid "Event history" msgstr "Vergangene Ereignisse" #: src/icqface.cc:313 msgid "Remove user" msgstr "Benutzer entfernen" #: src/icqface.cc:314 msgid "User's details" msgstr "Benutzerdetails" #: src/icqface.cc:315 msgid "External actions.." msgstr "Externe Aktion..." #: src/icqface.cc:318 msgid "Unset ignore user" msgstr "Benutzer nichtmehr ignorieren" #: src/icqface.cc:318 msgid "Ignore user" msgstr "Benutzer ignorieren" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr " PGP Schlüssel zuweisen..." #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr " PGP Schlüssel entfernen" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr " Schalte PGP Verschlüsselung %s" #: src/icqface.cc:328 msgid "Force check" msgstr "Prüfung erzwingen" #: src/icqface.cc:435 msgid "Change status" msgstr "Status ändern" #: src/icqface.cc:436 msgid "Go to contact.." msgstr "Gehe zu Kontakt..." #: src/icqface.cc:437 msgid " Accounts.." msgstr " Konten..." #: src/icqface.cc:438 msgid " CenterIM config options" msgstr " CenterIM Einstellungen" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr "OTR Optionen" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Überwachung Dateiübertragung" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Benutzer suchen/hinzufügen" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " Kanal/Konferenz beitreten" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " RSS Feed verlinken" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Betrachte/bearbeite Ignorierliste" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Betrachte/bearbeite Unsichtbarliste" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Betrachte/bearbeite Sichtbarliste" #: src/icqface.cc:455 msgid "Show offline users" msgstr "Offline Benutzer anzeigen" #: src/icqface.cc:457 msgid "Hide offline users" msgstr "Offline Benutzer verstecken" #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " Kontaktlisten organisieren" #: src/icqface.cc:461 msgid " Mass group move.." msgstr " Gruppen Massenverschiebung..." #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Details" #: src/icqface.cc:905 msgid "Message" msgstr "Nachricht" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Neue Suche" #: src/icqface.cc:924 msgid "Contact to add" msgstr "Kontakt zum Hinzufügen" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Suche Kontakte..." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Suchergebnisse [beendet]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Informationen über %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "Spitzname" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "Dies ist dein LifeJournal Account." #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "benutze Ihn um Einträge an Dein Journal zu schicken" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "Die folgenden Benutzer haben dich als Freund aufgeführt:" #: src/icqface.cc:1112 msgid "found" msgstr "gefunden" #: src/icqface.cc:1114 msgid "used" msgstr "verwendet" #: src/icqface.cc:1114 msgid "not used" msgstr "nicht verwendet" #: src/icqface.cc:1116 msgid "not found" msgstr "nicht gefunden" #: src/icqface.cc:1131 msgid "E-mail" msgstr "Email" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2. Email" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "alte Email" #: src/icqface.cc:1134 msgid "Gender" msgstr "Geschlecht" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Geburtstag" #: src/icqface.cc:1136 msgid "Age" msgstr "Alter" #: src/icqface.cc:1137 msgid "Languages" msgstr "Sprachen" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Letzte IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Zuletzt gesehen" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Nie" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "Tage" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "Stunden" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "Min." #: src/icqface.cc:1189 msgid "seconds" msgstr "Sekunden" #: src/icqface.cc:1212 msgid "idle" msgstr "idle" #: src/icqface.cc:1221 msgid "Server-based contact" msgstr "serverseitiger Kontakt" #: src/icqface.cc:1226 msgid "Awaiting authorization" msgstr "erwarte Autorisierung" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "Avatardatei" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Adresse" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Ort" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "PLZ" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefon" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Handy" #: src/icqface.cc:1259 msgid "Timezone" msgstr "Zeitzone" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Homepage" #: src/icqface.cc:1300 msgid "Company" msgstr "Firma" #: src/icqface.cc:1301 msgid "Department" msgstr "Abteilung" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Titel" #: src/icqface.cc:1346 msgid "Interests" msgstr "Interessen" #: src/icqface.cc:1358 msgid "Background" msgstr "Hintergrund" #: src/icqface.cc:1376 msgid "Handle" msgstr "Name" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "RSS doc" #: src/icqface.cc:1378 msgid "Version" msgstr "Version" #: src/icqface.cc:1379 msgid "Encoding" msgstr "Kodierung" #: src/icqface.cc:1382 msgid "Link" msgstr "Link" #: src/icqface.cc:1384 msgid "Frequency" msgstr "Häufigkeit" #: src/icqface.cc:1385 msgid "Last check" msgstr "Zuletzt geprüft" #: src/icqface.cc:1386 msgid "Next check" msgstr "Nächste Prüfung" #: src/icqface.cc:1387 msgid "Last result" msgstr "Letzes Ergebnis" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu Minuten" #: src/icqface.cc:1404 msgid "Now" msgstr "Jetzt" #: src/icqface.cc:1423 msgid "Full name" msgstr "Ganzer Name" #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "%s zu URLs. %s externe Aktion, %s schließen" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "Benutzerinfo für %s" #: src/icqface.cc:1456 msgid "Check" msgstr "Prüfen" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Bearbeiten" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "Empfangen" #: src/icqface.cc:1466 msgid "Friend of" msgstr "Freund von" #: src/icqface.cc:1472 msgid "Home" msgstr "Zuhause" #: src/icqface.cc:1472 msgid "Work" msgstr "Arbeit" #: src/icqface.cc:1472 msgid "More" msgstr "Mehr" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Empfange" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] ICQ Netzwerk" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr " [gg] Gadu-Gadu" #: src/icqface.cc:1622 msgid " All protocols" msgstr " Alle Protokolle" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr " Nur bereits eingeloggte" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " oder bestätigen, abbrechen " #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " bestätigen, abbrechen " #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Versch. zu Kontakte" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Ignorierliste" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Sichtbaliste" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Unsichtbarliste" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Wähle Kontakte zum Aufnehmen in die Liste" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "Entferne die %d Kontakte auch aus der Liste?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Ereignisempfänger" #: src/icqface.cc:2269 #, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "Schnellsuche: Tippen um zu finden, %s wieder Suchen, Enter Ende" #: src/icqface.cc:2272 msgid "contact list quick search" msgstr "Kontaktlisten-Schnellsuche" #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ hier gibt es keine URLs" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URLs" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ keine externe Aktion für %s definiert" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "Ergebnis der externen Aktion %s:" #: src/icqface.cc:2441 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "%s senden, %s mehrere, %s/%s vor/zurück, %s Gesch., %s URLs, %s vergrößern, " "%s Mitgl." #: src/icqface.cc:2442 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "%s senden, %s mehrere, %s/%s vor/zurück, %s Gesch., %s URLs, %s vergrößern, " "%s info" #: src/icqface.cc:2477 #, c-format msgid "Outgoing %s" msgstr "Rausgehend %s" #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Kontakte senden..." #: src/icqface.cc:2670 msgid "file name: " msgstr "Dateiname: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "Rausgehend %s an %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Geschickt am %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "Ankommend %s von %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Erhalten am %s" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "%s zu URLs, %s Vollbild, %s abbrechen" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s von%s, erhalten am %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s zu %s, gesendet am %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "Vollbildansicht" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "" "%s oder %s zum schließen, Hoch/Runter und Bildhoch/Bildrunter zum srollen" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "Geschichte von %s, %d Aktionen insgesammt" #: src/icqface.cc:3339 #, c-format msgid "%s search, %s again, %s cancel" msgstr "%s suchen, %s nochmal, %s abbrechen" #: src/icqface.cc:3348 msgid "search for: " msgstr "suche nach: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] System: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] Email von %s, %s" centerim-4.22.10/po/Rules-quot0000644000175000001440000000337611473011430013027 00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header centerim-4.22.10/po/cs.po0000644000175000001440000023743311473011457012005 00000000000000# Czech language definitions for centerim. # Copyright (C) 2001 Free Software Foundation, Inc. # This file is lincensed under the same conditions as the centerim package. # Jindrich Makovicka , 2001. # Petr Pisar , 2005, 2007, 2008, 2009. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.22.8\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2009-10-26 14:48+0100\n" "Last-Translator: Petr PísaÅ™ \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/centerim.cc:138 msgid "password: " msgstr "heslo: " #: src/centerim.cc:174 #, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" "%s menu kontaktu, %s stav, %s různé volby, %s/%s násl./pÅ™ed. disk., %s konec" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Ignorovat vÅ¡echny události od %s?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "Odebrat také %s ze seznamu kontaktů?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Opravdu chcete odstranit %s?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Ukazovat pod pÅ™ezdívkou: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Vyberte skupinu, do které má být uživatel pÅ™esunut" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ nemohu získat pryÄ-zprávu jsa odpojen" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! nemohu se pÅ™ipojit, na disku je ménÄ› než 10 kB volného místa" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "pryÄ-zpráva" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! podpora pro %s byla zakázána pÅ™i kompilaci" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ dorazila nová poÅ¡ta, %d zpráv" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] pÅ™iÅ¡la nová poÅ¡ta, %d e-mailů" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ poslední zpráva od %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ konfigurace %s byla zmÄ›nÄ›na, nahrávám znovu" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! zjiÅ¡tÄ›na jiná běžící kopie centerim" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! toto může působit problémy, pid %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Číslo mobilu: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "Adresář, kam uložit soubor(y): " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "Do zadaného adresáře nelze zapisovat" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "Zadaný adresář neexistuje" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ žádné položky historie pro %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ uživatel %s je již v seznamu" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Vyberte skupinu, do které má být uživatel pÅ™idán" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s byl pÅ™idán do seznamu" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ uživatel je zpátky" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] stav obnoven" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] automaticky nastavuji %s" #: src/centerim.cc:1490 msgid "away" msgstr "PryÄ" #: src/centerim.cc:1490 msgid "n/a" msgstr "n/a" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "+ Po odpojení screenu nastaveno na „nedostupný“" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "! Cesta k socketu screenu neexistuje!" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "! Opravte cestu nebo zakažte mÄ›nÄ›ní stavu podle programu screen" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! na disku zbývá ménÄ› než 10 kB volného místa, odpojuji se od serverů" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! jinak můžeme pÅ™ijít o události a konfiguraci" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "Pozvat do konference…" #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "Vyberte kontakty, které chcete pÅ™esunout" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "HromadnÄ› pÅ™esunout vybrané uživatele do…" #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "nemohu stáhnout" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "chybné XML" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "žádná znaÄka nebo nebyla nalezena" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "žádná znaÄka nebo nebyla nalezena" #: src/hooks/rsshook.cc:368 msgid "wrong or tag" msgstr "chybná znaÄka nebo " #: src/hooks/rsshook.cc:380 msgid "success" msgstr "v pořádku" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "Titul: " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "ZveÅ™ejnÄ›no: " #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "Kategorie: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "Autor: " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "Popis: " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "Odkaz: " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "Komentář: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] nelze se pÅ™ipojit: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "nelze pÅ™eložit jméno poÄítaÄe" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "nelze vytvoÅ™it socket" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "zkontroluj zadané doménové jméno a port pageru" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] opouÅ¡tím konferenci: %s" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "Prosím, pÅ™ipoj se do mé konference" #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Zpráva pÅ™i zmÄ›nÄ› stavu:" #: src/hooks/yahoohook.cc:703 #, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "" "+ [yahoo] nelze získat pryÄ-zprávu z %s, %s (možná není pryÄ-zpráva vyplnÄ›na)" #: src/hooks/yahoohook.cc:779 msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] nelze se pÅ™ihlásit" #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] nelze se pÅ™ihlásit: jméno a heslo nesouhlasí " #: src/hooks/yahoohook.cc:791 msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] nelze se pÅ™ihlásit: jméno uživatele neexistuje" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr " + [yahoo] nelze se pÅ™ihlásit: úÄet byl zablokován" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ pro odblokování navÅ¡tiv %s" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] zjiÅ¡tÄ›no duplicitní pÅ™ihlášení" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] server uzavÅ™el socket" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "Uživatel %s vás pozval do konference %s, jejíž téma je: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "ÄŒleny souÄasné konference jsou: " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Automatické pÅ™ipojení do konference" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "Uživatel %s odmítl pozvání k pÅ™ipojení se do konference" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "Uživatel %s se pÅ™ipojil do konference" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "Uživatel %s opustil konferenci" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "si Vás pÅ™idal(a) do seznamu kontaktů" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "zpráva byla: " #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] e-mail od %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] systém: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] chyba: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] chyba: %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] přímé spojení selhalo" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] nelze se pÅ™ihlásit" #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] nelze se pÅ™ihlásit" #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] nelze se pÅ™ihlásit" #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] nelze se pÅ™ihlásit" #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] chyba: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] chyba: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] nelze se pÅ™ihlásit" #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] nelze se pÅ™ipojit: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] chyba: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "Uživatel má dnes narozeniny" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] k serveru se nelze pÅ™ipojit" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] odregistrovávám se od agenta %s" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "pryÄ-zpráva:" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] žádná pryÄ-zpráva od %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "Zadán chybný JID, nelze se zaregistrovat" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "+ nelze se pÅ™ipojit" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "Vzdálená strana používá: %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "Výchozí server pro jabber-konference" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, c-format msgid "+ [jab] error %d" msgstr "+ [jab] chyba %d" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] chyba %d: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "Uživatel si tÄ› chce pÅ™idat do svého seznamu kontaktů" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "" "Uživatel si vás smazal ze svého seznamu kontaktů (unsubscribed you, Å™eÄeno " "jazykem Jabberu)" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] nelze se pÅ™ipojit k serveru" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "SkuteÄnÄ› se mi líbí výchozí AIM-profil programu centerim %s. " #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "aim: selhalo spojení" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] pÅ™ipojování selhalo: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "Uživatel nemá žádné informace v profilu." #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] heslo odesláno " #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "podle požadavků" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "problémy se socketem" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "chybné jméno uživatele" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "mnoho opakovaných pÅ™ihlášení" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "chybné heslo" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "jméno a heslo nesouhlasí" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "zjiÅ¡tÄ›no dvojí pÅ™ihlášení" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] cannot connect" msgstr "+ [icq] nelze se pÅ™ipojit" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] odpojeno" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "+ důvod odpojení od icq" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "si Vás pÅ™idal(a) do seznamu kontaktů" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "Žádost o autorizaci od %lu" #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] SMS pro %s, %s odmítnuta" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] nelze poslat SMS pro %s " #: src/hooks/icqhook.cc:1331 #, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "" "+ [icq] nelze získat pryÄ-zprávu od %s, %s (možná není pryÄ-zpráva vyplnÄ›na)" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Povídání si s náhodným uživatelem" #: src/hooks/gaduhook.cc:161 msgid "+ [gg] connection failed" msgstr "+ [gg] selhalo pÅ™ipojení" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [gg] nemohu pÅ™eložit %s" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "+ [gg] selhalo spojení k serveru" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "+ [gg] spojení ztraceno" #: src/hooks/gaduhook.cc:404 #, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [gg] chybí pryÄ-zpráva od %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] nelze se pÅ™ipojit k serveru" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] pÅ™ipojení selhalo: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] pÅ™ezdívka byla úspěšnÄ› zmÄ›nÄ›na" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Na kanálech: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Vyhozen %s; důvod: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "Uživatel si zmÄ›nil svoji pÅ™ezdívku z %s na %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] heslo odesláno" #: src/hooks/irchook.cc:1299 msgid "+ [irc] nick password sent" msgstr "+ [irc] heslo pro pÅ™ezdívku odesláno" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "OdpovÄ›Ä na PING od uživatele: %d sekund(a)" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s se pÅ™ipojil(a)" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s odeÅ¡el(a)" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "důvod: %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s byl(a) vyhozen(a) %s" #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "Téma kanálu je nyní: %s" #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "nastavil(a) %s" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s set stal(a) operátorem na příkaz %s." #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s již není operátorem na příkaz %s." #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s se stal naším operátorem" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "ty jsi tady operátor" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s už není naším operátorem." #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] hledání uživatele dokonÄeno" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "nemohu se pÅ™ipojit" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] HTTP selhalo: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "Zpráva ze serveru: " #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] selhalo pÅ™ihlášení: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] úspěšnÄ› zasláno, id je %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] chyba pÅ™i odesílání: %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Uživatel %s (%s) si Vás pÅ™idal(a) do seznamu kontaktů\n" "\n" "Adresa journalu: %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "Uživatel %s Vás odebral(a) ze seznamu kontaktů\n" "\n" "Adresa journalu: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] chyba pÅ™i mazání přítele" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] uživatel byl odebrán z vaÅ¡eho seznamu přátel" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] nemohu pÅ™idat přítele" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s byl pÅ™idán do seznamu přátel" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] obrácené hledání uživatelů dokonÄeno, %d nalezen(o)" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "+ [msn] nepÅ™eÄtených e-mailů: %d v doÅ¡lé, %d ve složkách" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] e-mail od %s, %s" #: src/hooks/msnhook.cc:905 msgid "+ [msn] cannot connect: " msgstr "+ [msn] nemohu se pÅ™ipojit: " #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "zkontrolujte jméno poÄítaÄe a port" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "pÅ™ipojuji se k serveru" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "pÅ™ihlášen(a)" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "hledání dokonÄeno, %d nalezen" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "heslo bylo úspěšnÄ› zmÄ›nÄ›no" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "Odpojeno" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "pÅ™idávám %s do seznamu kontaktů" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "odstraňuji %s ze seznamu kontaktů" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "stahování seznamu Älenů dokonÄeno, %d nalezen(i)" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "Uživatel má dnes narozeniny" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Led" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Úno" #: src/icqcontact.cc:853 msgid "Mar" msgstr "BÅ™e" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Dub" #: src/icqcontact.cc:854 msgid "May" msgstr "KvÄ›" #: src/icqcontact.cc:854 msgid "Jun" msgstr "ÄŒen" #: src/icqcontact.cc:854 msgid "Jul" msgstr "ÄŒec" #: src/icqcontact.cc:854 msgid "Aug" msgstr "Srp" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Zář" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Říj" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Lis" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Pro" #: src/icqgroups.cc:66 msgid "General" msgstr "Obecné" #: src/eventmanager.cc:124 #, c-format msgid "event from %s (%s)" msgstr "událost od %s (%s)" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60 a více" #: src/icqdialogs.cc:50 msgid "unknown" msgstr "neznámý" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Obecné povídání" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Romantické" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Hry" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Studenti" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "Kolem 20" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "Kolem 30" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "Kolem 40" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50 a výš" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "Hledám ženu" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "Hledám muže" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "Stavu a aktivity" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "Stavu a jména" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "Aktivity" # FIXME: "Name" requires context (Field value: "Jméno", Sort by: "Jména") #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Jméno" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " Vyhledávací profily" #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Odebrat" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Nahrát" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ nejprve se musíte pÅ™ihlásit" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "Nahrát" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "Uložit" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "VyÄistit" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "ZmÄ›nit" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Nové hledání" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "PÅ™ipojit/VytvoÅ™it" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "Odebírat" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Najít/pÅ™idat uživatele" #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " PÅ™ipojit se ke kanálu/konferenci " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " Odebírat RSS " #: src/icqdialogs.cc:299 msgid " Network " msgstr " Síť " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Detaily " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " PÅ™ezdívka : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Jméno : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Příjmení : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " VÄ›k : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Pohlaví : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Jazyk : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr "Místo" #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " MÄ›sto : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Stát : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " ZemÄ› : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Práce " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " Firma : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " OddÄ›lení : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " Pozice : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr "Pouze pÅ™ipojené" #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Náhodná diskuzní skupina " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " KlíÄová slova " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr "PÅ™ezdívka: " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " Vyhledávací služba " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Parametry hledání " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " Parametry kanálu " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " URL XML exportu : %s " #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " ÄŒetnost kontrol (minuty) : %lu " #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Kanál : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " PÅ™ezdívka : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " PÅ™ipojeno od poslední kontroly " #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " KlíÄová slova : %s " #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " Volby " #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " Pouze uživatelé mající foto : %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " Hledej pouze právÄ› pÅ™ipojené : %s " #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Ukaž uživatele, kteří vás mají ve svém seznamu" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Jméno/Titul " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Heslo " #: src/icqdialogs.cc:443 msgid " Service " msgstr " Služba " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Jméno nového profilu: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "Profil tohoto jména již existuje. Chcete jej pÅ™epsat?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "PÅ™ezdívka: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Jméno/Titul: " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-Mail: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Jméno: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "Příjmení: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "MÄ›sto: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Stát: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "Firma: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "OddÄ›lení: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "Pozice: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Kanál: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Jméno" #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "KlíÄová slova: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Heslo: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "URL: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "ÄŒetnost kontrol: " #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "Chybné Jabber ID!" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Obecné " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " RegistraÄní služba " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Parametry registrace " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " ZmÄ›na hesla : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Datum narození : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " VÄ›k : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " BydliÅ¡tÄ› " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " Ulice : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " PSÄŒ/Zip : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Telefon : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Fax : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Mobil : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Domovská stránka : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Další " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " První jazyk : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " Druhý jazyk : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " TÅ™etí jazyk : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Ostatní " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Povolit webový ukazatel stavu : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Náhodná diskuzní skupina : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Vyžadovat autorizaci : %s " #: src/icqdialogs.cc:698 #, c-format msgid " Avatar file : %s " msgstr " Soubor s avatarem : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " O mnÄ› " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "Stahuji vaÅ¡e ICQ detaily" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " VaÅ¡e %s detaily " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " detaily: %s " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Hotovo" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Chvíli poÄkejte. JeÅ¡tÄ› jsem nestáhl VaÅ¡e ICQ detaily." #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-mail: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Vložte datum narození (DD-MM-RRRR): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "VÄ›k: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "Ulice: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "PSÄŒ/Zip: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Telefon: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "Fax: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Mobil: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Domovská stránka: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "O mnÄ›" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "Nové heslo: " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "Ověření hesla: " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "Soubor s avatarem: " #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "žádný" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X uložit, Esc zruÅ¡it] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Poslat soubor(y) pro %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "PÅ™idat" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Komentář" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Poslat" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Soubory " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Komentář " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "jméno souboru: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "komentář: " #: src/icqdialogs.cc:1163 msgid "None" msgstr "Nic" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "Rusky" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "Polsky" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "NÄ›mecky UTF-8" #: src/icqdialogs.cc:1198 msgid " CenterIM configuration " msgstr " Konfigurace CenterIM" #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " Uživatelské rozhraní " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " ZmÄ›nit zvukové zařízení na : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " ZmÄ›nit barevné schéma na : %s " #: src/icqdialogs.cc:1221 msgid " Change default request authorization message " msgstr " ZmÄ›nit výchozí text žádosti o autorizaci " #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr " Šířka levého panelu: %d" #: src/icqdialogs.cc:1223 #, c-format msgid " Log panel height : %d " msgstr " Výška panelu s protokolem : %d " #: src/icqdialogs.cc:1224 #, c-format msgid " Chat panel height : %d " msgstr " Výška panelu s rozhovorem : %d " #: src/icqdialogs.cc:1225 #, c-format msgid " Show opened chats : %s " msgstr " Ukazovat rozepsané rozhovory : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Povolit obousmÄ›rné jazyky: %s" #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Textový editor ve stylu emacs : %s " #: src/icqdialogs.cc:1231 #, c-format msgid " Enable vi bindings: %s " msgstr " Textový editor ve stylu vi : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr " Zeptat se pÅ™ed ukonÄením : %s" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr " Konverze kódových stránek" #: src/icqdialogs.cc:1241 #, c-format msgid " Switch to language preset : %s " msgstr " Podle jazyku : %s " #: src/icqdialogs.cc:1242 #, c-format msgid " Remote charset : %s " msgstr " Vzdálená sada : %s " #: src/icqdialogs.cc:1243 #, c-format msgid " Local charset : %s " msgstr " Místní sada : %s " #: src/icqdialogs.cc:1246 #, c-format msgid " For protocols : %s" msgstr " Pro protokoly : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " Seznam kontaktů " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Uspořádat kontakty do skupin : %s " #: src/icqdialogs.cc:1251 #, c-format msgid " Sort contacts by : %s " msgstr " Řadit kontakty podle: %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Skrýt odpojené uživatele : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " Antispam: zahazovat zprávy od neznámých lidí : %s " #: src/icqdialogs.cc:1254 #, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Antispam: ignorovat požadavky na autorizaci : %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr " Antispam: rozpoznávat roboty captchou: %s " #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Citovat zprávu v odpovÄ›di : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " Kontrolovat místní poÅ¡tu : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Pamatovat si heslo k ICQ : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " MÄ›nit pryÄ-zprávu pÅ™i zmÄ›nÄ› stavu : %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Diskuzní mód pro : %s " #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " Enter odesílá zprávy pro : %s " #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Diskuzní mód : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " Enter odesílá zprávy: %s " #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr " Ne-IM kontakty vždy „pÅ™ipojené“ pro : %s" #: src/icqdialogs.cc:1284 #, c-format msgid " Color contacts according to: %s " msgstr " Obarvit kontakty podle: %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Komunikace " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " SMTP server : %s " #: src/icqdialogs.cc:1288 #, c-format msgid " HTTP browser : %s " msgstr " HTTP prohlížeÄ : %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " HTTP proxy server : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr " Proxy pouze pro HTTP (rss a lj) : %s " #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Povolit peer-to-peer komunikaci : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " Rozsah portů pro peer-to-peer: %s " #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " Protokolování " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " ÄŒasové údaje v oknÄ› logu : %s " #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr " ÄŒasové údaje zahrnují sekundy : %s " #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " Události pÅ™ipojen/odpojen v oknÄ› logu : %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Podrobný záznam IM událostí v ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr " Automatický stav přítomnosti " #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Automaticky nastavit „pryÄ“ (min) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Automaticky nastavit „nedostupný“ (min) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr " Hlásit dobu zahálení pomocí X : %s " #: src/icqdialogs.cc:1311 #, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Automaticky nastavit „nedostupný“, když se odpojí screen: %s " #: src/icqdialogs.cc:1313 #, c-format msgid " Screen socket path : %s " msgstr " Cesta k socketu screenu : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "Autom. interval „pryÄ“ stavu (0 – vypnout): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Auto N/A interval (0 – vypnout): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "jméno SMTP serveru: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "Peer-to-peer porty (min-max): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "HTTP proxy server: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "Vstupní znaková sada: " #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "Výstupní znaková sada: " #: src/icqdialogs.cc:1446 msgid "HTTP browser to use: " msgstr "Používat HTTP prohlížeÄ: " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "Šířka levého panelu: " #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "Výška panelu s protokolem" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "Výška panelu s rozhovorem: " #: src/icqdialogs.cc:1465 msgid "Default authorization request message: " msgstr "Výchozí text žádosti o autorizaci: " #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "Cesta k socketu programu screen: " #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "Vybraná cesta k socketu screenu neexistuje!" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "VaÅ¡e ICQ detaily bylo staženy" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Uspořádat skupiny kontaktů" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "PÅ™ejmenovat" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "Odebrat" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "Nahoru" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "Dolů" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Vybrat" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Skupiny " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "VytvoÅ™it skupinu se jménem: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Nové jméno skupiny: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Opravdu chcete odstranit skupinu?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Stav pÅ™enosu souboru" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "ZruÅ¡it" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " PÅ™ijímám od %s " #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " Odesílám pro %s " #: src/icqdialogs.cc:1865 msgid "init" msgstr "inicializace" #: src/icqdialogs.cc:1866 msgid "start" msgstr "zaÄátek" #: src/icqdialogs.cc:1867 msgid "work" msgstr "pracuji" #: src/icqdialogs.cc:1868 msgid "done" msgstr "hotovo" #: src/icqdialogs.cc:1869 msgid "err" msgstr "chyba" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "zruÅ¡" #: src/icqdialogs.cc:1877 msgid " of " msgstr " z " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "Běžící pÅ™enos nelze odebrat" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "veÅ™ejný (viditelný vÅ¡em)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "soukromý" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "pouze pro přátele" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr " posílání LiveJournalu: vlastnosti " #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "Detekovat hudbu" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "Poslat" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "ZruÅ¡it" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " Poslat do žurnálu : %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " PÅ™edmÄ›t : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " ZabezpeÄení : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " Zábavné: " #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " Nálada : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(nic/vlastní)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " Nálada : %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " Hudba : %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " Obrázek : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(výchozí)" #: src/icqdialogs.cc:2068 #, c-format msgid " Tags : %s " msgstr " Å títky : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " Neformátovat automaticky: %s " #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " Neodesílat komentáře e-mailem: %s " #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " Zakázat komentáře : %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " ZpÄ›tnÄ› datovaná položka: %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "Zasílající pÅ™edmÄ›t: " #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "PrávÄ› hraje: " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "SouÄasná nálada: " #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "Å títky pro položku: " #: src/icqdialogs.cc:2128 msgid "pgp key quick search" msgstr "rychlé hledání pgp klíÄe" #: src/icqdialogs.cc:2130 #, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "Hledání PGP klíÄe: nÄ›co napiÅ¡te, %s hledá znovu, Enter ukonÄí" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr " Vyber PGP klÃ­Ä pro použití" #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr " Nepoužívej klíÄ" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "výbÄ›r pgp klíÄe" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "VýbÄ›r PGP klíÄe: %s pro rychlé vyhledání" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "provedena externí ruÄní akce %s, návratový kód = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "provedena externí akce %s, návratový kód = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Odpojený" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "PÅ™ipojený" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Neviditelný" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Chci si povídat" #: src/imcontact.cc:114 msgid "Do not disturb" msgstr "NeruÅ¡it" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Mám práci" #: src/imcontact.cc:116 msgid "Not available" msgstr "Nejsem k zastižení" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "PryÄ" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "Na obÄ›dÄ›" #: src/imlogger.cc:37 msgid "DND" msgstr "NeruÅ¡it" #: src/imlogger.cc:39 msgid "N/A" msgstr "Nedostupný" #: src/imlogger.cc:49 msgid "message" msgstr "zpráva" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "autorizace" #: src/imlogger.cc:53 msgid "e-mail" msgstr "e-mail" #: src/imlogger.cc:54 msgid "notification" msgstr "upozornÄ›ní" #: src/imlogger.cc:55 msgid "contacts" msgstr "kontakty" #: src/imlogger.cc:56 msgid "files" msgstr "soubory" #: src/imlogger.cc:57 msgid "event" msgstr "událost" #: src/imlogger.cc:79 msgid "events log started" msgstr "zaznamenávání událostí zahájeno" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "odesílám %s pro %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "pÅ™ijímám %s od %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "ignorováno" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "%s [%s] se pÅ™ipojil" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s se právÄ› odpojil" #: src/imlogger.cc:141 #, c-format msgid "%s is now %s, was %s" msgstr "%s je nyní %s, byl %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: právÄ› se pÅ™ipojil se stavem %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: právÄ› se odpojil" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "%s zmÄ›nil status z %s na %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " Manažer IM úÄtů " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Server : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " ZabezpeÄený : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Login : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Heslo (volitelné) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Heslo : %s " #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr " Priorita : %s " #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr " Importovat seznam přátel : %s " #: src/accountmanager.cc:134 #, c-format msgid " NickServ password (optional) : %s " msgstr " NickServ heslo (volitelné) : %s " #: src/accountmanager.cc:141 #, c-format msgid " Request receipts: %s " msgstr " Vyžadovat potvrzení: %s " #: src/accountmanager.cc:146 #, c-format msgid " Send OS info: %s " msgstr " Zasílat podrobnosti o OS : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " Registrovat " #: src/accountmanager.cc:155 #, c-format msgid " OpenPGP key: %s " msgstr " OpenPGP klíÄ: %s " #: src/accountmanager.cc:160 #, c-format msgid " Key passphrase: %s " msgstr " Heslo ke klíÄi: %s " #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " ZmÄ›nit pÅ™ezdívku " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " Aktualizovat detaily o sobÄ› " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Nastavit pryÄ-zprávu " #: src/accountmanager.cc:178 msgid " Set external status " msgstr " Nastavit vnÄ›jší stav " #: src/accountmanager.cc:181 msgid " Drop " msgstr " ZruÅ¡it úÄet " #: src/accountmanager.cc:200 msgid " user name: " msgstr " uživatelské jméno: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " heslo: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Nejdřív zahoÄte informace o úÄtu!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Nejprve se musíte odpojit od serveru!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " adresa serveru: " #: src/accountmanager.cc:285 msgid " priority: " msgstr " priorita: " #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "heslo pro PGP klíÄ: " #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " Registrace v %s síti " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "PokraÄovat" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Heslo zmÄ›nit na : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Ověření hesla : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Adresa serveru : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Ověření hesla: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "Nastavit pÅ™ezdívku: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "Server: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Hesla se neshodují" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Musí být zadáno heslo" #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "Heslo musí být alespoň 6 znaků dlouhé" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " PrůbÄ›h registrace " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "PÅ™ipojuji se k serveru %s…" #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Vysílám žádost" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "DoÅ¡el Äas pÅ™i Äekání na nové UIN. Mám to zkusit znovu?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Zkouším to znovu…" #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Dostal jsem nové UIN: %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Odpojeno" #: src/imcontroller.cc:179 msgid "Unable to connect to icq server. Retry?" msgstr "Nemohu se pÅ™ipojit k ICQ serveru. Znovu?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "Pokouším se zaregistrovat %s na %s…" #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "Jabber ID bylo úspěšnÄ› zaregistrováno" #: src/imcontroller.cc:228 msgid "Failed" msgstr "Selhalo" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "Pro aktualizaci údajů musíš být pÅ™ihlášen v ICQ síti" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "nová příjemná MSN pÅ™ezdívka: " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "Pro aktualizaci pÅ™ezdívky musíš být pÅ™ihlášen do MSN sítÄ›" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "Pro aktualizaci údajů musíš být pÅ™ihlášen do Jabber sítÄ›" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "Pro aktualizaci údajů musíš být pÅ™ihlášen do Gadu-Gadu sítÄ›" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "registrace není podporována" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "" "SkuteÄnÄ› se mi líbí výchozí pryÄ-zpráva pro protokol %s programu %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "+ CHYBA: captcha zakázána: žádná otázka nenalezena!" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ spuÅ¡tÄ›n %s příkaz" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "chyba pÅ™i odesílání: málo parametrů" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "chyba pÅ™i odesílání: v icq protokolu jsou povolena pouze UIN" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "chyba pÅ™i odesílání: neznámý typ IM" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "chyba pÅ™i odesílání: neznámý typ události" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s pro %s byl pÅ™idán do fronty" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "chyba pÅ™i odesílání: chyba pÅ™i vytváření adresáře pro kontakty" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "byl zadán neznámý znak pro stav" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "neznámý typ IM" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "chyba pÅ™i zmÄ›nÄ› stavu: " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Použití: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr " [VOLBA]…" #: src/icqconf.cc:1682 msgid "General options:" msgstr "Obecné volby:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " --ascii, -a použít ASCII znaky pro okna a prvky uživ. rozhraní" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b použít jiný poÄáteÄní adresář" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B pÅ™ipojit se na vybranou místní IP" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr " --no-xtitles, -T nepoužívat titulky xtermu" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" " --offline, -o po startu nastavit stav vÅ¡ech protokolů na " "„odpojen“" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr " --debug, -d zaznamenávat ladící zprávy" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help zobrazit tento text" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v zobrazit informace o verzi programu" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Volby pro odesílací události:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr " -s, --send typ události; může být msg, sms nebo url" #: src/icqconf.cc:1694 msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr "" " -S, --status zmÄ›nit souÄasný stav IM. Stav: o, _, a, d, n, c, " "f, i" #: src/icqconf.cc:1695 msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto typ protokolu; může být icq, yahoo, msn, aim, " "irc,\n" " jab, rss, lj, gg nebo infocard" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" " -t, --to UIN nebo pÅ™ezdívka adresáta (závisí na protokolu)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr " -n, --number poslat zprávu na mobilní Äíslo (pouze SMS)" #: src/icqconf.cc:1700 msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Chyby hlaste na http://bugzilla.centerim.org/." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Prázdná zpráva požadavku na autorizaci" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr " Vyžadovat autorizaci : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr " Autorizace :" #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Kontakty : " #: src/imevents.cc:522 msgid "" msgstr "" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* PÅ™enos souboru" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "Heslo pro PGP vyžadováno: " #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "chybné heslo pro PGP" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "Chyba pÅ™i PGP podepisování: " #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "Chyba pÅ™i PGP Å¡ifrování: " #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "[OTR] Chyba: inject_message_cb, příjemce „" #: src/imotr.cc:99 msgid "\" not found" msgstr "“ nenalezen" #: src/imotr.cc:114 msgid "Error" msgstr "Chyba" #: src/imotr.cc:116 msgid "Warning" msgstr "Varování" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Info" #: src/imotr.cc:122 src/imotr.cc:315 msgid " accountname: " msgstr " názevúÄtu: " #: src/imotr.cc:123 msgid " protocol: " msgstr " protokol: " #: src/imotr.cc:124 msgid " username: " msgstr " uživatelskéjméno: " #: src/imotr.cc:125 msgid " title: " msgstr " název: " #: src/imotr.cc:126 msgid " primary: " msgstr " prvotní: " #: src/imotr.cc:127 msgid " secondary: " msgstr " druhotný: " #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "[OTR] PÅ™ijat neznámý otisk z „" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr " Ověřit jej můžete v nastavení OTR." #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "[OTR] Spojení je nyní zabezpeÄené…" #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "[OTR] Spojení není zabezpeÄené…" #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "[OTR] Protokol: " #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "[OTR] Chyba pÅ™i Å¡ifrování zprávy, zpráva neodeslána!" #: src/imotr.cc:316 msgid " recipient: " msgstr " příjemce: " #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "[OTR] Chyba: V souÄasnosti je podporován jen jabber" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "[OTR] Pokouším se ustanovit zabezpeÄenou relaci s „" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "[OTR] UkonÄuji zabezpeÄenou relaci s „" #: src/imotr.cc:413 msgid "yes/no" msgstr "ano/ne" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "ne" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "ano" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr " Prosím, napiÅ¡te „ano“, nebo „ne“: " #: src/imotr.cc:462 msgid " Private keys " msgstr " Soukromé klíÄe " #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "Chyba pÅ™i výpoÄtu otisku" #: src/imotr.cc:472 msgid " Account: " msgstr " ÚÄet: " #: src/imotr.cc:473 msgid " Protocol: " msgstr " Protokol: " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr " Otisk: " #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr " Zapomenout klÃ­Ä " #: src/imotr.cc:481 msgid " Public keys " msgstr " VeÅ™ejné klíÄe " #: src/imotr.cc:488 msgid " User: " msgstr " Uživatel: " #: src/imotr.cc:489 msgid " Protocol: " msgstr " Protokol: " #: src/imotr.cc:490 msgid " Account: " msgstr " ÚÄet: " #: src/imotr.cc:495 msgid "Yes" msgstr "Ano" #: src/imotr.cc:495 msgid "No" msgstr "Ne" #: src/imotr.cc:499 msgid " Verified: " msgstr " Ověřeno: " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr " Aktivní otisk: " #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "Chcete vybraný klÃ­Ä zapomenout?" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "Chcete vybraný klÃ­Ä ověřit?" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "Není Jabber" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "Chybí OTR" #: src/imotr.cc:585 msgid "Plaintext" msgstr "ObyÄejný text" #: src/imotr.cc:586 msgid "Encrypted" msgstr "ZaÅ¡ifrováno" #: src/imotr.cc:587 msgid "Finished" msgstr "Hotovo" #: src/imotr.cc:588 msgid "Unknown" msgstr "Neznámý" #: src/imotr.cc:611 msgid "No Encryption" msgstr "Není zaÅ¡ifrováno" #: src/imotr.cc:615 msgid "Verified" msgstr "Ověřeno" #: src/imotr.cc:617 msgid "Unverified" msgstr "Neověřeno" #: src/icqface.cc:52 msgid "Male" msgstr "Muž" #: src/icqface.cc:53 msgid "Female" msgstr "Žena" #: src/icqface.cc:56 msgid "Not specified" msgstr "Neuvedeno" #: src/icqface.cc:61 msgid "Ok" msgstr "Ok" #: src/icqface.cc:62 msgid "Next" msgstr "Další" #: src/icqface.cc:63 msgid "Fwd" msgstr "PÅ™eposlat" #: src/icqface.cc:64 msgid "Reply" msgstr "OdpovÄ›dÄ›t" #: src/icqface.cc:65 msgid "Open" msgstr "Otevřít" #: src/icqface.cc:66 msgid "Accept" msgstr "PÅ™ijmout" #: src/icqface.cc:67 msgid "Reject" msgstr "Zamítnout" #: src/icqface.cc:68 msgid "User info" msgstr "Informace o uživateli" #: src/icqface.cc:70 msgid "Prev" msgstr "PÅ™edchozí" #: src/icqface.cc:78 msgid "sound card" msgstr "zvuková karta" #: src/icqface.cc:79 msgid "speaker" msgstr "PC speaker" #: src/icqface.cc:80 msgid "disable" msgstr "vypnout" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "nemÄ›nit" #: src/icqface.cc:88 msgid "dark" msgstr "tmavé" #: src/icqface.cc:89 msgid "blue" msgstr "modré" #: src/icqface.cc:97 msgid "protocol" msgstr "protokolu" #: src/icqface.cc:98 msgid "status" msgstr "stavu" #: src/icqface.cc:118 msgid "mode 1" msgstr "režim 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "režim 2" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr " CENTERIM %s, NEODESLÃNO: %lu" #: src/icqface.cc:274 msgid "Send an URL" msgstr "Odeslat URL" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " Odeslat SMS" #: src/icqface.cc:276 msgid "Send contacts" msgstr "Odeslat kontakty" #: src/icqface.cc:277 msgid " Request authorization" msgstr " Vyžádat autorizaci" #: src/icqface.cc:278 msgid "Edit details" msgstr "Upravit detaily" #: src/icqface.cc:279 msgid "Fetch away message" msgstr "Uložit zprávu pro nepřítomnost" #: src/icqface.cc:280 msgid "Add to list" msgstr "PÅ™idat do seznamu" #: src/icqface.cc:281 msgid "Rename contact" msgstr "PÅ™ejmenovat kontakt" #: src/icqface.cc:282 msgid " Move to group.." msgstr " PÅ™esunout do skupiny…" #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "Získat informace o verzi" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " Poslat soubor(y)" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " Pozvat na konferenci…" #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Odeslat zprávu pro kanál Enter" #: src/icqface.cc:294 msgid "Channel chat history" msgstr "Historie diskuze na tomto kanálu" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Odstranit kanál del" #: src/icqface.cc:296 msgid " Join channel" msgstr " PÅ™ipojit se ke kanálu" #: src/icqface.cc:297 msgid " Leave channel" msgstr " Opustit kanál" #: src/icqface.cc:298 msgid "List nicknames" msgstr "Seznam pÅ™ezdívek" #: src/icqface.cc:301 msgid "UnBlock channel messages" msgstr "Povolit zprávy z kanálu" #: src/icqface.cc:303 msgid "Block channel messages" msgstr "Zakázat zprávy z kanálu" #: src/icqface.cc:310 msgid "Send a message" msgstr "Poslat zprávu" #: src/icqface.cc:312 msgid "Event history" msgstr "Historie událostí" #: src/icqface.cc:313 msgid "Remove user" msgstr "Odebrat uživatele" #: src/icqface.cc:314 msgid "User's details" msgstr "Detaily uživatele" #: src/icqface.cc:315 msgid "External actions.." msgstr "Externí akce…" #: src/icqface.cc:318 msgid "Unset ignore user" msgstr "PÅ™estat ignorovat uživatele" #: src/icqface.cc:318 msgid "Ignore user" msgstr "Ignorovat uživatele" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr " PÅ™iÅ™adit PGP klíÄ…" #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr " Odebrat PGP klíÄ…" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr " PGP Å¡ifrování %s" #: src/icqface.cc:328 msgid "Force check" msgstr "Vynutit kontrolu" #: src/icqface.cc:435 msgid "Change status" msgstr "ZmÄ›nit stav" #: src/icqface.cc:436 msgid "Go to contact.." msgstr "Do kontaktů…" #: src/icqface.cc:437 msgid " Accounts.." msgstr " ÚÄty…" #: src/icqface.cc:438 msgid " CenterIM config options" msgstr " Konfigurace CenterIM" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr " Nastavení OTR a otisků" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Správce pÅ™enosu souborů" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Najít/pÅ™idat uživatele" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " PÅ™ipojit se ke kanálu/konferenci" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " Odebírat RSS zprávy" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Prohlížet/mÄ›nit seznam ignorovaných" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Prohlížet/mÄ›nit seznam neviditelných" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Prohlížet/mÄ›nit seznam viditelných" #: src/icqface.cc:455 msgid "Show offline users" msgstr "Ukázat odpojené uživatele" #: src/icqface.cc:457 msgid "Hide offline users" msgstr "Skrýt odpojené uživatele" #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " Upravit skupiny kontaktů" #: src/icqface.cc:461 msgid " Mass group move.." msgstr " Hromadný pÅ™esun skupin…" #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "Detaily" #: src/icqface.cc:905 msgid "Message" msgstr "Zpráva" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Nové hledání" #: src/icqface.cc:924 msgid "Contact to add" msgstr "PÅ™idat kontakt" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "Prohledávání kontaktů…" #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Výsledky hledání [hotovo]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Informace o %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "PÅ™ezdívka" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "Toto je tvůj LiveJournal úÄet. Použij ho" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "poslat nové položky do svého journalu." #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "Následující uživatelé vás vedou jako svého přítele:" #: src/icqface.cc:1112 msgid "found" msgstr "naÅ¡el" #: src/icqface.cc:1114 msgid "used" msgstr "používáno" #: src/icqface.cc:1114 msgid "not used" msgstr "nepoužíváno" #: src/icqface.cc:1116 msgid "not found" msgstr "nenaÅ¡el" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2. e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Starý e-mail" #: src/icqface.cc:1134 msgid "Gender" msgstr "Pohlaví" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Narozen(a)" #: src/icqface.cc:1136 msgid "Age" msgstr "VÄ›k" #: src/icqface.cc:1137 msgid "Languages" msgstr "Jazyky" #: src/icqface.cc:1138 msgid "Last IP" msgstr "Poslední IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "Naposled" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Nikdy" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "dnů" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "hodin" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "min" #: src/icqface.cc:1189 msgid "seconds" msgstr "sekund" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "soubory" #: src/icqface.cc:1221 msgid "Server-based contact" msgstr "Kontakt ze serveru" #: src/icqface.cc:1226 msgid "Awaiting authorization" msgstr "ÄŒekání na autorizaci" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "Soubor s avatarem " #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "Adresa" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "Místo" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "PSÄŒ/Zip" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Telefon" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "Fax" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Mobil" #: src/icqface.cc:1259 msgid "Timezone" msgstr "ÄŒas. pásmo" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Domácí stránka" #: src/icqface.cc:1300 msgid "Company" msgstr "Firma" #: src/icqface.cc:1301 msgid "Department" msgstr "OddÄ›lení" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "Titul" #: src/icqface.cc:1346 msgid "Interests" msgstr "Zájmy" #: src/icqface.cc:1358 msgid "Background" msgstr "Zázemí" #: src/icqface.cc:1376 msgid "Handle" msgstr "Název" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "RSS URL" #: src/icqface.cc:1378 msgid "Version" msgstr "Verze" #: src/icqface.cc:1379 msgid "Encoding" msgstr "Kódování" #: src/icqface.cc:1382 msgid "Link" msgstr "URL" #: src/icqface.cc:1384 msgid "Frequency" msgstr "Frekvence" #: src/icqface.cc:1385 msgid "Last check" msgstr "Naposled kontrolován" #: src/icqface.cc:1386 msgid "Next check" msgstr "Příští kontrola" #: src/icqface.cc:1387 msgid "Last result" msgstr "Poslední výsledek" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu minut" #: src/icqface.cc:1404 msgid "Now" msgstr "Nyní" #: src/icqface.cc:1423 msgid "Full name" msgstr "Plný název" #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "%s do URL, %s externí akce, %s zavÅ™eno" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "Informace o uživatele %s" #: src/icqface.cc:1456 msgid "Check" msgstr "Zkontrolovat" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "ZmÄ›nit" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "Stáhnout" #: src/icqface.cc:1466 msgid "Friend of" msgstr "Přítel" #: src/icqface.cc:1472 msgid "Home" msgstr "BydliÅ¡tÄ›" #: src/icqface.cc:1472 msgid "Work" msgstr "Práce" #: src/icqface.cc:1472 msgid "More" msgstr "Další" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Stáhnout" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] ICQ síť" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr " [gg] Gadu-Gadu" #: src/icqface.cc:1622 msgid " All protocols" msgstr " VÅ¡echny protokoly" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr " Pouze pÅ™ihlášené" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " nebo potvrdit, zruÅ¡it " #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " potvrdit, zruÅ¡it " #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "Do kontaktů" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "Seznam ignorovaných" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Seznam viditelných" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Seznam neviditelných" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Vyberte kontakty, které chcete pÅ™idat do seznamu" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "Odebrat také %d kontakt(y) ze seznamu kontaktů?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Příjemci události" #: src/icqface.cc:2269 #, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "Hledání: nÄ›co napiÅ¡te, %s hledá znovu, Enter ukonÄí" #: src/icqface.cc:2272 msgid "contact list quick search" msgstr "rychlé hledání v seznamu kontaktů" #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ žádná URL v souÄasném kontextu" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "URL v souÄasném kontextu" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ žádná akce není definována pro %s" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "Výsledky externí akce %s:" #: src/icqface.cc:2441 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "%s odesl., %s hrom., %s/%s pÅ™/nás disk., %s hist., %s URL, %s zvÄ›tÅ¡., %s " "Älen." #: src/icqface.cc:2442 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "%s odesl., %s hrom., %s/%s pÅ™/nás disk., %s hist., %s URL, %s zvÄ›tÅ¡., %s " "detaily" #: src/icqface.cc:2477 #, c-format msgid "Outgoing %s" msgstr "Odesílám %s" #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Posílám kontakty…" #: src/icqface.cc:2670 msgid "file name: " msgstr "jméno souboru: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "Odesílám %s pro %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Odesláno %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "PÅ™ijímám %s od %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "PÅ™ijato %s" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "%s pro URL, %s pÅ™es celou obrazovku, %s zavřít" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s od %s, pÅ™ijato %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s pro %s, odesláno %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "celoobrazovkový pohled" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "%s nebo %s zavřít, Up/DOwn a PgUp/PgDn posunout" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "Historie pro %s, celkem %d událost(í)" #: src/icqface.cc:3339 #, c-format msgid "%s search, %s again, %s cancel" msgstr "%s hledat, %s znovu, %s zruÅ¡it" #: src/icqface.cc:3348 msgid "search for: " msgstr "hledat pro: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] systém: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] e-mail od %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s se právÄ› pÅ™ipojil se stavem %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s zmÄ›nil stav na %s z %s" #~ msgid "Report bugs to ." #~ msgstr "" #~ "Chyby hlaste na .\n" #~ "Chyby pÅ™ekladu na ." centerim-4.22.10/po/boldquot.sed0000644000175000001440000000033111473011430013336 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g s/“/“/g s/â€/â€/g s/‘/‘/g s/’/’/g centerim-4.22.10/po/zh_TW.po0000644000175000001440000023100611473011457012421 00000000000000# Traditional Chinese language definitions for centerim. # Copyright (C) 2000-2001 Free Software Foundation, Inc. # Clive Lin , 2000 # Ying-Chieh Liao , 2000-2005 # Minor corrections by Ambrose Li , 2001 # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: centerim 4.22.1\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2007-11-05 17:09+0800\n" "Last-Translator: Ying-Chieh Liao \n" "Language-Team: Chinese \n" "Language: zh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: TAIWAN\n" #: src/centerim.cc:138 msgid "password: " msgstr "密碼 : " #: src/centerim.cc:174 #, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "%s 好å‹åå–®é¸å–®, %s 變æ›ç‹€æ…‹, %s 一般é¸å–®, %s/%s å‰å¾Œè¨Šæ¯, %s 離開" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "忽略所有來自 %s 的事件嗎 ?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "也把 %s 從好å‹å單中刪除嗎 ?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "真的è¦å°‡ %s ç”±å單中刪除嗎 ?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "新暱稱: " #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "改變使用者群組" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ ä¸èƒ½åœ¨é›¢ç·šç‹€æ…‹ä¸‹è®€å–暫離訊æ¯" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! ç£ç¢Ÿç©ºé–“ä¸åˆ° 10k 所以無法連線" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "暫離訊æ¯" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! 編譯時沒有加入 %s 的功能" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ 收到新信, å…± %d å°" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] 收到新信, å…± %d å°" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ æœ€å¾Œçš„è¨Šæ¯æ˜¯ %s 傳來的" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ %s 的設定已變更, 釿–°è¼‰å…¥ä¸­" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! 有å¦ä¸€éš» centerim 正在執行中" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! pid %lu 會造æˆå•題" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "手機號碼: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "把檔案存到哪個目錄 : " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "所指定的目錄ä¸å¯å¯«å…¥" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "所指定的目錄ä¸å­˜åœ¨" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ 與 %s 之間無訊æ¯è¨˜éŒ„" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ %s 已在å單中" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "把使用者加入群組" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s 已被加入å單中" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ å°æ–¹å·²ç¶“回來" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] 狀態回存" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] 自動設定 %s" #: src/centerim.cc:1490 msgid "away" msgstr "暫離" #: src/centerim.cc:1490 msgid "n/a" msgstr "N/A" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "+ screen é›¢ç·šæ™‚æŠŠç‹€æ…‹è¨­æˆ N/A" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "! Screen socket 路徑ä¸å­˜åœ¨ !" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "! è«‹ä¿®æ­£è·¯å¾‘æˆ–å–æ¶ˆ screen è‡ªå‹•åµæ¸¬åŠŸèƒ½" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! ç£ç¢Ÿç©ºé–“ä¸åˆ° 10k, 自動離線" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! å¦å‰‡å¯èƒ½æœƒéºå¤±é‡è¦è¨Šæ¯æˆ–是設定" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "邀請加入會議.." #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "鏿“‡è¦ç§»å‹•群組的好å‹" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "å°‡é¸å–的使用者移至.." #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "無法讀å–" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "錯誤的 XML" #: src/hooks/rsshook.cc:353 #, fuzzy msgid "no or tag found" msgstr "找ä¸åˆ° 標籤" #: src/hooks/rsshook.cc:362 #, fuzzy msgid "no or tag found" msgstr "找ä¸åˆ° 標籤" #: src/hooks/rsshook.cc:368 #, fuzzy msgid "wrong or tag" msgstr "錯誤的 標籤" #: src/hooks/rsshook.cc:380 msgid "success" msgstr "æˆåŠŸ" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "主題: " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "在哪裡發佈 :" #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "類別: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "作者 : " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "æè¿° : " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "é€£çµ : " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "附註: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] 無法連線: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "無法å解主機å稱" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "無法建立連線" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "驗證所輸入的主機ååŠåŸ è™Ÿ" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] 離開 %s 會議" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "請加入我的會議." #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "è‡ªè¨‚ç‹€æ…‹è¨Šæ¯ :" #: src/hooks/yahoohook.cc:703 #, fuzzy, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] 無法å–å¾— %s, %s 的暫離訊æ¯" #: src/hooks/yahoohook.cc:779 #, fuzzy msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] 無法連線: " #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] 無法登入 : 使用者å稱和密碼ä¸ç¬¦" #: src/hooks/yahoohook.cc:791 #, fuzzy msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] 無法登入 : 使用者å稱和密碼ä¸ç¬¦" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] 無法登入 : 該帳號被åœç”¨" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ 釿–°æª¢è¦– %s" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] 嵿¸¬åˆ°å¾žå…¶ä»–地方上線" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] 伺æœå™¨é—œé–‰é€£çµ" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "使用者 %s 邀請你加入 %s 會議, 主題是 : %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "ç›®å‰åƒåŠ æœƒè­°çš„æˆå“¡æœ‰ : " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "自動加入會議" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "使用者 %s 婉拒了你的會議邀請" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "使用者 %s 加入會議中" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "使用者 %s 離開會議了" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "該使用者己經將你加入他的好å‹å單中" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "è¨Šæ¯æ˜¯ : " #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] 從 %s, %s 寄來的 e-mail" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] ç³»çµ±è¨Šæ¯ : %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] 錯誤 : %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] 錯誤 : %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] 無法直接連線" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] 無法連線: " #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] 無法連線: " #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] 無法連線: " #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] 無法連線: " #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] 錯誤 : %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] 錯誤 : %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] 無法連線: " #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] 無法連線: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] 錯誤 : %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "該使用者今天生日" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] 無法連接伺æœå™¨" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] 在 %s agent è™•å–æ¶ˆç™»éŒ„" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "æš«é›¢è¨Šæ¯ : " #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] 無法å–å¾— %s, %s 的暫離訊æ¯" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "無法註冊有å•題的暱稱" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "無法連接" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "é ç«¯æ©Ÿå™¨ä½¿ç”¨ %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "é è¨­çš„ Jabber 會議主機" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, c-format msgid "+ [jab] error %d" msgstr "+ [jab] 錯誤 %d" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] 錯誤 %d : %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "該使用者把你從好å‹åˆ—表中移除 (以 Jabber 的話來說就是 unsubscribe)" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] 無法連接伺æœå™¨" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "我很喜歡 centerim é è¨­çš„ AIM 資訊 %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "AIM 連線失敗" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] 連線失敗: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "該使用者沒有å¯å–得的資訊" #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] 密碼已é€å‡º" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "如您所願" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "連線有å•題" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "䏿­£ç¢ºçš„使用者å稱" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "加速" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "密碼錯誤" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "使用者å稱和密碼ä¸ç¬¦" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "嵿¸¬åˆ°é‡è¤‡ç™»å…¥" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] cannot connect" msgstr "+ [icq] 無法連線 : " #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] 連線中斷" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "ICQ 中斷原因" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "è©²ä½¿ç”¨è€…å·²åŒæ„ä½ çš„èªè­‰è¦æ±‚" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "該使用者拒絕你的èªè­‰è¦æ±‚, ç†ç”±æ˜¯ : " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] 無法傳簡訊給 %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] 無法傳簡訊給 %s" #: src/hooks/icqhook.cc:1331 #, fuzzy, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] 無法å–å¾— %s, %s 的暫離訊æ¯" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "亂數é¸å–èŠå¤©å°è±¡" #: src/hooks/gaduhook.cc:161 msgid "+ [gg] connection failed" msgstr "+ [gg] 伺æœå™¨é€£ç·šå¤±æ•—" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [gg] 無法查明 %s" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "+ [gg] 連接伺æœå™¨æ™‚發生å•題" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "+ [gg] 伺æœå™¨é€£ç·šä¸­æ–·" #: src/hooks/gaduhook.cc:404 #, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [gg] 無法å–å¾— %s, %s 的暫離訊æ¯" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] 無法連接伺æœå™¨" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] 連線失敗: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] 暱稱æˆåŠŸåœ°è®Šæ›´äº†" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "ç™»å…¥é »é“ : " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "被 %s 踢出 ; ç†ç”±æ˜¯ : %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "該使用者把暱稱從 %s æ›æˆ %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] 密碼已é€å‡º" #: src/hooks/irchook.cc:1299 #, fuzzy msgid "+ [irc] nick password sent" msgstr "+ [irc] 密碼已é€å‡º" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "從使用者來的 PING 回應 : %d ç§’" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s 加入了" #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s 離開了" #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "ç†ç”± : %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s 被 %s 踢出去" #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "é »é“主題是 : %s " #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "ç”± %s 設定" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s 被 %s 賦與 op 權é™" #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s 被 %s å–æ¶ˆäº† op 權é™" #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s 給我 op 權é™" #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "你是這裡的 op" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s å–æ¶ˆæˆ‘çš„ op 權é™" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [lj] æœå°‹çµæŸ" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "無法連線 : " #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [lj] HTTP 連線失敗: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "伺æœå™¨è¨Šæ¯ :" #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] 登入失敗: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] 張貼æˆåŠŸï¼Œä»£è™Ÿæ˜¯ %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] 張貼錯誤 : %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "使用者 %s (%s) 己經將你加入他的好å‹å單中\n" "\n" "Journal ä½å€ : %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "使用者 %s 己經將你從他的好å‹å單中移除\n" "\n" "Journal ä½å€ : %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] åˆªé™¤å¥½å‹æ™‚發生錯誤" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] 已經從您的好å‹åˆ—表中刪除該使用者" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] 無法新增好å‹" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s 已被加入å單中" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] åå‘使用者列表已å–回, 找到 %d 筆資料" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "+ [msn] 未讀信件 : 收件匣中有 %d å°, 其他信匣中有 %d å°" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] 從 %s, %s 寄來的 e-mail" #: src/hooks/msnhook.cc:905 msgid "+ [msn] cannot connect: " msgstr "+ [msn] 無法連線 : " #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "驗證主機ååŠåŸ è™Ÿ" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "連接伺æœå™¨ä¸­" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "登入" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "æœå°‹çµæŸ, 找到 %d 筆資料" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "密碼æˆåŠŸåœ°è®Šæ›´äº†" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "æ–·ç·š" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "把 %s 加入好å‹åå–®" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "把 %s 從好å‹å單中刪除" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "æˆå“¡åˆ—表已å–回, 找到 %d 筆資料" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "該使用者今天生日" #: src/icqcontact.cc:853 msgid "Jan" msgstr "一月" #: src/icqcontact.cc:853 msgid "Feb" msgstr "二月" #: src/icqcontact.cc:853 msgid "Mar" msgstr "三月" #: src/icqcontact.cc:853 msgid "Apr" msgstr "四月" #: src/icqcontact.cc:854 msgid "May" msgstr "五月" #: src/icqcontact.cc:854 msgid "Jun" msgstr "六月" #: src/icqcontact.cc:854 msgid "Jul" msgstr "七月" #: src/icqcontact.cc:854 msgid "Aug" msgstr "八月" #: src/icqcontact.cc:855 msgid "Sep" msgstr "乿œˆ" #: src/icqcontact.cc:855 msgid "Oct" msgstr "åæœˆ" #: src/icqcontact.cc:855 msgid "Nov" msgstr "å一月" #: src/icqcontact.cc:855 msgid "Dec" msgstr "å二月" #: src/icqgroups.cc:66 msgid "General" msgstr "一般" #: src/eventmanager.cc:124 #, fuzzy, c-format msgid "event from %s (%s)" msgstr "從 %s 來的事件" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60 以上" #: src/icqdialogs.cc:50 msgid "unknown" msgstr "䏿˜Ž" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "一般èŠå¤©" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "愛情故事" #: src/icqdialogs.cc:60 msgid "Games" msgstr "éŠæˆ²" #: src/icqdialogs.cc:61 msgid "Students" msgstr "學生" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "二å多歲" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "三å多歲" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "å››å多歲" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "äº”åæ­²ä»¥ä¸Š" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "找女人" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "找男人" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "åå­—" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " æœå°‹è¨­å®šæª”" #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "移除" #: src/icqdialogs.cc:120 msgid "Load" msgstr "L載入" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ 必需先登入系統" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "O載入" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "A儲存" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "L清除" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "C修改" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "Sæœå°‹/A新增" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "J加入/C新創" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "I連çµ" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " F找尋/新增好å‹" #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " J加入或新創一個頻é“/會議 " #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " 連çµä¸€å€‹ RSS 來æº" #: src/icqdialogs.cc:299 msgid " Network " msgstr " 網路 " #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN " #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " 詳細資料 " #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " 暱稱 : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " E-Mail : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " å : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " å§“ : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " 年齡 : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " 性別 : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " 語言 : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " 地ç†ä½ç½® " #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " 城市 : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " çœ/å·ž : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " 國家 : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " 工作 " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " å…¬å¸ : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " 部門 : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " è·ç¨± : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " åªæ‰¾ä¸Šç·š " #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " 亂數èŠå¤©ç¾¤çµ„ " #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " é—œéµå­— " #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " 暱稱 " #: src/icqdialogs.cc:372 msgid " Search service " msgstr " æœå°‹æœå‹™ " #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " æœå°‹åƒæ•¸ " #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " é »é“åƒæ•¸ " #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " XML 匯出 URL : %s" #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " 檢查頻率 (以分為單ä½) : %lu" #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " é »é“ : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " å稱 : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr "" #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " é—œéµå­— : %s" #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " é¸é … " #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " åªå°‹æ‰¾é™„照片的使用者 : %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " åªå°‹æ‰¾ç·šä¸Šçš„ : %s" #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " 顯示到底有哪些人把你加到好å‹åˆ—表中 " #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " å稱/頭銜 " #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " 密碼 " #: src/icqdialogs.cc:443 msgid " Service " msgstr " æœå‹™ " #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "新設定檔å : " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "已經有一個åŒå的設定檔了. è¦è¦†è“‹éŽåŽ»å—Ž ?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "暱稱: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "å稱/頭銜 : " #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "E-Mail: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "å: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "å§“: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "城市: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "çœ/å·ž: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "å…¬å¸: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "部門: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "è·ä½: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "é »é“: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "å稱 : " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "é—œéµå­— : " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "密碼: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "URL: " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "檢查頻率 :" #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "錯誤的 Jabber 代碼 !" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " 一般 " #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " 註冊æœå‹™ " #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " è¨»å†Šåƒæ•¸ " #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " 變更密碼 : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " E-mail : %s " #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " 生日 : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " 年齡 : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " ä½å®¶ " #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " è¡—é“ä½å€ : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " 郵éžå€è™Ÿ : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " 電話 : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " 傳真 : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " 手機 : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " ç¶²é  : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " å…¶ä»– " #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " æ¯èªž : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 第一外語 : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 第二外語 : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " 雜項 " #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " 啟動網é ç‹€æ…‹æŒ‡ç¤ºå™¨ : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " 亂數èŠå¤©ç¾¤çµ„ : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " è¦æ±‚èªè­‰ : %s " #: src/icqdialogs.cc:698 #, fuzzy, c-format msgid " Avatar file : %s " msgstr " çœ/å·ž : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " 關於 " #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "下載你的詳細資料" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " ä½ çš„ %s 資料 " #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s 的詳細資料 " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "完æˆ" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "ç¨å¾…片刻, 您的詳細資料尚未傳回" #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "E-mail: " #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "輸入生日 (DD-MM-YYYY): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "年齡: " #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "è¡—é“ä½å€: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "郵éžå€è™Ÿ: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "電話: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "傳真: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "手機: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "首é : " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "關於" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "新密碼: " #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "確èªå¯†ç¢¼ : " #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "沒有" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X 儲存, Esc å–æ¶ˆ] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " 傳檔給 %s, %lu " #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "加入" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "附註" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "傳é€" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " 檔案 " #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " 附註 " #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "檔å: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "附註: " #: src/icqdialogs.cc:1163 msgid "None" msgstr "沒有" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "俄國的" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "波蘭的" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "" #: src/icqdialogs.cc:1198 msgid " CenterIM configuration " msgstr " CenterIM 設定é¸é … " #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " ä½¿ç”¨è€…ä»‹é¢ " #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " 改變音效è£ç½®ç‚º : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " 改變色彩é…置為 : %s " #: src/icqdialogs.cc:1221 #, fuzzy msgid " Change default request authorization message " msgstr " 需è¦èªè­‰" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr " 左崿¬„寬 : %d " #: src/icqdialogs.cc:1223 #, c-format msgid " Log panel height : %d " msgstr " Log 欄高 : %d " #: src/icqdialogs.cc:1224 #, c-format msgid " Chat panel height : %d " msgstr " èŠå¤©çª—欄高 : %d " #: src/icqdialogs.cc:1225 #, fuzzy, c-format msgid " Show opened chats : %s " msgstr " 群組分類顯示法 : %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " 啟動雙å‘語言功能 : %s " #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " 在文字編輯器裡啟動 emacs 按éµè¨­å®š : %s " #: src/icqdialogs.cc:1231 #, fuzzy, c-format msgid " Enable vi bindings: %s " msgstr " 在文字編輯器裡啟動 emacs 按éµè¨­å®š : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr "" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr " 轉æ›èªžç³»é ç¢¼" #: src/icqdialogs.cc:1241 #, c-format msgid " Switch to language preset : %s " msgstr " 切æ›åˆ°é è¨­èªžè¨€ : %s " #: src/icqdialogs.cc:1242 #, c-format msgid " Remote charset : %s " msgstr " é ç«¯å­—集 : %s " #: src/icqdialogs.cc:1243 #, c-format msgid " Local charset : %s " msgstr " 本地字集 : %s " #: src/icqdialogs.cc:1246 #, c-format msgid " For protocols : %s" msgstr " å°ä»€éº¼å”定 : %s " #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " 好å‹åå–® " #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " 群組分類顯示法 : %s " #: src/icqdialogs.cc:1251 #, fuzzy, c-format msgid " Sort contacts by : %s " msgstr " 群組分類顯示法 : %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " éš±è—離線使用者 : %s " #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr " 防垃圾訊æ¯: 刪除éžå¥½å‹çš„è¨Šæ¯ : %s " #: src/icqdialogs.cc:1254 #, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " å垃圾 : 忽略èªè­‰è«‹æ±‚ : %s " #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr " 防垃圾 : 用 CAPTCHA 來識別機器人 : %s " #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " åœ¨å›žè¦†è¨Šæ¯æ™‚引言 : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " 檢查本地端郵件 : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " 儲存密碼 : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " åœ¨è®Šæ›´ç‹€æ…‹æ™‚ä¿®æ”¹æš«é›¢è¨Šæ¯ : %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " èŠå¤©è¨Šæ¯æ¨¡å¼ : %s" #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " 按 Enter 就把訊æ¯é€å‡º : %s" #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " èŠå¤©è¨Šæ¯æ¨¡å¼ : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " 按 Enter 就把訊æ¯é€å‡º : %s" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr " æ°¸é ä¿æŒä¸Šç·šç‹€æ…‹ : %s" #: src/icqdialogs.cc:1284 #, c-format msgid " Color contacts according to: %s " msgstr " 群組分類顯示法 : %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " 通訊 " #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " SMTP 伺æœå™¨ : %s " #: src/icqdialogs.cc:1288 #, c-format msgid " HTTP browser : %s " msgstr " HTTP ç€è¦½å™¨ : %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " HTTP 代ç†ä¼ºæœå™¨ : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr " HTTP Proxy (RSS å’Œ LJ 會用到) : %s" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " 啟動 P2P 通訊 : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " P2P å¯ä½¿ç”¨çš„ port ç¯„åœ : %s " #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " 記錄中 " #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " log 視窗中是å¦è¦é¡¯ç¤ºæ™‚間戳記 : %s " #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr " 時間戳記記錄到秒 : %s " #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " log 視窗中是å¦è¦é¡¯ç¤º 上線/離線 資訊 : %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " 在 ~/.centerim/log 中詳註 IM 事件日誌細節 : %s" #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr " 自動上線狀態 " #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " è‡ªå‹•åˆ‡æ›æŠŠç‹€æ…‹åˆ‡æ›æˆæš«é›¢ (å–®ä½åˆ†) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " è‡ªå‹•æŠŠç‹€æ…‹åˆ‡æ›æˆ N/A (å–®ä½åˆ†) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr "" #: src/icqdialogs.cc:1311 #, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " ç•¶ screen é›¢ç·šæ™‚è‡ªå‹•æŠŠç‹€æ…‹åˆ‡æ›æˆ : %s " #: src/icqdialogs.cc:1313 #, c-format msgid " Screen socket path : %s " msgstr " Screen socket 路徑 : %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "閒置自動暫離時間 (0 表ä¸ä½¿ç”¨): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "閒置自動N/A時間 (0 表ä¸ä½¿ç”¨): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "SMTP 伺æœå™¨ä½å€: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "P2P å¯ä½¿ç”¨çš„ port ç¯„åœ (最å°-最大): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "HTTP 代ç†ä¼ºæœå™¨ä½å€: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "訊æ¯åŽŸå§‹å­—é›† : " #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "訊æ¯è½‰æ›å­—集 : " #: src/icqdialogs.cc:1446 msgid "HTTP browser to use: " msgstr "HTTP ç€è¦½å™¨ : " #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "左崿¬„寬 : " #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "Log 欄高 : " #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "èŠå¤©çª—欄高 : " #: src/icqdialogs.cc:1465 #, fuzzy msgid "Default authorization request message: " msgstr "空白的èªè­‰è¦æ±‚" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "Screen socket 路徑 : " #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "所指定的 screen socket 路徑ä¸å­˜åœ¨ !" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "您的詳細資料已傳回" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "管ç†ç¾¤çµ„" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Ræ›´å" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "E移除" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "Uå‘上移" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "Då‘下移" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "鏿“‡" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " 群組 " #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "新增群組å稱: " #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "新群組å: " #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "確定è¦åˆªé™¤ç¾¤çµ„å—Ž ?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "檔案傳輸狀態" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "å–æ¶ˆ" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " 從 %s 來的" #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " é€åˆ° %s 去 " #: src/icqdialogs.cc:1865 msgid "init" msgstr "啟始" #: src/icqdialogs.cc:1866 msgid "start" msgstr "é–‹å§‹" #: src/icqdialogs.cc:1867 msgid "work" msgstr "工作" #: src/icqdialogs.cc:1868 msgid "done" msgstr "完æˆ" #: src/icqdialogs.cc:1869 msgid "err" msgstr "錯誤" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "失敗" #: src/icqdialogs.cc:1877 msgid " of " msgstr " çš„ " #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "這個傳é€éŽç¨‹å·²ç¶“在進行中, ä¸èƒ½ç§»é™¤" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "公開的 (所有人都å¯ä»¥çœ‹å¾—到)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "ç§æœ‰çš„" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "åªçµ¦å¥½å‹" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr " LiveJournal 張貼 : 屬性" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "éŸ³æ¨‚åµæ¸¬" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "P張貼" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Aå–æ¶ˆ" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " 貼到 journal : %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " 主題 : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " 安全性 : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " 有趣的事物" #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " 心情 : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(ç„¡/自訂)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " 自訂心情 : %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " 音樂 : %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " 照片 : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "(é è¨­å€¼)" #: src/icqdialogs.cc:2068 #, fuzzy, c-format msgid " Tags : %s " msgstr " 年齡 : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " 關閉自動格å¼åŒ– : %s" #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " 關閉由 e-mail 傳éžè©•è«– : %s" #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " ä¸å…許評論 : %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " éŽæ™‚æ¢ç›® : %s" #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "張貼主題 :" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "ç¾æ­£æ’­æ”¾ : " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "ç›®å‰å¿ƒæƒ… :" #: src/icqdialogs.cc:2094 #, fuzzy msgid "Tags for the entry: " msgstr "伺æœå™¨è¨Šæ¯ :" #: src/icqdialogs.cc:2128 msgid "pgp key quick search" msgstr "PGP 金鑰快速æœå°‹" #: src/icqdialogs.cc:2130 #, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "PGP 金鑰æœå°‹: æœå°‹å¥½å‹, %s 冿‰¾ä¸€æ¬¡, Enter çµæŸæœå°‹" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr "鏿“‡ä¸€ä»½ PGP 金鑰 " #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr "ä¸ä½¿ç”¨é‡‘é‘°" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "鏿“‡ PGP 金鑰" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "鏿“‡ PGP 金鑰: 快速檢視請用 %s" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "執行外部命令 %s, 回傳碼 = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "執行外部命令 %s, 回傳碼 = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "離線" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "上線" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "隱形" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "歡迎èŠå¤©" #: src/imcontact.cc:114 msgid "Do not disturb" msgstr "ä¸è¦åµ" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "很忙" #: src/imcontact.cc:116 msgid "Not available" msgstr "沒空" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "暫離" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "外出åƒé£¯" #: src/imlogger.cc:37 msgid "DND" msgstr "DND" #: src/imlogger.cc:39 msgid "N/A" msgstr "沒空" #: src/imlogger.cc:49 msgid "message" msgstr "訊æ¯" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "簡訊" #: src/imlogger.cc:52 msgid "authorization" msgstr "èªè­‰" #: src/imlogger.cc:53 msgid "e-mail" msgstr "E-mail" #: src/imlogger.cc:54 msgid "notification" msgstr "æé†’" #: src/imlogger.cc:55 msgid "contacts" msgstr "好å‹" #: src/imlogger.cc:56 msgid "files" msgstr "檔案" #: src/imlogger.cc:57 msgid "event" msgstr "事件" #: src/imlogger.cc:79 msgid "events log started" msgstr "開始事件紀錄" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "é€ %s 給 %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "收到 %2$s 傳來的 %1$s" #: src/imlogger.cc:123 msgid "ignored" msgstr "忽略" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "%s [%s] 上線了" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s 離線了" #: src/imlogger.cc:141 #, c-format msgid "%s is now %s, was %s" msgstr "%1$s 從 %3$s æ”¹æˆ %2$s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: 上線了, ç›®å‰ç‹€æ…‹æ˜¯ %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: 離線了" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "把您的 %1$s 狀態從 %3$s åˆ‡æ›æˆ %2$s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " IM 帳號管ç†å“¡ " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " 伺æœå™¨ä½å€ : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " 安全性 : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " 帳號 : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " 密碼 (鏿“‡æ€§çš„) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " 密碼 : %s " #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr " 優先權 : %s " #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr " 匯入好å‹åå–® : %s " #: src/accountmanager.cc:134 #, c-format msgid " NickServ password (optional) : %s " msgstr " NickServ 密碼 (鏿“‡æ€§çš„) : %s " #: src/accountmanager.cc:141 #, fuzzy, c-format msgid " Request receipts: %s " msgstr " 群組分類顯示法 : %s " #: src/accountmanager.cc:146 #, fuzzy, c-format msgid " Send OS info: %s " msgstr " 群組分類顯示法 : %s " #: src/accountmanager.cc:150 msgid " Register " msgstr " 註冊 " #: src/accountmanager.cc:155 #, c-format msgid " OpenPGP key: %s " msgstr " OpenPGP 金鑰: %s " #: src/accountmanager.cc:160 #, c-format msgid " Key passphrase: %s " msgstr " 金鑰通行碼: %s" #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " 變更暱稱 " #: src/accountmanager.cc:169 msgid " Update user details " msgstr " 更新您的詳細資料 " #: src/accountmanager.cc:172 msgid " Set away message " msgstr " 設定暫離訊æ¯" #: src/accountmanager.cc:178 #, fuzzy msgid " Set external status " msgstr " 自動上線狀態 " #: src/accountmanager.cc:181 msgid " Drop " msgstr " åœç”¨ " #: src/accountmanager.cc:200 msgid " user name: " msgstr " 使用者: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " uin: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " 密碼: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "必需先丟棄帳號資料!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "必需先離線!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " 伺æœå™¨ä½å€ :" #: src/accountmanager.cc:285 msgid " priority: " msgstr " 優先權 :" #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "PGP 金鑰通行碼: " #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " 在 %s 網路上註冊 " #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "直接åš" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " 想使用的密碼 : %s" #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " 確èªå¯†ç¢¼ : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " 伺æœå™¨ä½å€ : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "驗證密碼: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "暱稱: " #: src/imcontroller.cc:108 msgid "Server: " msgstr "伺æœå™¨: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "密碼ä¸ç¬¦åˆ" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "必需輸入密碼" #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "å¯†ç¢¼è‡³å°‘è¦æœ‰ 6 個字" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " 註冊進行中... " #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "連線至伺æœå™¨ %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "é€å‡ºè«‹æ±‚" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "註冊新使用者逾時。é‡è©¦ ?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "é‡è©¦ä¸­..." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "æ–°çš„ UIN 是 %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "æ–·ç·š" #: src/imcontroller.cc:179 msgid "Unable to connect to icq server. Retry?" msgstr "無法連接 icq 伺æœå™¨ã€‚é‡è©¦ ?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "åšè©¦åœ¨ %2$s 中註冊 %1$s ..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "Jabber ID 已經æˆåŠŸåœ°è¨»å†Šäº†" #: src/imcontroller.cc:228 msgid "Failed" msgstr "失敗" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "在更新資料å‰å¿…需先登入 ICQ" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "MSN 新暱稱 : " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "在修改暱稱å‰å¿…需先登入 MSN 網路" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "在更新資料å‰å¿…需先登入 Jabber 網路" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "在更新資料å‰å¿…需先登入 Gadu-Gadu 網路" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "註冊目å‰å°šæœªæ”¯æ´" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "我很喜歡é è¨­çš„ %s æš«é›¢è¨Šæ¯ %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "+ ERROR: CAPTCHA å–æ¶ˆ : å•題ä¸å­˜åœ¨ !" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ 執行 %s 指令" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "事件傳é€éŒ¯èª¤ : åƒæ•¸ä¸è¶³" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "事件傳é€éŒ¯èª¤ : åªæœ‰åœ¨ ICQ å”定æ‰èƒ½å‚³ UINs" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "事件傳é€éŒ¯èª¤ : 䏿˜Žçš„ IM 型態" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "事件傳é€éŒ¯èª¤ : 䏿˜Žçš„事件型態" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s 到 %s 已被放入佇列中" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "事件傳é€éŒ¯èª¤ : 無法新增該使用者的目錄" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "䏿˜Žçš„狀態字元" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "䏿˜Žçš„ IM 型態" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "狀態字元有誤 : " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "使用方法: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr "" #: src/icqconf.cc:1682 msgid "General options:" msgstr "一般é¸é …:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr " --ascii, -a 使用 ASCII 字元來繪出視窗以åŠä½¿ç”¨è€…介é¢" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b 設定一個自訂目錄" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B 使用自訂的 IP" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr " --no-xtitles, -T ä¸åŽ»ä¿®æ”¹ xterm 的視窗標題" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr " --offline, -o 啟動時將所有å”定的狀態都設為離線" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr " --debug, -d 啟動除錯資訊" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help 顯示這份訊æ¯" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v 顯示程å¼ç‰ˆæœ¬è³‡è¨Š" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "事件傳é€é¸é …:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr " -s, --send 事件類型; å¯ä»¥æ˜¯ msg, sms 或是 url" #: src/icqconf.cc:1694 msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr "" " -S, --status 設定目å‰çš„ IM 狀態. 狀態å¯ä»¥æ˜¯ : o, _, a, d, n, " "c, f, i" #: src/icqconf.cc:1695 msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto å”定類型; å¯ä»¥æ˜¯ icq, yahoo, msn, aim, irc, jab, " "rss, lj, gg 或是 infocard" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr " -t, --to å°è±¡ UIN 或是暱稱 (ä¾å”定類型而異)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr " -n, --number 手機號碼 (åªé™ç”¨åœ¨çŸ­è¨Š)" #: src/icqconf.cc:1700 #, fuzzy msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "錯誤請通報 http://bugzilla.centerim.org" #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "空白的èªè­‰è¦æ±‚" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* è¦æ±‚èªè­‰ : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* èªè­‰ : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* 好å‹åå–® : " #: src/imevents.cc:522 msgid "" msgstr "<無暱稱>" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* 檔案傳輸" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "請輸入 PGP 通行碼: " #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "䏿­£ç¢ºçš„ PGP 通行碼" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "PGP ç°½å錯誤: " #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "PGP 加密錯誤: " #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "[OTR] 錯誤 : inject_message_cb, 收件者 \"" #: src/imotr.cc:99 msgid "\" not found" msgstr "\" 未尋ç²" #: src/imotr.cc:114 msgid "Error" msgstr "錯誤" #: src/imotr.cc:116 msgid "Warning" msgstr "警告" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "資訊" #: src/imotr.cc:122 src/imotr.cc:315 msgid " accountname: " msgstr " 帳號å稱 : " #: src/imotr.cc:123 msgid " protocol: " msgstr " 通訊å”定 : " #: src/imotr.cc:124 msgid " username: " msgstr " 使用者 : " #: src/imotr.cc:125 msgid " title: " msgstr " 標題 : " #: src/imotr.cc:126 msgid " primary: " msgstr " ä¸»è¦ : " #: src/imotr.cc:127 msgid " secondary: " msgstr " æ¬¡è¦ : " #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "[OTR] æ”¶åˆ°ä¸æ˜Žçš„æŒ‡ç´‹, 來自 \"" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr " ä½ å¯ä»¥åœ¨ OTR é¸é …裡進行確èª." #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "[OTR] 連線ç¾åœ¨å·²åР坆..." #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "[OTR] 連線ç¾åœ¨æœªåР坆..." #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "[OTR] Log: " #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "[OTR] åŠ å¯†è¨Šæ¯æ™‚發生錯誤... è¨Šæ¯æœªé€å‡º !" #: src/imotr.cc:316 msgid " recipient: " msgstr " 收件者: " #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "[OTR] 錯誤 : ç›®å‰åªæœ‰ jabber æ”¯æ´æ­¤åŠŸèƒ½" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "[OTR] 試著建立加密連線, å°è±¡æ˜¯ \"" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "[OTR] çµæŸåŠ å¯†é€£ç·š, å°è±¡æ˜¯ \"" #: src/imotr.cc:413 msgid "yes/no" msgstr "是/å¦" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "å¦" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "是" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr " 請輸入 'yes' 或 'no' :" #: src/imotr.cc:462 msgid " Private keys " msgstr " ç§å¯†é‡‘é‘° " #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "計算指紋時發生錯誤" #: src/imotr.cc:472 msgid " Account: " msgstr " 帳號 : " #: src/imotr.cc:473 msgid " Protocol: " msgstr " 通訊å”定 : " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr " 指紋 : " #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr " 忘記金鑰 " #: src/imotr.cc:481 msgid " Public keys " msgstr " 公開金鑰 " #: src/imotr.cc:488 msgid " User: " msgstr " 使用者 : " #: src/imotr.cc:489 msgid " Protocol: " msgstr " 通訊å”定 : " #: src/imotr.cc:490 msgid " Account: " msgstr " 帳號 : " #: src/imotr.cc:495 msgid "Yes" msgstr "是" #: src/imotr.cc:495 msgid "No" msgstr "å¦" #: src/imotr.cc:499 msgid " Verified: " msgstr " 已驗證 : " #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr " 啟動指紋 : " #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "想è¦å¿˜æŽ‰æ‰€é¸å–之金鑰嗎 ?" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "想è¦é©—證所é¸å–之金鑰嗎 ?" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "沒有 Jabber" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "沒有 OTR" #: src/imotr.cc:585 msgid "Plaintext" msgstr "明文" #: src/imotr.cc:586 msgid "Encrypted" msgstr "密文" #: src/imotr.cc:587 msgid "Finished" msgstr "完æˆ" #: src/imotr.cc:588 msgid "Unknown" msgstr "䏿˜Ž" #: src/imotr.cc:611 msgid "No Encryption" msgstr "未加密" #: src/imotr.cc:615 msgid "Verified" msgstr "已驗證" #: src/imotr.cc:617 msgid "Unverified" msgstr "未驗證" #: src/icqface.cc:52 msgid "Male" msgstr "ç”·" #: src/icqface.cc:53 msgid "Female" msgstr "女" #: src/icqface.cc:56 msgid "Not specified" msgstr "未指定" #: src/icqface.cc:61 msgid "Ok" msgstr "確èª" #: src/icqface.cc:62 msgid "Next" msgstr "下一個" #: src/icqface.cc:63 msgid "Fwd" msgstr "轉é€" #: src/icqface.cc:64 msgid "Reply" msgstr "回覆" #: src/icqface.cc:65 msgid "Open" msgstr "開啟" #: src/icqface.cc:66 msgid "Accept" msgstr "接å—" #: src/icqface.cc:67 msgid "Reject" msgstr "退回" #: src/icqface.cc:68 msgid "User info" msgstr "使用者資訊" #: src/icqface.cc:70 msgid "Prev" msgstr "å‰ä¸€é …" #: src/icqface.cc:78 msgid "sound card" msgstr "音效å¡" #: src/icqface.cc:79 msgid "speaker" msgstr "PC å–‡å­" #: src/icqface.cc:80 msgid "disable" msgstr "關掉" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "䏿”¹è®Š" #: src/icqface.cc:88 msgid "dark" msgstr "高雅的黑" #: src/icqface.cc:89 msgid "blue" msgstr "å°Šè²´çš„è—" #: src/icqface.cc:97 msgid "protocol" msgstr "å”定" #: src/icqface.cc:98 msgid "status" msgstr "狀態" #: src/icqface.cc:118 msgid "mode 1" msgstr "第 1 åž‹" #: src/icqface.cc:119 msgid "mode 2" msgstr "第 2 åž‹" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr " CENTERIM %s 未é€è¨Šæ¯: %lu" #: src/icqface.cc:274 msgid "Send an URL" msgstr "傳é€ç¶²å€" #: src/icqface.cc:275 msgid " Send an SMS" msgstr " 傳é€ç°¡è¨Š" #: src/icqface.cc:276 msgid "Send contacts" msgstr "傳é€å¥½å‹" #: src/icqface.cc:277 msgid " Request authorization" msgstr " 需è¦èªè­‰" #: src/icqface.cc:278 msgid "Edit details" msgstr "編輯詳細資料 " #: src/icqface.cc:279 msgid "Fetch away message" msgstr "æŠ“å–æš«é›¢è¨Šæ¯" #: src/icqface.cc:280 msgid "Add to list" msgstr "加入好å‹åå–®" #: src/icqface.cc:281 msgid "Rename contact" msgstr "好勿›´å" #: src/icqface.cc:282 msgid " Move to group.." msgstr " 移至群組.." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "æ“·å–版本資訊" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " 傳逿ª”案" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " 邀請åƒåŠ æœƒè­°.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " 丟一個頻é“è¨Šæ¯ enter" #: src/icqface.cc:294 msgid "Channel chat history" msgstr "é »é“éŽå¾€é›²ç…™" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " åˆªé™¤é »é“ del" #: src/icqface.cc:296 msgid " Join channel" msgstr " 加入頻é“" #: src/icqface.cc:297 msgid " Leave channel" msgstr " é›¢é–‹é »é“ " #: src/icqface.cc:298 msgid "List nicknames" msgstr "列出暱稱" #: src/icqface.cc:301 msgid "UnBlock channel messages" msgstr "顯示頻é“訊æ¯" #: src/icqface.cc:303 msgid "Block channel messages" msgstr "ä¸é¡¯ç¤ºé »é“訊æ¯" #: src/icqface.cc:310 msgid "Send a message" msgstr "é€è¨Šæ¯" #: src/icqface.cc:312 msgid "Event history" msgstr "事件éŽå¾€é›²ç…™" #: src/icqface.cc:313 msgid "Remove user" msgstr "移除使用者" #: src/icqface.cc:314 msgid "User's details" msgstr "å°æ–¹è©³ç´°è³‡æ–™" #: src/icqface.cc:315 msgid "External actions.." msgstr "外部動作.." #: src/icqface.cc:318 msgid "Unset ignore user" msgstr "ä¸å¿½ç•¥è©²ä½¿ç”¨è€…" #: src/icqface.cc:318 msgid "Ignore user" msgstr "忽略使用者" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr "指定 PGP 金鑰..." #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr "å–æ¶ˆ PGP 金鑰" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr "è½‰æ› PGP 加密 %s" #: src/icqface.cc:328 msgid "Force check" msgstr "強迫檢查" #: src/icqface.cc:435 msgid "Change status" msgstr "改變狀態" #: src/icqface.cc:436 msgid "Go to contact.." msgstr "移至好å‹åå–®.." #: src/icqface.cc:437 msgid " Accounts.." msgstr " 帳號.." #: src/icqface.cc:438 msgid " CenterIM config options" msgstr " CenterIM 設定é¸é …" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr " OTR é¸é …和指紋" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " 檔案傳輸顯示器" #: src/icqface.cc:444 msgid " Find/add users" msgstr " 找尋/新增好å‹" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " 加入頻é“/會議" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " 連çµä¸€å€‹ RSS 來æº" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " 檢視/編輯 忽略åå–®" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " 檢視/編輯 ä¸å¯è¦–åå–®" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " 檢視/編輯 å¯è¦–åå–®" #: src/icqface.cc:455 msgid "Show offline users" msgstr "顯示離線使用者" #: src/icqface.cc:457 msgid "Hide offline users" msgstr "éš±è—離線使用者" #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " 群組管ç†" #: src/icqface.cc:461 msgid " Mass group move.." msgstr " 大é‡ç¾¤çµ„轉移.." #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "詳細資料" #: src/icqface.cc:905 msgid "Message" msgstr "訊æ¯" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "æ–°æœå°‹" #: src/icqface.cc:924 msgid "Contact to add" msgstr "æ–°å¢žå¥½å‹ " #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "æœå°‹å¥½å‹.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "æœå°‹çµæžœ [ç„¡]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "%s 的詳細資料" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "暱稱" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "這是你的 LiveJournal 帳號。" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "用它來在你的 journal 裡張貼訊æ¯ã€‚" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "下列使用者將你加進他們的好å‹åå–® :" #: src/icqface.cc:1112 msgid "found" msgstr "å°‹ç²" #: src/icqface.cc:1114 msgid "used" msgstr "已使用" #: src/icqface.cc:1114 msgid "not used" msgstr "未使用" #: src/icqface.cc:1116 msgid "not found" msgstr "未尋ç²" #: src/icqface.cc:1131 msgid "E-mail" msgstr "E-mail" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "別的 e-mail" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "舊的 e-mail" #: src/icqface.cc:1134 msgid "Gender" msgstr "性別" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "生日" #: src/icqface.cc:1136 msgid "Age" msgstr "年齡" #: src/icqface.cc:1137 msgid "Languages" msgstr "語言" #: src/icqface.cc:1138 msgid "Last IP" msgstr "最後上線 IP" #: src/icqface.cc:1161 msgid "Last seen" msgstr "最後上線時間" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "從未" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "天" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "å°æ™‚" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "分" #: src/icqface.cc:1189 msgid "seconds" msgstr "ç§’" #: src/icqface.cc:1212 #, fuzzy msgid "idle" msgstr "檔案" #: src/icqface.cc:1221 #, fuzzy msgid "Server-based contact" msgstr "傳é€å¥½å‹" #: src/icqface.cc:1226 #, fuzzy msgid "Awaiting authorization" msgstr "èªè­‰" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "ä½å€" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "地ç†ä½ç½®" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "郵éžå€è™Ÿ" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "電話" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "傳真" #: src/icqface.cc:1258 msgid "Cellular" msgstr "手機" #: src/icqface.cc:1259 msgid "Timezone" msgstr "時å€" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "首é " #: src/icqface.cc:1300 msgid "Company" msgstr "å…¬å¸" #: src/icqface.cc:1301 msgid "Department" msgstr "部門" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "è·éŠœ" #: src/icqface.cc:1346 msgid "Interests" msgstr "興趣" #: src/icqface.cc:1358 msgid "Background" msgstr "背景" #: src/icqface.cc:1376 msgid "Handle" msgstr "" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "RSS 文件" #: src/icqface.cc:1378 msgid "Version" msgstr "版本" #: src/icqface.cc:1379 msgid "Encoding" msgstr "編碼" #: src/icqface.cc:1382 msgid "Link" msgstr "連çµ" #: src/icqface.cc:1384 msgid "Frequency" msgstr "頻率" #: src/icqface.cc:1385 msgid "Last check" msgstr "最後檢查時間" #: src/icqface.cc:1386 msgid "Next check" msgstr "下一個檢查" #: src/icqface.cc:1387 msgid "Last result" msgstr "ä¸Šæ¬¡çµæžœ" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu 分" #: src/icqface.cc:1404 msgid "Now" msgstr "立刻" #: src/icqface.cc:1423 msgid "Full name" msgstr "å…¨å" #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "%s é€£çµ URL, %s 外部指令, %s 關閉" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "使用者 %s 的資訊" #: src/icqface.cc:1456 msgid "Check" msgstr "檢查" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "編輯" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "接收" #: src/icqface.cc:1466 msgid "Friend of" msgstr "好å‹" #: src/icqface.cc:1472 msgid "Home" msgstr "ä½å®¶" #: src/icqface.cc:1472 msgid "Work" msgstr "工作" #: src/icqface.cc:1472 msgid "More" msgstr "å…¶ä»–" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "接收" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] ICQ 網路" #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr " [gg] Gadu-Gadu" #: src/icqface.cc:1622 msgid " All protocols" msgstr " 所有å”定" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr " åªæœ‰å·²ç™»å…¥" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " 或 確定, å–æ¶ˆ" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " 確定, å–æ¶ˆ" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "移至好å‹åå–®" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "忽略åå–®" #: src/icqface.cc:1953 msgid "Visible list" msgstr "å¯è¦–åå–®" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "ä¸å¯è¦–åå–®" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "鏿“‡åŠ å…¥å單的列表" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "也把 %d 好å‹å¾žå¥½å‹åˆ—表中移除嗎 ?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "事件接å—者" #: src/icqface.cc:2269 #, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "好å‹é€ŸæŸ¥: æœå°‹å¥½å‹, %s 冿‰¾ä¸€æ¬¡, Enter çµæŸæœå°‹" #: src/icqface.cc:2272 msgid "contact list quick search" msgstr "好å‹å單速查" #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ ç›®å‰çš„訊æ¯ä¸­æ²’有 URL" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "ç›®å‰è¨Šæ¯ä¸­çš„ URL" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ %s 沒有定義外部動作" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "%s å¤–éƒ¨å‹•ä½œçš„çµæžœæ˜¯ : " #: src/icqface.cc:2441 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "%s é€å‡º, %s 多人短訊, %s/%s å‰å¾Œè¨Šæ¯, %s éŽçœ¼é›²ç…™, %s URLs, %s 全螢幕, %s æˆ" "å“¡" #: src/icqface.cc:2442 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "%s é€å‡º, %s 多人短訊, %s/%s å‰å¾Œè¨Šæ¯, %s éŽçœ¼é›²ç…™, %s URLs, %s 全螢幕, %s 資" "訊" #: src/icqface.cc:2477 #, c-format msgid "Outgoing %s" msgstr "é€åˆ° %s" #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "傳é€å¥½å‹.." #: src/icqface.cc:2670 msgid "file name: " msgstr "檔å: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "é€ %s 給 %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "é€è‡³ %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "收到 %s, 從 %s 傳來" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "從 %s 接收到" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "%s 連到網å€,%s 全螢幕, %s 關閉" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "在 %3$s 上收到從 %2$s 來的 %1$s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "在 %3$s 上é€å‡ºçµ¦ %2$s çš„ %1$s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "全螢幕檢視" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "%s 或 %s 關閉, Up/Down å’Œ PgUp/PgDn æ²é " #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "與 %s çš„éŽå¾€é›²ç…™, 共有 %d ç­†" #: src/icqface.cc:3339 #, c-format msgid "%s search, %s again, %s cancel" msgstr "%s æœå°‹, %s 冿œå°‹,%s å–æ¶ˆ" #: src/icqface.cc:3348 msgid "search for: " msgstr "æœå°‹: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] ç³»çµ±è¨Šæ¯ : %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] 從 %s, %s 寄來的 e-mail" centerim-4.22.10/po/cs.gmo0000644000175000001440000015444511473011460012144 00000000000000Þ•#4?L2HC+ICuC‰CC±CÅCÙCíCKD6MD1„D5¶D-ìD/EIJE8”EWÍEG%FhmF=ÖFHG ]GkGG“G§G*ÇGòG úG H HH 3H>HOH^H'vH.žH6ÍH-I#2IVImIII*´I)ßI4 J>JQJhJyJ“J©JÂJÛJ.ùJ(K:KQKoK~K™K·K!ÐKòKL +L7L!NL pLzL‹LšL©L¸LËL0ÝL MM)7MaMzM M M)M-ÇM+õM)!NKN"dN‡N!¦N ÈN ÖNáNóN OO&O6OEOWO kO xO †OO™O­OÆOàOçO÷O P&P9P QP_P"xP"›P¾P ÓPÞPîPþPQQ7QIQ!\Q~Q “QžQ ·Q ÁQÎQêQýQ RR R 1R >R JR WR#aR …RR R ¾R.ÌRûR SS0S ASLSgSwS ŽS›SªS°S)ÍS÷STT.T =TIT'XT €TŽT®TÂT ÛTæTUU5ULUfU|UœU³UÊUÝU÷U VV.V=VMVeVxV ˜V ¥V³V ÍVÛV ðVúV W#W'{$l{C‘{\Õ{<2|+o|'›|Ã|Ì|Ò|Ú|ú|}} }*}C}'U}}}…} —}¢} ª}´}Ã}Ì} Ô}4á}~~#~%4~Z~)^~Bˆ~;Ë~?AG‰¨ ±¼!Ü"þ8!€4Z€+€ »€)Ç€-ñ€%? U bp u ‚ œ¡¨®#½ áë‚‚'‚?‚Z‚i‚n‚"s‚–‚ ž‚ «‚¸‚½‚т؂܂â‚=õ‚*3ƒ<^ƒ$›ƒ'Àƒèƒ-ûƒ4)„ ^„ j„u„{„ „Ž„Ÿ„¥„¾„Æ„Ú„ó„ø„ý„ …( …5…=…A…H… O…Y…a…e…}…!€…¢…¿… Ä…Î… ×…ä…!ö… †#†8†!J†l†t†}†•† œ†§†ņã†è† ‡‡ ‡!‡ 1‡<‡D‡J‡Q‡g‡o‡‡Ї’‡"¢‡ŇʇÛ‡ú‡&ˆ>ˆCˆ aˆkˆoˆvˆÆ‰ˆ1PŠ‚Š™Š®ŠŠØŠíŠ‹Q‹Ak‹B­‹9ð‹.*Œ6YŒUŒ?æŒU&I|ŠÆJQŽRœŽ ïŽýŽ%%:2` “ ª ¸Ã Õ áí03H7|,´%á!‘)‘C‘!`‘-‚‘3°‘Eä‘*’!D’f’}’ œ’©’¿’"Õ’0ø’)“?“&S“ z“ˆ“ž“"¸“!Û“"ý“ ” 8”F”d” ” Ž” ›”¨” »”È”×”8é” "•,•&L•s••  • ®•.¼• ë•% –&2–"Y–%|–¢–"À– ã– ð–û–— +—5—P—k— z—ˆ——±— Á— Ë—Õ—î—"˜ *˜7˜Q˜!g˜‰˜˜¶˜#Ϙ$ó˜"™;™R™e™ }™Š™™­™Ê™á™&ñ™š-š#4šXš jš'wšŸš ¼šÇš Öšàš úš››)›"1› T›b›u››0¡›Ò›ç›ï› œœ&œ @œMœeœtœ„œ-Šœ$¸œ Ýœëœ *6&El#€¤" åó ž"ž8ž PžqžˆžŸžµžÑžäžŸŸ1ŸIŸ^ŸsŸ!“Ÿ#µŸ ÙŸæŸøŸ  %  ; E ^ $x 6 Ô  ð  ý  ¡¡/¡$?¡(d¡¡¢¡ ¨¡³¡Ê¡(ê¡¢(¢ B¢&O¢ v¢(ƒ¢)¬¢'Ö¢þ¢££1£A£ a£m£|£Œ£ £ ¨£¶£È£ Ü£ê£î£ ÷£¤¤¤C4¤&x¤,Ÿ¤E̤N¥4a¥/–¥)Æ¥ ð¥ þ¥¦P¦n¦)„¦®¦*Ʀ!ñ¦§ &§4§S§1j§œ§T¼§S¨ e¨†¨(ž¨1Ǩù¨©%&© L©X© g©u© ©©¯©¸©9Õ©5ª5Eª{ª›ª"¯ªÒª%몫-«H«"a«%„«ª«UÅ«¬ ,¬!M¬o¬'¬.·¬æ¬&þ¬%­6­(K­%t­)š­*Ä­ï­®$'®!L®"n®%‘®9·®&ñ®¯6¯BO¯A’¯/Ô¯°V#°z°7™°;Ѱ< ±#J±n±#‰± ­±*αù±²"+²&N²(u²#ž²1²ô² ³!+³ M³n³ w³³г “³ ž³©³»³ ³̳Õ³ݳð³÷³ü³´´!$´F´J´4R´$‡´&¬´Ó´ç´ü´µµ)µ 2µ=µYµ aµ ‚µ޵”µœµ ¤µ!±µÓµîµ÷µ¶+¶ J¶W¶j¶}¶-¶¾¶ Ƕ Ò¶ß¶å¶í¶ ·#·@·U·e··Š·&Ž·(µ· Þ· é·ö·þ·¸¸¸"(¸ K¸l¸&s¸š¸£¸ª¸³¸»¸*˸ ö¸ ¹&¹7¹=¹Y¹m¹ ‚¹£¹´¹¼¹À¹ƹ˹"ѹô¹º)º?ºFºOº`º qº{º „º ‘ºœº º©º±ºźÔº ãºïºÿº»2»9»'U» }»ˆ»š»O¯»Cÿ»#C¼g¼|¼‘¼¦¼«¼º¼ Á¼μä¼ü¼½½½½1½H½K½ R½_½ u½ƒ½—½ ½º½¾½ƽÙ½á½è½¾ ¾.¾>¾C¾K¾`¾q¾ y¾ †¾’¾™¾¸¾ǾξԾ﾿ "¿0¿I¿Y¿a¿ u¿¿ ˜¿¦¿©¿ ½¿ ʿտٿ ï¿ù¿ý¿ ÀÀ ÀÀ "À0À ?À KÀUÀ sÀ ~ÀŒÀ¡À¿ÀFÖÀ/ÁMÁjÁ-ŠÁ*¸ÁãÁüÁÂÂ7 ?ÂIÂ%Y†– °Â¼Â:ËÂÃ(à 7à CÃNÃ&VÃ1}ïà ÂÃÏà äÃ.ðÃÄ ;Ä EÄOÄ eÄqÄwÄ{Ä"‘Ä´ÄÑÄáÄ þÄ ÅÅ6!Å7XÅ2Å*ÃÅîÅõÅ ÆÆ!Æ7Æ JÆWÆ]ÆpÆyÆ–ÆžÆ¯Æ¾ÆÆÆÏÆ*çÆ<Ç8OÇ ˆÇ©Ç'ÆÇNîÇ>=È?|È'¼ÈäÈFÉKÉ'iÉ'‘É1¹É.ëÉÊa8Ê9šÊ,ÔÊ>Ë @ËMËSË'[˃ˉË˓˯ËÊË*ßË ÌÌ 2Ì >ÌJÌbÌ uÌÌ…Ì;™Ì ÕÌàÌçÌ*úÌ%Í&)ÍEPÍ>–ÍBÕÍCÎ\Î|Î …Î%Î(¶Î+ßÎ; Ï6GÏ0~ϯÏ$ÀÏ9åÏÐ#%ÐIÐ_Ð qÐ|Ð ‚РОипРÇÐÑÐåÐ ÑÑ&(ÑOÑXÑ#oѓѤѫÑ"°ÑÓÑÛÑäÑíÑ ôÑÒÒ"Ò+ÒH?Ò)ˆÒA²Ò)ôÒ0Ó%OÓ1uÓ9§ÓáÓòÓÔ ÔÔ&Ô>ÔDÔ ^ÔjÔÔ •Ô ¢Ô¬Ô´Ô5ÄÔúÔÕ Õ ÕÕ Õ'Õ#+ÕOÕ7RÕ2ŠÕ½ÕÆÕÏÕ ÞÕëÕ Ö!Ö)ÖGÖ)[Ö …Ö Ö™Ö¶Ö ¾ÖÉÖ#çÖ × × 4×A×H×W×m× |× ‡×‘×—× ²×¾×!Í× ï×ù×" Ø -Ø:ØUØ&pØ2—ØÊØ%ÒØ øØÙÙÙèT¤¬ O^g]Ëß>Ï Z,$˜Â(¼õŸˆ°ìÂ`ŒŽÛe»í7bo}ýp¾Љ*ªí fwG\Žä aÝöªË ¿ù¸KiH é:ÙYw0ÿçrÉuDVæ„gFsØ8ïa¹h,߬`\ØhëM˜«êŠáÜ^à" %xeðœVÚ„štß:d fIšã£9ÈH€Ê~Q¯Ûç¿aBv °}ä›pPüö=n€ÄÕ8­`”–êë{óX”t+4€×W´ÜÔE!µÆ¡¬áA²§÷L¥k"w©#™K¦˜õôjšð ™åXÍ Ã_*ÚT¸²i–h”ÃÞ|º;ö"yωLÀ÷N5‰Ñ6=´K¼ò ýCûá[­î7Ž!rÝ0d2ŠÔz›=Ö È'&³¥A]¼¶-Ó̃ÞvòYÊÏO“Ó]¡ÅæY5Ùxøþ†Õ©.—A>N »B«fPFSˆ½ÝëÆ9¢/<Jjµ¹{¨Hè…LGòÊM‘3}l#œ¢~Ò-m´"­±ƒ„À>ð¾rû·³Å@X¸+ê’Ô/b1Ÿ#þ\ÑÐóã½øV)&.4uÒkÄâñ²ž:C§[ªó¹c U¾#íÖCýRB< ȶcnÓ™üù6Ûeú0 FZ±‘’Z%[()®îù7Nqú³Î ïIü 濺2Ÿ3oœ¯ËJ81%jì 'ÑiÂ?ˆ»£ή‚Õ$Ìþÿ'SâD,c‚{¡Pž lÅ<x6¯Œñ-·u×Ä^Q‹º D§àÁRÁ“•ÒzE·¥†R3¶•ÿŒÃ‚W&JÌs°Ç®IQ.yU¢ÚÖ—sätgž÷É âmz~ÙÍSགྷøåbqç dƨõk‘¨…m“+ *yìǦ›‡ô@Í G1…?ñ×@_?‹|±Eúô‹ln—)î’U$‡!Фã;(å9•2†pµ!ûoÜqÎW–è; ÀéÉéMØ/«‡|4O5T©Ç£v¦Þ_Á You can verify it in the OTR options. accountname: primary: protocol: recipient: secondary: title: username: --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --debug, -d enables debug info logging --help display this stuff --no-xtitles, -T disable xterm titles --offline, -o set all protocols status to offline upon start --version, -v show the program version info -S, --status change the current IM status. Status; o, _, a, d, n, c, f, i -n, --number mobile number to send an event to (sms only) -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, jab, rss, lj, gg or infocard -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Account: Account: Accounts.. Active fingerprint: Age : %s Age range : %s All protocols Already logged in only Always online non-IM contacts for : %s Anti-spam: ignore authorization requests: %s Anti-spam: kill msgs from users not on the list : %s Anti-spam: use captcha to identify bots: %s Arrange contacts into groups : %s Ask before quit : %s Assign PGP key.. Authorization required : %s Auto Presence Status Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Automatically set N/A when screen is detached : %s Avatar file : %s Backdated entry : %s Birthdate : %s CENTERIM %s UNSENT: %lu Cellular phone : %s CenterIM config options CenterIM configuration Change color scheme to : %s Change default request authorization message Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Chat panel height : %d Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Codepages conversion Color contacts according to: %s Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable vi bindings: %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users Fingerprint: First name : %s For protocols : %s Forget key Gender : %s General Groups HTTP browser : %s HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Import friend list : %s Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Joined since the last check only Key passphrase: %s Keywords Keywords : %s Language : %s Last name : %s Leave channel Left panel width : %d Link an RSS feed Link an RSS feed LiveJournal posting: attributes Local charset : %s Location Log panel height : %d Logging Login : %s Look for online only : %s Mass group move.. Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network NickServ password (optional) : %s Nickname Nickname : %s OTR options and fingerprints Online only Online/offline events in the log window : %s OpenPGP key: %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Please type 'yes' or 'no': Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Priority : %s Private keys Protocol: Protocol: Proxy only for HTTP (rss and lj) : %s Public keys Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remote charset : %s Remove channel del Request authorization Request receipts: %s SMTP server : %s Screen socket path : %s Search parameters Search profiles Search service Secured : %s Security : %s Select PGP key to use Send OS info: %s Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Set external status Show opened chats : %s Show users who have you on their list Sort contacts by : %s State : %s Street address : %s Subject : %s Switch to language preset : %s Tags : %s Timestamps in the log window : %s Timestamps include seconds : %s Turn PGP encryption %s UIN UIN : %s Unassign PGP key Update user details Use X to report idle time : %s Use no key User interface User: Users with photos only : %s Verified: View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [OPTION]... [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM of password: priority: server address: uin: user name: ! Correct path or disable screen auto presence change! Screen socket path doesn't exist!! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu" not found%lu minutes%s [%s] comes online%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit%s from %s, received on %s%s has been deopped by %s.%s has been kicked by %s%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s is now %s, was %s%s or %s to close, Up/Down and PgUp/PgDn to scroll%s search, %s again, %s cancel%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb%s to %s has been put to the queue%s to %s, sent on %s%s to URLs, %s external actions, %s close%s to URLs, %s to full-screenize, %s close%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ ERROR: captcha disabled: no questions found!+ Set N/A after screen detach+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [gg] cannot resolve %s+ [gg] connection failed+ [gg] connection lost+ [gg] connection to the server failed+ [gg] no away message from %s, %s+ [icq] cannot connect+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nick password sent+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] cannot connect: + [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)+ [yahoo] cannot login+ [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] cannot login: username doesn't exist+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ [yahoo] server closed socket+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ new mail arrived, %d messages+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptActivityAddAdd to listAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAvatar fileAvatar file: Awaiting authorizationAwayAway message:BackgroundBirthdateBlock channel messagesCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChange statusChannel chat historyChannel topic now is: %sChannel: Charset to convert messages from: Charset to convert messages to: Chat panel height: CheckCheck frequency: Check the new password: Check the password you entered: Choosen screen socket path doesn't exist!City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DNDDecDefault Jabber conference serverDefault authorization request message: DepartmentDepartment: Description: DetailsDetect musicDisconnectedDo not disturbDo you want to forget the selected key?Do you want verify the selected key?DoneDrop the account information first!E-Mail: E-mailE-mail: EditEdit detailsEmpty authorization request messageEncodingEncryptedEnter birthdate (DD-MM-YYYY): ErrorError calculating FingerprintEvent historyEvent recipientsEvents sending options:External actions..FailedFaxFax: FebFemaleFetch away messageFetch version infoFetching your detailsFile transfer statusFinishedFirst name: Force checkFree for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:German UTF-8Go aheadGo to contact..HTTP browser to use: HTTP proxy server hostname: HandleHide offline usersHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIgnore userIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLeft panel width: LinkLink: List nicknamesLoadLocationLog panel height: MaleMarMass move selected users to..MayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: NoNo EncryptionNo JabberNo OTRNoneNot availableNot specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOut for LunchOutgoing %sOutgoing %s to %sPGP encrypt error: PGP key passphrase: PGP key search: type to find, %s find again, Enter finishPGP key selection: %s for quick lookupPGP passphrase required: PGP sign error: PING reply from the user: %d second(s)Password must be at least 6 chars longPassword must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: PlaintextPlease join my conference.PolishPosition: PostPosting subject: PrevPublished on: QuickSearch: type to find, %s find again, Enter finishRSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?Remove userRenameRename contactReplyReport bugs to http://bugzilla.centerim.org/.Result of the external action %s:RetreiveRetrieveRetrying..RomanceRussianSMSSMTP server hostname: Screen socket path: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSelect contacts to moveSendSend a messageSend an URLSend contactsSend contacts..Sending requestSent on %sSepServer-based contactServer: Show offline usersState: Status and ActivityStatus and NameStreet address: StudentsTags for the entry: The Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesThis is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnBlock channel messagesUnable to connectUnable to connect to icq server. Retry?UnknownUnset ignore userUnverifiedUsage: User infoUser's detailsVerifiedVersionVisible listWait a moment. Your details haven't been fetched yetWarningWorkWrong Jabber ID!Wrong nickname given, cannot registerYesYou have to disconnect the service first!You must be logged to the Gadu-Gadu network to update your detailsYou must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: [OTR] Connection is insecure...[OTR] Connection is now secure...[OTR] Ending secure session with "[OTR] Error while encrypting message... no message sent![OTR] Error: At the moment, only jabber is supported[OTR] Error: inject_message_cb, recipient "[OTR] Log: [OTR] Received unknown fingerprint from "[OTR] Trying to start a secure session with "abortadding %s to the contactsaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: connecting to the servercontact list quick searchcontactscould not create socketcould not resolve hostnamecouldn't fetchdarkdaysdirectory to save the file(s) to: disabledisconnecteddon't changedonedual login detectede-mailerreventevent from %s (%s)event sending error: error creating directory for the contactevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfoundfriends onlyfull-screen viewhoursicq disconnection reasonignoredincoming %s from %sincorrect PGP passphraseinitlInklOadlogged inmembers list fetching finished, %d foundmessageminmode 1mode 2move Downmove Upn/anew MSN friendly nick: nono or tag foundno or tag foundnonenot foundnot usednotificationoutgoing %s to %spassword was changed successfullypassword: pgp key quick searchpgp key selectionpost new entries to your journal.privateprotocolpublic (visible to all)rEmovereason: %sregistration is not supportedremoving %s from the contactssAvesearch finished, %d foundsearch for: secondsset by %ssocket problemssound cardspeakerstartstatusstatus change error: successthe message was: turboingunknownunknown IM typeunknown status character was givenuseduser info for %susername and password mismatchverify the hostname and portverify the pager host and port enteredworkwrong or tagwrong XMLyesyes/noyou are an op hereProject-Id-Version: centerim 4.22.8 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2009-10-26 14:48+0100 Last-Translator: Petr PísaÅ™ Language-Team: Czech Language: cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ověřit jej můžete v nastavení OTR. názevúÄtu: prvotní: protokol: příjemce: druhotný: název: uživatelskéjméno: --ascii, -a použít ASCII znaky pro okna a prvky uživ. rozhraní --basedir, -b použít jiný poÄáteÄní adresář --bind, -B pÅ™ipojit se na vybranou místní IP --debug, -d zaznamenávat ladící zprávy --help zobrazit tento text --no-xtitles, -T nepoužívat titulky xtermu --offline, -o po startu nastavit stav vÅ¡ech protokolů na „odpojen“ --version, -v zobrazit informace o verzi programu -S, --status zmÄ›nit souÄasný stav IM. Stav: o, _, a, d, n, c, f, i -n, --number poslat zprávu na mobilní Äíslo (pouze SMS) -p, --proto typ protokolu; může být icq, yahoo, msn, aim, irc, jab, rss, lj, gg nebo infocard -s, --send typ události; může být msg, sms nebo url -t, --to UIN nebo pÅ™ezdívka adresáta (závisí na protokolu) detaily: %s První jazyk : %s Druhý jazyk : %s TÅ™etí jazyk : %s potvrdit, zruÅ¡it nebo potvrdit, zruÅ¡it O mnÄ› ÚÄet: ÚÄet: ÚÄty… Aktivní otisk: VÄ›k : %s VÄ›k : %s VÅ¡echny protokoly Pouze pÅ™ihlášené Ne-IM kontakty vždy „pÅ™ipojené“ pro : %s Antispam: ignorovat požadavky na autorizaci : %s Antispam: zahazovat zprávy od neznámých lidí : %s Antispam: rozpoznávat roboty captchou: %s Uspořádat kontakty do skupin : %s Zeptat se pÅ™ed ukonÄením : %s PÅ™iÅ™adit PGP klíÄ… Vyžadovat autorizaci : %s Automatický stav přítomnosti Automaticky nastavit „pryÄ“ (min) : %d Automaticky nastavit „nedostupný“ (min) : %d Automaticky nastavit „nedostupný“, když se odpojí screen: %s Soubor s avatarem : %s ZpÄ›tnÄ› datovaná položka: %s Datum narození : %s CENTERIM %s, NEODESLÃNO: %lu Mobil : %s Konfigurace CenterIM Konfigurace CenterIM ZmÄ›nit barevné schéma na : %s ZmÄ›nit výchozí text žádosti o autorizaci ZmÄ›nit pÅ™ezdívku ZmÄ›na hesla : %s ZmÄ›nit zvukové zařízení na : %s Kanál : %s Diskuzní mód : %s Diskuzní mód pro : %s Výška panelu s rozhovorem : %d ÄŒetnost kontrol (minuty) : %lu Kontrolovat místní poÅ¡tu : %s Ověření hesla : %s MÄ›sto : %s Konverze kódových stránek Obarvit kontakty podle: %s Komentář Komunikace Firma : %s Seznam kontaktů ZemÄ› : %s Nálada : %s OddÄ›lení : %s Podrobný záznam IM událostí v ~/.centerim/log : %s Detaily Neformátovat automaticky: %s Neodesílat komentáře e-mailem: %s Zakázat komentáře : %s ZruÅ¡it úÄet E-Mail : %s E-mail : %s MÄ›nit pryÄ-zprávu pÅ™i zmÄ›nÄ› stavu : %s Povolit obousmÄ›rné jazyky: %s Textový editor ve stylu emacs : %s Povolit peer-to-peer komunikaci : %s Textový editor ve stylu vi : %s Povolit webový ukazatel stavu : %s Enter odesílá zprávy: %s Enter odesílá zprávy pro : %s Zábavné: Fax : %s Parametry kanálu Správce pÅ™enosu souborů Soubory Najít/pÅ™idat uživatele Najít/pÅ™idat uživatele Otisk: Jméno : %s Pro protokoly : %s Zapomenout klÃ­Ä Pohlaví : %s Obecné Skupiny HTTP prohlížeÄ : %s HTTP proxy server : %s Skrýt odpojené uživatele : %s BydliÅ¡tÄ› Domovská stránka : %s Manažer IM úÄtů Importovat seznam přátel : %s PÅ™ijímám od %s Pozvat na konferenci… PÅ™ipojit se ke kanálu PÅ™ipojit se ke kanálu/konferenci PÅ™ipojit se ke kanálu/konferenci PÅ™ipojeno od poslední kontroly Heslo ke klíÄi: %s KlíÄová slova KlíÄová slova : %s Jazyk : %s Příjmení : %s Opustit kanál Šířka levého panelu: %d Odebírat RSS zprávy Odebírat RSS posílání LiveJournalu: vlastnosti Místní sada : %s Místo Výška panelu s protokolem : %d Protokolování Login : %s Hledej pouze právÄ› pÅ™ipojené : %s Hromadný pÅ™esun skupin… Ostatní Nálada : %s Další PÅ™esunout do skupiny… Hudba : %s PÅ™ezdívka : %s Jméno/Titul Síť NickServ heslo (volitelné) : %s PÅ™ezdívka: PÅ™ezdívka : %s Nastavení OTR a otiskůPouze pÅ™ipojené Události pÅ™ipojen/odpojen v oknÄ› logu : %s OpenPGP klíÄ: %s Volby Upravit skupiny kontaktů Odesílám pro %s Heslo Heslo (volitelné) : %s Heslo : %s Heslo zmÄ›nit na : %s Telefon : %s Obrázek : %s Ping Prosím, napiÅ¡te „ano“, nebo „ne“: Rozsah portů pro peer-to-peer: %s Pozice : %s Poslat do žurnálu : %s Priorita : %s Soukromé klíÄe Protokol: Protokol: Proxy pouze pro HTTP (rss a lj) : %s VeÅ™ejné klíÄe Citovat zprávu v odpovÄ›di : %s Náhodná diskuzní skupina Náhodná diskuzní skupina : %s Registrovat Registrace v %s síti Parametry registrace PrůbÄ›h registrace RegistraÄní služba Pamatovat si heslo k ICQ : %s Vzdálená sada : %s Odstranit kanál del Vyžádat autorizaci Vyžadovat potvrzení: %s SMTP server : %s Cesta k socketu screenu : %s Parametry hledání Vyhledávací profily Vyhledávací služba ZabezpeÄený : %s ZabezpeÄení : %s Vyber PGP klÃ­Ä pro použití Zasílat podrobnosti o OS : %s Odeslat zprávu pro kanál Enter Odeslat SMS Poslat soubor(y) Poslat soubor(y) pro %s, %lu Server : %s Adresa serveru : %s Služba Nastavit pryÄ-zprávu Nastavit vnÄ›jší stav Ukazovat rozepsané rozhovory : %s Ukaž uživatele, kteří vás mají ve svém seznamu Řadit kontakty podle: %s Stát : %s Ulice : %s PÅ™edmÄ›t : %s Podle jazyku : %s Å títky : %s ÄŒasové údaje v oknÄ› logu : %s ÄŒasové údaje zahrnují sekundy : %s PGP Å¡ifrování %s UIN UIN : %s Odebrat PGP klíÄ… Aktualizovat detaily o sobÄ› Hlásit dobu zahálení pomocí X : %s Nepoužívej klÃ­Ä Uživatelské rozhraní Uživatel: Pouze uživatelé mající foto : %s Ověřeno: Prohlížet/mÄ›nit seznam ignorovaných Prohlížet/mÄ›nit seznam neviditelných Prohlížet/mÄ›nit seznam viditelných Práce URL XML exportu : %s VaÅ¡e %s detaily PSÄŒ/Zip : %s [Ctrl-X uložit, Esc zruÅ¡it] [VOLBA]… [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ síť [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM z heslo: priorita: adresa serveru: uin: uživatelské jméno: ! Opravte cestu nebo zakažte mÄ›nÄ›ní stavu podle programu screen! Cesta k socketu screenu neexistuje!! zjiÅ¡tÄ›na jiná běžící kopie centerim! nemohu se pÅ™ipojit, na disku je ménÄ› než 10 kB volného místa! na disku zbývá ménÄ› než 10 kB volného místa, odpojuji se od serverů! jinak můžeme pÅ™ijít o události a konfiguraci! podpora pro %s byla zakázána pÅ™i kompilaci! toto může působit problémy, pid %lu“ nenalezen%lu minut%s [%s] se pÅ™ipojil%s menu kontaktu, %s stav, %s různé volby, %s/%s násl./pÅ™ed. disk., %s konec%s od %s, pÅ™ijato %s%s již není operátorem na příkaz %s.%s byl(a) vyhozen(a) %s%s set stal(a) operátorem na příkaz %s.%s už není naším operátorem.%s se pÅ™ipojil(a)%s odeÅ¡el(a)%s se stal naším operátorem%s je nyní %s, byl %s%s nebo %s zavřít, Up/DOwn a PgUp/PgDn posunout%s hledat, %s znovu, %s zruÅ¡it%s odesl., %s hrom., %s/%s pÅ™/nás disk., %s hist., %s URL, %s zvÄ›tÅ¡., %s detaily%s odesl., %s hrom., %s/%s pÅ™/nás disk., %s hist., %s URL, %s zvÄ›tÅ¡., %s Älen.%s pro %s byl pÅ™idán do fronty%s pro %s, odesláno %s%s do URL, %s externí akce, %s zavÅ™eno%s pro URL, %s pÅ™es celou obrazovku, %s zavřít%s se právÄ› odpojil%s: právÄ› se odpojil%s: právÄ› se pÅ™ipojil se stavem %s(výchozí)(nic/vlastní) Autorizace : Vyžadovat autorizaci : * Kontakty : * PÅ™enos souboru* SMS : + %s byl pÅ™idán do seznamu+ CHYBA: captcha zakázána: žádná otázka nenalezena!+ Po odpojení screenu nastaveno na „nedostupný“+ [%02d:%02d:%02d] pÅ™iÅ¡la nová poÅ¡ta, %d e-mailů+ [%s] automaticky nastavuji %s+ [%s] stav obnoven+ [aim] pÅ™ipojování selhalo: %s+ [aim] heslo odesláno + [aim] nelze se pÅ™ipojit k serveru+ [gg] nemohu pÅ™eložit %s+ [gg] selhalo pÅ™ipojení+ [gg] spojení ztraceno+ [gg] selhalo spojení k serveru+ [gg] chybí pryÄ-zpráva od %s, %s+ [icq] nelze se pÅ™ipojit+ [icq] nelze získat pryÄ-zprávu od %s, %s (možná není pryÄ-zpráva vyplnÄ›na)+ [icq] odpojeno+ [icq] nelze poslat SMS pro %s + [icq] SMS pro %s, %s odmítnuta+ [irc] pÅ™ipojení selhalo: %s+ [irc] heslo pro pÅ™ezdívku odesláno+ [irc] pÅ™ezdívka byla úspěšnÄ› zmÄ›nÄ›na+ [irc] heslo odesláno+ [irc] nelze se pÅ™ipojit k serveru+ [jab] chyba %d+ [jab] chyba %d: %s+ [jab] žádná pryÄ-zpráva od %s, %s+ [jab] k serveru se nelze pÅ™ipojit+ [jab] odregistrovávám se od agenta %s+ [lj] %s byl pÅ™idán do seznamu přátel+ [lj] HTTP selhalo: %s+ [lj] nemohu pÅ™idat přítele+ [lj] chyba pÅ™i mazání přítele+ [lj] selhalo pÅ™ihlášení: %s+ [lj] chyba pÅ™i odesílání: %s+ [lj] úspěšnÄ› zasláno, id je %s+ [lj] uživatel byl odebrán z vaÅ¡eho seznamu přátel+ [lj] hledání uživatele dokonÄeno+ [msn] nemohu se pÅ™ipojit: + [msn] e-mail od %s, %s+ [msn] obrácené hledání uživatelů dokonÄeno, %d nalezen(o)+ [msn] nepÅ™eÄtených e-mailů: %d v doÅ¡lé, %d ve složkách+ [yahoo] zjiÅ¡tÄ›no duplicitní pÅ™ihlášení+ [yahoo] nelze se pÅ™ipojit: + [yahoo] nelze získat pryÄ-zprávu z %s, %s (možná není pryÄ-zpráva vyplnÄ›na)+ [yahoo] nelze se pÅ™ihlásit + [yahoo] nelze se pÅ™ihlásit: úÄet byl zablokován+ [yahoo] nelze se pÅ™ihlásit: jméno a heslo nesouhlasí + [yahoo] nelze se pÅ™ihlásit: jméno uživatele neexistuje+ [yahoo] přímé spojení selhalo+ [yahoo] e-mail od %s, %s+ [yahoo] opouÅ¡tím konferenci: %s+ [yahoo] server uzavÅ™el socket+ nemohu získat pryÄ-zprávu jsa odpojen+ poslední zpráva od %s+ spuÅ¡tÄ›n %s příkaz+ dorazila nová poÅ¡ta, %d zpráv+ žádná URL v souÄasném kontextu+ žádná akce není definována pro %s+ žádné položky historie pro %s+ konfigurace %s byla zmÄ›nÄ›na, nahrávám znovu+ uživatel je zpátky+ pro odblokování navÅ¡tiv %s+ uživatel %s je již v seznamu+ nejprve se musíte pÅ™ihlásitKolem 202. e-mailKolem 30Kolem 4050 a výš60 a víceO mnÄ›PÅ™ijmoutAktivityPÅ™idatPÅ™idat do seznamuAdresaVÄ›kVÄ›k: DubOpravdu chcete odstranit %s?Opravdu chcete odstranit skupinu?SrpAutor: Autom. interval „pryÄ“ stavu (0 – vypnout): Auto N/A interval (0 – vypnout): Automatické pÅ™ipojení do konferenceSoubor s avatarem Soubor s avatarem: ÄŒekání na autorizaciPryÄpryÄ-zpráva:ZázemíNarozen(a)Zakázat zprávy z kanáluZruÅ¡itBěžící pÅ™enos nelze odebratKategorie: MobilMobil: ZmÄ›nitZmÄ›nit stavHistorie diskuze na tomto kanáluTéma kanálu je nyní: %sKanál: Vstupní znaková sada: Výstupní znaková sada: Výška panelu s rozhovorem: ZkontrolovatÄŒetnost kontrol: Ověření hesla: Ověření hesla: Vybraná cesta k socketu screenu neexistuje!MÄ›sto: KomentářKomentář: FirmaFirma: PÅ™ipojuji se k serveru %s…PÅ™idat kontaktÄŒleny souÄasné konference jsou: SouÄasná nálada: PrávÄ› hraje: Zpráva pÅ™i zmÄ›nÄ› stavu:NeruÅ¡itProVýchozí server pro jabber-konferenceVýchozí text žádosti o autorizaci: OddÄ›leníOddÄ›lení: Popis: DetailyDetekovat hudbuOdpojenoNeruÅ¡itChcete vybraný klÃ­Ä zapomenout?Chcete vybraný klÃ­Ä ověřit?HotovoNejdřív zahoÄte informace o úÄtu!E-Mail: E-mailE-mail: ZmÄ›nitUpravit detailyPrázdná zpráva požadavku na autorizaciKódováníZaÅ¡ifrovánoVložte datum narození (DD-MM-RRRR): ChybaChyba pÅ™i výpoÄtu otiskuHistorie událostíPříjemci událostiVolby pro odesílací události:Externí akce…SelhaloFaxFax: ÚnoŽenaUložit zprávu pro nepřítomnostZískat informace o verziStahuji vaÅ¡e ICQ detailyStav pÅ™enosu souboruHotovoJméno: Vynutit kontroluChci si povídatFrekvencePřítelPlný názevPÅ™eposlatHryPohlavíObecnéObecné povídáníObecné volby:NÄ›mecky UTF-8PokraÄovatDo kontaktů…Používat HTTP prohlížeÄ: HTTP proxy server: NázevSkrýt odpojené uživateleHistorie pro %s, celkem %d událost(í)BydliÅ¡tÄ›Domácí stránkaDomovská stránka: SkuteÄnÄ› se mi líbí výchozí pryÄ-zpráva pro protokol %s programu %s %s.SkuteÄnÄ› se mi líbí výchozí AIM-profil programu centerim %s. Ignorovat vÅ¡echny události od %s?Seznam ignorovanýchIgnorovat uživatelePÅ™ijímám %s od %sInfoInformace o %sZájmyNeviditelnýSeznam neviditelnýchPozvat do konference…LedPÅ™ipojit/VytvoÅ™itÄŒecÄŒenKlíÄová slova: Vyhozen %s; důvod: %sLJJazykyPoslední IPNaposled kontrolovánPříjmení: Poslední výsledekNaposledŠířka levého panelu: URLOdkaz: Seznam pÅ™ezdívekNahrátMístoVýška panelu s protokolemMužBÅ™eHromadnÄ› pÅ™esunout vybrané uživatele do…KvÄ›ZprávaZpráva ze serveru: Číslo mobilu: DalšíDo kontaktůNedostupnýJménoVytvoÅ™it skupinu se jménem: Jméno/Titul: JménoNikdyDostal jsem nové UIN: %luNové jméno skupiny: Ukazovat pod pÅ™ezdívkou: Nové heslo: Jméno nového profilu: Nové hledáníDalšíPříští kontrolaPÅ™ezdívkaNastavit pÅ™ezdívku: PÅ™ezdívka: NeNení zaÅ¡ifrovánoNení JabberChybí OTRNicNejsem k zastiženíNeuvedenoLisNyníMám práciŘíjOdpojenýOkStarý e-mailNa kanálech: PÅ™ipojenýOtevřítUspořádat skupiny kontaktůNa obÄ›dÄ›Odesílám %sOdesílám %s pro %sChyba pÅ™i PGP Å¡ifrování: heslo pro PGP klíÄ: Hledání PGP klíÄe: nÄ›co napiÅ¡te, %s hledá znovu, Enter ukonÄíVýbÄ›r PGP klíÄe: %s pro rychlé vyhledáníHeslo pro PGP vyžadováno: Chyba pÅ™i PGP podepisování: OdpovÄ›Ä na PING od uživatele: %d sekund(a)Heslo musí být alespoň 6 znaků dlouhéMusí být zadáno hesloHeslo: Hesla se neshodujíPeer-to-peer porty (min-max): TelefonTelefon: ObyÄejný textProsím, pÅ™ipoj se do mé konferencePolskyPozice: PoslatZasílající pÅ™edmÄ›t: PÅ™edchozíZveÅ™ejnÄ›no: Hledání: nÄ›co napiÅ¡te, %s hledá znovu, Enter ukonÄíRSS URLPovídání si s náhodným uživatelemPÅ™ijato %sZamítnoutOdebratOdebrat také %s ze seznamu kontaktů?Odebrat také %d kontakt(y) ze seznamu kontaktů?Odebrat uživatelePÅ™ejmenovatPÅ™ejmenovat kontaktOdpovÄ›dÄ›tChyby hlaste na http://bugzilla.centerim.org/.Výsledky externí akce %s:StáhnoutStáhnoutZkouším to znovu…RomantickéRuskySMSjméno SMTP serveru: Cesta k socketu programu screen: Výsledky hledání [hotovo]Nové hledáníProhledávání kontaktů…Hledám mužeHledám ženuVybratVyberte skupinu, do které má být uživatel pÅ™idánVyberte skupinu, do které má být uživatel pÅ™esunutVyberte kontakty, které chcete pÅ™idat do seznamuVyberte kontakty, které chcete pÅ™esunoutPoslatPoslat zprávuOdeslat URLOdeslat kontaktyPosílám kontakty…Vysílám žádostOdesláno %sZářKontakt ze serveruServer: Ukázat odpojené uživateleStát: Stavu a aktivityStavu a jménaUlice: StudentiÅ títky pro položku: Jabber ID bylo úspěšnÄ› zaregistrovánoNásledující uživatelé vás vedou jako svého přítele:Profil tohoto jména již existuje. Chcete jej pÅ™epsat?Vzdálená strana používá: %sZadaný adresář neexistujeDo zadaného adresáře nelze zapisovatUživatel %s (%s) si Vás pÅ™idal(a) do seznamu kontaktů Adresa journalu: %sUživatel %s odmítl pozvání k pÅ™ipojení se do konferenceUživatel %s vás pozval do konference %s, jejíž téma je: %sUživatel %s se pÅ™ipojil do konferenceUživatel %s opustil konferenciUživatel %s Vás odebral(a) ze seznamu kontaktů Adresa journalu: %sUživatel má dnes narozeninysi Vás pÅ™idal(a) do seznamu kontaktůsi Vás pÅ™idal(a) do seznamu kontaktůUživatel si zmÄ›nil svoji pÅ™ezdívku z %s na %sUživatel nemá žádné informace v profilu.Žádost o autorizaci od %luUživatel si vás smazal ze svého seznamu kontaktů (unsubscribed you, Å™eÄeno jazykem Jabberu)Uživatel si tÄ› chce pÅ™idat do svého seznamu kontaktůToto je tvůj LiveJournal úÄet. Použij hoDoÅ¡el Äas pÅ™i Äekání na nové UIN. Mám to zkusit znovu?ÄŒas. pásmoTitulTitul: Pokouším se zaregistrovat %s na %s…UIN: URLURL: URL v souÄasném kontextuPovolit zprávy z kanálu+ nelze se pÅ™ipojitNemohu se pÅ™ipojit k ICQ serveru. Znovu?NeznámýPÅ™estat ignorovat uživateleNeověřenoPoužití: Informace o uživateliDetaily uživateleOvěřenoVerzeSeznam viditelnýchChvíli poÄkejte. JeÅ¡tÄ› jsem nestáhl VaÅ¡e ICQ detaily.VarováníPráceChybné Jabber ID!Zadán chybný JID, nelze se zaregistrovatAnoNejprve se musíte odpojit od serveru!Pro aktualizaci údajů musíš být pÅ™ihlášen do Gadu-Gadu sítÄ›Pro aktualizaci údajů musíš být pÅ™ihlášen v ICQ sítiPro aktualizaci údajů musíš být pÅ™ihlášen do Jabber sítÄ›Pro aktualizaci pÅ™ezdívky musíš být pÅ™ihlášen do MSN sítÄ›VaÅ¡e ICQ detaily bylo staženyPSÄŒ/ZipPSÄŒ/Zip: [OTR] Spojení není zabezpeÄené…[OTR] Spojení je nyní zabezpeÄené…[OTR] UkonÄuji zabezpeÄenou relaci s „[OTR] Chyba pÅ™i Å¡ifrování zprávy, zpráva neodeslána![OTR] Chyba: V souÄasnosti je podporován jen jabber[OTR] Chyba: inject_message_cb, příjemce „[OTR] Protokol: [OTR] PÅ™ijat neznámý otisk z „[OTR] Pokouším se ustanovit zabezpeÄenou relaci s „zruÅ¡pÅ™idávám %s do seznamu kontaktůaim: selhalo spojenípodle požadavkůautorizacePryÄpryÄ-zprávachybné heslochybné jméno uživatelemodréZruÅ¡itVyÄistitnemohu se pÅ™ipojit%s zmÄ›nil status z %s na %skomentář: pÅ™ipojuji se k serverurychlé hledání v seznamu kontaktůkontaktynelze vytvoÅ™it socketnelze pÅ™eložit jméno poÄítaÄenemohu stáhnouttmavédnůAdresář, kam uložit soubor(y): vypnoutOdpojenonemÄ›nithotovozjiÅ¡tÄ›no dvojí pÅ™ihlášeníe-mailchybaudálostudálost od %s (%s)chyba pÅ™i odesílání: chyba pÅ™i vytváření adresáře pro kontaktychyba pÅ™i odesílání: málo parametrůchyba pÅ™i odesílání: v icq protokolu jsou povolena pouze UINchyba pÅ™i odesílání: neznámý typ IMchyba pÅ™i odesílání: neznámý typ událostizaznamenávání událostí zahájenoprovedena externí akce %s, návratový kód = %dprovedena externí ruÄní akce %s, návratový kód = %djméno souboru: jméno souboru: souborynaÅ¡elpouze pro přáteleceloobrazovkový pohledhodin+ důvod odpojení od icqignorovánopÅ™ijímám %s od %schybné heslo pro PGPinicializaceOdebíratNahrátpÅ™ihlášen(a)stahování seznamu Älenů dokonÄeno, %d nalezen(i)zprávaminrežim 1režim 2DolůNahorun/anová příjemná MSN pÅ™ezdívka: nežádná znaÄka nebo nebyla nalezenažádná znaÄka nebo nebyla nalezenažádnýnenaÅ¡elnepoužívánoupozornÄ›níodesílám %s pro %sheslo bylo úspěšnÄ› zmÄ›nÄ›noheslo: rychlé hledání pgp klíÄevýbÄ›r pgp klíÄeposlat nové položky do svého journalu.soukromýprotokoluveÅ™ejný (viditelný vÅ¡em)Odebratdůvod: %sregistrace není podporovánaodstraňuji %s ze seznamu kontaktůUložithledání dokonÄeno, %d nalezenhledat pro: sekundnastavil(a) %sproblémy se socketemzvuková kartaPC speakerzaÄátekstavuchyba pÅ™i zmÄ›nÄ› stavu: v pořádkuzpráva byla: mnoho opakovaných pÅ™ihlášeníneznámýneznámý typ IMbyl zadán neznámý znak pro stavpoužívánoInformace o uživatele %sjméno a heslo nesouhlasízkontrolujte jméno poÄítaÄe a portzkontroluj zadané doménové jméno a port pagerupracujichybná znaÄka nebo chybné XMLanoano/nety jsi tady operátorcenterim-4.22.10/po/sv.gmo0000644000175000001440000011131211473011460012151 00000000000000Þ•? $0K06]01”0-Æ08ô0G-1=u1H³1 ü1 2222F2*f2‘2 ™2 ¥2°2Á2Ð26è2#3C3*a3)Œ3¶3Í3Þ3ô34$4;4Y4h4ƒ4!¡4Ã4â4 ü4 55#525A5P5c50u5 ¦5°5)Ï5ù56 6 '6)56-_6+6)¹6"ã67!%7 G7 U7`7r7Š7’7¥7µ7 Ç7 Õ7ß7è788"828G8Z8 r8€8"™8"¼8 ß8ê8ú8 99,9!?9 a9 l9 v9ƒ9 “9Ÿ9¦9 ·9 Ä9 Ð9 Ý9 ç9ò9 :.: ?:I:b: s:~:™:©: À:Í:Ü:)â: ;;3;S;g; €;‹;¨;Â;Ú;ñ; <+<B<U<i<{<Œ<›<«< Ë< Ø<æ< == #=-='@= h=u=‹=#š=¾= Ä=Ï=å=ö= >'>?>F>\>n>~>š>©> ¼> Ç>Õ>ç> û> ? ??,? 3?+@?2l?1Ÿ?0Ñ?+@".@ Q@]@x@“@¬@¿@ Î@Ú@"ë@A#A3ADA dA nA|AA ªA¸AÈAÑA0ñA"B>BUBpB'†B®BÃBÜBùB)C>C'TC|C#‘C'µC'ÝCD$D;DVDsD‹D'¡D6ÉDEE07E1hE šE»E4ÖE6 F"BFeF#‚F*¦FÑF äF$G$*GOG,iG–G©G ÂGãG H H H &H3H;H DHNHTH[H_HgHkHqHuH&•H¼HÀH ÉHêH I%I *I 8I CIMI1TI †I‘IšI«I²I ËIÕIÛIíI J'J.J 6JAJ IJSJsJ ‚J£J²JÆJÝJáJ åJ K K K,K 4K AKNK#SKwK€K‡KK#•K¹KÂKáKòK LLLLL&LXHX PX4]X’X%—X)½X;çX?#YAcY¥YÄY ÍYØYÞY ôY ZZ Z !Z .Z;Z@ZGZMZ#\Z €ZŠZ“Z«ZÆZ"ËZîZ öZ[[[*[<>[${[' [È[-Û[4 \ >\ J\U\[\t\|\\•\š\Ÿ\§\®\ µ\¿\Ç\Ë\ã\æ\ ë\ø\ ]!]7]O] V]a]] „] ‘]›] «]¶]¾]Ä]Ú]â]ô]ý]" ^0^O^&l^“^ ˜^¢^¦^²¹^Ol`*¼`;ç`,#a8PaM‰aE×aPbnb}bb¡b&³b5Úbc c c-cAcQc<ac&žcÅc:àc?d[dvd‰dd»dÍdåd ee,e Le"mee­e ½eÉeÙeée øeff3(f \f!gf4‰f¾f!Þf g g9g+Vg.‚g*±g#Üg)h-*hXh hhshŒh¥h­hÊhæh öh i ii$0iUi[iji}i“i ¬iºi!Òi!ôi j "j0j AjOjcjxj •jŸj¨j ½j ÈjÖjÜj ôj k k k %k0k@k0Rk ƒkk«k ¿kËkçkøkl l*l#0l Tlal"|lŸl¸l Öl"ãlmm4mKmbm‚m‘m¤mµm ÄmÒmámòmn"n2n Pn ^n lnvn/Œn¼nËnÝn$ìno o"o9oPoko‚o˜o¡o¹oÌoÛoøop p (p6pHp \pjp op|pp”p-¥pAÓp:q9Pq/Šq&ºq áqíq r#r:r Pr\rkrrœr·rÇrâr ýr s s s 8sFsXsas,s®sÊs$ås t'$tLt&at"ˆt$«tÐtít'u/u:Bu'}u(¥u$Îuóu,v"=v"`vƒv(žv9Çvww8;w1tw(¦wÏw:îwF)x,pxx »x=Üxy7y$Qy,vy$£y-Èyöy"z'4z\z vz„z •z £z±z ¹zÆz×z Úz äzïzözýz{) {.4{c{ g{#u{%™{$¿{ä{ê{ÿ{ ||.| J| U|b|q|x|’|š|Ÿ|¯|È| â| í| ÷|} }}5}-H}v}‡}˜}«}¯}³} Ò} Ü} è}ö}ÿ} ~~"~A~J~Q~Z~b~y~~¡~µ~ Ï~Ü~à~æ~ê~ñ~ &1H Q[orw| „‘«°Ä&Ìó÷ ÿB €;L€"ˆ€ «€¹€ЀÕ€ ç€ñ€ù€ ! %26 :Fcf mx ‰• ¥²¸ÀÆÎÒÖ Úå ‚‚‚#‚5‚:‚ W‚d‚k‚r‚‰‚¢‚²‚ ҂Þ‚ å‚ñ‚ ú‚ ƒƒ ƒ$ƒ'ƒ0ƒ 4ƒ@ƒ Cƒ Qƒ_ƒhƒoƒ‰ƒ*žƒɃ æƒòƒ$ „1„ 9„#C„g„o„v„‡„Ž„Ÿ„±„ ̈́لà„-è„5…L…S…(Y… ‚……”…¦…¯… ³…Á…Õ…å…ø… †!†,'†'T†%|†¢†¨†º† ΆÛ†߆ è† ò† ÿ† ‡-$‡?R‡’‡ ±‡'Ò‡Fú‡AAˆDƒˆ'Ȉ#ðˆ ‰.5‰0d‰6•‰'̉<ô‰D1ŠHvŠ2¿Š6òŠ)‹1‹7‹'?‹g‹m‹q‹w‹•‹ ¨‹¶‹¿‹Ç‹+Ö‹Œ% Œ(/ŒOXŒR¨ŒOûŒKf nx œ¨¯µÉÝõ úŽ Ž# Ž DŽ PŽZŽ uŽ–Ž#œŽ ÀŽ ÊŽÖŽÛŽâŽ'æŽ5D\{/7À ø   )3JS\ epx€‡Ž ½Á ÇÒ ç$ó‘ 2‘ =‘K‘d‘ m‘ z‘‡‘–‘ Ÿ‘ª‘±‘ȑё ã‘ ’$’'7’ _’ €’¡’ ¨’µ’¸’0§ š*MYEê9.#g¨T9cà  •R™ãævÍ<´Àè¦á²=Õ ¤/ªˆ$«°¼2Ò ËÝz¾€ñuÛ/ÃMe6ä âûm”7…×/½|Ì¢>g¢&œ©;ÌHî¿5WU”+JQ3ßÚÿ<ú·üƒßó±ö-12µÆ†ëÜKí÷Û¾¯@ÓÅL¥{É[C b¡k×]Ý aÐ)R‡yÙ"®Cí£ÏfŽ%n7H÷;³ï\ÈZx(ã¬xNø’‹»!'4áˆ%Fþ¹b–  ÐuðÁ)Óq¶`û0ò}žp( *>šW¡º+ «U ~"&†^@‹d1ý:œØÏÀY.Á™>}‡y£ ®cw!q:Ç 5ƒöFù›o·L6ÎÞŸo?E¸Š¤½é벯ÕÖìù|’Z©åj=1±ev5KO~Þ^ð.óè'\§þ4t2εÙSÉ'8—,È…ªzü_ýŽçAÜBaÚ6X˜¿NË¥&AÔõ iV0¼O?[!DhôÂ3sGj7ÑÄÅ­Šï:Âõ3#$â´"m,Qî`Ñ ?dô›‘„€à°8r{¬s#r¦Òt»øŸ ͳ‰i–8•-Ê(k¨ºØòSlP$‘„‰)“,n¹Ô‚Ph]I%­ÊT9êp;¶<‚I+Ä=Ç“æ_*DäŒàçBñw4l Ƙ— éåVÿ¸žìŒXJf-ÖGú --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --help display this stuff --version, -v show the program version info -n, --number mobile number to send an event to (sms only) -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Accounts.. Age : %s Age range : %s All protocols Already logged in only Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Backdated entry : %s Birthdate : %s Cellular phone : %s Change color scheme to : %s Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users First name : %s Gender : %s General Groups HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Joined since the last check only Keywords Language : %s Last name : %s Leave channel Link an RSS feed Link an RSS feed LiveJournal posting: attributes Location Logging Login : %s Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network Nickname Nickname : %s Online only Online/offline events in the log window : %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remove channel del Request authorization SMTP server : %s Search parameters Search profiles Search service Secured : %s Security : %s Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Show users who have you on their list State : %s Street address : %s Subject : %s Timestamps in the log window : %s UIN UIN : %s Update user details User interface View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM of password: server address: uin: user name: ! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu%lu minutes%s from %s, received on %s%s has been deopped by %s.%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s to %s has been put to the queue%s to %s, sent on %s%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChannel topic now is: %sChannel: CheckCheck frequency: Check the new password: Check the password you entered: City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DNDDecDefault Jabber conference serverDepartmentDepartment: Description: DetailsDetect musicDisconnectedDoneDrop the account information first!E-Mail: E-mailE-mail: EditEmpty authorization request messageEncodingEnter birthdate (DD-MM-YYYY): Event recipientsEvents sending options:FailedFaxFax: FebFemaleFetching your detailsFile transfer statusFinishedFirst name: Free for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadHTTP proxy server hostname: HandleHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLinkLink: LoadLocationMaleMarMayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: Not specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %s to %sPING reply from the user: %d second(s)Password must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: Please join my conference.Position: PostPosting subject: PrevPublished on: RSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?RenameReplyResult of the external action %s:RetreiveRetrieveRetrying..RomanceSMSSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSendSend contacts..Sending requestSent on %sSepServer: State: Street address: StudentsThe Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesThis is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnable to connectUsage: User infoVersionVisible listWait a moment. Your details haven't been fetched yetWorkWrong nickname given, cannot registerYou have to disconnect the service first!You must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: abortaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: contactscould not create socketcould not resolve hostnamedarkdirectory to save the file(s) to: disabledon't changedonee-mailerrevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesicq disconnection reasonignoredincoming %s from %sinitlInklOadmessagemode 1mode 2move Downmove Upn/anew MSN friendly nick: nononenotificationoutgoing %s to %spassword: post new entries to your journal.public (visible to all)rEmovereason: %sregistration is not supportedsAvesearch for: set by %ssocket problemssound cardspeakerstartstatus change error: successthe message was: turboingunknown IM typeunknown status character was givenusername and password mismatchverify the hostname and portverify the pager host and port enteredworkwrong XMLyesyou are an op hereProject-Id-Version: centerim 4.9.8 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2002-10-25 20:27+0200 Last-Translator: Mattias Webjörn Eriksson Language-Team: swedish Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --ascii, -a använd ASCII tecken för fönster och UI kontroller --basedir, -b ange baskatalog --bind, -B Skapa socket för lokal ipadress --help visa denna hjälp --version, -v visa visa versionsinformation -n, --number mobilnummer att skicka händelse till (endast sms) -s, --send händelsetyp; kan vara msg, sms eller url -t, --to destinations UIN eller smeknamn (beror pÃ¥ protokoll) %s: detaljer 1:a sprÃ¥k : %s 2:a sprÃ¥k : %s 3:e sprÃ¥k : %s bekräfta, avbryt eller bekräfta, avbryt Om Konton.. Ã…lder : %s Ã…ldersgrupp : %s Alla protokoll Redan inloggad Anti-spam: Släng medd. frÃ¥n icke listade användare : %s Arrangera kontakterna i grupper : %s Obligatorisk attest : %s Sätt frÃ¥nvarande automatiskt efter viss tid (min) : %d Sätt icke tillgänglig automatiskt efter viss tid (min) : %d Antedatera notering : %s Födelsedag : %s Mobiltelefon : %s Ändra färgschema till: %s Ändra smeknamn Ändra lösenord : %s Ändra ljudenhet till : %s Kanal : %s Chat meddelande läge : %s Chatmeddelandeläge för : %s Kolla frekvens (minuter) : %lu Kolla den lokala brevlÃ¥dan : %s Bekräfta lösenordet : %s Stad/Ort : %s Kommentar Kommunikation Företag : %s Kontaktlista Land : %s Eget humör : %s Avdelning : %s Detaljerad IM händelselog i ~/.centerim/log : %s Detaljer Inaktivera autoformatering : %s Inaktivera sändning av kommentarer via epost : %s TillÃ¥t inte kommentarer : %s Ta bort nuvarande inställningar E-post : %s E-post : %s Editera frÃ¥nvarumeddelande vid statusförändring : %s Aktivera bidirektionellt sprÃ¥kstöd : %s Aktivera emacs bindningar i texteditorn : %s Aktivera peer-to-peer kommunikation : %s Aktivera webstatus indikator : %s Retur tangenten skickar meddelande : %s Retur tangenten skickar meddelande för : %s Fiffiga saker Fax : %s Ange (Feed) Parametrar Filöverföringsmonitor Filer Sök/lägg till användare Sök/lägg till användare Förnamn : %s Kön : %s Allmänt Grupper HTTP proxy server : %s Göm icke anslutna användare : %s Hem Hemsida : %s IM kontohanterare Inkommande frÃ¥n %s Inbjud till konferens.. Anslut kanal Anslut kanal/konferens Anslut/skapa en kanal/konferens Ansluten sedan den sista kollen Nyckelord SprÃ¥k : %s Efternamn : %s Lämna kanal Länka en RSS feed Länka en RSS feed LiveJournal post: attribut Hemvist Loggar Användarnamn : %s Allmänt Humör : %s Mer Flytta till en grupp.. Musik : %s Namn : %s Namn/Titel Nätverk Smeknamn Smeknamn : %s Endast anslutna Online/offline händelser i loggfönstret : %s Alternativ Organisera kontaktgrupper UtgÃ¥ende till %s Lösenord Lösenord (valfritt) : %s Lösenord : %s Ändra lösenord : %s Telefon : %s Bild : %s Ping Portnummer för peer-to-peer : %s Titel : %s AnslÃ¥ till journal : %s Citera meddelanden vid svar : %s Slumpmässig chatgrupp Slumpmässig chatgrupp : %s Registrera Registrera dig pÃ¥ %s nätverket Registrering pÃ¥gÃ¥r Registrering pÃ¥gÃ¥r Registreringstjänst Spara lösenord : %s Ta bort kanalen del Begär attest SMTP server : %s Sökparametrar Sökprofiler Söktjänst Säkrad : %s Säkerhet : %s Skicka ett kanal medd. enter Skicka ett SMS Skicka fil(er) Skicka fil(er) till %s, %lu Server : %s Server : %s Tjänst FrÃ¥nvarumeddelande Visa de användare, som har dig pÃ¥ sin lista Delstat : %s Gatuadress : %s Ärende : %s Tidsstämplar i loggfönstret : %s UIN UIN : %s Uppdatera detaljerna Användargränssnitt Läs/editera svartlistade Läs/editera osynliga Läs/editera synliga Arbete XML exportera URL: %s Dina %s detaljer Zip kod : %s [Ctrl-X spara, Esc avbryt] [aim] AOL TOC [icq] ICQ nätverket [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM av lösenord: server adress: uin: användarnamn: ! en annan instans av centerim har upptäckts! kunde inte ansluta, det finns mindre än 10k ledigt diskutrymme! det finns mindre än 10k ledigt diskutrymme, kopplar ned! annars kan händelser och inställningar gÃ¥ förlorade! stöd för %s avaktiverades vid kompileringen! detta kan innebära problem. pid %lu%lu minuter%s frÃ¥n %s, mottaget den %s%s blev 'avoppad' av %s.%s blev 'oppad' av %s.%s har 'avoppad' oss.%s anslöt.%s har lämnat%s har 'oppat' oss.%s till %s lades till i kön%s till %s, skickat den %s%s kopplade ned%s: kopplade ned (offline)%s: anslöt, med status %s(standard)(ingen/egen* Attest : * Attest förfrÃ¥gan : Kontakter : * Filöverföring* SMS : + %s lades till i kontaktlistan+ [%02d:%02d:%02d] ny e-post, %d meddelanden+ [%s] satte automatiskt %s+ [%s] status Ã¥terställd+ [aim] uppkoppling misslyckades: %s+ [aim] lösenord skickat+ [aim] kunde inte ansluta till servern+ [icq] frÃ¥nkopplad+ [icq] misslyckades att SMS:a till %s+ [icq] misslyckat SMS till %s, %s+ [irc] uppkoppling misslyckades: %s+ [irc] smeknamnet ändrades+ [irc] lösenord skickat+ [irc] kunde inte ansluta till servern+ [jab] fel %d: %s+ [jab] kunde inte hämta frÃ¥nvarumeddelande frÃ¥n %s, %s+ [jab] kunde inte ansluta till servern+ [jab] avregistrerades frÃ¥n %s agenten+ [lj] %s lades till i kontaktlistan+ [lj] HTTP misslyckades: %s+ [lj] misslyckades med att lägga till vän+ [lj] fel vid borttagning av vän+ [lj] inloggning misslyckades: %s+ [lj] ett fel uppstod: %s+ [lj] lyckades att anslÃ¥, id:et är %s+ [lj] användaren har tagits bort frÃ¥n din kontaktlista+ [lj] användarsökning klar+ [msn] e-post frÃ¥n %s, %s+ [msn] klar med att reversera användarlistan, %d funna+ [msn] oläst e-post: %d i inkorgen, %d i mappar+ [yahoo] upptäckte en annan inloggning+ [yahoo] kunde inte ansluta: + [yahoo] kunde inte logga in: kontot har blivit blockerat+ [yahoo] kunde inte logga in: felaktigt användarnamn eller lösenord+ [yahoo] misslyckades med direkt anslutning+ [yahoo] e-post frÃ¥n %s, %s+ [yahoo] lämnar konferensen %s+ Du mÃ¥ste vara ansluten för att hämta frÃ¥nvarumeddelande+ sista meddelandet frÃ¥n %s+ exekverade %s kommandot+ inga URL:er inom gällande kontext+ inga externa Ã¥tgärder definerade för %s+ inga tidigare meddelanden frÃ¥n %s+ %s konfigurationen ändrades och lästes in+ användaren är tillbaka+ för att Ã¥teraktivera besök %s+ användaren %s finns redan pÃ¥ listan+ du mÃ¥ste vara inloggad20 nÃ¥gontingSekundär e-post30 NÃ¥gonting40 NÃ¥gonting50 Plus60-och-överOmAccepteraLägg tillAdressÃ…lderÃ…lder: aprÄr du säker pÃ¥ att du vill ta bort %s?Är du säker pÃ¥ att du vill ta bort gruppen?augFörfattare: Automatisk frÃ¥nvaroperiod (0 - ): Automatisk icke tillgänglig (0 - ): Anslöt automatiskt till konfernesenIvägFrÃ¥nvarumeddelande:BakgrundFödelsedagAvbrytKan inte ta bort en pÃ¥gÃ¥ende överföring nuKategori: MobiltelefonMobiltelefon: ÄndraKanalens ämne är nu: %sKanal: KollKolla frekves: Bekräfta lösenordet : Kontrollera lösenordet: Stad/ort: KommentarKommentarer: FöretagFöretag: Ansluter till server %s ...Lägg till kontaktJust nu har konferensen följande medlemmar: Humör just nu: Spelar just nu: Status meddelande:DNDdecStandard JabberkonferensserverAvdelningAvdelning: Beskrivning: DetaljerUpptäck musikNedkoppladKlarTa bort kontoinformationen först!E-post: E-postE-post: EditeraTom attest förfrÃ¥ganKodningAnge födelsedag (DD-MM-YYYY): Händelse mottagareHändelse inställningar:MisslyckadesFaxFax: febKvinnaHämta dina detaljerFilöverföringsstatusAvslutadFörnamn: Tillgänglig för chatFrekvensVän tillFullständigt namn:VBSpelKönAllmänAllmän ChatAllmänna inställningar:KörHTTP proxy server: HandtagHistoria för %s, %d händelser totaltHemHemsidaHemsida: Jag gillar verkligen %s:s standard frÃ¥nvarumeddelande för %s %s.Jag gillar verkligen standard AIM profilen hos centerim %s.Ignorera alla händelser frÃ¥n %s?Svarta listanInkommande %s frÃ¥n %sInfoInformation om %sIntressenOsynligOsynliga listanInbjud till konferens..janAnslut/SkapajuljunNyckelord: Sparkad av %s; anledning: %sLJSprÃ¥kSenaste IPSenaste kontrollEfternamn: Senast resultatSÃ¥gs senastLänkLänk: LaddaHemvistManmarmajMeddelandeMeddelande frÃ¥n servern: Mobilnummer: MerLägg t. kontaktIcke tillgängligNamnSkapa en ny grupp med namn: Namn/Titel: Namn: AldrigNytt UIN mottaget, %luNytt namn för gruppen: Nytt smeknamn: Nytt lösenord: Nytt filnamn: Ny sökningNästaNästa kollSmeknamnSmeknamn: Smeknamn: Ej specificeradnovNuUpptagenoktEj anslutenOkGammal e-postPÃ¥ kanaler: AnslutenÖppnaOrganisera kontaktgrupperUtgÃ¥ende %s till %sPING svat frÃ¥n användaren: %d sekund(er)Du mÃ¥ste ange ett lösenordLösenord: Lösenorden är inte likaPeer-to-peer port nummer (min-max): TelefonTelefon: Snälla, anslut till min konferens.Titel: SkickaAnslÃ¥ ärende: FöregPublicerad pÃ¥: RSS dokumentationSlumpmässig chatanvändareMottaget %sAvslÃ¥Ta bortSkall %s tas bort frÃ¥n kontaktlistan ocksÃ¥?Skall de %d kontakterna tas bort frÃ¥n listan ocksÃ¥?ÄndraSvaraResultat för den externa Ã¥tgärden %s:Ã…terkallaHämtaFörsöker igen..RomantikSMSSMTP server: Sökresultat [klar]Sök/Lägg tillSöker kontakter..Letar efter en manLetar efter en kvinnaVäljVälj en grupp att lägga till en användareVälj grupp att flytta användaren tillVälj kontakter att lägga till listaSändSänd kontakter..Skickar förfrÃ¥ganSänt pÃ¥ %ssepServer: Delstat: Gatuadress: StudenterJabber ID:et registreradesFöljande användare har dig listad som vän:En profil med detta namn finns redan. Vill du skriva över den?Fjärranvändaren använder %sDen angivna katalogen finns inteDen angivna katalogen är inte skrivbarAnvändaren %s (%s) lade till dig i sin kontaktlista Journaladress: %sAnvändaren %s avböjde din inbjudan att ansluta till konferensenAnvändaren %s bjöd in dig till konferensen %s, ämnet där är: %sAnvändaren %s anslöt till konferensenAnvändaren %s lämnade konferensenAnvändaren har födelsedag idagAnvändaren accepterade din attest förfrÃ¥ganAnvändaren har lagt till dig i sin kontaktlistaAnvändaren har ändrat sitt smeknamn frÃ¥n %s till %sAnvändaren har ingen profilinformationAnvändaren avslog din attest förfrÃ¥gan; meddelandet var: Användaren tog bort dig frÃ¥n sin kontaktlista (med JabbersprÃ¥ket)Användaren vill prenumerera pÃ¥ uppdateringar om din nätverks närvaroDetta är ditt LiveJournal konto. Använd det förÃ…tgärden tog för lÃ¥ng tid. Vill du försöka igen?TidszonTitelTitel: Försöker att registrera %s vid %s ...UIN: URLURL: URL:er inom gällande kontextKunde inte anslutaAnvändning: Anv.infoVersionSynliga listanVänta. Dina detaljer har inte hämtats änArbeteFelaktigt smeknamn, kan inte registraDu mÃ¥ste koppla frÃ¥n tjänsten först!Du mÃ¥ste vara ansluten till ICQ nätverket för att kunna uppdatera detaljernaDu mÃ¥ste vara ansluten till Jabber nätverket för att kunna uppdatera detaljernaDu mÃ¥ste vara ansluten till MSN nätverket för att kunna uppdatera smeknamnetDina detaljer har hämtatsZip kodZip kod: avbrytaim uppkoppling misslyckadessom begärtattestivägfrÃ¥nvarumeddelandefelaktigt lösenordfelaktigt användarnamnblÃ¥Avbryt(A)Rensa(L)kunde inte anslutaändrade %s status till %s frÃ¥n %skommentar: kontakterkunde inte skapa en socketmisslyckades med namnuppslagningmörkkatalog att spara filen/filerna i: stäng avändra inteklare-postfelsändfel: otillräckligt med parametrarsändfel: bara UIN:er är tillÃ¥tna i icq protokolletsändfel: okänd IM typsändfel: okänd händelse typhändelselog startadexekverade extern Ã¥tgärd %s, returvärde = %dexekverade extern manuell Ã¥tgärd %s, returvärde = %dfilnamn: filnamn: filericq frÃ¥nkopplad p.g.aignoreradinkommande %s frÃ¥n %sinitieralänk(I)Ladda(O)meddelandeläge 1läge 2Ned(D)Upp(U)icke tillgänglignytt vänligt MSN smeknamn: nejingenmeddelandeutgÃ¥ende %s till %slösenord: anslÃ¥ nya noteringar i din journal.publik (synbar för alla)Ta bort(E)anledning: %sregistrering stöds inteSpara(A)sök efter: sattes av %ssocket problemljudkorthögtalarestartafel, status ändring: lyckadesmeddelandet var: turbo, loggade in/ut för snabbtokänd IM typDet angivna statustecknet är okäntfelaktigt användarnamn eller lösenordverifiera angiven värd och portverifiera angiven värd och portarbetefelaktig XMLjadu är en op härcenterim-4.22.10/po/nl.gmo0000644000175000001440000011747311473011460012150 00000000000000Þ•d<5\&03613-h38–3GÏ3=4HU4 ž4¬4À4Ô4è4*535 ;5 G5R5c5'r56š5#Ñ5õ5*6)>6h6y66­6¿6Ö6ô677!<7^7}7 —7 £7­7¾7Í7Ü7ë7þ708 A8)K8u8Ž8 •8 £8)±8-Û8) 9"39 V9a9y99”9¤9¶9 Ê9 Ø9â9ë9::%:5:J:d:w: ::"¶: Ù:ä:ô:;;$;6; I; T;a;}; ;™; ; ±; ¾; Ê; ×; á;ì; ü;. < 9<C<\< m<x<“<£< º<Ç<Ö<)Ü<==&=F=Z= s=~=›=µ=Í=ä=þ=>5>L>_>s>…>–>¥>µ> Õ> â>ð> ?? -?7?'J? r??•?#¤?È? Î?Ù?ï?@@5@O@g@n@„@–@¦@Â@Ñ@á@ ô@ ÿ@ AA 3AAA FA RA^ApA wA+„A2°A1ãA0B+FB"rB •B¡B¼BÕB äB2ðB#CBC)WC*C¬C¼CÍC íC ÷CDD 3DADQDZD0zD«DÇDÞDùD'E7EPE&gEŽE£E¼EÙE)ôEF'4F\FmF#‚F'¦F'ÎFöFG,GGGdG|G'’G6ºGñG H&H0AH1rH ¤HÅH4àH6I"LIoI#ŒI°I*ÏIúI J$-J$RJwJ,‘J¾JÑJ êJ K )K 6K AK NK[KcK lKvK|KƒK ‡K“K›KŸK¥K©K&ÉKðKôK ýKL>LYL ^L lL wLL˜L1ŸL ÑLÜLåLöL ýL M M 9M CMdMjM|M •M¶M½M ÅMÐM ØMâMN N2NANUNlNpN tN •N  N ­N»N ÃN ÐNÝN#âNOOOO $O#1OUO^O }O‹OœO´OÇOÎOÒOØOÜOãOöO PP 4P AP MP [P eP oPyP}PƒPŠP ’PŸP°P¹PÉPæPíPQ Q%Q .Q79Q9qQ«Q ÆQ ÒQÞQòQ÷Q R R R/RFR JRVRZR ^RiR‚R …RR —R ¢R ®R ºRÄRÉRÐRÕRÞRãRçRS SS+S;S@SQSUS ZS {SˆSS•S«SÄSÛSêS ýST TT!T 3T>T CTQTUTYTbTfTnT qT |TŠT‘T–T®T&ÀT&çTU 'U2U#IUmUsU{U–U U¨U­U²U6ÁUøUVV V'V(.V5WV V™V V¯V!µV×VàV éVôVüVWWW 5W@W UW aWoW!vW"˜W"»WÞWöWûW X X$X4X DXOXSX\XoXwXˆX)‘X4»XGðX8Y&OY'vYJžY?éYH)Z%rZ#˜ZI¼Z[0$[.U[-„[$²[C×[\\<x\+µ\'á\ ]]] ]@]F]J]P]p]‰]'›]Ã] Ë]Õ]ä] ì]4ù].^3^%D^)j^;”^?Ð^A_R_q_ z_…_‹_¥_ »_ È_Ö_ Û_ è_ õ_````##` G`Q`j`s`‹`¦`µ`"º`Ý` å` ò`ÿ`a aa-$a4Ra ‡a “aža ¤a±aÊaÒaæaëa ða(úa#b+b2b 9bCbKbObgbjb ob|b!Žb °b!»bÝbåbýb cc-cKcPc jc wcc ‘cœc¤cªcÀcÈcÚcãc"ócd5dRd WdadedÃxd:Ûv>w1Yw(‹w ´wÀwÛwòwx>)x#hxŒx,¨x:Õxy y1y Qy]ynyy˜yªy¿yÈy<èy%zDz[zzz(—zÀzÜz*øz#{@{]{}{(œ{Å{(â{ ||+/|([|=„|.Â|ñ|( }+2}^}{}!š}7¼})ô}~;~?U~8•~:Î~ 7(M`*®Ù4õ&*€?Q€‘€+ª€!Ö€)ø€"+=i# Ä â î ù ‚‚‚‚,‚1‚6‚?‚S‚Y‚ b‚m‚(q‚0š‚˂ς*Ø‚1ƒ/5ƒeƒiƒ ~ƒ Šƒ•ƒ ¯ƒ7¹ƒ ñƒýƒ „„„ '„H„b„*k„ –„¡„$·„!Ü„þ„ … …… '…"1…T…1m…Ÿ…¯…Ê…ã…ì…"ð…† †'†6†>† O†\†b††ˆ††˜†Ÿ†®†Ȇцî† ‡-‡M‡^‡f‡j‡p‡ t‡‡›‡µ‡Ň ߇ê‡û‡ ˆ ˆ#ˆ2ˆ 6ˆAˆJˆSˆdˆwˆ€ˆ’ˆ¯ˆ¸ˆÓˆòˆøˆ ‰: ‰5G‰}‰ “‰Ÿ‰°‰ĉɉ܉ ä‰ð‰Š%Š)Š9Š=ŠAŠ"RŠuŠxŠ ~Š‰Š šŠ§Š ¹ŠÇŠΊ׊ÝŠ åŠïŠ1óŠ%‹)‹1‹ I‹V‹[‹ t‹‹„‹ ™‹¦‹­‹³‹Í‹é‹ŒŒ1Œ9ŒBŒTŒ]Œ sŒ~Œ ƒŒŒ”Œ—ŒŒ¡Œ©Œ ¬Œ ¸ŒÅŒÌŒÑŒëŒ- +7 c „‘#±Õ Þ%éŽ ŽŽ$Ž+Ža=ŽŸŽ§ŽÄŽÔŽ ÜŽ0æŽG_s{#“·ÀÈ Þèñõ #1 O Y eo:ƒ$¾)ã ‘‘+‘<‘O‘j‘z‘Бޑ—‘ ¯‘»‘ Ä‘'ΑAö‘B8’!{’#’3Á’Xõ’TN“W£“/û“/+”S[”¯”2Í”=•=>•)|•F¦•4í•7"–-Z–4ˆ–½–Æ–Ì–2Ô–— ———2—N—2a— ”—ž—³—Å—Ì—"Ü—ÿ—˜1˜'I˜Dq˜G¶˜Aþ˜@™Z™ c™n™w™•™¯™ ¾™Ê™Ιâ™ò™š ššš".š Qš!^š €šŠš£š¾šÏš&Öš ýš ››.›4› ;›G›-a›5›Å›Ô› ã›í›"ü› œ)œ=œDœ Jœ.Tœƒœ‹œ’œ™œ°œ ŜϜäœèœ íœùœ" 1$>c!j Œ – "»Þ$æ žž+ž ;ž HžTžZžyž€ž‘žšž«ž%ʞ𞟠Ÿ"Ÿ%Ÿ7Þ“y ª^Nž ZL›8‘àYYPÉqVºs{\<„[kÖ‹Kþ‰ßå–ïzE1o!G£•ófƒ <¼CÜdp˜Î•ŠïßB!’èžWÕÊî¿òU†\ó^úMM‚,aìA=¦F“ÞFKLðòR}Ÿ%}Ì*$¾¿ºT½Ý÷Ãr¸(kdÿ"Û+-6OWí+2J Á«9í%@±&´XѩַU–gûê &;D¾[ †¤38Œ0šçü8â:‹œR9a3™)X±#×-»ü®`î?L¢ODõsÍâ‰7GñeêÇCUuëæäxÛ—·ˆ‡åÌÙiáÈ~'ÇùH^2nØš…D=Q B¨ FéËÒn&²Ðþc{ý‚xJeô7àb÷I‡´ÒRr#$˜Q*iô'K<uø_اùÈAlÜ|dý!Ùµ;°ÁT@mÄ¥6Î Nm]3 °»Z]ÚøV¦ #„ AÅ5.\§£5=éBj?¤_~Q0ÅŽƒÔ,ì]¡Æ aJ Tpyg|À Z›®²Â$4 t)ðÀá³>*¯úޝÓvf¼?4©[@Ð2ñ `)Ñ…1ç(ª”h:. cX/`5µC¸cڭ͈q%">/¬ M(t³/õè¥ÊÂÆS4­E€ÕÏ—1H½¹SG’ÿ"lb,×HEã_hVwPzö:jŸv¶0Ëo€P‘ãwI-I¡¹OŒ¬”Ô¶9NSÃ;>WÉYÝäÄ+6'«Šëûb™œæ. Óö¨Ï¢ --basedir, -b set a custom base directory --help display this stuff --version, -v show the program version info -n, --number mobile number to send an event to (sms only) -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Accounts.. Age : %s Age range : %s All protocols Always online non-IM contacts for : %s Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Birthdate : %s Cellular phone : %s Change color scheme to : %s Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable peer-to-peer communications : %s Enable web status indicator : %s Fax : %s File transfers monitor Files Find/add user(s) Find/add users First name : %s For protocols : %s Gender : %s General Groups HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Import friend list : %s Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Keywords Keywords : %s Language : %s Last name : %s Leave channel Link an RSS feed Link an RSS feed Location Login : %s Look for online only : %s Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network Nickname Nickname : %s Online only Online/offline events in the log window : %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Port range to use for peer-to-peer : %s Position : %s Priority : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remove channel del Request authorization Request receipts: %s SMTP server : %s Search parameters Search profiles Search service Secured : %s Security : %s Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Show users who have you on their list State : %s Street address : %s Subject : %s Timestamps in the log window : %s UIN UIN : %s Update user details User interface Users with photos only : %s View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM of password: priority: server address: uin: user name: ! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu%lu minutes%s from %s, received on %s%s has been kicked by %s%s has joined.%s has left%s or %s to close, Up/Down and PgUp/PgDn to scroll%s search, %s again, %s cancel%s to %s, sent on %s%s to URLs, %s external actions, %s close%s to URLs, %s to full-screenize, %s close%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [gg] cannot resolve %s+ [gg] connection lost+ [gg] connection to the server failed+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] cannot connect: + [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ [yahoo] server closed socket+ cannot fetch away messages being offline+ last msg from %s+ new mail arrived, %d messages+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAdd to listAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateBlock channel messagesCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChange statusChannel chat historyChannel topic now is: %sChannel: Charset to convert messages to: CheckCheck frequency: Check the new password: Check the password you entered: City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DNDDecDefault Jabber conference serverDepartmentDepartment: Description: DetailsDetect musicDisconnectedDoneDrop the account information first!E-Mail: E-mailE-mail: EditEdit detailsEmpty authorization request messageEncodingEnter birthdate (DD-MM-YYYY): Event historyEvent recipientsEvents sending options:External actions..FailedFaxFax: FebFemaleFetch away messageFetch version infoFetching your detailsFile transfer statusFirst name: Force checkFree for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadGo to contact..HTTP proxy server hostname: HandleHide offline usersHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIgnore userIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLinkLink: LoadLocationMaleMarMass move selected users to..MayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: NoneNot specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %s to %sPING reply from the user: %d second(s)Password must be at least 6 chars longPassword must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: Please join my conference.PolishPosition: PostPrevPublished on: QuickSearch: type to find, %s find again, Enter finishRSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?Remove userRenameRename contactReplyResult of the external action %s:RetreiveRetrieveRetrying..RomanceRussianSMSSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSelect contacts to moveSendSend a messageSend an URLSend contactsSend contacts..Sending requestSent on %sSepServer: Show offline usersState: Street address: StudentsThe Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesThis is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnBlock channel messagesUnable to connectUnable to connect to icq server. Retry?Usage: User infoUser's detailsVersionVisible listWait a moment. Your details haven't been fetched yetWorkWrong Jabber ID!Wrong nickname given, cannot registerYou have to disconnect the service first!You must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: abortadding %s to the contactsaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: connecting to the servercontactscould not create socketcould not resolve hostnamecouldn't fetchdarkdirectory to save the file(s) to: disabledisconnecteddon't changedonee-maileventevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfriends onlyicq disconnection reasonignoredincoming %s from %slInklOadlogged inmembers list fetching finished, %d foundmessagemode 1mode 2move Downmove Upn/anew MSN friendly nick: nononenotificationoutgoing %s to %spassword was changed successfullypassword: post new entries to your journal.privatepublic (visible to all)rEmovereason: %sregistration is not supportedremoving %s from the contactssAvesearch finished, %d foundsearch for: set by %ssocket problemssound cardspeakerstartstatus change error: successthe message was: turboingunknown IM typeunknown status character was givenusername and password mismatchverify the hostname and portworkwrong XMLyesyou are an op hereProject-Id-Version: nl Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2008-08-03 19:52+0100 Last-Translator: Matthias Nieuwenhuisen Language-Team: Nederlands Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: KBabel 1.3.1 --basedir, -b stel een aangepaste basismap in --help laat deze gegevens zien --version, -v toon de versiegegevens van dit programma -n, --number GSM-nummer om een gebeurtenis naar te sturen (enkel sms) -s, --send gebeurtenistype; kan msg, sms of url zijn -t, --to bestemmings-UIN of -bijnaam (hangt af van het gebruikte protocol) %s: details 1ste taal : %s 2de taal : %s 3de taal : %s om te bevestigen, om te annuleren of om te bevestigen, om te annuleren Over Accounts.. Leeftijd : %s Leeftijds bereik : %s Alle protocollen Toon niet-IM contactpersonen altijd als online : %s Anti-stalking: verw. ber. van gebruiker niet op lijst : %s Organiseer contacten in groepen : %s Autorisatie vereist : %s Zet automatisch afwezigheid periode (min) : %d Zet automatisch niet bereikbaar (min) : %d Geb. Datum : %s GSM : %s Verander kleurenschema naar : %s Wijzig bijnaam Verander wachtwoord : %s Verander geluidsschema naar : %s Kanaal : %s Berichtenmodus : %s Berichtenmodus voor : %s Controleer frequent (in minuten) : %lu Controleer de locale mailbox : %s Controleer wachtwoord : %s Plaats : %s Commentaar Communicaties Bedrijf : %s Contactlijst Land : %s Aangepast humeur : %s Afdeling : %s Gedetailleerde IM gebeurtenissen opslaan in ~/.centerim/log : %s Details Zet commentaar versturen via e-mail uit : %s Laat geen commentaren toe : %s Weggooien E-Mail : %s E-Mail : %s Bewerk afwezigheidsbericht bij statuswijziging : %s Schakel bidirectionele talenondersteuning in : %s Schakel peer-to-peer verbindingen in : %s Schakel web status indicator aan : %s Fax : %s Bestandsoverdrachtvenster Bestanden Zoek/voeg gebruiker(s) toe Voeg gebruikers toe Voornaam : %s Voor protocollen : %s Geslacht : %s Algemeen Groepen HTTP proxy server : %s Verberg offline gebruikers : %s Thuis Homepage : %s IM accountbeheer Importeer contactenlijst : %s Binnenkomend van %s Nodig uit op conferentiekamer.. Kanaal betredenBetreed kanaal/conferentiekamerBetreed/creëer een kanaal/conferentiekamer Sleutelwoorden Sleutelwoorden : %s Taal : %s Achternaam : %s Kanaal verlaten Koppel een RSS-feedKoppel een RSS-feed Locatie Aanmelden : %s Kijk enkel naar online : %s Overige Humeur : %s Meer Verplaats naar groep.. Muziek : %s Naam : %s Naam/Titel Netwerk Nickname Nickname : %s Alleen online Online/offline gebeurtenissen in het geschiedenisvenster : %s Opties Organiseer contactgroepen Uitgaand bericht naar %s Wachtwoord Wachtwoord (optioneel) : %s Wachtwoord : %s Wachtwoord veranderen naar : %s Telefoon : %s Afbeelding : %s Ping Port range om te gebruiken voor peer-to-peer : %s Positie : %s Prioriteit : %s Haal origineel bericht aan bij antwoorden : %s Willekeurige gespreksgroepWillekeurige gespreksgroep : %s Registreer Registreer op het %s netwerk Registratieparameters Registratieverloop Registratiedienst Bewaar wachtwoorden : %s Verwijder kanaal delVraag autorisatie aan Ontvangstbevestiging aanvragen: %s SMTP server : %s Zoekparameters Profielen zoeken Zoekdienst Beveiligd : %s Veiligheid : %s Stuur een kanaalbericht enter Verstuur een SMSVerstuur bestand(en) Verstuur bestand(en) naar %s, %lu Server : %s Te gebruiken server : %s Dienst Verander afwezigheidsbericht Toon gebruikers die u op hun contactenlijst hebben Provincie : %s Straat : %s Onderwerp : %s Tijdsaanduidingen in het geschiedenisvenster : %s UIN UIN : %s Update gebruikersdetails Gebruikersinterface: Enkel gebruikers met foto's : %s Toon/bewerk negeerlijst Toon/bewerk onzichtbaarlijst Toon/bewerk zichtbaarlijst Werk URL van XML-export : %s Uw %s details Postcode : %s [Ctrl-X bewaar, Esc annuleer] [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ netwerk [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM van wachtwoord: prioriteit: server adres: uin: gebruikersnaam: ! er draait al een centerim! kan niet verbinden, vrije schijfruimte is minder dan 10k! vrije schijfruimte is minder dan 10k, bezig met offline gaan! anders kunnen we gebeurtenissen en de configuratie verliezen! support voor %s is uitgeschakeld bij compilatie! dit kan problemen veroorzaken. PID %lu%lu minuten%s van %s, ontvangen op %s%s is gebannen door %s%s heeft de kamer betreden.%s heeft de kamer verlaten%s of %s om te sluiten, Omhoog/Omlaag en PgUp/PgDn om schuiven%s zoeken, %s opnieuw, %s annuleren%s naar %s, verstuurt op %s%s naar URL's, %s externe acties, %s sluiten%s naar URL's, %s voor volledige schermgrootte, %s sluiten%s ging offline%s: ging offline%s: is nu online, met %s status(standaard)(geen/aangepast)* Autorisatie : * Autorisatieaanvraag : * Contactlijst : * Bestandsoverdracht* SMS : + %s is toegevoegd aan je lijst+ [%02d:%02d:%02d] nieuwe e-mail binnengekomen, %d berichten+ [%s] automatisch op %s gezet+ [%s] status hersteld+ [aim] verbinding mislukt: %s+ [aim] wachtwoord verzonden+ [aim] kan niet verbinden met de server+ [gg] kan niet opzoeken %s+ [gg] verbinding verbroken+ [gg] verbinding met de server is mislukt+ [icq] verbinding verbroken+ [icq] gefaalde SMS naar %s+ [icq] gefaald SMS naar %s, %s+ [irc] verbinding mislukt: %s+ [irc] bijnaam is met succes gewijzigde+ [irc] wachtwoord verzonden+ [irc] kan niet verbinden met de server+ [jab] fout %d+ [jab] fout %d: %s+ [jab] geen afwezigheidsbericht van %s, %s+ [jab] kan niet verbinden met de server+ [jab] bezig met het ongedaan maken van de registratie op %s+ [lj] %s is toegevoegd bij uw contactpersonen+ [lj] HTTP mislukt: %s+ [lj] kon contactpersoon niet toevoegen+ [lj] fout tijdens verwijderen van contact+ [lj] aanmelden mislukt: %s+ [lj] fout tijdens posten: %s+ [lj] posten gelukt, de ID is %s+ [lj] de gebruiker is verwijderd van uw contactenlijst+ [lj] opzoeken van gebruikers beëindigd+ [msn] kan niet verbinden: + [msn] e-mail van %s, %s+ [msn] omkeren van gebruikersopsomming beëindigd, %d gevonden+ [msn] ongelezen e-mail: %d in postvak in, %d in mappen+ [yahoo] er is al ergens anders aangemeld op deze account+ [yahoo] kan niet verbinden: + [yahoo] kan niet aanmelden: de account is geblokkeerd+ [yahoo] kan niet aanmelden: gebruikersnaam en wachtwoord komen niet overeen+ [yahoo] rechtstreekse verbinding mislukt+ [yahoo] e-mail van %s, %s+ [yahoo] bezig met verlaten van conferentiekamer %s+ [yahoo] server heeft socket gesloten+ kan de 'ben weg' berichten niet ophalen als je 'offline' bent+ laatste bericht van %s+ nieuwe e-mail binnengekomen, %d berichten+ geen URLs in de huidige context+ geen externe acties gedefiëerd voor %s+ geen geschiedenis van %s+ de %s configuratie is gewijzigd, herladen+ de gebruiker is terug+ om bezoek %s te heractiveren+ gebruiker %s staat al in je lijst+ u moet eerst aangemeld zijnOngeveer 202de e-mailOngeveer 30Ongeveer 4050-plus60+OverAcc.Voeg toeToevoegen aan lijstAdresLeeftijdLeeftijd: AprWeet je zeker dat je %s wil verwijderen?Ben je zeker dat de groep verwijderd mag worden?AugAuteur: Zet autom. weg in minuten (0 - inactief): Zet autom. nt. besch. in minuten (0 - inactief): Automatisch toegetreden tot de conferentiekamerWegAfwezigheidsbericht:AchtergrondGeb. datum Blokkeer kanaalberichtenAnnulerenKan geen bestandsoverdracht verwijderen die nu bezig isCategorie: GSMGSM nummer: VeranderVerander statusBerichtengeschiedenis van kanaalKanaalonderwerp is nu: %sKanaal: Tekenset om berichten naar te converteren:ControleerControleer frequent: Controleer het nieuwe wachtwoord : Controleer ingevoerd wachtwoord: Plaats: CommentaarCommentaar: BedrijfBedrijf: Verbinding maken met server %s ...Contact om toe te voegenHuidige aanwezigen in deze conferentiekamer zijn:Huidig humeur: Luistert dit moment naar: Standaard statusbericht:Niet St.DecStandaard Jabber conferentieserverAfdelingAfdeling: Beschrijving: DetailsDetecteer muziekDisconnectedKlaarEerst accountinfo weggooien!E-Mail: E-MailE-mail: BewerkBewerk detailsLege autorisatie-aanvraagCoderingGeboortedatum (DD-MM-JJJJ): GebeurtenissengeschiedenisGebeurtenis-ontvangerOpties voor het versturen van gebeurtenissen:Externe acties..MisluktFaxFax: FebVrouwelijkHaal afwezigheidsbericht afHaal versie-informatie afDetails ophalenStatus bestandsoverdrachtVoornaam: Forceer controleVrij voor kletsFrequentieVrienden vanVolledige naamFwdSpelletjesGeslachtAlgemeenAlgemeen gesprekAlgemene opties: Doe maarGa naar contact..Hostnaam HTTP proxy server: HandelenVerberg offline gebruikersGeschiedenis van %s, %d totaalThuisHomepageHomepage: Ik hou van het standaard %s afwezigheidsbericht van %s %s.Ik hou van het standaard AIM-profiel van centerim %s.Alles van %s negeren?NegeerlijstNegeer gebruikerInkomende %s van %sInfoInformatie over %sHobby'sOnzichtbaarNiet-zichtbaar lijstNodig uit op conferentiekamer..JanBetreed/CreëerJulJunSleutelwoorden: Verbannen door %s met de reden: %sLJTalenLaatste IPLaatste controleAchternaam: Laatste resultaatLaatst gezienKoppelKoppel: LadenLocatieMannelijkMaaVerplaats geselecteerde gebruikers massaal naar..MeiBerichtBericht van de server: GSM nummer: MeerVerplaats naar contactenNt. besch.NaamNaam voor de groep: Naam/titel: Naam: NooitNieuwe UIN ontvangen, %luNieuwe naam voor de groep: Nieuwe naam om te tonen: Nieuw wachtwoord: Naam voor nieuw profiel: OpnieuwVolgendeVolgende controleNicknameNickname veranderen: Nickname: GeenNiet bepaaldNovNuBezigOktOfflineOkOude e-mailOp kanalen: OnlineOpenOrganiseer contactgroepen(%s) Uitgaand bericht naar %sPING-antwoord van de gebruiker: %d seconde(n)Wachtwoord moet minstens 6 tekens lang zijnWachtwoord moet ingevoerd wordenWachtwoord: Wachtwoorden komen niet overeenPeer-to-peer port range (min-max): TelefoonTelefoon: Betreed alstublieft mijn conferentie.PoolsPositie: PostVorigeGepubliceerd op: SnelVinden: voer gegevens in die je wilt zoeken, %s om opnieuw te zoeken, Enter om te beëindigenRSS docWillekeurige gesprekspartnerOntvangen op %sVerwerpVerwijderWilt u ook %s van de contactenlijst verwijderen?Moeten de %d contactpersonen ook van de contactlijst verwijderd worden?Verwijder gebruikerHernoemHernoemen contactAntw.Resultaten van de externe actie %s:OpzoekenHaal opBezig met proberen...RomantiekRussischSMSHostnaam SMTP server: Zoekresultaten [klaar]Zoek/Voeg toeZoeken naar contactpersonen..Zoekt manZoekt vrouwSelecteerSelecteer een groepSelecteer een groep om de gebruiker naartoe te verplaatsenSelecteer contacten om toe te voegenSelecteer contacten om toe te verplaatsenVerstuurVerstuur een berichtVerstuur een URLVerstuur contactenVerstuur contactpersonen..Aanvraag sturenVerzonden op %sSepServer: Toon offline gebruikersProvincie: Straat: StudentenDe JabberID is met succes geregistreerdDe volgende gebruikers hebben u in hun contactenlijst als vriend:Er bestaat al een profiel met deze naam. Wilt u het overschrijven?De persoon op afstand gebruikt %sDe gespecificeerde map bestaat nietDe gespecificeerde map is tegen schrijven beveiligdGebruiker %s (%s) heeft u toegevoegd aan zijn/haar contactenlijst Adres van dagboek: %sGebruiker %s heeft uw uitnodiging om toe te treden tot de conferentiekamer geweigerdGebruiker %s heeft u uitgenodigd om de conferentiekamer %s met onderwerp %s te betredenGebruiker %s heeft de conferentiekamer betredenGebruiker %s heeft de conferentiekamer verlatenGebruiker %s heeft u van zijn/haar contactenlijst verwijderd Adres van dagboek: %sDe gebruiker is jarig vandaagDe gebruiker heeft uw autorisatieaanvraag aanvaardDe gebruiker heeft je toegevoegd aan zijn/haar contactenlijstDe gebruiker heeft zijn/haar bijnaam veranderd van %s naar %sDe gebruiker heeft geen profielinformatieDe gebruiker heeft uw autorisatieaanvraag geweigerd; het bericht was: De gebruiker heeft u verwijderd van zijn/haar rosterDe gebruiker wilt zich inschrijven op uw status updatesDit is uw LiveJournal account. Gebruik het omTimeout tijdens het wachten op een uin. Herproberen?TijdzoneTitelTitel: Bezig met proberen te registreren van %s op %s ...UIN: URLURL: URLs in de huidige context Deblokkeer kanaalberichtenKan niet verbindenKan niet verbinden met de icq-server. Herproberen?Gebruik: GebruikersinformatieGebruikersdetailsVersieZichtbaar lijstEven wachten. Bezig met ophalen...WerkFoutieve JabberID!Kan niet registreren: verkeerde bijnaam opgegevenEerst service ontkoppelen! (disconnect)U moet aangemeld zijn op het ICQ netwerk om uw details bij te werkenU moet aangemeld zijn op het Jabber netwerk om uw details bij te werkenU moet aangemeld zijn op het MSN netwerk om uw bijnaam te updatenUw details zijn opgehaaldPostcodePostcode: afbreken%s aan de contacten toevoegenverbinden met aim misluktzoals gevraagdautorisatiewegAfwezigheidsberichtfout wachtwoordfoute gebruikersnaamblauwAnnulerenWiskan niet verbindenstatus %s veranderd naar %s van %scommentaar: bezig met verbinden met de servercontactenkon geen socket creërenkon hostnaam niet opzoekenkon niet afhalendonkermap om de bestanden naar op te slaan: niet actiefverbinding verbrokenniet veranderenklaare-mailgebeurtenisgebeurtenislogger gestartexterne actie %s uitgevoerd, return code = %dexterne manuele actie %s uitgevoerd, return code = %dbestandsnaam: bestandsnaam: bestandenenkel vriendenreden van verbroken icq-verbindinggenegeerdinkomende %s van %sKoppellAdenaangemeldafhalen van ledenlijst beëindigd, %d gevondenberichtmode 1mode 2verplaats naar beNedenverplaats naar Bovenniet ber.nieuwe MSN bijnaam: neegeennotificatieuitgaande %s naar %swachtwoord is met succes gewijzigdwachtwoord: nieuwe items te posten in uw dagboekprivépubliek (zichtbaar voor iedereen)Verwijderreden: %sregistratie werkt nog niet%s verwijderen van de contactlijstoPslaanzoekopdracht beëindigd, %d gevondenzoeken naar: ingesteld door %ssocket probleemGeluidskaartLuidsprekerstartfout bij wijzigen van status: gelukthet bericht was:turboingonbekend IM typeonbekend statusteken opgegevengebruikersnaam en wachtwoord verkeerdcontroleer de hostnaam en poortwerkfoutieve XMLjau bent hier nu een opcenterim-4.22.10/po/fr.gmo0000644000175000001440000012144311473011460012136 00000000000000Þ•eD5l&@3KA3631Ä3-ö38$4G]4=¥4Hã4 ,5:5N5b5v5*–5Á5 É5 Õ5à5ñ5666#O6s6*‘6)¼6æ6ý67$7B7T7k7‰7˜7³7!Ñ7ó78 ,888 O8Y8j8y8ˆ8—8ª80¼8 í8÷8)9@9Y9 `9 n9)|9-¦9+Ô9):"*:M:!l: Ž: œ:§:¹:Ñ:Ù:ì:ü: ; ;&;/;H;b;i;y;Ž;¨;»; Ó;á;"ú;"< @<K<[<k<|<‹<<!°< Ò< Ý< ç<ô<=#= 3=?=F= W= d= p= }= ‡=’= ¢=.°= ß=é=> >>9>I> `>m>|>)‚>¬>¼>Ó>ã>?? 0?;?X?r?Š?¡?»?Û?ò?@@+@<@K@[@ {@ ˆ@–@ °@¾@ Ó@Ý@'ð@ A%A;A JA#kAA •A A¶AÇAåAüAB.B5BKB]BmB‰B˜B¨B »B ÆBÔBæB úBC C C%C7C >C+KC2wC1ªC0ÜC+ D"9D \DhDƒDžD·DÐDãD òDþD"E2EGEWEhE ˆE ’E E³E ÎEÜEìEõE0FFFbFyF”F'ªFÒFëF&G)G>GWGtG)G¹G'ÏG÷G# H'0H'XH€HŸH¶HÑHîHI'I6DI{I—I°I0ËI1üI .JOJ4jJ6ŸJ"ÖJùJ#K:K*YK„K —K¸K$ØK$ýK"L,MDMHM&hMM“M œM½MÝMøM ýM N N N1'N YNdNmN~N…N žN"¨N ËNìNòNO O>OEO MOXO `OjOŠO ™OºOÉOÝOôOøO üO P (P 5PCP KP XPeP#jPŽP—PžP§P#¬PÐPÙPøP Q!Q(Q,Q2Q6Q=QSQ hQ uQ ƒQ Q —Q¡Q¥Q«Q²Q ºQÇQØQáQþQR%R*R 3R7>R9vR°R ËR×RëRðR S SS(S?S CSOSSS WSbS{S ~SˆS S ›S §S ³S½SÂSÉSÎS×SÜSàSþST T$T4T9TJTNT ST tTTˆTŽT¤T½TÔTãT öTU UUU ,U7U Ï‹,Œ;ŒWŒfŒkŒ Œ ŠŒ”Œ²ŒÐŒÔŒäŒèŒ ìŒùŒ +CJ\v{ƒ‹–5šÐÔÜ òüŽŽ!Ž%Ž @ŽMŽTŽ[ŽqŽŽ­ŽÅŽÞŽñŽ÷Ž ,6 ?M Q\d hu x† —¡¨È Ù1ú!,N"^, ®ºÉç ðü‘‘ $‘ 2‘?‘ X‘d‘ l‘ v‘+—‘Ñ Ì‘#Ö‘ ú‘ ’’(’0’6’:’%Q’w’‡’¡’°’ À’1Î’3“/4“'d“Œ“”“¬“ Á“Ï“ Ó“ Þ“ é“ ô“,ÿ“5,”;b” ž”"¿”5â”P•Ii•I³•)ý•)'–KQ–1–5Ï–4—2:—4m—@¢—nã—OR˜/¢˜8Ò˜ ™™ ™))™S™Z™^™e™‚™7—™ Ï™ Ú™è™ð™A šNš2Vš1‰šH»šM›JR› › ¾›Ê›Ù›á›ú›œ (œ5œ<œNœeœœ„œŒœ”œ¯œΜÝœûœ&#Jd*k – ¢¯¾ÇÎ Ò-ÞG ž=Tž/’ž*ž0íž9ŸXŸjŸ|Ÿ…Ÿ”Ÿ®Ÿ¶ŸÅŸÍŸÒŸ ÙŸ@ãŸ$ , 3  : D K O e i  o | , º )Ê ô û  ¡ ¡*¡G¡f¡#m¡ ‘¡ ¡¨¡ ½¡ Ç¡ Ô¡Þ¡þ¡ ¢¢'¢,B¢9o¢#©¢+Í¢ù¢ £ ££6졇­kU¥¡#ZUž7ŸîYfZÊbÉvc°F‡hxò˜þûŒÜó¤ÃÂ0r-P±`ðjHËMÚqs›'ϘìíK$’•å¬]SËüÎïU“c TW)8eúA*=´O–F.æí^\Š¢J1€Û6ÍO½_ÌëÄ € \4nh%Ù/1<ÿê%7Sß¹EûK´‹ Åeà ·äó[™køø*;DÁ[‰²8D<äùAð:ŽŸR>9n2§#X¿&å'Ê ¼`ë?«L|VM…Ü,–=GiçÈ Caƒèôá4{é¥ÈŠâ Í×lB׋3ÖQ^1++{¨ˆNGQ B«O0áq2µß g~ú†ñrCÝo&̹#”·ÓXu/'¦W$(v!T<xõ_æµöJyê‰e çz}*E¾ÐT@pÓÀ³5ÝXj?³¾`bè\©Žš 3‘LÔÆ;:i ª¦AI÷mJ§lý[Â/ÆœŒ†›ã0é]K¤Õ@bW,Z~|tÏg©±cÁÃ@ ‚ -þïÄ£.²I÷‘½âys"¿!H 3¬aIÑ>"8îm5Ò’=õ"¸—uD)d^Þd:¸L»(‚pØÇΕt)(.É;$¯M,w¶4ôžö£ÙÑV]9»NƒÖÞš6HÀ¼SP üoÇ&QaEñºV“…PˆFw¨­„5Ú}”àzR9R¯!%„Y™º¢ÕÿCNYÒG>dØ_-ýÛòÅ 7B+®—ù fœªã2®Ô¶Ð?° --ascii, -a use ASCII characters for windows and UI controls --basedir, -b set a custom base directory --bind, -B bind a custom local IP --help display this stuff --version, -v show the program version info -n, --number mobile number to send an event to (sms only) -s, --send event type; can be msg, sms or url -t, --to destination UIN or nick (depends on protocol) %s: details 1st language : %s 2nd language : %s 3rd language : %s confirm, cancel or confirm, cancel About Accounts.. Age : %s Age range : %s All protocols Already logged in only Anti-spam: kill msgs from users not on the list : %s Arrange contacts into groups : %s Authorization required : %s Automatically set Away period (min) : %d Automatically set N/A period (min) : %d Backdated entry : %s Birthdate : %s Cellular phone : %s Change color scheme to : %s Change nickname Change password : %s Change sound device to : %s Channel : %s Chat messaging mode : %s Chat messaging mode for : %s Check frequency (minutes) : %lu Check the local mailbox : %s Check the password : %s City : %s Codepages conversion Comment Communications Company : %s Contact list Country : %s Custom mood : %s Department : %s Detailed IM events log in ~/.centerim/log : %s Details Disable auto-formatting : %s Disable sending comments by e-mail : %s Disallow comments : %s Drop E-Mail : %s E-mail : %s Edit away message on status change : %s Enable bidirectional languages support : %s Enable emacs bindings in text editor : %s Enable peer-to-peer communications : %s Enable web status indicator : %s Enter key sends message : %s Enter key sends message for : %s Fancy stuff Fax : %s Feed Parameters File transfers monitor Files Find/add user(s) Find/add users First name : %s Gender : %s General Groups HTTP proxy server : %s Hide offline users : %s Home Homepage : %s IM account manager Import friend list : %s Incoming from %s Invite to conference.. Join channel Join channel/conference Join/create a channel/conference Joined since the last check only Keywords Keywords : %s Language : %s Last name : %s Leave channel Link an RSS feed Link an RSS feed LiveJournal posting: attributes Location Logging Login : %s Look for online only : %s Mass group move.. Miscellaneous Mood : %s More Move to group.. Music : %s Name : %s Name/Title Network Nickname Nickname : %s Online only Online/offline events in the log window : %s Options Organize contact groups Outgoing to %s Password Password (optional) : %s Password : %s Password to set : %s Phone : %s Picture : %s Ping Port range to use for peer-to-peer : %s Position : %s Post to journal : %s Priority : %s Quote a message on reply : %s Random chat group Random chat group : %s Register Register on the %s network Registration parameters Registration progress Registration service Remember passwords : %s Remove channel del Request authorization SMTP server : %s Search parameters Search profiles Search service Secured : %s Security : %s Send a channel message enter Send an SMS Send file(s) Send file(s) to %s, %lu Server : %s Server to use : %s Service Set away message Show users who have you on their list State : %s Street address : %s Subject : %s Switch to language preset : %s Timestamps in the log window : %s UIN UIN : %s Update user details User interface Users with photos only : %s View/edit ignore list View/edit invisible list View/edit visible list Work XML export URL : %s Your %s details Zip code : %s [Ctrl-X save, Esc cancel] [aim] AOL TOC [gg] Gadu-Gadu [icq] ICQ network [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM of password: priority: server address: uin: user name: ! another running copy of centerim detected! cannot connect, free disk space is less than 10k! free disk space is less than 10k, going offline! otherwise we can lose events and configuration! support for %s was disabled at build time! this may cause problems. pid %lu%lu minutes%s from %s, received on %s%s has been deopped by %s.%s has been kicked by %s%s has been opped by %s.%s has deopped us.%s has joined.%s has left%s has opped us.%s to %s has been put to the queue%s to %s, sent on %s%s went offline%s: went offline%s: went online, with status %s(default)(none/custom)* Authorization : * Authorization request : * Contacts : * File transfer* SMS : + %s has been added to the list+ [%02d:%02d:%02d] new mail arrived, %d messages+ [%s] automatically set %s+ [%s] status restored+ [aim] connect failed: %s+ [aim] password sent+ [aim] unable to connect to the server+ [gg] cannot resolve %s+ [gg] connection lost+ [gg] connection to the server failed+ [icq] disconnected+ [icq] failed SMS to %s+ [icq] failed SMS to %s, %s+ [irc] connect failed: %s+ [irc] nickname was changed successfully+ [irc] password sent+ [irc] unable to connect to the server+ [jab] error %d: %s+ [jab] no away message from %s, %s+ [jab] unable to connect to the server+ [jab] unregistering from the %s agent+ [lj] %s was added to friends+ [lj] HTTP failed: %s+ [lj] couldn't add friend+ [lj] error deleting friend+ [lj] login failed: %s+ [lj] post error: %s+ [lj] posted successully, the id is %s+ [lj] the user has been removed from your friend list+ [lj] user lookup finished+ [msn] cannot connect: + [msn] e-mail from %s, %s+ [msn] reverse users listing finished, %d found+ [msn] unread e-mail: %d in inbox, %d in folders+ [yahoo] another logon detected+ [yahoo] cannot connect: + [yahoo] cannot login: the account has been blocked+ [yahoo] cannot login: username and password mismatch+ [yahoo] direct connection failed+ [yahoo] e-mail from %s, %s+ [yahoo] leaving the %s conference+ [yahoo] server closed socket+ cannot fetch away messages being offline+ last msg from %s+ launched the %s action command+ new mail arrived, %d messages+ no URLs within the current context+ no external actions defined for %s+ no history items for %s+ the %s configuration was changed, reloaded+ the user is back+ to reactivate visit %s+ user %s is already on the list+ you must be logged in first20 Something2nd e-mail30 Something40 Something50 Plus60-aboveAboutAcceptAddAddressAgeAge: AprAre you sure want to remove %s?Are you sure want to remove the group?AugAuthor: Auto Away period (0 - disable): Auto N/A period (0 - disable): Auto-joined the conferenceAwayAway message:BackgroundBirthdateCancelCannot remove a transfer which is in progress nowCategory: CellularCellular phone: ChangeChannel topic now is: %sChannel: Charset to convert messages from: Charset to convert messages to: CheckCheck frequency: Check the new password: Check the password you entered: City: CommentComments: CompanyCompany: Connecting to the server %s ...Contact to addCurrent conference members are: Current mood: Currently playing: Custom status message:DNDDecDefault Jabber conference serverDepartmentDepartment: Description: DetailsDetect musicDisconnectedDoneDrop the account information first!E-Mail: E-mailE-mail: EditEmpty authorization request messageEncodingEnter birthdate (DD-MM-YYYY): Event recipientsEvents sending options:FailedFaxFax: FebFemaleFetching your detailsFile transfer statusFirst name: Free for chatFrequencyFriend ofFull nameFwdGamesGenderGeneralGeneral ChatGeneral options:Go aheadHTTP proxy server hostname: HandleHistory for %s, %d events totalHomeHomepageHomepage: I do really enjoy the default %s away message of %s %s.I do really enjoy the default AIM profile of centerim %s.Ignore all events from %s?Ignore listIncoming %s from %sInfoInformation about %sInterestsInvisibleInvisible listInvite to conference..JanJoin/CreateJulJunKeywords: Kicked by %s; reason: %sLJLanguagesLast IPLast checkLast name: Last resultLast seenLinkLink: LoadLocationMaleMarMass move selected users to..MayMessageMessage from the server: Mobile number: MoreMove to contactsN/ANameName for a group to be created: Name/Title: Name: NeverNew UIN received, %luNew name for the group: New nickname to show: New password: New profile name: New searchNextNext checkNicknameNickname to set: Nickname: NoneNot specifiedNovNowOccupiedOctOfflineOkOld e-mailOn channels: OnlineOpenOrganize contact groupsOutgoing %s to %sPING reply from the user: %d second(s)Password must be at least 6 chars longPassword must be enteredPassword: Passwords do not matchPeer-to-peer port range (min-max): PhonePhone: Please join my conference.PolishPosition: PostPosting subject: PrevPublished on: RSS docRandom Chat UserReceived on %sRejectRemoveRemove %s from the contact list as well?Remove the %d contacts from the contact list as well?RenameReplyResult of the external action %s:RetreiveRetrieveRetrying..RomanceRussianSMSSMTP server hostname: Search results [done]Search/AddSearching contacts..Seeking MenSeeking WomenSelectSelect a group to add the user toSelect a group to move the user toSelect contacts to add to the listSelect contacts to moveSendSend contacts..Sending requestSent on %sSepServer: State: Street address: StudentsThe Jabber ID was successfully registeredThe following users have you listed as their friend:The profile with this name already exists. Do you want to overwrite it?The remote is using %sThe specified directory does not existThe specified directory is not writableThe user %s (%s) has added you to his/her friend list Journal address: %sThe user %s has declined your invitation to join the conferenceThe user %s has invited you to the %s conference, the topic there is: %sThe user %s has joined the conferenceThe user %s has left the conferenceThe user %s has removed you from his/her friend list Journal address: %sThe user has a birthday todayThe user has accepted your authorization requestThe user has added you to his/her contact listThe user has changed their nick from %s to %sThe user has no profile information.The user has rejected your authorization request; the message was: The user has removed you from his contact list (unsubscribed you, using the Jabber language)The user wants to subscribe to your network presence updatesThis is your LiveJournal account. Use it toTimed out waiting for a new uin. Retry?TimezoneTitleTitle: Trying to register %s at %s ...UIN: URLURL: URLs within the current contextUnable to connectUnable to connect to icq server. Retry?Usage: User infoVersionVisible listWait a moment. Your details haven't been fetched yetWorkWrong nickname given, cannot registerYou have to disconnect the service first!You must be logged to the ICQ network to update the detailsYou must be logged to the Jabber network to update your detailsYou must be logged to the MSN network to update the friendly nickYour details have been fetchedZip codeZip code: abortadding %s to the contactsaim connection failedas requestedauthorizationawayaway messagebad passwordbad usernamebluecAncelcLearcannot connectchanged our %s status to %s from %scomment: connecting to the servercontactscould not create socketcould not resolve hostnamecouldn't fetchdarkdirectory to save the file(s) to: disabledisconnecteddon't changedonee-mailerreventevent sending error: not enough parametersevent sending error: only UINs are allowed with icq protocolevent sending error: unknown IM typeevent sending error: unknown event typeevents log startedexecuted external action %s, return code = %dexecuted external manual action %s, return code = %dfile name: filename: filesfriends onlyicq disconnection reasonignoredincoming %s from %sinitlInklOadlogged inmembers list fetching finished, %d foundmessagemode 1mode 2move Downmove Upn/anew MSN friendly nick: nononenotificationoutgoing %s to %spassword was changed successfullypassword: post new entries to your journal.privatepublic (visible to all)rEmovereason: %sregistration is not supportedremoving %s from the contactssAvesearch finished, %d foundsearch for: set by %ssocket problemssound cardspeakerstartstatus change error: successthe message was: turboingunknown IM typeunknown status character was givenusername and password mismatchverify the hostname and portverify the pager host and port enteredworkwrong XMLyesyou are an op hereProject-Id-Version: centerim 4.9.4 Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/listinfo/centerim-devel/projects/centerim POT-Creation-Date: 2010-11-23 20:17+0100 PO-Revision-Date: 2002-01-01 01:01+0020 Last-Translator: Thomas Nemeth Language-Team: fr Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --ascii, -a utiliser des caractères ASCII pour l'interface --basedir, -b définir un répertoire de base --bind, -B se lier à une IP locale --help afficher cette aide --version, -v afficher la version du programme -n, --number numéro de téléphone où envoyer un message (sms seulement) -s, --send type d'événement (msg, sms ou url) -t, --to UIN ou pseudo de destination (dépend du protocole) %s : informations 1ère langue : %s 2ème langue : %s 3ème langue : %s confirme, annule ou confirme, annule À propos Comptes... Âge : %s Tranche d'âge : %s Tous les protocoles Déjà connectés seulement Anti-spam - ignorer les msg venant d'inconnus : %s Classer les contacts en groupes : %s Autorisation nécessaire : %s Devenir automatiquement absent après (min) : %d Passer automatiquement en n/d après (min) : %d Entrée antidatée : %s Date de naissance : %s Mobile : %s Jeu de couleurs : %s Changer le pseudo Changer le mot de passe : %s Périphérique audio : %s Chan : %s Suivi de discussion : %s Suivi de discussion : %s Fréquence de vérification (minutes) : %lu Scruter la boite mail locale : %s Confirmer le mot de passe : %s Ville : %s Conversion de pages de codes Commentaire Communications Société : %s Liste des contacts Pays : %s Humeur perso : %s Secteur : %s Journaliser les événements dans ~/.centerim/log : %s Détails Désactiver l'auto-formattage : %s Désactiver l'envoi de commentaires par e-mail : %s Interdire les commentaires : %s Supprimer E-Mail : %sE-mail : %s Éditer le message d'absence en changeant d'état : %s Activer le support des langues bidirectionnelles : %s Activer les raccourcis emacs dans l'éditeur : %s Activer les communications pair-à-pair : %s Activer l'indicateur d'état sur le web : %s [Entrée] envoie le message : %s [Entrée] envoie le message pour : %s Trucs décoratifs Fax : %s Paramètres de recherche Moniteur transferts de fichiers Fichiers Chercher/ajouter utilisateur(s) Chercher/Ajouter contacts Prénom : %s Sexe : %s Général Groupes Proxy HTTP : %s Masquer les utilisateurs déconnectés : %s Maison Page perso : %s gestionnaire de comptes de messagerie Importer une liste d'amis : %s Reçu de %s Inviter à une confrence... Joindre le chan Joindre le chan/la conférence Joindre ou créer un chan ou une conférence Seulement ceux qui ont joint depuis la dernire vérification Mots clé Mots clé : %s Langue : %s Nom : %s Quitter le chan Ajouer un flux RSS Ajouter un flux RSSPublication LiveJournal : attributs Lieu Journalisation Identifiant : %s Chercher seulement les gens connectés : %s Déplacer en bloc... Divers Humeur : %s Plus Déplacer vers... Musique : %s Nom : %s Nom/Titre Réseau Pseudo Pseudo : %s Connectés uniquement Événement Connecté/Déconnecté dans la fenêtre journal : %s Options Classer les groupes de contacts Envoyé à %s Mot de passe Mot de passe (optionnel) : %s Mot de passe : %s Définir le mot de passe : %s Téléphone : %s Photo : %s Ping Échelle des ports pour le pair-à-pair : %s Position : %s Publier dans le journal : %s Priorité : %s Reprendre le message dans les réponses : %s Groupe de discussion aléatoire Groupe de discussion aléatoire : %s S'enregistrer S'enregistrer sur le réseau %s Paramètres d'enregistrement Enregistrement en cours Service d'enregistrement Se souvenir des mots de passe : %s Supprimer chan del Demander autorisation Serveur SMTP : %s Paramètres de recherche Rechercher des profils Services de recherche Sécurisé : %s Sécurité : %s Envoyer msg au chan entrée Envoyer SMS Envoyer fichier(s) Envoyer le(s) fichier(s) vers %s, %lu Serveur : %s Serveur à utiliser : %s Service Définir le message d'absence Afficher les utilisateurs qui vous ont dans leur liste de contacts Région : %s Adresse : %s Objet : %s Passer à la langue : %s Datation dans la fenêtre journal : %s UIN UIN : %s Mettre à jour les informations Interface utilisateur Utilisateurs avec photo uniquement : %s Liste des contacts à ignorer Liste des contacts invisibles Liste des contacts visibles Travail URL d'export XML : %s Vos infos %s Code postal : %s [Ctrl-X sauvegarder, Esc annuler] [aim] AOL TOC [gg] Gadu-Gadu [icq] réseau ICQ [irc] IRC [jab] Jabber [lj] LiveJournal [msn] M$ Messenger [yahoo] YAIM de mot de passe : priorité : adresse du serveur : uin : nom d'utilisateur : ! un autre centerim est déjà lancé! espace disponible sur le disque < 10k, déconnexion! espace disponible sur le disque < 10k, déconnexion! pour éviter la perte de messages ou de la configuration! le support de %s a été désactivé à la compilation! cela peut poser problème. pid %lu%lu minutes%s de %s, reçu le %s%s a été démis op par %s.%s a été kické par %s.%s a été mis op par %s.%s nous a démis op.%s nous a rejoint.%s est parti%s nous a mis op.%s vers %s a été ajouté à la file%s à %s, Envoyé le %s%s s'est déconnecté%s s'est déconnecté%s s'est connecté, état : %s(défaut)(aucune/perso)* Autorisation : * Demande d'autorisation : * Contacts : * Transfert de fichier* SMS : + %s a été ajouté à la liste+ [%02d:%02d:%02d] nouveau mail reçu, %d messages+ [%s] mode automatique : %s+ [%s] état précédent rétabli+ [aim] la connexion a échoué : %s+ [aim] mot de passe envoyé+ [aim] impossible de se connecter au serveur+ [gg] impossible de résoudre %s+ [gg] connexion de perdue+ [gg] échec de connexion au serveur+ [icq] déconnecté+ [icq] échec SMS vers %s+ [icq] échec SMS vers %s, %s+ [irc] la connexion a échoué : %s+ [irc] votre pseudo a été changé+ [irc] mot de passe envoyé+ [irc] impossible de se connecter au serveur+ [jab] erreur %d : %s+ [jab] pas de message d'absence de %s, %s+ [jab] impossible de se connecter au serveur+ [jab] désenregistrement de l'agent %s+ [lj] %s a été ajouté aux amis+ [lj] échec HTTP : %s+ [lj] impossible d'ajouter l'ami+ [lj] erreur de suppression d'ami+ [lj] échec de connexion : %s+ [lj] erreur : %s+ [lj] publication réussie. L'id est %s+ [lj] l'utilisateur a été enlevé de votre liste d'amis+ [lj] recherche terminée+ [msn] impossible de se connecter : + [msn] e-mail de %s, %s+ [msn] affichage inversé des utilisateurs terminé, %d réponse(s)+ [msn] e-mail non lus : %d dans la boite d'entrée, %d dans les dossiers+ [yahoo] autre connexion détectée+ [yahoo] impossible de se connecter : + [yahoo] connexion impossible : le compte est bloqué+ [yahoo] connexion impossible : mauvais nom d'utilisateur mot de passe+ [yahoo] la connexion directe a échoué+ [yahoo] e-mail de %s, %s+ [yahoo] déconnexion de la conférence %s+ [yahoo] le serveur a fermé la socket+ impossible de récupérer les messages d'absence en étant déconnecté+ dernier message de : %s+ commande %s lancée+ nouveau mail reçu, %d messages+ pas d'URL dans le contexte courant+ pas d'action externe définie pour %s+ pas d'historique pour %s+ la configuration de %s a changé. Rechargée.+ l'utilisateur est de retour+ pour le réactiver, allez sur %s+ l'utilisateur %s est déjà dans la liste+ vous devez être connecté avant20-30 ans2ème e-mail30-40 ans40-50 ans50 ans et plus60 ou plusÀ proposAccepterAjouterAdresseÂgeÂge : AvrVoulez-vous vraiment supprimer %s ?Voulez-vous vraiment supprimer le groupe ?AoûAuteur : Automatiquement absent après (0 = désactivé) : Automatiquement n/d après (0 = désactivé) : Connexion automatique à la conférenceAbsentMessage d'absence : FondDate de naissanceAnnulerImpossible de supprimer un transfert en coursCatégorie : MobileMobile : Changer Le sujet du chan est maintenant : %s Chan : Convertir depuis le charset : Convertir vers le charset : VérificationFréquence de vérification : Confirmer le mot de passe : Confirmez le mot de passe : Ville : CommentaireCommentaires : SociétéSociété : Connexion au serveur %s ...Contact à ajouterLes membres actuels de la conférence sont : Humeur actuelle : Actuellement : Notification d'état personnalisée :Ne pas dérangerDécServeur de conférence jabber par défautSectionSecteur : Description : DétailsDétecter la musiqueDéconnectéTerminéCommencez par supprimer les informations du compte !E-Mail : E-mailE-mail : ÉditerMessage de demande d'autorisation videCodageDate de naissance (JJ-MM-AAAA): Destinataires d'événementsOptions d'émission : ÉchecFaxFax : FévFemmeRécupration de vos informationsÉtat du transfert de fichierPrénom : Libre pour discuterFréquenceAmi deNom complet : Faire SuivreJeuxSexeGénéralDiscussion généraleOptions générales : ContinuerNom du proxy HTTP : NomHistorique pour %s, %d événements au totalMaisonPage persoPage perso : Le message d'absence %s par défaut de %s %s me convient très bien.Le profil AIM par défaut de centerim %s me convient trs bien.Ignorer tous les événements venant de %s ?Liste des contacts ignorés%s reçu de %sInfoInformations sur %sIntérêtsInvisibleListe des contacts invisiblesInviter à une conférence...JanJoindre/QuitterJuiJunMots Clé : Kick par %s ; raison : %sLJLanguesDernière IPDernière vérificationNom : Dernier résultatVu pour la dernière foisLienLien : ChargerLieuHommeMarDéplacer en bloc les contacts sélectionnés vers...MaiMessageMessage du serveur : Mobile : PlusDéplacer vers les contactsN/DNomNom du groupe à créer : Nom/Titre : Nom : JamaisNouvel UIN reçu, %luNouveau nom pour le groupe : Nouveau pseudo à afficher : Nouveau mot de passe : Nouveau nom de profil : Nouvelle rechercheSuiv.Prochaine vérificationPseudoPseudo à définir : Pseudo : Aucun(e)Non préciséNovMaintenantOccupéOctDéconnectéOkAncien e-mailSur les chans : ConnectéOuvrirClasser les groupes de contacts%s envoyé à %sRéponse au PING : %d seconde(s)Le mot de passe doit faire au moins 6 caractèresVous devez entrer un mot de passeMot de passe : Les mots de passe sont différents Échelle de ports pair-à-pair (min-max) : TéléphoneTéléphone : Rejoignez ma conférence SVP.PolonaisPosition : PublierObjet de la publication : Prc.Publié le : Document RSSInterlocuteur aléatoireReçu le %sRejeterSupprimerSuppression de %s des contacts ?Retirer les %d contacts de la liste aussi ?RenommerRépondreRésultat de l'action externe %s : RécupérerRécupérerNouvelle tentative...RomanceRusseSMSNom du serveur SMTP : Résultats de la recherche [terminé]Recherche/AjoutRecherche des contacts...En mal d'hommeEn mal de femmeSélectionnerSélectionnez un groupe où ajouter l'utilisateurSélectionnez un groupe où déplacer l'utilisateurSélectionnez un contact à ajouter à la listeSélectionnez les contacts à déplacerEnvoyerEnvoyer aux contacts...Envoi de la requêteEnvoyé le %sSepServeur : Région : Adresse : ÉtudiantsL'ID Jabber a été enregistré avec succèsLes utilisateurs suivants vous on listé comme ami : Un profil de ce nom existe déjà. Voulez-vous l'écraser ?L'utilisateur distant utilise %sLe répertoire donné n'existe pasLe répertoire donné n'a pas les droits en écritureL'utilisateur %s (%s) vous a ajouté à sa liste d'amis Adresse du journal : %sL'utilisateur %s a décliné votre invitation à rejoindre la conférenceL'utilisateur %s vous a invité à la conférence %s, pour parler de : %sL'utilisateur %s a rejoint la conférenceL'utilisateur %s a quitté la conférenceL'utilisateur %s vous a enlevé de sa liste d'amis Adresse du journal : %sC'est l'anniversaire de l'utilisateur aujourd'huiL'utilisateur a accepté votre demande d'autorisationL'utilisateur vous a ajouté à sa liste de contacts%s a changé de pseudo. Il s'appelle maintenant %sL'utilisateur n'a pas d'information dans son profil.L'utilisateur a refusé votre demande d'autorisation ; raison : L'utilisateur vous a supprimé de sa liste de contacts (vous à désinscrit en utilisant le langage de Jabber)L'utilisateur veut s'inscrire à votre notification de présence sur le réseauVoici votre compte LiveJournal. L'utiliser pourDélai d'attente d'un nouvel UIN dépassé. Réessayer ?Fuseau horaireTitreTitre : Tentative d'enregistrement de %s à %s...UIN : URLURL : URL dans le contexte courantConnexion impossibleImpossible de se connecter au serveur ICQ, réessayer ?Syntaxe : Infos contactVersionListe des contacts visiblesVeuillez patienter. Votre profil n'a pas encore été récupéréTravailMauvaus pseudo donné, impossible de s'enregistrerVous devez vous déconnecter du service d'abord !Vous devez être connect au réseau ICQ pour mettre à jour votre profilVous devez être connecté au réseau Jabber pour mettre à jour votre profilVous devez être connecté au réseau MSN pour mettre à jour votre pseudoVotre profil a été récupéréCode PostalCode postal : annulerajout de %s aux contactsla connexion à aim a échouécomme demandéautorisationabsentmessage d'absencemot de passe incorrectmauvais nom d'utilisateurbleuAnnulereffacerimpossible de se connecterétat %s changé de %s pour %scommentaire : connexion au serveur en courscontactsimpossible de créer la socketimpossible de résoudre le nom d'hôterécupération impossiblesombrerépertoire où sauver le(s) fichier(s) : désactiverDéconnecténe pas changerterminée-mailerrévénementerreur d'émission : pas assez de paramètreserreur d'émission : seuls les UIN sont autorisés par le protocole ICQerreur d'émission : type de messagerie instantannée inconnuerreur d'émission : type d'événement inconnujournalisation des événements démarréeaction externe %s terminée, code de retour : %daction externe manuelle %s terminée, code de retour : %dnom du fichier : nom du fichier : fichiersamis seulementraison de la déconnexionignoré%s reçu de %sinitierlIerOuvrirconnectérécupération de la liste des membres terminée, %d réponse(s)messagemode 1mode 2Descendremontern/dnouveau pseudo MSN : nonaucunnotification%s envoyé à %sle mot de passe a été changé avec succèsmot de passe : publier de nouvelles entrées au journal.privépublic (visible de tous)supprimErraison : %senregistrement non supportésuppression de %s des contactssAuverrecherche terminée, %d réponse(s)Chercher : mis par %sproblèmes de socketcarte sonhaut-parleurdémarrererreur de changement d'état : succèsmessage : turboingtype de messagerie instantanée inconnuun caractère d'état inconnu a été entréle nom d'utilisateur et mot le passe ne correspondent pasvérifiez le nom d'hôte et le portvérifiez le nom d'hôte et le port entréstravailXML erronéouivous êtes op icicenterim-4.22.10/po/bg.po0000644000175000001440000031145611473011457011766 00000000000000# translation of bg.po to Bulgarian # Russian messages for centerim. # Copyright (C) 2001, 2004 Free Software Foundation, Inc. # Konstantin Klyagin , 2001. # Stefan Ilivanov , 2004. # #: src/hooks/jabberhook.cc:2088 msgid "" msgstr "" "Project-Id-Version: bg\n" "Report-Msgid-Bugs-To: CenterIM developers List http://centerim.org/mailman/" "listinfo/centerim-devel/projects/centerim\n" "POT-Creation-Date: 2010-11-23 20:17+0100\n" "PO-Revision-Date: 2010-02-22 12:59+0100\n" "Last-Translator: Damyan Yordanov \n" "Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.0.2\n" #: src/centerim.cc:138 msgid "password: " msgstr "парола: " #: src/centerim.cc:174 #, c-format msgid "%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit" msgstr "" "%s контакт-меню, %s ÑтатуÑ, %s главно меню, %s/%s Ñледващ/предишен чат, %s " "напуÑни" #: src/centerim.cc:274 #, c-format msgid "Ignore all events from %s?" msgstr "Да игнорирам ли ÑъобщениÑта от %s?" #: src/centerim.cc:278 #, c-format msgid "Remove %s from the contact list as well?" msgstr "Да Ð¸Ð·Ñ‚Ñ€Ð¸Ñ Ð»Ð¸ %s и от ÑпиÑъка Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸?" #: src/centerim.cc:312 #, c-format msgid "Are you sure want to remove %s?" msgstr "Сигурен ли Ñи, че иÑкаш да изтриеш %s?" #: src/centerim.cc:320 msgid "New nickname to show: " msgstr "Покажи нов прÑкор:" #: src/centerim.cc:329 msgid "Select a group to move the user to" msgstr "Избери група, в коÑто да бъде премеÑтен потребителÑ" #: src/centerim.cc:347 msgid "+ cannot fetch away messages being offline" msgstr "+ не може да Ñе прочете Ñъобщението му за отÑÑŠÑтвие, когато е офлайн" #: src/centerim.cc:427 msgid "! cannot connect, free disk space is less than 10k" msgstr "! невъзможна връзка, Ñвободното мÑÑто на диÑка е под 10к" #: src/centerim.cc:460 src/accountmanager.cc:255 msgid "away message" msgstr "Ñъобщение за отÑÑŠÑтвие" #: src/centerim.cc:471 #, c-format msgid "! support for %s was disabled at build time" msgstr "! поддръжката за %s е била изключена при компилирането" #: src/centerim.cc:692 src/centerim.cc:747 #, c-format msgid "+ new mail arrived, %d messages" msgstr "+ нова поща приÑтигна, %d ÑъобщениÑ" #: src/centerim.cc:694 src/centerim.cc:749 #, c-format msgid "+ [%02d:%02d:%02d] new mail arrived, %d messages" msgstr "+ [%02d:%02d:%02d] нова поща приÑтигна, %d ÑъобщениÑ" #: src/centerim.cc:697 src/centerim.cc:752 #, c-format msgid "+ last msg from %s" msgstr "+ поÑледно Ñъобщение от %s" #: src/centerim.cc:796 #, c-format msgid "+ the %s configuration was changed, reloaded" msgstr "+ конфигурациÑта %s беше променена, презареждане" #: src/centerim.cc:854 msgid "! another running copy of centerim detected" msgstr "! беше открито друго Ñтартирано копие на centerim" #: src/centerim.cc:855 #, c-format msgid "! this may cause problems. pid %lu" msgstr "! това може да Ñъздаде проблем. pid %lu" #: src/centerim.cc:1008 msgid "Mobile number: " msgstr "Мобилен телефон: " #: src/centerim.cc:1169 msgid "directory to save the file(s) to: " msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° файл(ове): " #: src/centerim.cc:1176 msgid "The specified directory is not writable" msgstr "Ð’ указаната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ може да Ñе запиÑва" #: src/centerim.cc:1180 msgid "The specified directory does not exist" msgstr "Указаната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ ÑъщеÑтвува" #: src/centerim.cc:1315 #, c-format msgid "+ no history items for %s" msgstr "+ нÑма предишни ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² архива от %s" #: src/centerim.cc:1341 #, c-format msgid "+ user %s is already on the list" msgstr "+ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s вече е в ÑпиÑъка ви" #: src/centerim.cc:1353 msgid "Select a group to add the user to" msgstr "Избери група, в коÑто да добавиш контакта" #: src/centerim.cc:1385 #, c-format msgid "+ %s has been added to the list" msgstr "+ %s бе добавен в ÑпиÑъка" #: src/centerim.cc:1457 msgid "+ the user is back" msgstr "+ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ñе върна" #: src/centerim.cc:1473 #, c-format msgid "+ [%s] status restored" msgstr "+ [%s] ÑтатуÑÑŠÑ‚ възÑтановен" #: src/centerim.cc:1488 #, c-format msgid "+ [%s] automatically set %s" msgstr "+ [%s] автоматичен преход в %s" #: src/centerim.cc:1490 msgid "away" msgstr "нÑма ме" #: src/centerim.cc:1490 msgid "n/a" msgstr "n/a" #: src/centerim.cc:1654 msgid "+ Set N/A after screen detach" msgstr "+ Сложи N/A Ñлед откачане на screen-a" #: src/centerim.cc:1662 msgid "! Screen socket path doesn't exist!" msgstr "! Ðе ÑъщеÑтува път към Ñокета на screen!" #: src/centerim.cc:1663 msgid "! Correct path or disable screen auto presence change" msgstr "! Промени Ð¿ÑŠÑ‚Ñ Ð¸Ð»Ð¸ деактивирай автоматичната промÑна на screen" #: src/centerim.cc:1697 msgid "! free disk space is less than 10k, going offline" msgstr "! Ñвободното мÑÑто на диÑка е под 10к, изключване" #: src/centerim.cc:1698 msgid "! otherwise we can lose events and configuration" msgstr "! иначе може да Ñе изгубÑÑ‚ ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð¸ промени" #: src/centerim.cc:1751 msgid "Invite to conference.." msgstr "Покана за чат.." #: src/centerim.cc:1772 msgid "Select contacts to move" msgstr "Избери контактите, които да премеÑтиш" #: src/centerim.cc:1774 msgid "Mass move selected users to.." msgstr "ПремеÑти вÑички избрани контакти в.." #: src/hooks/rsshook.cc:317 msgid "couldn't fetch" msgstr "не може да Ñе изтегли" #: src/hooks/rsshook.cc:349 msgid "wrong XML" msgstr "грешен XML" #: src/hooks/rsshook.cc:353 msgid "no or tag found" msgstr "не беше открит или таг" #: src/hooks/rsshook.cc:362 msgid "no or tag found" msgstr "не беше намерен таг или " #: src/hooks/rsshook.cc:368 msgid "wrong or tag" msgstr "неправилен таг или " #: src/hooks/rsshook.cc:380 msgid "success" msgstr "уÑпешно" #: src/hooks/rsshook.cc:400 msgid "Title: " msgstr "Заглавие: " #: src/hooks/rsshook.cc:401 msgid "Published on: " msgstr "Публикувано на: " #: src/hooks/rsshook.cc:402 msgid "Category: " msgstr "КатегориÑ: " #: src/hooks/rsshook.cc:403 msgid "Author: " msgstr "Ðвтор: " #: src/hooks/rsshook.cc:405 msgid "Description: " msgstr "ОпиÑание: " #: src/hooks/rsshook.cc:407 msgid "Link: " msgstr "Връзка: " #: src/hooks/rsshook.cc:408 msgid "Comments: " msgstr "Коментари: " #: src/hooks/yahoohook.cc:175 msgid "+ [yahoo] cannot connect: " msgstr "+ [yahoo] невъзможна връзка: " #: src/hooks/yahoohook.cc:178 src/hooks/msnhook.cc:909 msgid "could not resolve hostname" msgstr "невъзможно да Ñе определи IP-то на хоÑта" #: src/hooks/yahoohook.cc:179 msgid "could not create socket" msgstr "невъзможно Ñъздаване на Ñокет" #: src/hooks/yahoohook.cc:180 msgid "verify the pager host and port entered" msgstr "провери името на хоÑта и порта" #: src/hooks/yahoohook.cc:448 #, c-format msgid "+ [yahoo] leaving the %s conference" msgstr "+ [yahoo] изход от чата %s" #: src/hooks/yahoohook.cc:686 msgid "Please join my conference." msgstr "ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¸Ñъедини Ñе към Ð¼Ð¾Ñ Ñ‡Ð°Ñ‚" #: src/hooks/yahoohook.cc:699 msgid "Custom status message:" msgstr "Индивидуално ÑÑ‚Ð°Ñ‚ÑƒÑ Ñъобщение:" #: src/hooks/yahoohook.cc:703 #, c-format msgid "+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [yahoo] невъзможно изтеглÑне на Ñъобщението за отÑÑŠÑтвие на %s, %s" #: src/hooks/yahoohook.cc:779 msgid "+ [yahoo] cannot login" msgstr "+ [yahoo] невъзможно влизане" #: src/hooks/yahoohook.cc:785 msgid "+ [yahoo] cannot login: username and password mismatch" msgstr "+ [yahoo] невъзможно влизане: грешна парола и/или потребителÑко име" #: src/hooks/yahoohook.cc:791 msgid "+ [yahoo] cannot login: username doesn't exist" msgstr "+ [yahoo] невъзможно влизане: потребителÑкото име не ÑъщеÑтвува" #: src/hooks/yahoohook.cc:797 msgid "+ [yahoo] cannot login: the account has been blocked" msgstr "+ [yahoo] невъзможно влизане: акаунта е блокиран" #: src/hooks/yahoohook.cc:798 #, c-format msgid "+ to reactivate visit %s" msgstr "+ за да активираш наново, поÑети %s" #: src/hooks/yahoohook.cc:802 msgid "+ [yahoo] another logon detected" msgstr "+ [yahoo] беше открито двойно влизане" #: src/hooks/yahoohook.cc:809 msgid "+ [yahoo] server closed socket" msgstr "+ [yahoo] Ñървър: затворен socket" #: src/hooks/yahoohook.cc:932 #, c-format msgid "" "The user %s has invited you to the %s conference, the topic there is: %s" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s те кани на чат %s, Темата е: %s" #: src/hooks/yahoohook.cc:937 msgid "Current conference members are: " msgstr "УчаÑтници в чата: " #: src/hooks/yahoohook.cc:957 msgid "Auto-joined the conference" msgstr "Ðвтоматично влизане в чат" #: src/hooks/yahoohook.cc:967 #, c-format msgid "The user %s has declined your invitation to join the conference" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s отказа поканата ти за чат" #: src/hooks/yahoohook.cc:977 #, c-format msgid "The user %s has joined the conference" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s влезе в чата" #: src/hooks/yahoohook.cc:992 #, c-format msgid "The user %s has left the conference" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s излезе от чата" #: src/hooks/yahoohook.cc:1032 src/hooks/icqhook.cc:1273 #: src/hooks/msnhook.cc:713 msgid "The user has added you to his/her contact list" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð²Ð¸ добави към нейниÑ/Ð½ÐµÐ³Ð¾Ð²Ð¸Ñ ÑпиÑък Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸" #: src/hooks/yahoohook.cc:1036 msgid "the message was: " msgstr "Ñъобщението беше:" #: src/hooks/yahoohook.cc:1054 #, c-format msgid "+ [yahoo] e-mail from %s, %s" msgstr "+ [yahoo] поща от %s, %s" #: src/hooks/yahoohook.cc:1061 #, fuzzy, c-format msgid "+ [yahoo] system (%s): %s" msgstr "+ [yahoo] ÑиÑтема: %s" #: src/hooks/yahoohook.cc:1070 #, fuzzy, c-format msgid "+ [yahoo] fatal error: %s" msgstr "+ [yahoo] грешка: %s" #: src/hooks/yahoohook.cc:1074 #, fuzzy, c-format msgid "[yahoo] error %s" msgstr "+ [yahoo] грешка: %s" #: src/hooks/yahoohook.cc:1154 msgid "+ [yahoo] direct connection failed" msgstr "+ [yahoo] директната връзка пропадна" #: src/hooks/yahoohook.cc:1195 #, fuzzy msgid "+ [yahoo] chat_cat_xml" msgstr "+ [yahoo] невъзможно влизане" #: src/hooks/yahoohook.cc:1199 #, fuzzy msgid "+ [yahoo] chat_join" msgstr "+ [yahoo] невъзможно влизане" #: src/hooks/yahoohook.cc:1203 #, fuzzy msgid "+ [yahoo] chat_userjoin" msgstr "+ [yahoo] невъзможно влизане" #: src/hooks/yahoohook.cc:1207 #, fuzzy msgid "+ [yahoo] chat_userleave" msgstr "+ [yahoo] невъзможно влизане" #: src/hooks/yahoohook.cc:1211 #, fuzzy, c-format msgid "+ [yahoo] chat_message from %s" msgstr "+ [yahoo] грешка: %s" #: src/hooks/yahoohook.cc:1257 #, fuzzy msgid "+ [yahoo] chat_yahooerror" msgstr "+ [yahoo] грешка: %s" #: src/hooks/yahoohook.cc:1261 #, fuzzy msgid "+ [yahoo] chat_yahoologout" msgstr "+ [yahoo] невъзможно влизане" #: src/hooks/yahoohook.cc:1265 #, fuzzy msgid "+ [yahoo] yahoo connect" msgstr "+ [yahoo] невъзможна връзка: " #: src/hooks/yahoohook.cc:1273 #, fuzzy, c-format msgid "+ [yahoo] get_ip_addr %s" msgstr "+ [yahoo] грешка: %s" #: src/hooks/yahoohook.cc:1278 #, c-format msgid "+ [yahoo] yahoo buddy_change_group %s from %s to %s" msgstr "" #: src/hooks/yahoohook.cc:1288 #, fuzzy msgid "The user has buzzed you" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð¼Ð° рожден ден днеÑ" #: src/hooks/jabberhook.cc:360 msgid "+ [jab] unable to connect to the server" msgstr "+ [jab] невъзможна връзка ÑÑŠÑ Ñървъра" #: src/hooks/jabberhook.cc:649 #, c-format msgid "+ [jab] unregistering from the %s agent" msgstr "+ [jab] %s беше изтрит от ÑпиÑъка" #: src/hooks/jabberhook.cc:764 src/hooks/icqhook.cc:1327 #: src/hooks/gaduhook.cc:402 src/hooks/irchook.cc:632 msgid "Away message:" msgstr "Ñъобщение за отÑÑŠÑтвие:" #: src/hooks/jabberhook.cc:766 #, c-format msgid "+ [jab] no away message from %s, %s" msgstr "+ [jab] нÑма Ñъобщение за отÑÑŠÑтвие на %s, %s" #: src/hooks/jabberhook.cc:802 msgid "Wrong nickname given, cannot register" msgstr "Грешен прÑкор, невъзможно региÑтриране" #: src/hooks/jabberhook.cc:819 msgid "Unable to connect" msgstr "Ðевъзможна връзка" #: src/hooks/jabberhook.cc:1772 src/hooks/irchook.cc:1328 #, c-format msgid "The remote is using %s" msgstr "ОтÑрещната Ñтрана ползва %s" #: src/hooks/jabberhook.cc:2067 msgid "Default Jabber conference server" msgstr "Стандартен Jabber Ñървър за чат" #: src/hooks/jabberhook.cc:2220 src/hooks/jabberhook.cc:2248 #, c-format msgid "+ [jab] error %d" msgstr "+ [jab] грешка %d" #: src/hooks/jabberhook.cc:2221 src/hooks/jabberhook.cc:2249 #, c-format msgid "+ [jab] error %d: %s" msgstr "+ [jab] грешка %d: %s" #: src/hooks/jabberhook.cc:2382 msgid "The user wants to subscribe to your network presence updates" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¶ÐµÐ»Ð°Ðµ абонамент за Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑтатуÑа ви" #: src/hooks/jabberhook.cc:2397 msgid "" "The user has removed you from his contact list (unsubscribed you, using the " "Jabber language)" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð²Ð¸ изтри от ÑÐ²Ð¾Ñ ÑпиÑък Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸" #: src/hooks/aimhook.cc:89 msgid "+ [aim] unable to connect to the server" msgstr "+ [aim] невъзможна връзка ÑÑŠÑ Ñървъра" #: src/hooks/aimhook.cc:305 #, c-format msgid "I do really enjoy the default AIM profile of centerim %s." msgstr "Ðа мен наиÑтина ми хареÑва ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ AIM профил на centerim %s." #: src/hooks/aimhook.cc:375 msgid "aim connection failed" msgstr "aim връзката пропадна" #: src/hooks/aimhook.cc:377 #, c-format msgid "+ [aim] connect failed: %s" msgstr "+ [aim] невъзможна връзка: %s" #: src/hooks/aimhook.cc:414 msgid "The user has no profile information." msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð½Ñма Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð² профила." #: src/hooks/aimhook.cc:503 msgid "+ [aim] password sent" msgstr "+ [aim] паролата беше изпратена" #: src/hooks/icqhook.cc:1051 msgid "as requested" msgstr "по заÑвка" #: src/hooks/icqhook.cc:1052 msgid "socket problems" msgstr "комуникационен проблем" #: src/hooks/icqhook.cc:1053 msgid "bad username" msgstr "грешно потребителÑко име" #: src/hooks/icqhook.cc:1054 msgid "turboing" msgstr "уÑкорение" #: src/hooks/icqhook.cc:1055 msgid "bad password" msgstr "грешна парола" #: src/hooks/icqhook.cc:1056 msgid "username and password mismatch" msgstr "грешна парола и/или потребителÑко име" #: src/hooks/icqhook.cc:1057 msgid "dual login detected" msgstr "открито беше двойно влизане" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] cannot connect" msgstr "+ [icq] невъзможна връзка" #: src/hooks/icqhook.cc:1065 msgid "+ [icq] disconnected" msgstr "+ [icq] изключено" #: src/hooks/icqhook.cc:1076 msgid "icq disconnection reason" msgstr "причина за изключването на icq" #: src/hooks/icqhook.cc:1254 msgid "The user has accepted your authorization request" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð°Ð´Ðµ разрешение за да го добавиш в ÑпиÑъка Ñи" #: src/hooks/icqhook.cc:1258 msgid "The user has rejected your authorization request; the message was: " msgstr "" "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° да даде разрешение за да го добавиш в ÑпиÑъка Ñи; " "обÑÑнение: " #: src/hooks/icqhook.cc:1313 #, c-format msgid "+ [icq] failed SMS to %s, %s" msgstr "+ [icq] не може да Ñе изпрати SMS до %s, %s" #: src/hooks/icqhook.cc:1316 #, c-format msgid "+ [icq] failed SMS to %s" msgstr "+ [icq] не може да Ñе изпрати SMS до %s" #: src/hooks/icqhook.cc:1331 #, c-format msgid "+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)" msgstr "+ [icq] невъзможно изтеглÑне на Ñъобщението за отÑÑŠÑтвие на %s, %s" #: src/hooks/icqhook.cc:1503 msgid "Random Chat User" msgstr "Произволен чат потребител" #: src/hooks/gaduhook.cc:161 msgid "+ [gg] connection failed" msgstr "+ [gg] връзката неуÑпешна" #: src/hooks/gaduhook.cc:164 #, c-format msgid "+ [gg] cannot resolve %s" msgstr "+ [gg] не може да открие IP-то на %s" #: src/hooks/gaduhook.cc:218 msgid "+ [gg] connection to the server failed" msgstr "+ [jab] невъзможна връзка ÑÑŠÑ Ñървъра" #: src/hooks/gaduhook.cc:291 msgid "+ [gg] connection lost" msgstr "+ [gg] изгубена връзка" #: src/hooks/gaduhook.cc:404 #, c-format msgid "+ [gg] no away message from %s, %s" msgstr "+ [gg] нÑма Ñъобщение за отÑÑŠÑтвие на %s, %s" #: src/hooks/irchook.cc:146 msgid "+ [irc] unable to connect to the server" msgstr "+ [irc] невъзможна връзка ÑÑŠÑ Ñървъра" #: src/hooks/irchook.cc:815 #, c-format msgid "+ [irc] connect failed: %s" msgstr "+ [irc] невъзможна връзка: %s" #: src/hooks/irchook.cc:832 msgid "+ [irc] nickname was changed successfully" msgstr "+ [irc] прÑкора беше Ñменен уÑпешно" #: src/hooks/irchook.cc:899 msgid "On channels: " msgstr "Ð’ канали: " #: src/hooks/irchook.cc:1212 #, c-format msgid "Kicked by %s; reason: %s" msgstr "Изритан от канала %s; причина: %s" #: src/hooks/irchook.cc:1268 #, c-format msgid "The user has changed their nick from %s to %s" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ñи Ñмени прÑкора от %s на %s" #: src/hooks/irchook.cc:1290 msgid "+ [irc] password sent" msgstr "+ [irc] паролата беше изпратена" #: src/hooks/irchook.cc:1299 msgid "+ [irc] nick password sent" msgstr "+ [irc] паролата за прÑкора беше изпратена" #: src/hooks/irchook.cc:1323 #, c-format msgid "PING reply from the user: %d second(s)" msgstr "PING отговор от Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð±Ðµ получен за %d Ñекунди" #: src/hooks/irchook.cc:1442 #, c-format msgid "%s has joined." msgstr "%s влезе." #: src/hooks/irchook.cc:1461 #, c-format msgid "%s has left" msgstr "%s излезе." #: src/hooks/irchook.cc:1467 src/hooks/irchook.cc:1493 #, c-format msgid "reason: %s" msgstr "причина: %s" #: src/hooks/irchook.cc:1489 #, c-format msgid "%s has been kicked by %s" msgstr "%s беше изритан от %s." #: src/hooks/irchook.cc:1518 #, c-format msgid "Channel topic now is: %s" msgstr "Темата на канала е: %s " #: src/hooks/irchook.cc:1523 #, c-format msgid "set by %s" msgstr "автор - %s" #: src/hooks/irchook.cc:1541 #, c-format msgid "%s has been opped by %s." msgstr "%s беше назначен за оператор от %s." #: src/hooks/irchook.cc:1557 #, c-format msgid "%s has been deopped by %s." msgstr "%s вече не е оператор, Ñвален от %s." #: src/hooks/irchook.cc:1571 #, c-format msgid "%s has opped us." msgstr "%s ни даде операторÑки права." #: src/hooks/irchook.cc:1572 #, c-format msgid "you are an op here" msgstr "Ти Ñи оператор тук" #: src/hooks/irchook.cc:1585 #, c-format msgid "%s has deopped us." msgstr "%s ни взе операторÑките права" #: src/hooks/ljhook.cc:416 src/hooks/ljhook.cc:741 msgid "+ [lj] user lookup finished" msgstr "+ [li] търÑенето на потребител завърши" #: src/hooks/ljhook.cc:511 msgid "cannot connect" msgstr "невъзможна връзка" #: src/hooks/ljhook.cc:512 #, c-format msgid "+ [lj] HTTP failed: %s" msgstr "+ [li] невъзможна връзка чрез HTTP: %s" #: src/hooks/ljhook.cc:567 msgid "Message from the server: " msgstr "Съобщение от Ñървъра:" #: src/hooks/ljhook.cc:572 #, c-format msgid "+ [lj] login failed: %s" msgstr "+ [lj] невъзможно влизане: %s" #: src/hooks/ljhook.cc:576 #, c-format msgid "+ [lj] posted successully, the id is %s" msgstr "+ [lj] изпратено уÑпешно, id: %s" #: src/hooks/ljhook.cc:578 #, c-format msgid "+ [lj] post error: %s" msgstr "+ [lj] грешка: %s" #: src/hooks/ljhook.cc:677 #, c-format msgid "" "The user %s (%s) has added you to his/her friend list\n" "\n" "Journal address: %s" msgstr "" "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s (%s) те добави към нейниÑ/Ð½ÐµÐ³Ð¾Ð²Ð¸Ñ ÑпиÑък\n" "\n" "Журнал адреÑ: %s" #: src/hooks/ljhook.cc:687 #, c-format msgid "" "The user %s has removed you from his/her friend list\n" "\n" "Journal address: %s" msgstr "" "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s те e премахнал от ÑпиÑъка Ñи Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸. \n" "\n" "Журнал адреÑ: %s" #: src/hooks/ljhook.cc:713 msgid "+ [lj] error deleting friend" msgstr "+ [lj] грешка при изтриването" #: src/hooks/ljhook.cc:715 msgid "+ [lj] the user has been removed from your friend list" msgstr "+ [lj] Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð±ÐµÑˆÐµ изтрит от Ñ‚Ð²Ð¾Ñ ÑпиÑък" #: src/hooks/ljhook.cc:720 msgid "+ [lj] couldn't add friend" msgstr "+ [lj] невъзможно добавÑне" #: src/hooks/ljhook.cc:722 #, c-format msgid "+ [lj] %s was added to friends" msgstr "+ [lj] %s бе добавен в ÑпиÑъка" #: src/hooks/msnhook.cc:430 #, c-format msgid "+ [msn] reverse users listing finished, %d found" msgstr "+ [msn] обратен потребителÑки ÑпиÑък завършен, %d намерени" #: src/hooks/msnhook.cc:793 #, c-format msgid "+ [msn] unread e-mail: %d in inbox, %d in folders" msgstr "+ [msn] непрочетена поща: %d в inbox, %d в други папки" #: src/hooks/msnhook.cc:799 #, c-format msgid "+ [msn] e-mail from %s, %s" msgstr "+ [msn] поща от %s, %s" #: src/hooks/msnhook.cc:905 msgid "+ [msn] cannot connect: " msgstr "+ [msn] невъзможна връзка:" #: src/hooks/msnhook.cc:929 msgid "verify the hostname and port" msgstr "проверка на хоÑта и порта" #: src/hooks/abstracthook.cc:355 msgid "connecting to the server" msgstr "връзка ÑÑŠÑ Ñървъра" #: src/hooks/abstracthook.cc:356 msgid "logged in" msgstr "влизането уÑпешно" #: src/hooks/abstracthook.cc:357 #, c-format msgid "search finished, %d found" msgstr "търÑенето завърши, %d намерени" #: src/hooks/abstracthook.cc:358 msgid "password was changed successfully" msgstr "паролата беше Ñменена уÑпешно" #: src/hooks/abstracthook.cc:359 msgid "disconnected" msgstr "изключване" #: src/hooks/abstracthook.cc:360 #, c-format msgid "adding %s to the contacts" msgstr "добавÑне на %s към контактите" #: src/hooks/abstracthook.cc:361 #, c-format msgid "removing %s from the contacts" msgstr "изтриване на %s от контактите" #: src/hooks/abstracthook.cc:362 #, c-format msgid "members list fetching finished, %d found" msgstr "изтеглÑнето на ÑпиÑъка Ñвърши, %d намерени" #: src/icqcontact.cc:825 msgid "The user has a birthday today" msgstr "ÐŸÐ¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð¼Ð° рожден ден днеÑ" #: src/icqcontact.cc:853 msgid "Jan" msgstr "Януари" #: src/icqcontact.cc:853 msgid "Feb" msgstr "Февруари" #: src/icqcontact.cc:853 msgid "Mar" msgstr "Март" #: src/icqcontact.cc:853 msgid "Apr" msgstr "Ðприл" #: src/icqcontact.cc:854 msgid "May" msgstr "Май" #: src/icqcontact.cc:854 msgid "Jun" msgstr "Юни" #: src/icqcontact.cc:854 msgid "Jul" msgstr "Юли" #: src/icqcontact.cc:854 msgid "Aug" msgstr "ÐвгуÑÑ‚" #: src/icqcontact.cc:855 msgid "Sep" msgstr "Септември" #: src/icqcontact.cc:855 msgid "Oct" msgstr "Октомври" #: src/icqcontact.cc:855 msgid "Nov" msgstr "Ðоември" #: src/icqcontact.cc:855 msgid "Dec" msgstr "Декември" #: src/icqgroups.cc:66 msgid "General" msgstr "Общи" #: src/eventmanager.cc:124 #, c-format msgid "event from %s (%s)" msgstr "получетно от %s (%s)" #: src/icqdialogs.cc:49 msgid "60-above" msgstr "60 и нагоре" #: src/icqdialogs.cc:50 msgid "unknown" msgstr "неизвеÑтнo" #: src/icqdialogs.cc:58 msgid "General Chat" msgstr "Общ чат" #: src/icqdialogs.cc:59 msgid "Romance" msgstr "Романтика" #: src/icqdialogs.cc:60 msgid "Games" msgstr "Игри" #: src/icqdialogs.cc:61 msgid "Students" msgstr "Студенти" #: src/icqdialogs.cc:62 msgid "20 Something" msgstr "20 и нещо" #: src/icqdialogs.cc:63 msgid "30 Something" msgstr "30 и нещо" #: src/icqdialogs.cc:64 msgid "40 Something" msgstr "40 и нещо" #: src/icqdialogs.cc:65 msgid "50 Plus" msgstr "50 и нагоре" #: src/icqdialogs.cc:66 msgid "Seeking Women" msgstr "ТърÑене на жени" #: src/icqdialogs.cc:67 msgid "Seeking Men" msgstr "ТърÑене на мъже" #: src/icqdialogs.cc:75 msgid "Status and Activity" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸ ДейноÑÑ‚" #: src/icqdialogs.cc:76 msgid "Status and Name" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸ Име" #: src/icqdialogs.cc:77 msgid "Activity" msgstr "ДейноÑÑ‚" #: src/icqdialogs.cc:78 src/icqface.cc:1074 src/icqface.cc:1130 msgid "Name" msgstr "Име" #: src/icqdialogs.cc:114 msgid " Search profiles " msgstr " ТърÑене на профили" #: src/icqdialogs.cc:120 src/icqdialogs.cc:1057 src/icqdialogs.cc:1826 #: src/icqface.cc:1940 src/icqface.cc:2639 msgid "Remove" msgstr "Изтриване" #: src/icqdialogs.cc:120 msgid "Load" msgstr "Зареждане" #: src/icqdialogs.cc:205 msgid "+ you must be logged in first" msgstr "+ първо трÑбва да влезеш" #: src/icqdialogs.cc:229 msgid "lOad" msgstr "Зареждане" #: src/icqdialogs.cc:229 msgid "sAve" msgstr "ЗапиÑ" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 msgid "cLear" msgstr "ИзчиÑтване" #: src/icqdialogs.cc:229 src/icqdialogs.cc:234 src/icqdialogs.cc:239 #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:2040 #: src/accountmanager.cc:69 src/imcontroller.cc:72 src/imotr.cc:445 msgid "Change" msgstr "СмÑна" #: src/icqdialogs.cc:229 msgid "Search/Add" msgstr "ТърÑене/ДобавÑне" #: src/icqdialogs.cc:234 msgid "Join/Create" msgstr "Влез/Създай" #: src/icqdialogs.cc:239 msgid "lInk" msgstr "Добави" #: src/icqdialogs.cc:248 msgid " Find/add user(s) " msgstr " Ðамери/добави потребител" #: src/icqdialogs.cc:249 msgid " Join/create a channel/conference " msgstr " Влез/Ñъздай чат" #: src/icqdialogs.cc:250 msgid " Link an RSS feed " msgstr " ДобавÑне на RSS feed" #: src/icqdialogs.cc:299 msgid " Network " msgstr " Мрежа" #: src/icqdialogs.cc:307 msgid " UIN " msgstr " UIN (ICQ#)" #: src/icqdialogs.cc:311 src/icqdialogs.cc:397 src/icqdialogs.cc:413 #: src/imcontroller.cc:80 src/imcontroller.cc:92 msgid " Details " msgstr " Детайли" #: src/icqdialogs.cc:312 src/icqdialogs.cc:617 src/imcontroller.cc:81 #, c-format msgid " Nickname : %s " msgstr " ПрÑкор : %s " #: src/icqdialogs.cc:315 src/icqdialogs.cc:404 src/imcontroller.cc:83 #, c-format msgid " E-Mail : %s " msgstr " Поща : %s " #: src/icqdialogs.cc:318 src/icqdialogs.cc:631 src/icqdialogs.cc:690 #: src/imcontroller.cc:84 #, c-format msgid " First name : %s " msgstr " Име : %s " #: src/icqdialogs.cc:319 src/icqdialogs.cc:632 src/icqdialogs.cc:691 #: src/imcontroller.cc:85 #, c-format msgid " Last name : %s " msgstr " Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ : %s " #: src/icqdialogs.cc:322 src/icqdialogs.cc:421 #, c-format msgid " Age range : %s " msgstr " ВъзраÑтова група : %s " #: src/icqdialogs.cc:325 src/icqdialogs.cc:420 src/icqdialogs.cc:635 #: src/icqdialogs.cc:693 #, c-format msgid " Gender : %s " msgstr " Пол : %s " #: src/icqdialogs.cc:328 #, c-format msgid " Language : %s " msgstr " Език : %s " #: src/icqdialogs.cc:332 msgid " Location " msgstr " МеÑтонахождение" #: src/icqdialogs.cc:333 src/icqdialogs.cc:640 src/icqdialogs.cc:652 #: src/icqdialogs.cc:692 #, c-format msgid " City : %s " msgstr " Град : %s " #: src/icqdialogs.cc:336 src/icqdialogs.cc:641 src/icqdialogs.cc:653 #, c-format msgid " State : %s " msgstr " Щат/ÐŸÑ€Ð¾Ð²Ð¸Ð½Ñ†Ð¸Ñ : %s " #: src/icqdialogs.cc:337 src/icqdialogs.cc:642 src/icqdialogs.cc:654 #, c-format msgid " Country : %s " msgstr " Държава : %s " #: src/icqdialogs.cc:340 src/icqdialogs.cc:651 msgid " Work " msgstr " Работа " #: src/icqdialogs.cc:341 src/icqdialogs.cc:659 #, c-format msgid " Company : %s " msgstr " ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ : %s " #: src/icqdialogs.cc:342 src/icqdialogs.cc:660 #, c-format msgid " Department : %s " msgstr " Отдел : %s " #: src/icqdialogs.cc:343 src/icqdialogs.cc:661 #, c-format msgid " Position : %s " msgstr " ДлъжноÑÑ‚ : %s " #: src/icqdialogs.cc:346 msgid " Online only " msgstr " Само онлайн" #: src/icqdialogs.cc:352 msgid " Random chat group " msgstr " Произволна група за чат" #: src/icqdialogs.cc:357 msgid " Keywords " msgstr " Ключови думи" #: src/icqdialogs.cc:366 msgid " Nickname " msgstr " ПрÑкор" #: src/icqdialogs.cc:372 msgid " Search service " msgstr " УÑлуга за търÑене" #: src/icqdialogs.cc:375 msgid " Search parameters " msgstr " Параметри за търÑене" #: src/icqdialogs.cc:391 src/icqdialogs.cc:702 msgid " Feed Parameters " msgstr " Параметри на подпиÑа" #: src/icqdialogs.cc:392 src/icqdialogs.cc:703 #, c-format msgid " XML export URL : %s " msgstr " ÐÐ´Ñ€ÐµÑ XML екÑпорт : %s " #: src/icqdialogs.cc:393 src/icqdialogs.cc:704 #, c-format msgid " Check frequency (minutes) : %lu " msgstr " ЧеÑтота на проверката (минути) : %lu " #: src/icqdialogs.cc:398 #, c-format msgid " Channel : %s " msgstr " Канал : %s " #: src/icqdialogs.cc:401 src/icqdialogs.cc:415 #, c-format msgid " Name : %s " msgstr " Име : %s " #: src/icqdialogs.cc:407 msgid " Joined since the last check only " msgstr " Влизали Ñамо преди поÑледната проверка" #: src/icqdialogs.cc:416 #, c-format msgid " Keywords : %s " msgstr " Ключови думи %s" #: src/icqdialogs.cc:418 src/icqdialogs.cc:2070 msgid " Options " msgstr " Опции" #: src/icqdialogs.cc:422 #, c-format msgid " Users with photos only : %s " msgstr " Само потребители ÑÑŠÑ Ñнимки: %s " #: src/icqdialogs.cc:423 #, c-format msgid " Look for online only : %s " msgstr " ТърÑи Ñамо онлайн потребители: %s" #: src/icqdialogs.cc:428 msgid " Show users who have you on their list " msgstr " Покажи потребителите, които Ñа те включили в техните ÑпиÑъци" #: src/icqdialogs.cc:433 msgid " Name/Title " msgstr " Ðазвание" #: src/icqdialogs.cc:438 src/imcontroller.cc:87 msgid " Password " msgstr " Парола" #: src/icqdialogs.cc:443 msgid " Service " msgstr " УÑлуга" #: src/icqdialogs.cc:472 msgid "New profile name: " msgstr "Ðово име на профила: " #: src/icqdialogs.cc:476 msgid "The profile with this name already exists. Do you want to overwrite it?" msgstr "Профил Ñ Ñ‚Ð°ÐºÐ¾Ð²Ð° име вече ÑъщеÑтвува. ИÑкаш ли да го презапишеш?" #: src/icqdialogs.cc:503 msgid "UIN: " msgstr "UIN: " #: src/icqdialogs.cc:504 src/icqdialogs.cc:780 msgid "Nickname: " msgstr "ПрÑкор: " #: src/icqdialogs.cc:504 msgid "Name/Title: " msgstr "Заглавие" #: src/icqdialogs.cc:505 src/imcontroller.cc:105 msgid "E-Mail: " msgstr "Поща: " #: src/icqdialogs.cc:506 src/icqdialogs.cc:789 src/imcontroller.cc:106 msgid "First name: " msgstr "Име: " #: src/icqdialogs.cc:507 src/icqdialogs.cc:790 src/imcontroller.cc:107 msgid "Last name: " msgstr "ФамилиÑ: " #: src/icqdialogs.cc:512 src/icqdialogs.cc:822 src/icqdialogs.cc:831 msgid "City: " msgstr "Град: " #: src/icqdialogs.cc:513 src/icqdialogs.cc:823 src/icqdialogs.cc:832 msgid "State: " msgstr "Щат/ПровинциÑ: " #: src/icqdialogs.cc:515 src/icqdialogs.cc:835 msgid "Company: " msgstr "КомпаниÑ: " #: src/icqdialogs.cc:516 src/icqdialogs.cc:836 msgid "Department: " msgstr "Отдел: " #: src/icqdialogs.cc:517 src/icqdialogs.cc:837 msgid "Position: " msgstr "ДлъжноÑÑ‚: " #: src/icqdialogs.cc:519 msgid "Channel: " msgstr "Канал: " #: src/icqdialogs.cc:520 msgid "Name: " msgstr "Име: " #: src/icqdialogs.cc:522 msgid "Keywords: " msgstr "Ключови думи: " #: src/icqdialogs.cc:532 src/imcontroller.cc:102 msgid "Password: " msgstr "Парола: " #: src/icqdialogs.cc:533 src/icqdialogs.cc:875 msgid "URL: " msgstr "Връзка(Уеб Страница): " #: src/icqdialogs.cc:534 src/icqdialogs.cc:876 msgid "Check frequency: " msgstr "ЧеÑтота за проверка: " #: src/icqdialogs.cc:546 msgid "Wrong Jabber ID!" msgstr "Грешно Jabber ID!" #: src/icqdialogs.cc:560 src/icqdialogs.cc:2051 msgid " General " msgstr " Общи" #: src/icqdialogs.cc:595 msgid " Registration service " msgstr " УÑлуга за региÑтриране" #: src/icqdialogs.cc:599 msgid " Registration parameters " msgstr " Параметри за региÑтриране" #: src/icqdialogs.cc:622 #, c-format msgid " Change password : %s " msgstr " СмÑна на паролата : %s " #: src/icqdialogs.cc:633 #, c-format msgid " E-mail : %s " msgstr " Поща: %s" #: src/icqdialogs.cc:636 #, c-format msgid " Birthdate : %s " msgstr " Рожден ден : %s " #: src/icqdialogs.cc:637 #, c-format msgid " Age : %s " msgstr " Години : %s " #: src/icqdialogs.cc:639 msgid " Home " msgstr " Дом" #: src/icqdialogs.cc:645 src/icqdialogs.cc:657 #, c-format msgid " Street address : %s " msgstr " ÐÐ´Ñ€ÐµÑ : %s " #: src/icqdialogs.cc:646 src/icqdialogs.cc:658 #, c-format msgid " Zip code : %s " msgstr " ПощенÑки код : %s " #: src/icqdialogs.cc:647 src/icqdialogs.cc:663 #, c-format msgid " Phone : %s " msgstr " Телефон : %s " #: src/icqdialogs.cc:648 src/icqdialogs.cc:664 #, c-format msgid " Fax : %s " msgstr " Ð¤Ð°ÐºÑ : %s " #: src/icqdialogs.cc:649 #, c-format msgid " Cellular phone : %s " msgstr " Мобилен телефон : %s " #: src/icqdialogs.cc:662 src/icqdialogs.cc:667 #, c-format msgid " Homepage : %s " msgstr " Страница : %s " #: src/icqdialogs.cc:666 msgid " More " msgstr " Още" #: src/icqdialogs.cc:670 #, c-format msgid " 1st language : %s " msgstr " 1ви език : %s " #: src/icqdialogs.cc:673 #, c-format msgid " 2nd language : %s " msgstr " 2ри език : %s " #: src/icqdialogs.cc:676 #, c-format msgid " 3rd language : %s " msgstr " 3ти език : %s " #: src/icqdialogs.cc:679 src/icqdialogs.cc:697 msgid " Miscellaneous " msgstr " Други" #: src/icqdialogs.cc:681 #, c-format msgid " Enable web status indicator : %s " msgstr " Вкючване на web индикатор : %s " #: src/icqdialogs.cc:682 #, c-format msgid " Random chat group : %s " msgstr " Произволна чат група : %s " #: src/icqdialogs.cc:684 #, c-format msgid " Authorization required : %s " msgstr " Ðеобходима е Ð°ÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : %s " #: src/icqdialogs.cc:698 #, c-format msgid " Avatar file : %s " msgstr " Ðватар : %s " #: src/icqdialogs.cc:709 msgid " About " msgstr " ОтноÑно" #: src/icqdialogs.cc:727 msgid "Fetching your details" msgstr "ИзтеглÑне на твоите детайли" #: src/icqdialogs.cc:741 #, c-format msgid " Your %s details " msgstr " Твоите %s детайли" #: src/icqdialogs.cc:744 #, c-format msgid " %s: details " msgstr " %s: детайли " #: src/icqdialogs.cc:757 src/icqdialogs.cc:1207 src/icqdialogs.cc:1705 #: src/accountmanager.cc:69 src/imotr.cc:445 msgid "Done" msgstr "Готово" #: src/icqdialogs.cc:775 msgid "Wait a moment. Your details haven't been fetched yet" msgstr "Изчакайте един момент. ИнформациÑта още не е изтеглена." #: src/icqdialogs.cc:791 msgid "E-mail: " msgstr "Поща:" #: src/icqdialogs.cc:802 msgid "Enter birthdate (DD-MM-YYYY): " msgstr "Дата на раждане (DD-MM-YYYY): " #: src/icqdialogs.cc:820 msgid "Age: " msgstr "Години:" #: src/icqdialogs.cc:825 src/icqdialogs.cc:834 msgid "Street address: " msgstr "ÐдреÑ: " #: src/icqdialogs.cc:826 src/icqdialogs.cc:850 msgid "Zip code: " msgstr "ПощенÑки код: " #: src/icqdialogs.cc:827 src/icqdialogs.cc:839 msgid "Phone: " msgstr "Телефон: " #: src/icqdialogs.cc:828 src/icqdialogs.cc:840 msgid "Fax: " msgstr "ФакÑ: " #: src/icqdialogs.cc:829 msgid "Cellular phone: " msgstr "Мобилен телефон: " #: src/icqdialogs.cc:838 src/icqdialogs.cc:842 msgid "Homepage: " msgstr "Страница: " #: src/icqdialogs.cc:848 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1472 msgid "About" msgstr "ОтноÑно" #: src/icqdialogs.cc:869 msgid "New password: " msgstr "Ðова парола:" #: src/icqdialogs.cc:872 msgid "Check the new password: " msgstr "Провери новата парола:" #: src/icqdialogs.cc:877 msgid "Avatar file: " msgstr "Ðватар:" #: src/icqdialogs.cc:951 src/icqdialogs.cc:989 msgid "none" msgstr "нÑма" #: src/icqdialogs.cc:1007 msgid " [Ctrl-X save, Esc cancel] " msgstr " [Ctrl-X запиÑ, Esc отмÑна] " #: src/icqdialogs.cc:1047 #, c-format msgid " Send file(s) to %s, %lu " msgstr " Изпращане на файл(ове) на %s, %lu" #: src/icqdialogs.cc:1057 src/icqdialogs.cc:1704 src/icqface.cc:69 #: src/icqface.cc:906 src/icqface.cc:909 src/icqface.cc:1940 #: src/icqface.cc:2639 msgid "Add" msgstr "Добави" #: src/icqdialogs.cc:1057 msgid "Comment" msgstr "Коментар" #: src/icqdialogs.cc:1057 src/icqface.cc:2639 msgid "Send" msgstr "Изпрати" #: src/icqdialogs.cc:1067 msgid " Files " msgstr " Файлове" #: src/icqdialogs.cc:1068 msgid " Comment " msgstr " Коментар" #: src/icqdialogs.cc:1080 msgid "filename: " msgstr "име на файл: " #: src/icqdialogs.cc:1087 msgid "comment: " msgstr "коментар: " #: src/icqdialogs.cc:1163 msgid "None" msgstr "ÐÑма" #: src/icqdialogs.cc:1164 msgid "Russian" msgstr "РуÑки" #: src/icqdialogs.cc:1165 msgid "Polish" msgstr "Публикувай" #: src/icqdialogs.cc:1166 msgid "German UTF-8" msgstr "ÐемÑки UTF-8" #: src/icqdialogs.cc:1198 msgid " CenterIM configuration " msgstr " ÐаÑтройки на CenterIM" #: src/icqdialogs.cc:1218 msgid " User interface " msgstr " ПотребителÑки интерфейÑ" #: src/icqdialogs.cc:1219 #, c-format msgid " Change sound device to : %s " msgstr " ПромÑна на звуковото уÑтройÑтво : %s " #: src/icqdialogs.cc:1220 #, c-format msgid " Change color scheme to : %s " msgstr " ПромÑна на цветовата Ñхема : %s " #: src/icqdialogs.cc:1221 msgid " Change default request authorization message " msgstr " Смени Ñъобщението за иÑкане на ауторизациÑ" #: src/icqdialogs.cc:1222 #, c-format msgid " Left panel width : %d " msgstr " Широчина на Ð»ÐµÐ²Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»: %d" #: src/icqdialogs.cc:1223 #, c-format msgid " Log panel height : %d " msgstr " ВиÑочина на лог-панела %d" #: src/icqdialogs.cc:1224 #, c-format msgid " Chat panel height : %d " msgstr " ВиÑочина на чат-панела %d" #: src/icqdialogs.cc:1225 #, c-format msgid " Show opened chats : %s " msgstr " Покажи отворените чатове: %s " #: src/icqdialogs.cc:1228 #, c-format msgid " Enable bidirectional languages support : %s " msgstr " Използване на двупоÑочен език : %s " #: src/icqdialogs.cc:1230 #, c-format msgid " Enable emacs bindings in text editor : %s " msgstr " Включи emacs редактора : %s " #: src/icqdialogs.cc:1231 #, c-format msgid " Enable vi bindings: %s " msgstr " Включи vi редактора : %s " #: src/icqdialogs.cc:1232 #, c-format msgid " Ask before quit : %s " msgstr " Попитай преди изключване: %s" #: src/icqdialogs.cc:1234 msgid " Codepages conversion " msgstr " Преобразуване на Ñтраниците за кодиране" #: src/icqdialogs.cc:1241 #, c-format msgid " Switch to language preset : %s " msgstr " Превключи на предефинирани наÑтройки за език: %s " #: src/icqdialogs.cc:1242 #, c-format msgid " Remote charset : %s " msgstr " Външен енкодинг: %s " #: src/icqdialogs.cc:1243 #, c-format msgid " Local charset : %s " msgstr " Локален енкодинг: %s " #: src/icqdialogs.cc:1246 #, c-format msgid " For protocols : %s" msgstr " За протоколи: %s" #: src/icqdialogs.cc:1249 msgid " Contact list " msgstr " СпиÑък Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸" #: src/icqdialogs.cc:1250 #, c-format msgid " Arrange contacts into groups : %s " msgstr " Подреди контактите в групи : %s " #: src/icqdialogs.cc:1251 #, c-format msgid " Sort contacts by : %s " msgstr " Сортирай контактите по: %s " #: src/icqdialogs.cc:1252 #, c-format msgid " Hide offline users : %s " msgstr " Скрий вÑички офлайн потребители : %s" #: src/icqdialogs.cc:1253 #, c-format msgid " Anti-spam: kill msgs from users not on the list : %s " msgstr "" " Anti-spam: Ðе приемай ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ потребители, които не Ñа в ÑпиÑъка: %s " #: src/icqdialogs.cc:1254 #, c-format msgid " Anti-spam: ignore authorization requests: %s " msgstr " Anti-spam: игнорирай иÑÐºÐ°Ð½Ð¸Ñ Ð·Ð° Ð°ÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ %s" #: src/icqdialogs.cc:1255 #, c-format msgid " Anti-spam: use captcha to identify bots: %s " msgstr " Anti-spam: използвай captcha, за да откриваш ботове: %s" #: src/icqdialogs.cc:1256 #, c-format msgid " Quote a message on reply : %s " msgstr " Цитирай Ñъобщение при отговор : %s " #: src/icqdialogs.cc:1257 #, c-format msgid " Check the local mailbox : %s " msgstr " ПроверÑвай локалната поща : %s " #: src/icqdialogs.cc:1258 #, c-format msgid " Remember passwords : %s " msgstr " Запомни паролите : %s " #: src/icqdialogs.cc:1259 #, c-format msgid " Edit away message on status change : %s " msgstr " ПроменÑй Ñъобщението за отÑÑŠÑтвие при промÑна на ÑтатуÑа: %s " #: src/icqdialogs.cc:1266 #, c-format msgid " Chat messaging mode for : %s" msgstr " Чат режим за : %s " #: src/icqdialogs.cc:1272 #, c-format msgid " Enter key sends message for : %s" msgstr " Изпращай Ñъобщение Ñ enter за: %s" #: src/icqdialogs.cc:1275 #, c-format msgid " Chat messaging mode : %s " msgstr " Чат режим при ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ : %s " #: src/icqdialogs.cc:1276 #, c-format msgid " Enter key sends message : %s " msgstr " Клавишът Enter изпраща ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ : %s" #: src/icqdialogs.cc:1283 #, c-format msgid " Always online non-IM contacts for : %s" msgstr " Винаги онлайн не-IM контакти за: %s" #: src/icqdialogs.cc:1284 #, c-format msgid " Color contacts according to: %s " msgstr " Оцвети контактите Ñпоред: %s " #: src/icqdialogs.cc:1286 msgid " Communications " msgstr " Комуникации" #: src/icqdialogs.cc:1287 #, c-format msgid " SMTP server : %s " msgstr " SMTP Ñървър : %s " #: src/icqdialogs.cc:1288 #, c-format msgid " HTTP browser : %s " msgstr " HTTP броузър: %s " #: src/icqdialogs.cc:1289 #, c-format msgid " HTTP proxy server : %s " msgstr " HTTP прокÑи Ñървър : %s " #: src/icqdialogs.cc:1292 #, c-format msgid " Proxy only for HTTP (rss and lj) : %s " msgstr " ПрокÑи Ñамо за HTTP (при rss и lj): %s" #: src/icqdialogs.cc:1294 #, c-format msgid " Enable peer-to-peer communications : %s " msgstr " Включи Ñвързване между клиенти (p2p) : %s " #: src/icqdialogs.cc:1297 #, c-format msgid " Port range to use for peer-to-peer : %s " msgstr " Диапазон за портовете (p2p) : %s " #: src/icqdialogs.cc:1299 msgid " Logging " msgstr " Журнал" #: src/icqdialogs.cc:1300 #, c-format msgid " Timestamps in the log window : %s " msgstr " Дата и време при Ð·Ð°Ð¿Ð¸Ñ Ð² журнала : %s " #: src/icqdialogs.cc:1301 #, c-format msgid " Timestamps include seconds : %s " msgstr " Журнала показва и Ñекунди: %s" #: src/icqdialogs.cc:1302 #, c-format msgid " Online/offline events in the log window : %s " msgstr " ВходÑщи/изходÑщи ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð² журнала : %s " #: src/icqdialogs.cc:1303 #, c-format msgid " Detailed IM events log in ~/.centerim/log : %s " msgstr " Подробен журнал в ~/.centerim/log : %s " #: src/icqdialogs.cc:1305 msgid " Auto Presence Status " msgstr " Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·Ð° автоматично приÑÑŠÑтвие" #: src/icqdialogs.cc:1306 #, c-format msgid " Automatically set Away period (min) : %d " msgstr " Ðвтоматично към 'нÑма ме' Ñлед (мин) : %d " #: src/icqdialogs.cc:1307 #, c-format msgid " Automatically set N/A period (min) : %d " msgstr " Ðвтоматично към N/A Ñлед (мин) : %d " #: src/icqdialogs.cc:1309 #, c-format msgid " Use X to report idle time : %s " msgstr " Използвай X за да Ñъобщаваш времето за бездейÑтвие: %s" #: src/icqdialogs.cc:1311 #, c-format msgid " Automatically set N/A when screen is detached : %s " msgstr " Ðвтоматично към N/A, когато screen-a e откачен: %s" #: src/icqdialogs.cc:1313 #, c-format msgid " Screen socket path : %s " msgstr " Път към адреÑа на Ñокета: %s " #: src/icqdialogs.cc:1340 msgid "Auto Away period (0 - disable): " msgstr "'ÐÑма ме' Ñлед (0 - изключено): " #: src/icqdialogs.cc:1344 msgid "Auto N/A period (0 - disable): " msgstr "Ðвто N/A Ñлед (0 - изключено): " #: src/icqdialogs.cc:1370 msgid "SMTP server hostname: " msgstr "Име на SMTP Ñървъра: " #: src/icqdialogs.cc:1380 msgid "Peer-to-peer port range (min-max): " msgstr "Диапазон на портовете за прÑка връзка (p2p) (мин-макÑ): " #: src/icqdialogs.cc:1394 msgid "HTTP proxy server hostname: " msgstr "Име на HTTP прокÑи Ñървъра: " #: src/icqdialogs.cc:1432 msgid "Charset to convert messages from: " msgstr "Енкодинг за да преобразуваш ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚:" #: src/icqdialogs.cc:1436 msgid "Charset to convert messages to: " msgstr "Енкодинг да преобразуваш ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÑŠÐ¼: " #: src/icqdialogs.cc:1446 msgid "HTTP browser to use: " msgstr "Име на HTTP броузър:" #: src/icqdialogs.cc:1450 msgid "Left panel width: " msgstr "Широчина на Ð»ÐµÐ²Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»:" #: src/icqdialogs.cc:1455 msgid "Log panel height: " msgstr "ВиÑочина на лог-панела:" #: src/icqdialogs.cc:1460 msgid "Chat panel height: " msgstr "ВиÑочина на чат-панела:" #: src/icqdialogs.cc:1465 msgid "Default authorization request message: " msgstr "Съобщение за иÑкане на ауторизациÑ" #: src/icqdialogs.cc:1475 msgid "Screen socket path: " msgstr "Път към Ñокета на screen:" #: src/icqdialogs.cc:1477 msgid "Choosen screen socket path doesn't exist!" msgstr "Ð˜Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð¿ÑŠÑ‚ към Ñокета на screen не ÑъщеÑтвува!" #: src/icqdialogs.cc:1668 msgid "Your details have been fetched" msgstr "ИнформациÑта е получена уÑпешно" #: src/icqdialogs.cc:1680 msgid "Organize contact groups" msgstr "Управление на контактните групи" #: src/icqdialogs.cc:1704 msgid "Rename" msgstr "Преименувай" #: src/icqdialogs.cc:1704 msgid "rEmove" msgstr "Изтрий" #: src/icqdialogs.cc:1704 msgid "move Up" msgstr "ПремеÑти нагоре" #: src/icqdialogs.cc:1704 msgid "move Down" msgstr "ПремеÑти надолу" #: src/icqdialogs.cc:1705 src/icqdialogs.cc:2218 msgid "Select" msgstr "Избери" #: src/icqdialogs.cc:1720 msgid " Groups " msgstr " Групи" #: src/icqdialogs.cc:1735 msgid "Name for a group to be created: " msgstr "Име на групата, коÑто иÑкаш да Ñъздадеш:" #: src/icqdialogs.cc:1745 msgid "New name for the group: " msgstr "Ðово име на групата:" #: src/icqdialogs.cc:1760 msgid "Are you sure want to remove the group?" msgstr "Сигурен ли Ñи, че иÑкаш да изтриеш групата ?" #: src/icqdialogs.cc:1817 msgid "File transfer status" msgstr "Монитор за транÑфер на файлове" #: src/icqdialogs.cc:1826 msgid "Cancel" msgstr "Отказ" #: src/icqdialogs.cc:1855 #, c-format msgid " Incoming from %s " msgstr " Идващ от %s " #: src/icqdialogs.cc:1857 #, c-format msgid " Outgoing to %s " msgstr " Заминаващ към %s " #: src/icqdialogs.cc:1865 msgid "init" msgstr "връзка" #: src/icqdialogs.cc:1866 msgid "start" msgstr "Ñтарт" #: src/icqdialogs.cc:1867 msgid "work" msgstr "прогреÑ" #: src/icqdialogs.cc:1868 msgid "done" msgstr "готово" #: src/icqdialogs.cc:1869 msgid "err" msgstr "грешка" #: src/icqdialogs.cc:1870 msgid "abort" msgstr "отказ" #: src/icqdialogs.cc:1877 msgid " of " msgstr " от" #: src/icqdialogs.cc:1910 msgid "Cannot remove a transfer which is in progress now" msgstr "ТранÑфера не може да Ñе премахне, когато е вÑе още в прогреÑ" #: src/icqdialogs.cc:2021 msgid "public (visible to all)" msgstr "доÑтъпно (видимо за вÑички)" #: src/icqdialogs.cc:2023 msgid "private" msgstr "чаÑтно" #: src/icqdialogs.cc:2025 msgid "friends only" msgstr "Ñамо за приÑтели" #: src/icqdialogs.cc:2032 msgid " LiveJournal posting: attributes " msgstr " LiveJournal поÑтинг: атрибути" #: src/icqdialogs.cc:2040 msgid "Detect music" msgstr "Открий музика" #: src/icqdialogs.cc:2040 msgid "Post" msgstr "Публикувай" #: src/icqdialogs.cc:2040 msgid "cAncel" msgstr "Отказ" #: src/icqdialogs.cc:2052 #, c-format msgid " Post to journal : %s " msgstr " Публикувай към журнал : %s " #: src/icqdialogs.cc:2053 #, c-format msgid " Subject : %s " msgstr " Тема : %s " #: src/icqdialogs.cc:2058 #, c-format msgid " Security : %s " msgstr " СигурноÑÑ‚ : %s " #: src/icqdialogs.cc:2060 msgid " Fancy stuff " msgstr " Смешни нещица" #: src/icqdialogs.cc:2063 #, c-format msgid " Mood : %s " msgstr " ÐаÑтроение : %s " #: src/icqdialogs.cc:2063 src/icqdialogs.cc:2090 msgid "(none/custom)" msgstr "(нÑма)" #: src/icqdialogs.cc:2064 #, c-format msgid " Custom mood : %s " msgstr " СобÑтвено наÑтроение : %s " #: src/icqdialogs.cc:2066 #, c-format msgid " Music : %s " msgstr " Музика : %s " #: src/icqdialogs.cc:2067 #, c-format msgid " Picture : %s " msgstr " Картинка : %s " #: src/icqdialogs.cc:2067 src/icqdialogs.cc:2092 msgid "(default)" msgstr "по подразбиране" #: src/icqdialogs.cc:2068 #, c-format msgid " Tags : %s " msgstr " Тагове : %s " #: src/icqdialogs.cc:2071 #, c-format msgid " Disable auto-formatting : %s " msgstr " Изключи автоматичното форматиране : %s " #: src/icqdialogs.cc:2072 #, c-format msgid " Disable sending comments by e-mail : %s " msgstr " Изключи изпращането на коментари по пощата : %s" #: src/icqdialogs.cc:2073 #, c-format msgid " Disallow comments : %s " msgstr " Забрани коментарите : %s " #: src/icqdialogs.cc:2074 #, c-format msgid " Backdated entry : %s " msgstr " Предишен Ð·Ð°Ð¿Ð¸Ñ : %s " #: src/icqdialogs.cc:2082 msgid "Posting subject: " msgstr "Тема на поÑтинга:" #: src/icqdialogs.cc:2091 msgid "Currently playing: " msgstr "Ð’ момента Ñвири: " #: src/icqdialogs.cc:2093 msgid "Current mood: " msgstr "ÐаÑтроение в момента: " #: src/icqdialogs.cc:2094 msgid "Tags for the entry: " msgstr "Тагове за елемента:" #: src/icqdialogs.cc:2128 msgid "pgp key quick search" msgstr "бързо търÑене на pgp ключове" #: src/icqdialogs.cc:2130 #, c-format msgid "PGP key search: type to find, %s find again, Enter finish" msgstr "" "търÑене на PGP ключове: напиши за да търÑиш, %s за повторно търÑене, Enter " "за край" #: src/icqdialogs.cc:2211 msgid " Select PGP key to use " msgstr " Избери кой PGP ключ да ползваш" #: src/icqdialogs.cc:2232 msgid " Use no key" msgstr " Ðе използвай ключ" #: src/icqdialogs.cc:2246 msgid "pgp key selection" msgstr "избиране на pgp ключ" #: src/icqdialogs.cc:2248 #, c-format msgid "PGP key selection: %s for quick lookup" msgstr "Избиране на PGP ключ: %s за бързо търÑене" #: src/imexternal.cc:128 #, c-format msgid "executed external manual action %s, return code = %d" msgstr "Ñтартиране на външна програма %s, изходен код = %d" #: src/imexternal.cc:160 #, c-format msgid "executed external action %s, return code = %d" msgstr "Ñтартриане на външна команда %s, изходен код = %d" #: src/imcontact.cc:110 src/imlogger.cc:33 msgid "Offline" msgstr "Изключен" #: src/imcontact.cc:111 src/imlogger.cc:34 src/icqface.cc:1215 msgid "Online" msgstr "Ðа линиÑ" #: src/imcontact.cc:112 src/imlogger.cc:35 msgid "Invisible" msgstr "Ðевидим" #: src/imcontact.cc:113 src/imlogger.cc:36 msgid "Free for chat" msgstr "Свободен за чат" #: src/imcontact.cc:114 msgid "Do not disturb" msgstr "Ðе ме тормози" #: src/imcontact.cc:115 src/imlogger.cc:38 msgid "Occupied" msgstr "Зает" #: src/imcontact.cc:116 msgid "Not available" msgstr "ÐедоÑтъпен" #: src/imcontact.cc:117 src/imlogger.cc:41 msgid "Away" msgstr "ÐÑма ме" #: src/imcontact.cc:118 src/imlogger.cc:40 msgid "Out for Lunch" msgstr "Ðа обÑд Ñъм" #: src/imlogger.cc:37 msgid "DND" msgstr "Ðе Ме Закачай" #: src/imlogger.cc:39 msgid "N/A" msgstr "Ðе Ñъм тук" #: src/imlogger.cc:49 msgid "message" msgstr "Ñъобщение" #: src/imlogger.cc:50 src/icqface.cc:1075 msgid "URL" msgstr "URL" #: src/imlogger.cc:51 msgid "SMS" msgstr "SMS" #: src/imlogger.cc:52 msgid "authorization" msgstr "ауторизациÑ" #: src/imlogger.cc:53 msgid "e-mail" msgstr "поща" #: src/imlogger.cc:54 msgid "notification" msgstr "извеÑÑ‚Ñване" #: src/imlogger.cc:55 msgid "contacts" msgstr "контакти" #: src/imlogger.cc:56 msgid "files" msgstr "файлове" #: src/imlogger.cc:57 msgid "event" msgstr "Ñъбитие" #: src/imlogger.cc:79 msgid "events log started" msgstr "начало на журнал" #: src/imlogger.cc:110 #, c-format msgid "outgoing %s to %s" msgstr "изходÑщо %s към %s" #: src/imlogger.cc:111 #, c-format msgid "incoming %s from %s" msgstr "входÑщо %s от %s" #: src/imlogger.cc:123 msgid "ignored" msgstr "игнориран" #: src/imlogger.cc:137 #, c-format msgid "%s [%s] comes online" msgstr "%s [%s] е онлайн" #: src/imlogger.cc:139 #, c-format msgid "%s went offline" msgstr "%s е офлайн" #: src/imlogger.cc:141 #, c-format msgid "%s is now %s, was %s" msgstr "%s е Ñега %s, беше %s" #: src/imlogger.cc:170 #, c-format msgid "%s: went online, with status %s" msgstr "%s: е онлайн, ÑÑŠÑ ÑÑ‚Ð°Ñ‚ÑƒÑ %s" #: src/imlogger.cc:172 #, c-format msgid "%s: went offline" msgstr "%s: е офлайн" #: src/imlogger.cc:174 #, c-format msgid "changed our %s status to %s from %s" msgstr "промÑна на Ñ‚Ð²Ð¾Ñ %s ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° %s от %s" #: src/accountmanager.cc:63 src/imotr.cc:439 msgid " IM account manager " msgstr " Мениджър на акаунтите " #: src/accountmanager.cc:97 #, c-format msgid " Server : %s " msgstr " Сървър : %s " #: src/accountmanager.cc:100 #, c-format msgid " Secured : %s " msgstr " ПодÑигурено : %s " #: src/accountmanager.cc:107 #, c-format msgid " UIN : %s " msgstr " UIN : %s " #: src/accountmanager.cc:112 #, c-format msgid " Login : %s " msgstr " Потребител : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password (optional) : %s " msgstr " Парола (опционално) : %s " #: src/accountmanager.cc:118 #, c-format msgid " Password : %s " msgstr " Парола : %s " #: src/accountmanager.cc:124 #, c-format msgid " Priority : %s " msgstr " Приоритет : %s " #: src/accountmanager.cc:129 #, c-format msgid " Import friend list : %s " msgstr " Импортирай ÑпиÑък Ñ Ð¿Ñ€Ð¸Ñтели: %s" #: src/accountmanager.cc:134 #, c-format msgid " NickServ password (optional) : %s " msgstr " NickServ парола (опционално) : %s " #: src/accountmanager.cc:141 #, c-format msgid " Request receipts: %s " msgstr " ИзиÑкай получаване: %s" #: src/accountmanager.cc:146 #, c-format msgid " Send OS info: %s " msgstr " Изпращай OS информациÑ: %s" #: src/accountmanager.cc:150 msgid " Register " msgstr " РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ " #: src/accountmanager.cc:155 #, c-format msgid " OpenPGP key: %s " msgstr " ОpenPGP ключ: %s" #: src/accountmanager.cc:160 #, c-format msgid " Key passphrase: %s " msgstr " Парола за ключа: %s" #: src/accountmanager.cc:168 msgid " Change nickname " msgstr " СмÑна на прÑкора" #: src/accountmanager.cc:169 msgid " Update user details " msgstr " ОбновÑване на потребителÑката информациÑ" #: src/accountmanager.cc:172 msgid " Set away message " msgstr " Сложи Ñъобщение за отÑÑŠÑтвие" #: src/accountmanager.cc:178 msgid " Set external status " msgstr " Сложи външен ÑтатуÑ" #: src/accountmanager.cc:181 msgid " Drop " msgstr " Изтрий" #: src/accountmanager.cc:200 msgid " user name: " msgstr " потребителÑко име: " #: src/accountmanager.cc:205 msgid " uin: " msgstr " номер: " #: src/accountmanager.cc:210 src/accountmanager.cc:266 msgid " password: " msgstr " парола: " #: src/accountmanager.cc:218 msgid "Drop the account information first!" msgstr "Първо изтрий информациÑта за акаунта!" #: src/accountmanager.cc:232 msgid "You have to disconnect the service first!" msgstr "Първо трÑбва да Ñе изключиш от Ñървъра!" #: src/accountmanager.cc:241 msgid " server address: " msgstr " Ñървър : " #: src/accountmanager.cc:285 msgid " priority: " msgstr " приоритет: " #: src/accountmanager.cc:299 msgid "PGP key passphrase: " msgstr "Парола за PGP ключа:" #: src/imcontroller.cc:65 #, c-format msgid " Register on the %s network " msgstr " РегиÑтриране в мрежата %s" #: src/imcontroller.cc:72 msgid "Go ahead" msgstr "Продължи" #: src/imcontroller.cc:88 #, c-format msgid " Password to set : %s " msgstr " Парола : %s " #: src/imcontroller.cc:89 #, c-format msgid " Check the password : %s " msgstr " Провери паролата : %s " #: src/imcontroller.cc:93 #, c-format msgid " Server to use : %s " msgstr " Използвай Ñървър : %s " #: src/imcontroller.cc:103 msgid "Check the password you entered: " msgstr "Проверка на въведената парола: " #: src/imcontroller.cc:104 msgid "Nickname to set: " msgstr "ПрÑкор:" #: src/imcontroller.cc:108 msgid "Server: " msgstr "Сървър: " #: src/imcontroller.cc:114 msgid "Passwords do not match" msgstr "Паролите не Ñвъпадат" #: src/imcontroller.cc:116 msgid "Password must be entered" msgstr "Паролата трÑбва да е въведена" #: src/imcontroller.cc:118 msgid "Password must be at least 6 chars long" msgstr "Паролата трÑбва да е от поне 6 знака" #: src/imcontroller.cc:137 src/imcontroller.cc:198 msgid " Registration progress " msgstr " РегиÑтрациÑ" #: src/imcontroller.cc:140 #, c-format msgid "Connecting to the server %s ..." msgstr "Връзка ÑÑŠÑ Ñървър %s ..." #: src/imcontroller.cc:144 msgid "Sending request" msgstr "Изпращане на заÑвка" #: src/imcontroller.cc:150 msgid "Timed out waiting for a new uin. Retry?" msgstr "Времето за заÑвката изтече, повторно?" #: src/imcontroller.cc:154 msgid "Retrying.." msgstr "Повторение.." #: src/imcontroller.cc:160 #, c-format msgid "New UIN received, %lu" msgstr "Ðов UIN е получен, %lu" #: src/imcontroller.cc:176 src/imcontroller.cc:234 msgid "Disconnected" msgstr "Изключване" #: src/imcontroller.cc:179 msgid "Unable to connect to icq server. Retry?" msgstr "Ðевъзможна Ñвързване Ñ ICQ Ñървъра. Повторно?" #: src/imcontroller.cc:200 #, c-format msgid "Trying to register %s at %s ..." msgstr "Опит за региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ %s на %s ..." #: src/imcontroller.cc:215 msgid "The Jabber ID was successfully registered" msgstr "РегиÑтрациÑта на Jabber ID премина уÑпешно" #: src/imcontroller.cc:228 msgid "Failed" msgstr "Пропадна" #: src/imcontroller.cc:257 msgid "You must be logged to the ICQ network to update the details" msgstr "ТрÑбва да Ñи на Ð»Ð¸Ð½Ð¸Ñ Ð·Ð° промениш информациÑта" #: src/imcontroller.cc:276 msgid "new MSN friendly nick: " msgstr "нов MSN friendly nick: " #: src/imcontroller.cc:284 msgid "You must be logged to the MSN network to update the friendly nick" msgstr "ТрÑбва да Ñи на Ð»Ð¸Ð½Ð¸Ñ Ð·Ð° да можеш да Ñмениш прÑкора Ñи" #: src/imcontroller.cc:301 msgid "You must be logged to the Jabber network to update your details" msgstr "ТрÑбва да Ñи на Ð»Ð¸Ð½Ð¸Ñ Ð·Ð° да можеш да промениш информациÑта Ñи" #: src/imcontroller.cc:318 msgid "You must be logged to the Gadu-Gadu network to update your details" msgstr "ТрÑбва да Ñи на Ð»Ð¸Ð½Ð¸Ñ Ð·Ð° да можеш да промениш информациÑта Ñи" #: src/imcontroller.cc:336 msgid "registration is not supported" msgstr "региÑтрациÑта не Ñе поддържа" #: src/icqconf.cc:208 #, c-format msgid "I do really enjoy the default %s away message of %s %s." msgstr "" "Ðа мен ми хареÑва Ñтандартното Ñъобщение за отÑÑŠÑтвие %s в centerim на %s %s." #: src/icqconf.cc:1080 msgid "+ ERROR: captcha disabled: no questions found!" msgstr "+ ГРЕШКÐ: деактивиране на captchа: не бÑха намерени въпроÑи!" #: src/icqconf.cc:1340 #, c-format msgid "+ launched the %s action command" msgstr "+ Ñтартирана е командата %s" #: src/icqconf.cc:1545 msgid "event sending error: not enough parameters" msgstr "грешка: нÑма доÑтатъчно параметри" #: src/icqconf.cc:1556 msgid "event sending error: only UINs are allowed with icq protocol" msgstr "грешка: Ñамо UIN Ñа разрешени Ñ ICQ протокол" #: src/icqconf.cc:1571 msgid "event sending error: unknown IM type" msgstr "грешка: неизвеÑтен IM" #: src/icqconf.cc:1593 msgid "event sending error: unknown event type" msgstr "грешка: неизвеÑтно Ñъбитие" #: src/icqconf.cc:1610 #, c-format msgid "%s to %s has been put to the queue" msgstr "%s към %s беше поÑтавен в ÑпиÑъка ÑÑŠÑ Ð·Ð°Ð´Ð°Ñ‡Ð¸" #: src/icqconf.cc:1616 msgid "event sending error: error creating directory for the contact" msgstr "грешка при Ñъздаването на папка за контакта" #: src/icqconf.cc:1663 msgid "unknown status character was given" msgstr "неизвеÑтен Ñимвол зададен за ÑтатуÑ" #: src/icqconf.cc:1666 msgid "unknown IM type" msgstr "неизвеÑтен тип на IM" #: src/icqconf.cc:1669 msgid "status change error: " msgstr "грешка при ÑмÑна на ÑтатуÑа: " #: src/icqconf.cc:1680 msgid "Usage: " msgstr "Употреба: " #: src/icqconf.cc:1680 msgid " [OPTION]..." msgstr " [ОПЦИЯ]..." #: src/icqconf.cc:1682 msgid "General options:" msgstr "ОÑновни опции:" #: src/icqconf.cc:1683 msgid "" " --ascii, -a use ASCII characters for windows and UI controls" msgstr "" " --ascii, -a използвай ASCII Ñимволи за прозорците и рамките" #: src/icqconf.cc:1684 msgid " --basedir, -b set a custom base directory" msgstr " --basedir, -b <път> задай друга базова директориÑ" #: src/icqconf.cc:1685 msgid " --bind, -B bind a custom local IP" msgstr " --bind, -B IP за входÑщи връзки" #: src/icqconf.cc:1686 msgid " --no-xtitles, -T disable xterm titles" msgstr " --no-xtitles, -T деактивирай заглавиÑта на терминала" #: src/icqconf.cc:1687 msgid "" " --offline, -o set all protocols status to offline upon start" msgstr "" " --offline, -o Ñложи ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ñ„Ð»Ð°Ð¹Ð½ на вÑички протоколи при Ñтарт" #: src/icqconf.cc:1688 msgid " --debug, -d enables debug info logging" msgstr " --debug, -d активирай запиÑването на debug информациÑ" #: src/icqconf.cc:1689 msgid " --help display this stuff" msgstr " --help покажи този екран" #: src/icqconf.cc:1690 msgid " --version, -v show the program version info" msgstr " --version, -v покажи верÑиÑта на програмата" #: src/icqconf.cc:1692 msgid "Events sending options:" msgstr "Опции при изпращане на Ñъобщение:" #: src/icqconf.cc:1693 msgid " -s, --send event type; can be msg, sms or url" msgstr "" " -s, --send <тип> тип на Ñъобщението; може да бъде msg, sms или url" #: src/icqconf.cc:1694 msgid "" " -S, --status change the current IM status. Status; o, _, a, d, " "n, c, f, i" msgstr "" " -S, --status <ÑтатуÑ> Ñмени Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° IM. СтатуÑ; o, _, a, d, " "n, c, f, i" #: src/icqconf.cc:1695 msgid "" " -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, " "jab, rss, lj, gg or infocard" msgstr "" " -p, --proto <протокол> тип на протокола; може да бъде icq, yahoo, msn, " "aim, irc, jab, rss, lj, gg или infocard" #: src/icqconf.cc:1697 msgid "" " -t, --to destination UIN or nick (depends on protocol)" msgstr "" " -t, --to <получател> UIN или прÑкор на Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ (завиÑи от протокола)" #: src/icqconf.cc:1698 msgid " -n, --number mobile number to send an event to (sms only)" msgstr " -n, --number <тел. ном.> мобилен номер на Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ (Ñамо за sms)" #: src/icqconf.cc:1700 msgid "Report bugs to http://bugzilla.centerim.org/." msgstr "Изпращай грешки на http://bugzilla.centerim.org/." #: src/imevents.cc:297 msgid "Empty authorization request message" msgstr "Празно Ñъобщение за изиÑкване на ауторизациÑ" #: src/imevents.cc:321 msgid "* Authorization request : " msgstr "* ИÑкане на Ð°ÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : " #: src/imevents.cc:322 msgid "* Authorization : " msgstr "* ÐÑƒÑ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ : " #: src/imevents.cc:381 msgid "* SMS : " msgstr "* SMS : " #: src/imevents.cc:517 msgid "* Contacts : " msgstr "* Контакти : " #: src/imevents.cc:522 msgid "" msgstr "<без прÑкор>" #: src/imevents.cc:604 msgid "* File transfer" msgstr "* изпращане на файл" #: src/impgp.cc:73 msgid "PGP passphrase required: " msgstr "Въведи парола за PGP:" #: src/impgp.cc:76 msgid "incorrect PGP passphrase" msgstr "Грешна PGP парола" #: src/impgp.cc:127 msgid "PGP sign error: " msgstr "грешка при PGP подпиÑа" #: src/impgp.cc:234 msgid "PGP encrypt error: " msgstr "грешка при PGP криптирането" #: src/imotr.cc:99 msgid "[OTR] Error: inject_message_cb, recipient \"" msgstr "[OTR] Грешка: inject_message_cb, получател \"" #: src/imotr.cc:99 msgid "\" not found" msgstr "\" не е открито" #: src/imotr.cc:114 msgid "Error" msgstr "Грешка" #: src/imotr.cc:116 msgid "Warning" msgstr "Предупреждение" #: src/imotr.cc:118 src/icqface.cc:1456 src/icqface.cc:1460 #: src/icqface.cc:1466 src/icqface.cc:1472 msgid "Info" msgstr "Инфо" #: src/imotr.cc:122 src/imotr.cc:315 msgid " accountname: " msgstr " име на акаунта: " #: src/imotr.cc:123 msgid " protocol: " msgstr " протокол:" #: src/imotr.cc:124 msgid " username: " msgstr " потребителÑко име: " #: src/imotr.cc:125 msgid " title: " msgstr " заглавие: " #: src/imotr.cc:126 msgid " primary: " msgstr " първично: " #: src/imotr.cc:127 msgid " secondary: " msgstr " вторично: " #: src/imotr.cc:181 msgid "[OTR] Received unknown fingerprint from \"" msgstr "[OTR] Получен непознат пръÑтов отпечатък от \"" #: src/imotr.cc:182 msgid " You can verify it in the OTR options." msgstr " Можеш да го провериш при OTR опциите." #: src/imotr.cc:205 msgid "[OTR] Connection is now secure..." msgstr "[OTR] Връзката е вече подÑигурена..." #: src/imotr.cc:214 msgid "[OTR] Connection is insecure..." msgstr "[OTR] Връзката е неподÑигурена..." #: src/imotr.cc:232 msgid "[OTR] Log: " msgstr "[OTR] Журнал: " #: src/imotr.cc:314 msgid "[OTR] Error while encrypting message... no message sent!" msgstr "" "[OTR] Грешка при криптирането на Ñъобщението... Ñъобщението не беше " "изпратено!" #: src/imotr.cc:316 msgid " recipient: " msgstr " получател: " #: src/imotr.cc:378 src/imotr.cc:397 msgid "[OTR] Error: At the moment, only jabber is supported" msgstr "[OTR] Грешка: в момента Ñе поддържа Ñамо jabber" #: src/imotr.cc:386 msgid "[OTR] Trying to start a secure session with \"" msgstr "[OTR] Опит за Ñтартиране на подÑигурена ÑеÑÐ¸Ñ Ñ \"" #: src/imotr.cc:405 msgid "[OTR] Ending secure session with \"" msgstr "[OTR] Край на подÑигурената ÑеÑÐ¸Ñ Ñ \"" #: src/imotr.cc:413 msgid "yes/no" msgstr "да/не" #: src/imotr.cc:413 src/imotr.cc:414 src/imotr.cc:416 src/imotr.cc:420 #: src/icqface.cc:47 src/icqface.cc:122 msgid "no" msgstr "не" #: src/imotr.cc:414 src/imotr.cc:419 src/icqface.cc:47 msgid "yes" msgstr "да" #: src/imotr.cc:416 msgid " Please type 'yes' or 'no': " msgstr " ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´Ð¸ 'yes [да]' или 'no [не]'" #: src/imotr.cc:462 msgid " Private keys " msgstr " Лични ключове" #: src/imotr.cc:470 msgid "Error calculating Fingerprint" msgstr "Грешка при изчиÑлÑването на пръÑÑ‚Ð¾Ð²Ð¸Ñ Ð¾Ñ‚Ð¿ÐµÑ‡Ð°Ñ‚ÑŠÐº" #: src/imotr.cc:472 msgid " Account: " msgstr " Ðкаунт:" #: src/imotr.cc:473 msgid " Protocol: " msgstr " Протокол: " #: src/imotr.cc:474 src/imotr.cc:498 msgid " Fingerprint: " msgstr " ПръÑтов отпечатък:" #: src/imotr.cc:475 src/imotr.cc:501 msgid " Forget key " msgstr " Забрави ключа" #: src/imotr.cc:481 msgid " Public keys " msgstr " Публични ключове" #: src/imotr.cc:488 msgid " User: " msgstr " Потребител:" #: src/imotr.cc:489 msgid " Protocol: " msgstr " Протокол:" #: src/imotr.cc:490 msgid " Account: " msgstr " Ðкаунт: " #: src/imotr.cc:495 msgid "Yes" msgstr "Да" #: src/imotr.cc:495 msgid "No" msgstr "Ðе" #: src/imotr.cc:499 msgid " Verified: " msgstr " Проверено:" #: src/imotr.cc:507 msgid " Active fingerprint: " msgstr " Ðктивен пръÑтов отпечатък:" #: src/imotr.cc:523 src/imotr.cc:543 msgid "Do you want to forget the selected key?" msgstr "ИÑкаш ли да забравиш Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡?" #: src/imotr.cc:536 msgid "Do you want verify the selected key?" msgstr "ИÑкаш ли да провериш Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡?" #: src/imotr.cc:570 src/imotr.cc:597 msgid "No Jabber" msgstr "ÐÑма Jabber" #: src/imotr.cc:580 src/imotr.cc:607 msgid "No OTR" msgstr "ÐÑма OTR" #: src/imotr.cc:585 msgid "Plaintext" msgstr "Прав текÑÑ‚" #: src/imotr.cc:586 msgid "Encrypted" msgstr "Криптирано" #: src/imotr.cc:587 msgid "Finished" msgstr "Завършено" #: src/imotr.cc:588 msgid "Unknown" msgstr "неизвеÑтно" #: src/imotr.cc:611 msgid "No Encryption" msgstr "ÐÑма криптиране" #: src/imotr.cc:615 msgid "Verified" msgstr "Проверено" #: src/imotr.cc:617 msgid "Unverified" msgstr "Ðепроверено" #: src/icqface.cc:52 msgid "Male" msgstr "Мъжки" #: src/icqface.cc:53 msgid "Female" msgstr "ЖенÑки" #: src/icqface.cc:56 msgid "Not specified" msgstr "Ðе е указан" #: src/icqface.cc:61 msgid "Ok" msgstr "Ок" #: src/icqface.cc:62 msgid "Next" msgstr "Следващо" #: src/icqface.cc:63 msgid "Fwd" msgstr "Препрати" #: src/icqface.cc:64 msgid "Reply" msgstr "Отговори" #: src/icqface.cc:65 msgid "Open" msgstr "Отвори" #: src/icqface.cc:66 msgid "Accept" msgstr "Потвържение" #: src/icqface.cc:67 msgid "Reject" msgstr "Отказ" #: src/icqface.cc:68 msgid "User info" msgstr "Инфо" #: src/icqface.cc:70 msgid "Prev" msgstr "Предишно" #: src/icqface.cc:78 msgid "sound card" msgstr "звукова карта" #: src/icqface.cc:79 msgid "speaker" msgstr "говорител" #: src/icqface.cc:80 msgid "disable" msgstr "изключен" #: src/icqface.cc:83 src/icqface.cc:92 src/icqface.cc:101 msgid "don't change" msgstr "без промÑна" #: src/icqface.cc:88 msgid "dark" msgstr "тъмен" #: src/icqface.cc:89 msgid "blue" msgstr "Ñин" #: src/icqface.cc:97 msgid "protocol" msgstr "протокол" #: src/icqface.cc:98 msgid "status" msgstr "ÑтатуÑ" #: src/icqface.cc:118 msgid "mode 1" msgstr "режим 1" #: src/icqface.cc:119 msgid "mode 2" msgstr "режим 2" #: src/icqface.cc:249 #, c-format msgid " CENTERIM %s UNSENT: %lu" msgstr " CENTERIM %s ÐЕИЗПРÐТЕÐИ: %lu" #: src/icqface.cc:274 msgid "Send an URL" msgstr "Изпрати URL " #: src/icqface.cc:275 msgid " Send an SMS" msgstr " Изпрати SMS " #: src/icqface.cc:276 msgid "Send contacts" msgstr "Изпращане на контакти" #: src/icqface.cc:277 msgid " Request authorization" msgstr " ПоиÑкай ауторизациÑ" #: src/icqface.cc:278 msgid "Edit details" msgstr "Редактирай детайли" #: src/icqface.cc:279 msgid "Fetch away message" msgstr "Прочети Ñъобщението за отÑÑŠÑтвие" #: src/icqface.cc:280 msgid "Add to list" msgstr "Добави в ÑпиÑъка" #: src/icqface.cc:281 msgid "Rename contact" msgstr "Преименувай контакта" #: src/icqface.cc:282 msgid " Move to group.." msgstr " ПремеÑти в група.." #: src/icqface.cc:283 msgid " Ping" msgstr " Ping" #: src/icqface.cc:284 msgid "Fetch version info" msgstr "ПоиÑкай верÑиÑта" #: src/icqface.cc:285 msgid " Send file(s)" msgstr " Изпрати файл(ове)" #: src/icqface.cc:286 msgid " Invite to conference.." msgstr " Покана за чат.." #: src/icqface.cc:293 msgid " Send a channel message enter" msgstr " Изпрати чат-Ñъобщение enter" #: src/icqface.cc:294 msgid "Channel chat history" msgstr "Ðрхив на чат канала" #: src/icqface.cc:295 msgid " Remove channel del" msgstr " Изтрий канала del" #: src/icqface.cc:296 msgid " Join channel" msgstr " Влез в канала" #: src/icqface.cc:297 msgid " Leave channel" msgstr " ÐапуÑни канала" #: src/icqface.cc:298 msgid "List nicknames" msgstr "СпиÑък Ñ Ð¿Ñ€Ñкори" #: src/icqface.cc:301 msgid "UnBlock channel messages" msgstr "Деблокирай ÑъобщениÑта от канала" #: src/icqface.cc:303 msgid "Block channel messages" msgstr "Блокирай ÑъобщениÑта от канала" #: src/icqface.cc:310 msgid "Send a message" msgstr "Изпрати Ñъобщение" #: src/icqface.cc:312 msgid "Event history" msgstr "Ðрхив на ÑъобщениÑта" #: src/icqface.cc:313 msgid "Remove user" msgstr "Изтрий потребителÑ" #: src/icqface.cc:314 msgid "User's details" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° потребителÑ" #: src/icqface.cc:315 msgid "External actions.." msgstr "Външни програми" #: src/icqface.cc:318 msgid "Unset ignore user" msgstr "Премахни \"игнориран\" за потребителÑ" #: src/icqface.cc:318 msgid "Ignore user" msgstr "Игнорирай потребителÑ" #: src/icqface.cc:322 msgid " Assign PGP key.." msgstr " Прибави PGP ключ.." #: src/icqface.cc:322 msgid " Unassign PGP key" msgstr " Премахни PGP ключ" #: src/icqface.cc:324 #, c-format msgid " Turn PGP encryption %s" msgstr " Включи PGP криптиране: %s" #: src/icqface.cc:328 msgid "Force check" msgstr "Извърши проверка" #: src/icqface.cc:435 msgid "Change status" msgstr "СмÑна на ÑтатуÑа" #: src/icqface.cc:436 msgid "Go to contact.." msgstr "Отиди при контакт.." #: src/icqface.cc:437 msgid " Accounts.." msgstr " Ðкаунти.." #: src/icqface.cc:438 msgid " CenterIM config options" msgstr " ÐаÑтройки на CenterIM" #: src/icqface.cc:440 msgid " OTR options and fingerprints" msgstr " OTR опции и пръÑтови отпечатъци" #: src/icqface.cc:442 msgid " File transfers monitor" msgstr " Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð½Ð° транÑферираните файлове" #: src/icqface.cc:444 msgid " Find/add users" msgstr " Ðамери/добави потребител" #: src/icqface.cc:445 msgid " Join channel/conference" msgstr " Влез в канал/конференциÑ" #: src/icqface.cc:447 msgid " Link an RSS feed" msgstr " Връзка към RSS feed" #: src/icqface.cc:450 msgid " View/edit ignore list" msgstr " Виж/редактирай ÑпиÑъка на игнорираните" #: src/icqface.cc:451 msgid " View/edit invisible list" msgstr " Виж/редактирай ÑпиÑъка на невидимите" #: src/icqface.cc:452 msgid " View/edit visible list" msgstr " Виж/редактирай ÑпиÑъка на видимите" #: src/icqface.cc:455 msgid "Show offline users" msgstr "Покажи вÑички офлайн потребители" #: src/icqface.cc:457 msgid "Hide offline users" msgstr "Скрий вÑички офлайн потребители" #: src/icqface.cc:460 msgid " Organize contact groups" msgstr " Управление на групите Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸" #: src/icqface.cc:461 msgid " Mass group move.." msgstr " ПремеÑти цÑлата група.." #: src/icqface.cc:905 src/icqface.cc:909 src/icqface.cc:1940 msgid "Details" msgstr "ИнформациÑ" #: src/icqface.cc:905 msgid "Message" msgstr "Съобщение" #: src/icqface.cc:906 src/icqface.cc:910 msgid "New search" msgstr "Ðово търÑене" #: src/icqface.cc:924 msgid "Contact to add" msgstr "Добави контакт" #: src/icqface.cc:934 msgid "Searching contacts.." msgstr "ТърÑене на контакти.." #: src/icqface.cc:1005 msgid "Search results [done]" msgstr "Резултати от търÑенето [завършено]" #: src/icqface.cc:1016 #, c-format msgid "Information about %s" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° %s" #: src/icqface.cc:1073 src/icqface.cc:1129 msgid "Nickname" msgstr "ПрÑкор" #: src/icqface.cc:1081 msgid "This is your LiveJournal account. Use it to" msgstr "Това е Ñ‚Ð²Ð¾Ñ LiveJournal account. Използвай го да" #: src/icqface.cc:1082 msgid "post new entries to your journal." msgstr "прати нови елементи към Ñ‚Ð²Ð¾Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»" #: src/icqface.cc:1089 msgid "The following users have you listed as their friend:" msgstr "Следните потребители те имат в ÑпиÑъците Ñи като приÑтел:" #: src/icqface.cc:1112 msgid "found" msgstr "намерено" #: src/icqface.cc:1114 msgid "used" msgstr "използвано" #: src/icqface.cc:1114 msgid "not used" msgstr "неизползвано" #: src/icqface.cc:1116 msgid "not found" msgstr "ненамерено" #: src/icqface.cc:1131 msgid "E-mail" msgstr "Поща" #: src/icqface.cc:1132 msgid "2nd e-mail" msgstr "2-ра поща" #: src/icqface.cc:1133 msgid "Old e-mail" msgstr "Стара поща" #: src/icqface.cc:1134 msgid "Gender" msgstr "Пол" #: src/icqface.cc:1135 src/icqface.cc:1422 msgid "Birthdate" msgstr "Рожден ден" #: src/icqface.cc:1136 msgid "Age" msgstr "Години" #: src/icqface.cc:1137 msgid "Languages" msgstr "Езици" #: src/icqface.cc:1138 msgid "Last IP" msgstr "ПоÑледен IP-адреÑ" #: src/icqface.cc:1161 msgid "Last seen" msgstr "ПоÑледно видÑн" #: src/icqface.cc:1163 src/icqface.cc:1406 src/icqface.cc:1410 msgid "Never" msgstr "Ðикога" #: src/icqface.cc:1176 src/icqface.cc:1200 msgid "days" msgstr "дни" #: src/icqface.cc:1180 src/icqface.cc:1204 msgid "hours" msgstr "чаÑове" #: src/icqface.cc:1185 src/icqface.cc:1209 msgid "min" msgstr "минути" #: src/icqface.cc:1189 msgid "seconds" msgstr "Ñекунди" #: src/icqface.cc:1212 msgid "idle" msgstr "бездейÑтващ" #: src/icqface.cc:1221 msgid "Server-based contact" msgstr "Контакти на Ñървъра" #: src/icqface.cc:1226 msgid "Awaiting authorization" msgstr "Чакане на ауторизациÑ" #: src/icqface.cc:1238 msgid "Avatar file" msgstr "Ðватар" #: src/icqface.cc:1253 src/icqface.cc:1296 msgid "Address" msgstr "ÐдреÑ" #: src/icqface.cc:1254 src/icqface.cc:1297 msgid "Location" msgstr "МеÑтонахождение" #: src/icqface.cc:1255 src/icqface.cc:1298 msgid "Zip code" msgstr "ПощенÑки код" #: src/icqface.cc:1256 src/icqface.cc:1304 msgid "Phone" msgstr "Телефон" #: src/icqface.cc:1257 src/icqface.cc:1305 msgid "Fax" msgstr "ФакÑ" #: src/icqface.cc:1258 msgid "Cellular" msgstr "Мобилен телефон" #: src/icqface.cc:1259 msgid "Timezone" msgstr "Времева зона" #: src/icqface.cc:1261 src/icqface.cc:1306 msgid "Homepage" msgstr "Лична Ñтраница" #: src/icqface.cc:1300 msgid "Company" msgstr "КомпаниÑ" #: src/icqface.cc:1301 msgid "Department" msgstr "Отдел" #: src/icqface.cc:1302 src/icqface.cc:1381 msgid "Title" msgstr "ДлъжноÑÑ‚" #: src/icqface.cc:1346 msgid "Interests" msgstr "ИнтереÑи" #: src/icqface.cc:1358 msgid "Background" msgstr "Предишен опит" #: src/icqface.cc:1376 msgid "Handle" msgstr "Ðазвание" #: src/icqface.cc:1377 msgid "RSS doc" msgstr "RSS документациÑ" #: src/icqface.cc:1378 msgid "Version" msgstr "ВерÑиÑ" #: src/icqface.cc:1379 msgid "Encoding" msgstr "Кодиране" #: src/icqface.cc:1382 msgid "Link" msgstr "Връзка" #: src/icqface.cc:1384 msgid "Frequency" msgstr "ЧеÑтота" #: src/icqface.cc:1385 msgid "Last check" msgstr "Предишна проверка" #: src/icqface.cc:1386 msgid "Next check" msgstr "Следваща проверка" #: src/icqface.cc:1387 msgid "Last result" msgstr "ПоÑледен резултат" #: src/icqface.cc:1401 #, c-format msgid "%lu minutes" msgstr "%lu минути" #: src/icqface.cc:1404 msgid "Now" msgstr "Сега" #: src/icqface.cc:1423 msgid "Full name" msgstr "Пълно име" #: src/icqface.cc:1442 #, c-format msgid "%s to URLs, %s external actions, %s close" msgstr "%s за URLs, %s за външни програми, %s затвори" #: src/icqface.cc:1447 #, c-format msgid "user info for %s" msgstr "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° потребител %s" #: src/icqface.cc:1456 msgid "Check" msgstr "Проверка" #: src/icqface.cc:1456 src/icqface.cc:1473 msgid "Edit" msgstr "Редактирай" #: src/icqface.cc:1456 msgid "LJ" msgstr "LJ" #: src/icqface.cc:1460 msgid "Retreive" msgstr "Обнови " #: src/icqface.cc:1466 msgid "Friend of" msgstr "ПриÑтел на" #: src/icqface.cc:1472 msgid "Home" msgstr "Дом" #: src/icqface.cc:1472 msgid "Work" msgstr "Работа" #: src/icqface.cc:1472 msgid "More" msgstr "Още" #: src/icqface.cc:1473 msgid "Retrieve" msgstr "Обнови" #: src/icqface.cc:1573 msgid " [icq] ICQ network" msgstr " [icq] Мрежа ICQ " #: src/icqface.cc:1574 msgid " [yahoo] YAIM" msgstr " [yahoo] YAIM" #: src/icqface.cc:1575 msgid " [msn] M$ Messenger" msgstr " [msn] M$ Messenger" #: src/icqface.cc:1576 msgid " [aim] AOL TOC" msgstr " [aim] AOL TOC" #: src/icqface.cc:1577 msgid " [irc] IRC" msgstr " [irc] IRC" #: src/icqface.cc:1578 msgid " [jab] Jabber" msgstr " [jab] Jabber" #: src/icqface.cc:1580 msgid " [lj] LiveJournal" msgstr " [lj] LiveJournal" #: src/icqface.cc:1581 msgid " [gg] Gadu-Gadu" msgstr " [gg] Gadu-Gadu" #: src/icqface.cc:1622 msgid " All protocols" msgstr " Ð’Ñички протоколи" #: src/icqface.cc:1623 msgid " Already logged in only" msgstr " Само в които Ñъм влÑзъл" #: src/icqface.cc:1724 msgid " or confirm, cancel " msgstr " или потвърди, откажи" #: src/icqface.cc:1754 msgid " confirm, cancel " msgstr " потвърди, откажи" #: src/icqface.cc:1940 msgid "Move to contacts" msgstr "ПремеÑти в контакти" #: src/icqface.cc:1952 msgid "Ignore list" msgstr "СпиÑък Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð°Ð½Ð¸Ñ‚Ðµ контакти (игнорирани)" #: src/icqface.cc:1953 msgid "Visible list" msgstr "Да те виждат при ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼ (видим ÑпиÑък)" #: src/icqface.cc:1954 msgid "Invisible list" msgstr "Да не те виждат (невидим ÑпиÑък)" #: src/icqface.cc:1976 msgid "Select contacts to add to the list" msgstr "Избери контакти, които да добавиш в ÑпиÑъка" #: src/icqface.cc:1981 #, c-format msgid "Remove the %d contacts from the contact list as well?" msgstr "Желаеш ли да изтриеш %d и от ÑпиÑъка Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸?" #: src/icqface.cc:2040 msgid "Event recipients" msgstr "Получатели" #: src/icqface.cc:2269 #, c-format msgid "QuickSearch: type to find, %s find again, Enter finish" msgstr "" "Бързо търÑене: напиши какво търÑиш, %s за повторно търÑене, Enter за край" #: src/icqface.cc:2272 msgid "contact list quick search" msgstr "бързо търÑене в ÑпиÑъка Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸" #: src/icqface.cc:2374 msgid "+ no URLs within the current context" msgstr "+ нÑмÐ° връзки за Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑÑ‚" #: src/icqface.cc:2387 msgid "URLs within the current context" msgstr "Връзки в Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑÑ‚" #: src/icqface.cc:2403 #, c-format msgid "+ no external actions defined for %s" msgstr "+ не Ñа зададени външни програми за %s" #: src/icqface.cc:2423 #, c-format msgid "Result of the external action %s:" msgstr "Резултат от външна програма %s:" #: src/icqface.cc:2441 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb" msgstr "" "%s изпрати, %s на повече, %s/%s пр/Ñл чат, %s иÑториÑ, %s URLs, %s разшири, " "%s членове" #: src/icqface.cc:2442 #, c-format msgid "" "%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info" msgstr "" "%s изпрати, %s на повече, %s/%s пр/Ñл чат, %s иÑториÑ, %s URLs, %s разшири, " "%s информациÑ" #: src/icqface.cc:2477 #, c-format msgid "Outgoing %s" msgstr "Заминаващ %s " #: src/icqface.cc:2610 msgid "Send contacts.." msgstr "Изпращане на контакти.." #: src/icqface.cc:2670 msgid "file name: " msgstr "име на файл: " #: src/icqface.cc:3131 #, c-format msgid "Outgoing %s to %s" msgstr "ИзходÑщи %s към %s" #: src/icqface.cc:3132 #, c-format msgid "Sent on %s" msgstr "Изпратено на %s" #: src/icqface.cc:3135 #, c-format msgid "Incoming %s from %s" msgstr "ВходÑщи %s от %s" #: src/icqface.cc:3136 #, c-format msgid "Received on %s" msgstr "Получено на %s" #: src/icqface.cc:3182 #, c-format msgid "%s to URLs, %s to full-screenize, %s close" msgstr "%s за URLs, %s на цÑл екран, %s затвори" #: src/icqface.cc:3229 #, c-format msgid "%s from %s, received on %s" msgstr "%s от %s, получено на %s" #: src/icqface.cc:3230 #, c-format msgid "%s to %s, sent on %s" msgstr "%s към %s, изпратено на %s" #: src/icqface.cc:3239 msgid "full-screen view" msgstr "виж на пълен екран" #: src/icqface.cc:3245 #, c-format msgid "%s or %s to close, Up/Down and PgUp/PgDn to scroll" msgstr "%s или %s за затварÑне, Up/Down и PgUp/PgDn за Ñкролиране" #: src/icqface.cc:3333 #, c-format msgid "History for %s, %d events total" msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° %s, вÑички %d ÑъобщениÑ" #: src/icqface.cc:3339 #, c-format msgid "%s search, %s again, %s cancel" msgstr "%s търÑене, %s отново, %s откажи" #: src/icqface.cc:3348 msgid "search for: " msgstr "търÑене: " #, fuzzy #~ msgid "+ [yahoo] rejected by %s: %s" #~ msgstr "+ [yahoo] ÑиÑтема: %s" #, fuzzy #~ msgid "+ [yahoo] got buzz from %s" #~ msgstr "+ [yahoo] поща от %s, %s" #~ msgid "%s went online, with status %s" #~ msgstr "%s когато е на линиÑ, ÑÑ‚Ð°Ñ‚ÑƒÑ %s" #~ msgid "%s changed status to %s from %s" #~ msgstr "%s промени ÑтатуÑа на %s от %s" #~ msgid " [o] Online" #~ msgstr " [o] Ðа линиÑ" #~ msgid " [_] Offline" #~ msgstr "[_] Изключен" #~ msgid " [a] Away" #~ msgstr " [a] ÐÑма ме" #~ msgid " [c] Occupied" #~ msgstr " [c] Зает" #~ msgid " [f] Free for chat" #~ msgstr " [f] Свободен за чат" #~ msgid " [i] Invisible" #~ msgstr " [i] Ðевидим" #~ msgid "+ [irc] password was requested, but it's not set" #~ msgstr "+ [irc] парола бе поиÑкана, но не бе изпратена" #, fuzzy #~ msgid " NickServ password : %s " #~ msgstr " Парола за проверка : %s " #, fuzzy #~ msgid " Convert from : %s " #~ msgstr "Държава : %s " #, fuzzy #~ msgid " Convert to : %s " #~ msgstr "Държава : %s " #~ msgid "Your friendly nickname has been changed to %s" #~ msgstr "ВашиÑÑ‚ прÑкор бе Ñменен на %s" #~ msgid "already logged" #~ msgstr "вече е в ÑиÑтемата" #~ msgid "" #~ "event sending error: the destination contact doesn't exist on your list" #~ msgstr "грешка: Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð³Ð¾ нÑма в вашиÑÑ‚ ÑпиÑък" #, fuzzy #~ msgid "URLs, " #~ msgstr "Връзка(Уеб Страница): " #, fuzzy #~ msgid " details, " #~ msgstr "Детайли" #, fuzzy #~ msgid " cancel" #~ msgstr "Отказ" #, fuzzy #~ msgid "search, " #~ msgstr "търÑене за: " #, fuzzy #~ msgid " esc cancel" #~ msgstr "ÐапуÑни канал" #, fuzzy #~ msgid "contact menu, " #~ msgstr "контакти" #, fuzzy #~ msgid "change status, " #~ msgstr "%s промени ÑтатуÑа на %s от %s" #, fuzzy #~ msgid "general actions, " #~ msgstr "ОÑновни опции:" #~ msgid "+ [yahoo] connecting to the server" #~ msgstr "+ [yahoo] включване към Ñървъра" #~ msgid "+ [yahoo] disconnected" #~ msgstr "+ [yahoo] изключен" #~ msgid "+ [yahoo] adding %s to the contacts" #~ msgstr "+ [yahoo] добавен %s в ÑпиÑъка" #~ msgid "+ [yahoo] removing %s from the contacts" #~ msgstr "+ [yahoo] изтрит %s от ÑпиÑъка" #~ msgid "+ [yahoo] logged in" #~ msgstr "+ [yahoo] влÑзохте уÑпешно" #, fuzzy #~ msgid "+ [yahoo] search finished, %d found" #~ msgstr "+ [jab] търÑенето завърши, %d намерени" #~ msgid "+ [jab] connecting to the server" #~ msgstr "+ [jab] Свързване Ñ Ñървъра" #~ msgid "+ [jab] adding %s to the contacts" #~ msgstr "+ [jab] добавен в %s лиÑтата" #~ msgid "+ [jab] removing %s from the contacts" #~ msgstr "+ [jab] изтрит %s от ÑпиÑъка" #~ msgid "+ [jab] conference list fetching finished, %d found" #~ msgstr "+ [jab] чат ÑпиÑъка изтеглен, %d открити" #~ msgid "+ [jab] search finished, %d found" #~ msgstr "+ [jab] търÑенето завърши, %d намерени" #~ msgid "+ [jab] logged in" #~ msgstr "+ [jab] влÑзохте уÑпешно" #~ msgid "+ [jab] disconnected" #~ msgstr "+ [jab] изключване" #~ msgid "+ [aim] connecting to the server" #~ msgstr "+ [aim] Ñвързване към Ñървър" #~ msgid "+ [aim] removing %s from the contacts" #~ msgstr "+ [aim] изтриване на %s от ÑпиÑъка" #~ msgid "+ [aim] logged in" #~ msgstr "+ [aim] влÑзохте уÑпешно" #~ msgid "+ [aim] disconnected" #~ msgstr "+ [aim] изключване" #~ msgid "+ [aim] password was changed successfully" #~ msgstr "+ [aim] паролата е Ñменена уÑпешно" #~ msgid "+ [icq] connecting to the server" #~ msgstr "+ [icq] Свързване Ñ Ñървъра" #~ msgid "+ [icq] logged in" #~ msgstr "+ [icq] влÑзохте уÑпено" #~ msgid "+ [irc] connecting to the server" #~ msgstr "+ [irc] Ñвързване към Ñървъра" #~ msgid "+ [irc] channel members list fetching finished, %d found" #~ msgstr "+ [irc] тегленето на ÑпиÑъка Ñ Ñ‡Ð°Ñ‚ÐµÑ€Ð¸ завърши, %d намерени" #~ msgid "+ [irc] logged in" #~ msgstr "+ [irc] влÑзохте уÑпешно" #~ msgid "+ [irc] disconnected" #~ msgstr "+ [irc] изключен" #~ msgid " Store contact list server-side : %s " #~ msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð½Ð° контактната лиÑта на Ñървъра : %s " #~ msgid " Russian win/koi translation for : %s" #~ msgstr "Кодировка win1251-koi8 за : %s " #~ msgid " Russian win/koi translation : %s " #~ msgstr "Кодировка win1251-koi8 : %s " #~ msgid "Default charset: " #~ msgstr "Кодова таблица по подразбиране: " #~ msgid " Send an URL u" #~ msgstr "Изпрати връзка (URL) u" #~ msgid " Send contacts c" #~ msgstr "Изпрати контакти c" #~ msgid " Edit details e" #~ msgstr "Редактирай детайли e" #~ msgid " List nicknames ?" #~ msgstr "Покажи прÑкорите ?" #~ msgid " Block channel messages i" #~ msgstr "Блокирай ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ канала i" #~ msgid " Send a message enter" #~ msgstr " Изпрати Ñъобщение enter" #~ msgid " Remove user del" #~ msgstr "Изтрии del" #~ msgid " Ignore user i" #~ msgstr "Игнорирай контакт i" #~ msgid " Remove feed del" #~ msgstr " Изтрии подпи del" #~ msgid " Feed information ?" #~ msgstr " Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ð¿Ð¾Ð´Ð¿Ð¸Ñ ?" #, fuzzy #~ msgid " Force check c" #~ msgstr "Игнорирай Ð¿Ð¾Ð´Ð¿Ð¸Ñ i" #~ msgid " Unset ignore feed i" #~ msgstr " Ðеизпратени игнор. подпиÑки i" #~ msgid " Ignore feed i" #~ msgstr "Игнорирай Ð¿Ð¾Ð´Ð¿Ð¸Ñ i" #~ msgid " Change status s" #~ msgstr "Смени ÑÑ‚Ð°Ñ‚ÑƒÑ s" #~ msgid " Go to contact.. alt-s" #~ msgstr "Отиди в контакти.. alt-s" #~ msgid " Show offline users F5" #~ msgstr "Покажи изключените конткатки F5" #~ msgid " Hide offline users F5" #~ msgstr "Скрии изключените конткакти F5" #~ msgid "ESC or F9 to close" #~ msgstr "ESC или F9 - затвори" #, fuzzy #~ msgid "+ [lj] disconnected" #~ msgstr "+ [jab] изключване" #~ msgid " Synchronize contact list " #~ msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° контактната лиÑта" #~ msgid "You must be logged in to preform the synchronization" #~ msgstr "Вие трÑбва да Ñте включени за да извършите ÑинхронизациÑта" #~ msgid " Contact list synchronization " #~ msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° контактната лиÑта" #~ msgid "Starting the synchronization process" #~ msgstr "Ðачало на ÑинхронизациÑта" #~ msgid "Attempt #%d" #~ msgstr "Опит #%d" #~ msgid ".. %d already synchronized, %d contacts to be stored" #~ msgstr ".. %d Ñинхрнизира Ñе, оÑтават %d контакти да бъдат запиÑани" #~ msgid "Too many attempts, gave up" #~ msgstr "Прекалено много заÑвки, изчакай" #~ msgid " Uploading buddies " #~ msgstr "ОбновÑване на ÑпиÑка Ñ Ð¿Ñ€Ð¸Ð°Ñ‚ÐµÐ»Ð¸" #~ msgid "No contacts to be synchronized" #~ msgstr "ÐÑма контатки за Ñинхронизиране" #~ msgid ".. all of them are already stored server-side" #~ msgstr ".. вÑички Ñа вече на Ñървъра" #~ msgid "%d contacts are do be stored server-side. Add them now?" #~ msgstr "%d контакти ще бъдат запиÑани на Ñървъра. Да продължи?" #~ msgid ".. adding %s" #~ msgstr ".. добавÑне %s" #~ msgid "Cancelled" #~ msgstr "Отказ" #~ msgid "Timed out" #~ msgstr "ЗакъÑнение" #, fuzzy #~ msgid "Friend list" #~ msgstr "ЛиÑÑ‚ Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð°Ð½Ð¸Ñ‚Ðµ контакти (Игнорирани)" #~ msgid "+ [msn] connecting to the server" #~ msgstr "+ [msn] Ñвързване към Ñървър" #~ msgid "+ [msn] logged in" #~ msgstr "+ [msn] влÑзохте уÑпешно" #~ msgid "+ [msn] disconnected" #~ msgstr "+ [msn] изключен" #~ msgid "+ [yahoo] %s: started typing" #~ msgstr "+ [yahoo] %s: почна да набира текÑÑ‚" #~ msgid "+ [yahoo] %s: stopped typing" #~ msgstr "+ [yahoo] %s: ÑÐ¿Ñ€Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° на текÑÑ‚" #~ msgid "+ [msn] %s: stopped typing" #~ msgstr "+ [msn] %s: ÑÐ¿Ñ€Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° на текÑÑ‚" #~ msgid "+ [msn] %s: started typing" #~ msgstr "+ [msn] %s: Ñтартира набор на текÑÑ‚" #~ msgid " Typing notifications in the log window : %s " #~ msgstr " \"Започнал/завършил набор на текÑÑ‚\" ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² журнала : %s " #~ msgid "+ [icq] %s has requested our away message" #~ msgstr "+ [icq] %s поиÑка вашето 'нÑма ме' Ñъобщение" #~ msgid "%s requested our away message, sent the response" #~ msgstr "%s поиÑка вашето 'нÑма ме' Ñъобщение, отговор изпратен" centerim-4.22.10/mkinstalldirs0000755000175000001440000000653511473011430013214 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2004-02-15.20 # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit 0 ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: centerim-4.22.10/TODO0000644000175000001440000000644311461606612011105 00000000000000/* * * REAMDE FIRST * */ First of all, please help us make CenterIM version 5 a better client. It's a complete rewrite based on libpurple and it's aim is to have a working client with the nice centerim UI. You can find information here http://www.centerim.org/index.php/Cim-5 and http://www.centerim.org/index.php/Cim5-Architecture /* * * DONE * */ /* * * BUGS * */ command line sending via GG doesn't work icq doesn't DL server-based CL on the first connect the ignore list doesn't work for rss build with fribidi -> rss doesn't work? /* * * TODO * */ make the version number update without having to autoreconf. new libmsn --8<-- have you ever used a jabber server with additional transports/agents? centerim behaves a bit "strange" when dealing with transport/agent contacts maybe you can just try using the jabber.ccc.de transports for AIM and ICQ with psi and then with centerim also, centerim doesn't even support service discovery and transport functions (like registration, logon/logoff etc.) so at first you *have to* use psi to register for such a transport and then you can use the jabber account with centerim the gateways will appear as normal contacts but if you try to move them to a group for example, that doesn't "survive" a reconnect more, the contact appears duplicated everytime you reconnect same goes for the server contact itself [ registration ] it doesn't allow me to change that I guess it doesn't query for such transports. but only for user directories this is what happens in Psi when I run the service discovery: and this is what happens in centerim when I go to the "update user details" screen it only queries the vcard and btw, this is what happens when I leave the vcard-screen without changing anything: + [jab] error 501 the server is jabberd2 you can test with jabber.ccc.de or with my own if you wish, I can create you an account there maybe you can try both, as jabber.ccc.de is jabberd1.4 with different transports so those are 2 completely different setups -- maybe good test scenarios so, just tell me and I will create an account for you. public registration is disabled on my server, that's the reason you cannot register one using centerim. something else I've noticed when using centerim and Psi simultaneously for one jabber account when I delete a contact in centerim, Psi notices on the fly and the contact disappears from psi's list when I do it the other way round centerim notices nothing :) --8<-- antispam to block auth events too utf8 jabber services bugs from wolfram contact items duplication update users details -> accept -> error gaim gpg plugin for other IM networks icq invisibility scanner a nice feature would be to be able to add a custom away-message when using centerim -S a -p icq external status event (notification on changing status) icq file transfers multiple history selection LJ records modification don't completely overwrite config files mark deleted LJ friends somehow XML console msn file transfers msn other users' joins to the conversation icq keywords + other parameters simultaneous search icq haspicture flag file insert key Also..you have any command line for change the random group where I appear and send the change to ICQ servers? specific status lists for every protocol, extend the standard statuses stupid conversation logs centerim-4.22.10/src/0000755000175000001440000000000011473011460011247 500000000000000centerim-4.22.10/src/accountmanager.h0000644000175000001440000000045311461606612014337 00000000000000#ifndef __ACCOUNTMANAGER_H__ #define __ACCOUNTMANAGER_H__ #include "icqconf.h" class accountmanager { protected: icqconf::imaccount addcontact(); bool fopen; public: accountmanager(); ~accountmanager(); void exec(); bool isopen() const; }; extern accountmanager manager; #endif centerim-4.22.10/src/icqcontacts.h0000644000175000001440000000276411461606612013672 00000000000000#ifndef __ICQCONTACTS_H__ #define __ICQCONTACTS_H__ #include "cmenus.h" #include "icqconf.h" #include "linkedlist.h" #include "icqcontact.h" #include "icqcommon.h" // a structure to keep the two methods used for sorting struct icqcontacts_sort { /** the first sort is done by status (sortstatus function) * that returns a custom character for each contact and * and the order of status is found in icqcontacts.cc * see SORT_CONTACTS define */ char (*sortstatus)(const icqcontact& a); /** the second sort is done when the contacts have * the same status category as returned by sortstatus * and they are compared with the "compare" function. */ int (*compare)(const icqcontact& a, const icqcontact& b); }; class icqcontacts: public linkedlist { protected: static int clistsort(void *p1, void *p2); public: static void setsortmode(icqconf::sortmode smode); static icqcontacts_sort* sort_order; public: icqcontacts(); ~icqcontacts(); void remove(const imcontact &adesc); void load(); void save(bool removenil = true); void order(); void rearrange(); void setoffline(protocolname pname); icqcontact* addnew(const imcontact &adesc, bool notinlist = true, int agroupid = 0, bool reqauth = false); icqcontact *get(const imcontact &adesc); icqcontact *getmobile(const string &anumber); icqcontact *getemail(const string &aemail); void updateEntry(const imcontact &ic, const string &groupname); }; extern icqcontacts clist; #endif centerim-4.22.10/src/icqhist.h0000644000175000001440000000335411461606612013017 00000000000000#ifndef __ICQHIST_H__ #define __ICQHIST_H__ #include "kkstrtext.h" #include "cmenus.h" #include "icqcommon.h" #include "imcontact.h" #define HIST_MSG_OUT 2 #define HIST_MSG_IN 4 #define HIST_HISTORYMODE 8 #define EVT_MSG 0 #define EVT_URL 1 #define EVT_CHAT 3 #define EVT_EMAIL 4 #define EVT_ONLINE 6 #define ICQM_REQUEST 'R' #define ICQM_ADDED 'I' class icqhistory { protected: class histentry { public: string text; int lastread, color; }; // for fillmenu class storedopen { public: storedopen(FILE *nf) { f = nf; rn = 0; } FILE *f; int rn; vector lastevent; }; FILE *open(const imcontact cinfo, const char *mode); vector opens; public: icqhistory(); ~icqhistory(); void putmessage(const imcontact cinfo, const string text, int dir, struct tm *timestamp); void puturl(const imcontact cinfo, const string url, const string desc, int dir, struct tm *timestamp); void putfile(const imcontact cinfo, unsigned long seq, const string fname, int fsize, int dir, struct tm *timestamp); void putmail(const string nick, const string email, const string msg, int mailt, struct tm *timestamp); bool opencontact(const imcontact cinfo, time_t lastread = 0); int setpos(int n); int setposlastread(time_t lr); int find(const string sub, int pos = 0); int readevent(int &event, time_t &lastread, struct tm &sent, int &dir); void getmessage(string &text); void geturl(string &url, string &text); void getfile(unsigned long &seq, string &fname, int &fsize); void closecontact(); int getpos(); void fillmenu(const imcontact cinfo, verticalmenu *m); }; extern icqhistory hist; #endif centerim-4.22.10/src/icqcontact.h0000644000175000001440000001130211461606612013473 00000000000000#ifndef __ICQCONTACT_H_ #define __ICQCONTACT_H_ #include "icqcommon.h" #include #include #include "cmenus.h" #include "imcontact.h" #include "imevents.h" enum imgender { genderUnspec = 0, genderMale, genderFemale, imgender_size }; ENUM_PLUSPLUS(imgender) class icqcontact { public: struct basicinfo { basicinfo() : country(0), randomgroup(0), requiresauth(false), webaware(false), authawait(false), serverbased(false) { }; string fname, lname, email, city, state, phone, fax; string street, cellular, zip, avatar; unsigned short country, randomgroup; bool requiresauth, webaware, authawait, serverbased; }; struct moreinfo { moreinfo(): age(0), gender(genderUnspec), birth_day(0), birth_month(0), birth_year(0), lang1(0), lang2(0), lang3(0), timezone(0), checkfreq(0), checklast(0) {}; unsigned char age; imgender gender; string homepage; unsigned int birth_day, birth_month, birth_year; unsigned short lang1, lang2, lang3; signed char timezone; string strbirthdate() const; string strtimezone() const; int checkfreq, checklast; }; struct workinfo { workinfo(): country(0) {}; string city, state, phone, fax, street, company; string dept, position, homepage, zip; unsigned short country; }; struct reginfo { string service, password; vector > params; }; protected: imcontact cdesc; imstatus status; int fupdated, groupid, fhistoffset; bool finlist, congratulated, modified, fhasevents, usepgpkey, openedforchat; time_t lastread, lastseen, lasttyping, idlefor, onlinesince; string sound[imevent::imeventtype_size]; string nick, about, dispnick, postponed, lastip, pgpkey; basicinfo binfo; moreinfo minfo; workinfo winfo; reginfo rinfo; vector interests, background; void scanhistory(); string tosane(const string &p) const; public: icqcontact(imcontact adesc); ~icqcontact(); void setstatus(imstatus fstatus, bool reflect = true); void setlastread(time_t flastread); void setlastseen(); void setidlefor(unsigned int minutes); void setnick(const string &fnick); void setdispnick(const string &fnick); void setbasicinfo(const basicinfo &ainfo); void setmoreinfo(const moreinfo &ainfo); void setworkinfo(const workinfo &ainfo); void setreginfo(const reginfo &ainfo); void setinterests(const vector &ainterests); void setbackground(const vector &abackground); void setabout(const string &data); void setlastip(const string &flastip); const basicinfo &getbasicinfo() const { return binfo; } const moreinfo &getmoreinfo() const { return minfo; } const workinfo &getworkinfo() const { return winfo; } const reginfo &getreginfo() const { return rinfo; } const vector &getinterests() const { return interests; } const vector &getbackground() const { return background; } string getabout() const; string getlastip() const; time_t getlastread() const; time_t getlastseen() const; time_t getidlefor() const; imstatus getstatus() const; bool hasevents() const { return fhasevents; } void sethasevents(bool n) { fhasevents = n; } bool isopenedforchat() const { return openedforchat; } void setopenedforchat(bool n) { openedforchat = n; } void toggleopenedforchat() { openedforchat = !openedforchat; } string getnick() const; string getdispnick() const; int updated() const; void unsetupdated(); void setsound(imevent::imeventtype event, const string &sf); void playsound(imevent::imeventtype event) const; void clear(); void load(); void save(); void remove(); void excludefromlist(); void includeintolist(int agroupid, bool reqauth); void includeintolist(); bool inlist() const; bool isbirthday() const; string getdirname() const; char getshortstatus() const; void setpostponed(const string &apostponed); string getpostponed() const; int gethistoffset() const; void sethistoffset(int aoffset); void setgroupid(int agroupid, bool reflect = true); int getgroupid() const; const imcontact getdesc() const; void setdesc(const imcontact &ic); void remindbirthday(bool r); bool operator > (const icqcontact &acontact) const; static int compare1(const icqcontact& a, const icqcontact& b); static int compare2(const icqcontact& a, const icqcontact& b); time_t getlasttyping() const { return lasttyping; } void setlasttyping(time_t t) { lasttyping = t; } time_t getonlinesince() const { return onlinesince; } void setonlinesince(time_t t) { onlinesince = t; } string getpgpkey() const; void setpgpkey(const string &key); bool getusepgpkey() const; void setusepgpkey(bool usekey); set receivedAcks; set sentAcks; }; #endif centerim-4.22.10/src/imcontroller.cc0000644000175000001440000003040511461606612014217 00000000000000/* * * centerim protocol specific user interface related routines * $Id: imcontroller.cc,v 1.56 2004/07/20 22:16:40 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "imcontroller.h" #include "icqface.h" #include "icqhook.h" #include "yahoohook.h" #include "aimhook.h" #include "irchook.h" #include "jabberhook.h" #include "msnhook.h" #include "gaduhook.h" #include "icqcontacts.h" #include "eventmanager.h" #define clr(c) conf->getcolor(c) imcontroller imcontrol; imcontroller::imcontroller() { } imcontroller::~imcontroller() { } bool imcontroller::regdialog(protocolname pname) { bool finished, success; int n, i, b; string pcheck; string prserv = conf->getsockshost() + ":" + i2str(conf->getsocksport()); dialogbox db; ruin = 0; finished = success = false; rnick = rfname = rlname = remail = rpasswd = ""; rserver = icqconf::defservers[pname].server + ":" + i2str(icqconf::defservers[pname].port); db.setwindow(new textwindow(0, 0, face.sizeDlg.width, face.sizeDlg.height, clr(cp_dialog_frame), TW_CENTERED)); db.getwindow()->set_titlef(clr(cp_dialog_highlight), _(" Register on the %s network "), conf->getprotocolname(pname).c_str()); db.settree(new treeview(clr(cp_dialog_text), clr(cp_dialog_selected), clr(cp_dialog_highlight), clr(cp_dialog_text))); db.setbar(new horizontalbar(clr(cp_dialog_text), clr(cp_dialog_selected), _("Change"), _("Go ahead"), 0)); db.addautokeys(); treeview &t = *db.gettree(); while(!finished) { t.clear(); i = db.gettree()->addnode(_(" Details ")); t.addleaff(i, 0, 4, _(" Nickname : %s "), rnick.c_str()); t.addleaff(i, 0, 5, _(" E-Mail : %s "), remail.c_str()); t.addleaff(i, 0, 6, _(" First name : %s "), rfname.c_str()); t.addleaff(i, 0, 7, _(" Last name : %s "), rlname.c_str()); i = db.gettree()->addnode(_(" Password ")); t.addleaff(i, 0, 2, _(" Password to set : %s "), string(rpasswd.size(), '*').c_str()); t.addleaff(i, 0, 3, _(" Check the password : %s "), string(pcheck.size(), '*').c_str()); if(pname != gadu) { i = db.gettree()->addnode(_(" Details ")); t.addleaff(i, 0, 8, _(" Server to use : %s "), rserver.c_str()); } finished = !db.open(n, b, (void **) &i); if(!finished) switch(b) { case 0: switch(i) { case 2: rpasswd = face.inputstr(_("Password: "), rpasswd, '*'); break; case 3: pcheck = face.inputstr(_("Check the password you entered: "), pcheck, '*'); break; case 4: rnick = face.inputstr(_("Nickname to set: "), rnick); break; case 5: remail = face.inputstr(_("E-Mail: "), remail); break; case 6: rfname = face.inputstr(_("First name: "), rfname); break; case 7: rlname = face.inputstr(_("Last name: "), rlname); break; case 8: rserver = face.inputstr(_("Server: "), rserver); break; } break; case 1: if(rpasswd != pcheck) { face.status(_("Passwords do not match")); } else if(rpasswd.empty()) { face.status(_("Password must be entered")); } else if(pname == icq && rpasswd.size() < 6) { face.status(_("Password must be at least 6 chars long")); } else { finished = success = true; } break; } } db.close(); return success; } bool imcontroller::uinreg(icqconf::imaccount &account) { bool fin, success; abstracthook &hook = gethook(account.pname); if(success = regdialog(account.pname)) { unlink((conf->getdirname() + conf->getprotocolname(account.pname) + "-infoset").c_str()); face.progress.show(_(" Registration progress ")); for(fin = false; !fin; ) { face.progress.log(_("Connecting to the server %s ..."), rserver.c_str()); if(hook.regconnect(rserver)) { while(!fin) { face.progress.log(_("Sending request")); while(!ruin && !fin) { fin = hook.regattempt(ruin, rpasswd, remail); if(!fin) { if(fin = (face.ask(_("Timed out waiting for a new uin. Retry?"), ASK_YES | ASK_NO, ASK_YES) == ASK_NO)) { success = false; } else { face.progress.log(_("Retrying..")); } } } if(success) { face.progress.log(_("New UIN received, %lu"), ruin); account.uin = ruin; account.password = rpasswd; conf->checkdir(); ofstream f((conf->getdirname() + conf->getprotocolname(account.pname) + "-infoset").c_str()); if(f.is_open()) { f << rnick << endl << remail << endl << rfname << endl << rlname << endl; f.close(); } } } face.progress.log(_("Disconnected")); sleep(2); } else { fin = (face.ask(_("Unable to connect to icq server. Retry?"), ASK_YES | ASK_NO) == ASK_NO); } } face.progress.hide(); } return success; } bool imcontroller::jabberregistration(icqconf::imaccount &account) { #ifdef BUILD_JABBER bool success; string err; int pos; if(success = regdialog(account.pname)) { unlink((conf->getdirname() + "jabber-infoset").c_str()); face.progress.show(_(" Registration progress ")); face.progress.log(_("Trying to register %s at %s ..."), rnick.c_str(), rserver.c_str()); if(success = jhook.regnick(rnick, rpasswd, rserver, err)) { account.nickname = rnick; account.password = rpasswd; account.server = rserver; if((pos = account.server.find(":")) != -1) { account.port = atoi(account.server.substr(pos+1).c_str()); account.server.erase(pos); } else { account.port = icqconf::defservers[jabber].port; } face.progress.log(_("The Jabber ID was successfully registered")); conf->checkdir(); ofstream f((conf->getdirname() + "jabber-infoset").c_str()); if(f.is_open()) { f << rnick << endl << remail << endl << rfname << endl << rlname << endl; f.close(); } } else { string msgerr = _("Failed"); if(!err.empty()) msgerr += (string) ": " + err; face.progress.log("%s", msgerr.c_str()); } face.progress.log(_("Disconnected")); sleep(2); face.progress.hide(); } return success; #else return false; #endif } void imcontroller::icqupdatedetails() { #ifdef BUILD_ICQ icqcontact *c = clist.get(contactroot); if(ihook.logged()) { c->clear(); ihook.requestinfo(imcontact(conf->getourid(icq).uin, icq)); if(face.updatedetails()) { ihook.sendupdateuserinfo(*c); } } else { face.status(_("You must be logged to the ICQ network to update the details")); } #endif } void imcontroller::aimupdateprofile() { #ifdef BUILD_AIM icqcontact *c = clist.get(contactroot); c->clear(); ahook.requestinfo(imcontact(conf->getourid(aim).nickname, aim)); if(face.updatedetails(0, aim)) ahook.sendupdateuserinfo(*c); #endif } void imcontroller::msnupdateprofile() { #ifdef BUILD_MSN if(mhook.logged()) { mhook.requestinfo(imcontact(conf->getourid(msn).nickname, msn)); string tmp = face.inputstr(_("new MSN friendly nick: "), clist.get(contactroot)->getnick()); if(face.getlastinputkey() != KEY_ESC && !tmp.empty()) { icqcontact *c = clist.get(contactroot); c->setnick(tmp); mhook.sendupdateuserinfo(*c); } } else { face.status(_("You must be logged to the MSN network to update the friendly nick")); } #endif } void imcontroller::jabberupdateprofile() { #ifdef BUILD_JABBER if(jhook.logged()) { icqcontact *c; (c = clist.get(contactroot))->clear(); jhook.requestinfo(imcontact(conf->getourid(jabber).nickname, jabber)); if(face.updatedetails(0, jabber)) jhook.sendupdateuserinfo(*c); } else { face.status(_("You must be logged to the Jabber network to update your details")); } #endif } void imcontroller::gaduupdateprofile() { #ifdef BUILD_GADU if(ghook.logged()) { icqcontact *c; (c = clist.get(contactroot))->clear(); ghook.requestinfo(imcontact(conf->getourid(gadu).uin, jabber)); if(face.updatedetails(0, gadu)) ghook.sendupdateuserinfo(*c); } else { face.status(_("You must be logged to the Gadu-Gadu network to update your details")); } #endif } void imcontroller::registration(icqconf::imaccount &account) { switch(account.pname) { case icq: #ifdef HAVE_LIBJPEG case gadu: #endif uinreg(account); break; case jabber: jabberregistration(account); break; default: face.status("[" + conf->getprotocolname(account.pname) + "] " + _("registration is not supported")); break; } } void imcontroller::updateinfo(icqconf::imaccount &account) { switch(account.pname) { case icq: icqupdatedetails(); break; case aim: aimupdateprofile(); break; case msn: msnupdateprofile(); break; case jabber: jabberupdateprofile(); break; case gadu: gaduupdateprofile(); break; } } // ---------------------------------------------------------------------------- void imsearchparams::save(const string &prname) const { string fname = conf->getconfigfname("search-profiles"), buf, orig; ifstream rf; ofstream of; of.open((fname + ".tmp").c_str()); if(of.is_open()) { rf.open(fname.c_str()); if(rf.is_open()) { while(!rf.eof()) { getstring(rf, orig); if(getword(buf = orig, "\t") != prname) of << orig << endl; } rf.close(); rf.clear(); } of.close(); of.clear(); rename((fname + ".tmp").c_str(), fname.c_str()); } of.open(fname.c_str(), ios::app); if(of.is_open()) { of << prname << "\t" << (int) pname << "\t" << (onlineonly ? "1" : "0") << "\t" << uin << "\t" << minage << "\t" << maxage << "\t" << country << "\t" << language << "\t" << (int) agerange << "\t" << (int) gender << "\t" << firstname << "\t" << lastname << "\t" << nick << "\t" << city << "\t" << state << "\t" << company << "\t" << department << "\t" << position << "\t" << email << "\t" << room << "\t" << (sincelast ? "1" : "0") << "\t" << (reverse ? "1" : "0") << "\t" << service << "\t" << (photo ? "1" : "0") << "\t" << kwords << "\t" << randomgroup; vector >::const_iterator ifp = flexparams.begin(); while(ifp != flexparams.end()) { of << ifp->first << "\t" << ifp->second << "\t"; ++ifp; } of.close(); } } static string getfield(string &buf) { string r; int pos; if((pos = buf.find("\t")) == -1) pos = buf.size(); r = buf.substr(0, pos); buf.erase(0, pos+1); return r; } bool imsearchparams::load(const string &prname) { ifstream f(conf->getconfigfname("search-profiles").c_str()); string buf, flexparam; bool r = false; if(f.is_open()) { while(!f.eof()) { getstring(f, buf); if(r = (getword(buf, "\t") == prname)) { pname = (protocolname) strtoul(getfield(buf).c_str(), 0, 0); onlineonly = getfield(buf) == "1"; uin = strtoul(getfield(buf).c_str(), 0, 0); minage = strtoul(getfield(buf).c_str(), 0, 0); maxage = strtoul(getfield(buf).c_str(), 0, 0); country = strtoul(getfield(buf).c_str(), 0, 0); language = strtoul(getfield(buf).c_str(), 0, 0); agerange = (ICQ2000::AgeRange) strtoul(getfield(buf).c_str(), 0, 0); gender = (imgender) strtoul(getfield(buf).c_str(), 0, 0); firstname = getfield(buf); lastname = getfield(buf); nick = getfield(buf); city = getfield(buf); state = getfield(buf); company = getfield(buf); department = getfield(buf); position = getfield(buf); email = getfield(buf); room = getfield(buf); sincelast = getfield(buf) == "1"; reverse = getfield(buf) == "1"; service = getfield(buf); photo = getfield(buf) == "1"; kwords = getfield(buf); randomgroup = strtoul(getfield(buf).c_str(), 0, 0); while(!buf.empty()) if(!(flexparam = getfield(buf)).empty()) flexparams.push_back(make_pair(flexparam, getfield(buf))); break; } } f.close(); } return r; } centerim-4.22.10/src/centerim.h0000644000175000001440000000367311461606612013165 00000000000000#ifndef __CENTERIM_H__ #define __CENTERIM_H__ #include #include #include #include "kkstrtext.h" #include "icqconf.h" #include "icqcontact.h" #include "eventmanager.h" #include "icqface.h" #define HIDL_SOCKEXIT 2 class centerim { public: enum msgmode { reply, forward, scratch }; static char const * const version; protected: struct reconnectInfo { time_t timer; int period; reconnectInfo(): timer(0), period(30) {} }; time_t timer_checkmail, timer_keypress, timer_update, timer_resend, timer_autosave; bool regmode; static volatile bool signaled; map configstats; map reconnect; static void handlesignal(int signum); void checkparallel(); void inithooks(); bool checkpasswords(); void rereadstatus(); void checkmail(); void checkconfigs(); string quotemsg(const string &text); void setauto(imstatus astatus); void createconference(const imcontact &ic); void defaultcontacts(bool rus); void massmove(); public: centerim(); ~centerim(); void commandline(int argc, char **argv); void exec(); void reg(); void mainloop(); void userinfo(const imcontact &cinfo); void changestatus(); bool updateconf(); void find(); void joindialog(); void linkfeed(); icqcontact *addcontact(const imcontact &ic, bool reqauth = false); bool idle(int options = 0); void exectimers(); icqface::eventviewresult readevent(const imevent &ev, const vector &buttons = vector()); icqface::eventviewresult readevent(const imevent &ev, bool &enough, bool &fin, const vector &buttons = vector()); void readevents(const imcontact cont); void history(const imcontact &cont); bool next_chat(bool next = false); bool sendevent(const imevent &ev, icqface::eventviewresult r); }; extern centerim cicq; #endif centerim-4.22.10/src/icqcontacts.cc0000644000175000001440000002034211473007750014021 00000000000000/* * * centerim contact list class * $Id: icqcontacts.cc,v 1.54 2004/07/08 23:52:48 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "icqcontacts.h" #include "icqmlist.h" #include "icqconf.h" #include "icqgroups.h" #include "abstracthook.h" /* * * SORT_CONTACTS * * o Online * f Free for chat * i Invisible * d Do not disturb * c Occupied * a Away * n N/A * * _ Offline * ! Not in list * N Non-ICQ * # Unread * */ #define SORT_CONTACTS "#odcanl_!N" // this is the original status sort, where the contacts // get sorted by status static char getsortstatus1(const icqcontact& c){ return c.hasevents() ? '#' : \ !c.inlist() ? '!' : \ c.getstatus() == invisible ? 'o' : \ c.getstatus() == freeforchat ? 'o' : \ c.getshortstatus() \ ; } // this is the modified status sort, where the contacts // don't get sorted by status (only by name or whatever) static char getsortstatus2(const icqcontact& c){ return c.hasevents() ? '#' : !c.inlist() ? '!' : 'o'; } static icqcontacts_sort sortmodes[icqconf::sort_by_nb_of_sorts] = { {getsortstatus1, icqcontact::compare1}, // sort_by_status_and_activity {getsortstatus1, icqcontact::compare2}, // sort_by_status_and_name {getsortstatus2, icqcontact::compare1}, // sort_by_activity {getsortstatus2, icqcontact::compare2} // sort_by_name }; icqcontacts_sort *icqcontacts::sort_order = &sortmodes[icqconf::sort_by_status_and_activity]; /* Function used to delete icqcontact when removed from the list */ static void deletecontact(void *contact){ icqcontact *c = (icqcontact *)contact; delete c; } icqcontacts::icqcontacts() { freeitem = deletecontact; } icqcontacts::~icqcontacts() { } icqcontact *icqcontacts::addnew(const imcontact &cinfo, bool notinlist, int agroupid, bool reqauth) { icqcontact *c = new icqcontact(cinfo); switch(cinfo.pname) { case icq: case gadu: c->setnick(i2str(cinfo.uin)); c->setdispnick(i2str(cinfo.uin)); break; default: c->setnick(cinfo.nickname); c->setdispnick(cinfo.nickname); break; } icqcontact::basicinfo bi = c->getbasicinfo(); bi.requiresauth = bi.authawait = reqauth; c->setbasicinfo(bi); if(agroupid) { c->setgroupid(agroupid, false); } c->save(); add(c); if(c) if(notinlist) { c->excludefromlist(); abstracthook &h = gethook(cinfo.pname); if(h.getCapabs().count(hookcapab::cltemporary)) h.sendnewuser(cinfo); h.requestinfo(cinfo); } else { c->includeintolist(); } return c; } void icqcontacts::load() { string tuname, fname, dname; struct dirent *ent; struct stat st; DIR *d; icqcontact *c; imcontact cinfo; protocolname pname; // empty(); if(d = opendir(conf->getdirname().c_str())) { while(ent = readdir(d)) { dname = ent->d_name; tuname = conf->getdirname() + dname; if(!stat(tuname.c_str(), &st)) if(S_ISDIR(st.st_mode)) { c = 0; pname = conf->getprotocolbyletter(dname[0]); switch(pname) { case icq: c = new icqcontact(imcontact(atol(dname.c_str()), pname)); break; case infocard: case rss: case gadu: c = new icqcontact(imcontact(atol(dname.c_str()+1), pname)); break; case protocolname_size: // Strange dir, doesn't belong to any of the // supported protocols. break; case jabber: if(get(imcontact(dname.substr(1), pname))) continue; // Doesn't make sense, transport contacts (and JIDs generally) don't need to contain @ /*if(dname.substr(1).find("@") == -1) { string oldname = conf->getdirname() + dname; string ndname = oldname + "@jabber.com"; if(!access(ndname.c_str(), F_OK)) rename(ndname.c_str(), (conf->getdirname() + "_" + dname).c_str()); rename(oldname.c_str(), ndname.c_str()); dname = justfname(ndname); }*/ default: c = new icqcontact(imcontact(dname.substr(1), pname)); c->setnick(dname.substr(1)); break; } if(c) { if(!get(c->getdesc())) add(c); else delete c; } } } closedir(d); } if(!get(contactroot)) { add(new icqcontact(contactroot)); } } void icqcontacts::save(bool removenil) { int i; for(i = 0; i < count; i++) { icqcontact *c = (icqcontact *) at(i); if(c->inlist()) c->save(); else if(removenil && !c->hasevents()) { string fname = c->getdirname() + "offline"; if(access(fname.c_str(), F_OK)) c->remove(); } } } void icqcontacts::remove(const imcontact &cinfo) { int i; icqcontact *c; for(i = 0; i < count; i++) { c = (icqcontact *) at(i); if(cinfo == c->getdesc()) { c->remove(); linkedlist::remove(i); break; } } } icqcontact *icqcontacts::get(const imcontact &cinfo) { int i; icqcontact *c; for(i = 0; i < count; i++) { c = (icqcontact *) at(i); if(c->getdesc() == cinfo) return (icqcontact *) at(i); } return 0; } void icqcontacts::setsortmode(icqconf::sortmode smode){ sort_order = sortmodes+smode; } int icqcontacts::clistsort(void *p1, void *p2) { icqcontact *c1 = (icqcontact *) p1, *c2 = (icqcontact *) p2; static char *sorder = SORT_CONTACTS; char s1, s2; bool makegroup; s1 = sort_order->sortstatus(*c1); s2 = sort_order->sortstatus(*c2); switch(conf->getgroupmode()) { case icqconf::group1: makegroup = true; break; case icqconf::group2: makegroup = (s1 != '_' && s2 != '_') || (s1 == '_' && s2 == '_'); break; default: makegroup = false; break; } if(makegroup) if(!strchr("!N", s1) && !strchr("!N", s2)) if(!c1->hasevents() && !c2->hasevents()) { if(c1->getgroupid() > c2->getgroupid()) return -1; else if(c1->getgroupid() < c2->getgroupid()) return 1; } if(s1 == s2) { return -sort_order->compare(*c1,*c2); } else { if(strchr(sorder, s1) > strchr(sorder, s2)) return -1; else return 1; } } void icqcontacts::order() { sort(&clistsort); } void icqcontacts::rearrange() { int i; icqcontact *c; for(i = 0; i < count; i++) { c = (icqcontact *) at(i); if(::find(groups.begin(), groups.end(), c->getgroupid()) == groups.end()) { c->setgroupid(1); } } } void icqcontacts::setoffline(protocolname pname) { int i; icqcontact *c; for(i = 0; i < count; i++) { c = (icqcontact *) at(i); if(c->getdesc().pname == pname) c->setstatus(offline); } } icqcontact *icqcontacts::getmobile(const string &anumber) { int i, pos; icqcontact *c; string cnumber, number; if(!anumber.empty()) { number = anumber; while((pos = number.find_first_not_of("0123456789")) != -1) number.erase(pos, 1); for(i = 0; i < count; i++) { c = (icqcontact *) at(i); cnumber = c->getbasicinfo().cellular; while((pos = cnumber.find_first_not_of("0123456789")) != -1) cnumber.erase(pos, 1); if(number == cnumber) return c; } } return 0; } icqcontact *icqcontacts::getemail(const string &aemail) { int i; icqcontact *c; if(!aemail.empty()) { for(i = 0; i < count; i++) { c = (icqcontact *) at(i); if(aemail == c->getbasicinfo().email) return c; } } return 0; } void icqcontacts::updateEntry(const imcontact &ic, const string &groupname) { int gid; icqcontact *c = get(ic); if(!c) c = addnew(ic, false); if(conf->getgroupmode() != icqconf::nogroups && !groupname.empty()) { vector::iterator ig = ::find(groups.begin(), groups.end(), groupname); if(ig != groups.end()) gid = ig->getid(); else gid = groups.add(groupname); } else { gid = 1; } c->setgroupid(gid); } centerim-4.22.10/src/git-version.h.in0000644000175000001440000000014111461606612014215 00000000000000 #ifndef GIT_VERSION_H__ #define GIT_VERSION_H__ # define GIT_VERSION "@GIT_VERSION@" #endif centerim-4.22.10/src/icqface.h0000644000175000001440000002036111461606612012743 00000000000000#ifndef __ICQFACE_H__ #define __ICQFACE_H__ #include "icqcommon.h" #include "dialogbox.h" #include "textinputline.h" #include "texteditor.h" #include "textbrowser.h" #include "fileselector.h" #include "icqconf.h" #include "icqcontact.h" #include "icqmlist.h" #include "imcontroller.h" #define ASK_YES 2 #define ASK_NO 4 #define ASK_CANCEL 8 enum interfaceAction { ACT_QUIT = -50, ACT_MSG, ACT_URL, ACT_STATUS, ACT_REMOVE, ACT_SMS, ACT_CHAT, ACT_FIND, ACT_INFO, ACT_HISTORY, ACT_IGNORE, ACT_ADD, ACT_MENU, ACT_IGNORELIST, ACT_DETAILS, ACT_GMENU, ACT_CONF, ACT_RENAME, ACT_PING, ACT_EDITUSER, ACT_VISIBLELIST, ACT_INVISLIST, ACT_QUICKFIND, ACT_FILE, ACT_GROUPMOVE, ACT_ORG_GROUPS, ACT_HIDEOFFLINE, ACT_FETCHAWAY, ACT_EMAIL, ACT_AUTH, ACT_CONTACT, ACT_VERSION, ACT_JOIN, ACT_LEAVE, ACT_CONFER, ACT_TRANSFERS, ACT_JOINDIALOG, ACT_EXTERN, ACT_RSS, ACT_LJ, ACT_MASS_MOVE, ACT_PGPKEY, ACT_PGPSWITCH, ACT_OTR, ACT_DUMMY }; extern class centerim cicq; class icqface { public: enum eventviewresult { ok, next, cancel, forward, reply, open, accept, reject, info, add, prev, eventviewresult_size }; enum transferstatus { tsInit, tsStart, tsProgress, tsFinish, tsError, tsCancel }; enum findsubject { fsuser, fschannel, fsrss, fs_size }; class icqprogress { protected: textwindow *w; int curline; public: icqprogress(); ~icqprogress(); void log(const char *fmt, ...); void show(const string &title = ""); void hide(); } progress; struct { int x1, y1, x2, y2; } sizeWArea; struct { int width, height; } sizeDlg, sizeBigDlg; protected: treeview *mcontacts; textinputline input; textwindow mainw; fileselector selector; verticalmenu mhist; ofstream flog; vector extractedurls, lastlog, fstatus; linkedlist workareas; #ifdef HAVE_NCURSESW linkedlist workareas2; #endif bool editdone, mainscreenblock, inited, onlinefolder, dotermresize, fneedupdate, detailsfetched, inchat, doredraw, ineditor; int chatlines; time_t chatlastread; imcontact passinfo; const imevent *passevent; icqcontact *last_selected; int find_next_action; struct filetransferitem { string fname; int btotal, bdone; transferstatus status; imfile fr; filetransferitem(const imfile &afr) : btotal(0), bdone(0), fr(afr) { } }; vector transfers; protected: static int editmsgkeys(texteditor &e, int k); static int editaboutkeys(texteditor &e, int k); static int contactskeys(verticalmenu &m, int k); static int multiplekeys(verticalmenu &m, int k); static int historykeys(dialogbox &m, int k); static int userinfokeys(dialogbox &db, int k); static int findreskeys(dialogbox &db, int k); static int eventviewkeys(dialogbox &db, int k); static int findpgpkeys(dialogbox &db, int k); static int statuskeys(verticalmenu &m, int k); static int fullscreenkeys(textbrowser &m, int k); static void editidle(texteditor &e); static void textbrowseridle(textbrowser &b); static void textinputidle(textinputline &il); static void freeworkareabuf(void *p); static void detailsidle(dialogbox &db); static void transferidle(dialogbox &db); static void editchatidle(texteditor &e); static const unsigned int MinPanelWidth = 4; static const unsigned int MinPanelHeight = 4; static void termresize(void); void infoclear(dialogbox &db, icqcontact *c, const imcontact realdesc); void infogeneral(dialogbox &db, icqcontact *c); void infohome(dialogbox &db, icqcontact *c); void infowork(dialogbox &db, icqcontact *c); void infointerests(dialogbox &db, icqcontact *c); void infoabout(dialogbox &db, icqcontact *c); void inforss(dialogbox &db, icqcontact *c); void infolivejournal(dialogbox &db, icqcontact *c); void infofriends(dialogbox &db, icqcontact *c); void infoljrss(dialogbox &db, icqcontact *c); void gendetails(treeview *tree, icqcontact *c = 0); void selectgender(imgender &f); void selectcountry(unsigned short &f); void selectlanguage(unsigned short &f); void selectagerange(ICQ2000::AgeRange &r); void selectrandomgroup(unsigned short &f); enum spmode { spIMonly, spIMplusRSS, spnonIM }; void selectproto(bool prots[], spmode mode = spIMonly); void workarealine(int l, chtype c = HLINE); void showextractedurls(); void extracturls(const string &buf); int groupmanager(const string &text, bool sel); void renderchathistory(); bool sprofmanager(string &name, string &act); void showeventbottom(const imcontact &ic); void invokelist(string &s, vector &v, const string &def, textwindow *w); bool setljparams(imxmlevent *ev); void multichange(bool conv[], bool newstate); string extracttime(const imevent &ev); void peerinfo(int line, const imcontact &ic); void drawopenedchats(int line, int width); void findpgpkey(dialogbox &db, const vector &items); string getprotocolchar(protocolname pname) const; public: int extk; vector muins; icqface(); ~icqface(); void init(); void done(); static void menuidle(verticalmenu &caller); static void dialogidle(dialogbox &caller); string getmenuitem(string mtext, int width, int key, int section); string getstatkey(int key, int section) const; void redraw(); void draw(); void update(); void showtopbar(); void clearworkarea(); void saveworkarea(); void restoreworkarea(); void relaxedupdate(); bool updaterequested(); int key2action(int k, int s); string action2key(int a, int s, int n = 1) const; icqcontact *find_next_chat(); bool next_chat(bool next = true); icqcontact *mainloop(int &action); void fillcontactlist(); void log(const string &text); void log(const char *fmt, ...); void status(const string &text); void status(const char *fmt, ...); void xtermtitle(const string &text = ""); void xtermtitle(const char *fmt, ...); void xtermtitlereset(); bool changestatus(vector &pnames, imstatus &st); int contextmenu(icqcontact *c); int generalmenu(); void modelist(contactstatus cs); bool multicontacts(const string &head = "", const set &protos = set(), contactstatus cs = csnone); void userinfo(const imcontact &cinfo, const imcontact &realinfo); bool updateconf(icqconf::regsound &s, icqconf::regcolor &c); bool finddialog(imsearchparams &s, findsubject subj); bool findresults(const imsearchparams &sp, bool auto = false); void findready(); bool conferencedialog(protocolname &pname, string &name); bool updatedetails(icqcontact *c = 0, protocolname upname = icq); bool sendfiles(const imcontact &cinfo, string &msg, linkedlist &flist); void blockmainscreen(); void unblockmainscreen(); int ask(string q, int options, int deflt = -1); string inputstr(const string &q, const string &defl = "", char passwdchar = 0); string inputfile(const string &q, const string &defl = ""); string inputdir(const string &q, const string &defl = ""); int getlastinputkey() const; void quickfind(verticalmenu *multi = 0); int selectgroup(const string &text); void makeprotocolmenu(verticalmenu &m); void organizegroups(); void histmake(const vector &hist); bool histexec(imevent *&im); bool eventedit(imevent &ev); eventviewresult eventview(const imevent *ev, vector abuttons = vector(), bool nobuttons = false); void fullscreenize(const imevent *ev); bool edit(string &txt, const string &header); bool chat(const imcontact &ic); void transferupdate(const string &fname, const imfile &fr, transferstatus st, int btotal, int bdone); void transfermonitor(); void userinfoexternal(const imcontact &ic); bool selectpgpkey(string &keyid, bool secretonly = false); void leftpanelwidth_inc(const int inc); void logpanelheight_inc(const int inc); void chatpanelheight_inc(const int inc); bool stay_in_chat ; }; extern icqface face; string getbdate(unsigned char fbday, unsigned char fbmonth, unsigned char fbyear); const char *strregsound(icqconf::regsound s); const char *strregcolor(icqconf::regcolor c); const char *strcolormode(icqconf::colormode cm); const char *strint(unsigned int i); const char *strgroupmode(icqconf::groupmode gmode); const char *stryesno(bool b); const char *strgender(imgender g); const char *seteventviewresult(icqface::eventviewresult r); #endif centerim-4.22.10/src/icqhist.cc0000644000175000001440000001641411473007750013157 00000000000000/* * * centerim messages history handling class * $Id: icqhist.cc,v 1.15 2002/11/22 19:11:53 konst Exp $ * * Copyright (C) 2001,2002 by Konstantin Klyagin * * 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 "icqhist.h" #include "icqcontact.h" #include "icqcontacts.h" #include "icqconf.h" icqhistory::icqhistory() { } icqhistory::~icqhistory() { } FILE *icqhistory::open(const imcontact cinfo, const char *mode) { icqcontact *c = clist.get(cinfo); if(!c) { if(conf->getantispam()) return 0; c = clist.addnew(cinfo); } string fname = c->getdirname() + "/history"; return fopen(fname.c_str(), mode); } void icqhistory::putmessage(const imcontact cinfo, const string text, int dir, struct tm *timestamp) { FILE *f = open(cinfo, "a"); if(f) { fprintf(f, "\f\n"); fprintf(f, "%s\nMSG\n", dir == HIST_MSG_OUT ? "OUT" : "IN"); fprintf(f, "%lu\n%lu\n%s\n", mktime(timestamp), time(0), text.c_str()); fclose(f); } } void icqhistory::puturl(const imcontact cinfo, const string url, const string desc, int dir, struct tm *timestamp) { FILE *f = open(cinfo, "a"); if(f) { fprintf(f, "\f\n"); fprintf(f, "%s\nURL\n", dir == HIST_MSG_OUT ? "OUT" : "IN"); fprintf(f, "%lu\n%lu\n%s\n%s\n", mktime(timestamp), time(0), url.c_str(), desc.c_str()); fclose(f); } } void icqhistory::putfile(const imcontact cinfo, unsigned long seq, const string fname, int fsize, int dir, struct tm *timestamp) { FILE *f = open(cinfo, "a"); if(f) { fprintf(f, "\f\n"); fprintf(f, "%s\nFILE\n", dir == HIST_MSG_OUT ? "OUT" : "IN"); fprintf(f, "%lu\n%lu\n", mktime(timestamp), time(0)); fprintf(f, "%lu\n%s\n%lu\n", seq, fname.c_str(), fsize); fclose(f); } } void icqhistory::putmail(const string nick, const string email, const string msg, int mailt, struct tm *timestamp) { } bool icqhistory::opencontact(const imcontact cinfo, time_t lastread) { bool ret = true; FILE *f; if(f = open(cinfo, "r")) { opens.push_back(storedopen(f)); } else { ret = false; } return ret; } int icqhistory::setpos(int n) { char buf[512]; vector::iterator so = opens.end()-1; rewind(so->f); so->rn = 0; if(n) while(!feof(so->f)) { freads(so->f, buf, 512); if(!strcmp(buf, "\f")) { if(++so->rn == n) { break; } } } return so->rn; } int icqhistory::setposlastread(time_t lr) { int ml = 0, fpos; char buf[512]; bool finished; vector::iterator so = opens.end()-1; for(so->rn = 0, rewind(so->f), finished = false; !feof(so->f) && !finished; ) { freads(so->f, buf, 512); if(!strcmp(buf, "\f")) { ml = 0; fpos = ftell(so->f); so->rn++; } else switch(ml) { case 4: if(strtoul(buf, 0, 0) > lr) { fseek(so->f, fpos, SEEK_SET); finished = true; } break; } ml++; } return so->rn; } int icqhistory::find(const string sub, int pos) { int evt, dir, n, lastfound = -1; time_t lr; struct tm tsent; string text, url; setpos(0); while(((n = readevent(evt, lr, tsent, dir)) != -1) && (n < pos)) { switch(evt) { case EVT_MSG: getmessage(text); break; case EVT_URL: geturl(url, text); text += " " + url; break; } if(text.find(sub) != -1) lastfound = n; } return lastfound; } int icqhistory::readevent(int &event, time_t &lastread, struct tm &sent, int &dir) { int ml = 1, thisevent, thisdir; char buf[512]; bool finished, mread = false; time_t t; struct tm tm; vector::iterator so = opens.end()-1; so->lastevent.clear(); for(finished = false; !feof(so->f) && !finished; ) { freads(so->f, buf, 512); if(!strcmp(buf, "\f")) { ml = 0; if(mread) { finished = true; } else { so->lastevent.clear(); } } else switch(ml) { case 1: if(!strcmp(buf, "IN")) thisdir = HIST_MSG_IN; else if(!strcmp(buf, "OUT")) thisdir = HIST_MSG_OUT; break; case 2: if(!strcmp(buf, "URL")) thisevent = EVT_URL; else if(!strcmp(buf, "MSG")) thisevent = EVT_MSG; break; case 3: memcpy(&tm, localtime(&(t = atol(buf))), sizeof(tm)); break; case 4: dir = thisdir; event = thisevent; memcpy(&sent, &tm, sizeof(tm)); lastread = atol(buf); so->rn++; mread = true; break; default: if(ml > 4) so->lastevent.push_back(buf); break; } ml++; } return mread ? so->rn : -1; } void icqhistory::getmessage(string &text) { vector::iterator so = opens.end()-1; vector::iterator i; for(i = so->lastevent.begin(), text = ""; i != so->lastevent.end(); ++i) { if(text.size()) text += "\n"; text += *i; } } void icqhistory::geturl(string &url, string &text) { vector::iterator so = opens.end()-1; vector::iterator i; url = text = ""; for(i = so->lastevent.begin(); i != so->lastevent.end(); ++i) if(i == so->lastevent.begin()) url = *i; else { if(text.size()) text += "\n"; text += *i; } } void icqhistory::getfile(unsigned long &seq, string &fname, int &fsize) { vector::iterator so = opens.end()-1; int i; for(i = 0; i < so->lastevent.size(); i++) switch(i) { case 0: seq = strtoul(so->lastevent[i].c_str(), 0, 0); break; case 1: fname = so->lastevent[i]; break; case 2: fsize = atol(so->lastevent[i].c_str()); } } void icqhistory::closecontact() { if(!opens.empty()) { vector::iterator so = opens.end()-1; fclose(so->f); opens.erase(so); } } void icqhistory::fillmenu(const imcontact cinfo, verticalmenu *m) { int event, dir, color, n = 0; struct tm tm; string text, url; time_t lastread = 0; char buf[512]; list hitems; list::iterator ii; if(opencontact(cinfo)) { while((n = readevent(event, lastread, tm, dir)) != -1) { url = text = ""; switch(event) { case EVT_MSG: getmessage(text); break; case EVT_URL: geturl(url, text); text = url + " " + text; break; } if(cinfo.empty()) text.replace(0, 1, ""); if(text.size()) { if(text.size() > COLS) text.erase(COLS); text = (string) " " + time2str(&lastread, conf->gettimestampformat(), buf) + " " + text; color = dir == HIST_MSG_IN ? conf->getcolor(cp_main_text) : conf->getcolor(cp_main_highlight); histentry h; h.text = text; h.lastread = n; h.color = color; hitems.push_back(h); } } for(ii = --hitems.end(); ; ii--) { m->additemf(ii->color, (void *) ii->lastread, "%s", ii->text.c_str()); if(ii == hitems.begin()) break; } closecontact(); } } int icqhistory::getpos() { vector::iterator so = opens.end()-1; return so->rn; } centerim-4.22.10/src/Makefile.in0000644000175000001440000021204011473011440013231 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = centerim$(EXEEXT) @HAVE_LIBOTR_TRUE@am__append_1 = imotr.cc @HAVE_FRIBIDI_TRUE@am__append_2 = $(FRIBIDI_LIBS) #centerim_CFLAGS += $(FRIBIDI_LIBS) @BUILD_FIRETALK_TRUE@am__append_3 = -L$(top_builddir)/firetalk @BUILD_FIRETALK_TRUE@am__append_4 = -lfiretalk @BUILD_GADU_TRUE@am__append_5 = -L$(top_builddir)/libgadu @BUILD_GADU_TRUE@am__append_6 = -llibgadu @BUILD_JABBER_TRUE@am__append_7 = -L$(top_builddir)/libjabber @BUILD_JABBER_TRUE@am__append_8 = -llibjabber @BUILD_MSN_TRUE@am__append_9 = -L$(top_builddir)/libmsn @BUILD_MSN_TRUE@am__append_10 = -llibmsn @BUILD_YAHOO_TRUE@am__append_11 = -L$(top_builddir)/libyahoo2 @BUILD_YAHOO_TRUE@am__append_12 = -llibyahoo2 subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__centerim_SOURCES_DIST = centerim.cc icqcontact.cc icqgroups.cc \ eventmanager.cc icqdialogs.cc icqhist.cc imexternal.cc \ imcontact.cc imlogger.cc accountmanager.cc icqcontacts.cc \ icqmlist.cc icqcommon.cc imcontroller.cc icqconf.cc \ imevents.cc impgp.cc icqface.cc centermain.cc icqgroup.cc \ captcha.cc git-version.cc imotr.cc @HAVE_LIBOTR_TRUE@am__objects_1 = centerim-imotr.$(OBJEXT) am_centerim_OBJECTS = centerim-centerim.$(OBJEXT) \ centerim-icqcontact.$(OBJEXT) centerim-icqgroups.$(OBJEXT) \ centerim-eventmanager.$(OBJEXT) centerim-icqdialogs.$(OBJEXT) \ centerim-icqhist.$(OBJEXT) centerim-imexternal.$(OBJEXT) \ centerim-imcontact.$(OBJEXT) centerim-imlogger.$(OBJEXT) \ centerim-accountmanager.$(OBJEXT) \ centerim-icqcontacts.$(OBJEXT) centerim-icqmlist.$(OBJEXT) \ centerim-icqcommon.$(OBJEXT) centerim-imcontroller.$(OBJEXT) \ centerim-icqconf.$(OBJEXT) centerim-imevents.$(OBJEXT) \ centerim-impgp.$(OBJEXT) centerim-icqface.$(OBJEXT) \ centerim-centermain.$(OBJEXT) centerim-icqgroup.$(OBJEXT) \ centerim-captcha.$(OBJEXT) centerim-git-version.$(OBJEXT) \ $(am__objects_1) centerim_OBJECTS = $(am_centerim_OBJECTS) am__DEPENDENCIES_1 = @HAVE_FRIBIDI_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) centerim_DEPENDENCIES = $(top_builddir)/src/hooks/libhooks.a \ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) centerim_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(centerim_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(centerim_SOURCES) DIST_SOURCES = $(am__centerim_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ # If the make we are using supports order-only targets we make git_version is # made an order-only prerequisite. Order-only prerequisites are build before # the target(s) but do not lead to a rebuild of the target(s). ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CXXFLAGS = -Wno-write-strings centerim_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/hooks \ -I$(top_srcdir)/connwrap -I$(top_srcdir)/firetalk \ -I$(top_srcdir)/firetalk/../connwrap \ -I$(top_srcdir)/firetalk/../connwrap-0.1 \ -I$(top_srcdir)/kkconsui -I$(top_srcdir)/kkconsui/include \ -I$(top_srcdir)/kkconsui/../kkstrtext \ -I$(top_srcdir)/kkconsui/../kkstrtext-0.1 \ -I$(top_srcdir)/kkstrtext -I$(top_srcdir)/kksystr \ -I$(top_srcdir)/kksystr/include \ -I$(top_srcdir)/kksystr/../kkstrtext \ -I$(top_srcdir)/kksystr/../kkstrtext-0.1 \ -I$(top_srcdir)/libgadu -I$(top_srcdir)/libicq2000 \ -I$(top_srcdir)/libicq2000/libicq2000 \ -I$(top_srcdir)/libjabber \ -I$(top_srcdir)/libjabber/../connwrap \ -I$(top_srcdir)/libjabber/../connwrap-0.1 \ -I$(top_srcdir)/libmsn -I$(top_srcdir)/libmsn/../connwrap \ -I$(top_srcdir)/libmsn/../connwrap-0.1 \ -I$(top_srcdir)/libyahoo2 \ -I$(top_srcdir)/libyahoo2/../connwrap \ -I$(top_srcdir)/libyahoo2/../connwrap-0.1 -I$(top_srcdir)/intl \ -DSHARE_DIR=\"$(pkgdatadir)\" \ -DLOCALEDIR=\"$(datadir)/locale\" centerim_SOURCES = centerim.cc icqcontact.cc icqgroups.cc \ eventmanager.cc icqdialogs.cc icqhist.cc imexternal.cc \ imcontact.cc imlogger.cc accountmanager.cc icqcontacts.cc \ icqmlist.cc icqcommon.cc imcontroller.cc icqconf.cc \ imevents.cc impgp.cc icqface.cc centermain.cc icqgroup.cc \ captcha.cc git-version.cc $(am__append_1) centerim_LDFLAGS = -L$(top_builddir)/connwrap \ -L$(top_builddir)/kkconsui -L$(top_builddir)/kkstrtext \ -L$(top_builddir)/kksystr -L$(top_builddir)/libicq2000 \ $(am__append_3) $(am__append_5) $(am__append_7) \ $(am__append_9) $(am__append_11) centerim_LDADD = $(top_builddir)/src/hooks/libhooks.a -lkkconsui \ -lkkstrtext -lkksystr -llibicq2000 $(am__append_2) \ $(am__append_4) $(am__append_6) $(am__append_8) \ $(am__append_10) $(am__append_12) -lconnwrap @LTLIBINTL@ SUBDIRS = hooks EXTRA_DIST = centerim.cc icqcontact.cc icqgroups.cc eventmanager.cc icqdialogs.cc icqhist.cc imexternal.cc imcontact.cc imlogger.cc accountmanager.cc icqcontacts.cc icqmlist.cc imcontroller.cc icqconf.cc imevents.cc impgp.cc imotr.cc icqface.cc centermain.cc icqgroup.cc icqmlist.h imcontroller.h icqcommon.h icqcontacts.h centerim.h icqgroup.h imcontact.h accountmanager.h eventmanager.h imevents.h icqcontact.h imlogger.h icqconf.h impgp.h imotr.h icqface.h icqgroups.h icqhist.h imexternal.h captcha.h git-version.h.in AUTOMAKE_OPTIONS = foreign # regenerate git-version.h if its content differs from the output of # git-version-gen g_get_cur = sed -ne "s/^\#[ \x09]*define[ \x09]\+GIT_VERSION[ \x09]\+\"\([0-9]\+.*\)\"/\1/p" \ 2>/dev/null < git-version.h | tr -d '\012' g_subst_f = sed -e "s/@GIT_VERSION@/$$VER_GIT/" < git-version.h.in > git-version.h all: all-recursive .SUFFIXES: .SUFFIXES: .cc .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) centerim$(EXEEXT): $(centerim_OBJECTS) $(centerim_DEPENDENCIES) @rm -f centerim$(EXEEXT) $(centerim_LINK) $(centerim_OBJECTS) $(centerim_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-accountmanager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-captcha.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-centerim.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-centermain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-eventmanager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-git-version.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqcommon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqconf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqcontact.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqcontacts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqdialogs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqgroup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqgroups.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqhist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-icqmlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-imcontact.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-imcontroller.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-imevents.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-imexternal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-imlogger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-imotr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/centerim-impgp.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` centerim-centerim.o: centerim.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-centerim.o -MD -MP -MF $(DEPDIR)/centerim-centerim.Tpo -c -o centerim-centerim.o `test -f 'centerim.cc' || echo '$(srcdir)/'`centerim.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-centerim.Tpo $(DEPDIR)/centerim-centerim.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='centerim.cc' object='centerim-centerim.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-centerim.o `test -f 'centerim.cc' || echo '$(srcdir)/'`centerim.cc centerim-centerim.obj: centerim.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-centerim.obj -MD -MP -MF $(DEPDIR)/centerim-centerim.Tpo -c -o centerim-centerim.obj `if test -f 'centerim.cc'; then $(CYGPATH_W) 'centerim.cc'; else $(CYGPATH_W) '$(srcdir)/centerim.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-centerim.Tpo $(DEPDIR)/centerim-centerim.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='centerim.cc' object='centerim-centerim.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-centerim.obj `if test -f 'centerim.cc'; then $(CYGPATH_W) 'centerim.cc'; else $(CYGPATH_W) '$(srcdir)/centerim.cc'; fi` centerim-icqcontact.o: icqcontact.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqcontact.o -MD -MP -MF $(DEPDIR)/centerim-icqcontact.Tpo -c -o centerim-icqcontact.o `test -f 'icqcontact.cc' || echo '$(srcdir)/'`icqcontact.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqcontact.Tpo $(DEPDIR)/centerim-icqcontact.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqcontact.cc' object='centerim-icqcontact.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqcontact.o `test -f 'icqcontact.cc' || echo '$(srcdir)/'`icqcontact.cc centerim-icqcontact.obj: icqcontact.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqcontact.obj -MD -MP -MF $(DEPDIR)/centerim-icqcontact.Tpo -c -o centerim-icqcontact.obj `if test -f 'icqcontact.cc'; then $(CYGPATH_W) 'icqcontact.cc'; else $(CYGPATH_W) '$(srcdir)/icqcontact.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqcontact.Tpo $(DEPDIR)/centerim-icqcontact.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqcontact.cc' object='centerim-icqcontact.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqcontact.obj `if test -f 'icqcontact.cc'; then $(CYGPATH_W) 'icqcontact.cc'; else $(CYGPATH_W) '$(srcdir)/icqcontact.cc'; fi` centerim-icqgroups.o: icqgroups.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqgroups.o -MD -MP -MF $(DEPDIR)/centerim-icqgroups.Tpo -c -o centerim-icqgroups.o `test -f 'icqgroups.cc' || echo '$(srcdir)/'`icqgroups.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqgroups.Tpo $(DEPDIR)/centerim-icqgroups.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqgroups.cc' object='centerim-icqgroups.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqgroups.o `test -f 'icqgroups.cc' || echo '$(srcdir)/'`icqgroups.cc centerim-icqgroups.obj: icqgroups.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqgroups.obj -MD -MP -MF $(DEPDIR)/centerim-icqgroups.Tpo -c -o centerim-icqgroups.obj `if test -f 'icqgroups.cc'; then $(CYGPATH_W) 'icqgroups.cc'; else $(CYGPATH_W) '$(srcdir)/icqgroups.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqgroups.Tpo $(DEPDIR)/centerim-icqgroups.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqgroups.cc' object='centerim-icqgroups.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqgroups.obj `if test -f 'icqgroups.cc'; then $(CYGPATH_W) 'icqgroups.cc'; else $(CYGPATH_W) '$(srcdir)/icqgroups.cc'; fi` centerim-eventmanager.o: eventmanager.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-eventmanager.o -MD -MP -MF $(DEPDIR)/centerim-eventmanager.Tpo -c -o centerim-eventmanager.o `test -f 'eventmanager.cc' || echo '$(srcdir)/'`eventmanager.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-eventmanager.Tpo $(DEPDIR)/centerim-eventmanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='eventmanager.cc' object='centerim-eventmanager.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-eventmanager.o `test -f 'eventmanager.cc' || echo '$(srcdir)/'`eventmanager.cc centerim-eventmanager.obj: eventmanager.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-eventmanager.obj -MD -MP -MF $(DEPDIR)/centerim-eventmanager.Tpo -c -o centerim-eventmanager.obj `if test -f 'eventmanager.cc'; then $(CYGPATH_W) 'eventmanager.cc'; else $(CYGPATH_W) '$(srcdir)/eventmanager.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-eventmanager.Tpo $(DEPDIR)/centerim-eventmanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='eventmanager.cc' object='centerim-eventmanager.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-eventmanager.obj `if test -f 'eventmanager.cc'; then $(CYGPATH_W) 'eventmanager.cc'; else $(CYGPATH_W) '$(srcdir)/eventmanager.cc'; fi` centerim-icqdialogs.o: icqdialogs.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqdialogs.o -MD -MP -MF $(DEPDIR)/centerim-icqdialogs.Tpo -c -o centerim-icqdialogs.o `test -f 'icqdialogs.cc' || echo '$(srcdir)/'`icqdialogs.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqdialogs.Tpo $(DEPDIR)/centerim-icqdialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqdialogs.cc' object='centerim-icqdialogs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqdialogs.o `test -f 'icqdialogs.cc' || echo '$(srcdir)/'`icqdialogs.cc centerim-icqdialogs.obj: icqdialogs.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqdialogs.obj -MD -MP -MF $(DEPDIR)/centerim-icqdialogs.Tpo -c -o centerim-icqdialogs.obj `if test -f 'icqdialogs.cc'; then $(CYGPATH_W) 'icqdialogs.cc'; else $(CYGPATH_W) '$(srcdir)/icqdialogs.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqdialogs.Tpo $(DEPDIR)/centerim-icqdialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqdialogs.cc' object='centerim-icqdialogs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqdialogs.obj `if test -f 'icqdialogs.cc'; then $(CYGPATH_W) 'icqdialogs.cc'; else $(CYGPATH_W) '$(srcdir)/icqdialogs.cc'; fi` centerim-icqhist.o: icqhist.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqhist.o -MD -MP -MF $(DEPDIR)/centerim-icqhist.Tpo -c -o centerim-icqhist.o `test -f 'icqhist.cc' || echo '$(srcdir)/'`icqhist.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqhist.Tpo $(DEPDIR)/centerim-icqhist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqhist.cc' object='centerim-icqhist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqhist.o `test -f 'icqhist.cc' || echo '$(srcdir)/'`icqhist.cc centerim-icqhist.obj: icqhist.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqhist.obj -MD -MP -MF $(DEPDIR)/centerim-icqhist.Tpo -c -o centerim-icqhist.obj `if test -f 'icqhist.cc'; then $(CYGPATH_W) 'icqhist.cc'; else $(CYGPATH_W) '$(srcdir)/icqhist.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqhist.Tpo $(DEPDIR)/centerim-icqhist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqhist.cc' object='centerim-icqhist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqhist.obj `if test -f 'icqhist.cc'; then $(CYGPATH_W) 'icqhist.cc'; else $(CYGPATH_W) '$(srcdir)/icqhist.cc'; fi` centerim-imexternal.o: imexternal.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imexternal.o -MD -MP -MF $(DEPDIR)/centerim-imexternal.Tpo -c -o centerim-imexternal.o `test -f 'imexternal.cc' || echo '$(srcdir)/'`imexternal.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imexternal.Tpo $(DEPDIR)/centerim-imexternal.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imexternal.cc' object='centerim-imexternal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imexternal.o `test -f 'imexternal.cc' || echo '$(srcdir)/'`imexternal.cc centerim-imexternal.obj: imexternal.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imexternal.obj -MD -MP -MF $(DEPDIR)/centerim-imexternal.Tpo -c -o centerim-imexternal.obj `if test -f 'imexternal.cc'; then $(CYGPATH_W) 'imexternal.cc'; else $(CYGPATH_W) '$(srcdir)/imexternal.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imexternal.Tpo $(DEPDIR)/centerim-imexternal.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imexternal.cc' object='centerim-imexternal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imexternal.obj `if test -f 'imexternal.cc'; then $(CYGPATH_W) 'imexternal.cc'; else $(CYGPATH_W) '$(srcdir)/imexternal.cc'; fi` centerim-imcontact.o: imcontact.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imcontact.o -MD -MP -MF $(DEPDIR)/centerim-imcontact.Tpo -c -o centerim-imcontact.o `test -f 'imcontact.cc' || echo '$(srcdir)/'`imcontact.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imcontact.Tpo $(DEPDIR)/centerim-imcontact.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imcontact.cc' object='centerim-imcontact.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imcontact.o `test -f 'imcontact.cc' || echo '$(srcdir)/'`imcontact.cc centerim-imcontact.obj: imcontact.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imcontact.obj -MD -MP -MF $(DEPDIR)/centerim-imcontact.Tpo -c -o centerim-imcontact.obj `if test -f 'imcontact.cc'; then $(CYGPATH_W) 'imcontact.cc'; else $(CYGPATH_W) '$(srcdir)/imcontact.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imcontact.Tpo $(DEPDIR)/centerim-imcontact.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imcontact.cc' object='centerim-imcontact.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imcontact.obj `if test -f 'imcontact.cc'; then $(CYGPATH_W) 'imcontact.cc'; else $(CYGPATH_W) '$(srcdir)/imcontact.cc'; fi` centerim-imlogger.o: imlogger.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imlogger.o -MD -MP -MF $(DEPDIR)/centerim-imlogger.Tpo -c -o centerim-imlogger.o `test -f 'imlogger.cc' || echo '$(srcdir)/'`imlogger.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imlogger.Tpo $(DEPDIR)/centerim-imlogger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imlogger.cc' object='centerim-imlogger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imlogger.o `test -f 'imlogger.cc' || echo '$(srcdir)/'`imlogger.cc centerim-imlogger.obj: imlogger.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imlogger.obj -MD -MP -MF $(DEPDIR)/centerim-imlogger.Tpo -c -o centerim-imlogger.obj `if test -f 'imlogger.cc'; then $(CYGPATH_W) 'imlogger.cc'; else $(CYGPATH_W) '$(srcdir)/imlogger.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imlogger.Tpo $(DEPDIR)/centerim-imlogger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imlogger.cc' object='centerim-imlogger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imlogger.obj `if test -f 'imlogger.cc'; then $(CYGPATH_W) 'imlogger.cc'; else $(CYGPATH_W) '$(srcdir)/imlogger.cc'; fi` centerim-accountmanager.o: accountmanager.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-accountmanager.o -MD -MP -MF $(DEPDIR)/centerim-accountmanager.Tpo -c -o centerim-accountmanager.o `test -f 'accountmanager.cc' || echo '$(srcdir)/'`accountmanager.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-accountmanager.Tpo $(DEPDIR)/centerim-accountmanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='accountmanager.cc' object='centerim-accountmanager.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-accountmanager.o `test -f 'accountmanager.cc' || echo '$(srcdir)/'`accountmanager.cc centerim-accountmanager.obj: accountmanager.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-accountmanager.obj -MD -MP -MF $(DEPDIR)/centerim-accountmanager.Tpo -c -o centerim-accountmanager.obj `if test -f 'accountmanager.cc'; then $(CYGPATH_W) 'accountmanager.cc'; else $(CYGPATH_W) '$(srcdir)/accountmanager.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-accountmanager.Tpo $(DEPDIR)/centerim-accountmanager.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='accountmanager.cc' object='centerim-accountmanager.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-accountmanager.obj `if test -f 'accountmanager.cc'; then $(CYGPATH_W) 'accountmanager.cc'; else $(CYGPATH_W) '$(srcdir)/accountmanager.cc'; fi` centerim-icqcontacts.o: icqcontacts.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqcontacts.o -MD -MP -MF $(DEPDIR)/centerim-icqcontacts.Tpo -c -o centerim-icqcontacts.o `test -f 'icqcontacts.cc' || echo '$(srcdir)/'`icqcontacts.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqcontacts.Tpo $(DEPDIR)/centerim-icqcontacts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqcontacts.cc' object='centerim-icqcontacts.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqcontacts.o `test -f 'icqcontacts.cc' || echo '$(srcdir)/'`icqcontacts.cc centerim-icqcontacts.obj: icqcontacts.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqcontacts.obj -MD -MP -MF $(DEPDIR)/centerim-icqcontacts.Tpo -c -o centerim-icqcontacts.obj `if test -f 'icqcontacts.cc'; then $(CYGPATH_W) 'icqcontacts.cc'; else $(CYGPATH_W) '$(srcdir)/icqcontacts.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqcontacts.Tpo $(DEPDIR)/centerim-icqcontacts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqcontacts.cc' object='centerim-icqcontacts.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqcontacts.obj `if test -f 'icqcontacts.cc'; then $(CYGPATH_W) 'icqcontacts.cc'; else $(CYGPATH_W) '$(srcdir)/icqcontacts.cc'; fi` centerim-icqmlist.o: icqmlist.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqmlist.o -MD -MP -MF $(DEPDIR)/centerim-icqmlist.Tpo -c -o centerim-icqmlist.o `test -f 'icqmlist.cc' || echo '$(srcdir)/'`icqmlist.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqmlist.Tpo $(DEPDIR)/centerim-icqmlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqmlist.cc' object='centerim-icqmlist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqmlist.o `test -f 'icqmlist.cc' || echo '$(srcdir)/'`icqmlist.cc centerim-icqmlist.obj: icqmlist.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqmlist.obj -MD -MP -MF $(DEPDIR)/centerim-icqmlist.Tpo -c -o centerim-icqmlist.obj `if test -f 'icqmlist.cc'; then $(CYGPATH_W) 'icqmlist.cc'; else $(CYGPATH_W) '$(srcdir)/icqmlist.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqmlist.Tpo $(DEPDIR)/centerim-icqmlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqmlist.cc' object='centerim-icqmlist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqmlist.obj `if test -f 'icqmlist.cc'; then $(CYGPATH_W) 'icqmlist.cc'; else $(CYGPATH_W) '$(srcdir)/icqmlist.cc'; fi` centerim-icqcommon.o: icqcommon.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqcommon.o -MD -MP -MF $(DEPDIR)/centerim-icqcommon.Tpo -c -o centerim-icqcommon.o `test -f 'icqcommon.cc' || echo '$(srcdir)/'`icqcommon.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqcommon.Tpo $(DEPDIR)/centerim-icqcommon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqcommon.cc' object='centerim-icqcommon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqcommon.o `test -f 'icqcommon.cc' || echo '$(srcdir)/'`icqcommon.cc centerim-icqcommon.obj: icqcommon.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqcommon.obj -MD -MP -MF $(DEPDIR)/centerim-icqcommon.Tpo -c -o centerim-icqcommon.obj `if test -f 'icqcommon.cc'; then $(CYGPATH_W) 'icqcommon.cc'; else $(CYGPATH_W) '$(srcdir)/icqcommon.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqcommon.Tpo $(DEPDIR)/centerim-icqcommon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqcommon.cc' object='centerim-icqcommon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqcommon.obj `if test -f 'icqcommon.cc'; then $(CYGPATH_W) 'icqcommon.cc'; else $(CYGPATH_W) '$(srcdir)/icqcommon.cc'; fi` centerim-imcontroller.o: imcontroller.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imcontroller.o -MD -MP -MF $(DEPDIR)/centerim-imcontroller.Tpo -c -o centerim-imcontroller.o `test -f 'imcontroller.cc' || echo '$(srcdir)/'`imcontroller.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imcontroller.Tpo $(DEPDIR)/centerim-imcontroller.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imcontroller.cc' object='centerim-imcontroller.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imcontroller.o `test -f 'imcontroller.cc' || echo '$(srcdir)/'`imcontroller.cc centerim-imcontroller.obj: imcontroller.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imcontroller.obj -MD -MP -MF $(DEPDIR)/centerim-imcontroller.Tpo -c -o centerim-imcontroller.obj `if test -f 'imcontroller.cc'; then $(CYGPATH_W) 'imcontroller.cc'; else $(CYGPATH_W) '$(srcdir)/imcontroller.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imcontroller.Tpo $(DEPDIR)/centerim-imcontroller.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imcontroller.cc' object='centerim-imcontroller.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imcontroller.obj `if test -f 'imcontroller.cc'; then $(CYGPATH_W) 'imcontroller.cc'; else $(CYGPATH_W) '$(srcdir)/imcontroller.cc'; fi` centerim-icqconf.o: icqconf.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqconf.o -MD -MP -MF $(DEPDIR)/centerim-icqconf.Tpo -c -o centerim-icqconf.o `test -f 'icqconf.cc' || echo '$(srcdir)/'`icqconf.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqconf.Tpo $(DEPDIR)/centerim-icqconf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqconf.cc' object='centerim-icqconf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqconf.o `test -f 'icqconf.cc' || echo '$(srcdir)/'`icqconf.cc centerim-icqconf.obj: icqconf.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqconf.obj -MD -MP -MF $(DEPDIR)/centerim-icqconf.Tpo -c -o centerim-icqconf.obj `if test -f 'icqconf.cc'; then $(CYGPATH_W) 'icqconf.cc'; else $(CYGPATH_W) '$(srcdir)/icqconf.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqconf.Tpo $(DEPDIR)/centerim-icqconf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqconf.cc' object='centerim-icqconf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqconf.obj `if test -f 'icqconf.cc'; then $(CYGPATH_W) 'icqconf.cc'; else $(CYGPATH_W) '$(srcdir)/icqconf.cc'; fi` centerim-imevents.o: imevents.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imevents.o -MD -MP -MF $(DEPDIR)/centerim-imevents.Tpo -c -o centerim-imevents.o `test -f 'imevents.cc' || echo '$(srcdir)/'`imevents.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imevents.Tpo $(DEPDIR)/centerim-imevents.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imevents.cc' object='centerim-imevents.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imevents.o `test -f 'imevents.cc' || echo '$(srcdir)/'`imevents.cc centerim-imevents.obj: imevents.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imevents.obj -MD -MP -MF $(DEPDIR)/centerim-imevents.Tpo -c -o centerim-imevents.obj `if test -f 'imevents.cc'; then $(CYGPATH_W) 'imevents.cc'; else $(CYGPATH_W) '$(srcdir)/imevents.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imevents.Tpo $(DEPDIR)/centerim-imevents.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imevents.cc' object='centerim-imevents.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imevents.obj `if test -f 'imevents.cc'; then $(CYGPATH_W) 'imevents.cc'; else $(CYGPATH_W) '$(srcdir)/imevents.cc'; fi` centerim-impgp.o: impgp.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-impgp.o -MD -MP -MF $(DEPDIR)/centerim-impgp.Tpo -c -o centerim-impgp.o `test -f 'impgp.cc' || echo '$(srcdir)/'`impgp.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-impgp.Tpo $(DEPDIR)/centerim-impgp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='impgp.cc' object='centerim-impgp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-impgp.o `test -f 'impgp.cc' || echo '$(srcdir)/'`impgp.cc centerim-impgp.obj: impgp.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-impgp.obj -MD -MP -MF $(DEPDIR)/centerim-impgp.Tpo -c -o centerim-impgp.obj `if test -f 'impgp.cc'; then $(CYGPATH_W) 'impgp.cc'; else $(CYGPATH_W) '$(srcdir)/impgp.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-impgp.Tpo $(DEPDIR)/centerim-impgp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='impgp.cc' object='centerim-impgp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-impgp.obj `if test -f 'impgp.cc'; then $(CYGPATH_W) 'impgp.cc'; else $(CYGPATH_W) '$(srcdir)/impgp.cc'; fi` centerim-icqface.o: icqface.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqface.o -MD -MP -MF $(DEPDIR)/centerim-icqface.Tpo -c -o centerim-icqface.o `test -f 'icqface.cc' || echo '$(srcdir)/'`icqface.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqface.Tpo $(DEPDIR)/centerim-icqface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqface.cc' object='centerim-icqface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqface.o `test -f 'icqface.cc' || echo '$(srcdir)/'`icqface.cc centerim-icqface.obj: icqface.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqface.obj -MD -MP -MF $(DEPDIR)/centerim-icqface.Tpo -c -o centerim-icqface.obj `if test -f 'icqface.cc'; then $(CYGPATH_W) 'icqface.cc'; else $(CYGPATH_W) '$(srcdir)/icqface.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqface.Tpo $(DEPDIR)/centerim-icqface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqface.cc' object='centerim-icqface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqface.obj `if test -f 'icqface.cc'; then $(CYGPATH_W) 'icqface.cc'; else $(CYGPATH_W) '$(srcdir)/icqface.cc'; fi` centerim-centermain.o: centermain.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-centermain.o -MD -MP -MF $(DEPDIR)/centerim-centermain.Tpo -c -o centerim-centermain.o `test -f 'centermain.cc' || echo '$(srcdir)/'`centermain.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-centermain.Tpo $(DEPDIR)/centerim-centermain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='centermain.cc' object='centerim-centermain.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-centermain.o `test -f 'centermain.cc' || echo '$(srcdir)/'`centermain.cc centerim-centermain.obj: centermain.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-centermain.obj -MD -MP -MF $(DEPDIR)/centerim-centermain.Tpo -c -o centerim-centermain.obj `if test -f 'centermain.cc'; then $(CYGPATH_W) 'centermain.cc'; else $(CYGPATH_W) '$(srcdir)/centermain.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-centermain.Tpo $(DEPDIR)/centerim-centermain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='centermain.cc' object='centerim-centermain.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-centermain.obj `if test -f 'centermain.cc'; then $(CYGPATH_W) 'centermain.cc'; else $(CYGPATH_W) '$(srcdir)/centermain.cc'; fi` centerim-icqgroup.o: icqgroup.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqgroup.o -MD -MP -MF $(DEPDIR)/centerim-icqgroup.Tpo -c -o centerim-icqgroup.o `test -f 'icqgroup.cc' || echo '$(srcdir)/'`icqgroup.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqgroup.Tpo $(DEPDIR)/centerim-icqgroup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqgroup.cc' object='centerim-icqgroup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqgroup.o `test -f 'icqgroup.cc' || echo '$(srcdir)/'`icqgroup.cc centerim-icqgroup.obj: icqgroup.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-icqgroup.obj -MD -MP -MF $(DEPDIR)/centerim-icqgroup.Tpo -c -o centerim-icqgroup.obj `if test -f 'icqgroup.cc'; then $(CYGPATH_W) 'icqgroup.cc'; else $(CYGPATH_W) '$(srcdir)/icqgroup.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-icqgroup.Tpo $(DEPDIR)/centerim-icqgroup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqgroup.cc' object='centerim-icqgroup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-icqgroup.obj `if test -f 'icqgroup.cc'; then $(CYGPATH_W) 'icqgroup.cc'; else $(CYGPATH_W) '$(srcdir)/icqgroup.cc'; fi` centerim-captcha.o: captcha.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-captcha.o -MD -MP -MF $(DEPDIR)/centerim-captcha.Tpo -c -o centerim-captcha.o `test -f 'captcha.cc' || echo '$(srcdir)/'`captcha.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-captcha.Tpo $(DEPDIR)/centerim-captcha.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='captcha.cc' object='centerim-captcha.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-captcha.o `test -f 'captcha.cc' || echo '$(srcdir)/'`captcha.cc centerim-captcha.obj: captcha.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-captcha.obj -MD -MP -MF $(DEPDIR)/centerim-captcha.Tpo -c -o centerim-captcha.obj `if test -f 'captcha.cc'; then $(CYGPATH_W) 'captcha.cc'; else $(CYGPATH_W) '$(srcdir)/captcha.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-captcha.Tpo $(DEPDIR)/centerim-captcha.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='captcha.cc' object='centerim-captcha.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-captcha.obj `if test -f 'captcha.cc'; then $(CYGPATH_W) 'captcha.cc'; else $(CYGPATH_W) '$(srcdir)/captcha.cc'; fi` centerim-git-version.o: git-version.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-git-version.o -MD -MP -MF $(DEPDIR)/centerim-git-version.Tpo -c -o centerim-git-version.o `test -f 'git-version.cc' || echo '$(srcdir)/'`git-version.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-git-version.Tpo $(DEPDIR)/centerim-git-version.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='git-version.cc' object='centerim-git-version.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-git-version.o `test -f 'git-version.cc' || echo '$(srcdir)/'`git-version.cc centerim-git-version.obj: git-version.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-git-version.obj -MD -MP -MF $(DEPDIR)/centerim-git-version.Tpo -c -o centerim-git-version.obj `if test -f 'git-version.cc'; then $(CYGPATH_W) 'git-version.cc'; else $(CYGPATH_W) '$(srcdir)/git-version.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-git-version.Tpo $(DEPDIR)/centerim-git-version.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='git-version.cc' object='centerim-git-version.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-git-version.obj `if test -f 'git-version.cc'; then $(CYGPATH_W) 'git-version.cc'; else $(CYGPATH_W) '$(srcdir)/git-version.cc'; fi` centerim-imotr.o: imotr.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imotr.o -MD -MP -MF $(DEPDIR)/centerim-imotr.Tpo -c -o centerim-imotr.o `test -f 'imotr.cc' || echo '$(srcdir)/'`imotr.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imotr.Tpo $(DEPDIR)/centerim-imotr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imotr.cc' object='centerim-imotr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imotr.o `test -f 'imotr.cc' || echo '$(srcdir)/'`imotr.cc centerim-imotr.obj: imotr.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT centerim-imotr.obj -MD -MP -MF $(DEPDIR)/centerim-imotr.Tpo -c -o centerim-imotr.obj `if test -f 'imotr.cc'; then $(CYGPATH_W) 'imotr.cc'; else $(CYGPATH_W) '$(srcdir)/imotr.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/centerim-imotr.Tpo $(DEPDIR)/centerim-imotr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='imotr.cc' object='centerim-imotr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(centerim_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o centerim-imotr.obj `if test -f 'imotr.cc'; then $(CYGPATH_W) 'imotr.cc'; else $(CYGPATH_W) '$(srcdir)/imotr.cc'; fi` # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS $(centerim_OBJECTS) git-version.h : $(ORDER_ONLY) git_version .PHONY: git_version git_version: git-version.h.in VER_FILE=`$(g_get_cur)` || true; \ VER_GIT=`cd $(top_srcdir); ./misc/git-version-gen .version`; \ if [ -z "$$VER_FILE" ] || [ "$$VER_FILE" != "$$VER_GIT" ]; then \ $(g_subst_f); \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/src/icqgroup.cc0000644000175000001440000000470311461606612013341 00000000000000/* * * centerim IM contacts group class * $Id: icqgroup.cc,v 1.9 2005/01/30 22:21:34 konst Exp $ * * Copyright (C) 2001 by Konstantin Klyagin * * 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 "icqgroup.h" #include "icqgroups.h" #include "icqcontacts.h" #include "abstracthook.h" icqgroup::icqgroup(int aid, const string &aname) { id = aid; name = aname; collapsed = false; } icqgroup::~icqgroup() { } int icqgroup::getcount(bool countonline, bool countoffline) { int i, counter; for(i = counter = 0; i < clist.count; i++) { icqcontact *c = (icqcontact *) clist.at(i); if(c->getgroupid() == id) { if(countoffline && c->getstatus() == offline) counter++; if(countonline && c->getstatus() != offline) counter++; } } return counter; } void icqgroup::moveup() { int nid = id-1; while(nid > 0) { if(find(groups.begin(), groups.end(), nid) != groups.end()) break; nid--; } if(nid > 0) exchange(nid); } void icqgroup::movedown() { int nid = id+1; int fid = (groups.end()-1)->id; while(nid <= fid) { if(find(groups.begin(), groups.end(), nid) != groups.end()) break; nid++; } if(nid <= fid) exchange(nid); } void icqgroup::exchange(int nid) { int i; icqcontact *c; vector::iterator ig; ig = find(groups.begin(), groups.end(), nid); if(ig != groups.end()) { for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getgroupid() == id) c->setgroupid(nid, false); else if(c->getgroupid() == nid) c->setgroupid(id, false); } ig->id = id; id = nid; } } void icqgroup::rename(const string &aname) { string oldname = name; name = aname; for(protocolname pname = icq; pname != protocolname_size; pname++) gethook(pname).renamegroup(oldname, name); } centerim-4.22.10/src/icqgroup.h0000644000175000001440000000170711461606612013204 00000000000000#ifndef __ICQGROUP_H__ #define __ICQGROUP_H__ #include "icqcommon.h" #include "imcontact.h" class icqgroup { private: int id; string name; bool collapsed; void exchange(int nid); public: icqgroup(int aid, const string &aname); ~icqgroup(); string getname() const { return name; } int getid() const { return id; } int getcount(bool countonline, bool countoffline); bool iscollapsed() { return collapsed; } void changecollapsed() { collapsed = !collapsed; } void moveup(); void movedown(); void rename(const string &aname); bool operator == (int aid) const { return id == aid; } bool operator != (int aid) const { return !(*this == aid); } bool operator == (const string &aname) const { return name == aname; } bool operator != (const string &aname) const { return !(*this == aname); } bool operator < (const icqgroup &ag) const { return id < ag.id; } bool operator > (const icqgroup &ag) const { return id > ag.id; } }; #endif centerim-4.22.10/src/imotr.h0000644000175000001440000000215411461606612012502 00000000000000#ifndef __IMOTR_H__ #define __IMOTR_H__ #include "icqcommon.h" #include "imcontact.h" /* libotr headers */ #ifdef __cplusplus extern "C" { #endif #include #include #ifdef __cplusplus } #endif #define PRIVKEYFNAME "otr.private_key" #define STOREFNAME "otr.fingerprints" extern OtrlUserState otrg_plugin_userstate; class imotr { private: OtrlUserState userstate; void start_session(OtrlAuthInfo *auth); public: OtrlUserState get_userstate(); bool send_message(const protocolname pname, const string &touser, string &text); // return false: do not send message bool receive_message(const protocolname pname, const string &from, string &text); // return false: do not show message string get_msg_state(const protocolname pname, const string user); string is_verified(const protocolname pname, const string user); int yesno(const char *question); void dialog(); void start_session(icqcontact *contact); void end_session(icqcontact *contact); imotr(); ~imotr(); void init(); }; extern imotr otr; #endif centerim-4.22.10/src/accountmanager.cc0000644000175000001440000002172311461606612014500 00000000000000/* * * centerim account manager dialog implementation * $Id: accountmanager.cc,v 1.43 2005/01/26 23:52:46 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "accountmanager.h" #include "icqface.h" #include "icqhook.h" #include "yahoohook.h" #include "imcontroller.h" #include "icqcontacts.h" #include "impgp.h" #define getcolor(c) conf->getcolor(c) accountmanager manager; accountmanager::accountmanager() { fopen = false; } accountmanager::~accountmanager() { } icqconf::imaccount accountmanager::addcontact() { icqconf::imaccount account; return account; } void accountmanager::exec() { dialogbox db; int n, b, i, citem, action, pos; set capab; string spname, tmp; bool fin; icqconf::imaccount a; protocolname pname; face.blockmainscreen(); fopen = true; db.setwindow(new textwindow(0, 0, face.sizeDlg.width, face.sizeDlg.height, getcolor(cp_dialog_frame), TW_CENTERED, getcolor(cp_dialog_highlight), _(" IM account manager "))); db.settree(new treeview(getcolor(cp_dialog_text), getcolor(cp_dialog_selected), getcolor(cp_dialog_highlight), getcolor(cp_dialog_text))); db.setbar(new horizontalbar(getcolor(cp_dialog_text), getcolor(cp_dialog_selected), _("Change"), _("Done"), 0)); db.addautokeys(); db.idle = &face.dialogidle; treeview &t = *db.gettree(); map mod; for(protocolname pname = icq; pname != protocolname_size; pname++) mod[pname] = false; for(fin = false; !fin; ) { t.clear(); for(pname = icq; pname != protocolname_size; pname++) { if(pname != rss && gethook(pname).enabled()) { a = conf->getourid(pname); n = t.addnode(0, 0, 0, " " + conf->getprotocolname(a.pname) + " "); citem = ((int) (a.pname)+1) * 100; capab = gethook(a.pname).getCapabs(); if(!a.empty()) { tmp = ""; if(!a.server.empty() && a.port) tmp = a.server + ":" + i2str(a.port); t.addleaff(n, 0, citem+9, _(" Server : %s "), tmp.c_str()); if(capab.count(hookcapab::ssl)) t.addleaff(n, 0, citem+13, _(" Secured : %s "), stryesno(a.additional["ssl"] == "1")); } switch(a.pname) { case icq: case gadu: t.addleaff(n, 0, citem+2, _(" UIN : %s "), a.uin ? i2str(a.uin).c_str() : ""); break; default: t.addleaff(n, 0, citem+1, _(" Login : %s "), a.nickname.c_str()); break; } t.addleaff(n, 0, citem+5, capab.count(hookcapab::optionalpassword) ? _(" Password (optional) : %s ") : _(" Password : %s "), string(a.password.size(), '*').c_str()); if(!a.empty()) switch(a.pname) { case jabber: t.addleaff(n, 0, citem+14, _(" Priority : %s "), a.additional["prio"].c_str()); break; case livejournal: t.addleaff(n, 0, citem+11, _(" Import friend list : %s "), stryesno(a.additional["importfriends"] == "1")); break; case irc: t.addleaff(n, 0, citem+12, _(" NickServ password (optional) : %s "), string(a.additional["nickpass"].size(), '*').c_str()); break; } if(!a.empty()) if(capab.count(hookcapab::acknowledgements)) t.addleaff(n, 0, citem+17, _(" Request receipts: %s "), stryesno(a.additional["acknowledgements"] == "1")); #ifdef HAVE_UNAME if(!a.empty()) if(pname == jabber) t.addleaff(n, 0, citem+18, _(" Send OS info: %s "), stryesno(a.additional["osinfo"] == "1")); #endif if(a.empty()) { t.addnode(n, 0, citem+6, _(" Register ")); } else { #ifdef HAVE_GPGME if(capab.count(hookcapab::pgp)) { t.addleaff(n, 0, citem+15, _(" OpenPGP key: %s "), a.additional["pgpkey"].empty() ? "none" : a.additional["pgpkey"].c_str()); if(!a.additional["pgpkey"].empty()) t.addleaff(n, 0, citem+16, _(" Key passphrase: %s "), string(a.additional["pgppass"].size(), '*').c_str()); } #endif if(capab.count(hookcapab::changedetails)) t.addnode(n, 0, citem+7, a.pname == msn ? _(" Change nickname ") : _(" Update user details ")); if(capab.count(hookcapab::setaway)) t.addnode(n, 0, citem+10, _(" Set away message ")); if(capab.count(hookcapab::setextstatus)) { if( ( conf->getstatus(pname) != offline ) && ( conf->getstatus(pname) != invisible )) t.addnode(n, 0, citem+19, _(" Set external status ")); } t.addnode(n, 0, citem+8, _(" Drop ")); } } } fin = !db.open(n, b, (void **) &citem) || (b == 1); if(!fin && citem) { action = citem-(citem/100)*100; pname = (protocolname) (citem/100-1); a = conf->getourid(pname); spname = conf->getprotocolname(pname); abstracthook &hook = gethook(pname); capab = hook.getCapabs(); switch(action) { case 1: tmp = face.inputstr(spname + _(" user name: "), a.nickname); if(face.getlastinputkey() != KEY_ESC && !tmp.empty()) a.nickname = tmp; break; case 2: i = strtoul(face.inputstr(spname + _(" uin: "), i2str(a.uin)).c_str(), 0, 0); if(face.getlastinputkey() != KEY_ESC && i) a.uin = i; break; case 5: tmp = face.inputstr(spname + _(" password: "), a.password, '*'); if(face.getlastinputkey() != KEY_ESC && (!tmp.empty() || capab.count(hookcapab::optionalpassword))) a.password = tmp; break; case 6: if(!a.empty()) { face.status(_("Drop the account information first!")); } else { imcontrol.registration(a); } break; case 7: imcontrol.updateinfo(a); break; case 8: if(!hook.online()) { a = icqconf::imaccount(a.pname); } else { face.status(_("You have to disconnect the service first!")); } break; case 9: tmp = ""; if(!a.server.empty()) tmp = a.server + ":" + i2str(a.port); tmp = face.inputstr(spname + _(" server address: "), tmp); if(face.getlastinputkey() != KEY_ESC && !tmp.empty()) { if((pos = tmp.find(":")) != -1) { a.server = tmp.substr(0, pos); a.port = strtoul(tmp.substr(pos+1).c_str(), 0, 0); } else { a.server = tmp; a.port = 0; } } break; case 10: if(face.edit(tmp = conf->getawaymsg(a.pname), spname + ": " + _("away message"))) { conf->setawaymsg(a.pname, tmp); } break; case 11: a.additional["importfriends"] = (a.additional["importfriends"] == "1") ? "0" : "1"; break; case 12: tmp = face.inputstr(spname + _(" password: "), a.additional["nickpass"], '*'); if(face.getlastinputkey() != KEY_ESC) a.additional["nickpass"] = tmp; break; case 13: a.additional["ssl"] = (a.additional["ssl"] == "0") ? "1" : "0"; if(a.additional["ssl"] == "1") { if(a.port == icqconf::defservers[a.pname].port) a.port = icqconf::defservers[a.pname].secureport; } else { if(a.port == icqconf::defservers[a.pname].secureport) a.port = icqconf::defservers[a.pname].port; } break; case 14: tmp = leadcut(trailcut(face.inputstr(spname + _(" priority: "), a.additional["prio"]))); if(face.getlastinputkey() != KEY_ESC) if(i2str(atoi(tmp.c_str())) == tmp) a.additional["prio"] = tmp; break; case 15: face.selectpgpkey(a.additional["pgpkey"], true); break; case 16: tmp = face.inputstr(_("PGP key passphrase: "), a.additional["pgppass"], '*'); if(face.getlastinputkey() != KEY_ESC) a.additional["pgppass"] = tmp; break; case 17: a.additional["acknowledgements"] = (a.additional["acknowledgements"] == "") ? "1" : ""; break; #ifdef HAVE_UNAME case 18: a.additional["osinfo"] = (a.additional["osinfo"] == "") ? "1" : ""; break; #endif case 19: if(face.edit(tmp = conf->getextstatus(a.pname, conf->getstatus(pname)), spname + (string)": " + imstatus2str(conf->getstatus(pname)) + (string)" external status" )) { conf->setextstatus(a.pname, tmp, conf->getstatus(pname)); } break; } if(action != 7) { conf->setourid(a); mod[a.pname] = true; } } } db.close(); face.unblockmainscreen(); for(pname = icq; pname != protocolname_size; pname++) if(mod[pname]) gethook(pname).ouridchanged(conf->getourid(pname)); conf->save(); face.relaxedupdate(); fopen = false; } bool accountmanager::isopen() const { return fopen; } centerim-4.22.10/src/impgp.h0000644000175000001440000000171711461606612012470 00000000000000#ifndef __IMPGP_H__ #define __IMPGP_H__ #include "icqcommon.h" #ifdef HAVE_GPGME #include "imcontact.h" #include class impgp { private: gpgme_ctx_t ctx; static protocolname opname; static string passphrase[protocolname_size]; void strip(string &r); static gpgme_error_t passphrase_cb(void *hook, const char *uidhint, const char *info, int prevbad, int fd); public: impgp(); ~impgp(); vector getkeys(bool secretonly = false); string getkeyinfo(const string &fp, bool secret); bool havekey(const string &keyid) const; string sign(const string &text, const string &keyid, protocolname pname); string verify(string sign, const string &orig); string decrypt(string text, protocolname pname); string encrypt(const string &text, const string &keyid, protocolname pname); bool enabled(protocolname p) const; bool enabled(const imcontact &ic) const; void clearphrase(protocolname p); }; extern impgp pgp; #endif #endif centerim-4.22.10/src/icqconf.h0000644000175000001440000002537711461606612013006 00000000000000#ifndef __ICQCONF_H__ #define __ICQCONF_H__ #include "icqcommon.h" #include #include #include #include "config.h" #include "kkstrtext.h" #include "kkfsys.h" #include "conscommon.h" #include "colorschemer.h" #include "icqgroup.h" #include "captcha.h" enum cicq_colorpairs { cp_status = 1, cp_dialog_text, cp_dialog_menu, cp_dialog_selected, cp_dialog_highlight, cp_dialog_frame, cp_main_text, cp_main_menu, cp_main_selected, cp_main_highlight, cp_main_frame, cp_main_history_incoming, cp_main_history_outgoing, cp_clist_icq, cp_clist_yahoo, cp_clist_infocard, cp_clist_msn, cp_clist_aim, cp_clist_irc, cp_clist_jabber, cp_clist_rss, cp_clist_lj, cp_clist_gadu, cp_clist_online, cp_clist_offline, cp_clist_away, cp_clist_dnd, cp_clist_na, cp_clist_occupied, cp_clist_free_for_chat, cp_clist_invisible, cp_clist_not_in_list, cp_clist_unread, }; enum cicq_keybindings { section_contact, section_history, section_editor, section_info, key_info, key_quit, key_change_status, key_history, key_fetch_away_message, key_user_menu, key_general_menu, key_hide_offline, key_contact_external_action, key_add, key_fullscreen, key_remove, key_send_message, key_compose, key_send_contact, key_send_url, key_rename, key_version, key_edit, key_ignore, key_quickfind, key_search, key_search_again, key_next_chat, key_prev_chat, key_out_chat, key_show_urls, key_rss_check, key_multiple_recipients, key_user_external_action, key_left_panel_move_right, key_left_panel_move_left, key_log_panel_move_up, key_log_panel_move_down, key_chat_panel_move_up, key_chat_panel_move_down, key_otr_start_session, key_otr_end_session }; class icqconf { public: enum regsound { rscard, rsspeaker, rsdisable, rsdontchange }; enum regcolor { rcdark, rcblue, rcdontchange }; enum groupmode { group1, group2, nogroups }; enum colormode { cmproto, cmstatus }; // leave the sort_by_nb_of_sorts as the last value // do not forget to add the new sort types to the icqcontacts.cc enum sortmode { sort_by_status_and_activity, sort_by_status_and_name, sort_by_activity, sort_by_name, sort_by_nb_of_sorts}; struct imserver { string server; int port, secureport; }; struct keybinding { int section, key, action; bool alt, ctrl; }; struct imaccount { imaccount(); imaccount(protocolname apname); string nickname, server, password; unsigned long uin, port; protocolname pname; map additional; void write(ofstream &f); void read(const string &spec); bool empty() const; bool operator == (protocolname apname) const; bool operator != (protocolname apname) const; }; static imserver defservers[]; static vector keys; protected: icqconf(); icqconf(const icqconf&); icqconf& operator=(const icqconf&); vector groups; vector accounts; unsigned short socksport, smtpport, httpproxyport; int autoaway, autona, ptpmin, ptpmax; bool hideoffline, quote, savepwd, antispam, screenna, mailcheck, makelog, fenoughdiskspace, askaway, bidi, logtimestamps, logonline, emacs, proxyconnect, proxyssl, notitles, debug, timestampstothesecond, dropauthreq, usingcaptcha, askquit, showopenedchats, vi, autoawayx; unsigned int captchatimeout; bool startoffline; bool chatmode[protocolname_size]; bool cpconvert[protocolname_size]; bool entersends[protocolname_size]; bool nonimonline[protocolname_size]; bool docaptcha[protocolname_size]; string sockshost, socksuser, sockspass, basedir, argv0, smtphost, bindhost, httpproxyhost, httpproxyuser, httpproxypasswd, fromcharset, tocharset, browser, screensocketpath, captchagreet, captchasuccess, captchafailure; char *DEFAULT_TIMESTAMP_FORMAT, *DEFAULT_LOGTIMESTAMP_FORMAT, *SECONDS_TIMESTAMP_FORMAT, *SECONDS_LOGTIMESTAMP_FORMAT; char *timestampformat, *logtimestampformat; map actions; regsound rs; regcolor rc; groupmode fgroupmode; colormode cm; sortmode fsortmode; int leftpanelwidth; int logpanelheight; int chatpanelheight; string defaultAuthMessage; colorschemer schemer; void loadmainconfig(); void usage() const; void constructevent(const string &event, const string &proto, const string &dest, const string &number) const; void externalstatuschange(char st, const string &proto) const; void initmultiproto(bool p[], string buf, bool excludenochat); void selfsignal(int signum) const; void setproxy(); public: static icqconf* instance(); ~icqconf(); void checkdir(); void load(); int getcolor(cicq_colorpairs cp) const { return schemer[cp]; } int getprotcolor(protocolname pname) const; int getstatuscolor(imstatus status) const; void save(); void loadkeys(); void loadcolors(); void loadsounds(); void loadactions(); void loadcaptcha(); regcolor getregcolor() const; void setregcolor(regcolor c); regsound getregsound() const; void setregsound(regsound s); colormode getcolormode() const; void setcolormode(colormode c); bool getemacs() const { return emacs; } void setemacs(bool fem); bool getvi() const { return vi; } void setvi(bool b); bool gethideoffline() const { return hideoffline; } void sethideoffline(bool fho); bool getantispam() const { return antispam; } void setantispam(bool fas); bool getdropauthreq() const { return dropauthreq; } void setdropauthreq(bool fas); bool getusingcaptcha() const { return usingcaptcha; } void setusingcaptcha(bool fas); bool getmailcheck() const { return mailcheck; } void setmailcheck(bool fmc); void getauto(int &away, int &na, bool& usex) const; void setauto(int away, int na, bool usex); bool getscreenna() const; void setscreenna(bool screenna); string getscreensocketpath() const; void setscreensocketpath(string path); bool getquote() const { return quote; } void setquote(bool use); bool getsavepwd() const { return savepwd; } void setsavepwd(bool ssave); bool getmakelog() const { return makelog; } void setmakelog(bool slog); bool getproxyconnect() const { return proxyconnect; } void setproxyconnect(bool proxyconnect); bool getproxyssl() const { return proxyssl; } void setproxyssl(bool sproxyssl); bool getcpconvert(protocolname pname) const; void setcpconvert(protocolname pname, bool fcpconvert); bool getbidi() const { return bidi; } void setbidi(bool fbidi); bool getaskaway() const { return askaway; } void setaskaway(bool faskaway); bool getchatmode(protocolname pname); void setchatmode(protocolname pname, bool fchatmode); bool getaskquit() const { return askquit; } void setaskquit(bool faskquit); bool getentersends(protocolname pname); void setentersends(protocolname pname, bool fentersends); bool getnonimonline(protocolname pname); void setnonimonline(protocolname pname, bool fnonimonline); bool gettimestampstothesecond() const { return timestampstothesecond; } void settimestampstothesecond(bool ftimestampstothesecond); char *gettimestampformat() const { return timestampformat; } ; char *getlogtimestampformat() const { return logtimestampformat; } ; groupmode getgroupmode() const { return fgroupmode; } void setgroupmode(groupmode amode); sortmode getsortmode() const { return fsortmode; } void setsortmode(sortmode smode); string getsockshost() const; unsigned int getsocksport() const; void setsockshost(const string &nsockshost); string getsmtphost() const; unsigned int getsmtpport() const; void setsmtphost(const string &asmtphost); string getbrowser() const; void setbrowser(const string &abrowser); string gethttpproxyhost() const; unsigned int gethttpproxyport() const; void sethttpproxyhost(const string &ahttpproxyhost); string gethttpproxyuser() const; string gethttpproxypasswd() const; void getsocksuser(string &name, string &pass) const; void setsocksuser(const string &name, const string &pass); void getpeertopeer(int &min, int &max) const { min = ptpmin; max = ptpmax; } void setpeertopeer(int min, int max) { ptpmin = min; ptpmax = max; } bool getshowopenedchats() const { return showopenedchats; } void setshowopenedchats(bool fsoc); string execaction(const string &action, const string ¶m = ""); imstatus getstatus(protocolname pname); void savestatus(protocolname pname, imstatus st); void setavatar(protocolname pname, const string &ava); string getprotocolname(protocolname pname) const; protocolname getprotocolbyletter(char letter) const; string getprotocolprefix(protocolname pname) const; int getouridcount() const { return accounts.size(); } imaccount getourid(protocolname pname) const; void setourid(const imaccount &im); string getawaymsg(protocolname pname) const; string getextstatus(protocolname pname, imstatus status) const; void setawaymsg(protocolname pname, const string &amsg); void setextstatus(protocolname pname, const string &amsg, imstatus status); string getdirname() const { return basedir; } string getconfigfname(const string &fname) const { return getdirname() + fname; } void commandline(int argc, char **argv); bool enoughdiskspace() const { return fenoughdiskspace; } void checkdiskspace(); string getbindhost() const { return bindhost; } void getlogoptions(bool &flogtimestamps, bool &flogonline) { flogtimestamps = logtimestamps, flogonline = logonline; } void setlogoptions(bool flogtimestamps, bool flogonline) { logtimestamps = flogtimestamps, logonline = flogonline; } void setcharsets(const string &from, const string &to); const char *getconvertfrom(protocolname pname = protocolname_size) const; const char *getconvertto(protocolname pname = protocolname_size) const; bool getxtitles() const { return !notitles; } bool getdebug() const { return debug; } int getleftpanelwidth() const { return leftpanelwidth; } void setleftpanelwidth(const int width) { leftpanelwidth = width; } int getlogpanelheight() const { return logpanelheight; } void setlogpanelheight(const int height) { logpanelheight = height; } int getchatpanelheight() const { return chatpanelheight; } void setchatpanelheight(const int height) { chatpanelheight = height; } string getDefaultAuthMessage() const { return defaultAuthMessage; } void setDefaultAuthMessage(const string m) { defaultAuthMessage = m; } string getcaptchagreet() const { return captchagreet; } string getcaptchasuccess() const { return captchasuccess; } string getcaptchafailure() const { return captchafailure; } unsigned int getcaptchatimeout() const { return captchatimeout; } captcha thecaptcha; private: static icqconf* self; }; extern icqconf* conf; #endif centerim-4.22.10/src/Makefile.am0000644000175000001440000000721011461606612013231 00000000000000AM_CXXFLAGS = -Wno-write-strings centerim_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/hooks -I$(top_srcdir)/connwrap -I$(top_srcdir)/firetalk -I$(top_srcdir)/firetalk/../connwrap -I$(top_srcdir)/firetalk/../connwrap-0.1 -I$(top_srcdir)/kkconsui -I$(top_srcdir)/kkconsui/include -I$(top_srcdir)/kkconsui/../kkstrtext -I$(top_srcdir)/kkconsui/../kkstrtext-0.1 -I$(top_srcdir)/kkstrtext -I$(top_srcdir)/kksystr -I$(top_srcdir)/kksystr/include -I$(top_srcdir)/kksystr/../kkstrtext -I$(top_srcdir)/kksystr/../kkstrtext-0.1 -I$(top_srcdir)/libgadu -I$(top_srcdir)/libicq2000 -I$(top_srcdir)/libicq2000/libicq2000 -I$(top_srcdir)/libjabber -I$(top_srcdir)/libjabber/../connwrap -I$(top_srcdir)/libjabber/../connwrap-0.1 -I$(top_srcdir)/libmsn -I$(top_srcdir)/libmsn/../connwrap -I$(top_srcdir)/libmsn/../connwrap-0.1 -I$(top_srcdir)/libyahoo2 -I$(top_srcdir)/libyahoo2/../connwrap -I$(top_srcdir)/libyahoo2/../connwrap-0.1 -I$(top_srcdir)/intl bin_PROGRAMS = centerim centerim_SOURCES = centerim.cc icqcontact.cc icqgroups.cc eventmanager.cc icqdialogs.cc icqhist.cc imexternal.cc imcontact.cc imlogger.cc accountmanager.cc icqcontacts.cc icqmlist.cc icqcommon.cc imcontroller.cc icqconf.cc imevents.cc impgp.cc icqface.cc centermain.cc icqgroup.cc captcha.cc git-version.cc centerim_LDFLAGS = -L$(top_builddir)/connwrap -L$(top_builddir)/kkconsui -L$(top_builddir)/kkstrtext -L$(top_builddir)/kksystr -L$(top_builddir)/libicq2000 centerim_LDADD = $(top_builddir)/src/hooks/libhooks.a -lkkconsui -lkkstrtext -lkksystr -llibicq2000 if HAVE_LIBOTR centerim_SOURCES += imotr.cc endif if HAVE_FRIBIDI centerim_LDADD +=$(FRIBIDI_LIBS) #centerim_CFLAGS += $(FRIBIDI_LIBS) endif if BUILD_FIRETALK centerim_LDFLAGS += -L$(top_builddir)/firetalk centerim_LDADD += -lfiretalk endif if BUILD_GADU centerim_LDFLAGS += -L$(top_builddir)/libgadu centerim_LDADD += -llibgadu endif if BUILD_JABBER centerim_LDFLAGS += -L$(top_builddir)/libjabber centerim_LDADD += -llibjabber endif if BUILD_MSN centerim_LDFLAGS += -L$(top_builddir)/libmsn centerim_LDADD += -llibmsn endif if BUILD_YAHOO centerim_LDFLAGS += -L$(top_builddir)/libyahoo2 centerim_LDADD += -llibyahoo2 endif centerim_LDADD += -lconnwrap @LTLIBINTL@ SUBDIRS = hooks EXTRA_DIST = centerim.cc icqcontact.cc icqgroups.cc eventmanager.cc icqdialogs.cc icqhist.cc imexternal.cc imcontact.cc imlogger.cc accountmanager.cc icqcontacts.cc icqmlist.cc imcontroller.cc icqconf.cc imevents.cc impgp.cc imotr.cc icqface.cc centermain.cc icqgroup.cc icqmlist.h imcontroller.h icqcommon.h icqcontacts.h centerim.h icqgroup.h imcontact.h accountmanager.h eventmanager.h imevents.h icqcontact.h imlogger.h icqconf.h impgp.h imotr.h icqface.h icqgroups.h icqhist.h imexternal.h captcha.h git-version.h.in AUTOMAKE_OPTIONS = foreign centerim_CPPFLAGS += -DSHARE_DIR=\"$(pkgdatadir)\" -DLOCALEDIR=\"$(datadir)/locale\" # regenerate git-version.h if its content differs from the output of # git-version-gen g_get_cur = sed -ne "s/^\#[ \x09]*define[ \x09]\+GIT_VERSION[ \x09]\+\"\([0-9]\+.*\)\"/\1/p" \ 2>/dev/null < git-version.h | tr -d '\012' g_subst_f = sed -e "s/@GIT_VERSION@/$$VER_GIT/" < git-version.h.in > git-version.h # If the make we are using supports order-only targets we make git_version is # made an order-only prerequisite. Order-only prerequisites are build before # the target(s) but do not lead to a rebuild of the target(s). ORDER_ONLY = @ORDER_ONLY@ $(centerim_OBJECTS) git-version.h : $(ORDER_ONLY) git_version .PHONY: git_version git_version: git-version.h.in VER_FILE=`$(g_get_cur)` || true; \ VER_GIT=`cd $(top_srcdir); ./misc/git-version-gen .version`; \ if [ -z "$$VER_FILE" ] || [ "$$VER_FILE" != "$$VER_GIT" ]; then \ $(g_subst_f); \ fi centerim-4.22.10/src/eventmanager.cc0000644000175000001440000001755011461606612014170 00000000000000/* * * centerim event manager class * $Id: eventmanager.cc,v 1.27 2005/08/28 01:33:21 konst Exp $ * * Copyright (C) 2001,2002 by Konstantin Klyagin * * 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 "eventmanager.h" #include "icqmlist.h" #include "icqconf.h" #include "icqface.h" #include "icqcontacts.h" #include "abstracthook.h" #include "imlogger.h" #include "imexternal.h" #include "captcha.h" imeventmanager em; imeventmanager::imeventmanager(): unsent(0), lastevent(0), recentlysent(0) { } imeventmanager::~imeventmanager() { } void imeventmanager::store(const imevent &cev) { icqcontact *c; bool proceed; auto_ptr icev(cev.getevent()); imevent &ev = *icev.get(); static int preoptions[imevent::imdirection_size] = { imexternal::aoprereceive, imexternal::aopresend }; external.exec(&ev, proceed, preoptions[ev.getdirection()]); if(!proceed) return; if(ev.getdirection() == imevent::incoming) { if(!lst.inlist(ev.getcontact(), csignore)) { logger.putevent(ev); c = clist.get(ev.getcontact()); if(!c) { proceed = !conf->getantispam() || ((ev.gettype() == imevent::authorization) && !conf->getdropauthreq()) || conf->getusingcaptcha(); if(proceed) { c = clist.addnew(ev.getcontact()); /* turing test */ if (conf->getdebug()) face.log("captcha: enabled = %i", conf->getusingcaptcha()); if (conf->getusingcaptcha() && (ev.getcontact().pname != irc)) { if (conf->getdebug()) face.log("captcha: start"); /* If the turing test was failed or not completed, remove * contact (WE DONT WANT YOU!) * Note tat below, we always remove the contact if it is not verified */ if (!conf->thecaptcha.docaptcha(ev.getcontact())) { if (conf->getdebug()) face.log("captcha: starting a new turing test with: %s", ev.getcontact().totext().c_str()); /* have not started the turing test, so send our greeter and message */ store(immessage( c->getdesc(), imevent::outgoing, conf->getcaptchagreet() + "\n" + conf->thecaptcha.getcaptchaquestion(ev.getcontact()))); clist.remove(c->getdesc()); c = 0; } else { if(conf->getdebug()) face.log("captcha: got an answer: %s", ev.gettext().c_str()); /* have started the test, now must verify the answer */ if (conf->thecaptcha.checkcaptcha(ev.getcontact(), ev.gettext())) { if (conf->getdebug()) face.log("captcha: received correct answer"); /* good, a human */ store(immessage( c->getdesc(), imevent::outgoing, conf->getcaptchasuccess())); conf->thecaptcha.donecaptcha(ev.getcontact()); } else { if (conf->getdebug()) face.log("captcha: received intorrent answer"); string logmsg = "Captcha dropped an authorization request from "; logmsg += ev.getcontact().totext(); logger.putmessage(logmsg); /* bad, a computer (or very dumb human :) */ store(immessage( c->getdesc(), imevent::outgoing, conf->getcaptchafailure() + "\n" + conf->thecaptcha.getcaptchaquestion(ev.getcontact()))); clist.remove(c->getdesc()); c = 0; } } if (conf->getdebug()) face.log("captcha: end"); } } else { string logmsg = "Dropped an authorization request from "; logmsg += ev.getcontact().totext(); face.log(logmsg); logger.putmessage(logmsg); } } if (c) { face.xtermtitle(_("event from %s (%s)"), ev.getcontact().totext().c_str(), c->getdispnick().c_str()); eventwrite(ev, history); c->sethasevents(true); c->playsound(ev.gettype()); external.exec(ev); face.relaxedupdate(); } } } else if(ev.getdirection() == imevent::outgoing) { abstracthook *hook; // All the SMSes are to be sent through the icqhook class.. if(ev.gettype() == imevent::sms) { hook = &gethook(icq); } else { hook = &gethook(ev.getcontact().pname); } // Some self-flood protection.. if(time(0)-lastevent > PERIOD_ATONCE) recentlysent = 0; proceed = (hook->logged() || ev.getcontact().pname == rss) && recentlysent < MAX_ATONCE; // 3.. 2.. 1.. LAUNCH! if(proceed) { if(hook->send(ev)) { eventwrite(ev, history); logger.putevent(ev); face.xtermtitle(); time(&lastevent); recentlysent++; } else { eventwrite(ev, offline); } } else { eventwrite(ev, offline); } } } vector imeventmanager::getevents(const imcontact &cont, time_t lastread) const { ifstream fhist; imevent *rev; vector r; icqcontact *c = clist.get(cont); if(c) { fhist.open((c->getdirname() + "history").c_str()); if(fhist.is_open()) { if(lastread) { fhist.seekg(c->gethistoffset(), ios::beg); } while(!fhist.eof()) { rev = eventread(fhist); if(rev) { if(rev->gettimestamp() > lastread) { rev->setcontact(cont); if(rev->getdirection() == imevent::outgoing && c->receivedAcks.count(rev->gettimestamp())) rev->setack(true); else if(rev->getdirection() == imevent::incoming && c->sentAcks.count(rev->gettimestamp())) rev->setack(true); else rev->setack(false); r.push_back(rev); } else { delete rev; } } } fhist.close(); } else { } } return r; } void imeventmanager::eventwrite(const imevent &ev, eventwritemode mode) { ofstream fhist; string fname, lockfname; icqcontact *c; if(c = clist.get(ev.getcontact())) { switch(mode) { case history: fname = c->getdirname() + "history"; break; case offline: fname = c->getdirname() + "offline"; unsent++; face.relaxedupdate(); break; } setlock(fname); fhist.open(fname.c_str(), ios::app); if(fhist.is_open()) { ev.write(fhist); fhist.close(); } releaselock(fname); } } imevent *imeventmanager::eventread(ifstream &f) const { imevent *rev, ev(f); if(rev = ev.getevent()) { rev->read(f); if(rev->gettype() == imevent::imeventtype_size) { delete rev; rev = 0; } } return rev; } void imeventmanager::resend() { icqcontact *c; imevent *rev; string fname, tfname; ifstream f; int i; for(unsent = i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); fname = c->getdirname() + "offline"; tfname = fname + "_"; if(!access(fname.c_str(), F_OK)) if(!rename(fname.c_str(), tfname.c_str())) { f.open(tfname.c_str()); if(f.is_open()) { while(!f.eof()) { rev = eventread(f); if(rev) { rev->setcontact(c->getdesc()); if(rev->gettimestamp() > PERIOD_RESEND) { store(*rev); } else { eventwrite(*rev, offline); } delete rev; } } f.close(); f.clear(); } unlink(tfname.c_str()); } } } int imeventmanager::getunsentcount() const { return unsent; } void imeventmanager::setlock(const string &fname) const { string lockfname = fname + ".lock"; int ntries = 0; ofstream f; while(!access(lockfname.c_str(), F_OK) && (ntries < 10)) { usleep(10); ntries++; } f.open(lockfname.c_str()); if(f.is_open()) f.close(); } void imeventmanager::releaselock(const string &fname) const { string lockfname = fname + ".lock"; unlink(lockfname.c_str()); } centerim-4.22.10/src/imevents.cc0000644000175000001440000004221511461606612013342 00000000000000/* * * centerim events serialization classes * $Id: imevents.cc,v 1.36 2005/01/18 23:20:17 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "imevents.h" #include "src/Xml.h" #include "hooks/abstracthook.h" #ifdef HAVE_SSTREAM #include #else #include #endif // -- serialization constants ------------------------------------------------- static const string evlinebreak = "\r\n"; static const string sdirection[imevent::imdirection_size] = { "IN", "OUT" }; static const string seventtype[imevent::imeventtype_size] = { "MSG", "URL", "SMS", "AUTH", "", "", "EMAIL", "NOTE", "CONT", "FILE", "XML" }; // -- basic imevent class ----------------------------------------------------- imevent::imevent() : acknowledged(false){ } imevent::imevent(const imcontact &acont, imdirection adir, imeventtype atype, time_t asenttimestamp) : contact(acont), direction(adir), type(atype), timestamp(timer_current), senttimestamp(asenttimestamp ? asenttimestamp : timer_current), acknowledged(false) { } imevent::imevent(ifstream &f) { read(f); } imevent::~imevent() { } imevent::imeventtype imevent::gettype() const { return type; } imevent::imdirection imevent::getdirection() const { return direction; } imcontact imevent::getcontact() const { return contact; } time_t imevent::getsenttimestamp() const { return senttimestamp; } time_t imevent::gettimestamp() const { return timestamp; } string imevent::gettext() const { return ""; } void imevent::settimestamp(time_t atimestamp) { timestamp = atimestamp; } void imevent::setcontact(const imcontact &acontact) { contact = acontact; } void imevent::write(ofstream &f) const { if(type == imeventtype_size) return; f << "\f" << endl << sdirection[direction] << endl << seventtype[type] << endl << timestamp << endl << senttimestamp << endl; } void imevent::read(ifstream &f) { string rdbuf; getstring(f, rdbuf); if(rdbuf == "\f") getstring(f, rdbuf); for(direction = incoming; direction != imdirection_size; direction++) if(sdirection[direction] == rdbuf) break; getstring(f, rdbuf); type = imeventtype_size; if(rdbuf != "") { for(type = message; type != imeventtype_size; type++) if(seventtype[type] == rdbuf) break; } getstring(f, rdbuf); timestamp = strtoul(rdbuf.c_str(), 0, 0); getstring(f, rdbuf); senttimestamp = strtoul(rdbuf.c_str(), 0, 0); if(direction == imdirection_size || type == imeventtype_size) { while(!f.eof() && rdbuf != "\f") getstring(f, rdbuf); if(!f.eof()) read(f); } } string imevent::readblock(ifstream &f) { int pos; string rdbuf, r; while(!f.eof()) { getstring(f, rdbuf); if(rdbuf == "\f") break; if(f.eof() && rdbuf.empty()) break; while((pos = rdbuf.find_first_of(evlinebreak)) != -1) rdbuf.erase(pos, 1); if(!r.empty()) r += evlinebreak; r += rdbuf; } return r; } bool imevent::empty() const { return false; } imevent *imevent::getevent() const { switch(type) { case message: return new immessage(*this); case url: return new imurl(*this); case sms: return new imsms(*this); case authorization: return new imauthorization(*this); case email: return new imemail(*this); case notification: return new imnotification(*this); case contacts: return new imcontacts(*this); case file: return new imfile(*this); case xml: return new imxmlevent(*this); default: return new imrawevent(*this); } } bool imevent::contains(const string &text) const { return false; } // -- immessage class --------------------------------------------------------- immessage::immessage(const imcontact &acont, imdirection adirection, const string &atext, const time_t asenttime) : imevent(acont, adirection, message, asenttime), text(atext) { } immessage::immessage(const imevent &ev) { type = message; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; acknowledged = ev.acknowledged; const immessage *m = dynamic_cast(&ev); if(m) { text = m->text; } } string immessage::gettext() const { return text; } void immessage::write(ofstream &f) const { imevent::write(f); f << text << endl; } void immessage::read(ifstream &f) { text = readblock(f); } bool immessage::empty() const { return text.empty(); } bool immessage::contains(const string &atext) const { return text.find(atext) != -1; } // -- imurl class ------------------------------------------------------------- imurl::imurl(const imcontact &acont, imdirection adirection, const string &aurl, const string &adescription) : imevent(acont, adirection, imevent::url), url(aurl), description(adescription) { } imurl::imurl(const imevent &ev) { type = imevent::url; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; const imurl *m = dynamic_cast(&ev); if(m) { url = m->url; description = m->description; } } string imurl::geturl() const { return url; } string imurl::getdescription() const { return description; } string imurl::gettext() const { return url + "\n----\n" + description; } void imurl::write(ofstream &f) const { imevent::write(f); f << url << endl << description << endl; } void imurl::read(ifstream &f) { getstring(f, url); description = readblock(f); } bool imurl::empty() const { return url.empty() && description.empty(); } bool imurl::contains(const string &atext) const { return (url.find(atext) != -1) || (description.find(atext) != -1); } // -- imauthorization class --------------------------------------------------- imauthorization::imauthorization(const imcontact &acont, imdirection adirection, AuthType atype, const string &atext) : imevent(acont, adirection, authorization), authtype(atype) { text = atext; if(text.empty() && authtype == Request) switch(adirection) { case outgoing: text = conf->getDefaultAuthMessage(); break; case incoming: text = _("Empty authorization request message"); break; } } imauthorization::imauthorization(const imevent &ev) { type = authorization; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; const imauthorization *m = dynamic_cast(&ev); if(m) { text = m->text; authtype = m->authtype; } } string imauthorization::gettext() const { string prefix; prefix = (authtype == Request) ? _("* Authorization request : ") : _("* Authorization : "); return prefix + text; } string imauthorization::getmessage() const { return text; } void imauthorization::write(ofstream &f) const { imevent::write(f); f << i2str((int) authtype) << endl << text << endl; } void imauthorization::read(ifstream &f) { string rdbuf; getstring(f, rdbuf); text = readblock(f); authtype = (AuthType) strtoul(rdbuf.c_str(), 0, 0); } bool imauthorization::empty() const { return false; } imauthorization::AuthType imauthorization::getauthtype() const { return authtype; } bool imauthorization::contains(const string &atext) const { return gettext().find(atext) != -1; } // -- imsms class ------------------------------------------------------------- imsms::imsms(const imcontact &acont, imdirection adirection, const string &atext, const string &aphone) : imevent(acont, adirection, sms), text(atext), phone(aphone) { } imsms::imsms(const imevent &ev) { type = sms; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; const imsms *m = dynamic_cast(&ev); if(m) { text = m->text; phone = m->phone; } } string imsms::gettext() const { return (string) _("* SMS : ") + text; } void imsms::write(ofstream &f) const { imevent::write(f); if(!phone.empty()) { if(phone.substr(0, 1) != "+") f << "+"; f << phone << endl; } f << text << endl; } void imsms::read(ifstream &f) { getstring(f, phone); text = readblock(f); if(!phone.empty() && phone.substr(0, 1) != "+") { if(!text.empty()) phone += "\n" + text; text = phone; phone = ""; } } bool imsms::empty() const { return text.empty(); } bool imsms::contains(const string &atext) const { return text.find(atext) != -1; } // -- imemail class ----------------------------------------------------------- imemail::imemail(const imcontact &acont, imdirection adirection, const string &atext) : imevent(acont, adirection, email), text(atext) { } imemail::imemail(const imevent &ev) { type = email; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; const imemail *m = dynamic_cast(&ev); if(m) { text = m->text; } } string imemail::gettext() const { return text; } bool imemail::empty() const { return text.empty(); } bool imemail::contains(const string &atext) const { return text.find(atext) != -1; } void imemail::write(ofstream &f) const { imevent::write(f); f << text << endl; } void imemail::read(ifstream &f) { text = readblock(f); } // -- imnotification class ---------------------------------------------------- imnotification::imnotification(const imcontact &acont, const string &atext) : imevent(acont, incoming, notification), text(atext) { } imnotification::imnotification(const imevent &ev) { type = notification; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; const imnotification *m = dynamic_cast(&ev); if(m) { text = m->text; } } string imnotification::gettext() const { return (string) "* " + text; } bool imnotification::empty() const { return text.empty(); } bool imnotification::contains(const string &atext) const { return text.find(atext) != -1; } void imnotification::write(ofstream &f) const { imevent::write(f); f << text << endl; } void imnotification::read(ifstream &f) { text = readblock(f); } // -- imcontacts class -------------------------------------------------------- imcontacts::imcontacts(const imcontact &acont, imdirection adirection, const vector< pair > &lst) : imevent(acont, adirection, imevent::contacts), contacts(lst) { } imcontacts::imcontacts(const imevent &ev) { type = imevent::contacts; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; const imcontacts *m = dynamic_cast(&ev); if(m) { contacts = m->contacts; } } string imcontacts::gettext() const { string text = _("* Contacts : "); vector< pair >::const_iterator ic; for(ic = contacts.begin(); ic != contacts.end(); ++ic) { if(ic->first) { text += (ic->second.empty() ? _("") : ic->second) + " (" + i2str(ic->first) + ")"; } else { text += ic->second; } if(ic+1 != contacts.end()) text += ", "; } return text; } const vector< pair > &imcontacts::getcontacts() const { return contacts; } bool imcontacts::empty() const { return contacts.empty(); } bool imcontacts::contains(const string &atext) const { return gettext().find(atext) != -1; } void imcontacts::write(ofstream &f) const { vector< pair >::const_iterator ic; imevent::write(f); for(ic = contacts.begin(); ic != contacts.end(); ++ic) { f << ic->first << "\t" << ic->second << "\n"; } } void imcontacts::read(ifstream &f) { string buf; int pos; #ifdef HAVE_SSTREAM ostringstream ost; ost << readblock(f); istringstream st(ost.str()); #else strstream st; st << readblock(f); #endif while(getline(st, buf)) { while((pos = buf.find_first_of("\r\n")) != -1) buf.erase(pos, 1); if((pos = buf.find("\t")) != -1) { contacts.push_back(make_pair(atoi(buf.substr(0, pos).c_str()), buf.substr(pos+1))); } } } // -- imfile class ------------------------------------------------------------ imfile::imfile(const imevent &ev) { type = imevent::file; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; const imfile *m = dynamic_cast(&ev); if(m) { files = m->files; } } imfile::imfile(const imcontact &acont, imdirection adirection, const string &amsg, const vector &afiles) : imevent(acont, adirection, imevent::file), msg(amsg), files(afiles) { } string imfile::gettext() const { string r; r = _("* File transfer"); if(!msg.empty()) r += (string) " <" + msg + ">"; r += (string) " : "; for(vector::const_iterator i = files.begin(); i != files.end(); ++i) { r += i->fname; if(i->size != -1) // -1 means the size is unknown r += (string) " (" + i2str(i->size) + ")"; if(i+1 != files.end()) r += ", "; } return r; } string imfile::getmessage() const { return msg; } const vector &imfile::getfiles() const { return files; } void imfile::setfiles(const vector &lst) { files = lst; } bool imfile::empty() const { return files.empty(); } bool imfile::contains(const string &atext) const { return gettext().find(atext) != -1; } void imfile::write(ofstream &f) const { imevent::write(f); f << "|" << mime(msg) << endl; for(vector::const_iterator i = files.begin(); i != files.end(); ++i) f << mime(i->fname) << "\t" << i->size << endl; } void imfile::read(ifstream &f) { string buf; int pos, line = 0; #ifdef HAVE_SSTREAM ostringstream ost; ost << readblock(f); istringstream st(ost.str()); #else strstream st; st << readblock(f); #endif while(getline(st, buf)) { while((pos = buf.find_first_of("\r\n")) != -1) buf.erase(pos, 1); if(!line++) { msg = unmime(buf.substr(1)); } else if((pos = buf.find("\t")) != -1) { record r; r.fname = unmime(buf.substr(0, pos)); r.size = strtoul(buf.substr(pos+1).c_str(), 0, 0); files.push_back(r); } } } // -- imrawevent class -------------------------------------------------------- imrawevent::imrawevent(imeventtype atype, const imcontact &acont, imdirection adirection) : imevent(acont, adirection, atype) { } imrawevent::imrawevent(const imevent &ev) { type = ev.type; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; } // -- imxmlevent class -------------------------------------------------------- imxmlevent::imxmlevent(const imcontact &acont, imdirection adirection, const string &atext) : imevent(acont, adirection, imevent::xml) { data["text"] = atext; } imxmlevent::imxmlevent(const imevent &ev) { type = ev.type; contact = ev.contact; direction = ev.direction; timestamp = ev.timestamp; senttimestamp = ev.senttimestamp; const imxmlevent *m = dynamic_cast(&ev); if(m) { data = m->data; } } string imxmlevent::gettext() const { return getfield("text"); } bool imxmlevent::field_empty(const string &name) const { return getfield(name).empty(); } string imxmlevent::getfield(const string &name) const { string r; map::const_iterator ic = data.find(name); if(ic != data.end()) { r = ic->second; } return r; } void imxmlevent::setfield(const string &name, const string &val) { data[name] = val; } bool imxmlevent::empty() const { return getfield("text").empty(); } bool imxmlevent::contains(const string &atext) const { return gettext().find(atext) != -1; } void imxmlevent::write(ofstream &f) const { XmlBranch x("xml"); map::const_iterator id = data.begin(); while(id != data.end()) { if(!id->second.empty()) x.pushnode(new XmlLeaf(id->first, id->second)); ++id; } imevent::write(f); f << x.toString(0) << endl; } void imxmlevent::read(ifstream &f) { string content = readblock(f); string::iterator ic = content.begin(); auto_ptr top(XmlNode::parse(ic, content.end())); XmlBranch *x = dynamic_cast(top.get()); list tags = x->getChildren(); list::const_iterator it = tags.begin(); while(it != tags.end()) { data[*it] = x->getLeaf(*it)->getValue(); ++it; } } centerim-4.22.10/src/icqdialogs.cc0000644000175000001440000020254511461606612013633 00000000000000/* * * centerim user interface class, dialogs related part * $Id: icqdialogs.cc,v 1.151 2005/05/23 14:16:52 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "icqface.h" #include "icqconf.h" #include "centerim.h" #include "icqcontact.h" #include "icqcontacts.h" #include "icqmlist.h" #include "icqgroups.h" #include "abstracthook.h" #include "ljhook.h" #include "impgp.h" #include #ifdef HAVE_STDINT_H #include /* for intptr_t */ #endif const char *stragerange(ICQ2000::AgeRange r) { switch(r) { case ICQ2000::RANGE_18_22: return "18-22"; case ICQ2000::RANGE_23_29: return "23-29"; case ICQ2000::RANGE_30_39: return "30-39"; case ICQ2000::RANGE_40_49: return "40-49"; case ICQ2000::RANGE_50_59: return "50-59"; case ICQ2000::RANGE_60_ABOVE: return _("60-above"); case ICQ2000::RANGE_NORANGE: return _("unknown"); } return ""; } const char *strrandomgroup(short unsigned int gr) { switch((ICQ2000::RandomChatGroup) gr) { case ICQ2000::GROUP_GENERALCHAT: return _("General Chat"); case ICQ2000::GROUP_ROMANCE: return _("Romance"); case ICQ2000::GROUP_GAMES: return _("Games"); case ICQ2000::GROUP_STUDENTS: return _("Students"); case ICQ2000::GROUP_20: return _("20 Something"); case ICQ2000::GROUP_30: return _("30 Something"); case ICQ2000::GROUP_40: return _("40 Something"); case ICQ2000::GROUP_50PLUS: return _("50 Plus"); case ICQ2000::GROUP_SEEKINGWOMEN: return _("Seeking Women"); case ICQ2000::GROUP_SEEKINGMEN: return _("Seeking Men"); } return ""; } const char *strsortmode(icqconf::sortmode smode) { switch(smode) { case icqconf::sort_by_status_and_activity: return _("Status and Activity"); case icqconf::sort_by_status_and_name: return _("Status and Name"); case icqconf::sort_by_activity: return _("Activity"); case icqconf::sort_by_name: return _("Name"); } return ""; } bool icqface::sprofmanager(string &name, string &act) { dialogbox db; string buf, tname; bool finished, r; int n, b, dx, dy; map profiles; map::iterator ip; string pfname = conf->getconfigfname("search-profiles"); ifstream f(pfname.c_str()); if(f.is_open()) { while(!f.eof()) { getstring(f, buf); tname = getword(buf, "\t"); if(!tname.empty()) profiles[tname] = imsearchparams(tname); } f.close(); } dx = (COLS-sizeDlg.width)/2+sizeDlg.width; dy = (LINES-sizeDlg.height)/2+sizeDlg.height; db.setwindow(new textwindow(dx-(int) (sizeDlg.width*0.6), dy-(int) (sizeDlg.height*0.6), dx, dy, conf->getcolor(cp_dialog_frame), 0, conf->getcolor(cp_dialog_highlight), _(" Search profiles "))); db.setmenu(new verticalmenu(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected))); db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("Remove"), _("Load"), (char*)0)); db.addkey(KEY_DC, 0); db.addautokeys(); db.idle = &dialogidle; verticalmenu &m = *db.getmenu(); db.getbar()->item = 1; finished = r = false; while(!finished) { m.clear(); for(ip = profiles.begin(); ip != profiles.end(); ++ip) { m.additemf(0, (void *) ip->first.c_str(), " %s: %s", conf->getprotocolname(ip->second.pname).c_str(), ip->first.c_str()); } finished = !db.open(n, b); if(!finished) { if(!profiles.empty()) { tname = (char *) m.getref(n-1); ip = profiles.find(tname); } else { ip = profiles.end(); } switch(b) { case 0: if(ip != profiles.end()) profiles.erase(ip); break; case 1: if(ip != profiles.end()) { finished = r = true; name = tname; act = "load"; } break; } } } db.close(); unlink(conf->getconfigfname("search-profiles").c_str()); for(ip = profiles.begin(); ip != profiles.end(); ++ip) { ip->second.save(ip->first); } return r; } bool icqface::finddialog(imsearchparams &s, findsubject subj) { int n, b, i; //Not used - int nuin, ninfo, nloc, nwork, nonl; bool finished, ret, proceed; dialogbox db; vector penabled; vector::iterator ipname, ipfname; vector services; vector::iterator iservice; string tname, act; imsearchparams ts; if(subj != fsrss) { for(protocolname apname = icq; apname != protocolname_size; apname++) { if(subj == fschannel) if(!gethook(apname).getCapabs().count(hookcapab::conferencing)) continue; if(gethook(apname).logged() || apname == infocard) { penabled.push_back(apname); } } if(penabled.empty()) { log(_("+ you must be logged in first")); return false; } if((ipname = find(penabled.begin(), penabled.end(), s.pname)) == penabled.end()) { ipname = penabled.begin(); s.pname = *ipname; } } blockmainscreen(); finished = ret = false; db.setwindow(new textwindow(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED)); db.settree(new treeview(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), conf->getcolor(cp_dialog_highlight), conf->getcolor(cp_dialog_text))); switch(subj) { case fsuser: db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("lOad"), _("sAve"), _("cLear"), _("Change"), _("Search/Add"), (char*)0)); break; case fschannel: db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("cLear"), _("Change"), _("Join/Create"), (char*)0)); break; case fsrss: db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("cLear"), _("Change"), _("lInk"), (char*)0)); break; } struct { char *title; int item; } dlgparam[fs_size] = { { _(" Find/add user(s) "), 3 }, { _(" Join/create a channel/conference "), 1 }, { _(" Link an RSS feed "), 1 } }; db.getwindow()->set_title(conf->getcolor(cp_dialog_highlight), dlgparam[subj].title); db.getbar()->item = dlgparam[subj].item; db.addautokeys(); db.idle = &dialogidle; treeview &tree = *db.gettree(); bool protchanged = true; while(!finished) { tree.clear(); if(protchanged) { switch(subj) { case fsuser: services = gethook(s.pname).getservices(servicetype::search); if((iservice = find(services.begin(), services.end(), s.service)) == services.end()) s.service = ""; if(s.service.empty()) if((iservice = services.begin()) != services.end()) { s.service = *iservice; s.flexparams = gethook(s.pname).getsearchparameters(s.service); } break; case fschannel: services = gethook(s.pname).getservices(servicetype::groupchat); if((iservice = find(services.begin(), services.end(), s.service)) == services.end()) s.service = ""; if(s.service.empty()) if((iservice = services.begin()) != services.end()) { s.service = *iservice; s.flexparams = gethook(s.pname).getsearchparameters(s.service); } break; } protchanged = false; } if(subj != fsrss) { i = tree.addnode(_(" Network ")); tree.addleaf(i, 0, 1, " " + conf->getprotocolname(s.pname) + " "); } if(subj != fschannel) switch(s.pname) { case icq: case gadu: i = tree.addnode(_(" UIN ")); tree.addleaff(i, 0, 10, " %s ", strint(s.uin)); if(!s.uin && !s.randomgroup && s.kwords.empty()) { i = tree.addnode(_(" Details ")); tree.addleaff(i, 0, 11, _(" Nickname : %s "), s.nick.c_str()); if(s.pname == icq) { tree.addleaff(i, 0, 12, _(" E-Mail : %s "), s.email.c_str()); } tree.addleaff(i, 0, 13, _(" First name : %s "), s.firstname.c_str()); tree.addleaff(i, 0, 14, _(" Last name : %s "), s.lastname.c_str()); if(s.pname == icq) { tree.addleaff(i, 0, 15, _(" Age range : %s "), stragerange(s.agerange)); } tree.addleaff(i, 0, 17, _(" Gender : %s "), strgender(s.gender)); if(s.pname == icq) { tree.addleaff(i, 0, 18, _(" Language : %s "), abstracthook::getLanguageIDtoString(s.language).c_str()); } i = tree.addnode(_(" Location ")); tree.addleaff(i, 0, 19, _(" City : %s "), s.city.c_str()); if(s.pname == icq) { tree.addleaff(i, 0, 20, _(" State : %s "), s.state.c_str()); tree.addleaff(i, 0, 21, _(" Country : %s "), abstracthook::getCountryIDtoString(s.country).c_str()); i = tree.addnode(_(" Work ")); tree.addleaff(i, 0, 22, _(" Company : %s "), s.company.c_str()); tree.addleaff(i, 0, 23, _(" Department : %s "), s.department.c_str()); tree.addleaff(i, 0, 24, _(" Position : %s "), s.position.c_str()); } i = tree.addnode(_(" Online only ")); tree.addleaff(i, 0, 25, " %s ", stryesno(s.onlineonly)); } if(s.pname == icq) { if(!s.uin && s.kwords.empty()) { i = tree.addnode(_(" Random chat group ")); tree.addleaff(i, 0, 28, " %s ", strrandomgroup(s.randomgroup)); } if(!s.uin && !s.randomgroup) { i = tree.addnode(_(" Keywords ")); tree.addleaff(i, 0, 29, " %s ", s.kwords.c_str()); } } break; default: if((s.pname == msn && !s.reverse) || (s.pname != msn)) { i = tree.addnode(_(" Nickname ")); tree.addleaf(i, 0, 11, " " + s.nick + " "); } if(s.pname == jabber) if(s.nick.empty() && !services.empty()) { i = tree.addnode(_(" Search service ")); tree.addleaff(i, 0, 31, " %s ", s.service.c_str()); i = tree.addnode(_(" Search parameters ")); int id = 100; vector >::const_iterator ifp = s.flexparams.begin(); while(ifp != s.flexparams.end()) { tree.addleaff(i, 0, id++, " %s : %s ", ifp->first.c_str(), ifp->second.c_str()); ++ifp; } } break; } if(subj == fsrss) { i = tree.addnode(_(" Feed Parameters ")); tree.addleaff(i, 0, 33, _(" XML export URL : %s "), s.url.c_str()); tree.addleaff(i, 0, 34, _(" Check frequency (minutes) : %lu "), s.checkfrequency); } if((subj == fsuser) && s.pname == irc && s.nick.empty()) { i = tree.addnode(_(" Details ")); tree.addleaff(i, 0, 26, _(" Channel : %s "), s.room.c_str()); if(!s.room.empty()) { tree.addleaff(i, 0, 27, _(" Name : %s "), s.firstname.c_str()); } tree.addleaff(i, 0, 12, _(" E-Mail : %s "), s.email.c_str()); if(!s.room.empty()) { i = tree.addnode(_(" Joined since the last check only ")); tree.addleaff(i, 0, 16, " %s ", stryesno(s.sincelast)); } } if((subj == fsuser) && s.pname == yahoo && s.nick.empty()) { i = tree.addnode(_(" Details ")); if(s.kwords.empty()) tree.addleaff(i, 0, 27, _(" Name : %s "), s.firstname.c_str()); if(s.firstname.empty()) tree.addleaff(i, 0, 29, _(" Keywords : %s "), s.kwords.c_str()); i = tree.addnode(_(" Options ")); tree.addleaff(i, 0, 17, _(" Gender : %s "), strgender(s.gender)); tree.addleaff(i, 0, 15, _(" Age range : %s "), stragerange(s.agerange)); tree.addleaff(i, 0, 35, _(" Users with photos only : %s "), stryesno(s.photo)); tree.addleaff(i, 0, 25, _(" Look for online only : %s "), stryesno(s.onlineonly)); } if((subj == fsuser) && s.nick.empty() && (s.pname == msn || s.pname == livejournal)) { i = tree.addnode(_(" Show users who have you on their list ")); tree.addleaff(i, 0, 30, " %s ", stryesno(s.reverse)); } if(subj == fschannel) { i = tree.addnode(_(" Name/Title ")); tree.addleaf(i, 0, 11, " " + s.nick + " "); if(!s.nick.empty()) { if(gethook(s.pname).getCapabs().count(hookcapab::channelpasswords)) { i = tree.addnode(_(" Password ")); tree.addleaf(i, 0, 32, " " + string(s.password.size(), '*') + " "); } if(gethook(s.pname).getCapabs().count(hookcapab::groupchatservices)) { i = tree.addnode(_(" Service ")); tree.addleaf(i, 0, 31, " " + s.service + " "); } } } finished = !db.open(n, b, (void **) &i); if(subj != fsuser) b += 2; if(!finished) switch(b) { case 0: if(sprofmanager(tname, act)) { if(act == "load") { imsearchparams ts(tname); if((ipfname = find(penabled.begin(), penabled.end(), ts.pname)) != penabled.end()) { s = ts; ipname = ipfname; protchanged = true; } } } break; case 1: tname = inputstr(_("New profile name: ")); if(proceed = !tname.empty()) if(ts.load(tname)) proceed = ask(_("The profile with this name already exists. Do you want to overwrite it?"), ASK_YES | ASK_NO, ASK_NO) == ASK_YES; if(proceed) s.save(tname); break; case 2: s = imsearchparams(); s.pname = *ipname; protchanged = true; break; case 3: switch(i) { case 1: if(++ipname == penabled.end()) ipname = penabled.begin(); if(protchanged = s.pname != *ipname) { s.service = ""; s.flexparams.clear(); } s.pname = *ipname; break; case 10: s.uin = atol(inputstr(_("UIN: "), strint(s.uin)).c_str()); break; case 11: s.nick = inputstr(subj != fschannel ? _("Nickname: ") : _("Name/Title: "), s.nick); break; case 12: s.email = inputstr(_("E-Mail: "), s.email); break; case 13: s.firstname = inputstr(_("First name: "), s.firstname); break; case 14: s.lastname = inputstr(_("Last name: "), s.lastname); break; case 15: selectagerange(s.agerange); break; case 16: s.sincelast = !s.sincelast; break; case 17: selectgender(s.gender); break; case 18: selectlanguage(s.language); break; case 19: s.city = inputstr(_("City: "), s.city); break; case 20: s.state = inputstr(_("State: "), s.state); break; case 21: selectcountry(s.country); break; case 22: s.company = inputstr(_("Company: "), s.company); break; case 23: s.department = inputstr(_("Department: "), s.department); break; case 24: s.position = inputstr(_("Position: "), s.position); break; case 25: s.onlineonly = !s.onlineonly; break; case 26: s.room = inputstr(_("Channel: "), s.room); break; case 27: s.firstname = inputstr(_("Name: "), s.firstname); break; case 28: selectrandomgroup(s.randomgroup); break; case 29: s.kwords = inputstr(_("Keywords: "), s.kwords); break; case 30: s.reverse = !s.reverse; break; case 31: if(services.size()) { if(++iservice == services.end()) iservice = services.begin(); s.service = *iservice; s.flexparams = gethook(s.pname).getsearchparameters(s.service); } break; case 32: s.password = inputstr(_("Password: "), s.password, '*'); break; case 33: s.url = inputstr(_("URL: "), s.url); break; case 34: s.checkfrequency = atol(inputstr(_("Check frequency: "), strint(s.checkfrequency)).c_str()); break; case 35: s.photo = !s.photo; } if(i >= 100) { vector >::iterator ifp = s.flexparams.begin()+i-100; ifp->second = inputstr(ifp->first + ": ", ifp->second); } break; case 4: if ((s.pname == jabber) && ((s.service.empty() && (s.nick.find("@") == -1)) || (s.nick.empty() && s.flexparams.empty()))) { status(_("Wrong Jabber ID!")); } else { ret = finished = true; } break; } } db.close(); unblockmainscreen(); return ret; } #define CHECKGENERAL if(!i) i = tree->addnode(_(" General ")); void icqface::gendetails(treeview *tree, icqcontact *c) { int saveitem, savefirst, i; if(!c) c = clist.get(contactroot); icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); icqcontact::workinfo wi = c->getworkinfo(); icqcontact::reginfo ri = c->getreginfo(); string about = c->getabout(); bool ourdetails = c->getdesc() == contactroot; abstracthook &h = gethook(passinfo.pname); set capab = h.getCapabs(); tree->menu.getpos(saveitem, savefirst); tree->clear(); i = 0; if(capab.count(hookcapab::flexiblereg) && ourdetails) { if(ri.service.empty()) { vector servs = h.getservices(servicetype::registration); if(!servs.empty()) ri.service = servs[0]; else return; } if(ri.params.empty()) { ri.params = h.getregparameters(ri.service); } c->setreginfo(ri); i = tree->addnode(_(" Registration service ")); tree->addleaff(i, 0, 46, " %s ", ri.service.c_str()); if(!ri.params.empty()) { i = tree->addnode(_(" Registration parameters ")); vector >::const_iterator ir = ri.params.begin(); while(ir != ri.params.end()) { tree->addleaff(i, 0, 100+(ir-ri.params.begin()), " %s : %s ", ir->first.c_str(), ir->second.c_str()); ++ir; } } i = 0; } if(passinfo.pname == infocard || capab.count(hookcapab::changenick) || !ourdetails) if((capab.count(hookcapab::flexiblereg) && ri.params.empty()) || !capab.count(hookcapab::flexiblereg)) { CHECKGENERAL; tree->addleaff(i, 0, 10, _(" Nickname : %s "), c->getnick().c_str()); } if(capab.count(hookcapab::changepassword) && ourdetails) { CHECKGENERAL; tree->addleaff(i, 0, 47, _(" Change password : %s "), string(ri.password.size(), '*').c_str()); } if(passinfo.pname != rss) if(passinfo.pname == icq && c->getdesc() == contactroot || !ourdetails || (ourdetails && capab.count(hookcapab::flexiblereg) && ri.params.empty())) { CHECKGENERAL; tree->addleaff(i, 0, 11, _(" First name : %s "), bi.fname.c_str()); tree->addleaff(i, 0, 12, _(" Last name : %s "), bi.lname.c_str()); tree->addleaff(i, 0, 13, _(" E-mail : %s "), bi.email.c_str()); tree->addleaff(i, 0, 14, _(" Gender : %s "), strgender(mi.gender)); tree->addleaff(i, 0, 15, _(" Birthdate : %s "), mi.strbirthdate().c_str()); tree->addleaff(i, 0, 16, _(" Age : %s "), strint(mi.age)); i = tree->addnode(_(" Home ")); tree->addleaff(i, 0, 17, _(" City : %s "), bi.city.c_str()); tree->addleaff(i, 0, 18, _(" State : %s "), bi.state.c_str()); tree->addleaff(i, 0, 19, _(" Country : %s "), abstracthook::getCountryIDtoString(bi.country).c_str()); tree->addleaff(i, 0, 20, _(" Street address : %s "), bi.street.c_str()); tree->addleaff(i, 0, 21, _(" Zip code : %s "), bi.zip.c_str()); tree->addleaff(i, 0, 22, _(" Phone : %s "), bi.phone.c_str()); tree->addleaff(i, 0, 23, _(" Fax : %s "), bi.fax.c_str()); tree->addleaff(i, 0, 24, _(" Cellular phone : %s "), bi.cellular.c_str()); i = tree->addnode(_(" Work ")); tree->addleaff(i, 0, 25, _(" City : %s "), wi.city.c_str()); tree->addleaff(i, 0, 26, _(" State : %s "), wi.state.c_str()); tree->addleaff(i, 0, 27, _(" Country : %s "), abstracthook::getCountryIDtoString(wi.country).c_str()); tree->addleaff(i, 0, 28, _(" Street address : %s "), wi.street.c_str()); tree->addleaff(i, 0, 41, _(" Zip code : %s "), wi.zip.c_str()); tree->addleaff(i, 0, 29, _(" Company : %s "), wi.company.c_str()); tree->addleaff(i, 0, 30, _(" Department : %s "), wi.dept.c_str()); tree->addleaff(i, 0, 31, _(" Position : %s "), wi.position.c_str()); tree->addleaff(i, 0, 32, _(" Homepage : %s "), wi.homepage.c_str()); tree->addleaff(i, 0, 33, _(" Phone : %s "), wi.phone.c_str()); tree->addleaff(i, 0, 34, _(" Fax : %s "), wi.fax.c_str()); i = tree->addnode(_(" More ")); tree->addleaff(i, 0, 35, _(" Homepage : %s "), mi.homepage.c_str()); if(passinfo.pname == icq) { tree->addleaff(i, 0, 36, _(" 1st language : %s "), abstracthook::getLanguageIDtoString(mi.lang1).c_str()); tree->addleaff(i, 0, 37, _(" 2nd language : %s "), abstracthook::getLanguageIDtoString(mi.lang2).c_str()); tree->addleaff(i, 0, 38, _(" 3rd language : %s "), abstracthook::getLanguageIDtoString(mi.lang3).c_str()); i = tree->addnode(_(" Miscellaneous ")); if(ourdetails) { tree->addleaff(i, 0, 43, _(" Enable web status indicator : %s "), stryesno(bi.webaware)); tree->addleaff(i, 0, 42, _(" Random chat group : %s "), strrandomgroup(bi.randomgroup)); } else { tree->addleaff(i, 0, 44, _(" Authorization required : %s "), stryesno(bi.requiresauth)); } } } else if(passinfo.pname == gadu) { CHECKGENERAL; tree->addleaff(i, 0, 11, _(" First name : %s "), bi.fname.c_str()); tree->addleaff(i, 0, 12, _(" Last name : %s "), bi.lname.c_str()); tree->addleaff(i, 0, 17, _(" City : %s "), bi.city.c_str()); tree->addleaff(i, 0, 14, _(" Gender : %s "), strgender(mi.gender)); } if(passinfo.pname == jabber) { i = tree->addnode(_(" Miscellaneous ")); tree->addleaff(i, 0, 50, _(" Avatar file : %s "), bi.avatar.c_str()); } if(passinfo.pname == rss) { i = tree->addnode(_(" Feed Parameters ")); tree->addleaff(i, 0, 48, _(" XML export URL : %s "), wi.homepage.c_str()); tree->addleaff(i, 0, 49, _(" Check frequency (minutes) : %lu "), mi.checkfreq); } if(capab.count(hookcapab::changeabout)) if((capab.count(hookcapab::flexiblereg) && ri.params.empty()) || !capab.count(hookcapab::flexiblereg)) { i = tree->addnode(_(" About ")); tree->addleaff(i, 0, 39, " %s ", about.c_str()); } tree->menu.setpos(saveitem, savefirst); } bool icqface::updatedetails(icqcontact *c, protocolname upname) { string about, tmp; icqcontact::basicinfo bi; icqcontact::workinfo wi; icqcontact::moreinfo mi; icqcontact::reginfo ri; bool finished = false, ret = false, msb; int n, b, citem; dialogbox db; if(!c) { status(_("Fetching your details")); c = clist.get(contactroot); } if(!(msb = mainscreenblock)) { blockmainscreen(); } passinfo.pname = upname; textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED); if(c->getdesc() == contactroot) { w.set_titlef(conf->getcolor(cp_dialog_highlight), _(" Your %s details "), conf->getprotocolname(upname).c_str()); } else { w.set_titlef(conf->getcolor(cp_dialog_highlight), _(" %s: details "), c->getdesc().totext().c_str()); } detailsfetched = (c->getdesc() != contactroot); db.setwindow(&w, false); db.settree(new treeview(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), conf->getcolor(cp_dialog_highlight), conf->getcolor(cp_dialog_text))); db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("Change"), _("Done"), (char*)0)); db.idle = &detailsidle; db.addautokeys(); while(!finished) { gendetails(db.gettree(), c); finished = !db.open(n, b, (void **) &citem); if(finished) continue; bi = c->getbasicinfo(); mi = c->getmoreinfo(); wi = c->getworkinfo(); ri = c->getreginfo(); about = c->getabout(); if(!b) { if((c->getdesc() == contactroot) && !c->updated()) { status(_("Wait a moment. Your details haven't been fetched yet")); continue; } else switch(citem) { case 10: c->setnick(inputstr(_("Nickname: "), c->getnick())); switch(c->getdesc().pname) { case infocard: case livejournal: case rss: c->setdispnick(c->getnick()); break; } break; case 11: bi.fname = inputstr(_("First name: "), bi.fname); break; case 12: bi.lname = inputstr(_("Last name: "), bi.lname); break; case 13: bi.email = inputstr(_("E-mail: "), bi.email); break; case 14: selectgender(mi.gender); break; case 15: if(mi.birth_day || mi.birth_month || mi.birth_year) { tmp = i2str(mi.birth_day) + "-" + i2str(mi.birth_month) + "-" + i2str(mi.birth_year); } else { tmp = ""; } tmp = inputstr(_("Enter birthdate (DD-MM-YYYY): "), tmp); if(tmp.size()) { int d, m, y; sscanf(tmp.c_str(), "%d-%d-%d", &d, &m, &y); if(y >= 1900) if((d > 0) && (d <= 31)) if((m > 0) && (m <= 12)) { mi.birth_day = d; mi.birth_month = m; mi.birth_year = y; } } else { mi.birth_day = mi.birth_month = mi.birth_year = 0; } break; case 16: mi.age = atoi(inputstr(_("Age: "), strint(mi.age)).c_str()); break; case 17: bi.city = inputstr(_("City: "), bi.city); break; case 18: bi.state = inputstr(_("State: "), bi.state); break; case 19: selectcountry(bi.country); break; case 20: bi.street = inputstr(_("Street address: "), bi.street); break; case 21: bi.zip = inputstr(_("Zip code: "), bi.zip); break; case 22: bi.phone = inputstr(_("Phone: "), bi.phone); break; case 23: bi.fax = inputstr(_("Fax: "), bi.fax); break; case 24: bi.cellular = inputstr(_("Cellular phone: "), bi.cellular); break; case 25: wi.city = inputstr(_("City: "), wi.city); break; case 26: wi.state = inputstr(_("State: "), wi.state); break; case 27: selectcountry(wi.country); break; case 28: wi.street = inputstr(_("Street address: "), wi.street); break; case 29: wi.company = inputstr(_("Company: "), wi.company); break; case 30: wi.dept = inputstr(_("Department: "), wi.dept); break; case 31: wi.position = inputstr(_("Position: "), wi.position); break; case 32: wi.homepage = inputstr(_("Homepage: "), wi.homepage); break; case 33: wi.phone = inputstr(_("Phone: "), wi.phone); break; case 34: wi.fax = inputstr(_("Fax: "), wi.fax); break; case 35: mi.homepage = inputstr(_("Homepage: "), mi.homepage); break; case 36: selectlanguage(mi.lang1); break; case 37: selectlanguage(mi.lang2); break; case 38: selectlanguage(mi.lang3); break; case 39: edit(about, _("About")); break; case 40: bi.requiresauth = !bi.requiresauth; break; case 41: wi.zip = inputstr(_("Zip code: "), wi.zip); break; case 42: selectrandomgroup(bi.randomgroup); break; case 43: bi.webaware = !bi.webaware; break; case 44: bi.requiresauth = !bi.requiresauth; break; case 46: { abstracthook &h = gethook(passinfo.pname); vector servs = h.getservices(servicetype::registration); vector::const_iterator is = find(servs.begin(), servs.end(), ri.service); if(is != servs.end()) { if(++is == servs.end()) is = servs.begin(); if(*is != ri.service) { ri.service = *is; ri.params.clear(); } } } break; case 47: ri.password = inputstr(_("New password: "), ri.password, '*'); if(!ri.password.empty()) if(inputstr(_("Check the new password: "), "", '*') != ri.password) ri.password = ""; break; case 48: wi.homepage = inputstr(_("URL: "), wi.homepage); break; case 49: mi.checkfreq = atol(inputstr(_("Check frequency: "), strint(mi.checkfreq)).c_str()); break; case 50: bi.avatar = inputstr(_("Avatar file: "), bi.avatar); break; default: if(citem >= 100) { vector >::iterator ifp = ri.params.begin()+citem-100; ifp->second = inputstr(ifp->first + ": ", ifp->second); } break; } c->setbasicinfo(bi); c->setmoreinfo(mi); c->setworkinfo(wi); c->setreginfo(ri); c->setabout(about); } else { ret = (c->getdesc() != contactroot) || c->updated(); finished = true; } } db.close(); if(!msb) { unblockmainscreen(); } return ret; } void icqface::selectcountry(unsigned short &f) { int i; verticalmenu m(conf->getcolor(cp_dialog_menu), conf->getcolor(cp_dialog_selected)); m.setwindow(textwindow(4, LINES-16, 30, LINES-3, conf->getcolor(cp_dialog_menu))); m.idle = &menuidle; for(i = 0; i < abstracthook::Country_table_size; i++) { m.additem(0, (int) abstracthook::Country_table[i].code, (string) " " + abstracthook::Country_table[i].name); if(abstracthook::Country_table[i].code == f) { m.setpos(i); } } i = m.open(); m.close(); if(i) f = (unsigned short) ((intptr_t) m.getref(i-1)); } void icqface::selectlanguage(unsigned short &f) { int i; verticalmenu m(conf->getcolor(cp_dialog_menu), conf->getcolor(cp_dialog_selected)); m.setwindow(textwindow(4, LINES-13, 20, LINES-4, conf->getcolor(cp_dialog_menu))); m.idle = &menuidle; for(i = 0; i < abstracthook::Language_table_size; i++) { m.additemf(" %s", abstracthook::Language_table[i]); } m.setpos(f); i = m.open(); m.close(); if(i) f = i-1; } void icqface::selectrandomgroup(unsigned short &f) { int i; verticalmenu m(conf->getcolor(cp_dialog_menu), conf->getcolor(cp_dialog_selected)); m.setwindow(textwindow(4, LINES-15, 20, LINES-3, conf->getcolor(cp_dialog_menu))); m.idle = &menuidle; m.additemf(" %s", _("none")); for(i = 1; i <= ((int) ICQ2000::GROUP_SEEKINGMEN); i++) { m.additemf(" %s", strrandomgroup(i)); } m.setpos(f); i = m.open(); m.close(); if(i) f = i-1; } void icqface::selectgender(imgender &f) { verticalmenu m(conf->getcolor(cp_dialog_menu), conf->getcolor(cp_dialog_selected)); m.setwindow(textwindow(4, LINES-8, 20, LINES-4, conf->getcolor(cp_dialog_menu))); m.idle = &menuidle; for(imgender i = genderUnspec; i != imgender_size; i++) { m.additemf(0, (int) i, " %s", strgender(i)); if(i == f) m.setpos(m.getcount()-1); } int i = m.open(); m.close(); if(i) f = (imgender) ((intptr_t) m.getref(i-1)); } void icqface::selectagerange(ICQ2000::AgeRange &r) { verticalmenu m(conf->getcolor(cp_dialog_menu), conf->getcolor(cp_dialog_selected)); m.setwindow(textwindow(4, LINES-8, 18, LINES-3, conf->getcolor(cp_dialog_menu))); m.idle = &menuidle; for(ICQ2000::AgeRange i = ICQ2000::RANGE_NORANGE; i <= ICQ2000::RANGE_60_ABOVE; i = ICQ2000::AgeRange(i+1)) { const char *p = stragerange(i); if(i == ICQ2000::RANGE_NORANGE) p = _("none"); m.additemf(0, (int) i, " %s", p); if(i == r) m.setpos(m.getcount()-1); } int i = m.open(); m.close(); if(i) r = (ICQ2000::AgeRange) ((intptr_t) m.getref(i-1)); } bool icqface::edit(string &txt, const string &header) { bool msb = mainscreenblock; if(!msb) blockmainscreen(); texteditor se; textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED); w.set_title(conf->getcolor(cp_dialog_highlight), (string) " " + header + _(" [Ctrl-X save, Esc cancel] ")); w.open(); editdone = false; se.setcoords(w.x1+1, w.y1+1, w.x2, w.y2); se.addscheme(cp_dialog_text, cp_dialog_text, 0, 0); se.idle = &editidle; se.otherkeys = &editaboutkeys; se.wrap = true; se.smarttab = false; se.load(txt, ""); se.open(); if(editdone) { char *ctext = se.save("\r\n"); txt = ctext; delete ctext; } w.close(); if(!msb) unblockmainscreen(); return editdone; } bool icqface::sendfiles(const imcontact &cinfo, string &msg, linkedlist &flist) { int n, i, b; bool finished = false; string fname; dialogbox db; flist.freeitem = &charpointerfree; flist.empty(); blockmainscreen(); textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED); w.set_titlef(conf->getcolor(cp_dialog_highlight), _(" Send file(s) to %s, %lu "), clist.get(cinfo)->getdispnick().c_str(), cinfo.uin); db.setwindow(&w, false); db.settree(new treeview(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), conf->getcolor(cp_dialog_highlight), conf->getcolor(cp_dialog_text))); db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("Add"), _("Remove"), _("Comment"), _("Send"), (char*)0)); db.addkey(KEY_IC, 0); db.addkey(KEY_DC, 1); db.addautokeys(); db.idle = &dialogidle; while(!finished) { db.gettree()->clear(); int nfiles = db.gettree()->addnode(_(" Files ")); int ncomment = db.gettree()->addnode(_(" Comment ")); for(i = 0; i < flist.count; i++) db.gettree()->addleaf(nfiles, 0, 0, " " + justfname((char *) flist.at(i)) + " "); db.gettree()->addleaf(ncomment, 0, 0, " " + msg + " "); finished = !db.open(n, b); if(!finished) switch(b) { case 0: fname = inputfile(_("filename: ")); if(fname.size()) flist.add(strdup(fname.c_str())); break; case 1: flist.remove(n-2); break; case 2: msg = inputstr(_("comment: "), msg); break; case 3: finished = true; break; } else { flist.empty(); } } db.close(); unblockmainscreen(); return flist.count; } void icqface::multichange(bool conv[], bool newstate) { protocolname pname; for(pname = icq; pname != protocolname_size; pname++) if((!conf->getourid(pname).empty() || pname == rss) && conv[pname]) break; if(pname == protocolname_size || !newstate) { for(pname = icq; pname != protocolname_size; pname++) if(!conf->getourid(pname).empty() || pname == rss) conv[pname] = newstate; } } bool icqface::updateconf(icqconf::regsound &s, icqconf::regcolor &c) { bool finished, success, hasany; int nopt, n, i, b, aaway, ana; bool needredraw = false; protocolname pname; string tmp, phidden; string smtp = conf->getsmtphost() + ":" + i2str(conf->getsmtpport()); string browser = conf->getbrowser(); string screensocketpath = conf->getscreensocketpath(); bool screenna = conf->getscreenna(); bool quote = conf->getquote(); bool savepwd = conf->getsavepwd(); bool hideoffl = conf->gethideoffline(); bool antispam = conf->getantispam(); bool showopenedchats = conf->getshowopenedchats(); bool dropauthreq = conf->getdropauthreq(); bool usingcaptcha = conf->getusingcaptcha(); bool mailcheck = conf->getmailcheck(); bool makelog = conf->getmakelog(); bool askaway = conf->getaskaway(); bool bidi = conf->getbidi(); bool askquit = conf->getaskquit(); bool emacs = conf->getemacs(); bool vi = conf->getvi(); bool proxyconnect = conf->getproxyconnect(); bool timestampstothesecond = conf->gettimestampstothesecond(); bool logtimestamps, logonline; conf->getlogoptions(logtimestamps, logonline); bool usex = false; int ptpmin, ptpmax; conf->getpeertopeer(ptpmin, ptpmax); bool ptp = ptpmax; string httpproxy; if (!conf->gethttpproxyuser().empty()) { httpproxy = conf->gethttpproxyuser(); if(!httpproxy.empty()) httpproxy += ":" + conf->gethttpproxypasswd() + "@" + conf->gethttpproxyhost() + ":" + i2str(conf->gethttpproxyport()); } else { httpproxy = conf->gethttpproxyhost(); if(!httpproxy.empty()) httpproxy += ":" + i2str(conf->gethttpproxyport()); } vector convlanguages; convlanguages.push_back(_("None")); convlanguages.push_back(_("Russian")); convlanguages.push_back(_("Polish")); convlanguages.push_back(_("German UTF-8")); vector::const_iterator iconvlang = convlanguages.begin(); string convertfrom = conf->getconvertfrom(); string convertto = conf->getconvertto(); icqconf::groupmode gmode = conf->getgroupmode(); icqconf::colormode cm = conf->getcolormode(); icqconf::sortmode smode = conf->getsortmode(); bool chatmode[protocolname_size], conv[protocolname_size], entersends[protocolname_size], nonimonline[protocolname_size]; for(pname = icq; pname != protocolname_size; pname++) { chatmode[pname] = conf->getchatmode(pname); entersends[pname] = conf->getentersends(pname); conv[pname] = conf->getcpconvert(pname); nonimonline[pname] = conf->getnonimonline(pname); } for(hasany = false, pname = icq; pname != protocolname_size && !hasany; pname++) hasany = !conf->getourid(pname).empty(); dialogbox db; finished = success = false; conf->getauto(aaway, ana, usex); textwindow w(0, 0, sizeBigDlg.width, sizeBigDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED); w.set_title(conf->getcolor(cp_dialog_highlight), _(" CenterIM configuration ")); db.setwindow(&w, false); db.settree(new treeview(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), conf->getcolor(cp_dialog_highlight), conf->getcolor(cp_dialog_text))); db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("Change"), _("Done"), (char*)0)); db.idle = &dialogidle; db.addautokeys(); blockmainscreen(); treeview &t = *db.gettree(); while(!finished) { t.clear(); i = t.addnode(_(" User interface ")); t.addleaff(i, 0, 1, _(" Change sound device to : %s "), strregsound(s)); t.addleaff(i, 0, 2, _(" Change color scheme to : %s "), strregcolor(c)); t.addleaff(i, 0, 35, _(" Change default request authorization message ")); t.addleaff(i, 0, 32, _(" Left panel width : %d "), conf->getleftpanelwidth()); t.addleaff(i, 0, 33, _(" Log panel height : %d "), conf->getlogpanelheight()); t.addleaff(i, 0, 34, _(" Chat panel height : %d "), conf->getchatpanelheight()); t.addleaff(i, 0, 55, _(" Show opened chats : %s "), stryesno(showopenedchats)); #ifdef USE_FRIBIDI t.addleaff(i, 0, 20, _( " Enable bidirectional languages support : %s "), stryesno(bidi)); #endif t.addleaff(i, 0, 23, _(" Enable emacs bindings in text editor : %s "), stryesno(emacs)); t.addleaff(i, 0, 56, _(" Enable vi bindings: %s "), stryesno(vi)); t.addleaff(i, 0, 53, _(" Ask before quit : %s "), stryesno(askquit)); i = t.addnode(_(" Codepages conversion ")); for(tmp = "", pname = icq; pname != protocolname_size; pname++) if(conv[pname]) if(!conf->getourid(pname).empty() || pname == rss) tmp += conf->getprotocolname(pname) + " "; t.addleaff(i, 0, 26, _(" Switch to language preset : %s "), iconvlang->c_str()); t.addleaff(i, 0, 27, _(" Remote charset : %s "), convertfrom.c_str()); t.addleaff(i, 0, 28, _(" Local charset : %s "), convertto.c_str()); if(hasany) { t.addleaff(i, 0, 3, _(" For protocols : %s"), tmp.c_str()); } i = t.addnode(_(" Contact list ")); t.addleaff(i, 0, 17, _(" Arrange contacts into groups : %s "), strgroupmode(gmode)); t.addleaff(i, 0, 54, _(" Sort contacts by : %s "), strsortmode(smode)); t.addleaff(i, 0, 6, _(" Hide offline users : %s "), stryesno(hideoffl)); t.addleaff(i, 0, 14, _(" Anti-spam: kill msgs from users not on the list : %s "), stryesno(antispam)); t.addleaff(i, 0, 51, _(" Anti-spam: ignore authorization requests: %s "), stryesno(dropauthreq)); t.addleaff(i, 0, 52, _(" Anti-spam: use captcha to identify bots: %s "), stryesno(usingcaptcha)); t.addleaff(i, 0, 8, _(" Quote a message on reply : %s "), stryesno(quote)); t.addleaff(i, 0, 15, _(" Check the local mailbox : %s "), stryesno(mailcheck)); t.addleaff(i, 0, 13, _(" Remember passwords : %s "), stryesno(savepwd)); t.addleaff(i, 0, 7, _(" Edit away message on status change : %s "), stryesno(askaway)); if(hasany) { for(tmp = "", pname = icq; pname != protocolname_size; pname++) if(chatmode[pname] && !conf->getourid(pname).empty()) tmp += conf->getprotocolname(pname) + " "; t.addleaff(i, 0, 16, _(" Chat messaging mode for : %s"), tmp.c_str()); for(tmp = "", pname = icq; pname != protocolname_size; pname++) if(entersends[pname] && !conf->getourid(pname).empty()) tmp += conf->getprotocolname(pname) + " "; t.addleaff(i, 0, 25, _(" Enter key sends message for : %s"), tmp.c_str()); } else { t.addleaff(i, 0, 16, _(" Chat messaging mode : %s "), stryesno(chatmode[icq])); t.addleaff(i, 0, 25, _(" Enter key sends message : %s "), stryesno(entersends[icq])); } for(tmp = "", pname = icq; pname != protocolname_size; pname++) if(nonimonline[pname]) tmp += conf->getprotocolname(pname) + " "; t.addleaff(i, 0, 29, _(" Always online non-IM contacts for : %s"), tmp.c_str()); t.addleaff(i, 0, 30, _(" Color contacts according to: %s "), strcolormode(cm)); i = t.addnode(_(" Communications ")); t.addleaff(i, 0, 19, _(" SMTP server : %s "), smtp.c_str()); t.addleaff(i, 0, 31, _(" HTTP browser : %s "), browser.c_str()); t.addleaff(i, 0, 24, _(" HTTP proxy server : %s "), httpproxy.c_str()); if(!httpproxy.empty()) t.addleaff(i, 0, 11, _(" Proxy only for HTTP (rss and lj) : %s "), stryesno(!proxyconnect)); t.addleaff(i, 0, 21, _(" Enable peer-to-peer communications : %s "), stryesno(ptp)); if(ptp) t.addleaff(i, 0, 22, _(" Port range to use for peer-to-peer : %s "), (i2str(ptpmin) + "-" + i2str(ptpmax)).c_str()); i = t.addnode(_(" Logging ")); t.addleaff(i, 0, 9, _(" Timestamps in the log window : %s "), stryesno(logtimestamps)); t.addleaff(i, 0, 48, _(" Timestamps include seconds : %s "), stryesno(timestampstothesecond)); t.addleaff(i, 0, 10, _(" Online/offline events in the log window : %s "), stryesno(logonline)); t.addleaff(i, 0, 18, _(" Detailed IM events log in ~/.centerim/log : %s "), stryesno(makelog)); i = t.addnode(_(" Auto Presence Status ")); t.addleaff(i, 0, 4, _(" Automatically set Away period (min) : %d "), aaway); t.addleaff(i, 0, 5, _(" Automatically set N/A period (min) : %d "), ana); #ifdef HAVE_LIBXSS t.addleaff(i, 0, 57, _(" Use X to report idle time : %s "), stryesno(usex)); #endif t.addleaff(i, 0, 49, _(" Automatically set N/A when screen is detached : %s "), stryesno(screenna)); if (screenna) t.addleaff(i, 0, 50, _(" Screen socket path : %s "), screensocketpath.c_str()); void *p; finished = !db.open(n, b, &p); i = (intptr_t) p; if(!finished) switch(b) { case 0: switch(i) { case 1: s = s == icqconf::rsdontchange ? icqconf::rscard : s == icqconf::rscard ? icqconf::rsspeaker : s == icqconf::rsspeaker ? icqconf::rsdisable : icqconf::rsdontchange; break; case 2: c = c == icqconf::rcdontchange ? icqconf::rcdark : c == icqconf::rcdark ? icqconf::rcblue : icqconf::rcdontchange; break; case 3: if(hasany) selectproto(conv, spIMplusRSS); else for(pname = icq; pname != protocolname_size; pname++) conv[pname] = !conv[pname]; break; case 4: tmp = inputstr(_("Auto Away period (0 - disable): "), i2str(aaway)); if(!tmp.empty()) aaway = atol(tmp.c_str()); break; case 5: tmp = inputstr(_("Auto N/A period (0 - disable): "), i2str(ana)); if(!tmp.empty()) ana = atol(tmp.c_str()); break; case 6: hideoffl = !hideoffl; break; case 7: askaway = !askaway; break; case 8: quote = !quote; break; case 9: logtimestamps = !logtimestamps; break; case 10: logonline = !logonline; break; case 11: proxyconnect = !proxyconnect; break; case 13: savepwd = !savepwd; break; case 14: antispam = !antispam; break; case 15: mailcheck = !mailcheck; break; case 16: if(hasany) selectproto(chatmode); else for(pname = icq; pname != protocolname_size; pname++) chatmode[pname] = !chatmode[pname]; break; case 17: gmode = gmode == icqconf::group1 ? icqconf::group2 : gmode == icqconf::group2 ? icqconf::nogroups : icqconf::group1; break; case 18: makelog = !makelog; break; case 19: tmp = inputstr(_("SMTP server hostname: "), smtp); if(!tmp.empty()) smtp = tmp; break; case 20: bidi = !bidi; break; case 21: ptp = !ptp; if(ptp && !ptpmax) ptpmin = 0, ptpmax = 65535; break; case 22: tmp = inputstr(_("Peer-to-peer port range (min-max): "), (i2str(ptpmin) + "-" + i2str(ptpmax)).c_str()); if(tmp.size()) { int tptpmin = atoi(getword(tmp, "-").c_str()); int tptpmax = atoi(tmp.c_str()); if(tptpmax) if(tptpmin < tptpmax) ptpmin = tptpmin, ptpmax = tptpmax; } break; case 23: emacs = !emacs; break; case 24: httpproxy = inputstr(_("HTTP proxy server hostname: "), httpproxy); break; case 25: if(hasany) selectproto(entersends); else for(pname = icq; pname != protocolname_size; pname++) entersends[pname] = !entersends[pname]; break; case 26: iconvlang++; if(iconvlang == convlanguages.end()) iconvlang = convlanguages.begin(); switch(iconvlang-convlanguages.begin()) { case 0: convertto = convertfrom = ""; // multichange(conv, false); break; case 1: convertfrom = "cp1251"; convertto = "koi8-r"; multichange(conv, true); break; case 2: convertfrom = "cp1250"; convertto = "iso-8859-2"; multichange(conv, true); break; case 3: convertfrom = "iso-8859-15"; convertto = "utf-8"; multichange(conv, true); break; } break; case 27: convertfrom = inputstr(_("Charset to convert messages from: "), convertfrom); if(input.getlastkey() == '\r') iconvlang = convlanguages.begin(); break; case 28: convertto = inputstr(_("Charset to convert messages to: "), convertto); if(input.getlastkey() == '\r') iconvlang = convlanguages.begin(); break; case 29: selectproto(nonimonline, spnonIM); break; case 30: cm = (cm == icqconf::cmproto ? icqconf::cmstatus : icqconf::cmproto ); break; case 31: tmp = inputstr(_("HTTP browser to use: "), browser); if(!tmp.empty()) browser = tmp; break; case 32: conf->setleftpanelwidth(atol(inputstr(_("Left panel width: "), strint(conf->getleftpanelwidth())).c_str())); needredraw = true; break; case 33: conf->setlogpanelheight(atol(inputstr(_("Log panel height: "), strint(conf->getlogpanelheight())).c_str())); needredraw = true; break; case 34: conf->setchatpanelheight(atol(inputstr(_("Chat panel height: "), strint(conf->getchatpanelheight())).c_str())); needredraw = true; break; case 35: conf->setDefaultAuthMessage(inputstr(_("Default authorization request message: "), conf->getDefaultAuthMessage())); break; case 48: timestampstothesecond = !timestampstothesecond; break; case 49: screenna = !screenna; break; case 50: screensocketpath = inputstr(_("Screen socket path: "), screensocketpath); if (screensocketpath.empty() || access(screensocketpath.c_str(), X_OK)) { status(_("Choosen screen socket path doesn't exist!")); screenna = false; } break; case 51: dropauthreq = !dropauthreq; if (dropauthreq && usingcaptcha) usingcaptcha = false; break; case 52: usingcaptcha = !usingcaptcha; /* captcha overrides droping auth requests */ if (dropauthreq && usingcaptcha) dropauthreq = false; break; case 53: askquit = !askquit; break; case 54: smode = smode == icqconf::sort_by_status_and_activity ? icqconf::sort_by_status_and_name : smode == icqconf::sort_by_status_and_name ? icqconf::sort_by_activity : smode == icqconf::sort_by_activity ? icqconf::sort_by_name : icqconf::sort_by_status_and_activity; break; case 55: showopenedchats = !showopenedchats; break; case 56: vi = !vi; break; case 57: usex = !usex; break; } break; case 1: finished = success = true; conf->setquote(quote); conf->setsavepwd(savepwd); conf->setauto(aaway, ana, usex); conf->setscreenna(screenna); conf->setscreensocketpath(screensocketpath); conf->sethideoffline(hideoffl); conf->setemacs(emacs); conf->setvi(vi); conf->setantispam(antispam); conf->setshowopenedchats(showopenedchats); conf->setdropauthreq(dropauthreq); conf->setusingcaptcha(usingcaptcha); conf->setmailcheck(mailcheck); conf->setmakelog(makelog); conf->setaskaway(askaway); conf->setproxyconnect(proxyconnect); conf->settimestampstothesecond(timestampstothesecond); conf->setcharsets(convertfrom, convertto); for(pname = icq; pname != protocolname_size; pname++) { conf->setchatmode(pname, chatmode[pname]); conf->setentersends(pname, entersends[pname]); conf->setnonimonline(pname, nonimonline[pname]); bool bconv = conv[pname] && (!convertfrom.empty() || !convertto.empty()); conf->setcpconvert(pname, bconv || !hasany); } conf->setbidi(bidi); conf->setaskquit(askquit); conf->setlogoptions(logtimestamps, logonline); if(ptp) conf->setpeertopeer(ptpmin, ptpmax); else conf->setpeertopeer(0, 0); if(conf->getgroupmode() != gmode) { conf->setgroupmode(gmode); clist.rearrange(); } conf->setcolormode(cm); if (conf->getsortmode() != smode){ conf->setsortmode(smode); } conf->setsmtphost(smtp); conf->setbrowser(browser); conf->sethttpproxyhost(httpproxy); conf->save(); break; } } db.close(); unblockmainscreen(); if(needredraw) { icqface::redraw(); } return success; } void icqface::selectproto(bool prots[], spmode mode) { static int saveelem = 0; int i, protmax; bool finished = false; protocolname pname; protocolname tempprots[protocolname_size]; bool aprots[protocolname_size]; i = 0; memcpy(aprots, prots, sizeof(aprots)); for(pname = icq; pname != protocolname_size; pname++) { if(mode == spnonIM) { if(pname != infocard) if(!gethook(pname).getCapabs().count(hookcapab::nochat)) continue; if(pname == livejournal) continue; } else { if(mode != spIMplusRSS || pname != rss) if(pname != livejournal || mode == spIMonly) { if(gethook(pname).getCapabs().count(hookcapab::nochat)) continue; if(conf->getourid(pname).empty()) continue; } if(!gethook(pname).enabled()) continue; } tempprots[i++] = pname; } protmax = i; vector mst; vector::iterator im; verticalmenu m(conf->getcolor(cp_dialog_menu), conf->getcolor(cp_dialog_selected)); m.setwindow(textwindow(4, LINES-5-protmax, 18, LINES-4, conf->getcolor(cp_dialog_menu))); m.idle = &menuidle; m.otherkeys = &multiplekeys; m.setpos(saveelem); while(!finished) { saveelem = m.getpos(); m.clear(); for(i = 0; i < protmax; i++) m.additemf(0, i, "[%c] %s", aprots[tempprots[i]] ? 'x' : ' ', conf->getprotocolname(tempprots[i]).c_str()); m.setpos(saveelem); switch(m.open()) { case -2: aprots[tempprots[m.getpos()]] = !aprots[tempprots[m.getpos()]]; break; default: finished = true; break; } } m.close(); if(m.getlastkey() != KEY_ESC) memcpy(prots, aprots, sizeof(aprots)); } int icqface::editaboutkeys(texteditor &e, int k) { switch(k) { case CTRL('x'): face.editdone = true; return -1; case 27: return -1; } return 0; } void icqface::detailsidle(dialogbox &db) { icqcontact *c; if(!face.detailsfetched) if(c = clist.get(contactroot)) if(c->updated()) { face.gendetails(db.gettree()); db.gettree()->redraw(); face.status(_("Your details have been fetched")); face.detailsfetched = true; } cicq.idle(HIDL_SOCKEXIT); } int icqface::selectgroup(const string &text) { return groupmanager(text, true); } void icqface::organizegroups() { groupmanager(_("Organize contact groups"), false); } int icqface::groupmanager(const string &text, bool sel) { dialogbox db; static int n = 0; int r, ngrp, b, id; vector::iterator i; string gname; bool touched = false; textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED); w.set_title(conf->getcolor(cp_dialog_highlight), " " + text + " "); db.setwindow(&w, false); db.settree(new treeview(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), conf->getcolor(cp_dialog_highlight), conf->getcolor(cp_dialog_text))); db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("Add"), _("Rename"), _("rEmove"), _("move Up"), _("move Down"), sel ? _("Select") : _("Done"), (char*)0)); db.addautokeys(); db.getbar()->item = 5; r = 0; db.idle = &dialogidle; blockmainscreen(); treeview &t = *db.gettree(); db.addkey(KEY_IC, 0); db.addkey(KEY_DC, 2); for(bool fin = false; !fin && !r; ) { t.clear(); ngrp = t.addnode(_(" Groups ")); sort(groups.begin(), groups.end()); for(i = groups.begin(); i != groups.end(); ++i) { b = i-groups.begin()+1; id = t.addleaff(ngrp, 0, b, " %s ", i->getname().c_str()); if(n == b) t.setcur(id); } fin = !db.open(n, b, (void **) &n); if(!fin) switch(b) { case 0: gname = inputstr(_("Name for a group to be created: "), ""); if(!gname.empty()) { groups.add(gname); touched = true; } break; case 1: if(n) { i = groups.begin()+n-1; gname = inputstr(_("New name for the group: "), i->getname()); if(input.getlastkey() != KEY_ESC) if(!gname.empty()) { i->rename(gname); touched = true; } } break; case 2: if(n) { i = groups.begin()+n-1; if(i->getid() != 1) { if(ask(_("Are you sure want to remove the group?"), ASK_YES | ASK_NO, ASK_NO) == ASK_YES) { groups.remove(i->getid()); clist.rearrange(); touched = true; } } } break; case 3: if(n) { i = groups.begin()+n-1; i->moveup(); n--; touched = true; } break; case 4: if(n) { i = groups.begin()+n-1; i->movedown(); n++; touched = true; } break; case 5: if(n) { i = groups.begin()+n-1; r = i->getid(); } else if(!sel) { fin = true; } break; } } if(touched) groups.save(); db.close(); unblockmainscreen(); return r; } void icqface::transfermonitor() { dialogbox db; int n, b, np, cid; vector::iterator it; string fitem; vector< pair< pair, int> > nodes; vector< pair< pair, int> >::iterator in; textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED); w.set_titlef(conf->getcolor(cp_dialog_highlight), " %s ", _("File transfer status")); db.setwindow(&w, false); db.settree(new treeview(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), conf->getcolor(cp_dialog_highlight), conf->getcolor(cp_dialog_text))); db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("Cancel"), _("Remove"), (char*)0)); db.getbar()->item = 1; db.addautokeys(); db.idle = &transferidle; blockmainscreen(); treeview &t = *db.gettree(); db.addkey(KEY_DC, 1); for(bool fin = false; !fin; ) { t.clear(); nodes.clear(); for(it = transfers.begin(); it != transfers.end(); ++it) { pair contdir(it->fr.getcontact(), it->fr.getdirection()); for(in = nodes.begin(); in != nodes.end(); ++in) if(in->first.first == contdir.first && in->first.second == contdir.second) break; if(in != nodes.end()) { cid = in->second; } else { if(contdir.second == imevent::incoming) { cid = t.addnodef(_(" Incoming from %s "), contdir.first.totext().c_str()); } else { cid = t.addnodef(_(" Outgoing to %s "), contdir.first.totext().c_str()); } nodes.push_back(make_pair(contdir, cid)); } switch(it->status) { case icqface::tsInit: fitem = _("init"); break; case icqface::tsStart: fitem = _("start"); break; case icqface::tsProgress: fitem = _("work"); break; case icqface::tsFinish: fitem = _("done"); break; case icqface::tsError: fitem = _("err"); break; case icqface::tsCancel: fitem = _("abort"); break; } fitem = (string) "[" + fitem + "] " + it->fname + ", " + i2str(it->bdone); if(it->btotal > 0) fitem += (string) _(" of ") + i2str(it->btotal); int limit = sizeDlg.width-9; if(fitem.size() > limit) { int pos = fitem.find("] "); fitem.erase(pos+2, fitem.size()-limit+2); fitem.insert(pos+2, ".."); } t.addleaff(cid, 0, it-transfers.begin(), " %s ", fitem.c_str()); } fin = !db.open(np, b, (void **) &n); if(!fin && !db.gettree()->menu.getaborted()) { it = transfers.end(); if(!db.gettree()->isnode(db.gettree()->getid(np-1))) it = transfers.begin() + (intptr_t) db.getmenu()->getref(n-1); switch(b) { case 0: if(it != transfers.end()) gethook(it->fr.getcontact().pname).aborttransfer(it->fr); break; case 1: if(it != transfers.end()) switch(it->status) { case icqface::tsInit: case icqface::tsStart: case icqface::tsProgress: status(_("Cannot remove a transfer which is in progress now")); break; case icqface::tsFinish: case icqface::tsError: case icqface::tsCancel: transfers.erase(it); break; } break; } } } db.close(); unblockmainscreen(); } void icqface::transferupdate(const string &fname, const imfile &fr, transferstatus st, int btotal, int bdone) { vector::iterator i = transfers.begin(); while(i != transfers.end()) { if(i->fr.getcontact() == fr.getcontact() && i->fr.getdirection() == fr.getdirection() && i->fname == fname) break; ++i; } if(i == transfers.end()) { transfers.push_back(filetransferitem(fr)); i = transfers.end()-1; i->fname = fname; } if(btotal) i->btotal = btotal; if(bdone) i->bdone = bdone; i->status = st; } void icqface::invokelist(string &s, vector &v, const string &def, textwindow *w) { int delems = (int) ((w->y2-w->y1)/2); int vmax = v.size() > delems ? delems : v.size(); if(vmax < 2) return; vmax++; verticalmenu m(conf->getcolor(cp_dialog_menu), conf->getcolor(cp_dialog_selected)); m.setwindow(textwindow(w->x1, w->y2-vmax, w->x1+30, w->y2, conf->getcolor(cp_dialog_menu))); m.idle = &menuidle; vector::const_iterator iv = v.begin(); while(iv != v.end()) { string cs = *iv; if(cs.empty()) cs = def; m.additem((string) " " + cs); if(cs == s) m.setpos(iv-v.begin()); ++iv; } int i = m.open(); m.close(); if(i) s = v[i-1]; } bool icqface::setljparams(imxmlevent *ev) { bool r = false; #ifdef BUILD_LJ #define LJP_LIST(x, l, d) \ tmp = ev->getfield(x); \ invokelist(tmp, l, d, db.getwindow()); \ ev->setfield(x, tmp); #define LJP_STR(x, m) \ ev->setfield(x, inputstr(m, ev->getfield(x))); #define LJP_BOOL(x) \ ev->setfield(x, ev->getfield(x) == "1" ? "" : "1"); int i, n, b; dialogbox db; vector journals, moods, pictures; vector::iterator im; string tmp; bool custmood; static vector snames, svalues; journals = lhook.getjournals(); pictures = lhook.getpictures(); moods = lhook.getmoods(); ev->setfield("_eventkind", "posting"); if(ev->field_empty("journal") && !journals.empty()) ev->setfield("journal", journals.front()); if(ev->field_empty("mood") && !moods.empty()) ev->setfield("mood", moods.front()); if(ev->field_empty("picture") && !pictures.empty()) ev->setfield("picture", pictures.front()); if(ev->field_empty("security")) ev->setfield("security", "public"); if(snames.empty()) { snames.push_back(_("public (visible to all)")); svalues.push_back("public"); snames.push_back(_("private")); svalues.push_back("private"); snames.push_back(_("friends only")); svalues.push_back("usemask"); } ev->setfield("taglist", ""); textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED); w.set_title(conf->getcolor(cp_dialog_highlight), _(" LiveJournal posting: attributes ")); db.setwindow(&w, false); db.settree(new treeview(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), conf->getcolor(cp_dialog_highlight), conf->getcolor(cp_dialog_text))); db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("Change"), _("Detect music"), _("Post"), _("cAncel"), (char*)0)); db.addautokeys(); db.idle = &dialogidle; blockmainscreen(); treeview &t = *db.gettree(); for(bool fin = false; !fin && !r; ) { t.clear(); i = t.addnode(_(" General ")); t.addleaff(i, 0, 10, _(" Post to journal : %s "), ev->getfield("journal").c_str()); t.addleaff(i, 0, 11, _(" Subject : %s "), ev->getfield("subject").c_str()); vector::iterator is = find(svalues.begin(), svalues.end(), ev->getfield("security")); if(is == svalues.end()) is = svalues.begin(); tmp = is != svalues.end() ? snames[is-svalues.begin()] : ""; t.addleaff(i, 0, 12, _(" Security : %s "), tmp.c_str()); i = t.addnode(_(" Fancy stuff ")); custmood = find(moods.begin(), moods.end(), ev->getfield("mood")) == moods.end() || ev->getfield("mood").empty(); t.addleaff(i, 0, 20, _(" Mood : %s "), custmood ? _("(none/custom)") : ev->getfield("mood").c_str()); if(custmood) t.addleaff(i, 0, 23, _(" Custom mood : %s "), ev->getfield("mood").c_str()); t.addleaff(i, 0, 21, _(" Music : %s "), ev->getfield("music").c_str()); t.addleaff(i, 0, 22, _(" Picture : %s "), ev->getfield("picture").empty() ? _("(default)") : ev->getfield("picture").c_str()); t.addleaff(i, 0, 25, _(" Tags : %s "), ev->getfield("taglist").c_str()); i = t.addnode(_(" Options ")); t.addleaff(i, 0, 30, _(" Disable auto-formatting : %s "), stryesno(ev->getfield("preformatted") == "1")); t.addleaff(i, 0, 31, _(" Disable sending comments by e-mail : %s "), stryesno(ev->getfield("noemail") == "1")); t.addleaff(i, 0, 32, _(" Disallow comments : %s "), stryesno(ev->getfield("nocomments") == "1")); t.addleaff(i, 0, 33, _(" Backdated entry : %s "), stryesno(ev->getfield("backdated") == "1")); fin = !db.open(n, b, (void **) &n); if(!fin) { if(b == 0) { switch(n) { case 10: LJP_LIST("journal", journals, ""); break; case 11: LJP_STR("subject", _("Posting subject: ")); break; case 12: tmp = snames[find(svalues.begin(), svalues.end(), ev->getfield("security"))-svalues.begin()]; invokelist(tmp, snames, "", db.getwindow()); tmp = svalues[find(snames.begin(), snames.end(), tmp)-snames.begin()]; ev->setfield("security", tmp); break; case 20: LJP_LIST("mood", moods, _("(none/custom)")); break; case 21: LJP_STR("music", _("Currently playing: ")); break; case 22: LJP_LIST("picture", pictures, _("(default)")); break; case 23: LJP_STR("mood", _("Current mood: ")); break; case 25: LJP_STR("taglist", _("Tags for the entry: ")); break; case 30: LJP_BOOL("preformatted"); break; case 31: LJP_BOOL("noemail"); break; case 32: LJP_BOOL("nocomments"); break; case 33: LJP_BOOL("backdated"); break; } } else if(b == 1) { ev->setfield("music", conf->execaction("detectmusic")); } else if(b == 2) { r = true; } else if(b == 3) { r = false; fin = true; } } } db.close(); unblockmainscreen(); #endif return r; } void icqface::findpgpkey(dialogbox &db, const vector &items) { bool fin; string sub, upsub; int k, i; xtermtitle(_("pgp key quick search")); status(_("PGP key search: type to find, %s find again, Enter finish"), getstatkey(key_quickfind, section_contact).c_str()); textwindow *w = db.getwindow(); verticalmenu *cm = db.getmenu(); for(fin = false; !fin; ) { attrset(conf->getcolor(cp_dialog_frame)); mvhline(w->y2-2, w->x1+1, HLINE, w->x2-w->x1-2); kwriteatf(w->x1+2, w->y2-2, conf->getcolor(cp_dialog_highlight), "[ %s ]", sub.c_str()); kgotoxy(w->x1+4+sub.size(), w->y2-2); refresh(); if(cicq.idle()) switch(k = getkey()) { case KEY_ESC: case '\r': fin = true; break; case KEY_BACKSPACE: case CTRL('h'): if(!sub.empty()) sub.resize(sub.size()-1); else fin = true; break; default: if(isprint(k) || key2action(k, section_contact) == key_quickfind) { i = cm->getpos()+1; if(isprint(k)) { i--; sub += k; } if(i <= items.size()) { upsub = up(sub); vector::const_iterator it = items.begin()+i; bool passed = false; while(1) { if(it == items.end()) { if(!passed) { passed = true; it = items.begin(); continue; } else { break; } } if(it->find(upsub) != -1) { cm->setpos(it-items.begin()); break; } ++it; } cm->redraw(); } } break; } } attrset(conf->getcolor(cp_dialog_frame)); mvhline(w->y2-2, w->x1+1, HLINE, w->x2-w->x1-2); refresh(); } bool icqface::selectpgpkey(string &keyid, bool secretonly) { bool r = false; #ifdef HAVE_GPGME int n, b; dialogbox db; bool msb; string buf; vector items; textwindow w(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED); w.set_title(conf->getcolor(cp_dialog_highlight), _(" Select PGP key to use ")); db.setwindow(&w, false); db.setmenu(new verticalmenu(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected))); db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("Select"), 0)); db.addautokeys(); db.idle = &dialogidle; db.otherkeys = &findpgpkeys; verticalmenu &m = *db.getmenu(); if(!(msb = mainscreenblock)) blockmainscreen(); vector keys = pgp.getkeys(secretonly); vector::const_iterator i = keys.begin(); m.additemf(0, 0, _(" Use no key")); items.push_back(""); while(i != keys.end()) { buf = pgp.getkeyinfo(*i, secretonly); m.additem(0, 0, (string) " " + buf); items.push_back(up(buf)); if(*i == keyid) m.setpos(m.getcount()-1); ++i; } keys.insert(keys.begin(), ""); for(bool fin = false; !fin && !r; ) { xtermtitle(_("pgp key selection")); status(_("PGP key selection: %s for quick lookup"), getstatkey(key_quickfind, section_contact).c_str()); fin = !db.open(n, b); if(!fin) { if(n < 1) { if(n == -3) findpgpkey(db, items); } else if(!b) { keyid = keys[n-1]; r = fin = true; } } } db.close(); if(!msb) unblockmainscreen(); #endif return r; } centerim-4.22.10/src/imlogger.h0000644000175000001440000000104611461606612013154 00000000000000#ifndef __IMLOGGER_H__ #define __IMLOGGER_H__ #include "icqcommon.h" #include "imevents.h" class imlogger { protected: ofstream f; bool checkopen(); public: imlogger(); ~imlogger(); void putmessage(const string &text); void putevent(const imevent &event); void putonline(const imcontact &cont, const imstatus &oldst, const imstatus &st); void putourstatus(const protocolname &pname, const imstatus &oldst, const imstatus &st); }; extern imlogger logger; const char *streventname(imevent::imeventtype type); #endif centerim-4.22.10/src/icqconf.cc0000644000175000001440000016454611473007750013147 00000000000000/* * * centerim configuration handling routines * $Id: icqconf.cc,v 1.143 2005/09/02 15:20:59 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 #include #include #include #if defined(__sun__) || defined(__NetBSD__) || defined(__sgi__) #include #endif #include "centerim.h" #include "icqconf.h" #include "icqface.h" #include "icqcontacts.h" #include "abstracthook.h" #include "imexternal.h" #include "eventmanager.h" #include "imlogger.h" #include "connwrap.h" icqconf* icqconf::self=NULL; icqconf* icqconf::instance() { if(!self){ self=new icqconf(); } return self; } icqconf::icqconf() : showopenedchats(false), quote(false), dropauthreq(false), usingcaptcha(false), screenna(false), askquit(false), bidi(false) { DEFAULT_TIMESTAMP_FORMAT = "DD.MM.YY hh:mm"; DEFAULT_LOGTIMESTAMP_FORMAT = "%R "; SECONDS_TIMESTAMP_FORMAT = "DD.MM.YY hh:mm:ss"; SECONDS_LOGTIMESTAMP_FORMAT = "%T "; rs = rscard; rc = rcdark; cm = cmproto; fgroupmode = nogroups; fsortmode = sort_by_status_and_activity; autoaway = autona = 0; hideoffline = antispam = makelog = askaway = logtimestamps = logonline = emacs = proxyssl = proxyconnect = notitles = debug = timestampstothesecond = vi = autoawayx = false; timestampformat = DEFAULT_TIMESTAMP_FORMAT; logtimestampformat = DEFAULT_LOGTIMESTAMP_FORMAT; startoffline = false; savepwd = mailcheck = fenoughdiskspace = true; for(protocolname pname = icq; pname != protocolname_size; pname++) { chatmode[pname] = true; cpconvert[pname] = entersends[pname] = nonimonline[pname] = false; } // quick and dirty fix to support .centerim as well as .centericq char *home = getenv("HOME"); if( home != NULL ) { basedir = string(home) + "/.centerim/"; if ( access(basedir.c_str(), F_OK) != 0 ) { basedir = string(home) + "/.centericq/"; if ( access(basedir.c_str(), F_OK) != 0 ) { basedir = string(home) + "/.centerim/"; } } } screensocketpath = "/var/run/screen"; defaultAuthMessage = "Please accept my authorization to add you to my contact list."; } icqconf::~icqconf() { if(self) delete self; } icqconf::imaccount icqconf::getourid(protocolname pname) const { imaccount im; vector::const_iterator i; i = find(accounts.begin(), accounts.end(), pname); im = i == accounts.end() ? imaccount(pname) : *i; return im; } icqconf::imserver icqconf::defservers[protocolname_size] = { { "login.icq.com", 5190, 0 }, { "scs.msg.yahoo.com", 5050, 0 }, { "messenger.hotmail.com", 1863, 0 }, { "toc.oscar.aol.com", 9898, 0 }, { "irc.oftc.net", 6667, 0 }, { "jabber.org", 5222, 5223 }, { "", 0, 0 }, { "livejournal.com", 80, 0 }, { "appmsg.gadu-gadu.pl", 80 } }; void icqconf::setourid(const imaccount &im) { vector::iterator i; i = find(accounts.begin(), accounts.end(), im.pname); if(i != accounts.end()) { if(im.empty()) { accounts.erase(i); i = accounts.end(); } else { *i = im; } } else if(!im.empty()) { accounts.push_back(im); i = accounts.end()-1; } if(i != accounts.end()) { if(i->server.empty()) { i->server = defservers[i->pname].server; i->port = defservers[i->pname].port; } if(!i->port) i->port = defservers[i->pname].port; switch(i->pname) { case jabber: if(i->additional.find("prio") == i->additional.end()) i->additional["prio"] = "4"; #ifdef HAVE_UNAME if(i->additional.find("osinfo") == i->additional.end()) i->additional["osinfo"] = "1"; #endif break; case yahoo: if (i->additional.find("ssl") == i->additional.end()) i->additional["ssl"] = "1"; break; case livejournal: if(i->additional.find("importfriends") == i->additional.end()) i->additional["importfriends"] = "1"; break; case icq: if(i->password.size() > 8) i->password = i->password.substr(0, 8); break; } } } string icqconf::getawaymsg(protocolname pname) const { string r, buf, fname; ifstream f; if(!gethook(pname).getCapabs().count(hookcapab::setaway)) return ""; fname = conf->getconfigfname("awaymsg-" + getprotocolname(pname)); f.open(fname.c_str()); if(f.is_open()) { while(!f.eof()) { getstring(f, buf); if(!r.empty()) r += "\n"; r += buf; } f.close(); } if(r.empty()) { char buf[512]; snprintf(buf, sizeof(buf), _("I do really enjoy the default %s away message of %s %s."), getprotocolname(pname).c_str(), PACKAGE, centerim::version); return buf; } return r; } void icqconf::setawaymsg(protocolname pname, const string &amsg) { string fname; ofstream f; if(!gethook(pname).getCapabs().count(hookcapab::setaway)) return; fname = conf->getconfigfname("awaymsg-" + getprotocolname(pname)); f.open(fname.c_str()); if(f.is_open()) { f << amsg; f.close(); } } string icqconf::getextstatus(protocolname pname, imstatus status) const { string r, buf, fname; ifstream f; if(!gethook(pname).getCapabs().count(hookcapab::setextstatus)) return ""; fname = conf->getconfigfname("extmsg-" + getprotocolname(pname) + "-" + imstatus2char[status]); f.open(fname.c_str()); if(f.is_open()) { while(!f.eof()) { getstring(f, buf); if(!r.empty()) r += "\n"; r += buf; } f.close(); } if(r.empty()) { return ""; } return r; } void icqconf::setextstatus(protocolname pname, const string &amsg, imstatus status) { string fname; ofstream f; if(!gethook(pname).getCapabs().count(hookcapab::setextstatus)) return; fname = conf->getconfigfname("extmsg-" + getprotocolname(pname) + "-" + imstatus2char[status]); f.open(fname.c_str()); if(f.is_open()) { f << amsg; f.close(); } } void icqconf::checkdir() { string dname = getdirname(); dname.erase(dname.size()-1); const char * dirstr = dname.c_str(); // The proper rights for the ~/.centerim-directory const mode_t proper_rights = S_IRUSR | S_IWUSR | S_IXUSR; if(access(dirstr, F_OK) == 0) { // Directory allready exists check the permissions of the directory. struct stat dir_stat; if ( stat(dirstr, &dir_stat) == 0 && (dir_stat.st_mode & ~proper_rights) != 0 ) { DIR *pDir = NULL; // group / other have some kind of permissions for this directory // as mr Picard would have said: compensate! chmod (dirstr, proper_rights); } } else{ // create the ~/.centerim directory since // ~/.centerim / ~/.centericq does not exist. mkdir(dname.c_str(), proper_rights); } } void icqconf::load() { loadmainconfig(); loadkeys(); loadcolors(); loadactions(); loadcaptcha(); external.load(); } vector icqconf::keys; void icqconf::loadkeys() { //int x; not used. string fname = getconfigfname("keybindings"), buf, param; struct keybinding k; ifstream f; keys.clear(); if(access(fname.c_str(), F_OK)) { ofstream of(fname.c_str()); if(of.is_open()) { of << "# This file contains keybinding configuration for centerim" << endl; of << "# Every line should look like: bind
" << endl << endl; of << "bind contact\t?\tinfo" << endl; of << "bind contact\tq\tquit" << endl; of << "bind contact\t\tchange_status" << endl; of << "bind contact\ts\tchange_status" << endl; of << "bind contact\th\thistory" << endl; of << "bind contact\tf\tfetch_away_message" << endl; of << "bind contact\t\tuser_menu" << endl; of << "bind contact\tm\tuser_menu" << endl; of << "bind contact\t\tgeneral_menu" << endl; of << "bind contact\tg\tgeneral_menu" << endl; of << "bind contact\t\thide_offline" << endl; of << "bind contact\t\tcontact_external_action" << endl; of << "bind contact\ta\tadd" << endl; of << "bind contact\t remove" << endl; of << "bind contact\t compose" << endl; of << "bind contact\tc\tsend_contact" << endl; of << "bind contact\tc\trss_check" << endl; of << "bind contact\tu\tsend_url" << endl; of << "bind contact\tr\trename" << endl; of << "bind contact\tv\tversion" << endl; of << "bind contact\te\tedit" << endl; of << "bind contact\ti\tignore" << endl; of << "bind contact\t\\as\tquickfind" << endl; of << "bind contact\t/\tquickfind" << endl << endl; of << "bind contact\t\\cn\tnext_chat" << endl; of << "bind contact\t\\cb\tprev_chat" << endl; of << "bind contact\t[\tleft_panel_move_left" << endl; of << "bind contact\t]\tleft_panel_move_right" << endl; of << "bind contact\t{\tlog_panel_move_up" << endl; of << "bind contact\t}\tlog_panel_move_down" << endl; of << "bind history\t/\tsearch" << endl; of << "bind history\ts\tsearch" << endl; of << "bind history\tn\tsearch_again" << endl; of << "bind history\t\tshow_urls" << endl; of << "bind history\t\tfullscreen" << endl << endl; of << "bind editor\t\\cx\tsend_message" << endl; of << "bind editor\t\tquit" << endl; of << "bind editor\t\\cp\tmultiple_recipients" << endl; of << "bind editor\t\\co\thistory" << endl; of << "bind editor\t\\cn\tnext_chat" << endl; of << "bind editor\t\\cb\tprev_chat" << endl; of << "bind editor\t\\cv\tout_chat" << endl; of << "bind editor\t\\a?\tinfo" << endl; of << "bind editor\t\tshow_urls" << endl; of << "bind editor\t\tfullscreen" << endl << endl; of << "bind editor\t\tchat_panel_move_up" << endl; of << "bind editor\t\tchat_panel_move_down" << endl; #ifdef HAVE_LIBOTR of << "bind editor\t\totr_start_session" << endl; of << "bind editor\t\totr_end_session" << endl; #endif of << "bind info\t\tshow_urls" << endl; of << "bind info\t\tuser_external_action" << endl; of.close(); } } f.open(fname.c_str()); if(f.is_open()) { while(!f.eof()) { getstring(f, buf); if(buf.empty() || buf[0] == '#') continue; k.ctrl = false; k.alt = false; param = getword(buf); /* first word is always bind */ param = getword(buf); /* read section */ if(param == "contact") k.section = section_contact; else if(param == "history") k.section = section_history; else if (param == "editor") k.section = section_editor; else if (param == "info") k.section = section_info; param = getword(buf); /* key */ if(param == "\\c" || param == "\\C" || param == "^") { k.ctrl = true; k.key = CTRL(' '); } else if(param == "\\a" || param == "\\A" || param == "@") { k.alt = true; k.key = ALT('\r'); } else if(param == "\\a" || param == "\\A" || param == "@") { k.ctrl = true; k.key = ALT(' '); } else if(param[0] == '\\') { if(param[1] == 'c' || param[1] == 'C') { k.ctrl = true; k.key = CTRL(param[2]); } else if(param[1] == 'a' || param[1] == 'A') { k.alt = true; k.key = ALT(param[2]); } else if(param[1] == '\\') { k.key = '\\'; } else if(param[1] == '@') { k.key = '@'; } else if(param[1] == '^') { k.key = '^'; } } else if(param[0] == '^') { k.ctrl = true; k.key = CTRL(param[1]); } else if(param[0] == '@') { k.alt = true; k.key = ALT(param[1]); } else if(param == "") k.key = KEY_DC; else if(param == "") k.key = '\r'; else if(param == "") k.key = 27; else if(param == "") k.key = ' '; else if(param == "") k.key = '\b'; else if(param == "") k.key = 339; else if(param == "") k.key = 338; else if(param == "") k.key = 9; else if(param == "") k.key = 331; else if(param[0] == '<' && param[1] == 'F') { k.alt = true; k.ctrl = true; k.key = KEY_F(param[2]-'0'); } else k.key = param[0]; param = getword(buf); /* action */ if(param == "info") k.action = key_info; else if(param == "remove") k.action = key_remove; else if(param == "quit") k.action = key_quit; else if(param == "change_status") k.action = key_change_status; else if(param == "history") k.action = key_history; else if(param == "next_chat") k.action = key_next_chat; else if(param == "prev_chat") k.action = key_prev_chat; else if(param == "out_chat") k.action = key_out_chat; else if(param == "fetch_away_message") k.action = key_fetch_away_message; else if(param == "user_menu") k.action = key_user_menu; else if(param == "general_menu") k.action = key_general_menu; else if(param == "hide_offline") k.action = key_hide_offline; else if(param == "contact_external_action") k.action = key_contact_external_action; else if(param == "add") k.action = key_add; else if(param == "remove") k.action = key_remove; else if(param == "send_message") k.action = key_send_message; else if(param == "send_contact") k.action = key_send_contact; else if(param == "send_url") k.action = key_send_url; else if(param == "rename") k.action = key_rename; else if(param == "version") k.action = key_version; else if(param == "fullscreen") k.action = key_fullscreen; else if(param == "edit") k.action = key_edit; else if(param == "ignore") k.action = key_ignore; else if(param == "quickfind") k.action = key_quickfind; else if(param == "search") k.action = key_search; else if(param == "compose") k.action = key_compose; else if(param == "search_again") k.action = key_search_again; else if(param == "show_urls") k.action = key_show_urls; else if(param == "rss_check") k.action = key_rss_check; else if(param == "multiple_recipients") k.action = key_multiple_recipients; else if(param == "user_external_action") k.action = key_user_external_action; else if(param == "left_panel_move_left") k.action = key_left_panel_move_left; else if(param == "left_panel_move_right") k.action = key_left_panel_move_right; else if(param == "log_panel_move_up") k.action = key_log_panel_move_up; else if(param == "log_panel_move_down") k.action = key_log_panel_move_down; else if(param == "chat_panel_move_up") k.action = key_chat_panel_move_up; else if(param == "chat_panel_move_down") k.action = key_chat_panel_move_down; else #ifdef HAVE_LIBOTR if(param == "otr_start_session") k.action = key_otr_start_session; else if(param == "otr_end_session") k.action = key_otr_end_session; else #endif continue; keys.push_back(k); } f.close(); } /* if(face.action2key(key_info, section_contact).empty()) keys.push_back(keybinding()); else if(face.action2key(key_quit, section_contact).empty()) if(face.action2key(key_change_status, section_contact).empty()) if(face.action2key(key_history, section_contact).empty()) if(face.action2key(key_fetch_away_message, section_contact).empty()) if(face.action2key(key_user_menu, section_contact).empty()) if(face.action2key(key_general_menu, section_contact).empty()) if(face.action2key(key_hide_offline, section_contact).empty()) if(face.action2key(key_contact_external_action, section_contact).empty()) if(face.action2key(key_add, section_contact).empty()) if(face.action2key(key_remove, section_contact).empty()) if(face.action2key(key_compose, section_contact).empty()) if(face.action2key(key_send_contact, section_contact).empty()) if(face.action2key(key_rss_check, section_contact).empty()) if(face.action2key(key_send_url, section_contact).empty()) if(face.action2key(key_rename, section_contact).empty()) if(face.action2key(key_version, section_contact).empty()) if(face.action2key(key_edit, section_contact).empty()) if(face.action2key(key_ignore, section_contact).empty()) if(face.action2key(key_quickfind, section_contact).empty()) if(face.action2key(key_next_chat, section_contact).empty()) if(face.action2key(key_prev_chat, section_contact).empty()) if(face.action2key(key_search, section_history).empty()) if(face.action2key(key_search_again, section_history).empty()) if(face.action2key(key_show_urls, section_history).empty()) if(face.action2key(key_fullscreen, section_history).empty()) if(face.action2key(key_send_message, section_editor).empty()) if(face.action2key(key_quit, section_editor).empty()) if(face.action2key(key_multiple_recipients, section_editor).empty()) if(face.action2key(key_history, section_editor).empty()) if(face.action2key(key_next_chat, section_editor).empty()) if(face.action2key(key_prev_chat, section_editor).empty()) if(face.action2key(key_out_chat, section_editor).empty()) if(face.action2key(key_info, section_editor).empty()) if(face.action2key(key_show_urls, section_editor).empty()) if(face.action2key(key_fullscreen, section_editor).empty()) if(face.action2key(key_show_urls, section_info).empty()) if(face.action2key(key_user_external_action, section_info).empty()) {} */ } void icqconf::loadmainconfig() { string fname = getconfigfname("config"), buf, param, rbuf; ifstream f(fname.c_str()); imaccount im; protocolname pname; if(f.is_open()) { mailcheck = askaway = false; savepwd = bidi = true; setsmtphost(""); setbrowser(""); setpeertopeer(0, 65535); while(!f.eof()) { getstring(f, buf); rbuf = buf; param = getword(buf); if(param == "hideoffline") hideoffline = true; else if(param == "emacs") emacs = true; else if(param == "vi") vi = true; else if(param == "autoaway") autoaway = atol(buf.c_str()); else if(param == "autona") autona = atol(buf.c_str()); else if(param == "auto_away_na_x") autoawayx = true; else if(param == "antispam") antispam = true; else if(param == "showopenedchats") setshowopenedchats(true); else if(param == "dropauthreq") dropauthreq = true; else if(param == "screenna") screenna = true; else if(param == "screensocketpath") screensocketpath = buf; else if(param == "mailcheck") mailcheck = true; else if(param == "quotemsgs") quote = true; else if(param == "sockshost") setsockshost(buf); else if(param == "socksusername") socksuser = buf; else if(param == "sockspass") sockspass = buf; else if((param == "usegroups") || (param == "group1")) fgroupmode = group1; else if(param == "group2") fgroupmode = group2; else if(param == "protocolormode") cm = icqconf::cmproto; else if(param == "statuscolormode") cm = icqconf::cmstatus; else if(param == "sort_by_status_and_activity") setsortmode(icqconf::sort_by_status_and_activity); else if(param == "sort_by_status_and_name") setsortmode(icqconf::sort_by_status_and_name); else if(param == "sort_by_activity") setsortmode(icqconf::sort_by_activity); else if(param == "sort_by_name") setsortmode(icqconf::sort_by_name); else if(param == "smtp") setsmtphost(buf); else if(param == "browser") setbrowser(buf); else if(param == "http_proxy") sethttpproxyhost(buf); else if(param == "log") makelog = true; else if(param == "proxy_connect") proxyconnect = true; else if(param == "proxy_ssl") proxyssl = true; else if(param == "chatmode") initmultiproto(chatmode, buf, true); else if(param == "entersends") initmultiproto(entersends, buf, true); else if(param == "nonimonline") initmultiproto(nonimonline, buf, false); else if(param == "captcha") usingcaptcha = true; else if(param == "russian" || param == "convert") initmultiproto(cpconvert, buf, false); else if(param == "nobidi") setbidi(false); else if(param == "askaway") askaway = true; else if(param == "askquit") askquit = true; else if(param == "logtimestamps") logtimestamps = true; else if(param == "logonline") logonline = true; else if(param == "fromcharset") fromcharset = buf; else if(param == "tocharset") tocharset = buf; else if(param == "left_panel_width") leftpanelwidth = atol(buf.c_str()); else if(param == "log_panel_height") logpanelheight = atol(buf.c_str()); else if(param == "chat_panel_height") chatpanelheight = atol(buf.c_str()); else if(param == "timestampstothesecond") settimestampstothesecond(true); else if(param == "defaultauthmessage") defaultAuthMessage = buf; else if(param == "ptp") { ptpmin = atoi(getword(buf, "-").c_str()); ptpmax = atoi(buf.c_str()); } else { for(pname = icq; pname != protocolname_size; pname++) { buf = getprotocolname(pname); if(param.substr(0, buf.size()) == buf) { im = getourid(pname); im.read(rbuf); setourid(im); } } } } if(fromcharset.empty() && tocharset.empty()) for(pname = icq; pname != protocolname_size; pname++) { if(getcpconvert(pname)) { fromcharset = "cp1251"; tocharset = "koi8-r"; break; } } setproxy(); f.close(); } } void icqconf::save() { string fname = getconfigfname("config"), param; int away, na; bool usex = false; if(enoughdiskspace()) { ofstream f(fname.c_str()); if(f.is_open()) { if(!getsockshost().empty()) { string user, pass; getsocksuser(user, pass); f << "sockshost\t" << getsockshost() + ":" + i2str(getsocksport()) << endl; f << "socksusername\t" << user << endl; f << "sockspass\t" << pass << endl; } getauto(away, na, usex); if(away) f << "autoaway\t" << i2str(away) << endl; if(na) f << "autona\t" << i2str(na) << endl; if(autoawayx) f << "auto_away_na_x" << endl; if(hideoffline) f << "hideoffline" << endl; if(emacs) f << "emacs" << endl; if(getquote()) f << "quotemsgs" << endl; if(vi) f << "vi" << endl; if(getantispam()) f << "antispam" << endl; if(getshowopenedchats()) f << "showopenedchats" << endl; if(getdropauthreq()) f << "dropauthreq" << endl; if(getusingcaptcha()) f << "captcha" << endl; if(getmailcheck()) f << "mailcheck" << endl; if(getaskaway()) f << "askaway" << endl; if(getscreenna()) f << "screenna" << endl; if(!screensocketpath.empty()) f << "screensocketpath\t" << screensocketpath << endl; param = ""; for(protocolname pname = icq; pname != protocolname_size; pname++) if(getchatmode(pname)) param += (string) " " + conf->getprotocolname(pname); if(!param.empty()) f << "chatmode" << param << endl; param = ""; for(protocolname pname = icq; pname != protocolname_size; pname++) if(getentersends(pname)) param += (string) " " + conf->getprotocolname(pname); if(!param.empty()) f << "entersends" << param << endl; param = ""; for(protocolname pname = icq; pname != protocolname_size; pname++) if(getnonimonline(pname)) param += (string) " " + conf->getprotocolname(pname); if(!param.empty()) f << "nonimonline" << param << endl; param = ""; for(protocolname pname = icq; pname != protocolname_size; pname++) if(getcpconvert(pname)) param += (string) " " + conf->getprotocolname(pname); if(!param.empty()) f << "convert" << param << endl; param = ""; f << "fromcharset\t" << fromcharset << endl; f << "tocharset\t" << tocharset << endl; if(!getbidi()) f << "nobidi" << endl; if(getaskquit()) f << "askquit" << endl; if(logtimestamps) f << "logtimestamps" << endl; if(timestampstothesecond) f << "timestampstothesecond" << endl; if(logonline) f << "logonline" << endl; f << "smtp\t" << getsmtphost() << ":" << getsmtpport() << endl; f << "browser\t" << getbrowser() << endl; if(!gethttpproxyhost().empty()) if (!gethttpproxyuser().empty()) f << "http_proxy\t" << gethttpproxyuser() << ":" << gethttpproxypasswd() << "@" << gethttpproxyhost() << ":" << gethttpproxyport() << endl; else f << "http_proxy\t" << gethttpproxyhost() << ":" << gethttpproxyport() << endl; f << "ptp\t" << ptpmin << "-" << ptpmax << endl; switch(getgroupmode()) { case group1: f << "group1" << endl; break; case group2: f << "group2" << endl; break; } switch(getcolormode()) { case cmproto: f << "protocolormode" << endl; break; case cmstatus: f << "statuscolormode" << endl; break; } switch(getsortmode()) { case sort_by_status_and_activity: f << "sort_by_status_and_activity" << endl; break; case sort_by_status_and_name: f << "sort_by_status_and_name" << endl; break; case sort_by_activity: f << "sort_by_activity" << endl; break; case sort_by_name: f << "sort_by_name" << endl; break; } if(getmakelog()) f << "log" << endl; if(getproxyconnect()) f << "proxy_connect" << endl; if(getproxyssl()) f << "proxy_ssl" << endl; if(getleftpanelwidth()) f << "left_panel_width\t" << getleftpanelwidth() << endl; if(getlogpanelheight()) f << "log_panel_height\t" << getlogpanelheight() << endl; if(getchatpanelheight()) f << "chat_panel_height\t" << getchatpanelheight() << endl; f << "defaultauthmessage\t" << getDefaultAuthMessage() << endl; vector::iterator ia; for(ia = accounts.begin(); ia != accounts.end(); ++ia) ia->write(f); f.close(); } } } void icqconf::loadcolors() { string tname = getconfigfname("colorscheme"); switch(conf->getregcolor()) { case rcdark: schemer.push(cp_status, "status black/white"); schemer.push(cp_dialog_text, "dialog_text black/white"); schemer.push(cp_dialog_menu, "dialog_menu black/white"); schemer.push(cp_dialog_selected, "dialog_selected white/transparent bold"); schemer.push(cp_dialog_highlight, "dialog_highlight red/white"); schemer.push(cp_dialog_frame, "dialog_frame blue/white"); schemer.push(cp_main_text, "main_text cyan/transparent"); schemer.push(cp_main_menu, "main_menu green/transparent"); schemer.push(cp_main_selected, "main_selected black/white"); schemer.push(cp_main_highlight, "main_highlight yellow/transparent bold"); schemer.push(cp_main_frame, "main_frame blue/transparent bold"); schemer.push(cp_main_history_incoming, "main_history_incoming yellow/transparent bold"); schemer.push(cp_main_history_outgoing, "main_history_outgoing cyan/transparent"); schemer.push(cp_clist_icq, "clist_icq green/transparent"); schemer.push(cp_clist_yahoo, "clist_yahoo magenta/transparent"); schemer.push(cp_clist_infocard, "clist_infocard white/transparent"); schemer.push(cp_clist_msn, "clist_msn cyan/transparent"); schemer.push(cp_clist_aim, "clist_aim yellow/transparent"); schemer.push(cp_clist_irc, "clist_irc blue/transparent"); schemer.push(cp_clist_jabber, "clist_jabber red/transparent"); schemer.push(cp_clist_rss, "clist_rss white/transparent bold"); schemer.push(cp_clist_lj, "clist_lj cyan/transparent bold"); schemer.push(cp_clist_gadu, "clist_gg blue/transparent bold"); schemer.push(cp_clist_online, "clist_online green/transparent bold"); schemer.push(cp_clist_offline, "clist_offline red/transparent bold"); schemer.push(cp_clist_away, "clist_away yellow/transparent bold"); schemer.push(cp_clist_dnd, "clist_dnd cyan/transparent bold"); schemer.push(cp_clist_na, "clist_na blue/transparent bold"); schemer.push(cp_clist_free_for_chat, "clist_free_for_chat green/transparent bold"); schemer.push(cp_clist_invisible, "clist_invisible grey/transparent bold"); schemer.push(cp_clist_not_in_list, "clist_not_in_list white/transparent bold"); schemer.push(cp_clist_unread, "clist_unread red/transparent bold"); break; case rcblue: schemer.push(cp_status, "status black/white"); schemer.push(cp_dialog_text, "dialog_text black/cyan"); schemer.push(cp_dialog_menu, "dialog_menu black/cyan"); schemer.push(cp_dialog_selected, "dialog_selected white/black bold"); schemer.push(cp_dialog_highlight, "dialog_highlight white/cyan bold"); schemer.push(cp_dialog_frame, "dialog_frame black/cyan"); schemer.push(cp_main_text, "main_text white/blue"); schemer.push(cp_main_menu, "main_menu white/blue"); schemer.push(cp_main_selected, "main_selected black/cyan"); schemer.push(cp_main_highlight, "main_highlight white/blue bold"); schemer.push(cp_main_frame, "main_frame blue/blue bold"); schemer.push(cp_main_history_incoming, "main_history_incoming white/blue"); schemer.push(cp_main_history_outgoing, "main_history_outgoing white/blue bold"); schemer.push(cp_clist_icq, "clist_icq green/blue"); schemer.push(cp_clist_yahoo, "clist_yahoo magenta/blue"); schemer.push(cp_clist_msn, "clist_msn cyan/blue"); schemer.push(cp_clist_infocard, "clist_infocard white/blue"); schemer.push(cp_clist_aim, "clist_aim yellow/blue"); schemer.push(cp_clist_irc, "clist_irc blue/blue bold"); schemer.push(cp_clist_jabber, "clist_jabber red/blue"); schemer.push(cp_clist_rss, "clist_rss white/blue bold"); schemer.push(cp_clist_lj, "clist_lj cyan/blue bold"); schemer.push(cp_clist_gadu, "clist_gg blue/blue bold"); schemer.push(cp_clist_online, "clist_online green/transparent bold"); schemer.push(cp_clist_offline, "clist_offline red/transparent bold"); schemer.push(cp_clist_away, "clist_away yellow/transparent bold"); schemer.push(cp_clist_dnd, "clist_dnd cyan/transparent bold"); schemer.push(cp_clist_na, "clist_na blue/transparent bold"); schemer.push(cp_clist_free_for_chat, "clist_free_for_chat green/transparent bold"); schemer.push(cp_clist_invisible, "clist_invisible grey/transparent bold"); schemer.push(cp_clist_not_in_list, "clist_not_in_list white/transparent bold"); schemer.push(cp_clist_unread, "clist_unread black/blue bold"); break; } if(access(tname.c_str(), F_OK)) { schemer.save(tname); } else { schemer.load(tname); } } void icqconf::loadsounds() { string tname = getconfigfname("sounds"), buf, suin, skey; int i; icqcontact *c; imevent::imeventtype it; typedef pair eventsound; vector soundnames; vector::iterator isn; soundnames.push_back(eventsound(imevent::message, "msg")); soundnames.push_back(eventsound(imevent::sms, "sms")); soundnames.push_back(eventsound(imevent::url, "url")); soundnames.push_back(eventsound(imevent::online, "online")); soundnames.push_back(eventsound(imevent::offline, "offline")); soundnames.push_back(eventsound(imevent::email, "email")); for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); for(it = imevent::message; it != imevent::imeventtype_size; it++) { c->setsound(it, ""); } } if(access(tname.c_str(), F_OK)) { ofstream fo(tname.c_str()); if(fo.is_open()) { fo << "# This file contains sound configuration for centerim" << endl; fo << "# Every line should look like: " << endl << "#" << endl; fo << "# \tid of a contact; can be one of the following" << endl; fo << "# *\tmeans default sound for all the contacts" << endl; fo << "# icq_\tfor icq contacts (e.g. icq_123)" << endl; fo << "# yahoo_\tfor yahoo (e.g. yahoo_thekonst)" << endl; fo << "# .. etc. Similar for the other protocols" << endl << "#" << endl; fo << "# \tcan be: "; for(isn = soundnames.begin(); isn != soundnames.end(); ++isn) { if(isn != soundnames.begin()) fo << ", "; fo << isn->second; } fo << endl << "# \tcommand line to be executed to play a sound" << endl << endl; switch(rs) { case rscard: fo << "*\tmsg\taplay " << SHARE_DIR << "/msg.wav" << endl; fo << "*\turl\taplay " << SHARE_DIR << "/url.wav" << endl; fo << "*\temail\taplay " << SHARE_DIR << "/email.wav" << endl; fo << "*\tonline\taplay " << SHARE_DIR << "/online.wav" << endl; fo << "*\toffline\taplay " << SHARE_DIR << "/offline.wav" << endl; fo << "*\tsms\taplay " << SHARE_DIR << "/sms.wav" << endl; break; case rsspeaker: fo << "*\tmsg\t!spk1" << endl; fo << "*\turl\t!spk2" << endl; fo << "*\tsms\t!spk3" << endl; fo << "*\temail\t!spk5" << endl; break; } fo.close(); } } ifstream fi(tname.c_str()); if(fi.is_open()) { while(!fi.eof()) { getstring(fi, buf); if(buf.empty() || (buf.substr(0, 1) == "#")) continue; suin = getword(buf); skey = getword(buf); it = imevent::imeventtype_size; for(isn = soundnames.begin(); isn != soundnames.end(); ++isn) { if(skey == isn->second) { it = isn->first; break; } } if(it == imevent::imeventtype_size) continue; c = 0; if(suin != "*") { if((i = suin.find("_")) != -1) { skey = suin.substr(0, i); suin.erase(0, i+1); imcontact ic; protocolname pname; for(pname = icq; pname != protocolname_size && skey != getprotocolname(pname); pname++); if(pname != protocolname_size) { if(suin == "*") { for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getdesc().pname == pname) c->setsound(it, buf); } } else { if(pname == icq) ic = imcontact(strtoul(suin.c_str(), 0, 0), pname); else ic = imcontact(suin, pname); c = clist.get(ic); } } } } else { c = clist.get(contactroot); } if(c) c->setsound(it, buf); } fi.close(); } } void icqconf::loadactions() { string fname = getconfigfname("actions"), buf, name; ifstream f; bool cont; if(access(fname.c_str(), F_OK)) { buf = getenv("PATH") ? getenv("PATH") : ""; ofstream of(fname.c_str()); if(of.is_open()) { of << "# This file contains external actions configuration for centerim" << endl; of << "# Every line should look like: " << endl; of << "# Possible actions are: openurl, detectmusic" << endl << endl; of << "openurl \\" << endl; of << " (if test ! -z \"`ps x | grep /" << browser << " | grep -v grep`\"; \\" << endl; of << "\tthen DISPLAY=0:0 " << browser << " -remote 'openURL($url$, new-window)'; \\" << endl; of << "\telse DISPLAY=0:0 " << browser << " '$url$'; \\" << endl; of << " fi) >/dev/null 2>&1 &" << endl; of << "detectmusic \\" << endl; of << " if test ! -z \"`ps x | grep orpheus | grep -v grep`\"; \\" << endl; of << "\tthen cat ~/.orpheus/currently_playing; \\" << endl; of << " fi" << endl; of.close(); } } f.open(fname.c_str()); if(f.is_open()) { actions.clear(); cont = false; while(!f.eof()) { getstring(f, buf); if(!cont) name = getword(buf); if(name == "openurl" || name == "detectmusic") { if(!buf.empty()) if(cont = buf.substr(buf.size()-1, 1) == "\\") buf.erase(buf.size()-1, 1); actions[name] += buf; } } f.close(); } } void icqconf::loadcaptcha() { string fname = getconfigfname("captcha"), buf, entry; ifstream f; vector::const_iterator ic; if(access(fname.c_str(), F_OK)) { ofstream of(fname.c_str()); if(of.is_open()) { of << "# This file contains sample configuration for captcha engine." << endl; of << "# Every line should look like: " << endl; of << "# Possible params are: greeting, quest, success, failure, timeout (min)" << endl; of << "# Quest fomat is: quest //[::answer[...]]" << endl; of << endl; of << "greeting I'm using a test to determine if you are a computer or not. If you would please answer the question correctly, you will be added to my contact list automatically." << endl; of << endl; of << "quest How many legs does a dog have?//4::four" << endl; of << "quest What is the first word of this sentence?//what" << endl; of << "quest What is the sum of 1 and 1?//2::two" << endl; of << "quest What is not a fruit: lettuce, apple or banana?//lettuce" << endl; of << "quest How many fingers are there on one hand?//5::five" << endl; of << "quest How many wheels does a normal bicycle have?//2::two" << endl; of << "quest What colour does a banana have?//yellow::yelow" << endl; of << "quest What does a chicken lay?//eggs::egg" << endl; of << "quest What is the value of PI, accurate to 2 digits?//3.14::3,14" << endl; of << "quest Is a wheel round or not (yes or no)?//yes" << endl; of << endl; of << "success You answered the question correctly, you are now added to my contact list. Thank you for your patience." << endl; of << "failure You answered the question incorrectly, you can try again by answering the next question." << endl; of << "timeout 30" << endl; of.close(); } } f.open(fname.c_str()); if(f.is_open()) { while(!f.eof()) { getstring(f, buf); entry = getword(buf); if(entry == "greeting") captchagreet = buf; else if(entry == "success") captchasuccess = buf; else if(entry == "failure") captchafailure = buf; else if(entry == "timeout") captchatimeout = atol(buf.c_str()); else if(entry == "quest") thecaptcha.addquestion(buf); } if(thecaptcha.empty()) { usingcaptcha = false; face.log(_("+ ERROR: captcha disabled: no questions found!")); } f.close(); } } icqconf::regcolor icqconf::getregcolor() const { return rc; } void icqconf::setregcolor(icqconf::regcolor c) { rc = c; } icqconf::regsound icqconf::getregsound() const { return rs; } void icqconf::setregsound(icqconf::regsound s) { rs = s; } icqconf::colormode icqconf::getcolormode() const { return cm; } void icqconf::setcolormode(colormode c) { cm = c; } void icqconf::setauto(int away, int na, bool usex) { autoaway = away; autona = na; autoawayx = usex; if(away == na) autoaway = 0; } void icqconf::getauto(int &away, int &na, bool& usex) const { away = autoaway; na = autona; usex = autoawayx; if(away == na) away = 0; } bool icqconf::getscreenna() const { return screenna; } void icqconf::setscreenna(bool sna) { screenna = sna; } string icqconf::getscreensocketpath() const { return screensocketpath; } void icqconf::setscreensocketpath(string path) { screensocketpath = path; } void icqconf::setquote(bool use) { quote = use; } void icqconf::setaskquit(bool faskquit) { askquit = faskquit; } void icqconf::setsockshost(const string &nsockshost) { int pos; if(!nsockshost.empty()) { if((pos = nsockshost.find(":")) != -1) { sockshost = nsockshost.substr(0, pos); socksport = atol(nsockshost.substr(pos+1).c_str()); } else { sockshost = nsockshost; socksport = 1080; } } else { sockshost = ""; } } string icqconf::getsockshost() const { return sockshost; } unsigned int icqconf::getsocksport() const { return socksport; } void icqconf::getsocksuser(string &name, string &pass) const { name = socksuser; pass = sockspass; } void icqconf::setsocksuser(const string &name, const string &pass) { socksuser = name; sockspass = pass; } void icqconf::setsavepwd(bool ssave) { savepwd = ssave; } void icqconf::sethideoffline(bool fho) { hideoffline = fho; } void icqconf::settimestampstothesecond(bool ttts) { timestampstothesecond = ttts; if (timestampstothesecond) { timestampformat = SECONDS_TIMESTAMP_FORMAT; logtimestampformat = SECONDS_LOGTIMESTAMP_FORMAT; } else { timestampformat = DEFAULT_TIMESTAMP_FORMAT; logtimestampformat = DEFAULT_LOGTIMESTAMP_FORMAT; } } void icqconf::setemacs(bool fem) { emacs = fem; } void icqconf::setvi(bool b) { vi = b; } void icqconf::setantispam(bool fas) { antispam = fas; } void icqconf::setshowopenedchats(bool fsoc) { showopenedchats = fsoc; } void icqconf::setdropauthreq(bool fas) { dropauthreq = fas; } void icqconf::setusingcaptcha(bool fas) { usingcaptcha = fas; } void icqconf::setmailcheck(bool fmc) { mailcheck = fmc; } void icqconf::setaskaway(bool faskaway) { askaway = faskaway; } bool icqconf::getchatmode(protocolname pname) { switch(pname) { case infocard: case rss: return false; } return chatmode[pname]; } void icqconf::setchatmode(protocolname pname, bool fchatmode) { chatmode[pname] = fchatmode; } bool icqconf::getentersends(protocolname pname) { return entersends[pname]; } void icqconf::setentersends(protocolname pname, bool fentersends) { entersends[pname] = fentersends; } bool icqconf::getnonimonline(protocolname pname) { return nonimonline[pname]; } void icqconf::setnonimonline(protocolname pname, bool fnonimonline) { nonimonline[pname] = fnonimonline; } bool icqconf::getcpconvert(protocolname pname) const { return cpconvert[pname]; } void icqconf::setcpconvert(protocolname pname, bool fcpconvert) { cpconvert[pname] = fcpconvert; } string icqconf::execaction(const string &name, const string ¶m) { int inpipe[2], outpipe[2], pid, npos; struct sigaction sact, osact; string torun = actions[name], out; fd_set rfds; char ch; if(name == "openurl") { string url = param; int pos = 0, fnd = -1; char enc[4]; while( ((fnd = url.find("'", pos)) != -1) || ((fnd = url.find("\"", pos)) != -1) ) { snprintf(enc, 4, "%%%02X", url[fnd]); url.replace(fnd, 1, enc); pos = fnd+3; } while((npos = torun.find("$url$")) != -1) torun.replace(npos, 5, url); } if(!pipe(inpipe) && !pipe(outpipe)) { memset(&sact, 0, sizeof(sact)); sigaction(SIGCHLD, &sact, &osact); pid = fork(); if(!pid) { dup2(inpipe[1], STDOUT_FILENO); dup2(outpipe[0], STDIN_FILENO); close(inpipe[1]); close(inpipe[0]); close(outpipe[0]); close(outpipe[1]); execl("/bin/sh", "/bin/sh", "-c", torun.c_str(), (char *)NULL ); _exit(0); } else { close(outpipe[0]); close(inpipe[1]); while(1) { FD_ZERO(&rfds); FD_SET(inpipe[0], &rfds); if(select(inpipe[0]+1, &rfds, 0, 0, 0) < 0) break; else { if(FD_ISSET(inpipe[0], &rfds)) { if(read(inpipe[0], &ch, 1) != 1) break; else { out += ch; } } } } waitpid(pid, 0, 0); close(inpipe[0]); close(outpipe[1]); } sigaction(SIGCHLD, &osact, 0); } face.log(_("+ launched the %s action command"), name.c_str()); return out; } string icqconf::getprotocolname(protocolname pname) const { static const string ptextnames[protocolname_size] = { "icq", "yahoo", "msn", "aim", "irc", "jab", "rss", "lj", "gg", "infocard" }; return ptextnames[pname]; } protocolname icqconf::getprotocolbyletter(char letter) const { switch(letter) { case 'y': return yahoo; case 'a': return aim; case 'i': return irc; case 'm': return msn; case 'n': return infocard; case 'j': return jabber; case 'r': return rss; case 'l': return livejournal; case 'g': return gadu; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return icq; } return protocolname_size; } string icqconf::getprotocolprefix(protocolname pname) const { static const string pprefixes[protocolname_size] = { "", "y", "m", "a", "i", "j", "r", "l", "g", "n" }; return pprefixes[pname]; } imstatus icqconf::getstatus(protocolname pname) { if(startoffline) return offline; imstatus st = available; map::iterator ia; imaccount a = getourid(pname); if((ia = a.additional.find("status")) != a.additional.end()) { if(!ia->second.empty()) { for(st = offline; st != imstatus_size && imstatus2char[st] != ia->second[0]; st++); if(st == imstatus_size) st = available; } } return st; } void icqconf::savestatus(protocolname pname, imstatus st) { imaccount im = getourid(pname); im.additional["status"] = string(1, imstatus2char[st]); setourid(im); } void icqconf::setavatar(protocolname pname, const string &ava) { imaccount im = getourid(pname); im.additional["avatar"] = ava; setourid(im); } int icqconf::getprotcolor(protocolname pname) const { switch(pname) { case icq : return getcolor(cp_clist_icq); case yahoo : return getcolor(cp_clist_yahoo); case infocard : return getcolor(cp_clist_infocard); case msn : return getcolor(cp_clist_msn); case aim : return getcolor(cp_clist_aim); case irc : return getcolor(cp_clist_irc); case jabber : return getcolor(cp_clist_jabber); case rss : return getcolor(cp_clist_rss); case livejournal : return getcolor(cp_clist_lj); case gadu : return getcolor(cp_clist_gadu); default : return getcolor(cp_main_text); } } int icqconf::getstatuscolor(imstatus status) const { switch(status) { case offline : return getcolor(cp_clist_offline); case available : return getcolor(cp_clist_online); case invisible : return getcolor(cp_clist_invisible); case freeforchat : return getcolor(cp_clist_free_for_chat); case dontdisturb : return getcolor(cp_clist_dnd); case occupied : return getcolor(cp_clist_occupied); case notavail : return getcolor(cp_clist_na); case outforlunch : return getcolor(cp_clist_na); case away : return getcolor(cp_clist_away); default : return getcolor(cp_main_text); } } void icqconf::setbidi(bool fbidi) { bidi = fbidi; #ifdef USE_FRIBIDI use_fribidi = bidi; #endif } void icqconf::commandline(int argc, char **argv) { int i; string event, proto, dest, number; char st = 0; argv0 = argv[0]; for(i = 1; i < argc; i++) { string args = argv[i]; if((args == "-a") || (args == "--ascii")) { kintf_graph = 0; } else if((args == "-b") || (args == "--basedir")) { if(argv[++i]) { basedir = argv[i]; if(basedir.substr(basedir.size()-1) != "/") basedir += "/"; } } else if((args == "-B") || (args == "--bind")) { if(argv[++i]) { bindhost = argv[i]; cw_setbind(bindhost.c_str()); } } else if((args == "-T") || (args == "--no-xtitles")) { notitles = true; } else if((args == "-o") || (args == "--offline")) { startoffline = true; } else if((args == "-s") || (args == "--send")) { if(argv[++i]) event = argv[i]; } else if((args == "-p") || (args == "--proto")) { if(argv[++i]) proto = argv[i]; } else if((args == "-t") || (args == "--to")) { if(argv[++i]) dest = argv[i]; } else if((args == "-n") || (args == "--number")) { if(argv[++i]) number = argv[i]; } else if((args == "-S") || (args == "--status")) { if(argv[++i]) if(strlen(argv[i])) st = argv[i][0]; } else if((args == "-d") || (args == "--debug")) { debug = true; } else if((args == "-v") || (args == "--version")) { cout << PACKAGE << " " << centerim::version << endl << "Written by Konstantin Klyagin, 2005. Currently maintained by the CenterIM community." << endl << "Built-in protocols are:"; for(protocolname pname = icq; pname != protocolname_size; pname++) if(gethook(pname).enabled()) cout << " " << conf->getprotocolname(pname); cout << endl << endl << "This is free software; see the source for copying conditions. There is NO" << endl << "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." << endl; exit(0); } else { usage(); exit(0); } } if(!number.empty()) { if(event.empty()) event = "sms"; if(proto.empty()) proto = "icq"; dest = "0"; } constructevent(event, proto, dest, number); externalstatuschange(st, proto); } void icqconf::constructevent(const string &event, const string &proto, const string &dest, const string &number) const { imevent *ev = 0; imcontact cdest; string text, buf; int pos; if(event.empty() && dest.empty()) return; else if(event.empty() || proto.empty() || dest.empty()) { cout << _("event sending error: not enough parameters") << endl; exit(1); } while(getline(cin, buf)) { if(!text.empty()) text += "\n"; text += buf; } if(proto == "icq") { if(dest.find_first_not_of("0123456789") != -1) { cout << _("event sending error: only UINs are allowed with icq protocol") << endl; exit(1); } cdest = imcontact(strtoul(dest.c_str(), 0, 0), icq); } else { protocolname pname; for(pname = icq; pname != protocolname_size; pname++) { if(getprotocolname(pname) == proto) { cdest = imcontact(dest, pname); break; } } if(pname == protocolname_size) { cout << _("event sending error: unknown IM type") << endl; exit(1); } } if(event == "msg") { ev = new immessage(cdest, imevent::outgoing, text); } else if(event == "url") { string url; if((pos = text.find("\n")) != -1) { url = text.substr(0, pos); text.erase(0, pos+1); } else { url = text; text = ""; } ev = new imurl(cdest, imevent::outgoing, url, text); } else if(event == "sms") { ev = new imsms(cdest, imevent::outgoing, text, number); } else { cout << _("event sending error: unknown event type") << endl; exit(1); } if(ev) { icqcontact *c = new icqcontact(cdest); if(access(c->getdirname().c_str(), X_OK)) { mkdir(c->getdirname().c_str(), S_IRUSR | S_IWUSR | S_IXUSR); selfsignal(SIGUSR2); } if(!access(c->getdirname().c_str(), X_OK)) { clist.add(c); em.store(*ev); char buf[512]; snprintf(buf, sizeof(buf), _("%s to %s has been put to the queue"), streventname(ev->gettype()), number.empty() ? c->getdesc().totext().c_str() : number.c_str()); cout << buf << endl; } else { cout << _("event sending error: error creating directory for the contact") << endl; exit(1); } //delete c; delete ev; exit(0); } } void icqconf::selfsignal(int signum) const { int rpid; ifstream f(conf->getconfigfname("pid").c_str()); if(f.is_open()) { f >> rpid; f.close(); if(rpid > 0) { kill(rpid, signum); } } } void icqconf::externalstatuschange(char st, const string &proto) const { imstatus imst; protocolname pname; if(st) { for(pname = icq; pname != protocolname_size; pname++) if(getprotocolname(pname) == proto) break; for(imst = offline; imst != imstatus_size; imst++) if(imstatus2char[imst] == st) break; try { if(pname != protocolname_size) { if(imst != imstatus_size) { string sfname = conf->getconfigfname((string) "status-" + proto); ofstream sf(sfname.c_str()); if(sf.is_open()) sf << imstatus2char[imst], sf.close(); selfsignal(SIGUSR1); } else { throw _("unknown status character was given"); } } else { throw _("unknown IM type"); } } catch(char *p) { cout << _("status change error: ") << p << endl; exit(1); } exit(0); } } void icqconf::usage() const { cout << PACKAGE << " " << centerim::version << endl; cout << endl << _("Usage: ") << argv0 << _(" [OPTION]...") << endl; cout << endl << _("General options:") << endl; cout << _(" --ascii, -a use ASCII characters for windows and UI controls") << endl; cout << _(" --basedir, -b set a custom base directory") << endl; cout << _(" --bind, -B bind a custom local IP") << endl; cout << _(" --no-xtitles, -T disable xterm titles") << endl; cout << _(" --offline, -o set all protocols status to offline upon start") << endl; cout << _(" --debug, -d enables debug info logging") << endl; cout << _(" --help display this stuff") << endl; cout << _(" --version, -v show the program version info") << endl; cout << endl << _("Events sending options:") << endl; cout << _(" -s, --send event type; can be msg, sms or url") << endl; cout << _(" -S, --status change the current IM status. Status; o, _, a, d, n, c, f, i") << endl; cout << _(" -p, --proto protocol type; can be icq, yahoo, msn, aim, irc, jab, rss, lj, gg or infocard") << endl; cout << _(" -t, --to destination UIN or nick (depends on protocol)") << endl; cout << _(" -n, --number mobile number to send an event to (sms only)") << endl; cout << endl << _("Report bugs to http://bugzilla.centerim.org/.") << endl; } void icqconf::setproxy() { if(getproxyconnect()) { cw_setproxy(gethttpproxyhost().c_str(), gethttpproxyport(), gethttpproxyuser().c_str(), gethttpproxypasswd().c_str()); } else { cw_setproxy(0, 0, 0, 0); } } void icqconf::setmakelog(bool slog) { makelog = slog; } void icqconf::setproxyconnect(bool sproxy) { proxyconnect = sproxy; setproxy(); } void icqconf::setproxyssl(bool sproxyssl) { proxyssl = sproxyssl; } void icqconf::setgroupmode(icqconf::groupmode amode) { fgroupmode = amode; } void icqconf::setsortmode(icqconf::sortmode smode) { fsortmode = smode; icqcontacts::setsortmode(smode); } void icqconf::initmultiproto(bool p[], string buf, bool excludenochat) { string w; protocolname pname; for(pname = icq; pname != protocolname_size; pname++) p[pname] = buf.empty(); while(!(w = getword(buf)).empty()) { for(pname = icq; pname != protocolname_size; pname++) { if(getprotocolname(pname) == w) { if(excludenochat) { p[pname] = !gethook(pname).getCapabs().count(hookcapab::nochat); } else { p[pname] = true; } break; } } } } void icqconf::setbrowser(const string &abrowser) { if (!abrowser.empty()) browser = abrowser; else browser = "mozilla"; } void icqconf::setsmtphost(const string &asmtphost) { int pos; smtphost = ""; smtpport = 0; if(!asmtphost.empty()) { if((pos = asmtphost.find(":")) != -1) { smtphost = asmtphost.substr(0, pos); smtpport = atol(asmtphost.substr(pos+1).c_str()); } else { smtphost = asmtphost; smtpport = 25; } } if(smtphost.empty() || !smtpport) { smtphost = getsmtphost(); smtpport = getsmtpport(); } } void icqconf::sethttpproxyhost(const string &ahttpproxyhost) { int pos, posn; httpproxyhost = ""; httpproxyport = 0; httpproxyuser = ""; httpproxypasswd = ""; if(!ahttpproxyhost.empty()) { if((pos = ahttpproxyhost.find(":")) != -1) { if ((posn = ahttpproxyhost.find("@")) != -1) { httpproxyuser = ahttpproxyhost.substr(0, pos); httpproxypasswd = ahttpproxyhost.substr(pos+1, posn-pos-1); if((pos = ahttpproxyhost.find(":", posn)) != -1) { httpproxyhost = ahttpproxyhost.substr(posn+1, pos-posn-1); httpproxyport = atol(ahttpproxyhost.substr(pos+1).c_str()); } } else { httpproxyhost = ahttpproxyhost.substr(0, pos); httpproxyport = atol(ahttpproxyhost.substr(pos+1).c_str()); } } else { httpproxyhost = ahttpproxyhost; httpproxyport = 8080; } } setproxy(); } string icqconf::getbrowser() const { return browser.empty() ? "mozilla" : browser; } string icqconf::getsmtphost() const { return smtphost.empty() ? "localhost" : smtphost; } unsigned int icqconf::getsmtpport() const { return smtpport ? smtpport : 25; } string icqconf::gethttpproxyhost() const { return httpproxyhost; } unsigned int icqconf::gethttpproxyport() const { return httpproxyport ? httpproxyport : 8080; } string icqconf::gethttpproxyuser() const { return httpproxyuser; } string icqconf::gethttpproxypasswd() const { return httpproxypasswd; } void icqconf::checkdiskspace() { fenoughdiskspace = true; #if !(defined(__sun__) || defined(__NetBSD__) || defined(__sgi__)) struct statfs st; if(!statfs(conf->getdirname().c_str(), &st)) { #else struct statvfs st; if(!statvfs(conf->getdirname().c_str(), &st)) { #endif fenoughdiskspace = ((double) st.f_bavail) * st.f_bsize >= 10240; } } void icqconf::setcharsets(const string &from, const string &to) { fromcharset = from; tocharset = to; } const char *icqconf::getconvertfrom(protocolname pname) const { if(pname != protocolname_size && !getcpconvert(pname)) return "iso-8859-1"; return fromcharset.c_str(); } const char *icqconf::getconvertto(protocolname pname) const { if(pname != protocolname_size && !getcpconvert(pname)) return "iso-8859-1"; return tocharset.c_str(); } // ---------------------------------------------------------------------------- icqconf::imaccount::imaccount() { uin = port = 0; pname = infocard; } icqconf::imaccount::imaccount(protocolname apname) { uin = port = 0; pname = apname; } bool icqconf::imaccount::empty() const { return !uin && nickname.empty(); } void icqconf::imaccount::write(ofstream &f) { string prefix = conf->getprotocolname(pname) + "_"; map::iterator ia; f << endl; if(!nickname.empty()) f << prefix << "nick\t" << nickname << endl; if(uin) f << prefix << "uin\t" << uin << endl; if(conf->getsavepwd()) f << prefix << "pass\t" << password << endl; if(!server.empty()) { f << prefix << "server\t" << server; if(port) f << ":" << port; f << endl; } for(ia = additional.begin(); ia != additional.end(); ++ia) if(!ia->first.empty() && !ia->second.empty()) f << prefix << ia->first << "\t" << ia->second << endl; } void icqconf::imaccount::read(const string &spec) { int pos = spec.find("_"); string spname, buf; if(pos != -1) { buf = spec; spname = getword(buf.erase(0, pos+1)); if(spname == "nick") nickname = buf; else if(spname == "uin") uin = strtoul(buf.c_str(), 0, 0); else if(spname == "pass") password = buf; else if(spname == "server") { if((pos = buf.find(":")) != -1) { server = buf.substr(0, pos); port = strtoul(buf.substr(pos+1).c_str(), 0, 0); } else { server = buf; } if(pname == icq) if(server == "icq.mirabilis.com") server = ""; if(pname == yahoo) if(server == "scs.yahoo.com") server = ""; } else { additional[spname] = buf; } } } bool icqconf::imaccount::operator == (protocolname apname) const { return pname == apname; } bool icqconf::imaccount::operator != (protocolname apname) const { return pname != apname; } centerim-4.22.10/src/imevents.h0000644000175000001440000001403211461606612013200 00000000000000#ifndef __IMEVENTS_H__ #define __IMEVENTS_H__ #include "imcontact.h" #undef gettext class imevent { friend class immessage; friend class imurl; friend class imsms; friend class imauthorization; friend class imemailexpress; friend class imemail; friend class imnotification; friend class imcontacts; friend class imfile; friend class imrawevent; friend class imxmlevent; public: enum imeventtype { message, url, sms, authorization, online, offline, email, notification, contacts, file, xml, imeventtype_size }; enum imdirection { incoming, outgoing, imdirection_size }; protected: imcontact contact; imeventtype type; imdirection direction; time_t senttimestamp; time_t timestamp; bool acknowledged; string readblock(ifstream &f); public: imevent(); imevent(const imcontact &acont, imdirection adir, imeventtype atype, time_t asenttimestamp = 0); imevent(ifstream &f); virtual ~imevent(); imeventtype gettype() const; imdirection getdirection() const; imcontact getcontact() const; time_t getsenttimestamp() const; time_t gettimestamp() const; void settimestamp(time_t atimestamp); void setcontact(const imcontact &acontact); imevent *getevent() const; virtual string gettext() const; virtual bool getack() const { return acknowledged;}; virtual void setack(bool acknowledged) { this->acknowledged = acknowledged;} virtual bool empty() const; virtual bool contains(const string &atext) const; virtual void write(ofstream &f) const; virtual void read(ifstream &f); }; ENUM_PLUSPLUS(imevent::imeventtype) ENUM_PLUSPLUS(imevent::imdirection) class immessage: public imevent { protected: string text; public: immessage(const imevent &ev); immessage(const imcontact &acont, imdirection adirection, const string &atext, const time_t asenttime = 0); string gettext() const; bool empty() const; bool contains(const string &atext) const; void write(ofstream &f) const; void read(ifstream &f); }; class imurl: public imevent { protected: string url, description; public: imurl(const imevent &ev); imurl(const imcontact &acont, imdirection adirection, const string &aurl, const string &adescription); string geturl() const; string getdescription() const; string gettext() const; bool empty() const; bool contains(const string &atext) const; void write(ofstream &f) const; void read(ifstream &f); }; class imsms: public imevent { protected: string text, phone; public: imsms(const imevent &ev); imsms(const imcontact &acont, imdirection adirection, const string &atext, const string &aphone = ""); string gettext() const; string getmessage() const { return text; } string getphone() const { return phone; } bool empty() const; bool contains(const string &atext) const; void write(ofstream &f) const; void read(ifstream &f); }; class imauthorization: public imevent { public: enum AuthType { Rejected = 0, Granted = 1, Request = 2, AuthType_size }; protected: string text; AuthType authtype; public: imauthorization(const imevent &ev); imauthorization(const imcontact &acont, imdirection adirection, AuthType aatype, const string &atext = ""); string gettext() const; string getmessage() const; AuthType getauthtype() const; bool empty() const; bool contains(const string &atext) const; void write(ofstream &f) const; void read(ifstream &f); }; class imemail: public imevent { protected: string text; public: imemail(const imevent &ev); imemail(const imcontact &acont, imdirection adirection, const string &atext); string gettext() const; bool empty() const; bool contains(const string &atext) const; void write(ofstream &f) const; void read(ifstream &f); }; class imnotification: public imevent { protected: string text; public: imnotification(const imevent &ev); imnotification(const imcontact &acont, const string &atext); string gettext() const; bool empty() const; bool contains(const string &atext) const; void write(ofstream &f) const; void read(ifstream &f); }; class imcontacts: public imevent { protected: vector< pair > contacts; public: imcontacts(const imevent &ev); imcontacts(const imcontact &acont, imdirection adirection, const vector< pair > &lst); string gettext() const; const vector< pair > &getcontacts() const; bool empty() const; bool contains(const string &atext) const; void write(ofstream &f) const; void read(ifstream &f); }; class imfile: public imevent { public: struct record { string fname; long size; }; protected: vector files; string msg; public: imfile() { }; imfile(const imevent &ev); imfile(const imcontact &acont, imdirection adirection, const string &amsg = "", const vector &afiles = vector()); string gettext() const; string getmessage() const; const vector &getfiles() const; void setfiles(const vector &lst); bool empty() const; bool contains(const string &atext) const; void write(ofstream &f) const; void read(ifstream &f); bool operator == (const imfile &fr) const { return this->gettext() == fr.gettext(); } bool operator != (const imfile &fr) const { return !(*this == fr); } bool operator < (const imfile &fr) const { return this->gettext() < fr.gettext(); } }; class imrawevent: public imevent { public: imrawevent(const imevent &ev); imrawevent(imeventtype atype, const imcontact &acont, imdirection adirection); }; class imxmlevent: public imevent { protected: map data; public: imxmlevent(const imevent &ev); imxmlevent(const imcontact &acont, imdirection adirection, const string &atext); string gettext() const; bool field_empty(const string &name) const; string getfield(const string &name) const; void setfield(const string &name, const string &val); bool empty() const; bool contains(const string &atext) const; void write(ofstream &f) const; void read(ifstream &f); }; #endif centerim-4.22.10/src/imexternal.h0000644000175000001440000000273511461606612013525 00000000000000#ifndef __IMEXTERNAL_H__ #define __IMEXTERNAL_H__ #include "imevents.h" class imexternal { public: enum aoption { aostdin = 2, aostdout = 4, aoprereceive = 8, aopresend = 16, aomanual = 32, aonowait = 64 }; struct actioninfo { string name; bool enabled; }; private: class action { private: set event; set proto; set status; int options; bool enabled; string name, code, sname, output; imevent *currentev; void writescript(); int execscript(); void respond(); void substitute(); static string geteventname(imevent::imeventtype et); public: action(); ~action(); bool exec(imevent *ev, int &result, int option); bool exec(const imcontact &ic, string &outbuf); bool load(ifstream &f); bool matches(int aoptions, protocolname apname) const; string getname() const { return name; } }; vector actions; public: imexternal(); ~imexternal(); void load(); int exec(const imevent &ev); int exec(imevent *ev, bool &result, int option = 0); // returns the amount of external actions ran // option can be aopresend or aoprereceive if needed // and "result" is filled in with a bool that indicates // if the event is accepted or not bool execmanual(const imcontact &ic, int id, string &outbuf); vector > getlist(int options, protocolname pname) const; }; extern imexternal external; #endif centerim-4.22.10/src/hooks/0000755000175000001440000000000011473011460012372 500000000000000centerim-4.22.10/src/hooks/yahoohook.h0000644000175000001440000001621411473007750014476 00000000000000#ifndef __YAHOOHOOK_H__ #define __YAHOOHOOK_H__ #include "abstracthook.h" #ifdef BUILD_YAHOO #include "icqconf.h" #define USE_STRUCT_CALLBACKS #include "yahoo2_callbacks.h" class yahoohook: public abstracthook { protected: enum Action { tbdConfLogon }; struct connect_callback_data { yahoo_connect_callback callback; void *callback_data; int id, tag; }; struct y_c { int fd; bool ssl; int state; y_c(int afd, bool assl, int astate) : fd(afd), ssl(assl), state(astate) { } }; struct yfd { struct y_c con; int tag; void *data; bool isconnect; yahoo_input_condition cond; static int connection_tags; yfd(int afd, void *adata, bool assl, yahoo_input_condition acond, bool aisconnect = false) : con(afd, assl, 0), tag(connection_tags++), data(adata), isconnect(aisconnect), cond(acond) {} bool operator == (int atag) const { return tag == atag; } bool operator != (int atag) const { return tag != atag; } }; vector fds; vector > tobedone; vector sfiles; map srfiles; map fvalid; map awaymessages; bool fonline, flogged, searchonlineonly; map > confmembers; imstatus ourstatus; int cid; time_t timer_refresh, timer_close; static void login_response(int id, int succ, const char *url); static void got_buddies(int id, YList *buds); static void got_identities(int id, YList *ids); static void status_changed(int id, const char *who, int stat, const char *msg, int away, int idle, int mobile); static void got_im(int id, const char *me, const char *who, const char *msg, long tm, int stat, int utf8); static void got_conf_invite(int id, const char *me, const char *who, const char *room, const char *msg, YList *members); static void conf_userdecline(int id, const char *me, const char *who, const char *room, const char *msg); static void conf_userjoin(int id, const char *me, const char *who, const char *room); static void conf_userleave(int id, const char *me, const char *who, const char *room); static void conf_message(int id, const char *me, const char *who, const char *room, const char *msg, int utf8); static void got_file(int id, const char *me, const char *who, const char *msg, const char *fname, unsigned long fesize, char *trid); static void contact_added(int id, const char *myid, const char *who, const char *msg); static void typing_notify(int id, const char *me, const char *who, int stat); static void game_notify(int id, const char *me, const char *who, int stat, const char *msg); static void mail_notify(int id, const char *from, const char *subj, int cnt); static void system_message(int id, const char *me, const char *who, const char *msg); static void got_ping(int id, const char *msg); static void error(int id, const char *err, int fatal, int num); static void got_ignore(int id, YList * igns); static void got_cookies(int id); static void got_search_result(int id, int found, int start, int total, YList *contacts); static void chat_cat_xml(int id, const char *xml); static void chat_join(int id, const char *me, const char *room, const char *topic, YList *members, void *fd); static void chat_userjoin(int id, const char *me, const char *room, struct yahoo_chat_member *who); static void chat_userleave(int id, const char *me, const char *room, const char *who); static void chat_message(int id, const char *me, const char *who, const char *room, const char *msg, int msgtype, int utf8); static void rejected(int id, const char *who, const char *msg); static void got_webcam_image(int id, const char * who, const unsigned char *image, unsigned int image_size, unsigned int real_size, unsigned int timestamp); static void webcam_invite(int id, const char *me, const char *from); static void webcam_invite_reply(int id, const char *me, const char *from, int accept); static void webcam_closed(int id, const char *who, int reason); static void webcam_viewer(int id, const char *who, int connect); static void webcam_data_request(int id, int send); static void got_buddyicon_request(int id, const char *me, const char *who); static void got_buddyicon(int id, const char *me, const char *who, const char *url, int checksum); static void auth_request(int id, const char *who, const char *msg); static void auth_response(int id, const char *who, char granted, const char *msg); static void buddyicon_uploaded(int id, const char *url); static void chat_yahooerror(int id, const char *me); static void chat_yahoologout(int id, const char *me); static int yahoo_connect(const char *host, int port); static void file_transfer_done(int id, int result, void *data); static char *get_ip_addr(const char *domain); static void got_buddy_change_group(int id, const char *me, const char *who, const char *old_group, const char *new_group); static void got_buddyicon_checksum(int id, char const *me, const char *who, int checksum); static void got_buzz(int id, const char *me, const char *who, long tm); static void got_ft_data(int id, const unsigned char *in, int len, void *data); static int ylog(const char *fmt, ...); static int add_handler(int id, void *fd, yahoo_input_condition cond, void *data); static void remove_handler(int id, int tag); static int connect_async(int id, const char *host, int port, yahoo_connect_callback callback, void *data, int use_ssl); static int y_write(void *fd, char *buf, int len); static int y_read(void *fd, char *buf, int len); static void y_close(void *fd); static void get_fd(int id, void *fd, int error, void *data); static void get_url(int id, int fd, int error, const char *filename, unsigned long size, void *data); static struct tm *timestamp(); static imstatus yahoo2imstatus(int status); string decode(string text, bool utf); YList *getmembers(const string &room); void userstatus(const string &nick, int st, const string &message, bool away); void disconnected(); void checkinlist(imcontact ic); void sendnewuser(const imcontact &ic, bool report); void removeuser(const imcontact &ic, bool report); void connect_complete(void *data, struct y_c *con); public: yahoohook(); ~yahoohook(); void init(); void connect(); void main(); void exectimers(); void disconnect(); void getsockets(fd_set &rs, fd_set &ws, fd_set &es, int &hsocket) const; bool isoursocket(fd_set &rs, fd_set &ws, fd_set &es) const; bool online() const; bool logged() const; bool isconnecting() const; bool enabled() const; void sendnewuser(const imcontact &ic); void removeuser(const imcontact &ic); void requestinfo(const imcontact &ic); bool send(const imevent &ev); void setautostatus(imstatus st); imstatus getstatus() const; void lookup(const imsearchparams ¶ms, verticalmenu &dest); bool knowntransfer(const imfile &fr) const; void replytransfer(const imfile &fr, bool accept, const string &localpath = string()); void aborttransfer(const imfile &fr); void requestawaymsg(const imcontact &ic); void conferencecreate(const imcontact &confid, const vector &lst); void updatecontact(icqcontact *c); void renamegroup(const string &oldname, const string &newname); }; extern yahoohook yhook; #endif #endif centerim-4.22.10/src/hooks/msnhook.h0000644000175000001440000002175111461606612014155 00000000000000#ifndef __MSNHOOK_H__ #define __MSNHOOK_H__ #include "abstracthook.h" #ifdef BUILD_MSN #include "msn/msn.h" struct msnbuddy { msnbuddy(const string &anick, const string &afriendly = "", int agid = -1) : nick(anick), friendly(afriendly), gid(agid) { } string nick, friendly; int gid; bool operator == (const string &anick) const { return nick == anick; } bool operator != (const string &anick) const { return nick != anick; } }; class msncallbacks : public MSN::Callbacks { public: void registerSocket(int s, int read, int write); void unregisterSocket(int s); void showError(MSN::Connection * conn, std::string msg); void buddyChangedStatus(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname, MSN::BuddyStatus state); void buddyOffline(MSN::Connection * conn, MSN::Passport buddy); void log(int writing, const char* buf); void gotFriendlyName(MSN::Connection * conn, std::string friendlyname); void gotBuddyListInfo(MSN::NotificationServerConnection * conn, MSN::ListSyncInfo * data); void gotLatestListSerial(MSN::Connection * conn, int serial); void gotGTC(MSN::Connection * conn, char c); void gotBLP(MSN::Connection * conn, char c); void gotNewReverseListEntry(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname); void addedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID); void removedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID); void addedGroup(MSN::Connection * conn, std::string groupName, int groupID); void removedGroup(MSN::Connection * conn, int groupID); void renamedGroup(MSN::Connection * conn, int groupID, std::string newGroupName); void gotSwitchboard(MSN::SwitchboardServerConnection * conn, const void * tag); void buddyJoinedConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, int is_initial); void buddyLeftConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy); void gotInstantMessage(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, MSN::Message * msg); void failedSendingMessage(MSN::Connection * conn); void buddyTyping(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname); void gotInitialEmailNotification(MSN::Connection * conn, int unread_inbox, int unread_folders); void gotNewEmailNotification(MSN::Connection * conn, std::string from, std::string subject); void gotFileTransferInvitation(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname, MSN::FileTransferInvitation * inv); void fileTransferProgress(MSN::FileTransferInvitation * inv, std::string status, unsigned long recv, unsigned long total); void fileTransferFailed(MSN::FileTransferInvitation * inv, int error, std::string message); void fileTransferSucceeded(MSN::FileTransferInvitation * inv); void gotNewConnection(MSN::Connection * conn); void closingConnection(MSN::Connection * conn); void changedStatus(MSN::Connection * conn, MSN::BuddyStatus state); int connectToServer(std::string server, int port, bool *connected); int listenOnPort(int port); std::string getOurIP(); std::string getSecureHTTPProxy(); }; class msnhook : public abstracthook { friend void msncallbacks::registerSocket(int s, int reading, int writing); friend void msncallbacks::unregisterSocket(int s); friend void msncallbacks::showError(MSN::Connection * conn, string msg); friend void msncallbacks::buddyChangedStatus(MSN::Connection * conn, MSN::Passport buddy, string friendlyname, MSN::BuddyStatus state); friend void msncallbacks::buddyOffline(MSN::Connection * conn, MSN::Passport buddy); friend void msncallbacks::log(int writing, const char* buf); friend void msncallbacks::gotFriendlyName(MSN::Connection * conn, string friendlyname); friend void msncallbacks::gotBuddyListInfo(MSN::NotificationServerConnection * conn, MSN::ListSyncInfo * data); friend void msncallbacks::gotLatestListSerial(MSN::Connection * conn, int serial); friend void msncallbacks::gotGTC(MSN::Connection * conn, char c); friend void msncallbacks::gotBLP(MSN::Connection * conn, char c); friend void msncallbacks::gotNewReverseListEntry(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname); friend void msncallbacks::addedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID); friend void msncallbacks::removedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID); friend void msncallbacks::addedGroup(MSN::Connection * conn, string groupName, int groupID); friend void msncallbacks::removedGroup(MSN::Connection * conn, int groupID); friend void msncallbacks::renamedGroup(MSN::Connection * conn, int groupID, string newGroupName); friend void msncallbacks::gotSwitchboard(MSN::SwitchboardServerConnection * conn, const void * tag); friend void msncallbacks::buddyJoinedConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, int is_initial); friend void msncallbacks::buddyLeftConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy); friend void msncallbacks::gotInstantMessage(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, MSN::Message * msg); friend void msncallbacks::failedSendingMessage(MSN::Connection * conn); friend void msncallbacks::buddyTyping(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname); friend void msncallbacks::gotInitialEmailNotification(MSN::Connection * conn, int unread_inbox, int unread_folders); friend void msncallbacks::gotNewEmailNotification(MSN::Connection * conn, string from, string subject); friend void msncallbacks::gotFileTransferInvitation(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname, MSN::FileTransferInvitation * inv); friend void msncallbacks::fileTransferProgress(MSN::FileTransferInvitation * inv, string status, unsigned long recv, unsigned long total); friend void msncallbacks::fileTransferFailed(MSN::FileTransferInvitation * inv, int error, string message); friend void msncallbacks::fileTransferSucceeded(MSN::FileTransferInvitation * inv); friend void msncallbacks::gotNewConnection(MSN::Connection * conn); friend void msncallbacks::closingConnection(MSN::Connection * conn); friend void msncallbacks::changedStatus(MSN::Connection * conn, MSN::BuddyStatus state); friend int msncallbacks::connectToServer(string server, int port, bool *connected); friend int msncallbacks::listenOnPort(int port); friend string msncallbacks::getOurIP(); friend string msncallbacks::getSecureHTTPProxy(); protected: imstatus ourstatus; bool fonline, flogged, readinfo, destroying; MSN::NotificationServerConnection conn; msncallbacks cb; time_t timer_ping; struct qevent { enum qetype { qeMsg, qeFile }; qetype type; string nick, text; qevent(qetype atype, const string &anick, const string &atext): type(atype), nick(anick), text(atext) { } }; map > slst; map lconn; vector rfds, wfds; map mgroups; map friendlynicks; map > transferinfo; void checkfriendly(icqcontact *c, const string friendlynick, bool forcefetch = false); void checkinlist(imcontact ic); int findgroup(const imcontact &ic, string &gname) const; void removeuser(const imcontact &ic, bool report); bool getfevent(MSN::FileTransferInvitation *fhandle, imfile &fr); void statusupdate(string buddy, string friendlyname, imstatus status); void sendmsn(MSN::SwitchboardServerConnection *conn, const qevent *ctx); public: msnhook(); virtual ~msnhook(); void init(); void connect(); void disconnect(); void exectimers(); void main(); void getsockets(fd_set &rf, fd_set &wf, fd_set &ef, int &hsocket) const; bool isoursocket(fd_set &rf, fd_set &wf, fd_set &ef) const; bool online() const; bool logged() const; bool isconnecting() const; bool enabled() const; bool send(const imevent &ev); void sendnewuser(const imcontact &c); void removeuser(const imcontact &ic); void requestinfo(const imcontact &ic); void sendupdateuserinfo(const icqcontact &c); void setautostatus(imstatus st); imstatus getstatus() const; void lookup(const imsearchparams ¶ms, verticalmenu &dest); vector getneedsync(); bool knowntransfer(const imfile &fr) const; void replytransfer(const imfile &fr, bool accept, const string &localpath = string()); void aborttransfer(const imfile &fr); void updatecontact(icqcontact *c); void renamegroup(const string &oldname, const string &newname); }; extern msnhook mhook; #endif #endif centerim-4.22.10/src/hooks/HTTPClient.h0000644000175000001440000000702011461606612014406 00000000000000#ifndef HTTPCLIENT_H #define HTTPCLIENT_H #include "icqcommon.h" #ifdef BUILD_RSS #include "src/SocketClient.h" #include "src/buffer.h" #include "libicq2000/exceptions.h" using namespace ICQ2000; class HTTPRequestEvent : public MessageEvent { friend class HTTPClient; public: enum RequestMethod { GET, POST }; enum AuthMethod { Basic, User, Digest }; private: string m_content, m_url, m_httpresp, m_user, m_pass; vector > params; map authparams; int authTries, connectTries; RequestMethod method; AuthMethod authmethod; public: HTTPRequestEvent(const string &url, RequestMethod rt = GET) : MessageEvent(ContactRef()), m_url(url), authTries(0), connectTries(0), method(rt) { } string getContent() const { return m_content; } string getURL() const { return m_url; } string getHTTPResp() const { return m_httpresp; } MessageType getType() const { return Normal; } RequestMethod getMethod() const { return method; } void setContent(const string &content) { m_content = content; } void setHTTPResp(const string &resp) { m_httpresp = resp; } void setAuth(AuthMethod am, const string &user, const string &pass) { authmethod = am; m_user = user; m_pass = pass; } void addParam(const string pname, const string pval) { params.push_back(make_pair(mime(pname), mime(pval))); } vector >::const_iterator pbegin() const { return params.begin(); } vector >::const_iterator pend() const { return params.end(); } bool operator == (HTTPRequestEvent &ev) const { return m_url == ev.m_url && params == ev.params && method == ev.method; } bool operator != (HTTPRequestEvent &ev) const { return !(*this == ev); } }; class HTTPClient : public SocketClient { private: enum State { NOT_CONNECTED, WAITING_FOR_CONNECT, WAITING_FOR_HEADER, RECEIVING_HEADER, RECEIVING_CONTENT, DISCONNECTING }; list m_queue; State m_state; Buffer m_recv; string m_hostname, m_proxy_hostname; string m_proxy_user, m_proxy_passwd; string m_resource, m_content, m_redirect; unsigned short m_port, m_proxy_port; unsigned long m_length; time_t m_last_operation, m_timeout; int m_code; void Init(); void Parse(); void Send(Buffer &b); void SendRequest(); void Disconnect(); void check_timeout(); string strMethod(HTTPRequestEvent::RequestMethod m); public: HTTPClient(); ~HTTPClient(); void Connect(); void FinishNonBlockingConnect(); void Recv(); void setTimeout(time_t t); time_t getTimeout() const; void clearoutMessagesPoll(); void SendEvent(MessageEvent* ev); void socket_cb(int fd, SocketEvent::Mode m); void setProxyServerHost(const string& host) { m_proxy_hostname = host; } string getProxyServerHost() const { return m_proxy_hostname; } void setProxyServerPort(const unsigned short& port) { m_proxy_port = port; } unsigned short getProxyServerPort() const { return m_proxy_port; } void setProxyServerUser(const string& user) { m_proxy_user = user; } string getProxyServerUser() const { return m_proxy_user; } void setProxyServerPasswd(const string& passwd) { m_proxy_passwd = passwd; } string getProxyServerPasswd() const { return m_proxy_passwd; } }; class HTTPException : public exception { private: string m_errortext; public: HTTPException() {} HTTPException(const string& text): m_errortext(text) {}; ~HTTPException() throw() {} const char* what() const throw() { return m_errortext.c_str(); } }; #endif #endif centerim-4.22.10/src/hooks/abstracthook.h0000644000175000001440000001045711461606612015164 00000000000000#ifndef __ABSTRACTHOOK_H__ #define __ABSTRACTHOOK_H__ #include "imcontact.h" #include "imevents.h" #include "imcontroller.h" struct hookcapab { enum enumeration { urls, files, contacts, authrequests, authreqwithmessages, fetchaway, setaway, setextstatus, changenick, changepassword, changedetails, changeabout, optionalpassword, visibility, version, ping, conferencing, conferencesaretemporary, cltemporary, directadd, flexiblesearch, flexiblereg, ssl, channelpasswords, groupchatservices, nochat, acknowledgements, pgp }; }; struct servicetype { enum enumeration { search, registration, groupchat }; }; class abstracthook { protected: enum Encoding { encUTF, encKOI, encUnknown }; enum logevent { logConnecting, logLogged, logSearchFinished, logPasswordChanged, logDisconnected, logContactAdd, logContactRemove, logConfMembers }; protocolname proto; imstatus manualstatus; verticalmenu *searchdest; set fcapabs; vector foundguys; string rusconv(const string &tdir, const string &text); string rushtmlconv(const string &tdir, const string &text, bool rus = true); string ruscrlfconv(const string &tdir, const string &text); void requestfromfound(const imcontact &ic); void log(logevent ev, ...); struct Country_struct { char *name; unsigned short code; }; public: static const unsigned char Language_table_size; static const char* const Language_table[]; static const unsigned short Country_table_size; static const Country_struct Country_table[]; static string getCountryIDtoString(unsigned short id); static unsigned short getCountryByName(string name); static signed char getSystemTimezone(); static string getInterestsIDtoString(unsigned char id); static string getBackgroundIDtoString(unsigned short id); static string getTimezoneIDtoString(signed char id); static string getTimezonetoLocaltime(signed char id); static string getLanguageIDtoString(unsigned char id); static string getmd5(const string &text); public: abstracthook(protocolname aproto); virtual ~abstracthook(); virtual void init(); virtual void connect(); virtual void disconnect(); virtual void exectimers(); virtual void main(); virtual void getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const; virtual bool isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const; virtual bool online() const; virtual bool logged() const; virtual bool isconnecting() const; virtual bool enabled() const; virtual bool send(const imevent &ev); virtual void sendnewuser(const imcontact &c); virtual void removeuser(const imcontact &ic); virtual void setautostatus(imstatus st); virtual void restorestatus(); virtual void setstatus(imstatus st); virtual imstatus getstatus() const; virtual imstatus getmanualstatus() const { return manualstatus; } virtual bool isdirectopen(const imcontact &c) const; virtual void requestinfo(const imcontact &c); virtual void lookup(const imsearchparams ¶ms, verticalmenu &dest); virtual void stoplookup(); virtual void requestawaymsg(const imcontact &c); virtual void requestversion(const imcontact &c); virtual void ping(const imcontact &c); set getCapabs() const { return fcapabs; } virtual void ouridchanged(const icqconf::imaccount &ia); virtual bool knowntransfer(const imfile &fr) const; virtual void replytransfer(const imfile &fr, bool accept, const string &localpath = string()); virtual void aborttransfer(const imfile &fr); virtual void conferencecreate(const imcontact &confid, const vector &lst); virtual vector getservices(servicetype::enumeration st) const; virtual vector > getsearchparameters(const string &agentname) const; virtual vector > getregparameters(const string &agentname) const; virtual void updatecontact(icqcontact *c); virtual void renamegroup(const string &oldname, const string &newname); virtual bool regconnect(const string &aserv); virtual bool regattempt(unsigned int &auin, const string &apassword, const string &email); }; abstracthook &gethook(protocolname pname); struct tm *maketm(int hour, int minute, int day, int month, int year); extern time_t timer_current; #endif centerim-4.22.10/src/hooks/jabberhook.cc0000644000175000001440000023570111473007750014746 00000000000000/* * * centerim Jabber protocol handling class * $Id: jabberhook.cc,v 1.85 2005/08/26 11:01:49 konst Exp $ * * Copyright (C) 2002-2005 by Konstantin Klyagin * * 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 "icqcommon.h" #ifdef BUILD_JABBER #include "jabberhook.h" #include "icqface.h" #include "imlogger.h" #include "eventmanager.h" #include "icqgroups.h" #include "impgp.h" #include "icqcontacts.h" #include "centerim.h" #ifdef HAVE_SSTREAM #include #else #include #endif #ifdef HAVE_LIBOTR #include "imotr.h" #endif #define DEFAULT_CONFSERV "conference.jabber.org" #define PERIOD_KEEPALIVE 30 #define NOTIFBUF 512 //base64 enc/dec functions to work with binary data in xmpp static char b64table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static char *base64_encode( char *buffer, int bufferLen ) { if ( buffer==NULL || bufferLen<=0 ) return NULL; char* res = (char*)malloc(((( bufferLen+2 )*4 )/3 ) + 1); if ( res == NULL ) return NULL; unsigned char igroup[3]; int nGroups = 0; char *r = res; char *peob = buffer + bufferLen; char *p; for ( p = buffer; p < peob; ) { igroup[ 0 ] = igroup[ 1 ] = igroup[ 2 ] = 0; int n; for ( n=0; n<3; n++ ) { if ( p >= peob ) break; igroup[n] = ( unsigned char ) *p; p++; } if ( n > 0 ) { r[0] = b64table[ igroup[0]>>2 ]; r[1] = b64table[ (( igroup[0]&3 )<<4 ) | ( igroup[1]>>4 ) ]; r[2] = b64table[ (( igroup[1]&0xf )<<2 ) | ( igroup[2]>>6 ) ]; r[3] = b64table[ igroup[2]&0x3f ]; if ( n < 3 ) { r[3] = '='; if ( n < 2 ) r[2] = '='; } r += 4; } } *r = '\0'; return res; } static char *base64_decode(const char *str, int *ret_len) { if( !str ) return NULL; char *out = NULL; char tmp = 0; const char *c; int tmp2 = 0; int len = 0, n = 0; c = str; while (*c) { if (*c >= 'A' && *c <= 'Z') { tmp = *c - 'A'; } else if (*c >= 'a' && *c <= 'z') { tmp = 26 + (*c - 'a'); } else if (*c >= '0' && *c <= 57) { tmp = 52 + (*c - '0'); } else if (*c == '+') { tmp = 62; } else if (*c == '/') { tmp = 63; } else if (*c == '\r' || *c == '\n') { c++; continue; } else if (*c == '=') { if (n == 3) { out = (char*)realloc(out, len + 2); out[len] = (char)(tmp2 >> 10) & 0xff; len++; out[len] = (char)(tmp2 >> 2) & 0xff; len++; } else if (n == 2) { out = (char*)realloc(out, len + 1); out[len] = (char)(tmp2 >> 4) & 0xff; len++; } break; } tmp2 = ((tmp2 << 6) | (tmp & 0xff)); n++; if (n == 4) { out = (char*)realloc(out, len + 3); out[len] = (char)((tmp2 >> 16) & 0xff); len++; out[len] = (char)((tmp2 >> 8) & 0xff); len++; out[len] = (char)(tmp2 & 0xff); len++; tmp2 = 0; n = 0; } c++; } out = (char*)realloc(out, len + 1); out[len] = 0; if (ret_len != NULL) *ret_len = len; return out; } static void jidsplit(const string &jid, string &user, string &host, string &rest) { int pos; user = jid; if((pos = user.find("/")) != -1) { rest = user.substr(pos+1); user.erase(pos); } if((pos = user.find("@")) != -1) { host = user.substr(pos+1); user.erase(pos); } else { host = user; user = (string)""; } } static string jidtodisp(const string &jid) { string user, host, rest; jidsplit(jid, user, host, rest); if(!user.empty()) user += (string) "@" + host; else user = host; return user; } static imstatus get_presence(std::map > res) // > { if (res.empty()) return offline; imstatus result = offline; char prio = -127; for (map >::iterator it = res.begin(); it!= res.end(); it++) { if (it->second.first>prio) { result = it->second.second; prio = it->second.first; } } return result; } // ---------------------------------------------------------------------------- jabberhook jhook; string jabberhook::jidnormalize(const string &jid) const { if(find(agents.begin(), agents.end(), jid) != agents.end()) return jid; string user, host, rest; jidsplit(jid, user, host, rest); if(host.empty()) host = conf->getourid(proto).server; if (user.empty()) user = host; else user += (string) "@" + host; if(!rest.empty()) user += (string) "/" + rest; return user; } jabberhook::jabberhook(): abstracthook(jabber), jc(0), flogged(false), fonline(false) { fcapabs.insert(hookcapab::setaway); fcapabs.insert(hookcapab::setextstatus); fcapabs.insert(hookcapab::fetchaway); fcapabs.insert(hookcapab::authrequests); fcapabs.insert(hookcapab::directadd); fcapabs.insert(hookcapab::flexiblesearch); fcapabs.insert(hookcapab::flexiblereg); fcapabs.insert(hookcapab::visibility); fcapabs.insert(hookcapab::ssl); fcapabs.insert(hookcapab::changedetails); fcapabs.insert(hookcapab::conferencing); fcapabs.insert(hookcapab::groupchatservices); fcapabs.insert(hookcapab::changenick); fcapabs.insert(hookcapab::changeabout); fcapabs.insert(hookcapab::version); #ifdef HAVE_THREAD fcapabs.insert(hookcapab::files); #endif fcapabs.insert(hookcapab::pgp); fcapabs.insert(hookcapab::acknowledgements); } jabberhook::~jabberhook() { } void jabberhook::init() { char rnd[9]; snprintf(rnd, 9, "%X%X", rand()%0xFFFF, rand()%0xFFFF); uuid = rnd; manualstatus = conf->getstatus(proto); } void jabberhook::connect() { icqconf::imaccount acc = conf->getourid(proto); string jid = getourjid(); log(logConnecting); /* TODO: is there really a need for COPYING these char-arrays * shoudn't it be possible to feed the c_str() directly into jab_new * and get rid of the copying ? */ char *cjid = strdup(jid.c_str()); char *cpass = strdup(acc.password.c_str()); char *cserver = strdup(acc.server.c_str()); regmode = flogged = fonline = false; if(jc){ jab_delete(jc); } jc = jab_new(cjid, cpass, cserver, acc.port, acc.additional["ssl"] == "1" ? 1 : 0); jab_packet_handler(jc, &packethandler); jab_state_handler(jc, &statehandler); if(conf->getdebug()) jab_logger(jc, &jlogger); if(jc->user) { fonline = true; jstate = STATE_CONNECTING; statehandler(0, -1); jab_start(jc); } free (cjid); free (cpass); free (cserver); } void jabberhook::disconnect() { // announce it to everyone else setjabberstatus(offline, ""); // announce it to the user statehandler(jc, JCONN_STATE_OFF); // close the connection jab_stop(jc); jab_delete(jc); jc = 0; } void jabberhook::exectimers() { if(logged()) { if(timer_current-timer_keepalive > PERIOD_KEEPALIVE) { jab_send_raw(jc, " \t "); timer_keepalive = timer_current; } } } void jabberhook::main() { xmlnode x, z; char *cid; if(jc && jc->state == JCONN_STATE_CONNECTING) { jab_start(jc); return; } jab_poll(jc, 0); if(jstate == STATE_CONNECTING) { if(jc) { x = jutil_iqnew(JPACKET__GET, NS_AUTH); cid = jab_getid(jc); xmlnode_put_attrib(x, "id", cid); id = atoi(cid); z = xmlnode_insert_tag(xmlnode_get_tag(x, "query"), "username"); xmlnode_insert_cdata(z, jc->user->user, (unsigned) -1); jab_send(jc, x); xmlnode_free(x); jstate = STATE_GETAUTH; } if(!jc || jc->state == JCONN_STATE_OFF) { face.log(_("+ [jab] unable to connect to the server")); fonline = false; } } if(!jc) { statehandler(jc, JCONN_STATE_OFF); } else if(jc->state == JCONN_STATE_OFF || jc->fd == -1) { statehandler(jc, JCONN_STATE_OFF); } } void jabberhook::getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const { if(jc) { if (jc->cw_state & CW_CONNECT_WANT_READ) FD_SET(jc->fd, &rfds); else if (jc->cw_state & CW_CONNECT_WANT_WRITE) FD_SET(jc->fd, &wfds); else FD_SET(jc->fd, &rfds); hsocket = max(jc->fd, hsocket); } } bool jabberhook::isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const { if(jc) return FD_ISSET(jc->fd, &rfds) || FD_ISSET(jc->fd, &wfds); return false; } bool jabberhook::online() const { return fonline; } bool jabberhook::logged() const { return fonline && flogged; } bool jabberhook::isconnecting() const { return fonline && !flogged; } bool jabberhook::enabled() const { return true; } bool jabberhook::send(const imevent &ev) { icqcontact *c = clist.get(ev.getcontact()); string text, cname, enc; if(c) { if(ev.gettype() == imevent::message) { const immessage *m = static_cast(&ev); text = m->gettext(); } else if(ev.gettype() == imevent::url) { const imurl *m = static_cast(&ev); text = m->geturl() + "\n\n" + m->getdescription(); } else if(ev.gettype() == imevent::file) { const imfile *m = static_cast(&ev); vector files = m->getfiles(); vector::const_iterator ir = files.begin(); string cjid_str = jidtodisp(ev.getcontact().nickname); transform(cjid_str.begin(), cjid_str.end(), cjid_str.begin(), ::tolower); char *cjid = strdup(cjid_str.c_str()); struct send_file *trans_file = (struct send_file *)malloc( sizeof( struct send_file ) ); srfiles[cjid].first = (*m); back_srfiles[*m] = cjid; //backward comp. , little hack :( trans_file->full_jid_name = strdup(jhook.full_jids[cjid].c_str()); trans_file->id = NULL; trans_file->transfer_type = 5; trans_file->host = NULL; trans_file->url = NULL; trans_file->sid_from_to = NULL; srfiles[cjid].second.first = trans_file; srfiles[cjid].second.second = 0; face.transferupdate(files[0].fname, *m, icqface::tsInit, files[0].size, 0); send_file(cjid); } else if(ev.gettype() == imevent::authorization) { const imauthorization *m = static_cast (&ev); char *cjid = strdup(jidnormalize(ev.getcontact().nickname).c_str()); xmlnode x = 0; switch(m->getauthtype()) { case imauthorization::Granted: x = jutil_presnew(JPACKET__SUBSCRIBED, cjid, 0); break; case imauthorization::Rejected: x = jutil_presnew(JPACKET__UNSUBSCRIBED, cjid, 0); break; case imauthorization::Request: x = jutil_presnew(JPACKET__SUBSCRIBE, cjid, 0); break; } if(x) { jab_send(jc, x); xmlnode_free(x); } free(cjid); return true; } text = rusconv("ku", text); #ifdef HAVE_GPGME if(pgp.enabled(ev.getcontact())) { enc = pgp.encrypt(text, c->getpgpkey(), proto); if (enc.empty() && !text.empty()) // probably encryption error return false; text = "This message is encrypted."; } #endif #ifdef HAVE_LIBOTR if (!otr.send_message(proto, jidnormalize(ev.getcontact().nickname), text)) { return true; } #endif /* TODO: do these really needs to be copied? */ char *cjid = strdup(jidnormalize(c->getdesc().nickname).c_str()); char *ctext = strdup(text.c_str()); xmlnode x = jutil_msgnew(TMSG_CHAT, cjid, 0, ctext); if(ischannel(c)) { xmlnode_put_attrib(x, "type", "groupchat"); if(!(cname = c->getdesc().nickname.substr(1)).empty()) xmlnode_put_attrib(x, "to", cname.c_str()); } if(!enc.empty()) { xmlnode xenc = xmlnode_insert_tag(x, "x"); xmlnode_put_attrib(xenc, "xmlns", "jabber:x:encrypted"); xmlnode_insert_cdata(xenc, enc.c_str(), (unsigned) -1); } if(conf->getourid(jhook.proto).additional["acknowledgements"] == "1") { vector::iterator ia = find(jhook.agents.begin(),jhook.agents.end(), jhook.full_jids[cjid]); if(ia != jhook.agents.end() && ia->params[agent::ptReceipts].enabled) { xmlnode request = xmlnode_insert_tag(x, "request"); xmlnode_put_attrib(request, "xmlns", NS_RECEIPTS); } } #ifdef HAVE_SSTREAM stringstream idstream; idstream << ev.gettimestamp(); xmlnode_put_attrib(x, "id", idstream.str().c_str()); #else strstream idstream; idstream << ev.gettimestamp(); xmlnode_put_attrib(x, "id", idstream.str()); #endif jab_send(jc, x); xmlnode_free(x); free (cjid); free (ctext); return true; } return false; } void jabberhook::sendnewuser(const imcontact &ic) { sendnewuser(ic, true); } void jabberhook::removeuser(const imcontact &ic) { removeuser(ic, true); } void jabberhook::sendnewuser(const imcontact &ic, bool report) { xmlnode x, y, z; icqcontact *c; string cname; if(!logged()) return; if(!ischannel(ic)) { char *cjid = strdup(jidnormalize(ic.nickname).c_str()); if(roster.find(cjid) != roster.end()) { free (cjid); return; } if(report) log(logContactAdd, ic.nickname.c_str()); x = jutil_presnew(JPACKET__SUBSCRIBE, cjid, 0); jab_send(jc, x); xmlnode_free(x); x = jutil_iqnew(JPACKET__SET, NS_ROSTER); xmlnode_put_attrib(x, "id", jab_getid(jc)); y = xmlnode_get_tag(x, "query"); z = xmlnode_insert_tag(y, "item"); xmlnode_put_attrib(z, "jid", cjid); roster[cjid] = ""; if(c = clist.get(ic)) { vector::const_iterator ig = find(groups.begin(), groups.end(), c->getgroupid()); if(ig != groups.end()) { z = xmlnode_insert_tag(z, "group"); xmlnode_insert_cdata(z, rusconv("ku", ig->getname()).c_str(), (unsigned) -1); roster[cjid] = ig->getname(); } } jab_send(jc, x); xmlnode_free(x); if(c = clist.get(ic)) { imcontact icc(jidtodisp(ic.nickname), proto); if(ic.nickname != icc.nickname) { c->setdesc(icc); } c->setnick(""); string u, h, r; jidsplit(icc.nickname, u, h, r); if (!u.empty()) c->setdispnick(u); else c->setdispnick(icc.nickname); } requestinfo(c); free (cjid); } else { if(c = clist.get(ic)) { cname = ic.nickname.substr(1); if(!cname.empty()) { cname += "/" + conf->getourid(proto).nickname; char *ccname = strdup(cname.c_str()); char *ourjid = strdup(getourjid().c_str()); x = jutil_presnew(JPACKET__UNKNOWN, ccname, 0); xmlnode_insert_cdata(xmlnode_insert_tag(x, "status"), "Online", (unsigned) -1); free (ccname); free (ourjid); jab_send(jc, x); xmlnode_free(x); } } } } void jabberhook::removeuser(const imcontact &ic, bool report) { xmlnode x, y, z; icqcontact *c; string cname; if(!logged()) return; if(!ischannel(ic)) { char *cjid = strdup(jidnormalize(ic.nickname).c_str()); map::iterator ir = roster.find(cjid); if(ir == roster.end()) return; else roster.erase(ir); if(find(agents.begin(), agents.end(), cjid) != agents.end()) { if(report) face.log(_("+ [jab] unregistering from the %s agent"), cjid); x = jutil_iqnew(JPACKET__SET, NS_REGISTER); xmlnode_put_attrib(x, "id", jab_getid(jc)); xmlnode_put_attrib(x, "to", cjid); y = xmlnode_get_tag(x, "query"); xmlnode_insert_tag(y, "remove"); jab_send(jc, x); xmlnode_free(x); } if(report) log(logContactRemove, ic.nickname.c_str()); x = jutil_presnew(JPACKET__UNSUBSCRIBE, cjid, 0); jab_send(jc, x); xmlnode_free(x); x = jutil_iqnew(JPACKET__SET, NS_ROSTER); xmlnode_put_attrib(x, "id", jab_getid(jc)); y = xmlnode_get_tag(x, "query"); z = xmlnode_insert_tag(y, "item"); xmlnode_put_attrib(z, "jid", cjid); xmlnode_put_attrib(z, "subscription", "remove"); jab_send(jc, x); xmlnode_free(x); free (cjid); } else { if(c = clist.get(ic)) { cname = ic.nickname.substr(1); if(!cname.empty()) { cname += "/" + conf->getourid(proto).nickname; char *ccname = strdup(cname.c_str()); x = jutil_presnew(JPACKET__UNKNOWN, ccname, 0); xmlnode_put_attrib(x, "type", "unavailable"); jab_send(jc, x); xmlnode_free(x); free(ccname); map >::iterator icm = chatmembers.find(ic.nickname); if(icm != chatmembers.end()) chatmembers.erase(icm); } } } } void jabberhook::setautostatus(imstatus st) { if(st != offline) { if(getstatus() == offline) { connect(); } else { string msg; switch(st) { case dontdisturb: case occupied: case outforlunch: case notavail: msg = conf->getextstatus(proto, st); //external online status if( msg.empty() ) msg = conf->getawaymsg(proto); break; case away: msg = conf->getawaymsg(proto); break; case available: case freeforchat: msg = conf->getextstatus(proto, st); //external online status } setjabberstatus(ourstatus = st, msg); } } else { if(getstatus() != offline) { disconnect(); } } } void jabberhook::requestinfo(const imcontact &ic) { if(isconnecting() || logged()) { vector::const_iterator ia = find(agents.begin(), agents.end(), ic.nickname); if(ia != agents.end()) { icqcontact *c = clist.get(imcontact(ic.nickname, proto)); if(c) { c->setdispnick(ia->name); c->setabout(ia->desc); } } else { char *cjid = strdup(jidnormalize(ic.nickname).c_str()); xmlnode x = jutil_iqnew2(JPACKET__GET), y;//gtalk vCard request fix xmlnode_put_attrib(x, "to", cjid); xmlnode_put_attrib(x, "id", "VCARDreq"); y = xmlnode_insert_tag(x, "vCard"); xmlnode_put_attrib(y, "xmlns", NS_VCARD); jab_send(jc, x); xmlnode_free(x); free (cjid); } } } void jabberhook::requestawaymsg(const imcontact &ic) { icqcontact *c = clist.get(ic); if(c) { string am = awaymsgs[ic.nickname]; if(!am.empty()) { em.store(imnotification(ic, (string) _("Away message:") + "\n\n" + rusconv("uk",am))); } else { face.log(_("+ [jab] no away message from %s, %s"), c->getdispnick().c_str(), ic.totext().c_str()); } } } imstatus jabberhook::getstatus() const { return online() ? ourstatus : offline; } bool jabberhook::regnick(const string &nick, const string &pass, const string &serv, string &err) { int pos, port; string jid = nick + "@" + serv; if((pos = jid.find(":")) != -1) { port = atoi(jid.substr(pos+1).c_str()); jid.erase(pos); } else { port = icqconf::defservers[proto].port; } regmode = true; /* TODO: do these really need to be copied ??? */ char *cjid = strdup(jid.c_str()); char *cpass = strdup(pass.c_str()); char *cserver = strdup(serv.c_str()); jc = jab_new(cjid, cpass, cserver, port, 0); free (cjid); free (cpass); free (cserver); if(!jc->user) { err = _("Wrong nickname given, cannot register"); fonline = false; return false; } jab_packet_handler(jc, &packethandler); jab_state_handler(jc, &statehandler); if(conf->getdebug()) jab_logger(jc, &jlogger); jc->cw_state = CW_CONNECT_BLOCKING; jab_start(jc); if(jc) id = atoi(jab_reg(jc)); if(!online()) { err = _("Unable to connect"); } else { regdone = false; regerr = ""; while(online() && !regdone && regerr.empty()) { main(); } disconnect(); err = regdone ? "" : regerr; } return regdone; } void jabberhook::setjabberstatus(imstatus st, string msg) { xmlnode x = jutil_presnew(JPACKET__UNKNOWN, 0, 0); switch(st) { case away: xmlnode_insert_cdata(xmlnode_insert_tag(x, "show"), "away", (unsigned) -1); break; case occupied: case dontdisturb: xmlnode_insert_cdata(xmlnode_insert_tag(x, "show"), "dnd", (unsigned) -1); break; case freeforchat: xmlnode_insert_cdata(xmlnode_insert_tag(x, "show"), "chat", (unsigned) -1); break; case outforlunch: case notavail: xmlnode_insert_cdata(xmlnode_insert_tag(x, "show"), "xa", (unsigned) -1); break; case invisible: xmlnode_put_attrib(x, "type", "invisible"); break; case offline: xmlnode_put_attrib(x, "type", "unavailable"); break; } map add = conf->getourid(proto).additional; if(!add["prio"].empty()) xmlnode_insert_cdata(xmlnode_insert_tag(x, "priority"), add["prio"].c_str(), (unsigned) -1); if(msg.empty()) msg = imstatus2str(st); int pos = 0; while( (pos = msg.find( '\r' )) != string::npos ) { if( msg[pos+1] == '\n' ) { msg.erase(pos, 1); } else { msg.replace(pos, 1, "\n"); } } xmlnode_insert_cdata(xmlnode_insert_tag(x, "status"), rusconv("ku", msg).c_str(), (unsigned) -1); //check if our avatar changed and send update request icqcontact *ic = clist.get(contactroot); icqcontact::basicinfo bi = ic->getbasicinfo(); if(!bi.avatar.empty()) { string my_avatar_hash; if( get_my_avatar_hash(my_avatar_hash) ) { xmlnode y = xmlnode_insert_tag(x, "x"); xmlnode_put_attrib(y, "xmlns", NS_VCARDUP); xmlnode z = xmlnode_insert_tag(y, "photo"); xmlnode_insert_cdata(z, my_avatar_hash.c_str(), (unsigned) -1); } } #ifdef HAVE_GPGME if(!add["pgpkey"].empty()) { pgp.clearphrase(proto); xmlnode sign = xmlnode_insert_tag(x, "x"); xmlnode_put_attrib(sign, "xmlns", "jabber:x:signed"); xmlnode_insert_cdata(sign, pgp.sign(msg, add["pgpkey"], proto).c_str(), (unsigned) -1); } #endif jab_send(jc, x); xmlnode_free(x); sendvisibility(); logger.putourstatus(proto, getstatus(), ourstatus = st); } void jabberhook::sendvisibility() { xmlnode x; icqlist::iterator i; for(i = lst.begin(); i != lst.end(); ++i) if(i->getdesc().pname == proto) { x = jutil_presnew(JPACKET__UNKNOWN, 0, 0); xmlnode_put_attrib(x, "to", jidnormalize(i->getdesc().nickname).c_str()); if(i->getstatus() == csvisible && ourstatus == invisible) { } else if(i->getstatus() == csvisible && ourstatus != invisible) { } else if(i->getstatus() == csinvisible && ourstatus == invisible) { } else if(i->getstatus() == csinvisible && ourstatus != invisible) { xmlnode_put_attrib(x, "type", "unavailable"); } jab_send(jc, x); xmlnode_free(x); } } vector jabberhook::getservices(servicetype::enumeration st) const { vector::const_iterator ia = agents.begin(); vector r; agent::param_type pt; switch(st) { case servicetype::search: pt = agent::ptSearch; break; case servicetype::registration: pt = agent::ptRegister; break; case servicetype::groupchat: while(ia != agents.end()) { if(ia->type == agent::atGroupchat) r.push_back(ia->jid); ++ia; } default: return r; } while(ia != agents.end()) { if(ia->params[pt].enabled) r.push_back(ia->name); ++ia; } return r; } vector > jabberhook::getservparams(const string &agentname, agent::param_type pt) const { vector::const_iterator ia = agents.begin(); while(ia != agents.end()) { if(ia->name == agentname) if(ia->params[pt].enabled) return ia->params[pt].paramnames; ++ia; } return vector >(); } vector > jabberhook::getsearchparameters(const string &agentname) const { return getservparams(agentname, agent::ptSearch); } vector > jabberhook::getregparameters(const string &agentname) const { return getservparams(agentname, agent::ptRegister); } void jabberhook::gotagentinfo(xmlnode x) { xmlnode y; string name, data, ns; //agent::param_type pt; vector::iterator ia = jhook.agents.begin(); const char *from = xmlnode_get_attrib(x, "from"), *p, *q; if(!from) return; while(ia != jhook.agents.end()) { if(ia->jid == from) if(y = xmlnode_get_tag(x, "query")) { p = xmlnode_get_attrib(y, "xmlns"); if(p) ns = p; if (ns == NS_DISCOINFO) { for(y = xmlnode_get_firstchild(y); y; y = xmlnode_get_nextsibling(y)) { p = xmlnode_get_name(y); name = p ? p : ""; if (name == "identity") { if (q = xmlnode_get_attrib(y, "name")) ia->desc = q; if (q = (xmlnode_get_attrib(y, "category"))) { data = q; if (data == "conference") { ia->type = agent::atGroupchat; } else if (data == "gateway") { ia->type = agent::atTransport; } } } else if (name == "feature") { if ((q = xmlnode_get_attrib(y, "var")) && (!strcmp(q, NS_SEARCH))) { // can do search, ask for parameters ia->params[agent::ptSearch].enabled = true; ia->params[agent::ptSearch].paramnames.clear(); xmlnode z = jutil_iqnew(JPACKET__GET, NS_SEARCH); char *id = jab_getid(jc); ignore_ids.insert((string)id); xmlnode_put_attrib(z, "id", id); xmlnode_put_attrib(z, "to", from); jab_send(jc, z); xmlnode_free(z); } else if ((q = xmlnode_get_attrib(y, "var")) && (!strcmp(q, NS_RECEIPTS))) { ia->params[agent::ptReceipts].enabled = true; } } } break; } else if (ns == NS_SEARCH) { // probably agent info with jabber:iq:search for(y = xmlnode_get_firstchild(y); y; y = xmlnode_get_nextsibling(y)) { p = xmlnode_get_name(y); name = p ? p : ""; p = xmlnode_get_data(y); data = p ? p : ""; if (name == "item") // it's probably not answer with parameters break; if (name == "instructions") { ia->params[agent::ptSearch].instruction = data; } else if ((name == "x") && (NSCHECK(y, "jabber:x:data"))) { continue; } else if (name == "key") { ia->params[agent::ptSearch].key = data; } else { ia->params[agent::ptSearch].paramnames.push_back(make_pair(name, data)); } } if ((name != "item") && ia->params[agent::ptSearch].paramnames.empty()) agents.erase(ia); break; } } ++ia; } /* while(ia != jhook.agents.end()) { if(ia->jid == from) if(y = xmlnode_get_tag(x, "query")) { p = xmlnode_get_attrib(y, "xmlns"); if(p) ns = p; if(ns == NS_SEARCH) pt = agent::ptSearch; else if(ns == NS_REGISTER) pt = agent::ptRegister; else break; ia->params[pt].enabled = true; ia->params[pt].paramnames.clear(); for(y = xmlnode_get_firstchild(y); y; y = xmlnode_get_nextsibling(y)) { p = xmlnode_get_name(y); name = p ? p : ""; p = xmlnode_get_data(y); data = p ? p : ""; if(name == "instructions") ia->params[pt].instruction = data; else if(name == "key") ia->params[pt].key = data; else if(!name.empty() && name != "registered") { ia->params[pt].paramnames.push_back(make_pair(name, data)); } } if(ia->params[pt].paramnames.empty()) agents.erase(ia); break; } ++ia; } */ } void jabberhook::lookup(const imsearchparams ¶ms, verticalmenu &dest) { xmlnode x, y; searchdest = &dest; while(!foundguys.empty()) { delete foundguys.back(); foundguys.pop_back(); } if(!params.service.empty()) { x = jutil_iqnew(JPACKET__SET, NS_SEARCH); xmlnode_put_attrib(x, "id", "Lookup"); y = xmlnode_get_tag(x, "query"); vector::const_iterator ia = agents.begin(); while(ia != agents.end()) { if(ia->name == params.service) { xmlnode_put_attrib(x, "to", ia->jid.c_str()); xmlnode_insert_cdata(xmlnode_insert_tag(y, "key"), ia->params[agent::atSearch].key.c_str(), (unsigned int) -1); break; } ++ia; } vector >::const_iterator ip = params.flexparams.begin(); while(ip != params.flexparams.end()) { xmlnode_insert_cdata(xmlnode_insert_tag(y, ip->first.c_str()), ip->second.c_str(), (unsigned int) -1); ++ip; } jab_send(jc, x); xmlnode_free(x); } else if(!params.room.empty()) { icqcontact *c; string room = params.room.substr(1); if(c = clist.get(imcontact(params.room, proto))) { vector::const_iterator im = chatmembers[room].begin(); while(im != chatmembers[room].end()) { foundguys.push_back(c = new icqcontact(imcontact(*im, proto))); searchdest->additem(conf->getcolor(cp_clist_jabber), c, (string) " " + *im); ++im; } } face.findready(); log(logConfMembers, foundguys.size()); searchdest->redraw(); searchdest = 0; } } void jabberhook::renamegroup(const string &oldname, const string &newname) { map::iterator ir = roster.begin(); while(ir != roster.end()) { if(ir->second == oldname) { icqcontact *c = clist.get(imcontact(jidtodisp(ir->first), proto)); if(c) { updatecontact(c); ir->second = newname; } } ++ir; } } void jabberhook::ouridchanged(const icqconf::imaccount &ia) { if(logged()) { setautostatus(ourstatus); // send a new presence } } // ---------------------------------------------------------------------------- void jabberhook::gotsearchresults(xmlnode x) { xmlnode y, z; const char *jid, *nick, *first, *last, *email; icqcontact *c; if(!searchdest) return; if(y = xmlnode_get_tag(x, "query")) for(y = xmlnode_get_tag(y, "item"); y; y = xmlnode_get_nextsibling(y)) { jid = xmlnode_get_attrib(y, "jid"); nick = first = last = email = 0; z = xmlnode_get_tag(y, "nick"); if(z) nick = xmlnode_get_data(z); z = xmlnode_get_tag(y, "first"); if(z) first = xmlnode_get_data(z); z = xmlnode_get_tag(y, "last"); if(z) last = xmlnode_get_data(z); z = xmlnode_get_tag(y, "email"); if(z) email = xmlnode_get_data(z); if(jid) { c = new icqcontact(imcontact(jidnormalize(jid), proto)); icqcontact::basicinfo cb = c->getbasicinfo(); if(nick) { c->setnick(nick); c->setdispnick(c->getnick()); } if(first) cb.fname = first; if(last) cb.lname = last; if(email) cb.email = email; c->setbasicinfo(cb); foundguys.push_back(c); string line = (string) " " + c->getnick(); if(line.size() > 12) line.resize(12); else line += string(12-line.size(), ' '); line += " " + cb.fname + " " + cb.lname; if(!cb.email.empty()) line += " <" + cb.email + ">"; searchdest->additem(conf->getcolor(cp_clist_jabber), c, line); } } face.findready(); log(logSearchFinished, foundguys.size()); searchdest->redraw(); searchdest = 0; } void jabberhook::gotloggedin() { xmlnode x, y; flogged = true; // x = jutil_iqnew(JPACKET__GET, NS_AGENTS); // xmlnode_put_attrib(x, "id", "Agent List"); // jab_send(jc, x); // xmlnode_free(x); char *server = strdup(jc->user->server); jhook.agents.push_back(agent(server, server, "", agent::atUnknown)); char *id; x = jutil_iqnew(JPACKET__GET, NS_DISCOINFO); id = jab_getid(jc); ignore_ids.insert((string)id); xmlnode_put_attrib(x, "id", id); xmlnode_put_attrib(x, "to", server); jab_send(jc, x); xmlnode_free(x); x = jutil_iqnew(JPACKET__GET, NS_DISCOITEMS); id = jab_getid(jc); ignore_ids.insert((string)id); xmlnode_put_attrib(x, "id", id); xmlnode_put_attrib(x, "to", server); jab_send(jc, x); xmlnode_free(x); free(server); x = jutil_iqnew(JPACKET__GET, NS_ROSTER); xmlnode_put_attrib(x, "id", "Roster"); jab_send(jc, x); xmlnode_free(x); } void jabberhook::gotroster(xmlnode x) { xmlnode y, z; imcontact ic; icqcontact *c; string grp; for(y = xmlnode_get_tag(x, "item"); y; y = xmlnode_get_nextsibling(y)) { const char *alias = xmlnode_get_attrib(y, "jid"); const char *sub = xmlnode_get_attrib(y, "subscription"); const char *name = xmlnode_get_attrib(y, "name"); const char *group = 0; z = xmlnode_get_tag(y, "group"); if(z) group = xmlnode_get_data(z); grp = group ? rusconv("uk", group) : ""; if(alias) { ic = imcontact(jidtodisp(alias), proto); clist.updateEntry(ic, grp); if(c = clist.get(ic)) { if(name) c->setdispnick(rusconv("uk", name)); else { string u, h, r; jidsplit(alias, u, h, r); if (!u.empty()) c->setdispnick(u); else c->setdispnick(jidtodisp(alias)); } } roster[jidnormalize(alias)] = grp; } } postlogin(); } void jabberhook::postlogin() { int i; icqcontact *c; ourstatus = available; time(&timer_keepalive); log(logLogged); setautostatus(jhook.manualstatus); face.update(); for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getdesc().pname == proto) if(ischannel(c)) if(c->getbasicinfo().requiresauth) c->setstatus(available); } agents.insert(agents.begin(), agent("vcard", "Jabber VCard", "", agent::atStandard)); agents.begin()->params[agent::ptRegister].enabled = true; string buf; ifstream f(conf->getconfigfname("jabber-infoset").c_str()); if(f.is_open()) { icqcontact *c = clist.get(contactroot); c->clear(); icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::reginfo ri = c->getreginfo(); ri.service = agents.begin()->name; getstring(f, buf); c->setnick(buf); getstring(f, buf); bi.email = buf; getstring(f, buf); bi.fname = buf; getstring(f, buf); bi.lname = buf; f.close(); c->setbasicinfo(bi); c->setreginfo(ri); sendupdateuserinfo(*c); unlink(conf->getconfigfname("jabber-infoset").c_str()); } } void jabberhook::conferencecreate(const imcontact &confid, const vector &lst) { char *jcid = strdup(confid.nickname.substr(1).c_str()); xmlnode x = jutil_presnew(JPACKET__UNKNOWN, jcid, 0); jab_send(jc, x); xmlnode_free(x); free (jcid); } void jabberhook::vcput(xmlnode x, const string &name, const string &val) { xmlnode_insert_cdata(xmlnode_insert_tag(x, name.c_str()), jhook.rusconv("ku", val).c_str(), (unsigned int) -1); } void jabberhook::vcputphone(xmlnode x, const string &type, const string &place, const string &number) { xmlnode z = xmlnode_insert_tag(x, "TEL"); vcput(z, type, ""); vcput(z, place, ""); vcput(z, "NUMBER", number); } void jabberhook::vcputaddr(xmlnode x, const string &place, const string &street, const string &locality, const string ®ion, const string &pcode, unsigned short country) { xmlnode z = xmlnode_insert_tag(x, "ADR"); vcput(z, place, ""); vcput(z, "STREET", street); vcput(z, "LOCALITY", locality); vcput(z, "REGION", region); vcput(z, "PCODE", pcode); vcput(z, "CTRY", getCountryIDtoString(country)); } void jabberhook::vcputavatar(xmlnode x, const string &type, const string &val) { xmlnode z = xmlnode_insert_tag(x, "PHOTO"); vcput(z, "TYPE", type); xmlnode_insert_cdata(xmlnode_insert_tag(z, "BINVAL"), val.c_str(), (unsigned int) -1); } void jabberhook::sendupdateuserinfo(const icqcontact &c) { xmlnode x, y, z; icqcontact::reginfo ri = c.getreginfo(); string buf; char cbuf[64]; vector::const_iterator ia = agents.begin(); while(ia != agents.end()) { if(ia->name == ri.service) { if(ia->type == agent::atStandard) { x = jutil_iqnew2(JPACKET__SET);//vCard w/o trash query tag in vcard xmlnode_put_attrib(x, "id", jab_getid(jc)); y = xmlnode_insert_tag(x, "vCard"); xmlnode_put_attrib(y, "xmlns", NS_VCARD); xmlnode_put_attrib(y, "version", "3.0"); icqcontact::basicinfo bi = c.getbasicinfo(); icqcontact::moreinfo mi = c.getmoreinfo(); icqcontact::workinfo wi = c.getworkinfo(); conf->setavatar(proto, bi.avatar); //saving avatar path to file vcput(y, "DESC", c.getabout()); vcput(y, "EMAIL", bi.email); vcput(y, "URL", mi.homepage); vcput(y, "TITLE", wi.position); vcput(y, "AGE", i2str(mi.age)); vcput(y, "NICKNAME", c.getnick()); vcput(y, "GENDER", mi.gender == genderMale ? "Male" : mi.gender == genderFemale ? "Female" : ""); if(mi.birth_year && mi.birth_month && mi.birth_day) { snprintf(cbuf, sizeof(cbuf), "%04d-%02d-%02d", mi.birth_year, mi.birth_month, mi.birth_day); vcput(y, "BDAY", cbuf); } if(!(buf = bi.fname).empty()) buf += " " + bi.lname; vcput(y, "FN", buf); z = xmlnode_insert_tag(y, "N"); vcput(z, "GIVEN", bi.fname); vcput(z, "FAMILY", bi.lname); z = xmlnode_insert_tag(y, "ORG"); vcput(z, "ORGNAME", wi.company); vcput(z, "ORGUNIT", wi.dept); vcputphone(y, "VOICE", "HOME", bi.phone); vcputphone(y, "FAX", "HOME", bi.fax); vcputphone(y, "VOICE", "WORK", wi.phone); vcputphone(y, "FAX", "WORK", wi.fax); vcputaddr(y, "HOME", bi.street, bi.city, bi.state, bi.zip, bi.country); vcputaddr(y, "WORK", wi.street, wi.city, wi.state, wi.zip, wi.country); vcput(y, "HOMECELL", bi.cellular); vcput(y, "WORKURL", wi.homepage); string avatar, image_type; if( get_base64_avatar(image_type, avatar) ) vcputavatar(y, image_type, avatar); } else { x = jutil_iqnew(JPACKET__SET, NS_REGISTER); xmlnode_put_attrib(x, "id", "Register"); y = xmlnode_get_tag(x, "query"); xmlnode_put_attrib(x, "to", ia->jid.c_str()); xmlnode_insert_cdata(xmlnode_insert_tag(y, "key"), ia->params[agent::ptRegister].key.c_str(), (unsigned int) -1); vector >::const_iterator ip = ri.params.begin(); while(ip != ri.params.end()) { xmlnode_insert_cdata(xmlnode_insert_tag(y, ip->first.c_str()), ip->second.c_str(), (unsigned int) -1); ++ip; } } jab_send(jc, x); xmlnode_free(x); break; } ++ia; } } void jabberhook::gotmessage(const string &type, const string &from, const string &abody, const string &enc) { string u, h, r, body(abody); jidsplit(from, u, h, r); imcontact ic(jidtodisp(from), proto), chic; if(clist.get(chic = imcontact((string) "#" + ic.nickname, proto))) { ic = chic; if(!r.empty()) body.insert(0, r + ": "); } #ifdef HAVE_GPGME icqcontact *c = clist.get(ic); if(c) { if(!enc.empty()) { c->setusepgpkey(true); if(pgp.enabled(proto)) { body = pgp.decrypt(enc, proto); if (body.empty()) // probably decryption error, store at least encrypted message body = enc; } else c->setusepgpkey(false); } else { c->setusepgpkey(false); } } #endif #ifdef HAVE_LIBOTR if (!otr.receive_message(proto, from, body)) return; #endif em.store(immessage(ic, imevent::incoming, rusconv("uk", body))); } void jabberhook::updatecontact(icqcontact *c) { xmlnode x, y; if(logged()) { char *cjid = strdup(jidnormalize(c->getdesc().nickname).c_str()); char *cname = strdup(rusconv("ku", c->getdispnick()).c_str()); x = jutil_iqnew(JPACKET__SET, NS_ROSTER); xmlnode_put_attrib(x, "id", jab_getid(jc)); y = xmlnode_insert_tag(xmlnode_get_tag(x, "query"), "item"); xmlnode_put_attrib(y, "jid", cjid); xmlnode_put_attrib(y, "name", cname); vector::const_iterator ig = find(groups.begin(), groups.end(), c->getgroupid()); if(ig != groups.end()) { y = xmlnode_insert_tag(y, "group"); xmlnode_insert_cdata(y, rusconv("ku", ig->getname()).c_str(), (unsigned) -1); } jab_send(jc, x); xmlnode_free(x); free (cjid); free (cname); } } void jabberhook::gotvcard(const imcontact &ic, xmlnode v) { xmlnode ad, n; char *p; string name, data; bool wasrole = false; icqcontact *c = clist.get(ic); if(!c || isourid(ic.nickname)) c = clist.get(contactroot); if(c) { icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); icqcontact::workinfo wi = c->getworkinfo(); for(ad = xmlnode_get_firstchild(v); ad; ad = xmlnode_get_nextsibling(ad)) { p = xmlnode_get_name(ad); name = p ? up(p) : ""; p = xmlnode_get_data(ad); data = p ? rusconv("uk", p) : ""; if(name == "NICKNAME") c->setnick(data); else if(name == "DESC") c->setabout(data); else if(name == "EMAIL") bi.email = data; else if(name == "URL") mi.homepage = data; else if(name == "AGE") mi.age = atoi(data.c_str()); else if(name == "HOMECELL") bi.cellular = data; else if(name == "WORKURL") wi.homepage = data; else if(name == "GENDER") { if(data == "Male") mi.gender = genderMale; else if(data == "Female") mi.gender = genderFemale; else mi.gender = genderUnspec; } else if(name == "TITLE" || name == "ROLE") { if(!wasrole) { wasrole = true; wi.position = ""; } if(!wi.position.empty()) wi.position += " / "; wi.position += data; } else if(name == "FN") { bi.fname = getword(data); bi.lname = data; } else if(name == "BDAY") { mi.birth_year = atoi(getword(data, "-").c_str()); mi.birth_month = atoi(getword(data, "-").c_str()); mi.birth_day = atoi(getword(data, "-").c_str()); } else if(name == "ORG") { if(p = xmlnode_get_tag_data(ad, "ORGNAME")) wi.company = rusconv("uk", p); if(p = xmlnode_get_tag_data(ad, "ORGUNIT")) wi.dept = rusconv("uk", p); } else if(name == "N") { if(p = xmlnode_get_tag_data(ad, "GIVEN")) bi.fname = rusconv("uk", p); if(p = xmlnode_get_tag_data(ad, "FAMILY")) bi.lname = rusconv("uk", p); } else if(name == "ADR") { if(xmlnode_get_tag(ad, "HOME")) { if(p = xmlnode_get_tag_data(ad, "STREET")) bi.street = rusconv("uk", p); if(p = xmlnode_get_tag_data(ad, "LOCALITY")) bi.city = rusconv("uk", p); if(p = xmlnode_get_tag_data(ad, "REGION")) bi.state = rusconv("uk", p); if(p = xmlnode_get_tag_data(ad, "PCODE")) bi.zip = rusconv("uk", p); if((p = xmlnode_get_tag_data(ad, "CTRY")) || (p = xmlnode_get_tag_data(ad, "COUNTRY"))) bi.country = getCountryByName(p); } else if(xmlnode_get_tag(ad, "WORK")) { if(p = xmlnode_get_tag_data(ad, "STREET")) wi.street = rusconv("uk", p); if(p = xmlnode_get_tag_data(ad, "LOCALITY")) wi.city = rusconv("uk", p); if(p = xmlnode_get_tag_data(ad, "REGION")) wi.state = rusconv("uk", p); if(p = xmlnode_get_tag_data(ad, "PCODE")) wi.zip = rusconv("uk", p); if((p = xmlnode_get_tag_data(ad, "CTRY")) || (p = xmlnode_get_tag_data(ad, "COUNTRY"))) wi.country = getCountryByName(p); } } else if(name == "TEL") { if(p = xmlnode_get_tag_data(ad, "NUMBER")) { if(xmlnode_get_tag(ad, "VOICE")) { if(xmlnode_get_tag(ad, "HOME")) bi.phone = rusconv("uk", p); else if(xmlnode_get_tag(ad, "WORK")) wi.phone = rusconv("uk", p); } else if(xmlnode_get_tag(ad, "FAX")) { if(xmlnode_get_tag(ad, "HOME")) bi.fax = rusconv("uk", p); else if(xmlnode_get_tag(ad, "WORK")) wi.fax = rusconv("uk", p); } } } else if( name == "PHOTO" )//get and write user avatar { if(!isourid(ic.nickname)) { string contact_dir = c->getdirname() + "avatar"; if(p = xmlnode_get_tag_data(ad, "TYPE")) { string ext; if( get_img_ext(p, ext) ) { contact_dir += (string)"." + ext; if(p = xmlnode_get_tag_data(ad, "BINVAL")) { int len; char *ptr = base64_decode( p, &len ); if( ptr ) { int ggg = open(contact_dir.c_str(), O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); if( ggg >= 0 ) { write(ggg, ptr, len); close(ggg); if( justpathname( bi.avatar ).empty() ) bi.avatar = c->getdirname() + bi.avatar; if( (contact_dir != bi.avatar) && !bi.avatar.empty() ) //clear old avatar unlink(bi.avatar.c_str()); bi.avatar = "avatar." + ext; } free(ptr); } } } } } } } if(isourid(ic.nickname)) {//fill configuration window map add = conf->getourid(proto).additional; if(!add["avatar"].empty()) { bi.avatar = add["avatar"]; } } c->setbasicinfo(bi); c->setmoreinfo(mi); c->setworkinfo(wi); if(isourid(ic.nickname)) { icqcontact *cc = clist.get(ic); if(cc) { cc->setnick(c->getnick()); cc->setabout(c->getabout()); cc->setbasicinfo(bi); cc->setmoreinfo(mi); cc->setworkinfo(wi); } } } xmlnode_free(v); //without it very HUGE memory leaks on some accounts } void jabberhook::requestversion(const imcontact &ic) { string cjid_str = ic.nickname; transform(cjid_str.begin(), cjid_str.end(), cjid_str.begin(), ::tolower); xmlnode x = jutil_iqnew(JPACKET__GET, NS_VERSION); xmlnode_put_attrib(x, "to", jhook.full_jids[cjid_str].c_str()); xmlnode_put_attrib(x, "id", "versionreq"); xmlnode_put_attrib(x, "from", getourjid().c_str()); jab_send(jc, x); xmlnode_free(x); } void jabberhook::sendversion(const imcontact &ic, xmlnode i) { string id; char *p = xmlnode_get_attrib(i, "id"); if(p) id = p; else id = "versionreq"; string cjid_str = ic.nickname; transform(cjid_str.begin(), cjid_str.end(), cjid_str.begin(), ::tolower); const char *cjid = jhook.full_jids[cjid_str].c_str(); xmlnode x = jutil_iqnew(JPACKET__RESULT, NS_VERSION), y; xmlnode_put_attrib(x, "to", cjid); xmlnode_put_attrib(x, "from", getourjid().c_str()); xmlnode_put_attrib(x, "id", id.c_str() ); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "name"); xmlnode_insert_cdata(y, PACKAGE, (unsigned) -1 ); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "version"); xmlnode_insert_cdata(y, centerim::version, (unsigned) -1 ); #ifdef HAVE_UNAME if(conf->getourid(jhook.proto).additional["osinfo"] == "1") { struct utsname buf; if( !uname( &buf ) ) { string os = buf.sysname; os += " "; os += buf.release; y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "os"); xmlnode_insert_cdata(y, os.c_str(), (unsigned) -1 ); } } #endif jab_send(jc, x); xmlnode_free(x); } void jabberhook::gotversion(const imcontact &ic, xmlnode x) { //fix version parsing xmlnode y = xmlnode_get_tag(x, "query"), z; char *p; string vinfo; if(y) { if(z = xmlnode_get_tag(y, "name")) if(p = xmlnode_get_data(z)) { if(p) vinfo = rusconv("uk", p); } if(z = xmlnode_get_tag(y, "version")) if(p = xmlnode_get_data(z)) { if(!vinfo.empty()) vinfo += ", "; vinfo += rusconv("uk", p); } if(z = xmlnode_get_tag(y, "os")) if(p = xmlnode_get_data(z)) { if(!vinfo.empty()) vinfo += " / "; vinfo += rusconv("uk", p); } char buf[NOTIFBUF]; snprintf(buf, NOTIFBUF, _("The remote is using %s"), vinfo.c_str()); em.store(imnotification(ic, buf)); } } void jabberhook::senddiscoinfo(const imcontact &ic, xmlnode i) { string id; char *p = xmlnode_get_attrib(i, "id"); if(p) id = p; else id = "discoinfo"; string cjid_str = ic.nickname; transform(cjid_str.begin(), cjid_str.end(), cjid_str.begin(), ::tolower); const char *cjid = jhook.full_jids[cjid_str].c_str(); xmlnode x = jutil_iqnew(JPACKET__RESULT, NS_DISCOINFO), y; xmlnode_put_attrib(x, "to", cjid); xmlnode_put_attrib(x, "from", getourjid().c_str()); xmlnode_put_attrib(x, "id", id.c_str() ); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "identity"); xmlnode_put_attrib(y, "category", "client"); xmlnode_put_attrib(y, "type", "pc"); xmlnode_put_attrib(y, "name", "centerim"); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "feature"); xmlnode_put_attrib(y, "var", NS_DISCOINFO); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "feature"); xmlnode_put_attrib(y, "var", NS_VERSION); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "feature"); xmlnode_put_attrib(y, "var", NS_VCARD); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "feature"); xmlnode_put_attrib(y, "var", NS_VCARDUP); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "feature"); xmlnode_put_attrib(y, "var", NS_OOB ); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "feature"); xmlnode_put_attrib(y, "var", NS_BYTESTREAMS ); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "feature"); xmlnode_put_attrib(y, "var", NS_SI ); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "feature"); xmlnode_put_attrib(y, "var", NS_SIFILE ); if(conf->getourid(jhook.proto).additional["acknowledgements"] == "1") { y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "feature"); xmlnode_put_attrib(y, "var", NS_RECEIPTS); } jab_send(jc, x); xmlnode_free(x); } bool jabberhook::isourid(const string &jid) { icqconf::imaccount acc = conf->getourid(jhook.proto); int pos; string ourjid = acc.nickname; if(ourjid.find("@") == -1) ourjid += (string) "@" + acc.server; if((pos = ourjid.find(":")) != -1) ourjid.erase(pos); return jidnormalize(jid) == ourjid; } string jabberhook::getourjid() { icqconf::imaccount acc = conf->getourid(jhook.proto); string jid = acc.nickname; int pos; if(jid.find("@") == -1) jid += (string) "@" + acc.server; if((pos = jid.find(":")) != -1) jid.erase(pos); if(jid.find("/") == -1) jid += "/centerim" + jhook.uuid; return jid; } imstatus jabberhook::process_presence(string id, string s, char prio, imstatus ust) { if (statuses.find(id) == statuses.end()) { // new and only presence if (ust != offline) (statuses[id])[s] = pair(prio, ust); } else { if (statuses[id].find(s) == statuses[id].end()) { // unknown resource if (ust != offline) (statuses[id])[s] = pair(prio, ust); } else { if (ust == offline) // remove resource (statuses[id]).erase(s); else { // known contact (statuses[id])[s] = pair(prio, ust); } } ust = get_presence(statuses[id]); } return ust; } // ---------------------------------------------------------------------------- void jabberhook::statehandler(jconn conn, int state) { static int previous_state = -1; switch(state) { case JCONN_STATE_OFF: jhook.flogged = jhook.fonline = false; if(previous_state != JCONN_STATE_OFF) { logger.putourstatus(jhook.proto, jhook.getstatus(), jhook.ourstatus = offline); jhook.log(logDisconnected); jhook.roster.clear(); jhook.agents.clear(); jhook.ignore_ids.clear(); clist.setoffline(jhook.proto); face.update(); } break; case JCONN_STATE_CONNECTED: break; case JCONN_STATE_AUTH: break; case JCONN_STATE_ON: if(jhook.regmode) jhook.fonline = true; break; default: break; } previous_state = state; } void jabberhook::packethandler(jconn conn, jpacket packet) { char *p; xmlnode x, y; string from, type, body, enc, ns, id, u, h, s, packet_id; imstatus ust; int npos; bool isagent; jpacket_reset(packet); p = xmlnode_get_attrib(packet->x, "from"); if(p) from = p; p = xmlnode_get_attrib(packet->x, "type"); if(p) type = p; p = xmlnode_get_attrib(packet->x, "id"); if (p) packet_id = p; imcontact ic(jidtodisp(from), jhook.proto); switch(packet->type) { case JPACKET_MESSAGE: x = xmlnode_get_tag(packet->x, "body"); p = xmlnode_get_data(x); if(p) body = p; if(x = xmlnode_get_tag(packet->x, "subject")) if(p = xmlnode_get_data(x)) body = (string) p + ": " + body; /* there can be multiple tags. we're looking for one with xmlns = jabber:x:encrypted */ for(x = xmlnode_get_firstchild(packet->x); x; x = xmlnode_get_nextsibling(x)) { if((p = xmlnode_get_name(x)) && !strcmp(p, "x")) if((p = xmlnode_get_attrib(x, "xmlns")) && !strcasecmp(p, "jabber:x:encrypted")) if(p = xmlnode_get_data(x)) { enc = p; break; } } if(!body.empty()) jhook.gotmessage(type, from, body, enc); if(jhook.getstatus() != invisible) { if(x = xmlnode_get_tag(packet->x, "request")) if(NSCHECK(x, NS_RECEIPTS)) { const char *id = xmlnode_get_attrib(packet->x, "id"); xmlnode receipt = jutil_receiptnew(from.c_str(), id); jab_send(conn, receipt); xmlnode_free(receipt); icqcontact *c = clist.get(ic); c->sentAcks.insert(em.getevents(ic, 1).back()->getsenttimestamp()); face.relaxedupdate(); if(c->isopenedforchat()) c->sethasevents(true); } } if(x = xmlnode_get_tag(packet->x, "received")) { if(p = xmlnode_get_attrib(packet->x, "id")) { icqcontact *c = clist.get(ic); c->receivedAcks.insert(strtoul(p, 0, 0)); face.relaxedupdate(); if(c->isopenedforchat()) c->sethasevents(true); } } break; case JPACKET_IQ: if(type == "result") { if(p = xmlnode_get_attrib(packet->x, "id")) { int iid = atoi(p); if(iid == jhook.id) { if(!jhook.regmode) { if(jhook.jstate == STATE_GETAUTH) { if(x = xmlnode_get_tag(packet->x, "query")) if(!xmlnode_get_tag(x, "digest")) { jhook.jc->sid = 0; } jhook.id = atoi(jab_auth(jhook.jc)); jhook.jstate = STATE_SENDAUTH; } else { jhook.gotloggedin(); jhook.jstate = STATE_LOGGED; } } else { jhook.regdone = true; } return; } if(!strcmp(p, "VCARDreq")) { x = xmlnode_get_firstchild(packet->x); if(!x) x = packet->x; jhook.gotvcard(ic, x); return; } else if(!strcmp(p, "versionreq")) { jhook.gotversion(ic, packet->x); return; } } if(x = xmlnode_get_tag(packet->x, "query")) { p = xmlnode_get_attrib(x, "xmlns"); if(p) ns = p; if(ns == NS_ROSTER) { jhook.gotroster(x); } else if(ns == NS_AGENTS) { for(y = xmlnode_get_tag(x, "agent"); y; y = xmlnode_get_nextsibling(y)) { const char *alias = xmlnode_get_attrib(y, "jid"); if(alias) { const char *name = xmlnode_get_tag_data(y, "name"); const char *desc = xmlnode_get_tag_data(y, "description"); const char *service = xmlnode_get_tag_data(y, "service"); agent::agent_type atype = agent::atUnknown; if(xmlnode_get_tag(y, "groupchat")) atype = agent::atGroupchat; else if(xmlnode_get_tag(y, "transport")) atype = agent::atTransport; else if(xmlnode_get_tag(y, "search")) atype = agent::atSearch; if(alias && name && desc) { jhook.agents.push_back(agent(alias, name, desc, atype)); if(atype == agent::atSearch) { x = jutil_iqnew (JPACKET__GET, NS_SEARCH); xmlnode_put_attrib(x, "to", alias); xmlnode_put_attrib(x, "id", "Agent info"); jab_send(conn, x); xmlnode_free(x); } if(xmlnode_get_tag(y, "register")) { x = jutil_iqnew (JPACKET__GET, NS_REGISTER); xmlnode_put_attrib(x, "to", alias); xmlnode_put_attrib(x, "id", "Agent info"); jab_send(conn, x); xmlnode_free(x); } } } } if(find(jhook.agents.begin(), jhook.agents.end(), DEFAULT_CONFSERV) == jhook.agents.end()) jhook.agents.insert(jhook.agents.begin(), agent(DEFAULT_CONFSERV, DEFAULT_CONFSERV, _("Default Jabber conference server"), agent::atGroupchat)); } else if(ns == NS_SEARCH || ns == NS_REGISTER) { p = xmlnode_get_attrib(packet->x, "id"); id = p ? p : ""; if(id == "Agent info") { jhook.gotagentinfo(packet->x); } else if(id == "Lookup") { jhook.gotsearchresults(packet->x); } else if(id == "Register") { x = jutil_iqnew(JPACKET__GET, NS_REGISTER); xmlnode_put_attrib(x, "to", from.c_str()); xmlnode_put_attrib(x, "id", "Agent info"); jab_send(conn, x); xmlnode_free(x); } else if (ns == NS_SEARCH) { jhook.gotagentinfo(packet->x); } } else if(ns == NS_DISCOITEMS) { for(y = xmlnode_get_tag(x, "item"); y; y = xmlnode_get_nextsibling(y)) { if (p = xmlnode_get_attrib(y, "jid")) { jhook.agents.push_back(agent(p, p, _(""), agent::atUnknown)); x = jutil_iqnew(JPACKET__GET, NS_DISCOINFO); char *pid = jab_getid(conn); jhook.ignore_ids.insert((string)pid); xmlnode_put_attrib(x, "id", pid); xmlnode_put_attrib(x, "to", p); jab_send(conn, x); xmlnode_free(x); } } } else if(ns == NS_DISCOINFO) { jhook.gotagentinfo(packet->x); } } } else if(type == "get") { if( x = xmlnode_get_tag(packet->x, "query") ) if( p = xmlnode_get_attrib( x, "xmlns" ) ) { if(!strcmp(p, NS_VERSION)) { //user request our version jhook.full_jids[ic.nickname] = from; jhook.sendversion(ic, packet->x); return; } // send the supported features (and don't leak our presence) if(!strcmp(p, NS_DISCOINFO) && jhook.getstatus() != invisible) { jhook.full_jids[ic.nickname] = from; jhook.senddiscoinfo(ic, packet->x); return; } } // unknown IQ get without specific response x = jutil_iqnew2(JPACKET__ERROR); xmlnode_put_attrib(x, "to", from.c_str()); xmlnode_put_attrib(x, "id", packet_id.c_str()); y = xmlnode_insert_tag(x, "error"); xmlnode_put_attrib(y, "type", "cancel"); xmlnode z = xmlnode_insert_tag(y, "feature-not-implemented"); xmlnode_put_attrib(z, "xmlns", "urn:ietf:params:xml:ns:xmpp-stanzas"); jab_send(conn, x); xmlnode_free(x); } else if(type == "set") { if( x = xmlnode_get_tag(packet->x, "query") ) { if( p = xmlnode_get_attrib( x, "xmlns" ) ) { if(!strcmp(p, NS_BYTESTREAMS)) { jhook.full_jids[ic.nickname] = from; #ifdef HAVE_THREAD jhook.getfile_byte(ic, packet->x); #endif return; } else if(!strcmp(p, NS_OOB)) { jhook.full_jids[ic.nickname] = from; #ifdef HAVE_THREAD jhook.getfile_http(ic, packet->x); #endif return; } } } else if( x = xmlnode_get_tag(packet->x, "si") ) if( p = xmlnode_get_attrib( x, "xmlns" ) ) { if(!strcmp(p, NS_SI)) { if( p = xmlnode_get_attrib( x, "profile" ) ) { if(!strcmp(p, NS_SIFILE)) { { jhook.full_jids[ic.nickname] = from; #ifdef HAVE_THREAD jhook.file_transfer_request(ic, packet->x); #endif return; } } } } } // unknown IQ set without specific response x = jutil_iqnew2(JPACKET__ERROR); xmlnode_put_attrib(x, "to", from.c_str()); xmlnode_put_attrib(x, "id", packet_id.c_str()); y = xmlnode_insert_tag(x, "error"); xmlnode_put_attrib(y, "type", "cancel"); xmlnode z = xmlnode_insert_tag(y, "feature-not-implemented"); xmlnode_put_attrib(z, "xmlns", "urn:ietf:params:xml:ns:xmpp-stanzas"); jab_send(conn, x); xmlnode_free(x); } else if(type == "error") { string name, desc; int code; x = xmlnode_get_tag(packet->x, "error"); p = xmlnode_get_attrib(x, "code"); if(p) code = atoi(p); p = xmlnode_get_attrib(x, "id"); if(p) name = p; p = xmlnode_get_tag_data(packet->x, "error"); if(p) desc = p; set::iterator sit; if ((sit = jhook.ignore_ids.find(packet_id)) != jhook.ignore_ids.end()) { // expected error, ignore jhook.ignore_ids.erase(sit); break; } switch(code) { case 501: /* Not Implemented */ if(jhook.regmode) { jhook.regerr = desc; } break; case 401: /* Unauthorized */ case 302: /* Redirect */ case 400: /* Bad request */ case 402: /* Payment Required */ case 403: /* Forbidden */ case 404: /* Not Found */ case 405: /* Not Allowed */ case 406: /* Not Acceptable */ case 407: /* Registration Required */ case 408: /* Request Timeout */ case 409: /* Conflict */ case 500: /* Internal Server Error */ case 502: /* Remote Server Error */ case 503: /* Service Unavailable */ case 504: /* Remote Server Timeout */ default: if(!jhook.regmode) { face.log(desc.empty() ? _("+ [jab] error %d") : _("+ [jab] error %d: %s"), code, desc.c_str()); if(!jhook.flogged) { close(jhook.jc->fd); jhook.jc->fd = -1; } } else { jhook.regerr = desc; } } } break; case JPACKET_PRESENCE: if (type == "error") { if(!jhook.regmode) { string desc; int code; x = xmlnode_get_tag(packet->x, "error"); p = xmlnode_get_attrib(x, "code"); if(p) code = atoi(p); p = xmlnode_get_tag_data(packet->x, "error"); if(p) desc = p; face.log(desc.empty() ? _("+ [jab] error %d") : _("+ [jab] error %d: %s"), code, desc.c_str()); } break; } x = xmlnode_get_tag(packet->x, "show"); ust = available; if(x) { p = xmlnode_get_data(x); if(p) ns = p; if(!ns.empty()) { if(ns == "away") ust = away; else if(ns == "dnd") ust = dontdisturb; else if(ns == "xa") ust = notavail; else if(ns == "chat") ust = freeforchat; } } if(type == "unavailable") ust = offline; jidsplit(from, u, h, s); id = jidtodisp(from); jhook.full_jids[ic.nickname] = from; //writing full JID if(clist.get(imcontact((string) "#" + id, jhook.proto))) { if(ust == offline) { vector::iterator im = find(jhook.chatmembers[id].begin(), jhook.chatmembers[id].end(), s); if(im != jhook.chatmembers[id].end()) jhook.chatmembers[id].erase(im); jhook.full_jids.erase(ic.nickname); //erase full JID if user change status to offline vector::iterator ia = find(jhook.agents.begin(), jhook.agents.end(), from); if(ia != jhook.agents.end()) jhook.agents.erase(ia); } else { vector::iterator im = find(jhook.chatmembers[id].begin(), jhook.chatmembers[id].end(), s); if(im == jhook.chatmembers[id].end()) { jhook.chatmembers[id].push_back(s); sort(jhook.chatmembers[id].begin(),jhook.chatmembers[id].end()); } } } else { icqcontact *c = clist.get(ic); if(c) { char prio = (char) jutil_priority(packet->x); // priority ust = jhook.process_presence(id, s, prio, ust); if(c->getstatus() != ust) { jhook.awaymsgs[ic.nickname] = ""; logger.putonline(c, c->getstatus(), ust); if(c->getstatus() == offline) { x = jutil_iqnew(JPACKET__GET, NS_DISCOINFO); xmlnode_put_attrib(x, "id", jab_getid(conn)); xmlnode_put_attrib(x, "to", from.c_str()); jab_send(conn, x); xmlnode_free(x); jhook.agents.push_back(agent(from, "", "", agent::atUnknown)); } c->setstatus(ust); } if(x = xmlnode_get_tag(packet->x, "status")) if(p = xmlnode_get_data(x)) jhook.awaymsgs[ic.nickname] = p; /*This code checking if user in your contacl list send update avatar request(presence message with another hash)*/ xmlnode y; if(x = xmlnode_get_tag(packet->x, "x")) if(p = xmlnode_get_attrib(x, "xmlns")) if(!strcmp(p, NS_VCARDUP)) if( y = xmlnode_get_tag(x, "photo")) //quering avatar hash if(p = xmlnode_get_data(y)) { icqcontact::basicinfo bi = c->getbasicinfo(); string temp_av = bi.avatar; if( justpathname( temp_av ).empty() ) temp_av = c->getdirname() + bi.avatar; string contact_dir = temp_av; if( !contact_dir.empty() ) { int ava_file = open( contact_dir.c_str(), O_RDONLY ); if( ava_file >= 0 ) { struct stat buf; fstat( ava_file, &buf ); long int file_size = buf.st_size; char *hash = (char*)calloc( 1, file_size+1 ); read( ava_file, hash, file_size ); close( ava_file ); unsigned char hashval[20]; char *pos; char final[41]; shaBlock((unsigned char *)hash, file_size, hashval); pos = final; int k; for(k=0;k<20;k++) { snprintf(pos, 3, "%02x", hashval[k]); pos += 2; } if( strcmp( p, final ) != 0 ) jhook.requestinfo(c); free(hash); } else jhook.requestinfo(c); } } #ifdef HAVE_GPGME if(x = xmlnode_get_tag(packet->x, "x")) if(p = xmlnode_get_attrib(x, "xmlns")) if((string) p == "jabber:x:signed") if(p = xmlnode_get_data(x)) c->setpgpkey(pgp.verify(p, jhook.awaymsgs[ic.nickname])); #endif } } break; case JPACKET_S10N: isagent = find(jhook.agents.begin(), jhook.agents.end(), from) != jhook.agents.end(); if(type == "subscribe") { if(!isagent) { em.store(imauthorization(ic, imevent::incoming, imauthorization::Request, _("The user wants to subscribe to your network presence updates"))); } else { char *cfrom = strdup(from.c_str()); x = jutil_presnew(JPACKET__SUBSCRIBED, cfrom, 0); jab_send(jhook.jc, x); xmlnode_free(x); free (cfrom); } } else if(type == "unsubscribe") { char *cfrom = strdup(from.c_str()); x = jutil_presnew(JPACKET__UNSUBSCRIBED, cfrom, 0); jab_send(jhook.jc, x); xmlnode_free(x); em.store(imnotification(ic, _("The user has removed you from his contact list (unsubscribed you, using the Jabber language)"))); free (cfrom); } break; default: break; } set::iterator idit; if ((idit = jhook.ignore_ids.find(packet_id)) != jhook.ignore_ids.end()) { // erase ignores for packets we've received jhook.ignore_ids.erase(idit); } } void jabberhook::jlogger(jconn conn, int inout, const char *p) { string tolog = (string) (inout ? "[IN]" : "[OUT]") + "\n"; tolog += p; face.log(tolog); } bool jabberhook::get_img_ext(const string &type, string &ext) { int pos; if(type.find("image/") != -1) { if((pos = type.find("/")) != -1) { ext = type.substr(pos+1); return true; } } ext = (string)""; return false; } bool jabberhook::get_base64_avatar(string &type, string &ava) { icqcontact *ic = clist.get(contactroot); icqcontact::basicinfo bi = ic->getbasicinfo(); string contact_dir = conf->getdirname(); if(!bi.avatar.empty()) { if( justpathname( bi.avatar ).empty() ) contact_dir += bi.avatar; else contact_dir = bi.avatar; string image_type = contact_dir; int pos; if( (pos = image_type.rfind( ".")) != -1 ) { type += (string)"image/" + image_type.substr(pos+1); int avatar_file = open( contact_dir.c_str(), O_RDONLY ); if( avatar_file >= 0 ) { struct stat buf; fstat( avatar_file, &buf ); long int file_size = buf.st_size; char *avatar_stream = (char*)calloc( 1, file_size+1 ); read( avatar_file, avatar_stream, file_size ); close( avatar_file ); char *temp = base64_encode(avatar_stream, file_size); ava = temp; free(temp); free(avatar_stream); return true; } } } return false; } bool jabberhook::get_my_avatar_hash(string &my_hash) { icqcontact *ic = clist.get(contactroot); icqcontact::basicinfo bi = ic->getbasicinfo(); string contact_dir = conf->getdirname(); if(!bi.avatar.empty()) { if( justpathname( bi.avatar ).empty() ) contact_dir += bi.avatar; else contact_dir = bi.avatar; int ava_file = open( contact_dir.c_str(), O_RDONLY ); if( ava_file >= 0 ) { struct stat buf; fstat( ava_file, &buf ); long int file_size = buf.st_size; char *hash = (char*)calloc( 1, file_size+1 ); read( ava_file, hash, file_size ); close( ava_file ); unsigned char hashval[20]; char *pos; char final[41]; shaBlock((unsigned char *)hash, file_size, hashval); pos = final; int k; for(k=0;k<20;k++) { snprintf(pos, 3, "%02x", hashval[k]); pos += 2; } my_hash = final; free(hash); return true; } } return false; } bool jabberhook::url_port_get(const string &full_url, string &url, int &port, string &tail, string &filename) { int pos; url = full_url; string temp; if( (pos = url.find(":")) != -1) { if((pos = url.find(":", pos+1)) != -1) { temp = url.substr(pos+1); if((pos = temp.find("/")) != -1) { tail = temp.substr(pos); temp.erase(pos); port = atoi(temp.c_str()); if((pos = tail.rfind("/")) != -1) { filename = tail.substr(pos+1); url = url.substr(7); //remove http:// if((pos = url.find(":")) != -1) { url.erase(pos); //remove after :port/ return true; } } } } } return false; } void jabberhook::send_file(const string &cjid) //http sendfile { int ptpmin, ptpmax; vector files = srfiles[cjid].first.getfiles(); int ir = srfiles[cjid].second.second; string full_jid = jhook.full_jids[cjid]; if( ir < files.size() ) { struct send_file *file = (struct send_file *)srfiles[cjid].second.first; xmlnode x, y; x = jutil_iqnew(JPACKET__SET, NS_OOB); xmlnode_put_attrib(x, "from", getourjid().c_str()); xmlnode_put_attrib(x, "to", full_jid.c_str()); string new_id = (string)"centerim" + i2str(rand()); xmlnode_put_attrib(x, "id", new_id.c_str()); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "url"); conf->getpeertopeer(ptpmin, ptpmax); //getting max and min port range jabber_send_file(jhook.jc, files[ir].fname.c_str(), files[ir].size, file, strdup(cjid.c_str()), &progressbar, ptpmin, ptpmax ); //real send fuction, starting server string send_url = (string)"http://" + file->host + (string)":" + i2str(file->port) + (string)"/" + justfname(files[ir].fname); xmlnode_insert_cdata(y, send_url.c_str(), (unsigned) -1 ); xmlnode k; k = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "desc"); string desc = "File size: " + i2str(files[ir].size); xmlnode_insert_cdata(k, desc.c_str(), (unsigned) -1 ); if(x) { jab_send(jc, x); xmlnode_free(x); } } } bool jabberhook::knowntransfer(const imfile &fr) const { return transferinfo.find(fr) != transferinfo.end(); } void jabberhook::replytransfer(const imfile &fr, bool accept, const string &localpath) { struct send_file *file = (struct send_file *)transferinfo[fr].first; if(accept) { transferinfo[fr].second = localpath; if(transferinfo[fr].second.substr(transferinfo[fr].second.size()-1) != "/") transferinfo[fr].second += "/"; transferinfo[fr].second += justfname(fr.getfiles().begin()->fname); if(file) { if(file->transfer_type == 0) //socks5 file transfer jhook.bytenegotiat(fr); if(file->transfer_type == 1) //http file transfer getfile(fr); } } else { clean_up_file(fr, 0); } } void jabberhook::aborttransfer(const imfile &fr) {//overloaded function to aborting filetransfers if( fr.getdirection() == imevent::incoming ) { if( transferinfo.find(fr) != transferinfo.end() ) { face.transferupdate(fr.getfiles().begin()->fname, fr,icqface::tsCancel, 0, 0); clean_up_file(fr, 0); //do some cleanups } } else { string sr = back_srfiles[fr]; if( back_srfiles.find(fr) != back_srfiles.end() ) { vector files = fr.getfiles(); face.transferupdate(files[srfiles[sr].second.second].fname, fr,icqface::tsCancel, 0, 0); clean_up_file(fr, 1, (char*)sr.c_str()); //do some cleanups } } } void jabberhook::progressbar(void *file, long int bytes, long int size, int status, int conn_type ) { //conn_type - litle trick to easy determine send or recieve conn. type char *jid = (char*)file; if( conn_type == 0 ) { if( jhook.transferusers.find(jid) != jhook.transferusers.end() ) { imfile fr = jhook.transferusers[jid]; switch(status) { case 0: face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsProgress, size, bytes); break; case 1: face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsFinish, size, 0); jhook.clean_up_file(fr, 0); break; default: face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsError, 0, 0); jhook.clean_up_file(fr, 0); break; } } } else if( conn_type == 1 ) { if( jhook.srfiles.find(jid) != jhook.srfiles.end() ) { imfile fr = jhook.srfiles[jid].first; vector files = fr.getfiles(); int ir = jhook.srfiles[jid].second.second; if( files.size() > ir ) { switch(status) { case 0: face.transferupdate(files[ir].fname, fr, icqface::tsProgress, size, bytes); break; case 1: face.transferupdate(files[ir].fname, fr, icqface::tsFinish, size, 0); // ir++; jhook.srfiles[jid].second.second++; if( files.size() > ir ) jhook.send_file(jid); else jhook.clean_up_file(fr, 1, jid); break; default: face.transferupdate(files[ir].fname, fr, icqface::tsError, 0, 0); jhook.clean_up_file(fr, 1, jid); break; } } } } } void jabberhook::file_transfer_request(const imcontact &ic, xmlnode i) { //stream initialization request xep-0066 char *p; char *filename, *filesize, *id; xmlnode x, z; p = xmlnode_get_attrib(i, "id"); if(p) id = p; else return; x = xmlnode_get_tag(i, "si"); z = xmlnode_get_tag(x, "file"); p = xmlnode_get_attrib(z, "name"); if(p) filename = p; else return; p = xmlnode_get_attrib(z, "size"); if(p) filesize = p; else return; struct send_file *trans_file = (struct send_file *)malloc( sizeof( struct send_file ) ); trans_file->full_jid_name = strdup( jhook.full_jids[jidnormalize(ic.nickname).c_str()].c_str() ); trans_file->id = strdup(id); trans_file->host = NULL; trans_file->url = NULL; trans_file->sid_from_to = NULL; trans_file->transfer_type = 0; imfile::record r; //get filename and filesize from request r.fname = filename; r.size = atoi(filesize); imfile fr(ic, imevent::incoming, "", vector(1, r)); jhook.transferinfo[fr].first = trans_file; transferusers[jidnormalize(ic.nickname)] = fr; //little hack em.store(fr); face.transferupdate(r.fname, fr, icqface::tsInit, r.size, 0); } void jabberhook::bytenegotiat(const imfile &fr) { //stream initialization result (xep-0066) for socks 5 bytestreams if( transferinfo.find(fr) != transferinfo.end() ) { struct send_file *file = (struct send_file *)transferinfo[fr].first; char *cjid = file->full_jid_name; char *id = file->id; xmlnode x0, x, q, w, e, y, z; x0 = jutil_iqnew2(JPACKET__RESULT); xmlnode_put_attrib(x0, "to", cjid); xmlnode_put_attrib(x0, "from", getourjid().c_str()); xmlnode_put_attrib(x0, "id", id ); y = xmlnode_insert_tag(x0, "si"); xmlnode_put_attrib(y, "xmlns", NS_SI); z = xmlnode_insert_tag(xmlnode_get_tag(x0,"si"), "feature"); xmlnode_put_attrib(z, "xmlns", NS_NEG); x = xmlnode_insert_tag(z, "x"); xmlnode_put_attrib(x, "xmlns", NS_DATA); xmlnode_put_attrib(x, "type", "submit"); q = xmlnode_insert_tag(x, "field"); xmlnode_put_attrib(q, "var", "stream-method"); w = xmlnode_insert_tag(q, "value"); xmlnode_insert_cdata(w, NS_BYTESTREAMS, (unsigned) -1 ); jab_send(jc, x0); xmlnode_free(x0); } } void jabberhook::reject_file(const imfile &fr) { //don't want to recieve file . xep-0065(socks5 bytestream) if( transferinfo.find(fr) != transferinfo.end() ) { struct send_file *file = (struct send_file *)transferinfo[fr].first; xmlnode x0 = jutil_iqnew2(JPACKET__RESULT), y,z; xmlnode_put_attrib(x0, "to", file->full_jid_name); xmlnode_put_attrib(x0, "from", getourjid().c_str()); xmlnode_put_attrib(x0, "id", file->id); jab_send(jc, x0); xmlnode_free(x0); } } void jabberhook::getfile_result(const imfile &fr) { //socks5 bytestream activation request xep-0065 //prepare acknowledge packageto reciever if( transferinfo.find(fr) != transferinfo.end() ) { struct send_file *file = (struct send_file *)transferinfo[fr].first; if(file) { if( file->full_jid_name && file->id ) { xmlnode x = jutil_iqnew(JPACKET__RESULT, NS_BYTESTREAMS), y; xmlnode_put_attrib(x, "to", file->full_jid_name); xmlnode_put_attrib(x, "from", getourjid().c_str()); xmlnode_put_attrib(x, "id", file->id ); y = xmlnode_insert_tag(xmlnode_get_tag(x,"query"), "streamhost-used"); xmlnode_put_attrib(y, "jid", file->full_jid_name ); jab_send(jc, x); xmlnode_free(x); } } } } void jabberhook::getfile_http(const imcontact &ic, xmlnode i) { //xep-0066 string full_url, host, url, filename; int port; char *p; char *id; xmlnode x, y; p = xmlnode_get_attrib(i, "id"); if(p) id = p; else return; x = xmlnode_get_tag(i, "query"); y = xmlnode_get_tag(x, "url"); p = xmlnode_get_data(y); if(p) full_url = p; else return; struct send_file *trans_file = (struct send_file *)malloc( sizeof( struct send_file ) ); trans_file->full_jid_name = strdup( jhook.full_jids[jidnormalize(ic.nickname).c_str()].c_str() ); trans_file->id = strdup(id); if( url_port_get(full_url, host, port, url, filename) ) { trans_file->host = strdup(host.c_str()); trans_file->url = strdup(url.c_str()); trans_file->port = port; trans_file->sid_from_to = NULL; trans_file->transfer_type = 1; } imfile::record r; r.fname = filename; r.size = -1; //http initialization request over xmpp we don't know filesize :( imfile fr(ic, imevent::incoming, "", vector(1, r)); jhook.transferinfo[fr].first = trans_file; transferusers[jidnormalize(ic.nickname)] = fr; //little hack to create association imfile with JID em.store(fr); face.transferupdate(r.fname, fr, icqface::tsInit, r.size, 0); } void jabberhook::getfile(const imfile &fr) { if( transferinfo.find(fr) != transferinfo.end() ) { face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsStart, 0, 0); struct send_file *file = (struct send_file *)transferinfo[fr].first; if(file) { if( file->transfer_type == 0 )//bytestream method { #ifdef HAVE_THREAD jabber_get_file(jhook.jc, transferinfo[fr].second.c_str(), fr.getfiles().begin()->size, file, strdup( jidtodisp(file->full_jid_name).c_str() ), &progressbar); jhook.getfile_result(fr); #endif } else if( file->transfer_type == 1 )//http GET method { #ifdef HAVE_THREAD jabber_get_file(jhook.jc, transferinfo[fr].second.c_str(), fr.getfiles().begin()->size, file, strdup( jidtodisp(file->full_jid_name).c_str() ), &progressbar); #endif } } } } //parse bytestream xmpp request void jabberhook::getfile_byte(const imcontact &ic, xmlnode i) { char *host, *jid, *sid; int port; char *p; xmlnode x, z; x = xmlnode_get_tag(i, "query"), z; p = xmlnode_get_attrib(x, "sid"); if(p) sid = p; else return; z = xmlnode_get_tag(x, "streamhost"); p = xmlnode_get_attrib(z, "host"); if(p) host = p; else return; p = xmlnode_get_attrib(z, "jid"); if(p) jid = p; else return; p = xmlnode_get_attrib(z, "port"); if(p) port = atoi(p); else return; string sid_from_to = (string)sid + (string)jid + getourjid() ; imfile fr = transferusers[jidnormalize(ic.nickname)]; if( transferinfo.find(fr) != transferinfo.end() ) { struct send_file *file = (struct send_file *)transferinfo[fr].first; file->sid_from_to = strdup( sid_from_to.c_str() ); file->port = port; file->host = strdup( host ); file->url = NULL; getfile(fr); } } void jabberhook::clean_up_file(const imfile &fr, int trans_type, char *cjid ) { struct send_file *file; if(trans_type == 0) { if(transferinfo.find(fr) != transferinfo.end()) file = (struct send_file *)transferinfo[fr].first; else return; } else if(trans_type == 1) { if(!cjid) return; if(srfiles.find(cjid) != srfiles.end()) file = (struct send_file *)srfiles[cjid].second.first; else return; } else return; if(file) { #ifdef HAVE_THREAD pthread_cancel(file->thread); #endif if(file->full_jid_name) { if(trans_type == 0) transferusers.erase(jidtodisp(file->full_jid_name)); else if(trans_type == 1) back_srfiles.erase(srfiles[cjid].first); free(file->full_jid_name); } if(file->id) free(file->id); if(file->host) free(file->host); if(file->url) free(file->url); if(file->sid_from_to) free(file->sid_from_to); free(file); if(trans_type == 0) transferinfo[fr].first = NULL; else if (trans_type == 1) srfiles[cjid].second.first = NULL; } if(trans_type == 0) transferinfo.erase(fr); if(trans_type == 1) srfiles.erase(cjid); } #endif centerim-4.22.10/src/hooks/aimhook.cc0000644000175000001440000003041611461606612014262 00000000000000/* * * centerim AIM protocol handling class * $Id: aimhook.cc,v 1.42 2004/11/11 13:42:05 konst Exp $ * * Copyright (C) 2001 by Konstantin Klyagin * * 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 "aimhook.h" #ifdef BUILD_AIM #include "icqgroups.h" #include "icqface.h" #include "accountmanager.h" #include "icqcontacts.h" #include "imlogger.h" #include "eventmanager.h" #include "centerim.h" #define NOTIFBUF 512 aimhook ahook; aimhook::aimhook() : abstracthook(aim), fonline(false), flogged(false), handle(0), ourstatus(offline) { fcapabs.insert(hookcapab::setaway); fcapabs.insert(hookcapab::changepassword); fcapabs.insert(hookcapab::changedetails); fcapabs.insert(hookcapab::directadd); fcapabs.insert(hookcapab::changeabout); } aimhook::~aimhook() { } void aimhook::init() { manualstatus = conf->getstatus(aim); } void aimhook::connect() { icqconf::imaccount acc = conf->getourid(aim); log(logConnecting); if(handle) { firetalk_register_callback(handle, FC_DISCONNECT, 0); firetalk_disconnect(handle); firetalk_destroy_handle(handle); } handle = firetalk_create_handle(firetalk_find_protocol("TOC2"), 0); firetalk_register_callback(handle, FC_CONNECTED, &connected); firetalk_register_callback(handle, FC_CONNECTFAILED, &connectfailed); firetalk_register_callback(handle, FC_DISCONNECT, &disconnected); firetalk_register_callback(handle, FC_PASSCHANGED, &newpass); firetalk_register_callback(handle, FC_IM_GOTINFO, &gotinfo); firetalk_register_callback(handle, FC_IM_GETMESSAGE, &getmessage); firetalk_register_callback(handle, FC_IM_GETACTION, &getmessage); firetalk_register_callback(handle, FC_IM_BUDDYONLINE, &buddyonline); firetalk_register_callback(handle, FC_IM_BUDDYOFFLINE, &buddyoffline); firetalk_register_callback(handle, FC_IM_BUDDYAWAY, &buddyaway); firetalk_register_callback(handle, FC_IM_BUDDYUNAWAY, &buddyonline); firetalk_register_callback(handle, FC_NEEDPASS, &needpass); firetalk_register_callback(handle, FC_IM_LISTBUDDY, &listbuddy); fonline = firetalk_signon(handle, acc.server.c_str(), acc.port, acc.nickname.c_str()) == FE_SUCCESS; if(fonline) { flogged = false; } else { face.log(_("+ [aim] unable to connect to the server")); } } void aimhook::disconnect() { if(fonline) { firetalk_disconnect(handle); } } void aimhook::exectimers() { } void aimhook::main() { firetalk_select(); } void aimhook::getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const { int *r, *w, *e, *sr, *sw, *se; firetalk_getsockets(firetalk_find_protocol("TOC2"), &sr, &sw, &se); for(r = sr; *r; r++) { if(*r > hsocket) hsocket = *r; FD_SET(*r, &rfds); } for(w = sw; *w; w++) { if(*w > hsocket) hsocket = *w; FD_SET(*w, &wfds); } for(e = se; *e; e++) { if(*e > hsocket) hsocket = *e; FD_SET(*e, &efds); } delete sr; delete sw; delete se; } bool aimhook::isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const { bool res = false; int *r, *w, *e, *sr, *sw, *se; if(online()) { firetalk_getsockets(firetalk_find_protocol("TOC2"), &sr, &sw, &se); for(r = sr; *r; r++) res = res || FD_ISSET(*r, &rfds); for(w = sw; *w; w++) res = res || FD_ISSET(*w, &wfds); for(e = se; *e; e++) res = res || FD_ISSET(*e, &efds); delete sr; delete sw; delete se; } return res; } bool aimhook::online() const { return fonline; } bool aimhook::logged() const { return flogged && fonline; } bool aimhook::isconnecting() const { return fonline && !flogged; } bool aimhook::enabled() const { return true; } bool aimhook::send(const imevent &ev) { icqcontact *c = clist.get(ev.getcontact()); string text; if(c) if(c->getstatus() != offline || !c->inlist()) { if(ev.gettype() == imevent::message) { const immessage *m = static_cast(&ev); if(m) text = rushtmlconv("kw", m->gettext()); } else if(ev.gettype() == imevent::url) { const imurl *m = static_cast(&ev); if(m) text = rushtmlconv("kw", m->geturl()) + "\n\n" + rushtmlconv("kw", m->getdescription()); } return firetalk_im_send_message(handle, c->getdesc().nickname.c_str(), text.c_str(), 0) == FE_SUCCESS; } return false; } void aimhook::sendnewuser(const imcontact &ic) { if(logged()) if(find(buddies.begin(), buddies.end(), ic.nickname) == buddies.end()) { log(logContactAdd, ic.nickname.c_str()); vector::const_iterator ig = find(groups.begin(), groups.end(), clist.get(ic)->getgroupid()); if(ig != groups.end()) { firetalk_im_add_buddy(handle, ic.nickname.c_str(), ig->getname().c_str(), ""); } /*firetalk_save_config(handle);*/ requestinfo(ic); } } void aimhook::removeuser(const imcontact &ic) { removeuser(ic, true); } void aimhook::removeuser(const imcontact &ic, bool report) { if(online()) { if(report) log(logContactRemove, ic.nickname.c_str()); firetalk_im_remove_buddy(handle, ic.nickname.c_str()); /*firetalk_save_config(handle);*/ } } void aimhook::setautostatus(imstatus st) { if(st != offline) { if(getstatus() == offline) { connect(); } else { if(getstatus() != st) { logger.putourstatus(aim, getstatus(), ourstatus = st); switch(st) { case away: case notavail: case occupied: case outforlunch: firetalk_set_away(handle, rusconv("kw", conf->getawaymsg(aim)).c_str(), 0); break; default: firetalk_set_away(handle, 0, 0); break; } } } } else { if(getstatus() != offline) { disconnect(); } } face.update(); } imstatus aimhook::getstatus() const { return (flogged && fonline) ? ourstatus : offline; } void aimhook::requestinfo(const imcontact &c) { if(c != imcontact(conf->getourid(aim).nickname, aim)) { icqcontact *cc = clist.get(c); if(cc) if(cc->getstatus() != offline) firetalk_im_get_info(handle, c.nickname.c_str()); } else { /* * * Our own details set has been requested * */ icqcontact *cc = clist.get(contactroot); icqconf::imaccount acc = conf->getourid(aim); loadprofile(); cc->setabout(profile.info); cc->setnick(acc.nickname); } } void aimhook::sendupdateuserinfo(icqcontact &c) { icqconf::imaccount acc = conf->getourid(aim); if(!c.getreginfo().password.empty()) if(c.getreginfo().password != acc.password) firetalk_set_password(handle, acc.password.c_str(), c.getreginfo().password.c_str()); profile.info = c.getabout(); firetalk_set_info(handle, profile.info.c_str()); saveprofile(); } void aimhook::saveprofile() { ofstream f((conf->getconfigfname("aim-profile")).c_str()); if(f.is_open()) { f << profile.info; f.close(); } } void aimhook::loadprofile() { string buf, fname; profile = ourprofile(); fname = conf->getconfigfname("aim-profile"); if(access(fname.c_str(), R_OK)) { char sbuf[NOTIFBUF]; snprintf(sbuf, NOTIFBUF, _("I do really enjoy the default AIM profile of centerim %s."), centerim::version); profile.info = sbuf; saveprofile(); } ifstream f(fname.c_str()); if(f.is_open()) { while(!f.eof()) { getstring(f, buf); if(!profile.info.empty()) profile.info += "\n"; profile.info += buf; } } } void aimhook::resolve() { int i; icqcontact *c; for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getdesc().pname == aim) if(c->getabout().empty()) { requestinfo(c); } } } // ---------------------------------------------------------------------------- void aimhook::connected(void *connection, void *cli, ...) { ahook.flogged = true; ahook.log(logLogged); face.update(); ahook.ourstatus = available; ahook.setautostatus(ahook.manualstatus); ahook.loadprofile(); firetalk_set_info(ahook.handle, ahook.profile.info.c_str()); firetalk_im_list_buddies(ahook.handle); ahook.resolve(); face.update(); } void aimhook::disconnected(void *connection, void *cli, ...) { ahook.fonline = false; logger.putourstatus(aim, ahook.getstatus(), offline); clist.setoffline(aim); ahook.log(logDisconnected); face.update(); } void aimhook::connectfailed(void *connection, void *cli, ...) { va_list ap; string msg; va_start(ap, cli); int err = va_arg(ap, int); char *reason = va_arg(ap, char *); va_end(ap); ahook.fonline = false; if(err) msg = firetalk_strerror((const fte_t)err); if(msg.size() && reason) msg += (string) ", " + reason; logger.putmessage((string) _("aim connection failed") + ": " + msg); face.log(_("+ [aim] connect failed: %s"), msg.c_str()); face.update(); } void aimhook::newpass(void *connection, void *cli, ...) { va_list ap; va_start(ap, cli); char *pass = va_arg(ap, char *); va_end(ap); if(pass) if(strlen(pass)) { icqconf::imaccount acc = conf->getourid(aim); acc.password = pass; conf->setourid(acc); ahook.log(logPasswordChanged); } } void aimhook::gotinfo(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *nick = va_arg(ap, char *); char *info = va_arg(ap, char *); int warning = va_arg(ap, int); int idle = va_arg(ap, int); va_end(ap); if(nick && info) if(strlen(nick) && strlen(info)) { icqcontact *c = clist.get(imcontact(nick, aim)); if(c) { c->setabout(cuthtml(info, chCutBR | chLeaveLinks)); if(c->getabout().empty()) c->setabout(_("The user has no profile information.")); } } } void aimhook::getmessage(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *sender = va_arg(ap, char *); int automessage_flag = va_arg(ap, int); char *message = va_arg(ap, char *); va_end(ap); if(sender && message) if(strlen(sender) && strlen(message)) { em.store(immessage(imcontact(sender, aim), imevent::incoming, ahook.rushtmlconv("wk", cuthtml(message, chCutBR | chLeaveLinks)))); } } void aimhook::userstatus(const string &nickname, imstatus st) { if(!nickname.empty()) { imcontact ic(nickname, aim); icqcontact *c = clist.get(ic); if(!c) { c = clist.addnew(ic, false); } if(st != c->getstatus()) { logger.putonline(ic, c->getstatus(), st); c->setstatus(st); } } } void aimhook::buddyonline(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *nick = va_arg(ap, char *); va_end(ap); if(nick) if(strlen(nick)) { ahook.userstatus(nick, available); } } void aimhook::buddyoffline(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *nick = va_arg(ap, char *); va_end(ap); if(nick) if(strlen(nick)) { ahook.userstatus(nick, offline); } } void aimhook::buddyaway(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *nick = va_arg(ap, char *); char *msg = va_arg(ap, char *); va_end(ap); if(nick) if(strlen(nick)) { ahook.userstatus(nick, away); } } void aimhook::needpass(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *pass = va_arg(ap, char *); int size = va_arg(ap, int); va_end(ap); if(pass) { icqconf::imaccount acc = conf->getourid(aim); strncpy(pass, acc.password.c_str(), size-1); pass[size-1] = 0; face.log(_("+ [aim] password sent")); } } void aimhook::listbuddy(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *nickname = va_arg(ap, char *); char online = va_arg(ap, int); char away = va_arg(ap, int); long idletime = va_arg(ap, long); va_end(ap); if(nickname) { ahook.buddies.push_back(nickname); imcontact cont(nickname, aim); if(!clist.get(cont)) clist.addnew(cont, false); } } #endif centerim-4.22.10/src/hooks/ljhook.cc0000644000175000001440000004753111461606612014127 00000000000000/* * * centerim livejournal protocol handling class (sick) * $Id: ljhook.cc,v 1.28 2004/11/11 13:42:05 konst Exp $ * * Copyright (C) 2003-2004 by Konstantin Klyagin * * 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 "icqcommon.h" #ifdef BUILD_LJ #include #include "ljhook.h" #include "rsshook.h" #include "icqface.h" #include "eventmanager.h" #include "icqcontacts.h" #include ljhook lhook; #define PERIOD_FRIENDS 3600 #define NOTIFBUF 512 ljhook::ljhook(): abstracthook(livejournal), fonline(false), sdest(0) { fcapabs.insert(hookcapab::nochat); } ljhook::~ljhook() { } void ljhook::init() { manualstatus = conf->getstatus(proto); httpcli.messageack.connect(this, &ljhook::messageack_cb); httpcli.socket.connect(this, &ljhook::socket_cb); if(conf->getdebug()) httpcli.logger.connect(this, &ljhook::logger_cb); journals = vector(1, conf->getourid(proto).nickname); } void ljhook::connect() { icqconf::imaccount acc = conf->getourid(proto); baseurl = acc.server + ":" + i2str(acc.port) + "/interface/flat"; md5pass = getmd5(acc.password); log(logConnecting); httpcli.setProxyServerHost(conf->gethttpproxyhost()); httpcli.setProxyServerPort(conf->gethttpproxyport()); if(!conf->gethttpproxyuser().empty()) { httpcli.setProxyServerUser(conf->gethttpproxyuser()); httpcli.setProxyServerPasswd(conf->gethttpproxypasswd()); } HTTPRequestEvent *ev = new HTTPRequestEvent(baseurl, HTTPRequestEvent::POST); ev->addParam("mode", "login"); ev->addParam("user", username = acc.nickname); ev->addParam("hpassword", md5pass); ev->addParam("getmoods", "1"); ev->addParam("getpickws", "1"); struct utsname un; string clientver; if(!uname(&un)) clientver = un.sysname; else clientver = "GNU"; clientver += string("-") + PACKAGE + "/" + centerim::version; ev->addParam("clientversion", clientver); self = imcontact(username + "@lj", livejournal); fonline = true; sent[ev] = reqLogin; httpcli.SendEvent(ev); moods = vector(1, ""); pictures = vector(1, ""); } void ljhook::disconnect() { if(fonline) { fonline = false; log(logDisconnected); if(flogged) { flogged = false; icqcontact *c = clist.get(self); if(c) c->setstatus(offline); } } } void ljhook::exectimers() { if(logged()) if(timer_current-timer_getfriends >= PERIOD_FRIENDS) { requestfriends(); timer_getfriends = timer_current; } } void ljhook::main() { vector::iterator i; struct timeval tv; int hsock; fd_set rs, ws, es; FD_ZERO(&rs); FD_ZERO(&ws); FD_ZERO(&es); tv.tv_sec = tv.tv_usec = 0; hsock = 0; for(i = rfds.begin(); i != rfds.end(); ++i) { FD_SET(*i, &rs); hsock = max(hsock, *i); } for(i = wfds.begin(); i != wfds.end(); ++i) { FD_SET(*i, &ws); hsock = max(hsock, *i); } for(i = efds.begin(); i != efds.end(); ++i) { FD_SET(*i, &es); hsock = max(hsock, *i); } if(select(hsock+1, &rs, &ws, &es, &tv) > 0) { for(i = rfds.begin(); i != rfds.end(); ++i) { if(FD_ISSET(*i, &rs)) { httpcli.socket_cb(*i, SocketEvent::READ); break; } } for(i = wfds.begin(); i != wfds.end(); ++i) { if(FD_ISSET(*i, &ws)) { httpcli.socket_cb(*i, SocketEvent::WRITE); break; } } for(i = efds.begin(); i != efds.end(); ++i) { if(FD_ISSET(*i, &es)) { httpcli.socket_cb(*i, SocketEvent::EXCEPTION); break; } } } } void ljhook::getsockets(fd_set &rs, fd_set &ws, fd_set &es, int &hsocket) const { vector::const_iterator i; for(i = rfds.begin(); i != rfds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &rs); } for(i = wfds.begin(); i != wfds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &ws); } for(i = efds.begin(); i != efds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &es); } } bool ljhook::isoursocket(fd_set &rs, fd_set &ws, fd_set &es) const { vector::const_iterator i; for(i = rfds.begin(); i != rfds.end(); ++i) if(FD_ISSET(*i, &rs)) return true; for(i = wfds.begin(); i != wfds.end(); ++i) if(FD_ISSET(*i, &ws)) return true; for(i = efds.begin(); i != efds.end(); ++i) if(FD_ISSET(*i, &es)) return true; return false; } bool ljhook::online() const { return fonline; } bool ljhook::logged() const { return fonline && flogged; } bool ljhook::isconnecting() const { return fonline && !flogged; } bool ljhook::enabled() const { return true; } bool ljhook::send(const imevent &asev) { if(!logged()) return false; bool ret = false; imevent *sev; if(asev.gettype() == imevent::xml) sev = asev.getevent(); else { sev = new imxmlevent(asev.getcontact(), asev.getdirection(), asev.gettext()); static_cast(sev)->setfield("_eventkind", "posting"); } if(sev->gettype() == imevent::xml) { const imxmlevent *m = static_cast (sev); HTTPRequestEvent *ev = 0; if(m->getfield("_eventkind") == "posting") { ev = new HTTPRequestEvent(baseurl, HTTPRequestEvent::POST); ev->addParam("mode", "postevent"); ev->addParam("user", username); ev->addParam("hpassword", md5pass); ev->addParam("event", rusconv("ku", m->gettext())); ev->addParam("ver", "1"); time_t t = m->gettimestamp(); struct tm *tm = localtime(&t); ev->addParam("year", i2str(tm->tm_year+1900)); ev->addParam("mon", i2str(tm->tm_mon+1)); ev->addParam("day", i2str(tm->tm_mday)); ev->addParam("hour", i2str(tm->tm_hour)); ev->addParam("min", i2str(tm->tm_min)); ev->addParam("lineendings", "unix"); ev->addParam("security", m->getfield("security")); ev->addParam("allowmask", "0"); if(!m->field_empty("journal")) ev->addParam("usejournal", m->getfield("journal")); if(!m->field_empty("subject")) ev->addParam("subject", rusconv("ku", m->getfield("subject"))); if(!m->field_empty("mood")) ev->addParam("prop_current_mood", rusconv("ku", m->getfield("mood"))); if(!m->field_empty("music")) ev->addParam("prop_current_music", rusconv("ku", m->getfield("music"))); if(!m->field_empty("taglist")) ev->addParam("prop_taglist", rusconv("ku", m->getfield("taglist"))); if(!m->field_empty("picture")) ev->addParam("prop_picture_keyword", m->getfield("picture")); if(!m->field_empty("preformatted")) ev->addParam("prop_opt_preformatted", "1"); if(!m->field_empty("nocomments")) ev->addParam("prop_opt_nocomments", "1"); if(!m->field_empty("backdated")) ev->addParam("prop_opt_backdated", "1"); if(!m->field_empty("noemail")) ev->addParam("prop_opt_noemail", "1"); sent[ev] = reqPost; } else if(m->getfield("_eventkind") == "comment") { icqconf::imaccount acc = conf->getourid(proto); string journal = clist.get(sev->getcontact())->getnick(); journal.erase(journal.find("@")); ev = new HTTPRequestEvent(acc.server + ":" + i2str(acc.port) + "/talkpost_do.bml", HTTPRequestEvent::POST); ev->addParam("parenttalkid", "0"); ev->addParam("itemid", m->getfield("replyto")); ev->addParam("journal", journal); ev->addParam("usertype", "user"); ev->addParam("userpost", acc.nickname); ev->addParam("password", acc.password); ev->addParam("do_login", "0"); ev->addParam("subject", ""); ev->addParam("body", rusconv("ku", sev->gettext())); ev->addParam("subjecticon", "none"); ev->addParam("prop_opt_preformatted", "1"); ev->addParam("submitpost", "1"); ev->addParam("do_spellcheck", "0"); sent[ev] = reqPostComment; } if(ev) { httpcli.SendEvent(ev); ret = true; } } delete sev; return ret; } void ljhook::sendnewuser(const imcontact &ic) { int npos; icqcontact *c; if(logged()) if(ic.pname == rss) if(c = clist.get(ic)) if((npos = c->getnick().find("@lj")) != -1) { HTTPRequestEvent *ev = new HTTPRequestEvent(baseurl, HTTPRequestEvent::POST); ev->addParam("mode", "editfriends"); ev->addParam("user", username); ev->addParam("hpassword", md5pass); ev->addParam("editfriend_add_1_user", c->getnick().substr(0, npos)); sent[ev] = reqAddFriend; httpcli.SendEvent(ev); } } void ljhook::removeuser(const imcontact &ic) { int npos; icqcontact *c; if(logged()) if(conf->getourid(proto).additional["importfriends"] == "1") if(c = clist.get(ic)) if((npos = c->getnick().find("@lj")) != -1) { string nick = c->getnick().substr(0, npos); if(c->getworkinfo().homepage == getfeedurl(nick)) { HTTPRequestEvent *ev = new HTTPRequestEvent(baseurl, HTTPRequestEvent::POST); ev->addParam("mode", "editfriends"); ev->addParam("user", username); ev->addParam("hpassword", md5pass); ev->addParam((string) "editfriend_delete_" + nick, "1"); sent[ev] = reqDelFriend; httpcli.SendEvent(ev); } } } void ljhook::setautostatus(imstatus st) { if(st == offline) { if(getstatus() != offline) disconnect(); } else { if(getstatus() == offline) connect(); } } imstatus ljhook::getstatus() const { return flogged ? available : offline; } void ljhook::requestinfo(const imcontact &ic) { int npos; icqcontact *c = clist.get(ic); if(c) { icqcontact::moreinfo m = c->getmoreinfo(); if((npos = c->getnick().find("@lj")) != -1) { m.homepage = getfeedurl(c->getnick().substr(0, npos)); c->setmoreinfo(m); } } } void ljhook::lookup(const imsearchparams ¶ms, verticalmenu &dest) { while(!foundguys.empty()) { delete foundguys.back(); foundguys.pop_back(); } if(params.reverse) { icqcontact *c = clist.get(self); if(c) { string lst = c->getbasicinfo().zip, buf; while(!(buf = getword(lst)).empty()) { imcontact ic(0, rss); ic.nickname = getfeedurl(buf); c = new icqcontact(ic); c->setnick(buf + "@lj"); c->setdispnick(c->getnick()); c->excludefromlist(); dest.additem(conf->getcolor(cp_clist_rss), c, (string) " " + c->getnick()); foundguys.push_back(c); } face.findready(); face.log(_("+ [lj] user lookup finished")); dest.redraw(); } } else { HTTPRequestEvent *ev = new HTTPRequestEvent(getfeedurl(params.nick)); sent[ev] = reqLookup; httpcli.SendEvent(ev); sdest = &dest; lookfor = params.nick; } } void ljhook::stoplookup() { sdest = 0; } void ljhook::requestawaymsg(const imcontact &c) { } void ljhook::requestversion(const imcontact &c) { } void ljhook::ping(const imcontact &c) { } void ljhook::ouridchanged(const icqconf::imaccount &ia) { } void ljhook::updatecontact(icqcontact *c) { } // ---------------------------------------------------------------------------- void ljhook::requestfriends() { HTTPRequestEvent *ev = new HTTPRequestEvent(baseurl, HTTPRequestEvent::POST); ev->addParam("mode", "getfriends"); ev->addParam("user", username); ev->addParam("hpassword", md5pass); ev->addParam("includefriendof", "1"); ev->addParam("includebdays", "1"); sent[ev] = reqGetFriends; httpcli.SendEvent(ev); } // ---------------------------------------------------------------------------- void ljhook::socket_cb(SocketEvent *ev) { vector::iterator i; if(dynamic_cast(ev)) { AddSocketHandleEvent *cev = dynamic_cast(ev); if(cev->isRead()) rfds.push_back(cev->getSocketHandle()); if(cev->isWrite()) wfds.push_back(cev->getSocketHandle()); if(cev->isException()) efds.push_back(cev->getSocketHandle()); } else if(dynamic_cast(ev)) { RemoveSocketHandleEvent *cev = dynamic_cast(ev); i = find(rfds.begin(), rfds.end(), cev->getSocketHandle()); if(i != rfds.end()) rfds.erase(i); i = find(wfds.begin(), wfds.end(), cev->getSocketHandle()); if(i != wfds.end()) wfds.erase(i); i = find(efds.begin(), efds.end(), cev->getSocketHandle()); if(i != efds.end()) efds.erase(i); } } void ljhook::messageack_cb(MessageEvent *ev) { HTTPRequestEvent *rev = dynamic_cast(ev); if(!rev) return; map::iterator ie = sent.find(rev); if(ie == sent.end()) return; int npos, count, i, k; string content = rev->getContent(), pname; map params; icqcontact *c; if(ie->second != reqLookup) { if(!ev->isDelivered() || content.empty()) { pname = rev->getHTTPResp(); if(pname.empty()) pname = _("cannot connect"); face.log(_("+ [lj] HTTP failed: %s"), pname.c_str()); disconnect(); return; } while((npos = content.find("\r")) != -1) content.erase(npos, 1); while((npos = content.find("\n")) != -1) { pname = content.substr(0, npos); content.erase(0, npos+1); if((npos = content.find("\n")) == -1) npos = content.size(); params[pname] = content.substr(0, npos); if(npos != content.size()) content.erase(0, npos+1); else content = ""; } } if(isconnecting() && ie->second == reqLogin) { fonline = true; if(params["success"] == "OK") { flogged = true; log(logLogged); face.update(); setautostatus(manualstatus); if(!(c = clist.get(self))) { c = clist.addnew(self, false); requestinfo(self); } count = atoi(params["mood_count"].c_str()); for(i = 1; i < count; i++) moods.push_back(params[(string) "mood_" + i2str(i) + "_name"]); count = atoi(params["pickw_count"].c_str()); for(i = 1; i < count; i++) pictures.push_back(params[(string) "pickw_" + i2str(i)]); sort(moods.begin()+1, moods.end()); icqcontact::basicinfo bi = c->getbasicinfo(); c->setstatus(available); string buf; friendof.clear(); while(!(buf = getword(bi.zip)).empty()) friendof.push_back(buf); if(!params["message"].empty()) em.store(imnotification(self, _("Message from the server: ") + params["message"])); timer_getfriends = 0; } else { face.log(_("+ [lj] login failed: %s"), params["errmsg"].c_str()); } } else if(ie->second == reqPost) { if(params["success"] == "OK") { face.log(_("+ [lj] posted successully, the id is %s"), params["itemid"].c_str()); } else { face.log(_("+ [lj] post error: %s"), params["errmsg"].c_str()); } } else if(ie->second == reqPostComment) { } else if(ie->second == reqGetFriends) { if(params["success"] == "OK") { journals = vector(1, username); if(conf->getourid(proto).additional["importfriends"] == "1") { count = atoi(params["friend_count"].c_str()); } else { count = 0; } string username, name, birthday, bd; icqcontact::moreinfo mi; icqcontact::basicinfo bi; for(i = 1; i <= count; i++) { username = params[(string) "friend_" + i2str(i) + "_user"]; name = rusconv("uk", params[(string) "friend_" + i2str(i) + "_name"]); birthday = params[(string) "friend_" + i2str(i) + "_birthday"]; bool found = false; for(k = 0; k < clist.count && !found; k++) { c = (icqcontact *) clist.at(k); if(c->getdesc().pname == rss) { icqcontact::workinfo wi = c->getworkinfo(); if(wi.homepage == getoldfeedurl(username)) { wi.homepage = getfeedurl(username); c->setworkinfo(wi); } found = (wi.homepage == getfeedurl(username)); } } if(!found) if(c = clist.addnew(imcontact(0, rss), false)) { icqcontact::workinfo wi = c->getworkinfo(); wi.homepage = getfeedurl(username); c->setworkinfo(wi); icqcontact::moreinfo mi = c->getmoreinfo(); mi.checkfreq = 120; c->setmoreinfo(mi); c->setnick(username + "@lj"); c->setdispnick(c->getnick()); c->save(); } bi = c->getbasicinfo(); mi = c->getmoreinfo(); bi.email = name; if(!birthday.empty()) { k = 0; while(!(bd = getrword(birthday, "-")).empty()) switch(k++) { case 0: mi.birth_day = atoi(bd.c_str()); break; case 1: mi.birth_month = atoi(bd.c_str()); break; case 2: mi.birth_year = atoi(bd.c_str()); break; } } c->setmoreinfo(mi); c->setbasicinfo(bi); if(params[(string) "friend_" + i2str(i) + "_type"] == "community") journals.push_back(username); } count = atoi(params["friendof_count"].c_str()); bool foempty = friendof.empty(); map nfriendof; map::const_iterator in; vector::iterator il; char buf[NOTIFBUF]; for(i = 1; i <= count; i++) { username = params[(string) "friendof_" + i2str(i) + "_user"]; name = rusconv("uk", params[(string) "friendof_" + i2str(i) + "_name"]); nfriendof[username] = name; } for(in = nfriendof.begin(); in != nfriendof.end(); ++in) if(find(friendof.begin(), friendof.end(), in->first) == friendof.end()) { friendof.push_back(in->first); if(!foempty) { bd = (string) "http://" + conf->getourid(proto).server + "/users/" + in->first; snprintf(buf, NOTIFBUF, _("The user %s (%s) has added you to his/her friend list\n\nJournal address: %s"), in->first.c_str(), in->second.c_str(), bd.c_str()); em.store(imnotification(self, buf)); } } for(il = friendof.begin(); il != friendof.end(); ) { if(nfriendof.find(*il) == nfriendof.end()) { bd = (string) "http://" + conf->getourid(proto).server + "/users/" + *il; snprintf(buf, NOTIFBUF, _("The user %s has removed you from his/her friend list\n\nJournal address: %s"), il->c_str(), bd.c_str()); em.store(imnotification(self, buf)); friendof.erase(il); il = friendof.begin(); } else { ++il; } } if(c = clist.get(self)) { icqcontact::basicinfo bi = c->getbasicinfo(); vector::const_iterator ifo = friendof.begin(); bi.zip = ""; while(ifo != friendof.end()) { bi.zip += *ifo + " "; ++ifo; } c->setbasicinfo(bi); } } } else if(ie->second == reqDelFriend) { if(params["success"] != "OK") { face.log(_("+ [lj] error deleting friend")); } else { face.log(_("+ [lj] the user has been removed from your friend list")); } } else if(ie->second == reqAddFriend) { if(params["success"] != "OK" || !atoi(params["friends_added"].c_str())) { face.log(_("+ [lj] couldn't add friend")); } else { face.log(_("+ [lj] %s was added to friends"), params["friend_1_user"].c_str()); } } else if(ie->second == reqLookup && sdest) { if(ev->isDelivered() && !content.empty()) { imcontact ic(0, rss); ic.nickname = rev->getURL(); c = new icqcontact(ic); c->setnick(lookfor + "@lj"); c->setdispnick(c->getnick()); c->excludefromlist(); rsshook::parsedocument(rev, c); sdest->additem(conf->getcolor(cp_clist_rss), c, (string) " " + c->getnick()); foundguys.push_back(c); } face.findready(); face.log(_("+ [lj] user lookup finished")); sdest->redraw(); sdest = 0; } if(ie != sent.end()) sent.erase(ie); } void ljhook::logger_cb(LogEvent *ev) { switch(ev->getType()) { case LogEvent::PACKET: case LogEvent::DIRECTPACKET: face.log(ev->getMessage()); break; default: face.log(ev->getMessage()); break; } } string ljhook::getfeedurl(const string &nick) const { return (string) "http://" + conf->getourid(proto).server + "/users/" + nick + "/data/rss?auth=digest"; } string ljhook::getoldfeedurl(const string &nick) const { return (string) "http://" + conf->getourid(proto).server + "/users/" + nick + "/rss/"; } #endif centerim-4.22.10/src/hooks/rsshook.h0000644000175000001440000000234311461606612014163 00000000000000#ifndef __RSSHOOK_H__ #define __RSSHOOK_H__ #include "abstracthook.h" #ifdef BUILD_RSS #include "HTTPClient.h" #include "src/Xml.h" class rsshook: public abstracthook, public sigslot::has_slots<> { protected: HTTPClient httpcli; vector rfds, wfds, efds; time_t timer_check; void socket_cb(SocketEvent *ev); void messageack_cb(MessageEvent *ev); void logger_cb(LogEvent *ev); void fetchRSSParam(string &base, XmlBranch *i, const string &enc, const string &name, const string &attr, const string &title, const string &postfix = "\n"); public: static void parsedocument(const HTTPRequestEvent *rev, icqcontact *c); public: rsshook(); ~rsshook(); void init(); void exectimers(); void main(); bool send(const imevent &ev); void getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const; bool isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const; bool online() const; bool logged() const; bool isconnecting() const; bool enabled() const; void requestinfo(const imcontact &c); void requestversion(const imcontact &c); void ping(const imcontact &c); void sendnewuser(const imcontact &ic); void removeuser(const imcontact &ic); }; extern rsshook rhook; #endif #endif centerim-4.22.10/src/hooks/HTTPClient.cc0000644000175000001440000003175111461606612014554 00000000000000/* * * centerim HTTP protocol handling class * $Id: HTTPClient.cc,v 1.19 2005/01/18 23:20:17 konst Exp $ * * Copyright (C) 2003-2004 by Konstantin Klyagin * * 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 "HTTPClient.h" #include #include "abstracthook.h" #include "centerim.h" #ifdef BUILD_RSS HTTPClient::HTTPClient() : m_state(NOT_CONNECTED), m_recv(), m_proxy_port(8080), m_timeout(50) { m_socket = new TCPSocket(); Init(); } HTTPClient::~HTTPClient() { if(m_socket->getSocketHandle() > -1) SignalRemoveSocket(m_socket->getSocketHandle()); delete m_socket; } void HTTPClient::Init() { } void HTTPClient::Connect() { if(m_queue.empty()) return; int pos; HTTPRequestEvent *ev = m_queue.front(); m_hostname = !m_redirect.empty() ? m_redirect : ev->getURL(); m_port = 80; m_resource = "/"; m_content = m_redirect = ""; m_recv.clear(); if(up(m_hostname.substr(0, 7)) == "HTTP://") { m_hostname.erase(0, 7); } if((pos = m_hostname.find("@")) != -1) { ev->setAuth(HTTPRequestEvent::Basic, m_hostname.substr(0, pos), ""); m_hostname.erase(0, pos+1); if((pos = ev->m_user.find(":")) != -1) { ev->m_pass = ev->m_user.substr(pos+1); ev->m_user.erase(pos); } } if((pos = m_hostname.find("/")) != -1) { m_resource = m_hostname.substr(pos); m_hostname.erase(pos); } if((pos = m_hostname.find(":")) != -1) { m_port = strtoul(m_hostname.substr(pos+1).c_str(), 0, 0); m_hostname.erase(pos); } try { if(ev->connectTries++ > 10) { ev->setHTTPResp("too many connect attempts"); throw DisconnectedException("Too many connect attempts"); } if(m_proxy_hostname.empty()) { m_socket->setRemoteHost(m_hostname.c_str()); m_socket->setRemotePort(m_port); } else { m_socket->setRemoteHost(m_proxy_hostname.c_str()); m_socket->setRemotePort(m_proxy_port); } m_socket->setBindHost(m_bindhost.c_str()); m_socket->setBlocking(false); m_socket->Connect(); SignalAddSocket(m_socket->getSocketHandle(), SocketEvent::WRITE); time(&m_last_operation); m_state = WAITING_FOR_CONNECT; } catch(DisconnectedException e) { SignalLog(LogEvent::WARN, e.what()); Disconnect(); } catch(SocketException e) { SignalLog(LogEvent::WARN, e.what()); Disconnect(); } catch(...) { SignalLog(LogEvent::WARN, "Uncaught HTTP connect exception"); Disconnect(); } if(m_state == NOT_CONNECTED) { MessageEvent *ev = m_queue.front(); ev->setDelivered(false); ev->setFinished(true); ev->setDeliveryFailureReason(MessageEvent::Failed); messageack.emit(ev); delete ev; m_queue.pop_front(); } } void HTTPClient::Parse() { int npos; string response, head, val; HTTPRequestEvent *ev = m_queue.front(); npos = m_recv.size(); while(1) { response = ""; m_recv.UnpackCRLFString(response); if(response.empty()) break; while(!response.empty()) { if(response.substr(response.size()-1).find_first_of("\r\n") != -1) response.erase(response.size()-1); else break; } time(&m_last_operation); string log = "Received HTTP response from " + IPtoString(m_socket->getRemoteIP()) + ":" + i2str(m_socket->getRemotePort()) + "\n" + response; SignalLog(LogEvent::DIRECTPACKET, log); if(m_state == WAITING_FOR_HEADER) { m_code = 0; if((npos = response.find(" ")) != -1) { m_code = strtoul(response.substr(npos+1).c_str(), 0, 0); } switch(m_code) { case 200: case 301: case 302: case 401: break; default: ev->setHTTPResp(response.substr(npos+1)); throw HTTPException("Didn't receive HTTP OK"); } m_state = RECEIVING_HEADER; } else if(m_state == RECEIVING_HEADER) { if((npos = response.find(" ")) != -1) head = up(response.substr(0, npos)); if(head == "CONTENT-LENGTH:") { m_length = strtoul(response.substr(npos+1).c_str(), 0, 0); } switch(m_code) { case 301: case 302: if(head == "LOCATION:") { m_redirect = response.substr(npos+1); m_socket->Disconnect(); SignalRemoveSocket(m_socket->getSocketHandle()); m_state = NOT_CONNECTED; Connect(); } break; case 401: if(head == "WWW-AUTHENTICATE:") { if(ev->authTries++) { ev->setHTTPResp("HTTP auth failed"); throw HTTPException("Authentification failed"); } response.erase(0, npos+1); if((npos = response.find(" ")) != -1) { head = up(response.substr(0, npos)); response.erase(0, npos+1); if(head == "DIGEST") ev->authmethod = HTTPRequestEvent::Digest; while(!response.empty()) { if((npos = response.find("=")) != -1) { head = response.substr(0, npos); response.erase(0, npos+1); if(response.substr(0, 1) == "\"") { response.erase(0, 1); if((npos = response.find("\"")) != -1) val = response.substr(0, npos); } else { if((npos = response.find(",")) != -1) val = response.substr(0, npos); } ev->authparams[head] = val; response.erase(0, npos+1); while(response.substr(0, 1).find_first_of(", \t") != -1) response.erase(0, 1); } else break; } m_socket->Disconnect(); SignalRemoveSocket(m_socket->getSocketHandle()); m_state = NOT_CONNECTED; Connect(); } } break; } if(response.empty()) m_state = RECEIVING_CONTENT; } else if(m_state == RECEIVING_CONTENT) { m_content += response + "\n"; } } } void HTTPClient::Send(Buffer &b) { string log; try { log = "Sending HTTP command to " + IPtoString(m_socket->getRemoteIP()) + ":" + i2str(m_socket->getRemotePort()); SignalLog(LogEvent::DIRECTPACKET, log); m_socket->Send(b); } catch(SocketException e) { log = (string) "Failed to send: " + e.what(); m_state = NOT_CONNECTED; throw DisconnectedException(log); } } string HTTPClient::strMethod(HTTPRequestEvent::RequestMethod m) { string r; switch(m) { case HTTPRequestEvent::GET: r = "GET"; break; case HTTPRequestEvent::POST: r = "POST"; break; } return r; } void HTTPClient::SendRequest() { Buffer b; HTTPRequestEvent *ev = m_queue.front(); string rq, cnonce; int i; rq = strMethod(ev->getMethod()); if(m_proxy_hostname.empty()) { b.Pack(rq + " " + m_resource + " HTTP/1.0\r\n"); b.Pack((string) "Host: " + m_hostname); if(m_port != 80) b.Pack((string) ":" + i2str(m_port)); b.Pack("\r\n"); } else { b.Pack(rq + " http://" + m_hostname + m_resource + " HTTP/1.0\r\n"); } if(!m_proxy_user.empty() && !m_proxy_hostname.empty()) { auto_ptr ba(cw_base64_encode((m_proxy_user + ":" + m_proxy_passwd).c_str())); b.Pack((string) "Proxy-Authorization: Basic " + ba.get() + "\r\n"); } // b.Pack((string) "Connection: keep-alive\r\n"); b.Pack((string) "User-Agent: " + PACKAGE + "/" + centerim::version + "\r\n"); if(!ev->m_user.empty()) { rq = ""; switch(ev->authmethod) { case HTTPRequestEvent::Basic: { auto_ptr ba(cw_base64_encode((ev->m_user + ":" + ev->m_pass).c_str())); rq = (string) "Basic " + ba.get(); } break; case HTTPRequestEvent::User: rq = (string) "User " + ev->m_user + ":" + ev->m_pass; break; case HTTPRequestEvent::Digest: if(!ev->authparams.empty()) { rq = "Digest "; for(i = 0; i < 8; i++) { char c = randlimit(0, 15); if(c < 10) c += 48; else c += 87; cnonce += c; } ev->authparams["username"] = ev->m_user; ev->authparams["uri"] = ev->m_url; ev->authparams["nc"] = "00000001"; ev->authparams["cnonce"] = cnonce; string a1 = ev->m_user + ":" + ev->authparams["realm"] + ":" + ev->m_pass; string a2 = strMethod(ev->getMethod()) + ":" + ev->m_url; string mid = (string) ":" + ev->authparams["nonce"] + ":" + ev->authparams["nc"] + ":" + cnonce + ":" + ev->authparams["qop"] + ":"; ev->authparams["response"] = abstracthook::getmd5(abstracthook::getmd5(a1) + mid + abstracthook::getmd5(a2)); map::const_iterator ia = ev->authparams.begin(); while(ia != ev->authparams.end()) { if(ia != ev->authparams.begin()) rq += ", "; rq += ia->first + "=\"" + ia->second + "\""; ++ia; } } break; } if(!rq.empty()) { b.Pack((string) "Authorization: " + rq + "\r\n"); } } if(ev->getMethod() == HTTPRequestEvent::POST) { int len = 0; vector >::const_iterator ip = ev->pbegin(); b.Pack("Content-type: application/x-www-form-urlencoded\r\n"); while(ip != ev->pend()) { len += ip->first.size() + ip->second.size() + 2; ++ip; } len--; b.Pack((string) "Content-length: " + i2str(len) + "\r\n\r\n"); for(ip = ev->pbegin(); ip != ev->pend(); ++ip) { if(ip != ev->pbegin()) b.Pack("&"); b.Pack(ip->first); b.Pack("="); b.Pack(ip->second); } } b.Pack("\r\n"); Send(b); m_state = WAITING_FOR_HEADER; } void HTTPClient::Disconnect() { SignalLog(LogEvent::WARN, "HTTP disconnected"); m_socket->Disconnect(); m_state = NOT_CONNECTED; if(m_socket->getSocketHandle() > -1) SignalRemoveSocket(m_socket->getSocketHandle()); } void HTTPClient::FinishNonBlockingConnect() { SendRequest(); } void HTTPClient::Recv() { m_length = 0; try { while(m_socket->connected()) { if(!m_socket->Recv(m_recv)) break; Parse(); if(m_length && m_recv.size() >= m_length) break; } } catch(SocketException e) { Disconnect(); throw DisconnectedException((string) "Failed on recv: " + e.what()); } catch(ParseException e) { Disconnect(); throw DisconnectedException((string) "Failed parsing: " + e.what()); } catch(HTTPException e) { MessageEvent *ev = *m_queue.begin(); ev->setDelivered(false); ev->setFinished(true); ev->setDeliveryFailureReason(MessageEvent::Failed); messageack.emit(ev); delete ev; m_queue.pop_front(); Disconnect(); SignalLog(LogEvent::ERROR, e.what()); } if(m_length && m_recv.size() >= m_length) { Disconnect(); throw DisconnectedException("Content-Length reached"); } } void HTTPClient::check_timeout() { time_t now = time(0); if(now-m_last_operation > m_timeout) { MessageEvent *ev = *m_queue.begin(); ev->setDelivered(false); ev->setFinished(true); dynamic_cast(ev)->setHTTPResp("Timed out"); ev->setDeliveryFailureReason(MessageEvent::Failed); messageack.emit(ev); delete ev; m_queue.pop_front(); Disconnect(); } } void HTTPClient::setTimeout(time_t t) { m_timeout = t; } time_t HTTPClient::getTimeout() const { return m_timeout; } void HTTPClient::clearoutMessagesPoll() { if(!m_queue.empty()) { if(m_state == NOT_CONNECTED) { Connect(); } else { check_timeout(); } } } void HTTPClient::SendEvent(MessageEvent* ev) { HTTPRequestEvent *rev = dynamic_cast(ev); if(rev) { list::const_iterator ir = m_queue.begin(); while(ir != m_queue.end()) { if(**ir == *rev) { delete ev; return; } ++ir; } m_queue.push_back(rev); if(m_state == NOT_CONNECTED) { Connect(); } } } // ---------------------------------------------------------------------------- void HTTPClient::socket_cb(int fd, SocketEvent::Mode m) { TCPSocket *sock = getSocket(); if(sock->getState() == TCPSocket::NONBLOCKING_CONNECT && (m & SocketEvent::WRITE)) { try { sock->FinishNonBlockingConnect(); } catch(SocketException e) { SignalLog(LogEvent::ERROR, (string) "Failed on non-blocking connect for direct connection: " + e.what()); SignalRemoveSocket(fd); return; } SignalRemoveSocket(fd); SignalAddSocket(fd, SocketEvent::READ); try { FinishNonBlockingConnect(); } catch(DisconnectedException e) { SignalLog(LogEvent::WARN, e.what()); SignalRemoveSocket(fd); } } else if(sock->getState() == TCPSocket::CONNECTED && (m & SocketEvent::READ)) { try { Recv(); } catch(DisconnectedException e) { SignalLog(LogEvent::WARN, e.what()); SignalRemoveSocket(fd); if(!m_recv.empty()) { string remains; m_recv.Unpack(remains, m_recv.size()); m_content += remains; } HTTPRequestEvent *ev = *m_queue.begin(); ev->setDelivered(true); ev->setFinished(true); ev->setContent(m_content); messageack.emit(ev); delete ev; m_queue.pop_front(); } } else { SignalLog(LogEvent::ERROR, "Direct Connection socket in inconsistent state!"); SignalRemoveSocket(fd); } } #endif centerim-4.22.10/src/hooks/Makefile.in0000644000175000001440000011147611473011440014367 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/hooks DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libhooks_a_AR = $(AR) $(ARFLAGS) libhooks_a_LIBADD = am_libhooks_a_OBJECTS = libhooks_a-rsshook.$(OBJEXT) \ libhooks_a-HTTPClient.$(OBJEXT) libhooks_a-yahoohook.$(OBJEXT) \ libhooks_a-jabberhook.$(OBJEXT) libhooks_a-aimhook.$(OBJEXT) \ libhooks_a-icqhook.$(OBJEXT) libhooks_a-gaduhook.$(OBJEXT) \ libhooks_a-irchook.$(OBJEXT) libhooks_a-ljhook.$(OBJEXT) \ libhooks_a-msnhook.$(OBJEXT) libhooks_a-abstracthook.$(OBJEXT) libhooks_a_OBJECTS = $(am_libhooks_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libhooks_a_SOURCES) DIST_SOURCES = $(libhooks_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CXXFLAGS = -Wno-write-strings libhooks_a_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/hooks -I$(top_srcdir)/connwrap -I$(top_srcdir)/firetalk -I$(top_srcdir)/firetalk/../connwrap -I$(top_srcdir)/firetalk/../connwrap-0.1 -I$(top_srcdir)/kkconsui -I$(top_srcdir)/kkconsui/include -I$(top_srcdir)/kkconsui/../kkstrtext -I$(top_srcdir)/kkconsui/../kkstrtext-0.1 -I$(top_srcdir)/kkstrtext -I$(top_srcdir)/kksystr -I$(top_srcdir)/kksystr/include -I$(top_srcdir)/kksystr/../kkstrtext -I$(top_srcdir)/kksystr/../kkstrtext-0.1 -I$(top_srcdir)/libgadu -I$(top_srcdir)/libicq2000 -I$(top_srcdir)/libicq2000/libicq2000 -I$(top_srcdir)/libjabber -I$(top_srcdir)/libjabber/../connwrap -I$(top_srcdir)/libjabber/../connwrap-0.1 -I$(top_srcdir)/libmsn -I$(top_srcdir)/libmsn/../connwrap -I$(top_srcdir)/libmsn/../connwrap-0.1 -I$(top_srcdir)/libyahoo2 -I$(top_srcdir)/libyahoo2/../connwrap -I$(top_srcdir)/libyahoo2/../connwrap-0.1 -I$(top_srcdir)/intl noinst_LIBRARIES = libhooks.a libhooks_a_SOURCES = rsshook.cc HTTPClient.cc yahoohook.cc jabberhook.cc aimhook.cc icqhook.cc gaduhook.cc irchook.cc ljhook.cc msnhook.cc abstracthook.cc EXTRA_DIST = rsshook.cc HTTPClient.cc yahoohook.cc jabberhook.cc aimhook.cc icqhook.cc gaduhook.cc irchook.cc ljhook.cc msnhook.cc abstracthook.cc ljhook.h rsshook.h HTTPClient.h yahoohook.h aimhook.h msnhook.h jabberhook.h gaduhook.h icqhook.h irchook.h abstracthook.h all: all-am .SUFFIXES: .SUFFIXES: .cc .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/hooks/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/hooks/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libhooks.a: $(libhooks_a_OBJECTS) $(libhooks_a_DEPENDENCIES) -rm -f libhooks.a $(libhooks_a_AR) libhooks.a $(libhooks_a_OBJECTS) $(libhooks_a_LIBADD) $(RANLIB) libhooks.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-HTTPClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-abstracthook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-aimhook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-gaduhook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-icqhook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-irchook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-jabberhook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-ljhook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-msnhook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-rsshook.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhooks_a-yahoohook.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libhooks_a-rsshook.o: rsshook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-rsshook.o -MD -MP -MF $(DEPDIR)/libhooks_a-rsshook.Tpo -c -o libhooks_a-rsshook.o `test -f 'rsshook.cc' || echo '$(srcdir)/'`rsshook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-rsshook.Tpo $(DEPDIR)/libhooks_a-rsshook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='rsshook.cc' object='libhooks_a-rsshook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-rsshook.o `test -f 'rsshook.cc' || echo '$(srcdir)/'`rsshook.cc libhooks_a-rsshook.obj: rsshook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-rsshook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-rsshook.Tpo -c -o libhooks_a-rsshook.obj `if test -f 'rsshook.cc'; then $(CYGPATH_W) 'rsshook.cc'; else $(CYGPATH_W) '$(srcdir)/rsshook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-rsshook.Tpo $(DEPDIR)/libhooks_a-rsshook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='rsshook.cc' object='libhooks_a-rsshook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-rsshook.obj `if test -f 'rsshook.cc'; then $(CYGPATH_W) 'rsshook.cc'; else $(CYGPATH_W) '$(srcdir)/rsshook.cc'; fi` libhooks_a-HTTPClient.o: HTTPClient.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-HTTPClient.o -MD -MP -MF $(DEPDIR)/libhooks_a-HTTPClient.Tpo -c -o libhooks_a-HTTPClient.o `test -f 'HTTPClient.cc' || echo '$(srcdir)/'`HTTPClient.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-HTTPClient.Tpo $(DEPDIR)/libhooks_a-HTTPClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='HTTPClient.cc' object='libhooks_a-HTTPClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-HTTPClient.o `test -f 'HTTPClient.cc' || echo '$(srcdir)/'`HTTPClient.cc libhooks_a-HTTPClient.obj: HTTPClient.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-HTTPClient.obj -MD -MP -MF $(DEPDIR)/libhooks_a-HTTPClient.Tpo -c -o libhooks_a-HTTPClient.obj `if test -f 'HTTPClient.cc'; then $(CYGPATH_W) 'HTTPClient.cc'; else $(CYGPATH_W) '$(srcdir)/HTTPClient.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-HTTPClient.Tpo $(DEPDIR)/libhooks_a-HTTPClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='HTTPClient.cc' object='libhooks_a-HTTPClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-HTTPClient.obj `if test -f 'HTTPClient.cc'; then $(CYGPATH_W) 'HTTPClient.cc'; else $(CYGPATH_W) '$(srcdir)/HTTPClient.cc'; fi` libhooks_a-yahoohook.o: yahoohook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-yahoohook.o -MD -MP -MF $(DEPDIR)/libhooks_a-yahoohook.Tpo -c -o libhooks_a-yahoohook.o `test -f 'yahoohook.cc' || echo '$(srcdir)/'`yahoohook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-yahoohook.Tpo $(DEPDIR)/libhooks_a-yahoohook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='yahoohook.cc' object='libhooks_a-yahoohook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-yahoohook.o `test -f 'yahoohook.cc' || echo '$(srcdir)/'`yahoohook.cc libhooks_a-yahoohook.obj: yahoohook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-yahoohook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-yahoohook.Tpo -c -o libhooks_a-yahoohook.obj `if test -f 'yahoohook.cc'; then $(CYGPATH_W) 'yahoohook.cc'; else $(CYGPATH_W) '$(srcdir)/yahoohook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-yahoohook.Tpo $(DEPDIR)/libhooks_a-yahoohook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='yahoohook.cc' object='libhooks_a-yahoohook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-yahoohook.obj `if test -f 'yahoohook.cc'; then $(CYGPATH_W) 'yahoohook.cc'; else $(CYGPATH_W) '$(srcdir)/yahoohook.cc'; fi` libhooks_a-jabberhook.o: jabberhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-jabberhook.o -MD -MP -MF $(DEPDIR)/libhooks_a-jabberhook.Tpo -c -o libhooks_a-jabberhook.o `test -f 'jabberhook.cc' || echo '$(srcdir)/'`jabberhook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-jabberhook.Tpo $(DEPDIR)/libhooks_a-jabberhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='jabberhook.cc' object='libhooks_a-jabberhook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-jabberhook.o `test -f 'jabberhook.cc' || echo '$(srcdir)/'`jabberhook.cc libhooks_a-jabberhook.obj: jabberhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-jabberhook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-jabberhook.Tpo -c -o libhooks_a-jabberhook.obj `if test -f 'jabberhook.cc'; then $(CYGPATH_W) 'jabberhook.cc'; else $(CYGPATH_W) '$(srcdir)/jabberhook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-jabberhook.Tpo $(DEPDIR)/libhooks_a-jabberhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='jabberhook.cc' object='libhooks_a-jabberhook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-jabberhook.obj `if test -f 'jabberhook.cc'; then $(CYGPATH_W) 'jabberhook.cc'; else $(CYGPATH_W) '$(srcdir)/jabberhook.cc'; fi` libhooks_a-aimhook.o: aimhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-aimhook.o -MD -MP -MF $(DEPDIR)/libhooks_a-aimhook.Tpo -c -o libhooks_a-aimhook.o `test -f 'aimhook.cc' || echo '$(srcdir)/'`aimhook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-aimhook.Tpo $(DEPDIR)/libhooks_a-aimhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='aimhook.cc' object='libhooks_a-aimhook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-aimhook.o `test -f 'aimhook.cc' || echo '$(srcdir)/'`aimhook.cc libhooks_a-aimhook.obj: aimhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-aimhook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-aimhook.Tpo -c -o libhooks_a-aimhook.obj `if test -f 'aimhook.cc'; then $(CYGPATH_W) 'aimhook.cc'; else $(CYGPATH_W) '$(srcdir)/aimhook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-aimhook.Tpo $(DEPDIR)/libhooks_a-aimhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='aimhook.cc' object='libhooks_a-aimhook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-aimhook.obj `if test -f 'aimhook.cc'; then $(CYGPATH_W) 'aimhook.cc'; else $(CYGPATH_W) '$(srcdir)/aimhook.cc'; fi` libhooks_a-icqhook.o: icqhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-icqhook.o -MD -MP -MF $(DEPDIR)/libhooks_a-icqhook.Tpo -c -o libhooks_a-icqhook.o `test -f 'icqhook.cc' || echo '$(srcdir)/'`icqhook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-icqhook.Tpo $(DEPDIR)/libhooks_a-icqhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqhook.cc' object='libhooks_a-icqhook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-icqhook.o `test -f 'icqhook.cc' || echo '$(srcdir)/'`icqhook.cc libhooks_a-icqhook.obj: icqhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-icqhook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-icqhook.Tpo -c -o libhooks_a-icqhook.obj `if test -f 'icqhook.cc'; then $(CYGPATH_W) 'icqhook.cc'; else $(CYGPATH_W) '$(srcdir)/icqhook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-icqhook.Tpo $(DEPDIR)/libhooks_a-icqhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='icqhook.cc' object='libhooks_a-icqhook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-icqhook.obj `if test -f 'icqhook.cc'; then $(CYGPATH_W) 'icqhook.cc'; else $(CYGPATH_W) '$(srcdir)/icqhook.cc'; fi` libhooks_a-gaduhook.o: gaduhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-gaduhook.o -MD -MP -MF $(DEPDIR)/libhooks_a-gaduhook.Tpo -c -o libhooks_a-gaduhook.o `test -f 'gaduhook.cc' || echo '$(srcdir)/'`gaduhook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-gaduhook.Tpo $(DEPDIR)/libhooks_a-gaduhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gaduhook.cc' object='libhooks_a-gaduhook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-gaduhook.o `test -f 'gaduhook.cc' || echo '$(srcdir)/'`gaduhook.cc libhooks_a-gaduhook.obj: gaduhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-gaduhook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-gaduhook.Tpo -c -o libhooks_a-gaduhook.obj `if test -f 'gaduhook.cc'; then $(CYGPATH_W) 'gaduhook.cc'; else $(CYGPATH_W) '$(srcdir)/gaduhook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-gaduhook.Tpo $(DEPDIR)/libhooks_a-gaduhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gaduhook.cc' object='libhooks_a-gaduhook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-gaduhook.obj `if test -f 'gaduhook.cc'; then $(CYGPATH_W) 'gaduhook.cc'; else $(CYGPATH_W) '$(srcdir)/gaduhook.cc'; fi` libhooks_a-irchook.o: irchook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-irchook.o -MD -MP -MF $(DEPDIR)/libhooks_a-irchook.Tpo -c -o libhooks_a-irchook.o `test -f 'irchook.cc' || echo '$(srcdir)/'`irchook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-irchook.Tpo $(DEPDIR)/libhooks_a-irchook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='irchook.cc' object='libhooks_a-irchook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-irchook.o `test -f 'irchook.cc' || echo '$(srcdir)/'`irchook.cc libhooks_a-irchook.obj: irchook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-irchook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-irchook.Tpo -c -o libhooks_a-irchook.obj `if test -f 'irchook.cc'; then $(CYGPATH_W) 'irchook.cc'; else $(CYGPATH_W) '$(srcdir)/irchook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-irchook.Tpo $(DEPDIR)/libhooks_a-irchook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='irchook.cc' object='libhooks_a-irchook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-irchook.obj `if test -f 'irchook.cc'; then $(CYGPATH_W) 'irchook.cc'; else $(CYGPATH_W) '$(srcdir)/irchook.cc'; fi` libhooks_a-ljhook.o: ljhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-ljhook.o -MD -MP -MF $(DEPDIR)/libhooks_a-ljhook.Tpo -c -o libhooks_a-ljhook.o `test -f 'ljhook.cc' || echo '$(srcdir)/'`ljhook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-ljhook.Tpo $(DEPDIR)/libhooks_a-ljhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ljhook.cc' object='libhooks_a-ljhook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-ljhook.o `test -f 'ljhook.cc' || echo '$(srcdir)/'`ljhook.cc libhooks_a-ljhook.obj: ljhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-ljhook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-ljhook.Tpo -c -o libhooks_a-ljhook.obj `if test -f 'ljhook.cc'; then $(CYGPATH_W) 'ljhook.cc'; else $(CYGPATH_W) '$(srcdir)/ljhook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-ljhook.Tpo $(DEPDIR)/libhooks_a-ljhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ljhook.cc' object='libhooks_a-ljhook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-ljhook.obj `if test -f 'ljhook.cc'; then $(CYGPATH_W) 'ljhook.cc'; else $(CYGPATH_W) '$(srcdir)/ljhook.cc'; fi` libhooks_a-msnhook.o: msnhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-msnhook.o -MD -MP -MF $(DEPDIR)/libhooks_a-msnhook.Tpo -c -o libhooks_a-msnhook.o `test -f 'msnhook.cc' || echo '$(srcdir)/'`msnhook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-msnhook.Tpo $(DEPDIR)/libhooks_a-msnhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='msnhook.cc' object='libhooks_a-msnhook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-msnhook.o `test -f 'msnhook.cc' || echo '$(srcdir)/'`msnhook.cc libhooks_a-msnhook.obj: msnhook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-msnhook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-msnhook.Tpo -c -o libhooks_a-msnhook.obj `if test -f 'msnhook.cc'; then $(CYGPATH_W) 'msnhook.cc'; else $(CYGPATH_W) '$(srcdir)/msnhook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-msnhook.Tpo $(DEPDIR)/libhooks_a-msnhook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='msnhook.cc' object='libhooks_a-msnhook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-msnhook.obj `if test -f 'msnhook.cc'; then $(CYGPATH_W) 'msnhook.cc'; else $(CYGPATH_W) '$(srcdir)/msnhook.cc'; fi` libhooks_a-abstracthook.o: abstracthook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-abstracthook.o -MD -MP -MF $(DEPDIR)/libhooks_a-abstracthook.Tpo -c -o libhooks_a-abstracthook.o `test -f 'abstracthook.cc' || echo '$(srcdir)/'`abstracthook.cc @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-abstracthook.Tpo $(DEPDIR)/libhooks_a-abstracthook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='abstracthook.cc' object='libhooks_a-abstracthook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-abstracthook.o `test -f 'abstracthook.cc' || echo '$(srcdir)/'`abstracthook.cc libhooks_a-abstracthook.obj: abstracthook.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhooks_a-abstracthook.obj -MD -MP -MF $(DEPDIR)/libhooks_a-abstracthook.Tpo -c -o libhooks_a-abstracthook.obj `if test -f 'abstracthook.cc'; then $(CYGPATH_W) 'abstracthook.cc'; else $(CYGPATH_W) '$(srcdir)/abstracthook.cc'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libhooks_a-abstracthook.Tpo $(DEPDIR)/libhooks_a-abstracthook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='abstracthook.cc' object='libhooks_a-abstracthook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhooks_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhooks_a-abstracthook.obj `if test -f 'abstracthook.cc'; then $(CYGPATH_W) 'abstracthook.cc'; else $(CYGPATH_W) '$(srcdir)/abstracthook.cc'; fi` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/src/hooks/msnhook.cc0000644000175000001440000006335411461606612014320 00000000000000/* * * centerim MSN protocol handling class * $Id: msnhook.cc,v 1.91 2005/02/03 02:02:37 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "icqcommon.h" #ifdef BUILD_MSN #include "msnhook.h" #include "icqconf.h" #include "icqface.h" #include "icqcontacts.h" #include "accountmanager.h" #include "eventmanager.h" #include "imlogger.h" #include "connwrap.h" #include "icqgroups.h" #include #include #include #include #include #include msnhook mhook; static string nicknormalize(const string &nick) { if(nick.find("@") == -1) return nick + "@hotmail.com"; return nick; } static string nicktodisp(const string &nick) { int pos; string r = nick; if((pos = r.find("@")) != -1) if(r.substr(pos+1) == "hotmail.com") r.erase(pos); return r; } static map convstat; static imstatus buddy2stat(MSN::BuddyStatus bst) { map::const_iterator i = convstat.find(bst); if(i != convstat.end()) return i->second; return offline; } static MSN::BuddyStatus stat2buddy(imstatus st) { map::const_iterator i = convstat.begin(); while(i != convstat.end()) { if(st == i->second) return i->first; ++i; } return MSN::STATUS_AVAILABLE; } // ---------------------------------------------------------------------------- msnhook::msnhook(): abstracthook(msn), conn(cb) { ourstatus = offline; fonline = false; destroying = false; fcapabs.insert(hookcapab::changedetails); fcapabs.insert(hookcapab::directadd); } msnhook::~msnhook() { if(conn.connectionState() != MSN::NotificationServerConnection::NS_DISCONNECTED) { destroying = true; conn.disconnect(); } } void msnhook::init() { manualstatus = conf->getstatus(msn); convstat[MSN::STATUS_AVAILABLE] = available; convstat[MSN::STATUS_INVISIBLE] = invisible; convstat[MSN::STATUS_BUSY] = dontdisturb; convstat[MSN::STATUS_ONTHEPHONE] = occupied; convstat[MSN::STATUS_AWAY] = notavail; convstat[MSN::STATUS_BERIGHTBACK] = away; convstat[MSN::STATUS_OUTTOLUNCH] = outforlunch; convstat[MSN::STATUS_IDLE] = away; } void msnhook::connect() { icqconf::imaccount account = conf->getourid(msn); log(logConnecting); readinfo = flogged = false; fonline = true; try { if(conn.connectionState() != MSN::NotificationServerConnection::NS_DISCONNECTED) conn.disconnect(); rfds.clear(); wfds.clear(); conn.connect(account.server, account.port, nicknormalize(account.nickname), account.password); } catch(...) { } } void msnhook::disconnect() { fonline = false; if(conn.connectionState() != MSN::NotificationServerConnection::NS_DISCONNECTED) conn.disconnect(); clist.setoffline(mhook.proto); log(logDisconnected); } void msnhook::exectimers() { if(logged()) { if(timer_current-timer_ping > conn.nextPing()) { try { conn.sendPing(); timer_ping = timer_current; } catch(...) { } } } } void msnhook::main() { vector::const_iterator i; fd_set rs, ws, es; struct timeval tv; int hsock = 0; MSN::Connection *c; FD_ZERO(&rs); FD_ZERO(&ws); FD_ZERO(&es); getsockets(rs, ws, es, hsock); tv.tv_sec = tv.tv_usec = 0; try { if(select(hsock+1, &rs, &ws, &es, &tv) > 0) { for(i = rfds.begin(); i != rfds.end(); ++i) if(FD_ISSET(*i, &rs)) { c = conn.connectionWithSocket(*i); if(c) c->dataArrivedOnSocket(); return; } for(i = wfds.begin(); i != wfds.end(); ++i) if(FD_ISSET(*i, &ws)) { c = conn.connectionWithSocket(*i); if(c) { if(!c->isConnected()) { c->socketConnectionCompleted(); } else { c->socketIsWritable(); } } return; } } } catch(...) { } } void msnhook::getsockets(fd_set &rf, fd_set &wf, fd_set &efds, int &hsocket) const { vector::const_iterator i; for(i = rfds.begin(); i != rfds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &rf); } for(i = wfds.begin(); i != wfds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &wf); } } bool msnhook::isoursocket(fd_set &rf, fd_set &wf, fd_set &efds) const { vector::const_iterator i; for(i = rfds.begin(); i != rfds.end(); ++i) if(FD_ISSET(*i, &rf)) return true; for(i = wfds.begin(); i != wfds.end(); ++i) if(FD_ISSET(*i, &wf)) return true; return false; } bool msnhook::online() const { return fonline; } bool msnhook::logged() const { return fonline && flogged; } bool msnhook::isconnecting() const { return fonline && !flogged; } bool msnhook::enabled() const { return true; } bool msnhook::send(const imevent &ev) { string text; string rcpt = nicknormalize(ev.getcontact().nickname); if(ev.gettype() == imevent::message) { const immessage *m = static_cast(&ev); if(m) text = m->gettext(); } else if(ev.gettype() == imevent::url) { const imurl *m = static_cast(&ev); if(m) text = m->geturl() + "\n\n" + m->getdescription(); } else if(ev.gettype() == imevent::file) { const imfile *m = static_cast(&ev); vector files = m->getfiles(); vector::const_iterator ir; for(ir = files.begin(); ir != files.end(); ++ir) { imfile::record r; r.fname = ir->fname; r.size = ir->size; imfile fr(ev.getcontact(), imevent::outgoing, "", vector(1, r)); try { qevent *ctx = new qevent(qevent::qeFile, rcpt, ir->fname); if(lconn.find(rcpt) != lconn.end()) sendmsn(lconn[rcpt], ctx); else conn.requestSwitchboardConnection(ctx); } catch(...) { } } return true; } icqcontact *c = clist.get(ev.getcontact()); text = rusconv("ku", text); if(c) if(c->getstatus() != offline || !c->inlist()) { try { qevent *ctx = new qevent(qevent::qeMsg, rcpt, text); if(lconn.find(rcpt) != lconn.end()) sendmsn(lconn[rcpt], ctx); else conn.requestSwitchboardConnection(ctx); } catch(...) { } return true; } return false; } int msnhook::findgroup(const imcontact &ic, string &gname) const { int gid = -1; icqcontact *c; if(c = clist.get(ic)) { vector::const_iterator ig = find(groups.begin(), groups.end(), c->getgroupid()); if(ig != groups.end()) { gname = ig->getname(); map::const_iterator im = mgroups.begin(); while(im != mgroups.end() && gid == -1) { if(im->second == ig->getname()) gid = im->first; ++im; } } } return gid; } void msnhook::sendnewuser(const imcontact &ic) { if(logged() && !readinfo) { icqcontact *c; imcontact icc(nicktodisp(ic.nickname), msn); if(icc.nickname != ic.nickname) if(c = clist.get(ic)) { c->setdesc(icc); c->setnick(icc.nickname); c->setdispnick(icc.nickname); } int gid; string gname; gid = findgroup(ic, gname); try { if(gid == -1) { gid = 0; } conn.addToGroup(nicknormalize(ic.nickname), gid); } catch(...) { } } requestinfo(ic); } void msnhook::setautostatus(imstatus st) { if(st != offline) { if(!logged()) { connect(); } else { logger.putourstatus(msn, ourstatus, st); try { conn.setState(stat2buddy(ourstatus = st)); } catch(...) { } } } else { if(getstatus() != offline) { disconnect(); } } } imstatus msnhook::getstatus() const { return online() ? ourstatus : offline; } void msnhook::removeuser(const imcontact &ic) { removeuser(ic, true); } void msnhook::removeuser(const imcontact &ic, bool report) { int i; bool found; vector::const_iterator ib = find(slst["FL"].begin(), slst["FL"].end(), nicknormalize(ic.nickname)); if(online() && ib != slst["FL"].end()) { if(report) log(logContactRemove, ic.nickname.c_str()); try { conn.removeFromGroup(nicknormalize(ic.nickname), ib->gid); for(i = 0, found = false; i < clist.count && !found; i++) { icqcontact *c = (icqcontact *) clist.at(i); found = c->getdesc().pname == msn && groups.getname(c->getgroupid()) == mgroups[ib->gid]; } if(!found && ib->gid > 0) conn.removeGroup(ib->gid); } catch(...) { } } } void msnhook::requestinfo(const imcontact &ic) { icqcontact *c = clist.get(ic); if(!c) c = clist.get(contactroot); icqcontact::moreinfo m = c->getmoreinfo(); icqcontact::basicinfo b = c->getbasicinfo(); b.email = nicknormalize(ic.nickname); m.homepage = "http://members.msn.com/" + b.email; if(ic.nickname == conf->getourid(msn).nickname) c->setnick(friendlynicks[ic.nickname]); c->setmoreinfo(m); c->setbasicinfo(b); } void msnhook::lookup(const imsearchparams ¶ms, verticalmenu &dest) { if(params.reverse) { vector::const_iterator i = slst["RL"].begin(); while(i != slst["RL"].end()) { icqcontact *c = new icqcontact(imcontact(nicktodisp(i->nick), msn)); c->setnick(i->friendly); dest.additem(conf->getcolor(cp_clist_msn), c, (string) " " + i->nick); ++i; } face.findready(); face.log(_("+ [msn] reverse users listing finished, %d found"), slst["RL"].size()); dest.redraw(); } } vector msnhook::getneedsync() { int i; vector r; bool found; for(i = 0; i < clist.count; i++) { icqcontact *c = (icqcontact *) clist.at(i); if(c->getdesc().pname == msn) { vector::const_iterator fi = slst["FL"].begin(); for(found = false; fi != slst["FL"].end() && !found; ++fi) found = c->getdesc().nickname == fi->nick; if(!found) r.push_back(c); } } return r; } void msnhook::sendupdateuserinfo(const icqcontact &c) { try { conn.setFriendlyName(c.getnick()); } catch(...) { } } void msnhook::checkfriendly(icqcontact *c, const string friendlynick, bool forcefetch) { string oldnick = c->getnick(); string newnick = unmime(friendlynick); c->setnick(newnick); if(forcefetch || (oldnick != newnick && c->getdispnick() == oldnick) || oldnick.empty()) { c->setdispnick(newnick); face.relaxedupdate(); } } void msnhook::checkinlist(imcontact ic) { icqcontact *c = clist.get(ic); vector notremote = getneedsync(); if(c) if(c->inlist()) if(find(notremote.begin(), notremote.end(), c) != notremote.end()) mhook.sendnewuser(ic); } bool msnhook::knowntransfer(const imfile &fr) const { return transferinfo.find(fr) != transferinfo.end(); } void msnhook::replytransfer(const imfile &fr, bool accept, const string &localpath) { if(accept) { transferinfo[fr].second = localpath; if(transferinfo[fr].second.substr(transferinfo[fr].second.size()-1) != "/") transferinfo[fr].second += "/"; transferinfo[fr].second += justfname(fr.getfiles().begin()->fname); // msn_filetrans_accept(transferinfo[fr].first, transferinfo[fr].second.c_str()); } else { // msn_filetrans_reject(transferinfo[fr].first); transferinfo.erase(fr); } } void msnhook::aborttransfer(const imfile &fr) { // msn_filetrans_reject(transferinfo[fr].first); face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsCancel, 0, 0); transferinfo.erase(fr); } bool msnhook::getfevent(MSN::FileTransferInvitation *fhandle, imfile &fr) { map >::const_iterator i = transferinfo.begin(); while(i != transferinfo.end()) { if(i->second.first == fhandle) { fr = i->first; return true; } ++i; } return false; } void msnhook::updatecontact(icqcontact *c) { string gname, nick = nicknormalize(c->getdesc().nickname); vector::const_iterator ib = find(slst["FL"].begin(), slst["FL"].end(), nick); if(ib != slst["FL"].end() && logged() && conf->getgroupmode() != icqconf::nogroups) if(mhook.findgroup(c->getdesc(), gname) != ib->gid) { try { conn.removeFromList("FL", nick.c_str()); } catch(...) { } sendnewuser(c->getdesc()); } } void msnhook::renamegroup(const string &oldname, const string &newname) { if(logged()) { map::const_iterator im = mgroups.begin(); while(im != mgroups.end()) { if(im->second == oldname) { try { conn.renameGroup(im->first, newname); } catch(...) { } break; } ++im; } } } // ---------------------------------------------------------------------------- void msnhook::statusupdate(string buddy, string friendlyname, imstatus status) { imcontact ic(nicktodisp(buddy), msn); icqcontact *c = clist.get(ic); bool forcefetch; if(forcefetch = !c) c = clist.addnew(ic, false); if(!friendlyname.empty()) checkfriendly(c, friendlyname, forcefetch); logger.putonline(ic, c->getstatus(), status); c->setstatus(status); } // ---------------------------------------------------------------------------- void msnhook::sendmsn(MSN::SwitchboardServerConnection *conn, const qevent *ctx) { MSN::FileTransferInvitation *inv; switch(ctx->type) { case msnhook::qevent::qeMsg: conn->sendMessage(ctx->text); break; case msnhook::qevent::qeFile: inv = conn->sendFile(ctx->text); // if(inv) mhook.transferinfo[] = inv; break; } delete ctx; } // ---------------------------------------------------------------------------- static void log(const string &s) { if(conf->getdebug()) face.log(s); } void msncallbacks::log(int writing, const char* buf) { string pref = writing ? "OUT" : "IN"; ::log((string) "[" + pref + "] " + buf); } void msncallbacks::registerSocket(int s, int reading, int writing) { ::log("msncallbacks::registerSocket"); if(reading) mhook.rfds.push_back(s); if(writing) mhook.wfds.push_back(s); } void msncallbacks::unregisterSocket(int s) { ::log("msncallbacks::unregisterSocket"); vector::iterator i; i = find(mhook.rfds.begin(), mhook.rfds.end(), s); if(i != mhook.rfds.end()) mhook.rfds.erase(i); i = find(mhook.wfds.begin(), mhook.wfds.end(), s); if(i != mhook.wfds.end()) mhook.wfds.erase(i); } void msncallbacks::gotFriendlyName(MSN::Connection * conn, string friendlyname) { ::log("msncallbacks::gotFriendlyName"); if(!friendlyname.empty()) mhook.friendlynicks[conf->getourid(msn).nickname] = friendlyname; } void msncallbacks::gotBuddyListInfo(MSN::NotificationServerConnection * conn, MSN::ListSyncInfo * data) { ::log("msncallbacks::gotBuddyListInfo"); imcontact ic; bool found; mhook.readinfo = true; std::map::iterator ig; for(ig = data->groups.begin(); ig != data->groups.end(); ig++) { mhook.mgroups[ig->second.groupID] = ig->second.name; } std::list &lst = data->forwardList; std::list::iterator i; for(i = lst.begin(); i != lst.end(); i++) { int gid = 0; if(!i->groups.empty()) gid = (*i->groups.begin())->groupID; mhook.slst["FL"].push_back(msnbuddy(i->userName, i->friendlyName, gid)); ic = imcontact(nicktodisp(i->userName), msn); icqcontact *c = clist.get(ic); if(!c) c = clist.addnew(ic, false); icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::workinfo wi = c->getworkinfo(); list::iterator ip = i->phoneNumbers.begin(); for(; ip != i->phoneNumbers.end(); ip++) { if(ip->title == "PHH") bi.phone = ip->number; else if(ip->title == "PHW") wi.phone = ip->number; else if(ip->title == "PHM") bi.cellular = ip->number; } c->setbasicinfo(bi); c->setworkinfo(wi); for(found = false, ig = data->groups.begin(); ig != data->groups.end() && !found; ++ig) { found = ig->second.groupID == gid; if(found) clist.updateEntry(ic, ig->second.name); } } for(lst = data->reverseList, i = lst.begin(); i != lst.end(); ++i) mhook.slst["RL"].push_back(msnbuddy(i->userName, i->friendlyName)); mhook.readinfo = false; mhook.flogged = true; mhook.setautostatus(mhook.manualstatus); mhook.timer_ping = timer_current; mhook.log(abstracthook::logLogged); face.update(); } void msncallbacks::gotLatestListSerial(MSN::Connection * conn, int serial) { ::log("msncallbacks::gotLatestListSerial"); } void msncallbacks::gotGTC(MSN::Connection * conn, char c) { ::log("msncallbacks::gotGTC"); } void msncallbacks::gotBLP(MSN::Connection * conn, char c) { ::log("msncallbacks::gotBLP"); } void msncallbacks::gotNewReverseListEntry(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname) { ::log("msncallbacks::gotNewReverseListEntry"); try { mhook.conn.addToList("AL", buddy); } catch(...) { } imcontact ic(nicktodisp(buddy), msn); mhook.checkinlist(ic); em.store(imnotification(ic, _("The user has added you to his/her contact list"))); } void msncallbacks::addedListEntry(MSN::Connection * conn, string lst, MSN::Passport buddy, int groupID) { ::log("msncallbacks::addedListEntry"); mhook.slst[lst].push_back(msnbuddy(buddy, "", groupID)); } void msncallbacks::removedListEntry(MSN::Connection * conn, string lst, MSN::Passport buddy, int groupID) { ::log("msncallbacks::removedListEntry"); vector::iterator i = mhook.slst[lst].begin(); while(i != mhook.slst[lst].end()) { if(i->nick == buddy) { mhook.slst[lst].erase(i); i = mhook.slst[lst].begin(); } else { ++i; } } } void msncallbacks::showError(MSN::Connection * conn, string msg) { ::log(msg); } void msncallbacks::buddyChangedStatus(MSN::Connection * conn, MSN::Passport buddy, string friendlyname, MSN::BuddyStatus state) { ::log("msncallbacks::buddyChangedStatus"); mhook.statusupdate(buddy, friendlyname, buddy2stat(state)); } void msncallbacks::buddyOffline(MSN::Connection * conn, MSN::Passport buddy) { ::log("msncallbacks::buddyOffline"); mhook.statusupdate(buddy, "", offline); } void msncallbacks::gotSwitchboard(MSN::SwitchboardServerConnection * conn, const void * tag) { ::log("msncallbacks::gotSwitchboard"); if(tag) { const msnhook::qevent *ctx = static_cast(tag); conn->inviteUser(ctx->nick); } } void msncallbacks::buddyJoinedConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, int is_initial) { ::log("msncallbacks::buddyJoinedConversation"); if(conn->auth.tag) { const msnhook::qevent *ctx = static_cast(conn->auth.tag); mhook.lconn[ctx->nick] = conn; mhook.sendmsn(conn, ctx); conn->auth.tag = 0; } } void msncallbacks::buddyLeftConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy) { ::log("msncallbacks::buddyLeftConversation"); } void msncallbacks::gotInstantMessage(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, MSN::Message * msg) { ::log("msncallbacks::gotInstantMessage"); imcontact ic(nicktodisp(buddy), msn); mhook.checkinlist(ic); string text = mhook.rusconv("uk", msg->getBody()); em.store(immessage(ic, imevent::incoming, text)); } void msncallbacks::failedSendingMessage(MSN::Connection * conn) { ::log("msncallbacks::failedSendingMessage"); } void msncallbacks::buddyTyping(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname) { ::log("msncallbacks::buddyTyping"); icqcontact *c = clist.get(imcontact(nicktodisp(buddy), msn)); if(c) c->setlasttyping(timer_current); } void msncallbacks::gotInitialEmailNotification(MSN::Connection * conn, int unread_inbox, int unread_folders) { ::log("msncallbacks::gotInitialEmailNotification"); face.log(_("+ [msn] unread e-mail: %d in inbox, %d in folders"), unread_inbox, unread_folders); } void msncallbacks::gotNewEmailNotification(MSN::Connection * conn, string from, string subject) { ::log("msncallbacks::gotNewEmailNotification"); face.log(_("+ [msn] e-mail from %s, %s"), from.c_str(), subject.c_str()); clist.get(contactroot)->playsound(imevent::email); } void msncallbacks::gotFileTransferInvitation(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname, MSN::FileTransferInvitation * inv) { ::log("msncallbacks::gotFileTransferInvitation"); if(!mhook.fcapabs.count(hookcapab::files)) return; imfile::record r; r.fname = inv->fileName; r.size = inv->fileSize; imcontact ic(nicktodisp(buddy), msn); mhook.checkinlist(ic); imfile fr(ic, imevent::incoming, "", vector(1, r)); mhook.transferinfo[fr].first = inv; em.store(fr); face.transferupdate(inv->fileName, fr, icqface::tsInit, inv->fileSize, 0); } void msncallbacks::fileTransferProgress(MSN::FileTransferInvitation * inv, string status, unsigned long recv, unsigned long total) { ::log("msncallbacks::fileTransferProgress"); imfile fr; if(mhook.getfevent(inv, fr)) { face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsProgress, total, recv); } } void msncallbacks::fileTransferFailed(MSN::FileTransferInvitation * inv, int error, string message) { ::log("msncallbacks::fileTransferFailed"); imfile fr; if(mhook.getfevent(inv, fr)) { face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsError, 0, 0); mhook.transferinfo.erase(fr); } } void msncallbacks::fileTransferSucceeded(MSN::FileTransferInvitation * inv) { ::log("msncallbacks::fileTransferSucceeded"); imfile fr; if(mhook.getfevent(inv, fr)) { face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsFinish, 0, 0); mhook.transferinfo.erase(fr); } } void msncallbacks::gotNewConnection(MSN::Connection * conn) { ::log("msncallbacks::gotNewConnection"); if(dynamic_cast(conn)) dynamic_cast(conn)->synchronizeLists(); } void msncallbacks::closingConnection(MSN::Connection * conn) { ::log("msncallbacks::closingConnection"); MSN::SwitchboardServerConnection *swc; if(swc = dynamic_cast(conn)) { map::const_iterator ic = mhook.lconn.begin(); while(ic != mhook.lconn.end()) { if(swc == ic->second) { mhook.lconn.erase(ic->first); break; } ++ic; } } else if(conn == &mhook.conn) { if(!mhook.destroying) { mhook.rfds.clear(); mhook.wfds.clear(); mhook.lconn.clear(); mhook.slst.clear(); if(mhook.logged()) { logger.putourstatus(msn, mhook.getstatus(), mhook.ourstatus = offline); clist.setoffline(msn); mhook.fonline = false; mhook.log(abstracthook::logDisconnected); face.update(); } } } unregisterSocket(conn->sock); } void msncallbacks::changedStatus(MSN::Connection * conn, MSN::BuddyStatus state) { ::log("msncallbacks::changedStatus"); } int msncallbacks::connectToServer(string server, int port, bool *connected) { ::log("msncallbacks::connectToServer"); struct sockaddr_in sa; struct hostent *hp; int a, s; string msgerr = _("+ [msn] cannot connect: "); hp = gethostbyname(server.c_str()); if(!hp) { face.log(msgerr + _("could not resolve hostname")); errno = ECONNREFUSED; return -1; } memset(&sa, 0, sizeof(sa)); memcpy((char *) &sa.sin_addr, hp->h_addr, hp->h_length); sa.sin_family = hp->h_addrtype; sa.sin_port = htons((u_short) port); if((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) return -1; int oldfdArgs = fcntl(s, F_GETFL, 0); fcntl(s, F_SETFL, oldfdArgs | O_NONBLOCK); *connected = false; if(cw_connect(s, (struct sockaddr *) &sa, sizeof sa, 0) < 0) { if(errno != EINPROGRESS) { face.log(msgerr + _("verify the hostname and port")); close(s); return -1; } } return s; } int msncallbacks::listenOnPort(int port) { ::log("msncallbacks::listenOnPort"); int s; struct sockaddr_in addr; if((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); if(bind(s, (sockaddr *) &addr, sizeof(addr)) < 0 || listen(s, 1) < 0) { close(s); return -1; } return s; } string msncallbacks::getOurIP() { ::log("msncallbacks::getOurIP"); struct hostent *hn; char buf2[1024]; gethostname(buf2, 1024); hn = gethostbyname(buf2); return inet_ntoa(*((struct in_addr*) hn->h_addr)); } string msncallbacks::getSecureHTTPProxy() { ::log("msncallbacks::getSecureHTTPProxy"); return ""; } void msncallbacks::addedGroup(MSN::Connection * conn, string groupName, int groupID) { ::log("msncallbacks::addedGroup"); int i; icqcontact *c; mhook.mgroups[groupID] = groupName; vector::const_iterator ig = groups.begin(); while(ig != groups.end()) { if(ig->getname() == groupName) { for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getgroupid() == ig->getid()) mhook.sendnewuser(c->getdesc()); } break; } ++ig; } } void msncallbacks::renamedGroup(MSN::Connection * conn, int groupID, string newGroupName) { ::log("msncallbacks::renamedGroup"); mhook.mgroups[groupID] = newGroupName; } void msncallbacks::removedGroup(MSN::Connection * conn, int groupID) { ::log("msncallbacks::removedGroup"); mhook.mgroups.erase(groupID); } #endif centerim-4.22.10/src/hooks/icqhook.cc0000644000175000001440000012563111461606612014274 00000000000000/* * * centerim icq protocol handling class * $Id: icqhook.cc,v 1.159 2004/12/20 00:54:02 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "icqcommon.h" #ifdef BUILD_ICQ #include "icqhook.h" #include "icqconf.h" #include "icqface.h" #include "imlogger.h" #include "icqgroups.h" #include "icqcontacts.h" #include "impgp.h" #include "accountmanager.h" #include "eventmanager.h" #include "src/Capabilities.h" #define PERIOD_ICQPOLL 5 #define PERIOD_RESOLVE 10 #define DELAY_SENDNEW 5 #include #include icqhook ihook; static const Status stat2int[imstatus_size] = { STATUS_OFFLINE, STATUS_ONLINE, STATUS_ONLINE, /* invisible */ STATUS_FREEFORCHAT, STATUS_DND, STATUS_OCCUPIED, STATUS_NA, STATUS_AWAY, STATUS_NA }; icqhook::icqhook(): abstracthook(icq) { fonline = false; blockmode = Normal; fcapabs.insert(hookcapab::urls); fcapabs.insert(hookcapab::setaway); fcapabs.insert(hookcapab::fetchaway); fcapabs.insert(hookcapab::changenick); // fcapabs.insert(hookcapab::changepassword); fcapabs.insert(hookcapab::changedetails); fcapabs.insert(hookcapab::authrequests); fcapabs.insert(hookcapab::authreqwithmessages); fcapabs.insert(hookcapab::contacts); fcapabs.insert(hookcapab::visibility); fcapabs.insert(hookcapab::cltemporary); fcapabs.insert(hookcapab::changeabout); #ifdef HAVE_GPGME fcapabs.insert(hookcapab::pgp); #endif cli.connected.connect(this, &icqhook::connected_cb); cli.disconnected.connect(this, &icqhook::disconnected_cb); cli.socket.connect(this, &icqhook::socket_cb); cli.messaged.connect(this, &icqhook::messaged_cb); cli.messageack.connect(this, &icqhook::messageack_cb); cli.contactlist.connect(this, &icqhook::contactlist_cb); cli.contact_userinfo_change_signal.connect(this, &icqhook::contact_userinfo_change_signal_cb); cli.contact_status_change_signal.connect(this, &icqhook::contact_status_change_signal_cb); cli.contact_typing_signal.connect(this, &icqhook::contact_typing_signal_cb); cli.newuin.connect(this, &icqhook::newuin_cb); cli.rate.connect(this, &icqhook::rate_cb); // cli.password_changed.connect(this, &icqhook::password_changed_cb); cli.want_auto_resp.connect(this, &icqhook::want_auto_resp_cb); cli.search_result.connect(this, &icqhook::search_result_cb); cli.self_contact_userinfo_change_signal.connect(this, &icqhook::self_contact_userinfo_change_cb); cli.self_contact_status_change_signal.connect(this, &icqhook::self_contact_status_change_cb); cli.sbl_received.connect(this, &icqhook::sbl_received_cb); } icqhook::~icqhook() { cli.logger.disconnect(this); cli.connected.disconnect(this); cli.disconnected.disconnect(this); cli.socket.disconnect(this); cli.messaged.disconnect(this); cli.messageack.disconnect(this); cli.contactlist.disconnect(this); cli.contact_userinfo_change_signal.disconnect(this); cli.contact_status_change_signal.disconnect(this); cli.newuin.disconnect(this); cli.rate.disconnect(this); cli.search_result.disconnect(this); cli.want_auto_resp.disconnect(this); cli.self_contact_userinfo_change_signal.disconnect(this); cli.self_contact_status_change_signal.disconnect(this); // cli.password_changed.disconnect(this); } void icqhook::init() { manualstatus = conf->getstatus(proto); if(conf->getdebug()) cli.logger.connect(this, &icqhook::logger_cb); } void icqhook::connect() { icqconf::imaccount acc = conf->getourid(proto); int i, ptpmin, ptpmax; icqcontact *c; if(acc.additional["webaware"].empty()) acc.additional["webaware"] = "1"; conf->setourid(acc); if(!acc.server.empty()) cli.setLoginServerHost(acc.server); if(acc.port) cli.setLoginServerPort(acc.port); if(!conf->getsmtphost().empty()) cli.setSMTPServerHost(conf->getsmtphost()); if(conf->getsmtpport()) cli.setSMTPServerPort(conf->getsmtpport()); if(!conf->getbindhost().empty()) cli.setClientBindHost(conf->getbindhost()); conf->getpeertopeer(ptpmin, ptpmax); if(ptpmax) { cli.setAcceptInDC(true); cli.setPortRangeLowerBound(ptpmin); cli.setPortRangeUpperBound(ptpmax); cli.setUsePortRange(true); } else { cli.setAcceptInDC(false); } log(logConnecting); cli.self_contact_userinfo_change_signal.disconnect(this); cli.setUIN(acc.uin); cli.setPassword(acc.password); cli.setWebAware(acc.additional["webaware"] == "1"); cli.setStatus(stat2int[manualstatus], manualstatus == invisible); cli.self_contact_userinfo_change_signal.connect(this, &icqhook::self_contact_userinfo_change_cb); for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getdesc().pname == proto && c->getdesc().uin) { icqcontact::basicinfo bi = c->getbasicinfo(); bi.authawait = true; c->setbasicinfo(bi); addContact(c->getdesc().uin, groups.getname(c->getgroupid())); } } sendinvisible(); fonline = true; flogged = false; } void icqhook::disconnect() { cli.setStatus(STATUS_OFFLINE); fonline = flogged = false; } void icqhook::resolve() { icqcontact *c; vector toresolve; for(int i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getdesc().pname == proto) if(c->getdispnick() == i2str(c->getdesc().uin)) toresolve.push_back(c); } if(toresolve.size()) { c = toresolve[randlimit(0, toresolve.size()-1)]; requestinfo(c); } } void icqhook::sendinvisible() { vector todo, nvislist; vector::iterator iv, it; icqlist::iterator i; for(i = lst.begin(); i != lst.end(); ++i) { if(i->getdesc().pname == proto) { switch(i->getstatus()) { case csvisible: case csinvisible: todo.push_back(pair (i->getdesc().uin, i->getstatus())); break; } } } nvislist = todo; for(iv = vislist.begin(); iv != vislist.end(); ++iv) { it = find(todo.begin(), todo.end(), *iv); if(it != todo.end()) { todo.erase(it); } else { switch(iv->second) { case csvisible: cli.removeVisible(iv->first); break; case csinvisible: cli.removeInvisible(iv->first); break; } } } for(it = todo.begin(); it != todo.end(); ++it) { switch(it->second) { case csvisible: cli.addVisible(new Contact(it->first)); break; case csinvisible: cli.addInvisible(new Contact(it->first)); break; } } vislist = nvislist; } void icqhook::exectimers() { if(logged()) { if(timer_current-timer_poll > PERIOD_ICQPOLL) { cli.Poll(); sendinvisible(); timer_poll = timer_current; /* * * Will to the mass-adding stuff here too.. * */ vector::iterator ic = uinstosend.begin(); if(ic != uinstosend.end()) { imcontact imc = *ic; uinstosend.erase(ic); ContactRef icont = cli.getContact(imc.uin); if(!icont.get()) sendnewuser(imc); } } if(timer_current-timer_resolve > PERIOD_RESOLVE) { resolve(); timer_resolve = timer_current; } } } void icqhook::main() { vector::iterator i; struct timeval tv; int hsock; fd_set rs, ws, es; FD_ZERO(&rs); FD_ZERO(&ws); FD_ZERO(&es); tv.tv_sec = tv.tv_usec = 0; hsock = 0; for(i = rfds.begin(); i != rfds.end(); ++i) { FD_SET(*i, &rs); hsock = max(hsock, *i); } for(i = wfds.begin(); i != wfds.end(); ++i) { FD_SET(*i, &ws); hsock = max(hsock, *i); } for(i = efds.begin(); i != efds.end(); ++i) { FD_SET(*i, &es); hsock = max(hsock, *i); } if(select(hsock+1, &rs, &ws, &es, &tv) > 0) { for(i = rfds.begin(); i != rfds.end(); ++i) { if(FD_ISSET(*i, &rs)) { cli.socket_cb(*i, SocketEvent::READ); break; } } for(i = wfds.begin(); i != wfds.end(); ++i) { if(FD_ISSET(*i, &ws)) { cli.socket_cb(*i, SocketEvent::WRITE); break; } } for(i = efds.begin(); i != efds.end(); ++i) { if(FD_ISSET(*i, &es)) { cli.socket_cb(*i, SocketEvent::EXCEPTION); break; } } } } void icqhook::getsockets(fd_set &rs, fd_set &ws, fd_set &es, int &hsocket) const { vector::const_iterator i; for(i = rfds.begin(); i != rfds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &rs); } for(i = wfds.begin(); i != wfds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &ws); } for(i = efds.begin(); i != efds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &es); } } bool icqhook::isoursocket(fd_set &rs, fd_set &ws, fd_set &es) const { vector::const_iterator i; for(i = rfds.begin(); i != rfds.end(); ++i) if(FD_ISSET(*i, &rs)) return true; for(i = wfds.begin(); i != wfds.end(); ++i) if(FD_ISSET(*i, &ws)) return true; for(i = efds.begin(); i != efds.end(); ++i) if(FD_ISSET(*i, &es)) return true; return false; } bool icqhook::online() const { return fonline; } bool icqhook::logged() const { return fonline && flogged; } bool icqhook::isconnecting() const { return fonline && !flogged; } bool icqhook::enabled() const { return true; } bool icqhook::send(const imevent &ev) { unsigned int uin = ev.getcontact().uin; ContactRef ic = cli.getContact(uin); MessageEvent *sev = 0; ICQMessageEvent *iev; icqcontact *c=clist.get(ev.getcontact()); if(ev.getcontact().pname != proto) uin = 0; if(!uin) ic = cli.getSelfContact(); if(!ic.get()) return false; if(ev.gettype() == imevent::message) { const immessage *m = static_cast (&ev); string text = m->gettext(), sub; #ifdef HAVE_GPGME if ( (c!=NULL) && (pgp.enabled(ev.getcontact())) ) { text = pgp.encrypt(text, c->getpgpkey(), proto); text = "-----BEGIN PGP MESSAGE-----\n\n" + text + "\n-----END PGP MESSAGE-----\n"; } #endif if(ic->getStatus() == STATUS_OFFLINE) if(text.size() > 450) { while(!text.empty()) { if(text.size() > 450) { sub = text.substr(0, 450); text.erase(0, 450); } else { sub = text; text = ""; } cli.SendEvent(new NormalMessageEvent(ic, ruscrlfconv("kw", sub))); } return true; } sev = new NormalMessageEvent(ic, ruscrlfconv("kw", text)); } else if(ev.gettype() == imevent::url) { const imurl *m = static_cast (&ev); sev = new URLMessageEvent(ic, ruscrlfconv("kw", m->getdescription()), ruscrlfconv("kw", m->geturl())); } else if(ev.gettype() == imevent::sms) { const imsms *m = static_cast (&ev); if(!uin) { if(m->getphone().empty()) { if(ic->getMainHomeInfo().getMobileNo().empty()) { cli.fetchSelfDetailContactInfo(); return false; } } else { ic = new Contact(m->getphone()); ic->setMobileNo(m->getphone()); ContactTree &ct = cli.getContactTree(); ContactTree::Group &g = ct.group_size() ? *ct.begin() : ct.add_group("New"); g.add(ic); } } else { cli.contact_userinfo_change_signal.disconnect(this); ic->setMobileNo(clist.get(ev.getcontact())->getbasicinfo().cellular); cli.contact_userinfo_change_signal.connect(this, &icqhook::contact_userinfo_change_signal_cb); } sev = new SMSMessageEvent(ic, rusconv("ku", m->getmessage()), true); } else if(ev.gettype() == imevent::authorization) { const imauthorization *m = static_cast (&ev); switch(m->getauthtype()) { case imauthorization::Granted: case imauthorization::Rejected: sev = new AuthAckEvent(ic, ruscrlfconv("kw", m->getmessage()), m->getauthtype() == imauthorization::Granted); break; case imauthorization::Request: sev = new AuthReqEvent(ic, ruscrlfconv("kw", m->getmessage())); if(c != NULL) { icqcontact::basicinfo bi = c->getbasicinfo(); bi.authawait = true; c->setbasicinfo(bi); } break; } } else if(ev.gettype() == imevent::contacts) { const imcontacts *m = static_cast (&ev); vector< pair >::const_iterator icc; list slst; for(icc = m->getcontacts().begin(); icc != m->getcontacts().end(); ++icc) { ContactRef ct(new Contact(icc->first)); ct->setAlias(ruscrlfconv("kw", icc->second)); slst.push_back(ct); } sev = new ContactMessageEvent(ic, slst); } else { return false; } if(sev) { if(ic->getStatus() == STATUS_DND || ic->getStatus() == STATUS_OCCUPIED) if(iev = dynamic_cast(sev)) iev->setUrgent(true); cli.SendEvent(sev); } return true; } void icqhook::sendnewuser(const imcontact &ic) { static time_t lastadd = 0; icqcontact *cc = clist.get(ic); if(logged() && ic.uin && cc) { if(timer_current-lastadd > DELAY_SENDNEW) { ContactRef cont = addContact(ic.uin, groups.getname(cc->getgroupid())); cli.fetchSimpleContactInfo(cont); cli.fetchDetailContactInfo(cont); if(sblrecv && cc->inlist()) { ContactTree::Group &g = cli.getContactTree().lookup_group_containing_contact(cont); cont->setServerSideInfo(g.get_id(), 0); cont->setServerBased(true); cont->setAuthAwait(cc->getbasicinfo().authawait); //cli.uploadServerBasedContact(cont); } lastadd = timer_current; } else { uinstosend.push_back(ic); } } } void icqhook::removeuser(const imcontact &c) { ContactRef ic = cli.getContact(c.uin); if(ic.get()) { icqcontact *cc = clist.get(c); if(cc) if(cc->inlist()) { if(ic->getServerBased()) { ic->setAlias(cc->getnick()); ic->setAuthAwait(cc->getbasicinfo().authawait); //cli.removeServerBasedContact(ic); } } ContactTree& ct = cli.getContactTree(); ContactTree::Group &gr = ct.lookup_group_containing_contact(ic); gr.remove(c.uin); } } void icqhook::setautostatus(imstatus st) { if(st != offline) { if(getstatus() == offline) { connect(); } else { sendinvisible(); logger.putourstatus(icq, getstatus(), st); cli.setStatus(stat2int[st], st == invisible); } } else { if(getstatus() != offline) { disconnect(); } } } imstatus icqhook::getstatus() const { if(!fonline) { return offline; } else if(cli.getInvisible()) { return invisible; } else { return icq2imstatus(cli.getStatus()); } } bool icqhook::regconnect(const string &aserv) { int pos; if((pos = aserv.find(":")) != -1) { cli.setLoginServerHost(aserv.substr(0, pos)); cli.setLoginServerPort(strtoul(aserv.substr(pos+1).c_str(), 0, 0)); } return true; } bool icqhook::regattempt(unsigned int &auin, const string &apassword, const string &email) { fd_set srfds, swfds, sefds; struct timeval tv; int hsockfd; time_t regtimeout = time(0); reguin = 0; cli.setPassword(apassword); cli.RegisterUIN(); while(!reguin && (time(0)-regtimeout < 60)) { hsockfd = 0; FD_ZERO(&srfds); FD_ZERO(&swfds); FD_ZERO(&sefds); getsockets(srfds, swfds, sefds, hsockfd); tv.tv_sec = 30; tv.tv_usec = 0; select(hsockfd+1, &srfds, &swfds, &sefds, &tv); if(isoursocket(srfds, swfds, sefds)) { main(); } } auin = reguin; return (bool) reguin; } imstatus icqhook::icq2imstatus(const Status st) const { switch(st) { case STATUS_AWAY: return away; case STATUS_NA: return notavail; case STATUS_OCCUPIED: return occupied; case STATUS_DND: return dontdisturb; case STATUS_FREEFORCHAT: return freeforchat; case STATUS_OFFLINE: return offline; case STATUS_ONLINE: default: return available; } } void icqhook::requestinfo(const imcontact &c) { if(logged() && c.uin) { if(c == imcontact(conf->getourid(icq).uin, icq)) { // Our info is requested cli.fetchSelfDetailContactInfo(); } else { ContactRef icont = cli.getContact(c.uin); if(!icont.get()) { addContact(c.uin, ""); } else { cli.fetchSimpleContactInfo(icont); cli.fetchDetailContactInfo(icont); } } } } void icqhook::lookup(const imsearchparams ¶ms, verticalmenu &dest) { ICQ2000::Sex sex; while(!foundguys.empty()) { delete foundguys.back(); foundguys.pop_back(); } searchdest = &dest; sex = params.gender == genderMale ? ICQ2000::SEX_MALE : params.gender == genderFemale ? ICQ2000::SEX_FEMALE : ICQ2000::SEX_UNKNOWN; if(params.uin) { searchevent = cli.searchForContacts(params.uin); } else if(!params.kwords.empty()) { searchevent = cli.searchForContacts(rusconv("kw", params.kwords)); } else if(params.randomgroup) { searchevent = cli.searchForContacts((ICQ2000::RandomChatGroup) params.randomgroup); } else if(!params.email.empty() || params.minage || params.maxage || !params.city.empty() || !params.state.empty() || !params.company.empty() || !params.department.empty() || !params.position.empty() || params.onlineonly || params.country || params.language || (sex != SEX_UNKNOWN) || (params.agerange != RANGE_NORANGE)) { searchevent = cli.searchForContacts(rusconv("kw", params.nick), rusconv("kw", params.firstname), rusconv("kw", params.lastname), rusconv("kw", params.email), params.agerange, sex, params.language, rusconv("kw", params.city), rusconv("kw", params.state), params.country, rusconv("kw", params.company), rusconv("kw", params.department), rusconv("kw", params.position), params.onlineonly); } else { searchevent = cli.searchForContacts(rusconv("kw", params.nick), rusconv("kw", params.firstname), rusconv("kw", params.lastname)); } } void icqhook::sendupdateuserinfo(const icqcontact &c) { ContactRef ic = cli.getSelfContact(); cli.self_contact_userinfo_change_signal.disconnect(this); Contact::MainHomeInfo &home = ic->getMainHomeInfo(); Contact::HomepageInfo &hpage = ic->getHomepageInfo(); Contact::WorkInfo &work = ic->getWorkInfo(); const icqcontact::basicinfo &cbinfo = c.getbasicinfo(); const icqcontact::moreinfo &cminfo = c.getmoreinfo(); const icqcontact::workinfo &cwinfo = c.getworkinfo(); /* basic information */ ic->setAlias(rusconv("kw", c.getnick())); ic->setFirstName(rusconv("kw", cbinfo.fname)); ic->setLastName(rusconv("kw", cbinfo.lname)); ic->setEmail(rusconv("kw", cbinfo.email)); ic->setAuthReq(cbinfo.requiresauth); ic->setAboutInfo(rusconv("kw", c.getabout())); home.city = rusconv("kw", cbinfo.city); home.state = rusconv("kw", cbinfo.state); home.phone = rusconv("kw", cbinfo.phone); home.fax = rusconv("kw", cbinfo.fax); home.street = rusconv("kw", cbinfo.street); home.setMobileNo(rusconv("kw", cbinfo.cellular)); home.zip = cbinfo.zip; home.country = (Country) cbinfo.country; home.timezone = (Timezone) getSystemTimezone(); /* more information */ hpage.age = cminfo.age; hpage.sex = cminfo.gender == genderFemale ? SEX_FEMALE : cminfo.gender == genderMale ? SEX_MALE : SEX_UNKNOWN; hpage.homepage = rusconv("kw", cminfo.homepage); hpage.birth_day = cminfo.birth_day; hpage.birth_month = cminfo.birth_month; hpage.birth_year = cminfo.birth_year; hpage.lang1 = (Language) cminfo.lang1; hpage.lang2 = (Language) cminfo.lang2; hpage.lang3 = (Language) cminfo.lang3; /* work information */ work.city = rusconv("kw", cwinfo.city); work.state = rusconv("kw", cwinfo.state); work.street = rusconv("kw", cwinfo.street); work.company_name = rusconv("kw", cwinfo.company); work.company_dept = rusconv("kw", cwinfo.dept); work.company_position = rusconv("kw", cwinfo.position); work.company_web = rusconv("kw", cwinfo.homepage); work.zip = cwinfo.zip; work.country = cwinfo.country; ic->setMainHomeInfo(home); ic->setHomepageInfo(hpage); ic->setWorkInfo(work); ic->setAuthReq(cbinfo.requiresauth); icqconf::imaccount acc = conf->getourid(icq); acc.additional["webaware"] = cbinfo.webaware ? "1" : "0"; acc.additional["randomgroup"] = i2str(cbinfo.randomgroup); conf->setourid(acc); cli.setWebAware(cbinfo.webaware); cli.setRandomChatGroup(cbinfo.randomgroup); cli.uploadSelfDetails(); cli.self_contact_userinfo_change_signal.connect(this, &icqhook::self_contact_userinfo_change_cb); /* if(!c.getreginfo().password.empty()) cli.changePassword(c.getreginfo().password);*/ } void icqhook::requestawaymsg(const imcontact &c) { ContactRef ic = cli.getContact(c.uin); if(ic.get()) { cli.SendEvent(new AwayMessageEvent(ic)); } } void icqhook::updateinforecord(ContactRef ic, icqcontact *c) { string sbuf; vector pintinfo, backginfo; list::iterator ii; list::iterator isc; icqcontact::basicinfo cbinfo; icqcontact::moreinfo cminfo; icqcontact::workinfo cwinfo; if(ic.get() && c) { Contact::MainHomeInfo &home = ic->getMainHomeInfo(); Contact::HomepageInfo &hpage = ic->getHomepageInfo(); Contact::WorkInfo &work = ic->getWorkInfo(); Contact::PersonalInterestInfo &pint = ic->getPersonalInterestInfo(); Contact::BackgroundInfo &backg = ic->getBackgroundInfo(); Contact::EmailInfo &email = ic->getEmailInfo(); cbinfo = c->getbasicinfo(); cminfo = c->getmoreinfo(); cwinfo = c->getworkinfo(); /* basic information */ cbinfo.fname = rusconv("wk", ic->getFirstName()); cbinfo.lname = rusconv("wk", ic->getLastName()); if(!ic->getEmail().empty()) cbinfo.email = rusconv("wk", ic->getEmail()); cbinfo.city = rusconv("wk", home.city); cbinfo.state = rusconv("wk", home.state); cbinfo.phone = rusconv("wk", home.phone); cbinfo.fax = rusconv("wk", home.fax); cbinfo.street = rusconv("wk", home.street); cbinfo.requiresauth = ic->getAuthReq(); if(!home.getMobileNo().empty()) cbinfo.cellular = rusconv("wk", home.getMobileNo()); cbinfo.zip = home.zip; cbinfo.country = home.country; /* more information */ cminfo.age = hpage.age; cminfo.gender = hpage.sex == 1 ? genderFemale : hpage.sex == 2 ? genderMale : genderUnspec; cminfo.homepage = rusconv("wk", hpage.homepage); cminfo.birth_day = hpage.birth_day; cminfo.birth_month = hpage.birth_month; cminfo.birth_year = hpage.birth_year; cminfo.lang1 = hpage.lang1; cminfo.lang2 = hpage.lang2; cminfo.lang3 = hpage.lang3; cminfo.timezone = home.timezone; /* work information */ cwinfo.city = rusconv("wk", work.city); cwinfo.state = rusconv("wk", work.state); cwinfo.street = rusconv("wk", work.street); cwinfo.company = rusconv("wk", work.company_name); cwinfo.dept = rusconv("wk", work.company_dept); cwinfo.position = rusconv("wk", work.company_position); cwinfo.homepage = rusconv("wk", work.company_web); cwinfo.zip = work.zip; cwinfo.country = work.country; /* personal interests */ for(ii = pint.interests.begin(); ii != pint.interests.end(); ++ii) { sbuf = getInterestsIDtoString(ii->first); if(!ii->second.empty()) { if(!sbuf.empty()) sbuf += ": "; sbuf += rusconv("wk", ii->second); } if(!sbuf.empty()) pintinfo.push_back(sbuf); } /* education background */ for(isc = backg.schools.begin(); isc != backg.schools.end(); ++isc) { sbuf = getBackgroundIDtoString(isc->first); if(!sbuf.empty()) sbuf += ": "; sbuf += rusconv("wk", isc->second); if(!sbuf.empty()) backginfo.push_back(sbuf); } /* nicknames stuff */ string nick = rusconv("wk", ic->getAlias()); if((c->getnick() == c->getdispnick()) || (c->getdispnick() == i2str(c->getdesc().uin))) { c->setdispnick(nick); } c->setnick(nick); c->setbasicinfo(cbinfo); c->setmoreinfo(cminfo); c->setworkinfo(cwinfo); c->setinterests(pintinfo); c->setbackground(backginfo); c->setabout(rusconv("wk", ic->getAboutInfo())); face.relaxedupdate(); } } void icqhook::processemailevent(const string &sender, const string &email, const string &message) { if(email.empty() && sender.empty() && message.empty()) return; icqcontact *c = clist.getemail(email); if(!c) if(c = clist.addnew(imcontact(0, infocard), true)) { c->setdispnick(email); c->setnick(email); icqcontact::basicinfo b = c->getbasicinfo(); if(sender != email) { int pos = sender.find(" "); if(pos != -1) { b.fname = sender.substr(0, pos); b.lname = sender.substr(pos+1); } else { b.fname = sender; } } b.email = email; c->setbasicinfo(b); } if(c) { em.store(imemail(c, imevent::incoming, rusconv("wk", message))); } } void icqhook::updatecontact(icqcontact *c) { if(sblrecv) { ContactTree &tree = cli.getContactTree(); ContactRef ic = tree[c->getdesc().uin]; if(ic.get()) { string gname = groups.getname(c->getgroupid()); ContactTree::Group &oldg = tree.lookup_group_containing_contact(ic); ContactTree::Group *newg = 0; if(oldg.get_label() != gname) { ContactTree::iterator curr = tree.begin(); while(curr != tree.end()) { if((*curr).get_label() == gname) { newg = &(*curr); break; } ++curr; } //cli.removeServerBasedContact(ic); if(!newg) newg = &(tree.add_group(gname)); tree.relocate_contact(ic, oldg, *newg); ic->setServerSideInfo(newg->get_id(), ic->getServerSideID()); ic->setAuthAwait(c->getbasicinfo().authawait); //cli.uploadServerBasedContact(ic); } } } } void icqhook::renamegroup(const string &oldname, const string &newname) { if(logged()) { /* ContactTree::Group *gp = 0; ContactTree &ct = cli.getContactTree(); ContactTree::iterator curr = ct.begin(); while(curr != ct.end()) { if((*curr).get_label() == oldname) { gp = &(*curr); break; } ++curr; } if(gp) { gp->set_label(newname); cli.uploadServerBasedGroup(*gp); } */ } } // ---------------------------------------------------------------------------- void icqhook::connected_cb(ConnectedEvent *ev) { flogged = true; timer_poll = timer_current; timer_resolve = timer_poll-PERIOD_RESOLVE+3; logger.putourstatus(icq, offline, manualstatus); cli.setRandomChatGroup(strtoul(conf->getourid(icq).additional["randomgroup"].c_str(), 0, 0)); log(logLogged); face.update(); string buf; ifstream f(conf->getconfigfname("icq-infoset").c_str()); if(f.is_open()) { getstring(f, buf); cli.getSelfContact()->setAlias(buf); getstring(f, buf); cli.getSelfContact()->setEmail(buf); getstring(f, buf); cli.getSelfContact()->setFirstName(buf); getstring(f, buf); cli.getSelfContact()->setLastName(buf); f.close(); cli.getSelfContact()->getMainHomeInfo().timezone = (Timezone) getSystemTimezone(); cli.uploadSelfDetails(); unlink(conf->getconfigfname("icq-infoset").c_str()); } cli.fetchServerBasedContactList(); } void icqhook::disconnected_cb(DisconnectedEvent *ev) { string msg; static const string reasons[DisconnectedEvent::FAILED_UNKNOWN+1] = { _("as requested"), _("socket problems"), _("bad username"), _("turboing"), _("bad password"), _("username and password mismatch"), _("dual login detected"), "" }; rfds.clear(); wfds.clear(); efds.clear(); msg = isconnecting() ? _("+ [icq] cannot connect") : _("+ [icq] disconnected"); logger.putourstatus(icq, getstatus(), offline); clist.setoffline(icq); fonline = false; if(!reasons[ev->getReason()].empty()) { msg += ": "; msg += reasons[ev->getReason()]; logger.putmessage((string) _("icq disconnection reason") + ": " + reasons[ev->getReason()]); if(ev->getReason() == DisconnectedEvent::FAILED_DUALLOGIN) manualstatus = offline; } face.log(msg); face.update(); } static string fixicqrtf(string msg) { int pos, bpos, n; string sub; static char *emoticons[] = { ":-)", ":-O", ":-|", ":-\\", ":-(", ":-*", "8-/", ":~(", ";-)", ">:-O", ":`(", ":-X", ":-P", "B-)", "O:-)", ":-D", "*ANNOYED*", "*DISGUSTED*", "*DROOLING*", "*GIGGLING*", "*JOKINGLY*", "*SHOCKED*", "*WHINNING*", "*SURPRISED*", "*SURPRISED*", "*IN LOVE*" }; for(pos = 0; (pos = msg.find("<##icqimage", pos)) != -1; ) { if((bpos = msg.find(">", pos)) != -1) { sub = msg.substr(pos, bpos-pos); if(sub.size() > 2) sub.erase(0, sub.size()-2); n = hex2int(sub); if(n >= 0 && n <= 25) { msg.erase(pos, bpos-pos+1); msg.insert(pos, emoticons[n]); } else { pos++; } } } return msg; } void icqhook::messaged_cb(MessageEvent *ev) { imcontact ic; string text; ic = imcontact(ev->getContact()->getUIN(), icq); if(ev->getType() == MessageEvent::Normal) { NormalMessageEvent *r = static_cast(ev); bool converted = false; // check for UCS-2BE encoding in message if (r->getEncoding() == (unsigned int)0x0002) { string msg = r->getMessage(); text = rusconv("ck", msg); converted = true; } else text = r->getMessage(); if(text.substr(0, 6) == "{\\rtf1") text = fixicqrtf(striprtf(text, converted?conf->getconvertto(proto):conf->getconvertfrom(proto))); text = converted ? text : rusconv("wk", text); #ifdef HAVE_GPGME const string pgpBlockBegin = "-----BEGIN PGP MESSAGE-----"; const string pgpBlockEnd = "-----END PGP MESSAGE-----"; string enc; int pgpDataBegin = text.find(pgpBlockBegin); int pgpDataEnd = text.find(pgpBlockEnd); // find where actual PGP data starts if (pgpDataBegin != string::npos) { int a = text.find("\n\n", pgpDataBegin+1); int b = text.find("\r\n\r\n", pgpDataBegin+1); if(a != string::npos) { if(b != string::npos) { // if we found both, take the smaller value if (asetusepgpkey(true); if(pgp.enabled(proto)) { string dec = pgp.decrypt(enc, proto); string logMsg; if(dec.length() != 0) { logMsg="+ "+ic.totext()+" ("+c->getdispnick()+") PGP message decoded"; text = dec; } else { // if we fail to decode message, // just display it as it is logMsg="+ "+ic.totext()+" ("+c->getdispnick()+") FAILED to decode PGP message"; } logger.putmessage(logMsg); face.log(logMsg); } else { c->setusepgpkey(false); } } else { c->setusepgpkey(false); } } } #endif em.store(immessage(ic, imevent::incoming, text, r->getTime())); } else if(ev->getType() == MessageEvent::URL) { URLMessageEvent *r = static_cast(ev); em.store(imurl(ic, imevent::incoming, rusconv("wk", r->getURL()), rusconv("wk", r->getMessage()))); } else if(ev->getType() == MessageEvent::SMS) { SMSMessageEvent *r = static_cast(ev); icqcontact *c = clist.getmobile(r->getSender()); if(!c) if(c = clist.addnew(imcontact(0, infocard), true)) { icqcontact::basicinfo b = c->getbasicinfo(); b.cellular = r->getSender(); c->setbasicinfo(b); c->setdispnick(b.cellular); c->setnick(b.cellular); } if(c) { em.store(imsms(c, imevent::incoming, rusconv("uk", r->getMessage()))); } } else if(ev->getType() == MessageEvent::AuthReq) { AuthReqEvent *r = static_cast(ev); em.store(imauthorization(ic, imevent::incoming, imauthorization::Request, rusconv("wk", r->getMessage()))); } else if(ev->getType() == MessageEvent::AuthAck) { AuthAckEvent *r = static_cast(ev); icqcontact *c = clist.get(ic); if(c) { icqcontact::basicinfo bi = c->getbasicinfo(); bi.authawait = false; c->setbasicinfo(bi); ContactRef cr = cli.getContactTree()[ic.uin]; if(cr.get()) { cr->setAuthAwait(false); //cli.removeServerBasedContact(cr); //cli.uploadServerBasedContact(cr); } } if(r->isGranted()) { em.store(imnotification(ic, _("The user has accepted your authorization request"))); } else { em.store(imnotification(ic, (string) _("The user has rejected your authorization request; the message was: ") + r->getMessage())); } } else if(ev->getType() == MessageEvent::EmailEx) { EmailExEvent *r = static_cast(ev); processemailevent(r->getSender(), r->getEmail(), r->getMessage()); } else if(ev->getType() == MessageEvent::WebPager) { WebPagerEvent *r = static_cast(ev); processemailevent(r->getSender(), r->getEmail(), r->getMessage()); } else if(ev->getType() == MessageEvent::UserAdd) { UserAddEvent *r = static_cast(ev); em.store(imnotification(ic, _("The user has added you to his/her contact list"))); } else if(ev->getType() == MessageEvent::Contacts) { ContactMessageEvent *r = static_cast(ev); vector< pair > lst; list clst = r->getContacts(); list::iterator il; for(il = clst.begin(); il != clst.end(); ++il) { lst.push_back(make_pair((*il)->getUIN(), (*il)->getAlias())); } em.store(imcontacts(ic, imevent::incoming, lst)); } ev->setDelivered(true); } void icqhook::messageack_cb(MessageEvent *ev) { imcontact ic; icqcontact *c; ICQMessageEvent *me; ic = imcontact(ev->getContact()->getUIN(), icq); c = clist.get(ic); if(!c) { c = clist.get(contactroot); c->setdispnick(cli.getSelfContact()->getAlias()); } if(ev->isFinished()) { // The FINAL decision. switch(ev->getType()) { case MessageEvent::SMS: if(!ev->isDelivered()) { if(ev->getContact()->getUIN()) { face.log(_("+ [icq] failed SMS to %s, %s"), c->getdispnick().c_str(), ic.totext().c_str()); } else { face.log(_("+ [icq] failed SMS to %s"), ev->getContact()->getAlias().c_str()); } } break; case MessageEvent::AwayMessage: if(ev->isDelivered()) { AwayMessageEvent *r; if(r = dynamic_cast(ev)) { em.store(imnotification(ic, string() + _("Away message:") + "\n\n" + rusconv("wk", r->getAwayMessage()))); } } else { face.log(_("+ [icq] cannot fetch away msg from %s, %s (maybe no away msg set)"), c->getdispnick().c_str(), ic.totext().c_str()); } break; } } else { /* * * Rejected, but there is still something to be done. * */ } } void icqhook::contactlist_cb(ContactListEvent *ev) { } void icqhook::contact_status_change_signal_cb(StatusChangeEvent *ev) { icqcontact *c = clist.get(imcontact(ev->getUIN(), icq)); if(c) { ContactRef ic = ev->getContact(); StatusChangeEvent *tev = dynamic_cast(ev); imstatus nst = icq2imstatus(tev->getStatus()); if(ic->isInvisible()) nst = invisible; c->setidlefor(ic->getExtPort()); logger.putonline(c, c->getstatus(), nst); c->setstatus(nst); if (ic->get_signon_time()) c->setonlinesince(ic->get_signon_time()); if (nst == offline) c->setlasttyping(0); } } void icqhook::contact_userinfo_change_signal_cb(UserInfoChangeEvent *ev) { icqcontact *c = clist.get(imcontact(ev->getUIN(), icq)); ContactRef ic = ev->getContact(); if(!c) { c = clist.get(contactroot); /* * * In case we wanna look up info about a user which * is not on our contact list. * */ } if(!ev->isTransientDetail()) { updateinforecord(ic, c); } else { char *p; string lastip, sbuf, oldip; struct in_addr addr; oldip = c->getlastip(); addr.s_addr = ntohl(ic->getExtIP()); if(p = inet_ntoa(addr)) lastip = p; if(lastip.find_first_not_of(".0") != -1) { addr.s_addr = ntohl(ic->getLanIP()); if(p = inet_ntoa(addr)) { sbuf = p; if(sbuf.find_first_not_of(".0") != -1 && lastip != sbuf) { if(!lastip.empty()) lastip += " "; lastip += sbuf; } } c->setlastip(lastip); } else { if ((c->getstatus() != offline) && (oldip.find_first_of("*"))) { oldip.insert(0, "* "); c->setlastip(oldip); } } } } void icqhook::contact_typing_signal_cb(UserTypingNotificationEvent *ev) { icqcontact *c = clist.get(imcontact(ev->getUIN(), icq)); if(c) { time_t when = ev->isTyping() ? (time(NULL) + 300) : 0; // nobody should type for more than five minutes without a break... c->setlasttyping(when); face.relaxedupdate(); } } void icqhook::newuin_cb(NewUINEvent *ev) { reguin = ev->getUIN(); } void icqhook::rate_cb(RateInfoChangeEvent *ev) { } void icqhook::logger_cb(LogEvent *ev) { switch(ev->getType()) { case LogEvent::PACKET: case LogEvent::DIRECTPACKET: face.log(ev->getMessage()); break; default: face.log(ev->getMessage()); break; } } void icqhook::socket_cb(SocketEvent *ev) { vector::iterator i; if(dynamic_cast(ev)) { AddSocketHandleEvent *cev = dynamic_cast(ev); if(cev->isRead()) rfds.push_back(cev->getSocketHandle()); if(cev->isWrite()) wfds.push_back(cev->getSocketHandle()); if(cev->isException()) efds.push_back(cev->getSocketHandle()); } else if(dynamic_cast(ev)) { RemoveSocketHandleEvent *cev = dynamic_cast(ev); i = find(rfds.begin(), rfds.end(), cev->getSocketHandle()); if(i != rfds.end()) rfds.erase(i); i = find(wfds.begin(), wfds.end(), cev->getSocketHandle()); if(i != wfds.end()) wfds.erase(i); i = find(efds.begin(), efds.end(), cev->getSocketHandle()); if(i != efds.end()) efds.erase(i); } } void icqhook::want_auto_resp_cb(ICQMessageEvent *ev) { /* TODO: something should probably be logged here, but * logging an UNITIALIZED BUFFER seems pretty stupid to me */ /* char buf[128]; */ string ident; imcontact cont = imcontact(ev->getSenderUIN(), icq); icqcontact *c = clist.get(cont); ident = cont.totext(); if(c) ident += " (" + c->getdispnick() + ")"; /* logger.putmessage(buf); */ ev->setAwayMessage(rusconv("kw", conf->getawaymsg(icq))); } void icqhook::search_result_cb(SearchResultEvent *ev) { if(ev == searchevent) { ContactRef cont = ev->getLastContactAdded(); if(searchdest && cont.get()) { icqcontact *c = new icqcontact(imcontact(cont->getUIN(), icq)); icqcontact::basicinfo binfo = c->getbasicinfo(); if(ev->getSearchType() == SearchResultEvent::RandomChat) { binfo.fname = _("Random Chat User"); } else { c->setnick(rusconv("wk", cont->getAlias())); c->setdispnick(c->getnick()); binfo.fname = rusconv("wk", cont->getFirstName()); binfo.lname = rusconv("wk", cont->getLastName()); binfo.email = rusconv("wk", cont->getEmail()); } string line = (cont->getStatus() == STATUS_ONLINE ? "o " : " ") + c->getnick(); if(line.size() > 12) line.resize(12); else line += string(12-line.size(), ' '); line += " " + binfo.fname + " " + binfo.lname; if(!binfo.email.empty()) line += " <" + binfo.email + ">"; binfo.requiresauth = cont->getAuthReq(); binfo.authawait = cont->getAuthAwait(); c->setbasicinfo(binfo); foundguys.push_back(c); searchdest->additem(conf->getcolor(cp_clist_icq), c, line); searchdest->redraw(); } if(ev->isFinished() && searchdest) { face.findready(); log(logSearchFinished, ev->getContactList().size()); searchdest = 0; } } } void icqhook::self_contact_userinfo_change_cb(UserInfoChangeEvent *ev) { if(!ev->isTransientDetail()) { icqcontact *c = clist.get(contactroot); updateinforecord(cli.getSelfContact(), c); updateinforecord(cli.getSelfContact(), clist.get(imcontact(cli.getUIN(), icq))); /* * * Fill in the locally stored parts now. * */ icqconf::imaccount im = conf->getourid(icq); icqcontact::basicinfo cbinfo = c->getbasicinfo(); cbinfo.webaware = im.additional["webaware"] == "1"; cbinfo.randomgroup = strtoul(im.additional["randomgroup"].c_str(), 0, 0); c->setbasicinfo(cbinfo); } } void icqhook::self_contact_status_change_cb(StatusChangeEvent *ev) { face.update(); } /* void icqhook::password_changed_cb(PasswordChangeEvent *ev) { if(ev->isSuccess()) { icqconf::imaccount acc = conf->getourid(icq); acc.password = ev->getPassword(); conf->setourid(acc); log(logPasswordChanged); } } */ void icqhook::sbl_received_cb(SBLReceivedEvent *ev) { icqcontact *cc; ContactTree &tree = cli.getContactTree(); ContactTree::iterator curr = ev->tree.begin(); sblrecv = false; while(curr != ev->tree.end()) { ContactTree::Group *lg = 0; ContactTree::iterator igl = tree.begin(); while(igl != tree.end()) { if((*igl).get_label() == (*curr).get_label()) { lg = &(*igl); break; } ++igl; } if(!lg) { lg = &(tree.add_group((*curr).get_label(), (*curr).get_id())); } else { lg->set_id((*curr).get_id()); } ContactTree::Group::iterator ig = curr->begin(); while(ig != curr->end()) { imcontact ic((*ig)->getUIN(), proto); clist.updateEntry(ic, (*curr).get_label()); ContactRef nc = tree[ic.uin]; if(nc.get()) { ContactTree::Group &cg = tree.lookup_group_containing_contact(nc); tree.relocate_contact(nc, cg, *lg); } else { nc = lg->add(new Contact(ic.uin)); } nc->setAuthAwait((*ig)->getAuthAwait()); if(cc = clist.get(ic)) { icqcontact::basicinfo bi = cc->getbasicinfo(); bi.authawait = nc->getAuthAwait(); bi.serverbased = true; cc->setbasicinfo(bi); } nc->setServerBased(true); nc->setServerSideInfo((*ig)->getServerSideGroupID(), (*ig)->getServerSideID()); ++ig; } ++curr; } sblrecv = true; } ContactRef icqhook::addContact(unsigned int uin, const string &groupname) { ContactTree& ct = cli.getContactTree(); ContactTree::Group *gp = 0; ContactTree::iterator curr = ct.begin(); while(curr != ct.end()) { if((*curr).get_label() == groupname) { gp = &(*curr); break; } ++curr; } if(!gp) gp = &(ct.add_group(groupname)); ContactRef cont(new Contact(uin)); gp->add(cont); return cont; } #endif /* BUILD_ICQ */ centerim-4.22.10/src/hooks/yahoohook.cc0000644000175000001440000011034411473007750014633 00000000000000/* * * centerim yahoo! protocol handling class * $Id: yahoohook.cc,v 1.112 2004/12/20 00:54:02 konst Exp $ * * Copyright (C) 2003-2004 by Konstantin Klyagin * * 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 "icqcommon.h" #ifdef BUILD_YAHOO #include "yahoohook.h" #include "icqmlist.h" #include "icqface.h" #include "imlogger.h" #include "icqcontacts.h" #include "icqgroups.h" #include "accountmanager.h" #include "eventmanager.h" #include "yahoo2.h" #include "connwrap.h" #include #include #include #define PERIOD_REFRESH 60 #define PERIOD_CLOSE 6 #define NOTIFBUF 512 int yahoohook::yfd::connection_tags = 0; char pager_host[255], pager_port[255], filetransfer_host[255], filetransfer_port[255], webcam_host[255], webcam_port[255], local_host[255], webcam_description[255]; int conn_type; yahoohook yhook; static int stat2int[imstatus_size] = { YAHOO_STATUS_OFFLINE, YAHOO_STATUS_AVAILABLE, YAHOO_STATUS_INVISIBLE, YAHOO_STATUS_CUSTOM, YAHOO_STATUS_BUSY, YAHOO_STATUS_NOTATDESK, YAHOO_STATUS_NOTATHOME, YAHOO_STATUS_IDLE, YAHOO_STATUS_OUTTOLUNCH, }; yahoohook::yahoohook() : abstracthook(yahoo), fonline(false), cid(0) { fcapabs.insert(hookcapab::setaway); fcapabs.insert(hookcapab::fetchaway); fcapabs.insert(hookcapab::directadd); // fcapabs.insert(hookcapab::files); // fcapabs.insert(hookcapab::conferencing); // fcapabs.insert(hookcapab::conferencesaretemporary); fcapabs.insert(hookcapab::ssl); fcapabs.insert(hookcapab::authrequests); pager_host[0] = pager_port[0] = filetransfer_host[0] = filetransfer_port[0] = webcam_host[0] = webcam_port[0] = local_host[0] = 0; } yahoohook::~yahoohook() { } void yahoohook::init() { manualstatus = conf->getstatus(proto); static struct yahoo_callbacks c; memset(&c, 0, sizeof(c)); c.ext_yahoo_login_response = &login_response; c.ext_yahoo_got_buddies = &got_buddies; c.ext_yahoo_status_changed = &status_changed; c.ext_yahoo_got_im = &got_im; c.ext_yahoo_got_conf_invite = &got_conf_invite; c.ext_yahoo_conf_userdecline = &conf_userdecline; c.ext_yahoo_conf_userjoin = &conf_userjoin; c.ext_yahoo_conf_userleave = &conf_userleave; c.ext_yahoo_conf_message = &conf_message; c.ext_yahoo_got_file = &got_file; c.ext_yahoo_contact_added = &contact_added; c.ext_yahoo_game_notify = &game_notify; c.ext_yahoo_mail_notify = &mail_notify; c.ext_yahoo_system_message = &system_message; c.ext_yahoo_error = &error; c.ext_yahoo_add_handler = &add_handler; c.ext_yahoo_remove_handler = &remove_handler; c.ext_yahoo_connect_async = &connect_async; c.ext_yahoo_read = &y_read; c.ext_yahoo_write = &y_write; c.ext_yahoo_close = &y_close; c.ext_yahoo_got_identities = &got_identities; c.ext_yahoo_got_ignore = &got_ignore; c.ext_yahoo_got_cookies = &got_cookies; c.ext_yahoo_chat_cat_xml = &chat_cat_xml; c.ext_yahoo_chat_join = &chat_join; c.ext_yahoo_chat_userjoin = &chat_userjoin; c.ext_yahoo_chat_userleave = &chat_userleave; c.ext_yahoo_chat_message = &chat_message; c.ext_yahoo_rejected = &rejected; c.ext_yahoo_typing_notify = &typing_notify; c.ext_yahoo_got_webcam_image = &got_webcam_image; c.ext_yahoo_webcam_invite = &webcam_invite; c.ext_yahoo_webcam_invite_reply = &webcam_invite_reply; c.ext_yahoo_webcam_closed = &webcam_closed; c.ext_yahoo_webcam_viewer = &webcam_viewer; c.ext_yahoo_webcam_data_request = &webcam_data_request; c.ext_yahoo_got_search_result = &got_search_result; c.ext_yahoo_got_ping = &got_ping; c.ext_yahoo_log = &ylog; c.ext_yahoo_got_buddyicon_request = &got_buddyicon_request; c.ext_yahoo_got_buddyicon = &got_buddyicon; c.ext_yahoo_buddyicon_uploaded = &buddyicon_uploaded; c.ext_yahoo_chat_yahooerror = &chat_yahooerror; c.ext_yahoo_chat_yahoologout = &chat_yahoologout; c.ext_yahoo_connect = &yahoo_connect; c.ext_yahoo_file_transfer_done = &file_transfer_done; c.ext_yahoo_get_ip_addr = &get_ip_addr; c.ext_yahoo_got_buddy_change_group = &got_buddy_change_group; c.ext_yahoo_got_buddyicon_checksum = &got_buddyicon_checksum; c.ext_yahoo_got_buzz = &got_buzz; c.ext_yahoo_got_ft_data = &got_ft_data; c.ext_yahoo_auth_request = &auth_request; yahoo_register_callbacks(&c); } void yahoohook::connect() { icqconf::imaccount acc = conf->getourid(proto); int r; log(logConnecting); if(cid < 0) { yahoo_logoff(cid); yahoo_close(cid); } cid = yahoo_init_with_attributes(acc.nickname.c_str(), acc.password.c_str(), "pager_host", acc.server.c_str(), "pager_port", acc.port, (char *) NULL); yahoo_login(cid, stat2int[manualstatus]); if(cid < 0) { string msg = _("+ [yahoo] cannot connect: "); switch(cid) { case -1: msg += _("could not resolve hostname"); break; case -2: msg += _("could not create socket"); break; default: msg += _("verify the pager host and port entered"); break; } face.log(msg); } else { fonline = true; flogged = false; } } void yahoohook::main() { vector::iterator i; struct timeval tv; int hsock; fd_set rs, ws, es; FD_ZERO(&rs); FD_ZERO(&ws); FD_ZERO(&es); tv.tv_sec = tv.tv_usec = 0; hsock = 0; for(i = fds.begin(); i != fds.end(); ++i) { struct y_c ic = i->con; if (i->cond & YAHOO_INPUT_READ) FD_SET(ic.fd, &rs); if (i->cond & YAHOO_INPUT_WRITE) FD_SET(ic.fd, &ws); hsock = max(hsock, ic.fd); } if(select(hsock+1, &rs, &ws, 0, &tv) > 0) { for(i = fds.begin(); i != fds.end(); ++i) { if(i->isconnect) { if (!cw_nb_connect(i->con.fd, NULL, 0, i->con.ssl, &i->con.state)) { if (i->con.state & CW_CONNECT_WANT_SOMETHING) continue; } else { cw_close(i->con.fd); break; } struct y_c tc = i->con; connect_complete(i->data, &tc); break; } if(FD_ISSET(i->con.fd, &rs)) { yahoo_read_ready(cid, &i->con, i->data); break; } if(FD_ISSET(i->con.fd, &ws)) { yahoo_write_ready(cid, &i->con, i->data); break; } } } } void yahoohook::getsockets(fd_set &rs, fd_set &ws, fd_set &es, int &hsocket) const { if(online()) { vector::const_iterator i; for(i = fds.begin(); i != fds.end(); ++i) { if (i->cond & YAHOO_INPUT_READ) FD_SET(i->con.fd, &rs); if (i->cond & YAHOO_INPUT_WRITE) FD_SET(i->con.fd, &ws); hsocket = max(hsocket, i->con.fd); } } } bool yahoohook::isoursocket(fd_set &rs, fd_set &ws, fd_set &es) const { vector::const_iterator i; for(i = fds.begin(); i != fds.end(); ++i) { if(i->cond & YAHOO_INPUT_READ && FD_ISSET(i->con.fd, &rs)) return true; if(i->cond & YAHOO_INPUT_WRITE && FD_ISSET(i->con.fd, &ws)) return true; } return false; } void yahoohook::disconnect() { if(online()) { yahoo_logoff(cid); time(&timer_close); } } void yahoohook::disconnected() { if(logged()) { vector::const_iterator i; for(i = fds.begin(); i != fds.end(); ++i) { cw_close(i->con.fd); } fds.clear(); logger.putourstatus(proto, getstatus(), ourstatus = offline); clist.setoffline(proto); fonline = false; log(logDisconnected); face.update(); } } void yahoohook::exectimers() { vector >::iterator it; for(it = tobedone.begin(); it != tobedone.end(); ++it) { switch(it->first) { case tbdConfLogon: /* TODO: investigate if copy is really needed here */ char *room = strdup(it->second.c_str()); yahoo_conference_logon(cid, 0, getmembers(it->second), room); free (room); break; } } tobedone.clear(); if(logged()) { if(timer_current-timer_refresh > PERIOD_REFRESH) { yahoo_refresh(cid); yahoo_keepalive(cid); timer_refresh = timer_current; } else if(timer_close && timer_current-timer_close > PERIOD_CLOSE) { yahoo_close(cid); disconnected(); } } } struct tm *yahoohook::timestamp() { return localtime(&timer_current); } bool yahoohook::send(const imevent &ev) { icqcontact *c = clist.get(ev.getcontact()); string text; if(c) { if(ev.gettype() == imevent::message) { const immessage *m = static_cast(&ev); if(m) text = rushtmlconv("ku", m->gettext()); } else if(ev.gettype() == imevent::url) { const imurl *m = static_cast(&ev); if(m) text = rushtmlconv("ku", m->geturl()) + "\n\n" + rusconv("kw", m->getdescription()); } else if(ev.gettype() == imevent::file) { const imfile *m = static_cast(&ev); vector files = m->getfiles(); vector::const_iterator ir; for(ir = files.begin(); ir != files.end(); ++ir) { sfiles.push_back(strdup(ir->fname.c_str())); srfiles[sfiles.back()] = *m; yahoo_send_file(cid, ev.getcontact().nickname.c_str(), m->getmessage().c_str(), justfname(ir->fname).c_str(), ir->size, &get_fd, sfiles.back()); } return true; } else if (ev.gettype() == imevent::authorization) { const imauthorization *m = static_cast (&ev); switch(m->getauthtype()) { case imauthorization::Granted: yahoo_confirm_buddy(cid, ev.getcontact().nickname.c_str(), 0, 0); break; case imauthorization::Rejected: yahoo_confirm_buddy(cid, ev.getcontact().nickname.c_str(), 1, 0); break; } return true; } if(!ischannel(c)) { yahoo_send_im(cid, 0, ev.getcontact().nickname.c_str(), text.c_str(), 0, 0); } else { yahoo_conference_message(cid, 0, getmembers(ev.getcontact().nickname.substr(1)), ev.getcontact().nickname.c_str()+1, text.c_str(), 0); } return true; } return false; } bool yahoohook::online() const { return fonline; } bool yahoohook::logged() const { return fonline && flogged; } bool yahoohook::isconnecting() const { return fonline && !flogged; } void yahoohook::sendnewuser(const imcontact &ic) { sendnewuser(ic, true); } void yahoohook::sendnewuser(const imcontact &ic, bool report) { if(online() && !ischannel(ic)) { if(logged()) { bool found = false; const YList *buddies = yahoo_get_buddylist(cid); const YList *bud = 0; for(bud = buddies; bud && !found; bud = y_list_next(bud)) found = ic.nickname == static_cast(bud->data)->id; if(!found) { if(report) log(logContactAdd, ic.nickname.c_str()); if (groups.size()>0) { vector::const_iterator ig = find(groups.begin(), groups.end(), clist.get(ic)->getgroupid()); if (ig == groups.end()) ig = groups.begin(); yahoo_add_buddy(cid, ic.nickname.c_str(), ig->getname().c_str(), ""); } } } } requestinfo(ic); } void yahoohook::removeuser(const imcontact &ic) { removeuser(ic, true); } void yahoohook::removeuser(const imcontact &ic, bool report) { if(logged()) { if(!ischannel(ic)) { if(report) log(logContactRemove, ic.nickname.c_str()); const YList *buddies = yahoo_get_buddylist(cid); const YList *bud = 0; for(bud = buddies; bud; bud = y_list_next(bud)) { if(ic.nickname == ((yahoo_buddy *) bud->data)->id) yahoo_remove_buddy(cid, ((yahoo_buddy *) bud->data)->id, ((yahoo_buddy *) bud->data)->group); } } else { if(report) face.log(_("+ [yahoo] leaving the %s conference"), ic.nickname.c_str()); yahoo_conference_logoff(cid, 0, getmembers(ic.nickname.substr(1)), ic.nickname.c_str()+1); } } } imstatus yahoohook::yahoo2imstatus(int status) { imstatus st = offline; switch(status) { case YAHOO_STATUS_AVAILABLE: st = available; break; case YAHOO_STATUS_BUSY: st = dontdisturb; break; case YAHOO_STATUS_CUSTOM: case YAHOO_STATUS_BRB: case YAHOO_STATUS_IDLE: case YAHOO_STATUS_ONPHONE: st = away; break; case YAHOO_STATUS_NOTATDESK: st = occupied; break; case YAHOO_STATUS_NOTATHOME: case YAHOO_STATUS_NOTINOFFICE: case YAHOO_STATUS_ONVACATION: case YAHOO_STATUS_STEPPEDOUT: st = notavail; break; case YAHOO_STATUS_OUTTOLUNCH: st = outforlunch; break; case YAHOO_STATUS_INVISIBLE: st = invisible; break; case -1: st = offline; break; } return st; } bool yahoohook::enabled() const { return true; } void yahoohook::setautostatus(imstatus st) { if(st == offline) { if(getstatus() != offline) { disconnect(); } } else { if(getstatus() == offline) { connect(); } else { logger.putourstatus(proto, getstatus(), ourstatus = st); if(st == freeforchat) { /* TODO copy should not be needed here ?*/ char *msg = strdup("free for chat"); yahoo_set_away(cid, (yahoo_status) stat2int[st], msg, 0); free (msg); } else if(st != away) { yahoo_set_away(cid, (yahoo_status) stat2int[st], 0, 0); } else { char *msg = strdup(rusconv("ku", conf->getawaymsg(proto)).c_str()); yahoo_set_away(cid, (yahoo_status) stat2int[st], msg, 1); free (msg); } } } } imstatus yahoohook::getstatus() const { return online() ? ourstatus : offline; } void yahoohook::requestinfo(const imcontact &ic) { requestfromfound(ic); icqcontact *c = clist.get(ic); if(!c) c = clist.get(contactroot); icqcontact::moreinfo m = c->getmoreinfo(); icqcontact::basicinfo b = c->getbasicinfo(); m.homepage = "http://profiles.yahoo.com/" + ic.nickname; b.email = ic.nickname + "@yahoo.com"; c->setmoreinfo(m); c->setbasicinfo(b); } void yahoohook::userstatus(const string &nick, int st, const string &message, bool away) { imcontact ic(nick, proto); icqcontact *c = clist.get(ic); awaymessages[nick] = rusconv("wk", message); if(!c) { c = clist.addnew(ic, false); } if(c) { logger.putonline(ic, c->getstatus(), yahoo2imstatus(st)); c->setstatus(yahoo2imstatus(st)); } } YList *yahoohook::getmembers(const string &room) { int i; static YList *smemb = 0; vector::iterator ic; map >::iterator im; if(smemb) { for(YList *n = smemb; n; n = y_list_next(n)) free(n->data); y_list_free(smemb); smemb = 0; } if((im = confmembers.find(room)) != confmembers.end()) for(ic = im->second.begin(); ic != im->second.end(); ++ic) smemb = y_list_append(smemb, strdup(ic->c_str())); return smemb; } string yahoohook::decode(string text, bool utf) { int npos, mpos; text = rushtmlconv(utf ? "uk" : "wk", text); while((npos = text.find("\e[")) != -1) { if((mpos = text.substr(npos).find("m")) == -1) mpos = text.size()-npos-1; text.erase(npos, mpos+1); } return text; } bool yahoohook::knowntransfer(const imfile &fr) const { return fvalid.find(fr) != fvalid.end(); } void yahoohook::replytransfer(const imfile &fr, bool accept, const string &localpath) { /* if(accept) { string localname = localpath + "/"; localname += fr.getfiles()[0].fname; sfiles.push_back(strdup(localname.c_str())); srfiles[sfiles.back()] = fr; yahoo_get_url_handle(cid, fvalid[fr].c_str(), &get_url, sfiles.back()); } else { fvalid.erase(fr); }*/ } void yahoohook::aborttransfer(const imfile &fr) { face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsCancel, 0, 0); fvalid.erase(fr); } void yahoohook::lookup(const imsearchparams ¶ms, verticalmenu &dest) { string room; icqcontact *c; vector::const_iterator i; while(!foundguys.empty()) { delete foundguys.back(); foundguys.pop_back(); } yahoo_search_gender gender = YAHOO_GENDER_NONE; switch(params.gender) { case genderMale: gender = YAHOO_GENDER_MALE; break; case genderFemale: gender = YAHOO_GENDER_FEMALE; break; } searchonlineonly = params.onlineonly; searchdest = &dest; if(!params.kwords.empty()) { yahoo_search(cid, YAHOO_SEARCH_KEYWORD, decode(params.kwords, false).c_str(), gender, YAHOO_AGERANGE_NONE, params.photo ? 1 : 0, 1); } else if(!params.firstname.empty()) { yahoo_search(cid, YAHOO_SEARCH_NAME, decode(params.firstname, false).c_str(), gender, YAHOO_AGERANGE_NONE, params.photo ? 1 : 0, 1); } else if(!params.room.empty()) { room = params.room.substr(1); i = confmembers[room].begin(); while(i != confmembers[room].end()) { if(c = clist.get(imcontact(*i, proto))) searchdest->additem(conf->getcolor(cp_clist_yahoo), c, (string) " " + *i); ++i; } face.findready(); log(logConfMembers, searchdest->getcount()); searchdest->redraw(); searchdest = 0; } } void yahoohook::conferencecreate(const imcontact &confid, const vector &lst) { int i; string room = confid.nickname.substr(1); YList *who = 0; vector::const_iterator il = lst.begin(); while(il != lst.end()) { who = y_list_append(who, strdup(il->nickname.c_str())); ++il; } yahoo_conference_invite(cid, 0, who, room.c_str(), _("Please join my conference.")); for(YList *w = who; w; w = y_list_next(w)) free(w->data); y_list_free(who); } void yahoohook::requestawaymsg(const imcontact &ic) { icqcontact *c = clist.get(ic); if(c) { if(awaymessages.find(ic.nickname) != awaymessages.end()) { em.store(imnotification(ic, string() + _("Custom status message:") + "\n\n" + awaymessages[ic.nickname])); } else { face.log(_("+ [yahoo] cannot fetch away msg from %s, %s (maybe no away msg set)"), c->getdispnick().c_str(), ic.totext().c_str()); } } } void yahoohook::checkinlist(imcontact ic) { bool found = false; icqcontact *c = clist.get(ic); if(c) if(c->inlist()) { const YList *buddies = yahoo_get_buddylist(cid); for(const YList *bud = buddies; bud && !found; ) { yahoo_buddy *yb = (yahoo_buddy *) bud->data; found = (c->getdesc().nickname == yb->id); bud = y_list_next(bud); } if(!found) sendnewuser(ic, false); } } void yahoohook::updatecontact(icqcontact *c) { if(logged() && conf->getgroupmode() != icqconf::nogroups) { bool found = false; const YList *buddies = yahoo_get_buddylist(cid); string newgroupname = groups.getname(c->getgroupid()); for(const YList *bud = buddies; bud; ) { yahoo_buddy *yb = (yahoo_buddy *) bud->data; if(c->getdesc().nickname == yb->id) { if(!found) { if(newgroupname != yb->group) yahoo_change_buddy_group(cid, yb->id, yb->group, newgroupname.c_str()); found = true; } else { yahoo_remove_buddy(cid, yb->id, yb->group); } } bud = y_list_next(bud); } } } void yahoohook::renamegroup(const string &oldname, const string &newname) { if(logged()) { string tempname = oldname + "___" + i2str(getpid()) + "_temp"; yahoo_group_rename(cid, oldname.c_str(), tempname.c_str()); yahoo_group_rename(cid, tempname.c_str(), newname.c_str()); } } // ---------------------------------------------------------------------------- void yahoohook::login_response(int id, int succ, const char *url) { vector::iterator in; switch(succ) { case YAHOO_LOGIN_OK: yhook.flogged = true; logger.putourstatus(yahoo, offline, yhook.ourstatus = yhook.manualstatus); yhook.log(logLogged); time(&yhook.timer_refresh); yhook.setautostatus(yhook.manualstatus); yhook.timer_close = 0; break; case YAHOO_LOGIN_LOGOFF: yhook.fonline = yhook.fonline = false; yahoo_close(yhook.cid); face.log(_("+ [yahoo] cannot login")); break; case YAHOO_LOGIN_PASSWD: yhook.fonline = yhook.fonline = false; yahoo_close(yhook.cid); face.log(_("+ [yahoo] cannot login: username and password mismatch")); break; case YAHOO_LOGIN_UNAME: yhook.fonline = yhook.fonline = false; yahoo_close(yhook.cid); face.log(_("+ [yahoo] cannot login: username doesn't exist")); break; case YAHOO_LOGIN_LOCK: yhook.fonline = yhook.fonline = false; yahoo_close(yhook.cid); face.log(_("+ [yahoo] cannot login: the account has been blocked")); face.log(_("+ to reactivate visit %s"), url); break; case YAHOO_LOGIN_DUPL: face.log(_("+ [yahoo] another logon detected")); yahoo_logoff(yhook.cid); yhook.manualstatus = offline; break; case YAHOO_LOGIN_UNKNOWN: case YAHOO_LOGIN_SOCK: face.log(_("+ [yahoo] server closed socket")); yhook.disconnected(); break; } face.update(); } void yahoohook::got_buddies(int id, YList *buds) { const YList *buddy; for(buddy = buds; buddy; buddy = y_list_next(buddy)) { yahoo_buddy *bud = static_cast(buddy->data); clist.updateEntry(imcontact(bud->id, yahoo), bud->group ? bud->group : ""); } } void yahoohook::got_identities(int id, YList *buds) { } void yahoohook::status_changed(int id, const char *who, int stat, const char *msg, int away, int idle, int mobile) { yhook.userstatus(who, stat, msg ? msg : "", (bool) away); } void yahoohook::got_im(int id, const char *me, const char *who, const char *msg, long tm, int stat, int utf8) { imcontact ic(who, yahoo); string text = cuthtml(msg, chCutBR | chLeaveLinks); yhook.checkinlist(ic); text = yhook.decode(text, utf8); if(!text.empty()) { em.store(immessage(ic, imevent::incoming, text, tm)); } } void yahoohook::got_search_result(int id, int found, int start, int total, YList *contacts) { yahoo_found_contact *fc; icqcontact *c; YList *ir; string sg, line; if(!yhook.searchdest) return; for(ir = contacts; ir; ir = ir->next) { fc = (yahoo_found_contact *) ir->data; if(yhook.searchonlineonly && !fc->online) continue; c = new icqcontact(imcontact(fc->id, yahoo)); icqcontact::basicinfo binfo = c->getbasicinfo(); icqcontact::moreinfo minfo = c->getmoreinfo(); if(!fc->id || !fc->gender) continue; c->setnick(fc->id); c->setdispnick(c->getnick()); sg = up(fc->gender); if(sg == "MALE") minfo.gender = genderMale; else if(sg == "FEMALE") minfo.gender = genderFemale; minfo.age = fc->age; if(fc->location) binfo.street = fc->location; line = (fc->online ? "o " : " ") + c->getnick(); if(fc->age || fc->location || strlen(fc->gender) >= 4) { line += " <"; if(fc->age) line += i2str(fc->age); if(strlen(fc->gender) >= 4) { if(fc->age) line += ", "; line += fc->gender; } if(fc->location && strlen(fc->location)) { if(fc->age || strlen(fc->gender) >= 4) line += ", "; line += fc->location; } line += ">"; } c->setbasicinfo(binfo); c->setmoreinfo(minfo); yhook.foundguys.push_back(c); yhook.searchdest->additem(conf->getcolor(cp_clist_yahoo), c, line); } yhook.searchdest->redraw(); if(start + found >= total) { face.findready(); yhook.log(logSearchFinished, yhook.foundguys.size()); yhook.searchdest = 0; } else { yahoo_search_again(yhook.cid, -1); } } void yahoohook::got_conf_invite(int id, const char *me, const char *who, const char *room, const char *msg, YList *members) { icqconf::imaccount acc = conf->getourid(yahoo); string confname = (string) "#" + room, inviter, text; vector::iterator ic; char buf[NOTIFBUF]; int i; imcontact cont(confname, yahoo); icqcontact *c = clist.get(cont); if(!c) c = clist.addnew(cont); inviter = confname.substr(1); if((i = inviter.rfind("-")) != -1) { inviter.erase(i); } snprintf(buf, NOTIFBUF, _("The user %s has invited you to the %s conference, the topic there is: %s"), yhook.rusconv("wk", inviter).c_str(), yhook.rusconv("wk", room).c_str(), yhook.rusconv("wk", msg).c_str()); text = (string) buf + "\n\n" + _("Current conference members are: "); yhook.confmembers[room].push_back(inviter); for(YList *m = members; m; m = y_list_next(m)) { string id = (char *) m->data; if(id != acc.nickname) if(find(yhook.confmembers[room].begin(), yhook.confmembers[room].end(), id) == yhook.confmembers[room].end()) { yhook.confmembers[room].push_back(id); } } for(ic = yhook.confmembers[room].begin(); ic != yhook.confmembers[room].end(); ) { text += *ic; if(++ic != yhook.confmembers[room].end()) text += ", "; } c->setstatus(available); em.store(imnotification(cont, text)); em.store(imnotification(cont, _("Auto-joined the conference"))); yhook.tobedone.push_back(make_pair(tbdConfLogon, room)); } void yahoohook::conf_userdecline(int id, const char *me, const char *who, const char *room, const char *msg) { icqcontact *c = clist.get(imcontact((string) "#" + room, yahoo)); char buf[NOTIFBUF]; if(c) { snprintf(buf, NOTIFBUF, _("The user %s has declined your invitation to join the conference"), who); em.store(imnotification(c, buf)); } } void yahoohook::conf_userjoin(int id, const char *me, const char *who, const char *room) { icqcontact *c = clist.get(imcontact((string) "#" + room, yahoo)); char buf[NOTIFBUF]; if(c) { snprintf(buf, NOTIFBUF, _("The user %s has joined the conference"), who); if(find(yhook.confmembers[room].begin(), yhook.confmembers[room].end(), who) == yhook.confmembers[room].end()) yhook.confmembers[room].push_back(who); em.store(imnotification(c, buf)); } } void yahoohook::conf_userleave(int id, const char *me, const char *who, const char *room) { icqcontact *c = clist.get(imcontact((string) "#" + room, yahoo)); char buf[NOTIFBUF]; vector::iterator im; if(c) { snprintf(buf, NOTIFBUF, _("The user %s has left the conference"), who); em.store(imnotification(c, buf)); im = find(yhook.confmembers[room].begin(), yhook.confmembers[room].end(), who); if(im != yhook.confmembers[room].end()) yhook.confmembers[room].erase(im); } } void yahoohook::conf_message(int id, const char *me, const char *who, const char *room, const char *msg, int utf8) { icqcontact *c = clist.get(imcontact((string) "#" + room, yahoo)); string text = (string) who + ": " + cuthtml(msg, chCutBR | chLeaveLinks); text = yhook.decode(text, utf8); if(c) em.store(immessage(c, imevent::incoming, text)); } void yahoohook::got_file(int id, const char *me, const char *who, const char *msg, const char *fname, unsigned long fesize, char *trid) { if(!who || !fname || !trid) return; int pos; imfile::record r; r.fname = fname; r.size = fesize; if(!fesize) r.size = -1; if((pos = r.fname.find('?')) != -1) r.fname.erase(pos); imfile fr(imcontact(who, yahoo), imevent::incoming, "", vector(1, r)); yhook.fvalid[fr] = trid; em.store(fr); face.transferupdate(fname, fr, icqface::tsInit, fesize, 0); } void yahoohook::contact_added(int id, const char *myid, const char *who, const char *msg) { string text = _("The user has added you to his/her contact list"); if(msg) if(strlen(msg)) { text += (string) ", " + _("the message was: ") + msg; } em.store(imnotification(imcontact(who, yahoo), text)); } void yahoohook::typing_notify(int id, const char *me, const char *who, int stat) { icqcontact *c = clist.get(imcontact(who, yahoo)); if(c) c->setlasttyping(stat ? timer_current : 0); } void yahoohook::game_notify(int id, const char *me, const char *who, int stat, const char *msg) { } void yahoohook::mail_notify(int id, const char *from, const char *subj, int cnt) { char buf[NOTIFBUF]; if(from && subj) { snprintf(buf, NOTIFBUF, _("+ [yahoo] e-mail from %s, %s"), from, subj); face.log(buf); clist.get(contactroot)->playsound(imevent::email); } } void yahoohook::system_message(int id, const char *me, const char *who, const char *msg) { face.log(_("+ [yahoo] system (%s): %s"), who, msg); } void yahoohook::got_ping(int id, const char *msg) { // face.log(_("+ [yahoo] ping: %s"), msg); } void yahoohook::error(int id, const char *err, int fatal, int num) { if(fatal) { face.log(_("+ [yahoo] fatal error: %s"), err); yhook.disconnected(); } else { face.log(_("[yahoo] error %s"), err); } } int yahoohook::add_handler(int id, void *fd, yahoo_input_condition cond, void *data) { int tag = -1; struct y_c *con = (struct y_c *)fd; yhook.fds.push_back(yfd(con->fd, data, con->ssl, cond)); tag = yhook.fds.back().tag; return tag; } void yahoohook::remove_handler(int id, int tag) { vector::iterator i; i = find(yhook.fds.begin(), yhook.fds.end(), tag); if(i != yhook.fds.end()) yhook.fds.erase(i); } int yahoohook::connect_async(int id, const char *host, int port, yahoo_connect_callback callback, void *data, int use_ssl) { struct sockaddr_in serv_addr; static struct hostent *server; int servfd; struct connect_callback_data * ccd; int error; if(!(server = gethostbyname(host))) { errno = h_errno; return -1; } if((servfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { return -1; } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; memcpy(&serv_addr.sin_addr.s_addr, *server->h_addr_list, server->h_length); serv_addr.sin_port = htons(port); int state = 0; struct y_c *con = new struct y_c(servfd, use_ssl, state); error = cw_nb_connect(servfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr), use_ssl, &state); con->state = state; if(!error && !state) { int f = fcntl(servfd, F_GETFL); fcntl(servfd, F_SETFL, f | O_NONBLOCK); callback(con, 0, data); return 0; } else if((error == -1 && errno == EINPROGRESS) || (state & CW_CONNECT_STARTED)){ ccd = new connect_callback_data; ccd->callback = callback; ccd->callback_data = data; ccd->id = id; ccd->tag = add_handler(id, con, YAHOO_INPUT_WRITE, ccd); delete con; return ccd->tag; } else { y_close(con); callback(NULL, 0, data); close(servfd); return -1; } } void yahoohook::connect_complete(void *data, struct y_c *con) { connect_callback_data *ccd = (connect_callback_data *) data; int so_error; socklen_t err_size = sizeof(so_error); remove_handler(0, ccd->tag); if(getsockopt(con->fd, SOL_SOCKET, SO_ERROR, (char *) &so_error, &err_size) == -1 || so_error != 0) { if(yhook.logged()) face.log(_("+ [yahoo] direct connection failed")); cw_close(con->fd); } else { ccd->callback(con, so_error, ccd->callback_data); } delete ccd; } int yahoohook::y_write(void *fd, char *buf, int len) { if (!fd) return -1; struct y_c *con = (struct y_c *)fd; return cw_write(con->fd, buf, len, con->ssl); } int yahoohook::y_read(void *fd, char *buf, int len) { if (!fd) return -1; struct y_c *con = (struct y_c *)fd; return cw_read(con->fd, buf, len, con->ssl); } void yahoohook::y_close(void *fd) { struct y_c *con = (struct y_c *)fd; cw_close(con->fd); delete con; } void yahoohook::got_ignore(int id, YList * igns) { } void yahoohook::got_cookies(int id) { } void yahoohook::chat_cat_xml(int id, const char *xml) { face.log(_("+ [yahoo] chat_cat_xml")); } void yahoohook::chat_join(int id, const char *me, const char *room, const char *topic, YList *members, void *fd) { face.log(_("+ [yahoo] chat_join")); } void yahoohook::chat_userjoin(int id, const char *me, const char *room, struct yahoo_chat_member *who) { face.log(_("+ [yahoo] chat_userjoin")); } void yahoohook::chat_userleave(int id, const char *me, const char *room, const char *who) { face.log(_("+ [yahoo] chat_userleave")); } void yahoohook::chat_message(int id, const char *me, const char *who, const char *room, const char *msg, int msgtype, int utf8) { face.log(_("+ [yahoo] chat_message from %s"), who); } void yahoohook::rejected(int id, const char *who, const char *msg) { imcontact ic(who, yahoo); string text = cuthtml(msg?msg: "", chCutBR | chLeaveLinks); string message = "The user has rejected your authorization request"; if (!text.empty()) { message += " ("; message += text; message += ")"; } em.store(imnotification(ic, message)); } void yahoohook::got_webcam_image(int id, const char * who, const unsigned char *image, unsigned int image_size, unsigned int real_size, unsigned int timestamp) { } void yahoohook::webcam_invite(int id, const char *me, const char *from) { } void yahoohook::webcam_invite_reply(int id, const char *me, const char *from, int accept) { } void yahoohook::webcam_closed(int id, const char *who, int reason) { } void yahoohook::webcam_viewer(int id, const char *who, int connect) { } void yahoohook::webcam_data_request(int id, int send) { } void yahoohook::got_buddyicon_request(int id, const char *me, const char *who) { } void yahoohook::got_buddyicon(int id, const char *me, const char *who, const char *url, int checksum) { } void yahoohook::buddyicon_uploaded(int id, const char *url) { } void yahoohook::chat_yahooerror(int id, const char *me) { face.log(_("+ [yahoo] chat_yahooerror")); } void yahoohook::chat_yahoologout(int id, const char *me) { face.log(_("+ [yahoo] chat_yahoologout")); } int yahoohook::yahoo_connect(const char *host, int port) { face.log(_("+ [yahoo] yahoo connect")); return -1; } void yahoohook::file_transfer_done(int id, int result, void *data) { } char *yahoohook::get_ip_addr(const char *domain) { face.log(_("+ [yahoo] get_ip_addr %s"), domain); return NULL; } void yahoohook::got_buddy_change_group(int id, const char *me, const char *who, const char *old_group, const char *new_group) { face.log(_("+ [yahoo] yahoo buddy_change_group %s from %s to %s"), who, old_group, new_group); } void yahoohook::got_buddyicon_checksum(int id, char const *me, const char *who, int checksum) { } void yahoohook::got_buzz(int id, const char *me, const char *who, long tm) { imcontact ic(who, yahoo); em.store(imnotification(ic, (string) _("The user has buzzed you"))); } void yahoohook::got_ft_data(int id, const unsigned char *in, int len, void *data) { } void yahoohook::auth_request(int id, const char *who, const char *msg) { imcontact ic(who, yahoo); string text = cuthtml(msg?msg: "", chCutBR | chLeaveLinks); yhook.checkinlist(ic); text = yhook.decode(text, true); em.store(imauthorization(ic, imevent::incoming, imauthorization::Request, text)); } int yahoohook::ylog(const char *fmt, ...) { if(conf->getdebug()) { char buf[NOTIFBUF]; va_list ap; va_start(ap, fmt); vsnprintf(buf, NOTIFBUF, fmt, ap); va_end(ap); face.log(buf); } return 0; } void yahoohook::get_fd(int id, void *fd, int error, void *data) { const char *fname = (const char *) data; struct y_c *con = (struct y_c *)fd; char buf[1024]; int size = 0; if(!error) { ifstream f(fname); if(f.is_open()) { while(!f.eof()) { f.read(buf, 1024); cw_write(con->fd, buf, f.tellg(), con->ssl); size += f.tellg(); } f.close(); } } map::iterator ir = yhook.srfiles.find(fname); if(ir != yhook.srfiles.end()) { face.transferupdate(fname, ir->second, error ? icqface::tsError : icqface::tsFinish, size, size); yhook.srfiles.erase(ir); } vector::iterator i = find(yhook.sfiles.begin(), yhook.sfiles.end(), fname); if(i != yhook.sfiles.end()) { delete *i; yhook.sfiles.erase(i); } } void yahoohook::get_url(int id, int fd, int error, const char *filename, unsigned long size, void *data) { int rsize = 0; const char *localname = (const char *) data; if(!error) { vector::iterator i = find(yhook.sfiles.begin(), yhook.sfiles.end(), localname); if(i != yhook.sfiles.end()) { ofstream f(localname); if(f.is_open()) { int r; char buf[1024]; FILE *fp = fdopen(fd, "r"); while(!feof(fp)) { r = fread(buf, 1, 1024, fp); if(r > 0) f.write(buf, r); rsize += r; } fclose(fp); f.close(); } else { error = -1; } delete *i; yhook.sfiles.erase(i); } } map::iterator ir = yhook.srfiles.find(localname); if(ir != yhook.srfiles.end()) { face.transferupdate(justfname(localname), ir->second, error ? icqface::tsError : icqface::tsFinish, size, rsize); yhook.srfiles.erase(ir); } } #endif centerim-4.22.10/src/hooks/Makefile.am0000644000175000001440000000257211461606612014362 00000000000000AM_CXXFLAGS = -Wno-write-strings libhooks_a_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/hooks -I$(top_srcdir)/connwrap -I$(top_srcdir)/firetalk -I$(top_srcdir)/firetalk/../connwrap -I$(top_srcdir)/firetalk/../connwrap-0.1 -I$(top_srcdir)/kkconsui -I$(top_srcdir)/kkconsui/include -I$(top_srcdir)/kkconsui/../kkstrtext -I$(top_srcdir)/kkconsui/../kkstrtext-0.1 -I$(top_srcdir)/kkstrtext -I$(top_srcdir)/kksystr -I$(top_srcdir)/kksystr/include -I$(top_srcdir)/kksystr/../kkstrtext -I$(top_srcdir)/kksystr/../kkstrtext-0.1 -I$(top_srcdir)/libgadu -I$(top_srcdir)/libicq2000 -I$(top_srcdir)/libicq2000/libicq2000 -I$(top_srcdir)/libjabber -I$(top_srcdir)/libjabber/../connwrap -I$(top_srcdir)/libjabber/../connwrap-0.1 -I$(top_srcdir)/libmsn -I$(top_srcdir)/libmsn/../connwrap -I$(top_srcdir)/libmsn/../connwrap-0.1 -I$(top_srcdir)/libyahoo2 -I$(top_srcdir)/libyahoo2/../connwrap -I$(top_srcdir)/libyahoo2/../connwrap-0.1 -I$(top_srcdir)/intl noinst_LIBRARIES = libhooks.a libhooks_a_SOURCES = rsshook.cc HTTPClient.cc yahoohook.cc jabberhook.cc aimhook.cc icqhook.cc gaduhook.cc irchook.cc ljhook.cc msnhook.cc abstracthook.cc EXTRA_DIST = rsshook.cc HTTPClient.cc yahoohook.cc jabberhook.cc aimhook.cc icqhook.cc gaduhook.cc irchook.cc ljhook.cc msnhook.cc abstracthook.cc ljhook.h rsshook.h HTTPClient.h yahoohook.h aimhook.h msnhook.h jabberhook.h gaduhook.h icqhook.h irchook.h abstracthook.h centerim-4.22.10/src/hooks/jabberhook.h0000644000175000001440000001323611461606612014604 00000000000000#ifndef __JABBERHOOK_H__ #define __JABBERHOOK_H__ #include "abstracthook.h" #ifdef BUILD_JABBER #include "jabber.h" class jabberhook: public abstracthook { protected: imstatus ourstatus; jconn jc; int id; string uuid; bool flogged, fonline, regmode, regdone; string regerr; time_t timer_keepalive; map > > srfiles; //transfer queue of files map back_srfiles; //backward compatibility to clean up sending files from overloaded abort function map roster; map awaymsgs; map full_jids; //little trick to store users full JID's, it required in some xmpp packets map > transferinfo; map > chatmembers; map > > statuses; // > > set ignore_ids; // set of packet IDs to ignore errors from struct agent { string jid, name, desc; struct agent_params { bool enabled; string instruction, key; vector > paramnames; agent_params(): enabled(false) {} }; enum param_type { ptSearch, ptRegister, ptReceipts, param_type_size }; enum agent_type { atSearch, atTransport, atGroupchat, atStandard, atUnknown } type; agent_params params[param_type_size]; agent(const string &ajid, const string &aname, const string &adesc, agent_type atype): jid(ajid), name(aname), desc(adesc), type(atype) {} bool operator == (const string &ajid) const { return jid == ajid; } bool operator != (const string &ajid) const { return jid != ajid; } }; enum { STATE_CONNECTING, STATE_GETAUTH, STATE_SENDAUTH, STATE_LOGGED } jstate; vector agents; imstatus process_presence(string id, string s, char prio, imstatus ust); static void statehandler(jconn conn, int state); static void packethandler(jconn conn, jpacket packet); static void jlogger(jconn conn, int inout, const char *p); vector > getservparams(const string &agentname, agent::param_type pt) const; void setjabberstatus(imstatus st, string msg); void sendvisibility(); void sendnewuser(const imcontact &c, bool report); void removeuser(const imcontact &ic, bool report); void gotagentinfo(xmlnode x); void gotsearchresults(xmlnode x); void gotloggedin(); void postlogin(); void gotroster(xmlnode x); void gotvcard(const imcontact &ic, xmlnode v); void gotmessage(const string &type, const string &from, const string &body, const string &enc); void gotversion(const imcontact &ic, xmlnode x); void sendversion(const imcontact &ic, xmlnode x); void senddiscoinfo(const imcontact &ic, xmlnode x); bool get_img_ext(const string &type, string &ext); bool url_port_get(const string &full_url, string &url, int &port, string &tail, string &filename); bool get_base64_avatar(string &type, string &ava); void getfile(const imfile &fr); void getfile_http(const imcontact &ic, xmlnode i); void getfile_byte(const imcontact &ic, xmlnode i); void getfile_result(const imfile &fr); void file_transfer_request(const imcontact &ic, xmlnode i); void bytenegotiat(const imfile &fr); void reject_file(const imfile &fr); void recieve_file( const imcontact &ic, xmlnode x, string id, string from, string to ); void send_file(const string &cjid); bool isourid(const string &jid); static string getourjid(); static void progressbar(void *file, long int bytes, long int size, int status, int conn_type ); string jidnormalize(const string &jid) const; void vcput(xmlnode x, const string &name, const string &val); void vcputphone(xmlnode x, const string &type, const string &place, const string &number); bool get_my_avatar_hash(string &my_hash); void vcputaddr(xmlnode x, const string &place, const string &street, const string &locality, const string ®ion, const string &pcode, unsigned short country); void vcputavatar(xmlnode x, const string &type, const string &val); void clean_up_file(const imfile &, int trans_type, char *cjid = NULL ); public: jabberhook(); virtual ~jabberhook(); void init(); void connect(); void disconnect(); void exectimers(); void main(); void getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const; bool isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const; bool online() const; bool logged() const; bool isconnecting() const; bool enabled() const; bool send(const imevent &ev); void sendnewuser(const imcontact &ic); void removeuser(const imcontact &ic); void setautostatus(imstatus st); imstatus getstatus() const; void requestinfo(const imcontact &ic); void requestawaymsg(const imcontact &ic); bool regnick(const string &nick, const string &pass, const string &serv, string &err); vector getservices(servicetype::enumeration st) const; vector > getsearchparameters(const string &agentname) const; vector > getregparameters(const string &agentname) const; map transferusers; //some hack to quick find transfer file by full JID void lookup(const imsearchparams ¶ms, verticalmenu &dest); void conferencecreate(const imcontact &confid, const vector &lst); void sendupdateuserinfo(const icqcontact &c); void updatecontact(icqcontact *c); void requestversion(const imcontact &c); void renamegroup(const string &oldname, const string &newname); void ouridchanged(const icqconf::imaccount &ia); bool knowntransfer(const imfile &fr) const; void replytransfer(const imfile &fr, bool accept, const string &localpath = string() ); void aborttransfer(const imfile &fr); }; extern jabberhook jhook; #endif #endif centerim-4.22.10/src/hooks/irchook.cc0000644000175000001440000011742011461606612014272 00000000000000/* * * centerim IRC protocol handling class * $Id: irchook.cc,v 1.80 2004/12/20 00:54:02 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "irchook.h" #ifdef BUILD_IRC #include "icqgroups.h" #include "icqface.h" #include "icqcontacts.h" #include "imlogger.h" #include "accountmanager.h" #include "eventmanager.h" #include "centerim.h" #include #include #define NOTIFBUF 512 // ---------------------------------------------------------------------------- irchook irhook; irchook::irchook() : abstracthook(irc), handle(firetalk_create_handle(firetalk_find_protocol("IRC"), 0)), fonline(false), flogged(false), ourstatus(offline) { fcapabs.insert(hookcapab::setaway); fcapabs.insert(hookcapab::fetchaway); fcapabs.insert(hookcapab::changenick); fcapabs.insert(hookcapab::optionalpassword); fcapabs.insert(hookcapab::ping); fcapabs.insert(hookcapab::version); fcapabs.insert(hookcapab::files); fcapabs.insert(hookcapab::cltemporary); fcapabs.insert(hookcapab::directadd); fcapabs.insert(hookcapab::conferencing); fcapabs.insert(hookcapab::channelpasswords); } irchook::~irchook() { } void irchook::init() { int i; manualstatus = conf->getstatus(irc); for(i = 0; i < clist.count; i++) { icqcontact *c = (icqcontact *) clist.at(i); if(c->getdesc().pname == irc) if(ischannel(c)) if(c->getbasicinfo().requiresauth) { channels.push_back(channelInfo(c->getdesc().nickname)); channels.back().joined = true; channels.back().passwd = c->getbasicinfo().zip; } } firetalk_register_callback(handle, FC_CONNECTED, &connected); firetalk_register_callback(handle, FC_CONNECTFAILED, &connectfailed); firetalk_register_callback(handle, FC_DISCONNECT, &disconnected); firetalk_register_callback(handle, FC_NEWNICK, &newnick); firetalk_register_callback(handle, FC_IM_GOTINFO, &gotinfo); firetalk_register_callback(handle, FC_IM_GOTCHANNELS, &gotchannels); firetalk_register_callback(handle, FC_IM_GETMESSAGE, &getmessage); firetalk_register_callback(handle, FC_IM_GETACTION, &getaction); firetalk_register_callback(handle, FC_IM_BUDDYONLINE, &buddyonline); firetalk_register_callback(handle, FC_IM_BUDDYOFFLINE, &buddyoffline); firetalk_register_callback(handle, FC_IM_BUDDYAWAY, &buddyaway); firetalk_register_callback(handle, FC_IM_BUDDYUNAWAY, &buddyonline); firetalk_register_callback(handle, FC_CHAT_LISTMEMBER, &listmember); firetalk_register_callback(handle, FC_CHAT_LIST_EXTENDED, &listextended); firetalk_register_callback(handle, FC_CHAT_END_EXTENDED, &endextended); firetalk_register_callback(handle, FC_CHAT_NAMES, &chatnames); firetalk_register_callback(handle, FC_CHAT_GETMESSAGE, &chatmessage); firetalk_register_callback(handle, FC_CHAT_GETACTION, &chataction); firetalk_register_callback(handle, FC_CHAT_JOINED, &chatjoined); firetalk_register_callback(handle, FC_CHAT_LEFT, &chatleft); firetalk_register_callback(handle, FC_CHAT_KICKED, &chatkicked); firetalk_register_callback(handle, FC_CHAT_OPPED, &chatopped); firetalk_register_callback(handle, FC_CHAT_DEOPPED, &chatdeopped); firetalk_register_callback(handle, FC_ERROR, &errorhandler); firetalk_register_callback(handle, FC_IM_USER_NICKCHANGED, &nickchanged); firetalk_register_callback(handle, FC_NEEDPASS, &needpass); firetalk_register_callback(handle, FC_FILE_OFFER, &fileoffer); firetalk_register_callback(handle, FC_FILE_START, &filestart); firetalk_register_callback(handle, FC_FILE_PROGRESS, &fileprogress); firetalk_register_callback(handle, FC_FILE_FINISH, &filefinish); firetalk_register_callback(handle, FC_FILE_ERROR, &fileerror); firetalk_register_callback(handle, FC_CHAT_USER_JOINED, &chatuserjoined); firetalk_register_callback(handle, FC_CHAT_USER_LEFT, &chatuserleft); firetalk_register_callback(handle, FC_CHAT_USER_KICKED, &chatuserkicked); firetalk_register_callback(handle, FC_CHAT_GOTTOPIC, &chatgottopic); firetalk_register_callback(handle, FC_CHAT_USER_OPPED, &chatuseropped); firetalk_register_callback(handle, FC_CHAT_USER_DEOPPED, &chatuserdeopped); firetalk_subcode_register_request_callback(handle, "VERSION", &subrequest); firetalk_subcode_register_reply_callback(handle, "PING", &subreply); firetalk_subcode_register_reply_callback(handle, "VERSION", &subreply); if(conf->getdebug()) firetalk_register_callback(handle, FC_LOG, &fclog); } void irchook::connect() { icqconf::imaccount acc = conf->getourid(irc); log(logConnecting); firetalk_register_callback(handle, FC_DISCONNECT, 0); firetalk_disconnect(handle); firetalk_register_callback(handle, FC_DISCONNECT, &disconnected); fonline = firetalk_signon(handle, acc.server.c_str(), acc.port, acc.nickname.c_str()) == FE_SUCCESS; if(fonline) { flogged = false; } else { face.log(_("+ [irc] unable to connect to the server")); } } void irchook::disconnect() { if(fonline) { firetalk_disconnect(handle); } } void irchook::exectimers() { } void irchook::main() { firetalk_select(); } void irchook::getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const { int *r, *w, *e, *sr, *sw, *se; firetalk_getsockets(firetalk_find_protocol("IRC"), &sr, &sw, &se); for(r = sr; *r; r++) { if(*r > hsocket) hsocket = *r; FD_SET(*r, &rfds); } for(w = sw; *w; w++) { if(*w > hsocket) hsocket = *w; FD_SET(*w, &wfds); } for(e = se; *e; e++) { if(*e > hsocket) hsocket = *e; FD_SET(*e, &efds); } delete sr; delete sw; delete se; } bool irchook::isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const { bool res = false; int *r, *w, *e, *sr, *sw, *se; if(online()) { firetalk_getsockets(firetalk_find_protocol("IRC"), &sr, &sw, &se); for(r = sr; *r; r++) res = res || FD_ISSET(*r, &rfds); for(w = sw; *w; w++) res = res || FD_ISSET(*w, &wfds); for(e = se; *e; e++) res = res || FD_ISSET(*e, &efds); delete sr; delete sw; delete se; } return res; } bool irchook::online() const { return fonline; } bool irchook::logged() const { return flogged && fonline; } bool irchook::enabled() const { return true; } bool irchook::isconnecting() const { return fonline && !flogged; } bool irchook::send(const imevent &ev) { icqcontact *c = clist.get(ev.getcontact()); string text, cmd; bool result = true; if(c) { if(ev.gettype() == imevent::message) { const immessage *m = static_cast(&ev); text = rusconv("kw", m->gettext()); } else if(ev.gettype() == imevent::url) { const imurl *m = static_cast(&ev); text = rushtmlconv("kw", m->geturl()) + "\n\n" + rushtmlconv("kw", m->getdescription()); } else if(ev.gettype() == imevent::file) { const imfile *m = static_cast(&ev); vector files = m->getfiles(); vector::const_iterator ir; for(ir = files.begin(); ir != files.end(); ++ir) { imfile::record r; r.fname = ir->fname; r.size = ir->size; imfile fr(c->getdesc(), imevent::outgoing, "", vector(1, r)); firetalk_file_offer(handle, c->getdesc().nickname.c_str(), ir->fname.c_str(), &transferinfo[fr].first); } return true; } string original = text; int pos = -1; while (original.length()>0) { if ((pos = original.find("\n")) != -1) // split by newlines into separate commands, drop empty ones { if (pos>1) { text = original.substr(0, pos-1); original.erase(0, pos+1); } else { original.erase(0, pos+1); continue; } } else { text = original; original.erase(); } if(text.substr(0, 1) == "/") { text.erase(0, 1); cmd = up(getword(text)); if(cmd == "ME") { if(ischannel(c)) return firetalk_chat_send_action(handle, c->getdesc().nickname.c_str(), text.c_str(), 0) == FE_SUCCESS; else return firetalk_im_send_action(handle, c->getdesc().nickname.c_str(), text.c_str(), 0) == FE_SUCCESS; } else if(cmd == "KICK") { text = cmd + " " + c->getdesc().nickname + " " + text; } else if(cmd == "OP") { text = (string) "mode " + c->getdesc().nickname + " +o " + text; } else if(cmd == "DEOP") { text = (string) "mode " + c->getdesc().nickname + " -o " + text; } else if(cmd == "RAW") { // leave text intact } else { text.insert(0, cmd + " "); } rawcommand(text); } if(ischannel(c)) { if (firetalk_chat_send_message(handle, c->getdesc().nickname.c_str(), text.c_str(), 0) != FE_SUCCESS) result = false; } else { if (firetalk_im_send_message(handle, c->getdesc().nickname.c_str(), text.c_str(), 0) != FE_SUCCESS) result = false; } } return result; } return false; } void irchook::sendnewuser(const imcontact &ic) { icqcontact *c; if(online()) { if(!ischannel(ic)) { vector::const_iterator ig = find(groups.begin(), groups.end(), clist.get(ic)->getgroupid()); if(ig != groups.end()) { firetalk_im_add_buddy(handle, ic.nickname.c_str(), ig->getname().c_str(), ""); } requestinfo(ic); } else { vector ch = getautochannels(); if(find(ch.begin(), ch.end(), ic.nickname) == ch.end()) { ch.push_back(ic.nickname); ch.back().joined = true; if(c = clist.get(ic)) { ch.back().passwd = c->getbasicinfo().zip; } setautochannels(ch); } } } } void irchook::removeuser(const imcontact &ic) { if(online()) { if(!ischannel(ic)) { firetalk_im_remove_buddy(handle, ic.nickname.c_str()); } else { vector ch = getautochannels(); vector::iterator ich = find(ch.begin(), ch.end(), ic.nickname); if(ich != ch.end()) { ch.erase(ich); setautochannels(ch); } } } } void irchook::setautostatus(imstatus st) { if(st != offline) { if(getstatus() == offline) { connect(); } else { if(getstatus() != st) { logger.putourstatus(irc, getstatus(), ourstatus = st); switch(st) { case away: case notavail: case outforlunch: case occupied: firetalk_set_away(handle, conf->getawaymsg(irc).c_str(), 0); break; default: firetalk_set_away(handle, 0, 0); break; } } } } else { if(getstatus() != offline) { disconnect(); } } face.update(); } imstatus irchook::getstatus() const { return (flogged && fonline) ? ourstatus : offline; } void irchook::requestinfo(const imcontact &c) { firetalk_im_get_info(handle, c.nickname.c_str()); } void irchook::sendupdateuserinfo(icqcontact &c, const string &newpass) { const icqcontact::basicinfo &b = c.getbasicinfo(); ircname = b.fname; if(!b.lname.empty()) { if(!ircname.empty()) ircname += " "; ircname += b.lname; } } void irchook::lookup(const imsearchparams ¶ms, verticalmenu &dest) { string rooms = params.room, room; bool ready = true; vector::iterator ic; searchdest = &dest; emailsub = params.email; namesub = params.firstname; searchsincelast = params.sincelast && !params.room.empty(); searchchannels.clear(); extlisted.clear(); while(!foundguys.empty()) { delete foundguys.back(); foundguys.pop_back(); } if(!params.room.empty()) { smode = Channel; while(!(room = getword(rooms)).empty()) { if(room[0] != '#') room.insert(0, "#"); searchchannels.push_back(room); ic = find(irhook.channels.begin(), irhook.channels.end(), room); if(ic == irhook.channels.end()) { irhook.channels.push_back(channelInfo(room)); ic = irhook.channels.end()-1; } if(!ic->joined) { firetalk_chat_join(handle, room.c_str()); ready = false; } if(emailsub.empty() && namesub.empty()) { /* if(ic->fetched) {*/ ic->nicks.clear(); firetalk_chat_listmembers(handle, room.c_str()); /* } else { ready = false; }*/ } else { ready = false; if(ic->joined) { ic->nicks.clear(); firetalk_chat_requestextended(handle, params.room.c_str()); } } } if(ready) processnicks(); } else if(!params.email.empty()) { smode = Email; searchchannels.push_back(""); firetalk_im_searchemail(handle, ("*" + params.email + "*").c_str()); } } void irchook::processnicks() { string dnick; char *nick; vector foundnicks; static vector lastfoundnicks; vector::iterator in, isn; vector::iterator ir; bool remove; icqcontact *c; int npos; if(!searchdest) return; ir = find(channels.begin(), channels.end(), *searchchannels.begin()); if(ir != channels.end()) foundnicks = ir->nicks; sort(foundnicks.begin(), foundnicks.end()); if(searchchannels.size() > 1) { for(in = foundnicks.begin(); in != foundnicks.end(); ) { remove = false; for(ir = channels.begin(); !remove && (ir != channels.end()); ++ir) { if(find(searchchannels.begin(), searchchannels.end(), ir->name) == searchchannels.end()) continue; if(ir->name == *searchchannels.begin()) continue; if(find(ir->nicks.begin(), ir->nicks.end(), *in) == ir->nicks.end()) { /* * * Not found in one of other channels. Remove it from the * first channel's list. * */ remove = true; } } if(remove) { foundnicks.erase(in); in = foundnicks.begin(); } else { in++; } } } if(searchsincelast) { vector tnicks; insert_iterator< vector > tins(tnicks, tnicks.begin()); set_difference(foundnicks.begin(), foundnicks.end(), lastfoundnicks.begin(), lastfoundnicks.end(), tins); lastfoundnicks = foundnicks; foundnicks = tnicks; } else { lastfoundnicks = foundnicks; } for(in = foundnicks.begin(); in != foundnicks.end(); ++in) { dnick = *in; npos = 0; if(!emailsub.empty()) npos = dnick.rfind("<"); else if(!namesub.empty()) npos = dnick.rfind("["); if(npos > 0) dnick.erase(npos-1); c = new icqcontact(imcontact(dnick, irc)); c->setdispnick(dnick); searchdest->additem(conf->getcolor(cp_clist_irc), c, (string) " " + *in); foundguys.push_back(c); } face.findready(); log(logConfMembers, foundguys.size()); searchdest->redraw(); searchdest = 0; } vector irchook::getautochannels() const { vector r; vector::const_iterator ic; for(ic = channels.begin(); ic != channels.end(); ++ic) { if(find(searchchannels.begin(), searchchannels.end(), ic->name) != searchchannels.end()) if(!ic->joined) // A channel used for search continue; r.push_back(*ic); } return r; } void irchook::setautochannels(vector &achannels) { bool r; vector::iterator ic, iac; /* * * First, let's leave the channels we are not on anymore. * */ for(ic = channels.begin(); ic != channels.end(); ++ic) { iac = find(achannels.begin(), achannels.end(), ic->name); if(ic->joined) { r = iac == achannels.end(); if(!r) r = !iac->joined; if(r) firetalk_chat_part(irhook.handle, ic->name.c_str()); } } /* * * Now, let's see if there are any new channels we * gotta join to. * */ for(iac = achannels.begin(); iac != achannels.end(); ++iac) { ic = find(channels.begin(), channels.end(), iac->name); if(iac->joined) { r = ic == channels.end(); if(!r) r = !ic->joined; string passname = iac->name; if (!iac->passwd.empty()) passname += " " + iac->passwd; if(r) firetalk_chat_join(irhook.handle, passname.c_str()); } } channels = achannels; } void irchook::requestawaymsg(const imcontact &ic) { em.store(imnotification(ic, string() + _("Away message:") + "\n\n" + awaymessages[ic.nickname])); } void irchook::rawcommand(const string &cmd) { int *r, *w, *e, sock; if(online()) { firetalk_getsockets(firetalk_find_protocol("IRC"), &r, &w, &e); if(*r) { write(*r, cmd.c_str(), cmd.size()); write(*r, "\n", 1); } delete r; delete w; delete e; } } void irchook::channelfatal(string room, const char *fmt, ...) { va_list ap; char buf[NOTIFBUF]; vector::iterator i; va_start(ap, fmt); vsnprintf(buf, NOTIFBUF, fmt, ap); va_end(ap); if(room.substr(0, 1) != "#") room.insert(0, "#"); i = find(channels.begin(), channels.end(), room); if(i != channels.end()) { imcontact cont(room, irc); icqcontact *c = clist.get(cont); if(!c) c = clist.addnew(cont); c->setstatus(offline); i->joined = i->fetched = false; em.store(imnotification(cont, buf)); } } void irchook::ouridchanged(const icqconf::imaccount &ia) { if(logged()) { firetalk_set_nickname(handle, ia.nickname.c_str()); } } void irchook::requestversion(const imcontact &c) { if(logged()) { firetalk_subcode_send_request(handle, c.nickname.c_str(), "VERSION", 0); } } void irchook::ping(const imcontact &c) { if(logged()) { firetalk_subcode_send_request(handle, c.nickname.c_str(), "PING", 0); time(&pingtime[up(c.nickname)]); } } bool irchook::knowntransfer(const imfile &fr) const { return transferinfo.find(fr) != transferinfo.end(); } void irchook::replytransfer(const imfile &fr, bool accept, const string &localpath) { if(accept) { transferinfo[fr].second = localpath; if(transferinfo[fr].second.substr(transferinfo[fr].second.size()-1) != "/") transferinfo[fr].second += "/"; transferinfo[fr].second += justfname(fr.getfiles().begin()->fname); firetalk_file_accept(handle, transferinfo[fr].first, 0, transferinfo[fr].second.c_str()); } else { firetalk_file_refuse(handle, transferinfo[fr].first); transferinfo.erase(fr); } } void irchook::aborttransfer(const imfile &fr) { firetalk_file_cancel(handle, transferinfo[fr].first); face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsCancel, 0, 0); irhook.transferinfo.erase(fr); } bool irchook::getfevent(void *fhandle, imfile &fr) { map >::const_iterator i = transferinfo.begin(); while(i != transferinfo.end()) { if(i->second.first == fhandle) { fr = i->first; return true; } ++i; } return false; } // ---------------------------------------------------------------------------- void irchook::userstatus(const string &nickname, imstatus st) { if(!nickname.empty()) { imcontact ic(nickname, irc); icqcontact *c = clist.get(ic); if(c) if(st != c->getstatus()) { logger.putonline(ic, c->getstatus(), st); c->setstatus(st); } } } void irchook::connected(void *conn, void *cli, ...) { irhook.flogged = true; irhook.log(logLogged); face.update(); int i; vector::iterator ic; icqcontact *c; for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getdesc().pname == irc) if(!ischannel(c)) { vector::const_iterator ig = find(groups.begin(), groups.end(), clist.get(c)->getgroupid()); if(ig != groups.end()) { firetalk_im_add_buddy(irhook.handle, c->getdesc().nickname.c_str() , ig->getname().c_str(), ""); } } } for(ic = irhook.channels.begin(); ic != irhook.channels.end(); ++ic) { if(ic->joined) { string passname = ic->name; if (!ic->passwd.empty()) passname += " " + ic->passwd; firetalk_chat_join(irhook.handle, passname.c_str()); } } irhook.ourstatus = available; irhook.setautostatus(irhook.manualstatus); irhook.awaymessages.clear(); irhook.sentpass = false; } void irchook::disconnected(void *conn, void *cli, ...) { irhook.fonline = false; logger.putourstatus(irc, irhook.getstatus(), offline); clist.setoffline(irc); vector::iterator ic; for(ic = irhook.channels.begin(); ic != irhook.channels.end(); ++ic) ic->fetched = false; irhook.log(logDisconnected); face.update(); } void irchook::connectfailed(void *connection, void *cli, ...) { va_list ap; va_start(ap, cli); int err = va_arg(ap, int); char *reason = va_arg(ap, char *); va_end(ap); irhook.fonline = false; face.log(_("+ [irc] connect failed: %s"), reason); face.update(); } void irchook::newnick(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *nick = va_arg(ap, char *); va_end(ap); if(nick) if(strlen(nick)) { icqconf::imaccount acc = conf->getourid(irc); acc.nickname = nick; conf->setourid(acc); face.log(_("+ [irc] nickname was changed successfully")); } } void irchook::gotinfo(void *conn, void *cli, ...) { int pos; va_list ap; string about, email; icqcontact::basicinfo cbinfo; va_start(ap, cli); char *nick = va_arg(ap, char *); char *info = va_arg(ap, char *); int warning = va_arg(ap, int); int idle = va_arg(ap, int); va_end(ap); if(nick && info) if(strlen(nick) && strlen(info)) { icqcontact *c = clist.get(imcontact(nick, irc)); if(!c) c = clist.get(contactroot); about = info; cbinfo = c->getbasicinfo(); if((pos = about.find(":")) != -1) { email = about.substr(0, pos); about.erase(0, pos); if(email.substr(0, 1) == "~") email.erase(0, 1); if((pos = about.find_first_not_of(" :")) > 0) about.erase(0, pos); } cbinfo.lname = ""; cbinfo.email = irhook.rushtmlconv("wk", email); if((pos = about.find(" ")) != -1) { cbinfo.lname = irhook.rushtmlconv("wk", about.substr(pos+1)); about.erase(pos); } cbinfo.fname = irhook.rushtmlconv("wk", about); c->setnick(nick); c->setbasicinfo(cbinfo); if(c->getstatus() == offline) c->setstatus(available); } } void irchook::gotchannels(void *conn, void *cli, ...) { va_list ap; string info; icqcontact *c; va_start(ap, cli); char *nick = va_arg(ap, char *); char *channels = va_arg(ap, char *); va_end(ap); if(nick && channels) if(strlen(nick) && strlen(channels)) { c = clist.get(imcontact(nick, irc)); if(!c) c = clist.get(contactroot); c->setabout((string) _("On channels: ") + channels); if(c->getstatus() == offline) c->setstatus(available); } } void irchook::getmessage(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *sender = va_arg(ap, char *); int automessage_flag = va_arg(ap, int); char *message = va_arg(ap, char *); va_end(ap); if(sender && message) if(strlen(sender) && strlen(message)) { /*if(!irhook.sentpass) // NickServ identify should be handled by firetalk and needpass callback if(up(sender) == "NICKSERV") { firetalk_im_send_message(irhook.handle, "NickServ", ((string) "identify " + conf->getourid(irc).additional["nickpass"]).c_str(), 0); irhook.sentpass = true; }*/ em.store(immessage(imcontact(sender, irc), imevent::incoming, irhook.rushtmlconv("wk", cuthtml(message, chCutBR | chLeaveLinks)))); } } void irchook::getaction(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *sender = va_arg(ap, char *); int automessage_flag = va_arg(ap, int); char *message = va_arg(ap, char *); va_end(ap); if(sender && message) if(strlen(sender) && strlen(message)) { em.store(immessage(imcontact(sender, irc), imevent::incoming, ((string) "* " + sender + " " + irhook.rushtmlconv("wk", cuthtml(message, chCutBR | chLeaveLinks))).c_str())); } } void irchook::buddyonline(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *nick = va_arg(ap, char *); va_end(ap); if(nick) if(strlen(nick)) { irhook.userstatus(nick, available); } } void irchook::buddyoffline(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *nick = va_arg(ap, char *); va_end(ap); if(nick) if(strlen(nick)) { irhook.userstatus(nick, offline); } } void irchook::buddyaway(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *nick = va_arg(ap, char *); char *msg = va_arg(ap, char *); va_end(ap); if(nick) if(strlen(nick)) { irhook.userstatus(nick, away); if(msg) irhook.awaymessages[nick] = irhook.rushtmlconv("wk", msg); } } void irchook::listmember(void *connection, void *cli, ...) { va_list ap; vector::iterator ir; va_start(ap, cli); char *room = va_arg(ap, char *); char *membername = va_arg(ap, char *); int opped = va_arg(ap, int); va_end(ap); if(membername) if(strlen(membername)) { ir = find(irhook.channels.begin(), irhook.channels.end(), room); if(ir != irhook.channels.end()) { ir->nicks.push_back(/*(string) (opped ? "@": "") +*/ membername); } } } void irchook::fclog(void *connection, void *cli, ...) { va_list ap; va_start(ap, cli); char *msg = va_arg(ap, char *); va_end(ap); face.log("irc: %s", msg); } void irchook::chatnames(void *connection, void *cli, ...) { va_list ap; vector::iterator ic; vector::iterator is; bool ready = true; va_start(ap, cli); char *croom = va_arg(ap, char *); va_end(ap); ic = find(irhook.channels.begin(), irhook.channels.end(), croom); if(ic != irhook.channels.end()) { ic->fetched = true; ic->nicks.clear(); if(irhook.searchdest) { if(irhook.emailsub.empty() && irhook.namesub.empty()) { firetalk_chat_listmembers(irhook.handle, croom); if(!ic->joined) firetalk_chat_part(irhook.handle, croom); } else { firetalk_chat_requestextended(irhook.handle, croom); } } } if(irhook.searchdest && irhook.emailsub.empty() && irhook.namesub.empty()) { for(is = irhook.searchchannels.begin(); is != irhook.searchchannels.end(); ++is) { ic = find(irhook.channels.begin(), irhook.channels.end(), *is); if(ic != irhook.channels.end()) if(!ic->fetched) { ready = false; break; } } if(ready) { irhook.processnicks(); } } } void irchook::listextended(void *connection, void *cli, ...) { va_list ap; string text, email, name; vector::iterator ir; vector::iterator is; int npos; va_start(ap, cli); char *nickname = va_arg(ap, char *); char *room = va_arg(ap, char *); char *login = va_arg(ap, char *); char *hostname = va_arg(ap, char *); char *net = va_arg(ap, char *); char *description = va_arg(ap, char *); va_end(ap); ir = find(irhook.channels.begin(), irhook.channels.end(), room); if(irhook.smode == Email) { ir = find(irhook.channels.begin(), irhook.channels.end(), ""); if(ir == irhook.channels.end()) { irhook.channels.push_back(channelInfo("")); ir = irhook.channels.end()-1; } } if(ir != irhook.channels.end()) { name = description; if((npos = name.find(" ")) != -1) name.erase(0, npos+1); email = (string) login + "@" + hostname; if(irhook.emailsub.empty() || email.find(irhook.emailsub) != -1 || irhook.smode == Email) { if(irhook.namesub.empty() || name.find(irhook.namesub) != -1) { text = nickname; if(!irhook.emailsub.empty()) { text += " <" + email + ">"; } else if(!irhook.namesub.empty()) { text += " [" + name + "]"; } ir->nicks.push_back(text); } } } if(find(irhook.extlisted.begin(), irhook.extlisted.end(), room) == irhook.extlisted.end()) irhook.extlisted.push_back(room); } void irchook::endextended(void *connection, void *cli, ...) { bool ready = true; vector::iterator is; vector::iterator ic; if(irhook.smode == Channel && !irhook.extlisted.empty()) { ic = find(irhook.channels.begin(), irhook.channels.end(), irhook.extlisted.back()); if(ic != irhook.channels.end()) { if(!ic->joined) firetalk_chat_part(irhook.handle, irhook.extlisted.back().c_str()); for(is = irhook.searchchannels.begin(); ready && is != irhook.searchchannels.end(); ++is) ready = find(irhook.extlisted.begin(), irhook.extlisted.end(), *is) != irhook.extlisted.end(); } } ready = ready || irhook.smode == Email; if(ready) { irhook.processnicks(); if(irhook.smode == Email) { ic = find(irhook.channels.begin(), irhook.channels.end(), ""); if(ic != irhook.channels.end()) irhook.channels.erase(ic); } } } void irchook::chatmessage(void *connection, void *cli, ...) { va_list ap; string imsg; va_start(ap, cli); char *room = va_arg(ap, char *); char *from = va_arg(ap, char *); int automessage = va_arg(ap, int); char *msg = va_arg(ap, char *); va_end(ap); if(clist.get(imcontact(room, irc))) { imsg = (string) from + ": " + msg; getmessage(connection, cli, room, automessage, imsg.c_str()); } } void irchook::chataction(void *connection, void *cli, ...) { va_list ap; string imsg; va_start(ap, cli); char *room = va_arg(ap, char *); char *from = va_arg(ap, char *); int automessage = va_arg(ap, int); char *msg = va_arg(ap, char *); va_end(ap); if(from && msg) if(strlen(from) && strlen(msg)) if(clist.get(imcontact(room, irc))) { em.store(immessage(imcontact(room, irc), imevent::incoming, ((string) "* " + from + " " + irhook.rushtmlconv("wk", cuthtml(msg, chCutBR | chLeaveLinks))).c_str())); } } void irchook::chatjoined(void *connection, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); va_end(ap); icqcontact *c = clist.get(imcontact(room, irc)); if(c) c->setstatus(available, false); } void irchook::chatleft(void *connection, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); va_end(ap); icqcontact *c = clist.get(imcontact(room, irc)); if(c) c->setstatus(offline, false); } void irchook::chatkicked(void *connection, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); char *by = va_arg(ap, char *); char *reason = va_arg(ap, char *); va_end(ap); irhook.channelfatal(room, _("Kicked by %s; reason: %s"), by, irhook.rushtmlconv("wk", reason).c_str()); } void irchook::errorhandler(void *connection, void *cli, ...) { va_list ap; icqcontact *c; va_start(ap, cli); int error = va_arg(ap, int); char *subject = va_arg(ap, char *); char *description = va_arg(ap, char *); va_end(ap); switch(error) { case FE_ROOMUNAVAILABLE: // Cannot join channel if(subject) if(strlen(subject)) irhook.channelfatal(subject, "%s", description); break; case FE_BADUSER: // Cannot fetch user's info if(subject) if(strlen(subject)) if(c = clist.get(imcontact(subject, irc))) c->setstatus(offline); break; } } void irchook::nickchanged(void *connection, void *cli, ...) { va_list ap; icqcontact *c; char buf[NOTIFBUF]; va_start(ap, cli); char *oldnick = va_arg(ap, char *); char *newnick = va_arg(ap, char *); va_end(ap); if(oldnick && newnick) if(strcmp(oldnick, newnick)) { if(c = clist.get(imcontact(oldnick, irc))) { if(!clist.get(imcontact(newnick, irc))) { if(!c->inlist()) { if(c->getdispnick() == oldnick) c->setdispnick(newnick); c->setdesc(imcontact(newnick, irc)); c->setnick(newnick); } } else { c->setstatus(offline); } snprintf(buf, NOTIFBUF, _("The user has changed their nick from %s to %s"), oldnick, newnick); em.store(imnotification(c, buf)); } } } void irchook::needpass(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *pass = va_arg(ap, char *); int size = va_arg(ap, int); va_end(ap); if(pass) { icqconf::imaccount acc = conf->getourid(irc); if (size == 129) // signon password { if(!acc.password.empty()) { strncpy(pass, acc.password.c_str(), size-1); pass[size-1] = 0; face.log(_("+ [irc] password sent")); } } else // NickServ password { irhook.sentpass = true; if(!acc.additional["nickpass"].empty()) { strncpy(pass, acc.additional["nickpass"].c_str(), size-1); pass[size-1] = 0; face.log(_("+ [irc] nick password sent")); } } } } void irchook::subrequest(void *conn, void *cli, const char * const nick, const char * const command, const char * const args) { if(!strcmp(command, "VERSION")) { ostringstream args_stream; args_stream << PACKAGE << " " << centerim::version; firetalk_subcode_send_reply(conn, nick, "VERSION", args_stream.str().c_str()); } } void irchook::subreply(void *conn, void *cli, const char * const nick, const char * const command, const char * const args) { char buf[NOTIFBUF]; if(!strcmp(command, "PING")) { map::iterator i = irhook.pingtime.find(up(nick)); if(i != irhook.pingtime.end()) { snprintf(buf, NOTIFBUF, _("PING reply from the user: %d second(s)"), time(0)-i->second); em.store(imnotification(imcontact(nick, irc), buf)); } } else if(!strcmp(command, "VERSION")) { snprintf(buf, NOTIFBUF, _("The remote is using %s"), args); em.store(imnotification(imcontact(nick, irc), buf)); } } void irchook::fileoffer(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); void *filehandle = va_arg(ap, void *); char *from = va_arg(ap, char *); char *filename = va_arg(ap, char *); long size = va_arg(ap, long); va_end(ap); imfile::record r; r.fname = filename; r.size = size; imfile fr(imcontact(from, irc), imevent::incoming, "", vector(1, r)); irhook.transferinfo[fr].first = filehandle; em.store(fr); face.transferupdate(filename, fr, icqface::tsInit, size, 0); } void irchook::filestart(void *conn, void *cli, ...) { va_list ap; imfile fr; va_start(ap, cli); void *filehandle = va_arg(ap, void *); void *clientfilestruct = va_arg(ap, void *); va_end(ap); if(irhook.getfevent(filehandle, fr)) { face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsStart, 0, 0); } } void irchook::fileprogress(void *conn, void *cli, ...) { va_list ap; imfile fr; va_start(ap, cli); void *filehandle = va_arg(ap, void *); void *clientfilestruct = va_arg(ap, void *); long bytes = va_arg(ap, long); long size = va_arg(ap, long); va_end(ap); if(irhook.getfevent(filehandle, fr)) { face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsProgress, size, bytes); } } void irchook::filefinish(void *conn, void *cli, ...) { va_list ap; imfile fr; va_start(ap, cli); void *filehandle = va_arg(ap, void *); void *clientfilestruct = va_arg(ap, void *); long size = va_arg(ap, long); va_end(ap); if(irhook.getfevent(filehandle, fr)) { face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsFinish, size, 0); irhook.transferinfo.erase(fr); } } void irchook::fileerror(void *conn, void *cli, ...) { va_list ap; imfile fr; va_start(ap, cli); void *filehandle = va_arg(ap, void *); void *clientfilestruct = va_arg(ap, void *); int error = va_arg(ap, int); va_end(ap); if(irhook.getfevent(filehandle, fr)) { face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsError, 0, 0); irhook.transferinfo.erase(fr); } } void irchook::chatuserjoined(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); char *who = va_arg(ap, char *); char *email = va_arg(ap, char *); va_end(ap); if(conf->getourid(irc).nickname != who) { string uname = who; if(email) if(strlen(email)) uname += (string) " (" + email + ")"; char buf[NOTIFBUF]; snprintf(buf, NOTIFBUF, _("%s has joined."), uname.c_str()); em.store(imnotification(imcontact(room, irc), buf)); } } void irchook::chatuserleft(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); char *who = va_arg(ap, char *); char *reason = va_arg(ap, char *); va_end(ap); if(conf->getourid(irc).nickname != who) { string text; string text2; char buf[NOTIFBUF]; snprintf(buf, NOTIFBUF, _("%s has left"), who); text = buf; if(reason) if(strlen(reason)) { if(strlen(reason) > 450) reason[450] = 0; text2 = irhook.rushtmlconv( "wk", reason ); snprintf(buf, NOTIFBUF, _("reason: %s"), reason); text += (string) "; " + buf + "."; } em.store(imnotification(imcontact(room, irc), text)); } } void irchook::chatuserkicked(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); char *who = va_arg(ap, char *); char *by = va_arg(ap, char *); char *reason = va_arg(ap, char *); va_end(ap); if(conf->getourid(irc).nickname != who) { string text; char buf[NOTIFBUF]; snprintf(buf, NOTIFBUF, _("%s has been kicked by %s"), who, by); text = buf; if(reason) if(strlen(reason)) { snprintf(buf, NOTIFBUF, _("reason: %s"), reason); text += (string) "; " + buf + "."; } em.store(imnotification(imcontact(room, irc), text)); } } void irchook::chatgottopic(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); char *topic = va_arg(ap, char *); char *author = va_arg(ap, char *); va_end(ap); vector::const_iterator ic = find(irhook.channels.begin(), irhook.channels.end(), room); if(ic == irhook.channels.end() || !ic->joined) return; string text; char buf[NOTIFBUF]; text = irhook.rushtmlconv( "wk", topic ); snprintf(buf, NOTIFBUF, _("Channel topic now is: %s"), text.c_str()); text = buf; if(author) if(strlen(author)) { snprintf(buf, NOTIFBUF, _("set by %s"), author); text += (string) "; " + buf + "."; } em.store(imnotification(imcontact(room, irc), text)); } void irchook::chatuseropped(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); char *who = va_arg(ap, char *); char *by = va_arg(ap, char *); va_end(ap); if(by) { char buf[NOTIFBUF]; snprintf(buf, NOTIFBUF, _("%s has been opped by %s."), who, by); em.store(imnotification(imcontact(room, irc), buf)); } } void irchook::chatuserdeopped(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); char *who = va_arg(ap, char *); char *by = va_arg(ap, char *); va_end(ap); if(by) { char buf[NOTIFBUF]; snprintf(buf, NOTIFBUF, _("%s has been deopped by %s."), who, by); em.store(imnotification(imcontact(room, irc), buf)); } } void irchook::chatopped(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); char *by = va_arg(ap, char *); va_end(ap); char buf[NOTIFBUF]; if(by) snprintf(buf, NOTIFBUF, _("%s has opped us."), by); else snprintf(buf, NOTIFBUF, _("you are an op here")); em.store(imnotification(imcontact(room, irc), buf)); } void irchook::chatdeopped(void *conn, void *cli, ...) { va_list ap; va_start(ap, cli); char *room = va_arg(ap, char *); char *by = va_arg(ap, char *); va_end(ap); char buf[NOTIFBUF]; snprintf(buf, NOTIFBUF, _("%s has deopped us."), by); em.store(imnotification(imcontact(room, irc), buf)); } // ---------------------------------------------------------------------------- bool irchook::channelInfo::operator != (const string &aname) const { return up(aname) != up(name); } bool irchook::channelInfo::operator == (const string &aname) const { return up(aname) == up(name); } #endif centerim-4.22.10/src/hooks/gaduhook.cc0000644000175000001440000005066411461606612014443 00000000000000/* * * centerim gadu-gadu protocol handling class * $Id: gaduhook.cc,v 1.14 2005/07/08 09:49:17 konst Exp $ * * Copyright (C) 2004 by Konstantin Klyagin * * 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 "icqcommon.h" #ifdef BUILD_GADU #include "eventmanager.h" #include "gaduhook.h" #include "icqface.h" #include "imlogger.h" #include "icqcontacts.h" #include "libgadu-config.h" #include "libgadu.h" #include #include #include #include #ifdef HAVE_JPEGLIB_H extern "C" { #include } #endif #define PERIOD_PING 50 static imstatus gg2imstatus(int st) { imstatus imst; switch(st) { case GG_STATUS_INVISIBLE: case GG_STATUS_INVISIBLE_DESCR: imst = invisible; break; case GG_STATUS_BUSY: case GG_STATUS_BUSY_DESCR: imst = occupied; break; case GG_STATUS_NOT_AVAIL: case GG_STATUS_NOT_AVAIL_DESCR: imst = offline; break; default: imst = available; break; } return imst; } static int imstatus2gg(imstatus st, const string &desc = "") { int gst; switch(st) { case invisible: gst = desc.empty() ? GG_STATUS_INVISIBLE : GG_STATUS_INVISIBLE_DESCR; break; case dontdisturb: case occupied: case notavail: case outforlunch: case away: gst = desc.empty() ? GG_STATUS_BUSY : GG_STATUS_BUSY_DESCR; break; case freeforchat: case available: default: gst = desc.empty() ? GG_STATUS_AVAIL : GG_STATUS_AVAIL_DESCR; break; } return gst; } // ---------------------------------------------------------------------------- gaduhook ghook; gg_pubdir50_t lreq = 0, ireq = 0; gaduhook::gaduhook(): abstracthook(gadu), flogged(false), sess(0) { fcapabs.insert(hookcapab::changepassword); fcapabs.insert(hookcapab::changenick); fcapabs.insert(hookcapab::changedetails); fcapabs.insert(hookcapab::setaway); fcapabs.insert(hookcapab::fetchaway); fcapabs.insert(hookcapab::ssl); } gaduhook::~gaduhook() { } void gaduhook::init() { manualstatus = conf->getstatus(proto); } void gaduhook::connect() { icqconf::imaccount acc = conf->getourid(proto); static struct gg_login_params lp; /* TODO investigate this, auto_ptr will free with delete, but allocated by malloc */ static auto_ptr pass(strdup(acc.password.c_str())); memset(&lp, 0, sizeof(lp)); struct hostent *he = gethostbyname(acc.server.c_str()); struct in_addr addr; if(he) { memcpy((char *) &addr, he->h_addr, sizeof(addr)); lp.server_addr = addr.s_addr; lp.server_port = acc.port; lp.uin = acc.uin; lp.password = pass.get(); lp.async = 1; /* TODO investigate this, auto_ptr will free with delete, but allocated by malloc */ static auto_ptr descr(strdup(rusconv("kw", conf->getawaymsg(proto)).c_str())); lp.status_descr = descr.get(); lp.status = imstatus2gg(manualstatus, descr.get()); lp.tls = acc.additional["ssl"] == "1" ? 1 : 0; log(logConnecting); sess = gg_login(&lp); if(!sess) face.log(_("+ [gg] connection failed")); } else { face.log(_("+ [gg] cannot resolve %s"), acc.server.c_str()); } } void gaduhook::cutoff() { if(sess) { gg_change_status(sess, GG_STATUS_NOT_AVAIL); gg_logoff(sess); gg_free_session(sess); sess = 0; } clist.setoffline(proto); } void gaduhook::disconnect() { cutoff(); log(logDisconnected); logger.putourstatus(proto, getstatus(), offline); } void gaduhook::exectimers() { if(logged()) { if(timer_current-timer_ping > PERIOD_PING) { gg_ping(sess); timer_ping = timer_current; } } } void gaduhook::main() { int i; fd_set rd, wd; struct timeval tv; struct gg_event *e; struct gg_notify_reply *nr; string text; e = gg_watch_fd(sess); if(e) { switch(e->type) { case GG_EVENT_CONN_SUCCESS: flogged = true; time(&timer_ping); userlistsend(); log(logLogged); face.update(); break; case GG_EVENT_CONN_FAILED: cutoff(); face.log(_("+ [gg] connection to the server failed")); break; case GG_EVENT_DISCONNECT: disconnect(); break; case GG_EVENT_MSG: if(e->event.msg.sender && e->event.msg.message) { text = rusconv("wk", (const char *) e->event.msg.message); em.store(immessage(imcontact(e->event.msg.sender, gadu), imevent::incoming, text, e->event.msg.time)); } break; case GG_EVENT_NOTIFY: case GG_EVENT_NOTIFY_DESCR: nr = (e->type == GG_EVENT_NOTIFY) ? e->event.notify : e->event.notify_descr.notify; for(; nr->uin; nr++) { char *desc = (e->type == GG_EVENT_NOTIFY_DESCR) ? e->event.notify_descr.descr : 0; usernotify(nr->uin, nr->status, desc, nr->remote_ip, nr->remote_port, nr->version); } break; case GG_EVENT_NOTIFY60: for(i = 0; e->event.notify60[i].uin; i++) usernotify(e->event.notify60[i].uin, e->event.notify60[i].status, e->event.notify60[i].descr, e->event.notify60[i].remote_ip, e->event.notify60[i].remote_port, e->event.notify60[i].version); break; case GG_EVENT_STATUS: userstatuschange(e->event.status.uin, e->event.status.status, e->event.status.descr); break; case GG_EVENT_STATUS60: userstatuschange(e->event.status60.uin, e->event.status60.status, e->event.status60.descr); break; case GG_EVENT_ACK: break; case GG_EVENT_PONG: break; case GG_EVENT_PUBDIR50_SEARCH_REPLY: searchdone(e->event.pubdir50); break; case GG_EVENT_PUBDIR50_READ: break; case GG_EVENT_PUBDIR50_WRITE: break; case GG_EVENT_USERLIST: if(e->event.userlist.type == GG_USERLIST_GET_REPLY) { char *p = e->event.userlist.reply; } break; } gg_free_event(e); } else { cutoff(); face.log(_("+ [gg] connection lost")); } } void gaduhook::getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const { if(sess && sess->fd != -1) { if((sess->check & GG_CHECK_READ)) FD_SET(sess->fd, &rfds); if((sess->check & GG_CHECK_WRITE)) FD_SET(sess->fd, &wfds); hsocket = max(sess->fd, hsocket); } } bool gaduhook::isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const { if(sess && sess->fd != -1) { return FD_ISSET(sess->fd, &rfds) || FD_ISSET(sess->fd, &wfds); } return false; } bool gaduhook::online() const { return sess; } bool gaduhook::logged() const { return sess && flogged; } bool gaduhook::isconnecting() const { return sess && !flogged; } bool gaduhook::enabled() const { return true; } bool gaduhook::send(const imevent &ev) { icqcontact *c = clist.get(ev.getcontact()); string text; if(c) { if(ev.gettype() == imevent::message) { const immessage *m = static_cast(&ev); if(m) text = rushtmlconv("kw", m->gettext()); } else if(ev.gettype() == imevent::url) { const imurl *m = static_cast(&ev); if(m) text = rushtmlconv("kw", m->geturl()) + "\n\n" + rusconv("kw", m->getdescription()); } gg_send_message(sess, GG_CLASS_MSG, c->getdesc().uin, (const unsigned char *) text.c_str()); return true; } return false; } void gaduhook::sendnewuser(const imcontact &c) { gg_add_notify(sess, c.uin); requestinfo(c); } void gaduhook::removeuser(const imcontact &c) { gg_remove_notify(sess, c.uin); } void gaduhook::setautostatus(imstatus st) { if(st == offline) { if(getstatus() != offline) disconnect(); } else { if(getstatus() != offline) { gg_change_status_descr(sess, imstatus2gg(st, conf->getawaymsg(proto)), conf->getawaymsg(proto).c_str()); logger.putourstatus(proto, getstatus(), st); } else { connect(); } } } imstatus gaduhook::getstatus() const { if(!sess) return offline; if(GG_S_NA(sess->status)) return notavail; else if(GG_S_B(sess->status)) return occupied; else if(GG_S_I(sess->status)) return invisible; else return available; } void gaduhook::requestinfo(const imcontact &c) { if(ireq) gg_pubdir50_free(ireq); ireq = gg_pubdir50_new(GG_PUBDIR50_SEARCH_REQUEST); gg_pubdir50_add(ireq, GG_PUBDIR50_UIN, i2str(c.uin).c_str()); gg_pubdir50(sess, ireq); } void gaduhook::requestawaymsg(const imcontact &ic) { icqcontact *c = clist.get(ic); if(c) { string am = awaymsgs[ic.uin]; if(!am.empty()) { em.store(imnotification(ic, (string) _("Away message:") + "\n\n" + am)); } else { face.log(_("+ [gg] no away message from %s, %s"), c->getdispnick().c_str(), ic.totext().c_str()); } } } bool gaduhook::regconnect(const string &aserv) { return true; } bool gaduhook::regattempt(unsigned int &auin, const string &apassword, const string &email) { fd_set rd, wr, ex; struct gg_http *th, *rh; struct gg_pubdir *p; struct gg_token *t; bool r = false; string token, tokenid; th = gg_token(0); if(!th) return false; token = handletoken(th); tokenid = ((struct gg_token *) th->data)->tokenid; gg_token_free(th); if((r = !token.empty())) { rh = gg_register3(email.c_str(), apassword.c_str(), tokenid.c_str(), token.c_str(), 0); if((r = rh)) { auin = ((struct gg_pubdir *) th->data)->uin; gg_free_register(rh); } } return r; } void gaduhook::lookup(const imsearchparams ¶ms, verticalmenu &dest) { searchdest = &dest; while(!foundguys.empty()) { delete foundguys.back(); foundguys.pop_back(); } if(lreq) gg_pubdir50_free(lreq); lreq = gg_pubdir50_new(GG_PUBDIR50_SEARCH_REQUEST); if(params.uin) gg_pubdir50_add(lreq, GG_PUBDIR50_UIN, i2str(params.uin).c_str()); if(!params.nick.empty()) gg_pubdir50_add(lreq, GG_PUBDIR50_NICKNAME, params.nick.c_str()); if(!params.firstname.empty()) gg_pubdir50_add(lreq, GG_PUBDIR50_FIRSTNAME, params.firstname.c_str()); if(!params.lastname.empty()) gg_pubdir50_add(lreq, GG_PUBDIR50_LASTNAME, params.lastname.c_str()); if(!params.city.empty()) gg_pubdir50_add(lreq, GG_PUBDIR50_CITY, params.city.c_str()); if(params.onlineonly) gg_pubdir50_add(lreq, GG_PUBDIR50_ACTIVE, GG_PUBDIR50_ACTIVE_TRUE); if(params.gender != genderUnspec) gg_pubdir50_add(lreq, GG_PUBDIR50_GENDER, params.gender == genderMale ? GG_PUBDIR50_GENDER_MALE : GG_PUBDIR50_GENDER_FEMALE); gg_pubdir50(sess, lreq); } void gaduhook::sendupdateuserinfo(const icqcontact &c) { gg_pubdir50_t req; if(req = gg_pubdir50_new(GG_PUBDIR50_WRITE)) { icqcontact::basicinfo bi = c.getbasicinfo(); icqcontact::moreinfo mi = c.getmoreinfo(); gg_pubdir50_add(req, GG_PUBDIR50_NICKNAME, c.getnick().c_str()); gg_pubdir50_add(req, GG_PUBDIR50_FIRSTNAME, bi.fname.c_str()); gg_pubdir50_add(req, GG_PUBDIR50_LASTNAME, bi.lname.c_str()); gg_pubdir50_add(req, GG_PUBDIR50_CITY, bi.city.c_str()); switch(mi.gender) { case genderMale: gg_pubdir50_add(req, GG_PUBDIR50_GENDER, GG_PUBDIR50_GENDER_SET_MALE); break; case genderFemale: gg_pubdir50_add(req, GG_PUBDIR50_GENDER, GG_PUBDIR50_GENDER_SET_FEMALE); break; } gg_pubdir50(sess, req); gg_pubdir50_free(req); } } // ---------------------------------------------------------------------------- void gaduhook::searchdone(void *p) { gg_pubdir50_t sp = (gg_pubdir50_t) p; if(searchdest && lreq) { for(int i = 0; i < sp->count; i++) { icqcontact *c = new icqcontact(imcontact(strtoul(gg_pubdir50_get(sp, i, GG_PUBDIR50_UIN), 0, 0), gadu)); icqcontact::basicinfo binfo = c->getbasicinfo(); const char *p = gg_pubdir50_get(sp, i, GG_PUBDIR50_NICKNAME); if(p) { c->setnick(p); c->setdispnick(c->getnick()); } p = gg_pubdir50_get(sp, i, GG_PUBDIR50_FIRSTNAME); if(p) binfo.fname = p; p = gg_pubdir50_get(sp, i, GG_PUBDIR50_LASTNAME); if(p) binfo.lname = p; string line; p = gg_pubdir50_get(sp, i, GG_PUBDIR50_STATUS); if(p && atoi(p) != GG_STATUS_NOT_AVAIL) line = "o "; else line = " "; line += c->getnick(); if(line.size() > 12) line.resize(12); else line += string(12-line.size(), ' '); line += " " + binfo.fname + " " + binfo.lname; c->setbasicinfo(binfo); foundguys.push_back(c); searchdest->additem(conf->getcolor(cp_clist_gadu), c, line); } searchdest->redraw(); face.findready(); log(logSearchFinished, foundguys.size()); searchdest = 0; } else if(ireq) { icqcontact *c = clist.get(imcontact(strtoul(gg_pubdir50_get(sp, 0, GG_PUBDIR50_UIN), 0, 0), gadu)); string nick, gender; const char *p = 0; if(!c) c = clist.get(contactroot); icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); p = gg_pubdir50_get(sp, 0, GG_PUBDIR50_FIRSTNAME); if(p) bi.fname = p; p = gg_pubdir50_get(sp, 0, GG_PUBDIR50_LASTNAME); if(p) bi.lname = p; p = gg_pubdir50_get(sp, 0, GG_PUBDIR50_NICKNAME); if(p) { nick = p; if((c->getnick() == c->getdispnick()) || (c->getdispnick() == i2str(c->getdesc().uin))) c->setdispnick(nick); c->setnick(nick); } else { c->setdispnick(bi.fname); } p = gg_pubdir50_get(sp, 0, GG_PUBDIR50_CITY); if(p) bi.city = p; p = gg_pubdir50_get(sp, 0, GG_PUBDIR50_GENDER); if(p) { gender = p; if(gender == GG_PUBDIR50_GENDER_MALE) mi.gender = genderMale; else if(gender == GG_PUBDIR50_GENDER_FEMALE) mi.gender = genderFemale; else mi.gender = genderUnspec; } c->setbasicinfo(bi); c->setmoreinfo(mi); } } void gaduhook::userstatuschange(unsigned int uin, int status, const char *desc) { icqcontact *c = clist.get(imcontact(uin, gadu)); if(c) { imstatus ust = gg2imstatus(status); logger.putonline(c, c->getstatus(), ust); c->setstatus(ust); if(desc) awaymsgs[uin] = rusconv("wk", desc); else awaymsgs[uin] = ""; } } void gaduhook::userlistsend() { int i; vector uins; icqcontact *c; for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getdesc().pname == proto && c->getdesc().uin) uins.push_back(c->getdesc().uin); } auto_ptr cuins(new uin_t[uins.size()]); /* TODO: allocated with new[], but will be freed by delete */ auto_ptr ctypes(new char[uins.size()]); for(vector::const_iterator iu = uins.begin(); iu != uins.end(); ++iu) { cuins.get()[iu-uins.begin()] = *iu; ctypes.get()[iu-uins.begin()] = GG_USER_NORMAL; } gg_notify_ex(sess, cuins.get(), ctypes.get(), uins.size()); } void gaduhook::usernotify(unsigned int uin, int status, const char *desc, unsigned int ip, int port, int version) { imcontact ic(uin, gadu); icqcontact *c = clist.get(ic); if(c) { struct in_addr addr; addr.s_addr = ntohl(ip); char *p = inet_ntoa(addr); if(p) c->setlastip(p); imstatus ust = gg2imstatus(status); logger.putonline(c, c->getstatus(), ust); c->setstatus(ust); if(desc) awaymsgs[ic.uin] = rusconv("wk", desc); else awaymsgs[ic.uin] = ""; } } // ---------------------------------------------------------------------------- const int token_char_height = 12; const char token_id_char[] = {"0123456789abcdef"}; const char token_id[][15] = { "..####..", ".##..##.", "##....##", "##....##", "##....##", "##....##", "##....##", "##....##", "##....##", "##....##", ".##..##.", "..####..", "...##", "..###", "#####", "...##", "...##", "...##", "...##", "...##", "...##", "...##", "...##", "...##", "..####..", ".##..##.", "##....##", "##....##", "......##", ".....##.", "....##..", "...##...", "..##....", ".##.....", "##......", "########", "..####..", ".##..##.", "##....##", "##....##", ".....##.", "...###..", ".....##.", "......##", "##....##", "##....##", ".##..##.", "..####..", ".....##.", "....###.", "...####.", "...#.##.", "..##.##.", "..#..##.", ".##..##.", "##...##.", "########", ".....##.", ".....##.", ".....##.", ".#######", ".##.....", ".##.....", "##......", "######..", "##...##.", "......##", "......##", "......##", "##....##", "##...##.", ".#####..", "..#####.", ".##...##", ".#.....#", "##......", "##.###..", "###..##.", "##....##", "##....##", "##....##", "##....##", ".##..##.", "..####..", "########", "......##", ".....##.", ".....##.", "....##..", "....##..", "...##...", "...##...", "...##...", "..##....", "..##....", "..##....", "..####..", ".##..##.", "##....##", "##....##", ".##..##.", "..####..", ".##..##.", "##....##", "##....##", "##....##", ".##..##.", "..####..", "..####..", ".##..##.", "##....##", "##....##", "##....##", "##....##", ".##..###", "..###.##", "......##", "#.....#.", "##...##.", ".#####..", "........", "........", "........", "........", ".#####..", "##...##.", ".....##.", ".######.", "##...##.", "##...##.", "##...##.", ".####.##", "##.....", "##.....", "##.....", "##.....", "######.", "##...##", "##...##", "##...##", "##...##", "##...##", "##...##", "######.", ".......", ".......", ".......", ".......", ".#####.", "##...##", "##...##", "##.....", "##.....", "##...##", "##...##", ".#####.", ".....##", ".....##", ".....##", ".....##", ".######", "##...##", "##...##", "##...##", "##...##", "##...##", "##...##", ".######", ".......", ".......", ".......", ".......", ".#####.", "##...##", "##...##", "#######", "##.....", "##....#", "##...##", ".#####.", "..###", ".##..", ".##..", ".##..", "#####", ".##..", ".##..", ".##..", ".##..", ".##..", ".##..", ".##.."}; static int token_check(int nr, int x, int y, const char *ocr, int maxx, int maxy) { int i; for(i = nr*token_char_height; i < (nr+1)*token_char_height; i++, y++) { int j, xx = x; for(j = 0; token_id[i][j] && j + xx < maxx; j++, xx++) { if(token_id[i][j] != ocr[y * (maxx + 1) + xx]) return 0; } } return 1; } static char *token_ocr(const char *ocr, int width, int height, int length) { int x, y, count = 0; char *token; token = (char *) malloc(length + 1); memset(token, 0, length + 1); for(x = 0; x < width; x++) { for(y = 0; y < height - token_char_height; y++) { int result = 0, token_part = 0; do { result = token_check(token_part++, x, y, ocr, width, height); } while(!result && token_part < 16); if(result && count < length) token[count++] = token_id_char[token_part - 1]; } } if(count == length) return token; free(token); return NULL; } string gaduhook::handletoken(struct gg_http *h) { struct gg_token *t; string fname, r; char *tmpfilep = NULL; if(!h) return ""; if(gg_token_watch_fd(h) || h->state == GG_STATE_ERROR) return ""; if(h->state != GG_STATE_DONE) return ""; if(!(t = (struct gg_token *) h->data) || !h->body) return ""; do { while (tmpfilep == NULL) { char tmpnam[PATH_MAX]; int tmpfiledes; char * tmpdir = getenv("TMPDIR"); if (!tmpdir) tmpdir = "/tmp"; strncat(tmpnam, "/gg.token.XXXXXX", sizeof(tmpnam)-strlen(tmpnam)-1); if ((tmpfiledes = mkstemp (tmpnam)) == -1) { tmpfilep = NULL; } else { tmpfilep = tmpnam; close (tmpfiledes); } fname = tmpnam; } } while(!access(fname.c_str(), F_OK)); ofstream bf(fname.c_str()); if(bf.is_open()) { bf.write(h->body, h->body_size); bf.close(); } else { return ""; } #ifdef HAVE_LIBJPEG struct jpeg_decompress_struct j; struct jpeg_error_mgr e; JSAMPROW buf[1]; int size, i; char *token, *tmp; FILE *f; int ih = 0; if(!(f = fopen(fname.c_str(), "rb"))) return ""; j.err = jpeg_std_error(&e); jpeg_create_decompress(&j); jpeg_stdio_src(&j, f); jpeg_read_header(&j, TRUE); jpeg_start_decompress(&j); size = j.output_width * j.output_components; buf[0] = (JSAMPLE *) malloc(size); token = (char *) malloc((j.output_width + 1) * j.output_height); while(j.output_scanline < j.output_height) { jpeg_read_scanlines(&j, buf, 1); for(i = 0; i < j.output_width; i++, ih++) token[ih] = (buf[0][i*3] + buf[0][i*3+1] + buf[0][i*3+2] < 384) ? '#' : '.'; token[ih++] = 0; } if((tmp = token_ocr(token, j.output_width, j.output_height, t->length))) { r = tmp; free(tmp); } free(token); jpeg_finish_decompress(&j); jpeg_destroy_decompress(&j); free(buf[0]); fclose(f); unlink(fname.c_str()); #endif return r; } #endif centerim-4.22.10/src/hooks/ljhook.h0000644000175000001440000000364311461606612013765 00000000000000#ifndef __LJHOOK_H__ #define __LJHOOK_H__ #include "abstracthook.h" #ifdef BUILD_LJ #include "HTTPClient.h" class ljhook: public abstracthook, public sigslot::has_slots<> { protected: HTTPClient httpcli; string baseurl, md5pass, username; vector rfds, wfds, efds; bool fonline, flogged; imcontact self; time_t timer_getfriends; verticalmenu *sdest; string lookfor; enum RequestType { reqLogin, reqPost, reqPostComment, reqGetFriends, reqDelFriend, reqAddFriend, reqLookup, reqDone }; map sent; vector friendof, journals, moods, pictures; void socket_cb(SocketEvent *ev); void messageack_cb(MessageEvent *ev); void logger_cb(LogEvent *ev); void requestfriends(); string getfeedurl(const string &nick) const; string getoldfeedurl(const string &nick) const; public: ljhook(); ~ljhook(); void init(); void connect(); void disconnect(); void exectimers(); void main(); void getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const; bool isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const; bool online() const; bool logged() const; bool isconnecting() const; bool enabled() const; bool send(const imevent &sev); void sendnewuser(const imcontact &ic); void removeuser(const imcontact &ic); void setautostatus(imstatus st); imstatus getstatus() const; void requestinfo(const imcontact &c); void lookup(const imsearchparams ¶ms, verticalmenu &dest); void stoplookup(); void requestawaymsg(const imcontact &c); void requestversion(const imcontact &c); void ping(const imcontact &c); void ouridchanged(const icqconf::imaccount &ia); void updatecontact(icqcontact *c); vector getjournals() const { return journals; } vector getmoods() const { return moods; } vector getpictures() const { return pictures; } }; extern ljhook lhook; #endif #endif centerim-4.22.10/src/hooks/rsshook.cc0000644000175000001440000003075511473007750014332 00000000000000/* * * centerim rss handling class * $Id: rsshook.cc,v 1.23 2004/12/24 18:33:07 konst Exp $ * * Copyright (C) 2003 by Konstantin Klyagin * * 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 "icqcommon.h" #ifdef BUILD_RSS #define PERIOD_CHECK 30 #include "rsshook.h" #include "icqface.h" #include "icqcontacts.h" #include "imlogger.h" #include "icqconf.h" #include "eventmanager.h" rsshook rhook; rsshook::rsshook(): abstracthook(rss), timer_check(0) { fcapabs.insert(hookcapab::optionalpassword); fcapabs.insert(hookcapab::ping); fcapabs.insert(hookcapab::changeabout); fcapabs.insert(hookcapab::nochat); } rsshook::~rsshook() { } void rsshook::init() { httpcli.messageack.connect(this, &rsshook::messageack_cb); httpcli.socket.connect(this, &rsshook::socket_cb); if(conf->getdebug()) httpcli.logger.connect(this, &rsshook::logger_cb); } void rsshook::exectimers() { int i, lastcheck, freq; icqcontact *c; time_t tcurrent = time(0); if(tcurrent-timer_check > PERIOD_CHECK) { for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); if(c->getdesc().pname == rss) { icqcontact::moreinfo mi = c->getmoreinfo(); freq = mi.checkfreq; lastcheck = mi.checklast; if(freq <= 0) { mi.checkfreq = 120; c->setmoreinfo(mi); } if(tcurrent-lastcheck > freq*60) { ping(c); } } } timer_check = tcurrent; } httpcli.clearoutMessagesPoll(); } bool rsshook::send(const imevent &ev) { if(ev.gettype() == imevent::xml && islivejournal(ev.getcontact())) return gethook(livejournal).send(ev); return false; } void rsshook::main() { vector::iterator i; struct timeval tv; int hsock; fd_set rs, ws, es; FD_ZERO(&rs); FD_ZERO(&ws); FD_ZERO(&es); tv.tv_sec = tv.tv_usec = 0; hsock = 0; for(i = rfds.begin(); i != rfds.end(); ++i) { FD_SET(*i, &rs); hsock = max(hsock, *i); } for(i = wfds.begin(); i != wfds.end(); ++i) { FD_SET(*i, &ws); hsock = max(hsock, *i); } for(i = efds.begin(); i != efds.end(); ++i) { FD_SET(*i, &es); hsock = max(hsock, *i); } if(select(hsock+1, &rs, &ws, &es, &tv) > 0) { for(i = rfds.begin(); i != rfds.end(); ++i) { if(FD_ISSET(*i, &rs)) { httpcli.socket_cb(*i, SocketEvent::READ); break; } } for(i = wfds.begin(); i != wfds.end(); ++i) { if(FD_ISSET(*i, &ws)) { httpcli.socket_cb(*i, SocketEvent::WRITE); break; } } for(i = efds.begin(); i != efds.end(); ++i) { if(FD_ISSET(*i, &es)) { httpcli.socket_cb(*i, SocketEvent::EXCEPTION); break; } } } } void rsshook::getsockets(fd_set &rs, fd_set &ws, fd_set &es, int &hsocket) const { vector::const_iterator i; for(i = rfds.begin(); i != rfds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &rs); } for(i = wfds.begin(); i != wfds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &ws); } for(i = efds.begin(); i != efds.end(); ++i) { hsocket = max(hsocket, *i); FD_SET(*i, &es); } } bool rsshook::isoursocket(fd_set &rs, fd_set &ws, fd_set &es) const { vector::const_iterator i; for(i = rfds.begin(); i != rfds.end(); ++i) if(FD_ISSET(*i, &rs)) return true; for(i = wfds.begin(); i != wfds.end(); ++i) if(FD_ISSET(*i, &ws)) return true; for(i = efds.begin(); i != efds.end(); ++i) if(FD_ISSET(*i, &es)) return true; return false; } bool rsshook::online() const { return true; } bool rsshook::logged() const { return false; } bool rsshook::isconnecting() const { return false; } bool rsshook::enabled() const { return true; } void rsshook::requestinfo(const imcontact &c) { ping(c); } void rsshook::requestversion(const imcontact &c) { } void rsshook::ping(const imcontact &ic) { string url; icqcontact *c = clist.get(ic); if(c) url = c->getworkinfo().homepage; else url = ic.nickname; if(!url.empty()) { httpcli.setProxyServerHost(conf->gethttpproxyhost()); httpcli.setProxyServerPort(conf->gethttpproxyport()); if(!conf->gethttpproxyuser().empty()) { httpcli.setProxyServerUser(conf->gethttpproxyuser()); httpcli.setProxyServerPasswd(conf->gethttpproxypasswd()); } HTTPRequestEvent *ev = new HTTPRequestEvent(url); if(islivejournal(ic)) { icqconf::imaccount acc = conf->getourid(livejournal); ev->setAuth(HTTPRequestEvent::Digest, acc.nickname, acc.password); } httpcli.SendEvent(ev); } } void rsshook::sendnewuser(const imcontact &ic) { gethook(livejournal).sendnewuser(ic); } void rsshook::removeuser(const imcontact &ic) { gethook(livejournal).removeuser(ic); } // ---------------------------------------------------------------------------- void rsshook::socket_cb(SocketEvent *ev) { vector::iterator i; if(dynamic_cast(ev)) { AddSocketHandleEvent *cev = dynamic_cast(ev); if(cev->isRead()) rfds.push_back(cev->getSocketHandle()); if(cev->isWrite()) wfds.push_back(cev->getSocketHandle()); if(cev->isException()) efds.push_back(cev->getSocketHandle()); } else if(dynamic_cast(ev)) { RemoveSocketHandleEvent *cev = dynamic_cast(ev); i = find(rfds.begin(), rfds.end(), cev->getSocketHandle()); if(i != rfds.end()) rfds.erase(i); i = find(wfds.begin(), wfds.end(), cev->getSocketHandle()); if(i != wfds.end()) wfds.erase(i); i = find(efds.begin(), efds.end(), cev->getSocketHandle()); if(i != efds.end()) efds.erase(i); } } void rsshook::fetchRSSParam(string &base, XmlBranch *i, const string &enc, const string &name, const string &attr, const string &title, const string &postfix) { XmlLeaf *d = i->getLeaf(name); string val; int pos, n; if(d) { val = attr.empty() ? d->getValue() : d->getAttrib(attr); if (val.empty()) return; val = rushtmlconv("wk", cuthtml(val, chCutBR | chLeaveLinks), false); if(!enc.empty()) val = siconv(val, enc, conf->getconvertto(rss)); pos = 0; while((pos = val.find("")) != -1) { val.replace(pos, n+1, "\n"); } pos++; } pos = 0; while((pos = val.find("

", pos)) != -1 || (pos = val.find("

", pos)) != -1) { val.replace(pos, 3, "\n\n"); pos++; } base += title + val + postfix; } } void rsshook::parsedocument(const HTTPRequestEvent *rev, icqcontact *c) { int k; icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); icqcontact::workinfo wi = c->getworkinfo(); string content = rev->getContent(), enc; bi.city = bi.state = bi.lname = ""; if(!rev->isDelivered() || content.empty()) { bi.lname = rev->getHTTPResp(); if(bi.lname.empty()) bi.lname = _("couldn't fetch"); content = ""; } if(bi.lname.empty()) if((k = content.find("")) != -1) { xmlspec.erase(k); xmlspec.insert(0, " x(XmlNode::parse(ix, xmlspec.end())); XmlLeaf *xx = dynamic_cast(x.get()); enc = xx->getAttrib("encoding"); bi.state = enc; } } XmlBranch *rss, *channel, *item; rss = channel = item = 0; string::iterator is = content.begin(); auto_ptr top(XmlNode::parse(is, content.end())); bool atom = false; if(bi.lname.empty()) { if(!top.get()) { if(!content.empty()) bi.lname = _("wrong XML"); } else { atom = up(top->getTag().substr(0, 4)) == "FEED"; if(up(top->getTag().substr(0, 3)) != "RSS" && up(top->getTag().substr(0, 3)) != "RDF" && !atom) { if(!content.empty()) bi.lname = _("no or tag found"); } } } if(bi.lname.empty() && top.get()) { rss = dynamic_cast(top.get()); if(rss == NULL || !rss->exists(atom ? "entry" : "channel")) { if(!content.empty()) bi.lname = _("no or tag found"); } else { bi.city = atom ? "Atom" : top.get()->getAttrib("version"); channel = atom ? rss : rss->getBranch("channel"); if(!channel) { if(!content.empty()) bi.lname = _("wrong or tag"); } } } vector items; vector::iterator ii; string text; if(bi.lname.empty()) if(channel) { bi.lname = _("success"); text = ""; rhook.fetchRSSParam(text, channel, enc, "title", "", ""); if(!text.empty()) bi.fname = text; text = ""; rhook.fetchRSSParam(text, channel, enc, "link", atom ? "href" : "", ""); while((k = text.find_first_of(" \t\r\n")) != -1) text.erase(k, 1); if(!text.empty()) mi.homepage = text; text = ""; rhook.fetchRSSParam(text, channel, enc, atom ? "subtitle" : "description", "", ""); if(!text.empty()) c->setabout(text); if(!channel->getBranch(atom ? "entry" : "item")) { channel = rss; if(bi.city.empty()) bi.city = "rdf"; } for(k = 0; item = channel->getBranch(atom ? "entry" : "item", k); k++) { text = ""; rhook.fetchRSSParam(text, item, enc, "title", "", _("Title: ")); rhook.fetchRSSParam(text, item, enc, atom ? "updated" : "pubDate", "", _("Published on: ")); rhook.fetchRSSParam(text, item, enc, "category", "", _("Category: ")); rhook.fetchRSSParam(text, item, enc, "author", "", _("Author: ")); text += "\n"; rhook.fetchRSSParam(text, item, enc, atom ? "summary" : "description", "", _("Description: "), "\n\n"); if (atom) rhook.fetchRSSParam(text, item, enc, "content", "", "", "\n\n"); rhook.fetchRSSParam(text, item, enc, "link", atom ? "href" : "", _("Link: ")); rhook.fetchRSSParam(text, item, enc, "comments", "", _("Comments: ")); items.push_back(text); } imevent *ev; vector events = em.getevents(c->getdesc(), 0); if(!events.empty()) { vector::reverse_iterator ei; /* with frequent updates (and not many elements in the feed), the factor 3 might not suffice * Anyway, for most cases, it should be enough. */ int is = min(3*items.size(), events.size()); for(ii = items.begin(); ii != items.end(); ++ii) { int cnt; while((k = ii->find("\r")) != -1) ii->erase(k, 1); for (ei=events.rbegin(), cnt=is; cnt != 0 && ei < events.rend(); --cnt, ++ei ) { if (ev = dynamic_cast(*ei)) { string evtext = ev->gettext(); while((k = evtext.find("\r")) != -1) evtext.erase(k, 1); if(*ii == evtext) { --ii; items.erase(ii+1, ii+2); break; } } } } } while(!events.empty()) { delete events.back(); events.pop_back(); } } if(c->inlist() && c->getdesc() != contactroot) { if(!items.empty()) { vector::reverse_iterator ir; for(ir = items.rbegin(); ir != items.rend(); ++ir) em.store(immessage(c->getdesc(), imevent::incoming, *ir)); } } else { string bfeed = rev->getURL(); getrword(bfeed, "/"); c->setnick(getrword(bfeed, "/")); wi.homepage = rev->getURL(); } mi.checklast = timer_current; c->setbasicinfo(bi); c->setmoreinfo(mi); c->setworkinfo(wi); } void rsshook::messageack_cb(MessageEvent *ev) { HTTPRequestEvent *rev = dynamic_cast(ev); if(!rev) return; int i; icqcontact *c; bool found; for(i = 0, found = false; i < clist.count && !found; i++) { c = (icqcontact *) clist.at(i); found = c->getdesc().pname == rss && c->getworkinfo().homepage == rev->getURL(); } if(!found) c = clist.get(contactroot); parsedocument(rev, c); } void rsshook::logger_cb(LogEvent *ev) { switch(ev->getType()) { case LogEvent::PACKET: case LogEvent::DIRECTPACKET: if(conf->getdebug()) face.log(ev->getMessage()); break; default: face.log(ev->getMessage()); break; } } #endif /* * Local variables: * eval: (c-set-style "cc-mode") * eval: (setq-default indent-tabs-mode t) * End: */ centerim-4.22.10/src/hooks/abstracthook.cc0000644000175000001440000005353111461606612015322 00000000000000/* * * centerim IM protocol abstraction class * $Id: abstracthook.cc,v 1.58 2004/11/09 23:49:59 konst Exp $ * * Copyright (C) 2001,2002,2003 by Konstantin Klyagin * * 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 "abstracthook.h" #include "icqhook.h" #include "yahoohook.h" #include "aimhook.h" #include "irchook.h" #include "jabberhook.h" #include "rsshook.h" #include "ljhook.h" #include "gaduhook.h" #include "msnhook.h" #include "icqcontacts.h" #include "icqface.h" #include "md5.h" #include #define NOTIFBUF 512 time_t timer_current = time(0); abstracthook::abstracthook(protocolname aproto) : proto(aproto), searchdest(0) { } abstracthook::~abstracthook() { } void abstracthook::init() { } void abstracthook::connect() { } void abstracthook::disconnect() { } void abstracthook::exectimers() { } void abstracthook::main() { } void abstracthook::setautostatus(imstatus st) { } void abstracthook::restorestatus() { setautostatus(manualstatus); } void abstracthook::setstatus(imstatus st) { setautostatus(manualstatus = st); for(protocolname pname = icq; pname != protocolname_size; pname++) { if(&gethook(pname) == this) { conf->savestatus(pname, manualstatus); break; } } } void abstracthook::getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const { } bool abstracthook::isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const { return false; } bool abstracthook::online() const { return false; } bool abstracthook::logged() const { return false; } bool abstracthook::isconnecting() const { return false; } bool abstracthook::enabled() const { return false; } bool abstracthook::send(const imevent &ev) { return false; } void abstracthook::sendnewuser(const imcontact &c) { } imstatus abstracthook::getstatus() const { return offline; } bool abstracthook::isdirectopen(const imcontact &c) const { return false; } void abstracthook::removeuser(const imcontact &ic) { } void abstracthook::requestinfo(const imcontact &c) { } void abstracthook::lookup(const imsearchparams ¶ms, verticalmenu &dest) { } void abstracthook::stoplookup() { searchdest = 0; } void abstracthook::requestawaymsg(const imcontact &c) { } void abstracthook::ouridchanged(const icqconf::imaccount &ia) { } void abstracthook::requestversion(const imcontact &c) { } void abstracthook::ping(const imcontact &c) { } bool abstracthook::knowntransfer(const imfile &fr) const { return false; } void abstracthook::replytransfer(const imfile &fr, bool accept, const string &localpath) { } void abstracthook::aborttransfer(const imfile &fr) { } void abstracthook::conferencecreate(const imcontact &confid, const vector &lst) { } vector abstracthook::getservices(servicetype::enumeration st) const { return vector(); } vector > abstracthook::getsearchparameters(const string &agentname) const { return vector >(); } vector > abstracthook::getregparameters(const string &agentname) const { return vector >(); } void abstracthook::updatecontact(icqcontact *c) { } void abstracthook::renamegroup(const string &oldname, const string &newname) { } string abstracthook::rushtmlconv(const string &tdir, const string &text, bool rus) { int pos; string r = rus ? rusconv(tdir, text) : text; if(tdir == "kw" || tdir == "ku") { pos = 0; while((pos = r.find_first_of("&<>", pos)) != -1) { switch(r[pos]) { case '&': if(r.substr(pos, 4) != "<" && r.substr(pos, 4) != ">") r.replace(pos, 1, "&"); break; case '<': r.replace(pos, 1, "<"); break; case '>': r.replace(pos, 1, ">"); break; } pos++; } } else if(tdir == "wk" || tdir == "uk") { pos = 0; while((pos = r.find("&", pos)) != -1) { if(r.substr(pos+1, 4) == "amp;") r.replace(pos, 5, "&"); else if(r.substr(pos+1, 3) == "lt;") r.replace(pos, 4, "<"); else if(r.substr(pos+1, 3) == "gt;") r.replace(pos, 4, ">"); else if(r.substr(pos+1, 5) == "#150;") r.replace(pos, 6, "-"); else if(r.substr(pos+1, 5) == "#151;") r.replace(pos, 6, "--"); else if(r.substr(pos+1, 5) == "#146;") r.replace(pos, 6, "`"); else if(r.substr(pos+1, 4) == "#39;") r.replace(pos, 5, "'"); else if(r.substr(pos+1, 6) == "#8211;") r.replace(pos, 7, "--"); else if(r.substr(pos+1, 6) == "#8230;") r.replace(pos, 7, "..."); else if(r.substr(pos+1, 7) == "hellip;") r.replace(pos, 8, "..."); else if(r.substr(pos+1, 6) == "laquo;") r.replace(pos, 7, "<<"); else if(r.substr(pos+1, 6) == "raquo;") r.replace(pos, 7, ">>"); else if(r.substr(pos+1, 6) == "bdquo;") r.replace(pos, 7, "\""); else if(r.substr(pos+1, 6) == "ldquo;") r.replace(pos, 7, "\""); else if(r.substr(pos+1, 5) == "copy;") r.replace(pos, 8, "(c)"); else if(r.substr(pos+1, 4) == "#13;") r.replace(pos, 5, "\r"); else if(r.substr(pos+1, 4) == "#10;") r.replace(pos, 5, "\n"); pos++; } } return r; } string abstracthook::ruscrlfconv(const string &tdir, const string &text) { string r = rusconv(tdir, text); int pos; for(pos = 0; (pos = r.find("\r")) != -1; pos++) { r.erase(pos, 1); } return r; } string abstracthook::rusconv(const string &tdir, const string &text) { string r; if(!conf->getcpconvert(proto) && tdir.find("u") == -1) return text; #ifdef HAVE_ICONV if(tdir == "kw") r = siconv(text, conf->getconvertto(proto), conf->getconvertfrom(proto)); else if(tdir == "wk") r = siconv(text, conf->getconvertfrom(proto), conf->getconvertto(proto)); else if(tdir == "ku") r = siconv(text, conf->getconvertto(proto), "utf-8"); else if(tdir == "uk") r = siconv(text, "utf-8", conf->getconvertto(proto)); else if(tdir == "ck") r = siconv(text, "UCS-2BE", conf->getconvertto(proto)); else #endif r = text; #ifndef HAVE_ICONV static unsigned char kw[] = { 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, 160,161,162,184,164,165,166,167,168,169,170,171,172,173,174,175, 176,177,178,168,180,181,182,183,184,185,186,187,188,189,190,191, 254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238, 239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250, 222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206, 207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218 }; static unsigned char wk[] = { 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167,179,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183,163,185,186,187,188,189,190,191, 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240, 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241, 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208, 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209 }; unsigned char c; string::const_iterator i; unsigned char *table = 0; if(tdir == "kw") table = kw; else if(tdir == "wk") table = wk; if(table) { r = ""; for(i = text.begin(); i != text.end(); ++i) { c = (unsigned char) *i; c &= 0377; if(c & 0200) c = table[c & 0177]; r += c; } } #endif return r; } string abstracthook::getmd5(const string &text) { md5_state_t state; md5_byte_t digest[16]; string r; char buf[3]; md5_init(&state); md5_append(&state, (md5_byte_t *) text.c_str(), text.size()); md5_finish(&state, digest); for(int i = 0; i < 16; i++) { sprintf(buf, "%02x", digest[i]); r += buf; } return r; } void abstracthook::requestfromfound(const imcontact &ic) { vector::const_iterator ig = foundguys.begin(); while(ig != foundguys.end()) { if((*ig)->getdesc() == ic) { icqcontact *rc = clist.get(ic); if(!rc) rc = clist.get(contactroot); rc->setnick((*ig)->getnick()); rc->setbasicinfo((*ig)->getbasicinfo()); rc->setmoreinfo((*ig)->getmoreinfo()); rc->setworkinfo((*ig)->getworkinfo()); rc->setinterests((*ig)->getinterests()); rc->setbackground((*ig)->getbackground()); rc->setabout((*ig)->getabout()); break; } ++ig; } } bool abstracthook::regconnect(const string &aserv) { return false; } bool abstracthook::regattempt(unsigned int &auin, const string &apassword, const string &email) { return false; } void abstracthook::log(logevent ev, ...) { va_list ap; char buf[NOTIFBUF]; static map lst; if(lst.empty()) { lst[logConnecting] = _("connecting to the server"); lst[logLogged] = _("logged in"); lst[logSearchFinished] = _("search finished, %d found"); lst[logPasswordChanged] = _("password was changed successfully"); lst[logDisconnected] = _("disconnected"); lst[logContactAdd] = _("adding %s to the contacts"); lst[logContactRemove] = _("removing %s from the contacts"); lst[logConfMembers] = _("members list fetching finished, %d found"); } va_start(ap, ev); vsnprintf(buf, NOTIFBUF, lst[ev].c_str(), ap); va_end(ap); face.log((string) "+ [" + conf->getprotocolname(proto) + "] " + buf); face.xtermtitle((string) "[" + conf->getprotocolname(proto) + "] " + buf); } const unsigned short abstracthook::Country_table_size = 243; const abstracthook::Country_struct abstracthook::Country_table[Country_table_size] = { { "Unspecified", 0 }, { "Afghanistan", 93 }, { "Albania", 355 }, { "Algeria", 213 }, { "American Samoa", 684 }, { "Andorra", 376 }, { "Angola", 244 }, { "Anguilla", 101 }, { "Antigua", 102 }, { "Argentina", 54 }, { "Armenia", 374 }, { "Aruba", 297 }, { "Ascension Island", 247 }, { "Australia", 61 }, { "Australian Antarctic Territory", 6721 }, { "Austria", 43 }, { "Azerbaijan", 994 }, { "Bahamas", 103 }, { "Bahrain", 973 }, { "Bangladesh", 880 }, { "Barbados", 104 }, { "Barbuda", 120 }, { "Belarus", 375 }, { "Belgium", 32 }, { "Belize", 501 }, { "Benin", 229 }, { "Bermuda", 105 }, { "Bhutan", 975 }, { "Bolivia", 591 }, { "Bosnia and Herzegovina", 387 }, { "Botswana", 267 }, { "Brazil", 55 }, { "British Virgin Islands", 106 }, { "Brunei", 673 }, { "Bulgaria", 359 }, { "Burkina Faso", 226 }, { "Burundi", 257 }, { "Cambodia", 855 }, { "Cameroon", 237 }, { "Canada", 107 }, { "Cape Verde Islands", 238 }, { "Cayman Islands", 108 }, { "Central African Republic", 236 }, { "Chad", 235 }, { "Chile", 56 }, { "China", 86 }, { "Christmas Island", 672 }, { "Cocos-Keeling Islands", 6101 }, { "Colombia", 57 }, { "Comoros", 2691 }, { "Congo", 242 }, { "Cook Islands", 682 }, { "Costa Rica", 506 }, { "Croatia", 385 }, { "Cuba", 53 }, { "Cyprus", 357 }, { "Czech Republic", 42 }, { "Denmark", 45 }, { "Diego Garcia", 246 }, { "Djibouti", 253 }, { "Dominica", 109 }, { "Dominican Republic", 110 }, { "Ecuador", 593 }, { "Egypt", 20 }, { "El Salvador", 503 }, { "Equatorial Guinea", 240 }, { "Eritrea", 291 }, { "Estonia", 372 }, { "Ethiopia", 251 }, { "Faeroe Islands", 298 }, { "Falkland Islands", 500 }, { "Fiji Islands", 679 }, { "Finland", 358 }, { "France", 33 }, { "French Antilles", 5901 }, { "French Guiana", 594 }, { "French Polynesia", 689 }, { "Gabon", 241 }, { "Gambia", 220 }, { "Georgia", 995 }, { "Germany", 49 }, { "Ghana", 233 }, { "Gibraltar", 350 }, { "Greece", 30 }, { "Greenland", 299 }, { "Grenada", 111 }, { "Guadeloupe", 590 }, { "Guam", 671 }, { "Guantanamo Bay", 5399 }, { "Guatemala", 502 }, { "Guinea", 224 }, { "Guinea-Bissau", 245 }, { "Guyana", 592 }, { "Haiti", 509 }, { "Honduras", 504 }, { "Hong Kong", 852 }, { "Hungary", 36 }, { "INMARSAT (Atlantic-East)", 871 }, { "INMARSAT (Atlantic-West)", 874 }, { "INMARSAT (Indian)", 873 }, { "INMARSAT (Pacific)", 872 }, { "INMARSAT", 870 }, { "Iceland", 354 }, { "India", 91 }, { "Indonesia", 62 }, { "International Freephone Service", 800 }, { "Iran", 98 }, { "Iraq", 964 }, { "Ireland", 353 }, { "Israel", 972 }, { "Italy", 39 }, { "Ivory Coast", 225 }, { "Jamaica", 112 }, { "Japan", 81 }, { "Jordan", 962 }, { "Kazakhstan", 705 }, { "Kenya", 254 }, { "Kiribati Republic", 686 }, { "Korea (North)", 850 }, { "Korea (Republic of)", 82 }, { "Kuwait", 965 }, { "Kyrgyz Republic", 706 }, { "Laos", 856 }, { "Latvia", 371 }, { "Lebanon", 961 }, { "Lesotho", 266 }, { "Liberia", 231 }, { "Libya", 218 }, { "Liechtenstein", 4101 }, { "Lithuania", 370 }, { "Luxembourg", 352 }, { "Macau", 853 }, { "Madagascar", 261 }, { "Malawi", 265 }, { "Malaysia", 60 }, { "Maldives", 960 }, { "Mali", 223 }, { "Malta", 356 }, { "Marshall Islands", 692 }, { "Martinique", 596 }, { "Mauritania", 222 }, { "Mauritius", 230 }, { "Mayotte Island", 269 }, { "Mexico", 52 }, { "Micronesia, Federated States of", 691 }, { "Moldova", 373 }, { "Monaco", 377 }, { "Mongolia", 976 }, { "Montserrat", 113 }, { "Morocco", 212 }, { "Mozambique", 258 }, { "Myanmar", 95 }, { "Namibia", 264 }, { "Nauru", 674 }, { "Nepal", 977 }, { "Netherlands Antilles", 599 }, { "Netherlands", 31 }, { "Nevis", 114 }, { "New Caledonia", 687 }, { "New Zealand", 64 }, { "Nicaragua", 505 }, { "Niger", 227 }, { "Nigeria", 234 }, { "Niue", 683 }, { "Norfolk Island", 6722 }, { "Norway", 47 }, { "Oman", 968 }, { "Pakistan", 92 }, { "Palau", 680 }, { "Panama", 507 }, { "Papua New Guinea", 675 }, { "Paraguay", 595 }, { "Peru", 51 }, { "Philippines", 63 }, { "Poland", 48 }, { "Portugal", 351 }, { "Puerto Rico", 121 }, { "Qatar", 974 }, { "Republic of Macedonia", 389 }, { "Reunion Island", 262 }, { "Romania", 40 }, { "Rota Island", 6701 }, { "Russia", 7 }, { "Rwanda", 250 }, { "Saint Lucia", 122 }, { "Saipan Island", 670 }, { "San Marino", 378 }, { "Sao Tome and Principe", 239 }, { "Saudi Arabia", 966 }, { "Senegal Republic", 221 }, { "Seychelle Islands", 248 }, { "Sierra Leone", 232 }, { "Singapore", 65 }, { "Slovak Republic", 4201 }, { "Slovenia", 386 }, { "Solomon Islands", 677 }, { "Somalia", 252 }, { "South Africa", 27 }, { "Spain", 34 }, { "Sri Lanka", 94 }, { "St. Helena", 290 }, { "St. Kitts", 115 }, { "St. Pierre and Miquelon", 508 }, { "St. Vincent and the Grenadines", 116 }, { "Sudan", 249 }, { "Suriname", 597 }, { "Swaziland", 268 }, { "Sweden", 46 }, { "Switzerland", 41 }, { "Syria", 963 }, { "Taiwan, Republic of China", 886 }, { "Tajikistan", 708 }, { "Tanzania", 255 }, { "Thailand", 66 }, { "Tinian Island", 6702 }, { "Togo", 228 }, { "Tokelau", 690 }, { "Tonga", 676 }, { "Trinidad and Tobago", 117 }, { "Tunisia", 216 }, { "Turkey", 90 }, { "Turkmenistan", 709 }, { "Turks and Caicos Islands", 118 }, { "Tuvalu", 688 }, { "USA", 1 }, { "Uganda", 256 }, { "Ukraine", 380 }, { "United Arab Emirates", 971 }, { "United Kingdom", 44 }, { "United States Virgin Islands", 123 }, { "Uruguay", 598 }, { "Uzbekistan", 711 }, { "Vanuatu", 678 }, { "Vatican City", 379 }, { "Venezuela", 58 }, { "Vietnam", 84 }, { "Wallis and Futuna Islands", 681 }, { "Western Samoa", 685 }, { "Yemen", 967 }, { "Yugoslavia", 381 }, { "Zaire", 243 }, { "Zambia", 260 }, { "Zimbabwe", 263 } }; string abstracthook::getCountryIDtoString(unsigned short id) { for(int n = 0; n < Country_table_size; ++n) { if(Country_table[n].code == id) { return Country_table[n].name; } } return Country_table[0].name; } unsigned short abstracthook::getCountryByName(string name) { int i; name = up(leadcut(trailcut(name))); for(i = 0; i < Country_table_size; i++) if(name == up(Country_table[i].name)) return Country_table[i].code; return 0; } signed char abstracthook::getSystemTimezone() { time_t t = time(0); struct tm *tzone = localtime(&t); int nTimezone = 0; #ifdef HAVE_TM_ZONE nTimezone = -(tzone->tm_gmtoff); #else #ifdef __CYGWIN__ nTimezone = _timezone; #else nTimezone = timezone; #endif #endif nTimezone += (tzone->tm_isdst == 1 ? 3600 : 0); nTimezone /= 1800; if(nTimezone > 23) return 23-nTimezone; return (signed char) nTimezone; } static const unsigned char Interests_table_size = 51; static const unsigned char Interests_offset = 100; static const char* const Interests_table[Interests_table_size] = { "Art", "Cars", "Celebrity Fans", "Collections", "Computers", "Culture", "Fitness", "Games", "Hobbies", "ICQ - Help", "Internet", "Lifestyle", "Movies and TV", "Music", "Outdoors", "Parenting", "Pets and Animals", "Religion", "Science", "Skills", "Sports", "Web Design", "Ecology", "News and Media", "Government", "Business", "Mystics", "Travel", "Astronomy", "Space", "Clothing", "Parties", "Women", "Social science", "60's", "70's", "80's", "50's", "Finance and Corporate", "Entertainment", "Consumer Electronics", "Retail Stores", "Health and Beauty", "Media", "Household Products", "Mail Order Catalog", "Business Services", "Audio and Visual", "Sporting and Athletics", "Publishing", "Home Automation" }; string abstracthook::getInterestsIDtoString(unsigned char id) { if(id-Interests_offset >= 0 && id-Interests_offset < Interests_table_size) { return Interests_table[id-Interests_offset]; } return ""; } static const unsigned short Background_table_size = 8; static const struct { char *name; unsigned short code; } Background_table[Background_table_size] = { { "University", 303 }, { "High school", 301 }, { "College", 302 }, { "Elementary School", 300 }, { "Millitary", 304 }, { "Other", 399 }, { "Past Organization", 306 }, { "Past Work Place", 305 } }; string abstracthook::getBackgroundIDtoString(unsigned short id) { for(int n = 0; n < Background_table_size; ++n) { if(id == Background_table[n].code) { return Background_table[n].name; } } return ""; } string abstracthook::getTimezoneIDtoString(signed char id) { if(id > 24 || id < -24) { return "Unspecified"; } else { char buf[32]; snprintf(buf, sizeof(buf), "GMT %s%d:%s", id > 0 ? "-" : "+", abs(id/2), id % 2 == 0 ? "00" : "30"); return buf; } } string abstracthook::getTimezonetoLocaltime(signed char id) { string r; if(id <= 24 && id >= -24) { time_t rt = time(0) + getSystemTimezone()*1800; rt -= id*1800; r = ctime(&rt); } return r; } const unsigned char abstracthook::Language_table_size = 60; const char* const abstracthook::Language_table[Language_table_size] = { "Unspecified", "Arabic", "Bhojpuri", "Bulgarian", "Burmese", "Cantonese", "Catalan", "Chinese", "Croatian", "Czech", "Danish", "Dutch", "English", "Esperanto", "Estonian", "Farsi", "Finnish", "French", "Gaelic", "German", "Greek", "Hebrew", "Hindi", "Hungarian", "Icelandic", "Indonesian", "Italian", "Japanese", "Khmer", "Korean", "Lao", "Latvian", "Lithuanian", "Malay", "Norwegian", "Polish", "Portuguese", "Romanian", "Russian", "Serbian", "Slovak", "Slovenian", "Somali", "Spanish", "Swahili", "Swedish", "Tagalog", "Tatar", "Thai", "Turkish", "Ukrainian", "Urdu", "Vietnamese", "Yiddish", "Yoruba", "Taiwanese", "Afrikaans", "Persian", "Albanian", "Armenian", }; string abstracthook::getLanguageIDtoString(unsigned char id) { if (id >= Language_table_size) { return Language_table[0]; } else { return Language_table[id]; } } // ---------------------------------------------------------------------------- abstracthook &gethook(protocolname pname) { static abstracthook abshook(infocard); switch(pname) { #ifdef BUILD_ICQ case icq: return ihook; #endif #ifdef BUILD_YAHOO case yahoo: return yhook; #endif #ifdef BUILD_AIM case aim: return ahook; #endif #ifdef BUILD_IRC case irc: return irhook; #endif #ifdef BUILD_JABBER case jabber: return jhook; #endif #ifdef BUILD_RSS case rss: return rhook; #endif #ifdef BUILD_LJ case livejournal: return lhook; #endif #ifdef BUILD_GADU case gadu: return ghook; #endif #ifdef BUILD_MSN case msn: return mhook; #endif } return abshook; } struct tm *maketm(int hour, int minute, int day, int month, int year) { static struct tm msgtm; memset(&msgtm, 0, sizeof(msgtm)); msgtm.tm_min = minute; msgtm.tm_hour = hour; msgtm.tm_mday = day; msgtm.tm_mon = month-1; msgtm.tm_year = year-1900; return &msgtm; } centerim-4.22.10/src/hooks/icqhook.h0000644000175000001440000000543011461606612014130 00000000000000#ifndef __ICQHOOK_H__ #define __ICQHOOK_H__ #include "abstracthook.h" #ifdef BUILD_ICQ #include "icqmlist.h" #include "libicq2000/Client.h" #include "libicq2000/events.h" using namespace ICQ2000; class icqhook: public abstracthook, public sigslot::has_slots<> { protected: Client cli; vector rfds, wfds, efds; enum { Normal } blockmode; time_t timer_poll, timer_resolve; bool fonline, flogged, sblrecv; unsigned int reguin; SearchResultEvent *searchevent; typedef pair visInfo; vector vislist; vector uinstosend; void connected_cb(ConnectedEvent *ev); void disconnected_cb(DisconnectedEvent *ev); void messaged_cb(MessageEvent *ev); void messageack_cb(MessageEvent *ev); void contactlist_cb(ContactListEvent *ev); void contact_userinfo_change_signal_cb(UserInfoChangeEvent *ev); void contact_status_change_signal_cb(StatusChangeEvent *ev); void contact_typing_signal_cb(UserTypingNotificationEvent *ev); void newuin_cb(NewUINEvent *ev); void rate_cb(RateInfoChangeEvent *ev); void logger_cb(LogEvent *ev); void socket_cb(SocketEvent *ev); void want_auto_resp_cb(ICQMessageEvent *ev); void search_result_cb(SearchResultEvent *ev); // void server_based_contact_list_cb(ServerBasedContactEvent *ev); void sbl_received_cb(SBLReceivedEvent *ev); void self_contact_userinfo_change_cb(UserInfoChangeEvent *ev); void self_contact_status_change_cb(StatusChangeEvent *ev); // void password_changed_cb(PasswordChangeEvent *ev); imstatus icq2imstatus(const Status st) const; void resolve(); void sendinvisible(); void updateinforecord(ContactRef ic, icqcontact *c); void processemailevent(const string &sender, const string &email, const string &message); ContactRef addContact(unsigned int uin, const string &groupname); public: icqhook(); ~icqhook(); void init(); void connect(); void disconnect(); void exectimers(); void main(); void getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const; bool isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const; bool online() const; bool logged() const; bool isconnecting() const; bool enabled() const; bool send(const imevent &ev); void sendnewuser(const imcontact &c); void removeuser(const imcontact &c); void setautostatus(imstatus st); imstatus getstatus() const; void requestinfo(const imcontact &c); void requestawaymsg(const imcontact &c); bool regconnect(const string &aserv); bool regattempt(unsigned int &auin, const string &apassword, const string &email); void lookup(const imsearchparams ¶ms, verticalmenu &dest); void sendupdateuserinfo(const icqcontact &c); void updatecontact(icqcontact *c); void renamegroup(const string &oldname, const string &newname); }; extern icqhook ihook; #endif #endif centerim-4.22.10/src/hooks/aimhook.h0000644000175000001440000000334011461606612014120 00000000000000#ifndef __AIMHOOK_H__ #define __AIMHOOK_H__ #include "abstracthook.h" #ifdef BUILD_AIM extern "C" { #include "firetalk.h" } class aimhook: public abstracthook { protected: struct ourprofile { string info; }; bool fonline, flogged; firetalk_t handle; imstatus ourstatus; ourprofile profile; vector buddies; void userstatus(const string &nickname, imstatus st); void saveprofile(); void loadprofile(); void resolve(); void removeuser(const imcontact &ic, bool report); static void connected(void *conn, void *cli, ...); static void disconnected(void *conn, void *cli, ...); static void newpass(void *conn, void *cli, ...); static void gotinfo(void *conn, void *cli, ...); static void getmessage(void *conn, void *cli, ...); static void buddyonline(void *conn, void *cli, ...); static void buddyoffline(void *conn, void *cli, ...); static void buddyaway(void *conn, void *cli, ...); static void needpass(void *conn, void *cli, ...); static void connectfailed(void *connection, void *cli, ...); static void listbuddy(void *conn, void *cli, ...); public: aimhook(); ~aimhook(); void init(); void connect(); void disconnect(); void exectimers(); void main(); void getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const; bool isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const; bool online() const; bool logged() const; bool enabled() const; bool isconnecting() const; bool send(const imevent &ev); void sendnewuser(const imcontact &c); void removeuser(const imcontact &ic); void setautostatus(imstatus st); imstatus getstatus() const; void requestinfo(const imcontact &c); void sendupdateuserinfo(icqcontact &c); }; extern aimhook ahook; #endif #endif centerim-4.22.10/src/hooks/gaduhook.h0000644000175000001440000000267311461606612014302 00000000000000#ifndef __GADUHOOK_H__ #define __GADUHOOK_H__ #include "abstracthook.h" #ifdef BUILD_GADU struct gg_session; class gaduhook: public abstracthook { protected: time_t timer_ping; struct gg_session *sess; bool flogged; map awaymsgs; void searchdone(void *p); void userstatuschange(unsigned int uin, int status, const char *desc); void userlistsend(); void usernotify(unsigned int uin, int status, const char *desc, unsigned int ip, int port, int version); string handletoken(struct gg_http *h); void cutoff(); public: gaduhook(); ~gaduhook(); void init(); void connect(); void disconnect(); void exectimers(); void main(); void getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const; bool isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const; bool online() const; bool logged() const; bool isconnecting() const; bool enabled() const; bool send(const imevent &ev); void sendnewuser(const imcontact &c); void removeuser(const imcontact &c); void setautostatus(imstatus st); imstatus getstatus() const; void requestinfo(const imcontact &c); void requestawaymsg(const imcontact &ic); bool regconnect(const string &aserv); bool regattempt(unsigned int &auin, const string &apassword, const string &email); void lookup(const imsearchparams ¶ms, verticalmenu &dest); void sendupdateuserinfo(const icqcontact &c); }; extern gaduhook ghook; #endif #endif centerim-4.22.10/src/hooks/irchook.h0000644000175000001440000001103511461606612014127 00000000000000#ifndef __IRCHOOK_H__ #define __IRCHOOK_H__ #include "abstracthook.h" #ifdef BUILD_IRC extern "C" { #include "firetalk.h" } class irchook: public abstracthook { protected: struct channelInfo { string name; string passwd; bool joined, fetched; vector nicks; channelInfo(const string &aname): name(aname), joined(false), fetched(false), passwd("") {} bool operator != (const string &aname) const; bool operator == (const string &aname) const; }; enum searchMode { Channel, Email }; searchMode smode; bool fonline, flogged, searchsincelast, sentpass; firetalk_t handle; imstatus ourstatus; string ircname, emailsub, namesub; vector channels; vector searchchannels, extlisted; map awaymessages; map pingtime; map > transferinfo; void userstatus(const string &nickname, imstatus st); void processnicks(); bool getfevent(void *fhandle, imfile &fr); static void connected(void *conn, void *cli, ...); static void disconnected(void *conn, void *cli, ...); static void newnick(void *conn, void *cli, ...); static void gotinfo(void *conn, void *cli, ...); static void gotchannels(void *conn, void *cli, ...); static void getmessage(void *conn, void *cli, ...); static void getaction(void *conn, void *cli, ...); static void buddyonline(void *conn, void *cli, ...); static void buddyoffline(void *conn, void *cli, ...); static void buddyaway(void *conn, void *cli, ...); static void connectfailed(void *connection, void *cli, ...); static void listmember(void *connection, void *cli, ...); static void fclog(void *connection, void *cli, ...); static void chatnames(void *connection, void *cli, ...); static void listextended(void *connection, void *cli, ...); static void endextended(void *connection, void *cli, ...); static void chatmessage(void *connection, void *cli, ...); static void chataction(void *connection, void *cli, ...); static void chatjoined(void *connection, void *cli, ...); static void chatleft(void *connection, void *cli, ...); static void chatkicked(void *connection, void *cli, ...); static void errorhandler(void *connection, void *cli, ...); static void nickchanged(void *connection, void *cli, ...); static void needpass(void *conn, void *cli, ...); static void fileoffer(void *conn, void *cli, ...); static void filestart(void *conn, void *cli, ...); static void fileprogress(void *conn, void *cli, ...); static void filefinish(void *conn, void *cli, ...); static void fileerror(void *conn, void *cli, ...); static void chatuserjoined(void *conn, void *cli, ...); static void chatuserleft(void *conn, void *cli, ...); static void chatuserkicked(void *conn, void *cli, ...); static void chatgottopic(void *conn, void *cli, ...); static void chatuseropped(void *conn, void *cli, ...); static void chatuserdeopped(void *conn, void *cli, ...); static void chatopped(void *conn, void *cli, ...); static void chatdeopped(void *conn, void *cli, ...); static void subrequest(void *conn, void *cli, const char * const nick, const char * const command, const char * const args); static void subreply(void *conn, void *cli, const char * const nick, const char * const command, const char * const args); void rawcommand(const string &cmd); void channelfatal(string room, const char *fmt, ...); vector getautochannels() const; void setautochannels(vector &achannels); public: irchook(); ~irchook(); void init(); void connect(); void disconnect(); void exectimers(); void main(); void getsockets(fd_set &rfds, fd_set &wfds, fd_set &efds, int &hsocket) const; bool isoursocket(fd_set &rfds, fd_set &wfds, fd_set &efds) const; bool online() const; bool logged() const; bool enabled() const; bool isconnecting() const; bool send(const imevent &ev); void sendnewuser(const imcontact &c); void removeuser(const imcontact &ic); void setautostatus(imstatus st); imstatus getstatus() const; void requestversion(const imcontact &c); void ping(const imcontact &c); void requestinfo(const imcontact &c); void requestawaymsg(const imcontact &c); void sendupdateuserinfo(icqcontact &c, const string &newpass); void lookup(const imsearchparams ¶ms, verticalmenu &dest); void ouridchanged(const icqconf::imaccount &ia); bool knowntransfer(const imfile &fr) const; void replytransfer(const imfile &fr, bool accept, const string &localpath = string()); void aborttransfer(const imfile &fr); }; extern irchook irhook; #endif #endif centerim-4.22.10/src/imexternal.cc0000644000175000001440000002643711473007750013671 00000000000000/* * * centerim external actions handling class * $Id: imexternal.cc,v 1.29 2005/01/18 23:20:17 konst Exp $ * * Copyright (C) 2002 by Konstantin Klyagin * * 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 "imexternal.h" #include "icqconf.h" #include "icqcommon.h" #include "abstracthook.h" #include "eventmanager.h" #include "imlogger.h" #include "icqcontacts.h" #include imexternal external; imexternal::imexternal() { } imexternal::~imexternal() { } void imexternal::load() { ifstream f(conf->getconfigfname("external").c_str()); action a; actions.clear(); if(f.is_open()) { while(!f.eof()) { a = action(); if(a.load(f)) { actions.push_back(a); } } f.close(); } } int imexternal::exec(const imevent &ev) { bool r; auto_ptr p(ev.getevent()); int n = exec(p.get(), r); return n; } int imexternal::exec(imevent *ev, bool &eaccept, int option) { vector::iterator i; int r = 0, rl; imcontact c; eaccept = true; for(i = actions.begin(); i != actions.end(); ++i) { if(i->exec(ev, rl, option)) { eaccept = eaccept && !rl; r++; } } return r; } bool imexternal::execmanual(const imcontact &ic, int id, string &outbuf) { bool r; if(r = (id < actions.size() && id >= 0)) { vector::iterator ia = actions.begin()+id; r = ia->exec(ic, outbuf); } return r; } vector > imexternal::getlist(int options, protocolname pname) const { vector > r; vector::const_iterator i; for(i = actions.begin(); i != actions.end(); ++i) { if(i->matches(options, pname)) r.push_back(make_pair(i-actions.begin(), i->getname())); } return r; } // ---------------------------------------------------------------------------- imexternal::action::action(): options(0), enabled(true) { } imexternal::action::~action() { } bool imexternal::action::exec(const imcontact &ic, string &outbuf) { bool r; char buf[512]; abstracthook &hook = gethook(ic.pname); if(r = enabled) if(r = (options & aomanual)) { currentev = new immessage(ic, imevent::incoming, ""); writescript(); int result = execscript(); snprintf(buf, sizeof(buf), _("executed external manual action %s, return code = %d"), name.c_str(), result); outbuf = output; logger.putmessage(buf); delete currentev; } return r; } bool imexternal::action::exec(imevent *ev, int &result, int option) { bool r; char buf[512]; abstracthook &hook = gethook(ev->getcontact().pname); r = enabled && (find(event.begin(), event.end(), ev->gettype()) != event.end()) && (find(proto.begin(), proto.end(), ev->getcontact().pname) != proto.end()) && (find(status.begin(), status.end(), hook.getstatus()) != status.end()) && ((option && (options & option)) || !option); if(r && !option) { r = !(options & aoprereceive) && !(options & aopresend) && !(options & aomanual); } if(r) { currentev = ev; writescript(); result = execscript(); snprintf(buf, sizeof(buf), _("executed external action %s, return code = %d"), name.c_str(), result); logger.putmessage(buf); if(!option) { respond(); } else { substitute(); } } return r; } void imexternal::action::respond() { imevent *ev; if((options & aostdout) && !output.empty()) { ev = 0; switch(currentev->gettype()) { case imevent::sms: ev = new imsms(currentev->getcontact(), imevent::outgoing, output); break; default: ev = new immessage(currentev->getcontact(), imevent::outgoing, output); break; } if(ev) { em.store(*ev); delete ev; } } } void imexternal::action::substitute() { if((options & aostdout) && !output.empty()) { if(currentev->gettype() == imevent::message) { immessage *m = static_cast(currentev); *m = immessage(m->getcontact(), m->getdirection(), output); } else if(currentev->gettype() == imevent::url) { imurl *m = static_cast(currentev); *m = imurl(m->getcontact(), m->getdirection(), m->geturl(), output); } else if(currentev->gettype() == imevent::sms) { imsms *m = static_cast(currentev); *m = imsms(m->getcontact(), m->getdirection(), output, m->getphone()); } else if(currentev->gettype() == imevent::authorization) { imauthorization *m = static_cast(currentev); *m = imauthorization(m->getcontact(), m->getdirection(), m->getauthtype(), output); } } } void imexternal::action::writescript() { #ifdef HAVE_SSTREAM std::ostringstream tfname; #else std::ostrstream tfname; #endif ofstream f; int i = 0; do { tfname.clear(); tfname << conf->getdirname() << "centerim-external-tmp." << dec << time(0)+i++; #ifdef HAVE_SSTREAM sname = tfname.str(); #else sname = string(tfname.str(), tfname.pcount()); tfname.freeze(false); #endif } while(!access(sname.c_str(), F_OK)); f.open(sname.c_str()); if(f.is_open()) { if(code.substr(0, 2) != "#!") f << "#!/bin/sh" << endl << endl; f << code << endl; f.close(); chmod(sname.c_str(), S_IRUSR | S_IWUSR | S_IXUSR); } } int imexternal::action::execscript() { int inpipe[2], outpipe[2], pid; string text; char ch; icqcontact *c; fd_set rfds; int r = -1; struct sigaction sact, osact; memset(&sact, 0, sizeof(sact)); sigaction(SIGCHLD, &sact, &osact); if(!pipe(inpipe) && !pipe(outpipe)) { pid = fork(); if(!pid) { if(c = clist.get(currentev->getcontact())) { setenv("EVENT_TYPE", geteventname(currentev->gettype()).c_str(), 1); setenv("EVENT_NETWORK", conf->getprotocolname(c->getdesc().pname).c_str(), 1); setenv("CONTACT_INFODIR", c->getdirname().c_str(), 1); setenv("CONTACT_UIN", i2str(c->getdesc().uin).c_str(), 1); if(c->getdesc().uin) setenv("CONTACT_NICK", c->getnick().c_str(), 1); else setenv("CONTACT_NICK", c->getdesc().nickname.c_str(), 1); setenv("SENDER_UIN", getenv("CONTACT_UIN"), 1); setenv("SENDER_NICK", getenv("CONTACT_NICK"), 1); setenv("SENDER_INFODIR", getenv("CONTACT_INFODIR"), 1); c->save(); } if(options & aonowait) { string nsname = conf->getdirname() + "centerim-external-tmp." + i2str(getpid()); rename(sname.c_str(), nsname.c_str()); sname = nsname; if(r = open("/dev/null", 0)) inpipe[1] = outpipe[0] = r; } dup2(inpipe[1], STDOUT_FILENO); dup2(outpipe[0], STDIN_FILENO); close(inpipe[1]); close(inpipe[0]); close(outpipe[0]); close(outpipe[1]); execl(sname.c_str(), sname.c_str(), (char *)NULL ); _exit(0); } else { close(outpipe[0]); close(inpipe[1]); if(options & aostdin) { text = currentev->gettext(); write(outpipe[1], text.c_str(), text.size()); close(outpipe[1]); } r = 0; text = ""; if(!(options & aonowait)) { if(options & aostdout) { while(1) { FD_ZERO(&rfds); FD_SET(inpipe[0], &rfds); if(select(inpipe[0]+1, &rfds, 0, 0, 0) < 0) break; else { if(FD_ISSET(inpipe[0], &rfds)) { if(read(inpipe[0], &ch, 1) != 1) break; else { text += ch; } } } } } waitpid(pid, &r, 0); unlink(sname.c_str()); } close(inpipe[0]); close(outpipe[1]); output = text; } } sigaction(SIGCHLD, &osact, 0); return r; } bool imexternal::action::load(ifstream &f) { int pos, npos, i; string buf, sect, param, aname; bool action, wasexec = false; static const struct { const char *name; int option; } actions[] = { { "pre-receive", aoprereceive }, { "pre-send", aopresend }, { "manual", aomanual }, { 0, 0 } }; while(getconf(sect, buf, f, sect == "exec")) { if((npos = sect.find_first_of(" \t")) == -1) npos = sect.size(); aname = sect.substr(0, npos); if(!(action = aname == "action")) for(i = 0; actions[i].name && !action; i++) action = aname == actions[i].name; if(action) { if(wasexec) { f.seekg(pos, ios::beg); break; } if(npos != sect.size() && name.empty()) name = leadcut(sect.substr(npos+1)); for(i = 0; actions[i].name; i++) { if(aname == actions[i].name) { if(!(options & actions[i].option)) options |= actions[i].option; break; } } param = getword(buf); if(param == "event") { while(!(param = getword(buf)).empty()) { for(imevent::imeventtype et = imevent::message; et != imevent::imeventtype_size; et++) { if((param == geteventname(et)) || (param == "all")) { event.insert(et); } } } } else if(param == "proto") { while(!(param = getword(buf)).empty()) { for(protocolname pname = icq; pname != protocolname_size; pname++) { if((param == conf->getprotocolname(pname)) || (param == "all")) { proto.insert(pname); } } } } else if(param == "status") { while(!(param = getword(buf)).empty()) { if(param == "online") status.insert(available); else if(param == "away") status.insert(away); else if(param == "dnd") status.insert(dontdisturb); else if(param == "na") status.insert(notavail); else if(param == "ofl") status.insert(outforlunch); else if(param == "occupied") status.insert(occupied); else if(param == "ffc") status.insert(freeforchat); else if(param == "invisible") status.insert(invisible); else if(param == "all") { status.insert(available); status.insert(away); status.insert(dontdisturb); status.insert(notavail); status.insert(outforlunch); status.insert(occupied); status.insert(freeforchat); status.insert(invisible); } } } else if(param == "options") { while(!(param = getword(buf)).empty()) { if(param == "stdin") options |= aostdin; else if(param == "stdout") options |= aostdout; else if(param == "nowait") options |= aonowait; } } } else if(sect == "exec") { wasexec = true; if(!code.empty()) code += "\n"; code += buf; } pos = f.tellg(); } if(options & aomanual) if(!(options & aostdout)) options |= aostdout; return wasexec; } bool imexternal::action::matches(int aoptions, protocolname apname) const { return (options & aoptions) && proto.count(apname); } string imexternal::action::geteventname(imevent::imeventtype et) { switch(et) { case imevent::message: return "msg"; case imevent::url: return "url"; case imevent::sms: return "sms"; case imevent::online: return "online"; case imevent::offline: return "offline"; case imevent::notification: return "notification"; case imevent::authorization: return "auth"; case imevent::contacts: return "contacts"; case imevent::file: return "file"; } return ""; } centerim-4.22.10/src/impgp.cc0000644000175000001440000001473511461606612012632 00000000000000#include "impgp.h" #ifdef HAVE_GPGME #include "icqconf.h" #include "icqface.h" #include "icqcontacts.h" #include "abstracthook.h" impgp pgp; protocolname impgp::opname; string impgp::passphrase[]; impgp::impgp() { gpgme_check_version(NULL); if(gpgme_new(&ctx)) ctx = 0; } impgp::~impgp() { if(ctx) gpgme_release(ctx); } string impgp::getkeyinfo(const string &fp, bool secret) { gpgme_key_t key; string r; if(ctx && !gpgme_get_key(ctx, fp.c_str(), &key, secret ? 1 : 0)) { r = key->subkeys->keyid+8; r += ": "; r += key->uids->name; if(key->uids->comment && strlen(key->uids->comment)) r += (string) " (" + key->uids->comment + ")"; if(key->uids->email && strlen(key->uids->email)) r += (string) " <" + key->uids->email + ">"; gpgme_key_release(key); } return r; } vector impgp::getkeys(bool secretonly) { gpgme_key_t key; vector r; if(ctx) { gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP); if(!gpgme_op_keylist_start(ctx, 0, secretonly ? 1 : 0)) { while(!gpgme_op_keylist_next(ctx, &key)) { r.push_back(key->subkeys->keyid); gpgme_key_release(key); } } } return r; } gpgme_error_t impgp::passphrase_cb(void *hook, const char *uidhint, const char *info, int prevbad, int fd) { if(!prevbad) { if(passphrase[opname].empty()) passphrase[opname] = conf->getourid(opname).additional["pgppass"]; if(passphrase[opname].empty()) passphrase[opname] = face.inputstr(_("PGP passphrase required: "), "", '*'); } else { face.log((string) "+ [" + conf->getprotocolname(opname) + "] " + _("incorrect PGP passphrase")); // gethook(opname).disconnect(); // sudden disconnect isn't good for Jabber return GPG_ERR_CANCELED; } write(fd, passphrase[opname].c_str(), passphrase[opname].size()); write(fd, "\n", 1); return 0; } string impgp::sign(const string &text, const string &keyid, protocolname pname) { gpgme_data_t in, out; gpgme_key_t key; string r; size_t n; gpgme_error_t err; if(ctx) { gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP); gpgme_set_textmode(ctx, 0); gpgme_set_armor(ctx, 1); gpgme_set_passphrase_cb(ctx, &passphrase_cb, 0); opname = pname; if(!(err = gpgme_get_key(ctx, keyid.c_str(), &key, 1))) { gpgme_signers_clear(ctx); gpgme_signers_add(ctx, key); if(!(err = gpgme_data_new_from_mem(&in, text.c_str(), text.size(), 0))) { if(!(err = gpgme_data_new(&out))) { if(!(err = gpgme_op_sign(ctx, in, out, GPGME_SIG_MODE_DETACH))) { auto_ptr buf(gpgme_data_release_and_get_mem(out, &n)); auto_ptr p(new char[n+1]); strncpy(p.get(), buf.get(), n); p.get()[n] = 0; r = p.get(); strip(r); } else { gpgme_data_release(out); } } gpgme_data_release(in); } gpgme_key_release(key); } if(err && err != GPG_ERR_CANCELED) { face.log((string) "+ [" + conf->getprotocolname(pname) + "] " + _("PGP sign error: ") + gpgme_strerror(err)); // gethook(pname).disconnect(); // sudden disconnect isn't good for Jabber } } return r; } string impgp::verify(string sign, const string &orig) { string r; gpgme_data_t dsign, dorig; gpgme_key_t key; gpgme_verify_result_t vr; if(ctx) { sign = "-----BEGIN PGP SIGNATURE-----\n\n" + sign + "\n-----END PGP SIGNATURE-----\n"; if(!gpgme_data_new_from_mem(&dsign, sign.c_str(), sign.size(), 0)) { if(!gpgme_data_new_from_mem(&dorig, orig.c_str(), orig.size(), 0)) { if(!gpgme_op_verify(ctx, dsign, dorig, 0)) { if(vr = gpgme_op_verify_result(ctx)) { if(vr->signatures) { r = vr->signatures->fpr; if(!gpgme_get_key(ctx, r.c_str(), &key, 0)) { r = key->subkeys->keyid; gpgme_key_release(key); } } } } gpgme_data_release(dorig); } gpgme_data_release(dsign); } } return r; } string impgp::decrypt(string text, protocolname pname) { string r; gpgme_data_t in, out; gpgme_key_t key; gpgme_decrypt_result_t dr; size_t n; if(ctx) { text = "-----BEGIN PGP MESSAGE-----\n\n" + text + "\n-----END PGP MESSAGE-----\n"; gpgme_set_passphrase_cb(ctx, &passphrase_cb, 0); opname = pname; if(!gpgme_data_new_from_mem(&in, text.c_str(), text.size(), 0)) { if(!gpgme_data_new(&out)) { if(!gpgme_op_decrypt(ctx, in, out)) { if(dr = gpgme_op_decrypt_result(ctx)) { } auto_ptr buf(gpgme_data_release_and_get_mem(out, &n)); auto_ptr p(new char[n+1]); strncpy(p.get(), buf.get(), n); p.get()[n] = 0; r = p.get(); } else { gpgme_data_release(out); } } gpgme_data_release(in); } } return r; } string impgp::encrypt(const string &text, const string &keyid, protocolname pname) { string r; gpgme_key_t key; gpgme_data_t in, out; size_t n; gpgme_error_t err; if(ctx) { gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP); gpgme_set_textmode(ctx, 0); gpgme_set_armor(ctx, 1); if(!(err = gpgme_get_key(ctx, keyid.c_str(), &key, 0))) { gpgme_key_t keys[] = { key, 0 }; if(!(err = gpgme_data_new_from_mem(&in, text.c_str(), text.size(), 0))) { if(!(err = gpgme_data_new(&out))) { if(!(err = gpgme_op_encrypt(ctx, keys, GPGME_ENCRYPT_ALWAYS_TRUST, in, out))) { auto_ptr p(gpgme_data_release_and_get_mem(out, &n)); r = p.get(); strip(r); } else { gpgme_data_release(out); } } gpgme_data_release(in); } gpgme_key_release(key); } } if(err && err != GPG_ERR_CANCELED) { face.log((string) "+ [" + conf->getprotocolname(pname) + "] " + _("PGP encrypt error: ") + gpgme_strerror(err)); gethook(pname).disconnect(); } return r; } bool impgp::havekey(const string &keyid) const { gpgme_key_t key; bool r = !gpgme_get_key(ctx, keyid.c_str(), &key, 0); if(r) gpgme_key_release(key); return r; } bool impgp::enabled(protocolname pname) const { return gethook(pname).getCapabs().count(hookcapab::pgp) && !conf->getourid(pname).additional["pgpkey"].empty(); } bool impgp::enabled(const imcontact &ic) const { bool r = false; icqcontact *c; if(c = clist.get(ic)) r = enabled(ic.pname) && c->getusepgpkey() && !c->getpgpkey().empty() && havekey(c->getpgpkey()); return r; } void impgp::clearphrase(protocolname p) { passphrase[p] = ""; } void impgp::strip(string &r) { int n; if((n = r.find("\n\n")) != -1) r.erase(0, n+2); if((n = r.rfind("\n")) != -1) r.erase(n); if((n = r.rfind("\n")) != -1) r.erase(n); } #endif centerim-4.22.10/src/centermain.cc0000644000175000001440000000331511473007750013634 00000000000000/* * * centerim main() function * $Id: centermain.cc,v 1.16 2002/07/07 22:58:18 konst Exp $ * * Copyright (C) 2001 by Konstantin Klyagin * * 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 #include #include "centerim.h" #include "icqface.h" #include "icqconf.h" #include "icqcontacts.h" #include "icqmlist.h" #include "icqgroups.h" #ifdef HAVE_LIBOTR #include "imotr.h" #endif centerim cicq; icqconf* conf=icqconf::instance(); icqcontacts clist; icqface face; icqlist lst; icqgroups groups; #ifdef ENABLE_NLS #include #include #endif int main(int argc, char **argv) { char savedir[1024]; getcwd(savedir, 1024); try { srand((unsigned int) time(NULL)); #ifdef ENABLE_NLS setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); #endif conf->commandline(argc, argv); #ifdef HAVE_LIBOTR otr.init(); #endif cicq.exec(); } catch(exception e) { cerr << "Caught exception: " << e.what() << endl; } chdir(savedir); } centerim-4.22.10/src/icqmlist.h0000644000175000001440000000214711461606612013177 00000000000000#ifndef __ICQMLIST_H__ #define __ICQMLIST_H__ #include "kkstrtext.h" #include "cmenus.h" #include "icqcommon.h" #include "imcontact.h" enum contactstatus { csnone = -1, csignore = 1, csvisible, csinvisible }; class modelistitem { private: string nick; imcontact cdesc; contactstatus cs; public: modelistitem() {} modelistitem(const string &nnick, const imcontact &adesc, contactstatus ncs): nick(nnick), cdesc(adesc), cs(ncs) {} string getnick() const; imcontact getdesc() const; contactstatus getstatus() const; void setstatus(contactstatus ncs); bool operator == (const imcontact &cinfo) const; bool operator != (const imcontact &cinfo) const; }; class icqlist : public vector { private: vector menucontents; string getfname() const; public: icqlist(); ~icqlist(); void load(); void save(); void fillmenu(verticalmenu *m, contactstatus ncs); bool inlist(const imcontact &cinfo, contactstatus ncs) const; void del(const imcontact &cinfo, contactstatus ncs); modelistitem menuat(int pos) const; }; extern icqlist lst; #endif centerim-4.22.10/src/icqcontact.cc0000644000175000001440000004755611461606612013655 00000000000000/* * * centerim single IM contact class * $Id: icqcontact.cc,v 1.105 2005/02/13 12:10:55 iulica Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "icqcontacts.h" #include "icqgroups.h" #include "icqconf.h" #include "icqface.h" #include "abstracthook.h" #include "imexternal.h" #include "eventmanager.h" #include #ifdef HAVE_SSTREAM #include #else #include #endif icqcontact::icqcontact(const imcontact adesc) { string fname, tname; imevent::imeventtype ie; int i; clear(); lastread = fhistoffset = 0; status = offline; finlist = true; congratulated = false; openedforchat = false; idlefor = 0; for(ie = imevent::message; ie != imevent::imeventtype_size; ie++) sound[ie] = ""; cdesc = adesc; switch(cdesc.pname) { case infocard: case rss: if(!cdesc.uin) { fname = conf->getdirname() + conf->getprotocolprefix(cdesc.pname); for(i = 1; ; i++) { tname = fname + i2str(i); if(access(tname.c_str(), F_OK)) break; } cdesc.uin = i; } default: load(); scanhistory(); break; } } icqcontact::~icqcontact() { } string icqcontact::tosane(const string &p) const { string buf; string::iterator i; for(buf = p, i = buf.begin(); i != buf.end(); ++i) { if(strchr("\n\r", *i)) *i = ' '; } return buf; } string icqcontact::getdirname() const { string ret; ret = conf->getdirname(); switch(cdesc.pname) { case icq: case infocard: case rss: case gadu: ret += conf->getprotocolprefix(cdesc.pname) + i2str(cdesc.uin); break; default: ret += conf->getprotocolprefix(cdesc.pname) + cdesc.nickname; break; } ret += "/"; return ret; } void icqcontact::clear() { fupdated = groupid = fhistoffset = lasttyping = 0; finlist = true; modified = usepgpkey = false; cdesc = contactroot; binfo = basicinfo(); minfo = moreinfo(); winfo = workinfo(); rinfo = reginfo(); interests.clear(); background.clear(); nick = about = dispnick = postponed = lastip = ""; lastseen = onlinesince = 0; } void icqcontact::save() { ofstream f; if(cdesc == contactroot) return; string lrname = getdirname() + "lastread"; string infoname = getdirname() + "info"; string aboutname = getdirname() + "about"; string postponedname = getdirname() + "postponed"; string dname = getdirname(); dname.erase(dname.size()-1); modified = modified || access(lrname.c_str(), F_OK) || access(infoname.c_str(), F_OK) || access(aboutname.c_str(), F_OK); if(modified && conf->enoughdiskspace()) { mkdir(dname.c_str(), S_IRUSR | S_IWUSR | S_IXUSR); if(!access(getdirname().c_str(), W_OK)) { f.open(lrname.c_str()); if(f.is_open()) { f << lastread << endl; f.close(); f.clear(); } f.open(infoname.c_str()); if(f.is_open()) { string options(""); /* set initial value */ if(binfo.requiresauth) options += "a"; if(binfo.authawait) options += "w"; if(usepgpkey) options += "p"; f << nick << endl << tosane(binfo.fname) << endl << tosane(binfo.lname) << endl << tosane(binfo.email) << endl << options << endl << pgpkey << endl << tosane(binfo.city) << endl << tosane(binfo.state) << endl << tosane(binfo.phone) << endl << tosane(binfo.fax) << endl << tosane(binfo.street) << endl << tosane(binfo.cellular) << endl << tosane(binfo.zip) << endl << binfo.country << endl << tosane(winfo.city) << endl << tosane(winfo.state) << endl << tosane(winfo.phone) << endl << tosane(winfo.fax) << endl << tosane(winfo.street) << endl << tosane(winfo.zip) << endl << winfo.country << endl << tosane(winfo.company) << endl << tosane(winfo.dept) << endl << tosane(winfo.position) << endl << (int) minfo.timezone << endl << tosane(winfo.homepage) << endl << (int) minfo.age << endl << (int) minfo.gender << endl << tosane(minfo.homepage) << endl << minfo.lang1 << endl << minfo.lang2 << endl << minfo.lang3 << endl << minfo.birth_day << endl << minfo.birth_month << endl << minfo.birth_year << endl << (interests.size() > 0 ? *(interests.begin()+0) : "") << endl << (interests.size() > 1 ? *(interests.begin()+1) : "") << endl << (interests.size() > 2 ? *(interests.begin()+2) : "") << endl << (interests.size() > 3 ? *(interests.begin()+3) : "") << endl << (background.size() > 0 ? *(background.begin()+0) : "") << endl << (background.size() > 1 ? *(background.begin()+1) : "") << endl << (background.size() > 2 ? *(background.begin()+2) : "") << endl << minfo.checkfreq << endl << minfo.checklast << endl << lastip << endl << tosane(dispnick) << endl << lastseen << endl << endl << endl << endl << endl << groupid << endl << tosane(binfo.avatar) << endl; f.close(); f.clear(); } f.open(aboutname.c_str()); if(f.is_open()) { f << about; f.close(); f.clear(); } if(!postponed.empty()) { f.open(postponedname.c_str()); if(f.is_open()) { f << postponed; f.close(); f.clear(); } } else { unlink(postponedname.c_str()); } if(!finlist) { f.open((getdirname() + "excluded").c_str()); if(f.is_open()) f.close(); } } modified = false; } } void icqcontact::load() { int i; ifstream f; struct stat st; string tname = getdirname(), fn, buf; imcontact savedesc = cdesc; clear(); cdesc = savedesc; f.clear(); f.open((fn = tname + "/info").c_str()); if(f.is_open()) { for(i = 0; getstring(f, buf); i++) { switch(i) { case 0: nick = buf; break; case 1: binfo.fname = buf; break; case 2: binfo.lname = buf; break; case 3: binfo.email = buf; break; case 4: binfo.requiresauth = (buf.find('a') != -1); binfo.authawait = (buf.find('w') != -1); usepgpkey = (buf.find('p') != -1); break; case 5: pgpkey = buf; break; case 6: binfo.city = buf; break; case 7: binfo.state = buf; break; case 8: binfo.phone = buf; break; case 9: binfo.fax = buf; break; case 10: binfo.street = buf; break; case 11: binfo.cellular = buf; break; case 12: binfo.zip = buf; break; case 13: binfo.country = strtoul(buf.c_str(), 0, 0); break; case 14: winfo.city = buf; break; case 15: winfo.state = buf; break; case 16: winfo.phone = buf; break; case 17: winfo.fax = buf; break; case 18: winfo.street = buf; break; case 19: winfo.zip = buf; break; case 20: winfo.country = strtoul(buf.c_str(), 0, 0); break; case 21: winfo.company = buf; break; case 22: winfo.dept = buf; break; case 23: winfo.position = buf; break; case 24: minfo.timezone = atoi(buf.c_str()); break; case 25: winfo.homepage = buf; break; case 26: minfo.age = atoi(buf.c_str()); break; case 27: minfo.gender = (imgender) atoi(buf.c_str()); break; case 28: minfo.homepage = buf; break; case 29: minfo.lang1 = strtoul(buf.c_str(), 0, 0); break; case 30: minfo.lang2 = strtoul(buf.c_str(), 0, 0); break; case 31: minfo.lang3 = strtoul(buf.c_str(), 0, 0); break; case 32: minfo.birth_day = atoi(buf.c_str()); break; case 33: minfo.birth_month = atoi(buf.c_str()); break; case 34: minfo.birth_year = atoi(buf.c_str()); break; case 35: if(!buf.empty()) interests.push_back(buf); break; case 36: if(!buf.empty()) interests.push_back(buf); break; case 37: if(!buf.empty()) interests.push_back(buf); break; case 38: if(!buf.empty()) interests.push_back(buf); break; case 39: if(!buf.empty()) background.push_back(buf); break; case 40: if(!buf.empty()) background.push_back(buf); break; case 41: if(!buf.empty()) background.push_back(buf); break; case 42: minfo.checkfreq = atoi(buf.c_str()); break; case 43: minfo.checklast = atoi(buf.c_str()); break; case 44: lastip = buf; break; case 45: dispnick = buf; break; case 46: lastseen = strtoul(buf.c_str(), 0, 0); break; case 47: break; case 48: break; case 49: break; case 50: break; case 51: groupid = atoi(buf.c_str()); break; case 52: binfo.avatar = buf; break; } } f.close(); } else { if(cdesc.uin) nick = i2str(cdesc.uin); } f.clear(); f.open((fn = tname + "/about").c_str()); if(f.is_open()) { while(getstring(f, buf)) { if(about.size()) about += '\n'; about += buf; } f.close(); } f.clear(); f.open((fn = tname + "/postponed").c_str()); if(f.is_open()) { while(getstring(f, buf)) { if(postponed.size()) postponed += '\n'; postponed += buf; } f.close(); } f.clear(); f.open((fn = tname + "/lastread").c_str()); if(f.is_open()) { getstring(f, buf); lastread = strtoul(buf.c_str(), 0, 0); f.close(); } finlist = stat((fn = tname + "/excluded").c_str(), &st); if(!isbirthday()) unlink((tname + "/congratulated").c_str()); if(nick.empty()) nick = cdesc.nickname; if(dispnick.empty()) dispnick = nick; if(conf->getgroupmode() != icqconf::nogroups) if(find(groups.begin(), groups.end(), groupid) == groups.end()) { groupid = 1; } } bool icqcontact::isbirthday() const { bool ret = false; time_t curtime = time(0); struct tm tbd, *tcur = localtime(&curtime); memset(&tbd, 0, sizeof(tbd)); tbd.tm_year = tcur->tm_year; tbd.tm_mday = minfo.birth_day; tbd.tm_mon = minfo.birth_month-1; if(tbd.tm_mday == tcur->tm_mday) if(tbd.tm_mon == tcur->tm_mon) { ret = true; } return ret; } void icqcontact::remove() { string dname = getdirname(), fname; struct dirent *e; struct stat st; DIR *d; gethook(cdesc.pname).removeuser(cdesc); if(d = opendir(dname.c_str())) { while(e = readdir(d)) { fname = dname + "/" + e->d_name; if(!stat(fname.c_str(), &st) && !S_ISDIR(st.st_mode)) unlink(fname.c_str()); } closedir(d); rmdir(dname.c_str()); } } void icqcontact::excludefromlist() { FILE *f; string fname = getdirname() + "excluded"; if(f = fopen(fname.c_str(), "w")) fclose(f); finlist = false; } void icqcontact::includeintolist(int agroupid, bool reqauth) { binfo.requiresauth = binfo.authawait = reqauth; if(groupid) groupid = agroupid; includeintolist(); } void icqcontact::includeintolist() { if(cdesc.pname != icq) status = offline; if(!ischannel(cdesc)) gethook(cdesc.pname).sendnewuser(cdesc); unlink((getdirname() + "excluded").c_str()); finlist = true; } bool icqcontact::inlist() const { return finlist; } void icqcontact::scanhistory() { string fn = getdirname() + "history", block; char buf[65]; int pos, backstep, r; FILE *f = fopen(fn.c_str(), "r"); struct stat st; sethasevents(false); stat(fn.c_str(), &st); if(f) { fseek(f, 0, SEEK_END); sethistoffset(0); pos = 0; while(ftell(f)) { backstep = 64; if(ftell(f) < backstep) backstep = ftell(f); if(fseek(f, -backstep, SEEK_CUR)) break; if((r = fread(buf, 1, backstep, f)) <= 0) break; if(fseek(f, -backstep, SEEK_CUR)) break; buf[r] = 0; block.insert(0, buf); if((r = block.find("\f\nIN\n")) != -1) { pos = st.st_size-block.size()+r; block.erase(0, r+2); #ifdef HAVE_SSTREAM ostringstream oevdata; oevdata << block; istringstream evdata(oevdata.str()); #else strstream evdata; evdata << block; #endif for(r = 0; (r < 3) && getline(evdata, block); r++); if(r == 3) sethasevents(strtoul(block.c_str(), 0, 0) > lastread); break; } } fclose(f); if(!gethistoffset()) sethistoffset(pos); } } void icqcontact::setstatus(imstatus fstatus, bool reflect) { if(status != fstatus) { if(!ischannel(cdesc)) { if(fstatus != offline && status == offline || fstatus == offline && status != offline) { imevent::imeventtype et = status == offline ? imevent::online : imevent::offline; external.exec(imrawevent(et, cdesc, imevent::incoming)); playsound(et); } } else if(reflect) { abstracthook &h = gethook(cdesc.pname); if(fstatus == offline) h.removeuser(cdesc); else h.sendnewuser(cdesc); } if (fstatus == offline && status != offline) { setonlinesince(0); } else if (fstatus != offline && status == offline) { setonlinesince(time(NULL)); } setlastseen(); status = fstatus; face.relaxedupdate(); } } void icqcontact::setdesc(const imcontact &ic) { string dir = getdirname(); cdesc = ic; rename(dir.c_str(), getdirname().c_str()); } void icqcontact::setnick(const string &fnick) { nick = fnick; modified = true; fupdated++; } void icqcontact::setdispnick(const string &fnick) { dispnick = fnick; modified = true; } void icqcontact::setlastread(time_t flastread) { lastread = flastread; scanhistory(); modified = true; } void icqcontact::unsetupdated() { fupdated = 0; } void icqcontact::setbasicinfo(const basicinfo &ainfo) { binfo = ainfo; fupdated++; modified = true; } void icqcontact::setmoreinfo(const moreinfo &ainfo) { minfo = ainfo; fupdated++; modified = true; } void icqcontact::setworkinfo(const workinfo &ainfo) { winfo = ainfo; fupdated++; modified = true; } void icqcontact::setreginfo(const reginfo &arinfo) { rinfo = arinfo; } void icqcontact::setinterests(const vector &ainterests) { interests = ainterests; fupdated++; modified = true; } void icqcontact::setbackground(const vector &abackground) { background = abackground; fupdated++; modified = true; } void icqcontact::setabout(const string &data) { about = data; fupdated++; modified = true; } void icqcontact::setsound(imevent::imeventtype event, const string &sf) { sound[event] = sf; } void icqcontact::playsound(imevent::imeventtype event) const { string sf = sound[event], cline; int i; if(sf.size()) { if(sf[0] == '!') { static time_t lastmelody = 0; if(time(0)-lastmelody < 5) return; time(&lastmelody); if(sf.substr(1) == "spk1") { for(i = 0; i < 3; i++) { if(i) usleep(90000); setbeep((i+1)*100, 60); printf("\a"); fflush(stdout); } } else if(sf.substr(1) == "spk2") { for(i = 0; i < 2; i++) { if(i) usleep(90000); setbeep((i+1)*300, 60); printf("\a"); fflush(stdout); } } else if(sf.substr(1) == "spk3") { for(i = 3; i > 0; i--) { setbeep((i+1)*200, 60-i*10); printf("\a"); fflush(stdout); usleep(90000-i*10000); } } else if(sf.substr(1) == "spk4") { for(i = 0; i < 4; i++) { setbeep((i+1)*400, 60); printf("\a"); fflush(stdout); usleep(90000); } } else if(sf.substr(1) == "spk5") { for(i = 0; i < 4; i++) { setbeep((i+1)*250, 60+i); printf("\a"); fflush(stdout); usleep(90000-i*5000); } } else if(sf.substr(1) == "spk6") { printf("\a"); } } else { static int pid = 0; if(pid) kill(pid, SIGKILL); pid = fork(); if(!pid) { string cline = sf + " >/dev/null 2>&1"; execlp("/bin/sh", "/bin/sh", "-c", cline.c_str(), (char *)NULL ); exit(0); } } } else if(cdesc != contactroot) { icqcontact *c = clist.get(contactroot); c->playsound(event); } } void icqcontact::setlastip(const string &flastip) { lastip = flastip; fupdated++; modified = true; } string icqcontact::getpgpkey() const { return pgpkey; } void icqcontact::setpgpkey(const string &key) { pgpkey = key; usepgpkey = modified = true; fupdated++; } bool icqcontact::getusepgpkey() const { return usepgpkey; } void icqcontact::setusepgpkey(bool usekey) { usepgpkey = usekey; modified = true; } string icqcontact::getabout() const { return about; } string icqcontact::getlastip() const { return lastip; } time_t icqcontact::getlastread() const { return lastread; } imstatus icqcontact::getstatus() const { if(conf->getnonimonline(cdesc.pname)) return available; return status; } string icqcontact::getnick() const { return nick; } string icqcontact::getdispnick() const { return dispnick; } int icqcontact::updated() const { return fupdated; } void icqcontact::setlastseen() { time(&lastseen); fupdated++; modified = true; } time_t icqcontact::getlastseen() const { return lastseen; } void icqcontact::setidlefor(unsigned int idle) { if (idle > 0) { time(&idlefor); idlefor -= (idle * 60); } else idlefor = 0; modified = true; } time_t icqcontact::getidlefor() const { return idlefor; } char icqcontact::getshortstatus() const { if(status >= offline && status < imstatus_size) { return imstatus2char[getstatus()]; } else { return imstatus2char[offline]; } } bool icqcontact::operator > (const icqcontact &acontact) const { if(lastread != acontact.lastread) { return lastread < acontact.lastread; } else if(cdesc.uin != acontact.cdesc.uin) { return cdesc.uin > acontact.cdesc.uin; } else { return cdesc.nickname.compare(acontact.cdesc.nickname); } } // this is the bizaare compare by last read, then uin, then nickname int icqcontact::compare1(const icqcontact& a, const icqcontact& b){ return a > b ? 1 : -1; } // this is the compare by nickname int icqcontact::compare2(const icqcontact& a, const icqcontact& b){ return a.getdispnick().compare(b.getdispnick()); } void icqcontact::setpostponed(const string &apostponed) { if(apostponed.find_first_not_of(" \r\n") != -1) postponed = apostponed; else postponed = ""; modified = true; } string icqcontact::getpostponed() const { return postponed; } void icqcontact::setgroupid(int agroupid, bool reflect) { groupid = agroupid; modified = true; if(reflect) gethook(cdesc.pname).updatecontact(this); } int icqcontact::getgroupid() const { return groupid; } const imcontact icqcontact::getdesc() const { return cdesc; } int icqcontact::gethistoffset() const { return fhistoffset; } void icqcontact::sethistoffset(int aoffset) { fhistoffset = aoffset; } void icqcontact::remindbirthday(bool r) { string tname = getdirname() + "congratulated"; if(!congratulated && r) { congratulated = !access(tname.c_str(), F_OK); if(!congratulated) { ofstream f(tname.c_str()); if(f.is_open()) f.close(), f.clear(); em.store(imnotification(getdesc(), _("The user has a birthday today"))); congratulated = true; } } else if(congratulated && !r) { congratulated = false; unlink(tname.c_str()); } } // ---------------------------------------------------------------------------- string icqcontact::moreinfo::strtimezone() const { string r; if(timezone <= 24 && timezone >= -24) { r = abstracthook::getTimezoneIDtoString(timezone) + ", " + abstracthook::getTimezonetoLocaltime(timezone); } return r; } string icqcontact::moreinfo::strbirthdate() const { string r; static const string smonths[12] = { _("Jan"), _("Feb"), _("Mar"), _("Apr"), _("May"), _("Jun"), _("Jul"), _("Aug"), _("Sep"), _("Oct"), _("Nov"), _("Dec") }; if((birth_day > 0) && (birth_day <= 31)) if((birth_month > 0) && (birth_month <= 12)) { r = i2str(birth_day) + "-" + smonths[birth_month-1] + "-" + i2str(birth_year); } return r; } centerim-4.22.10/src/captcha.h0000644000175000001440000000146411461606612012756 00000000000000#ifndef __CAPTCHA_H__ #define __CAPTCHA_H__ #include class captcha { private: typedef struct { string question; set answers; } question_t; typedef struct { time_t expiry; set *answers; } captchaasked_t; typedef std::vector questions_t; typedef std::map captchas_t; captchas_t captchas; questions_t questions; public: captcha(); ~captcha(); /* check if we are already testing this contact */ bool docaptcha(imcontact c); void donecaptcha(imcontact c); /* check an answer */ bool checkcaptcha(imcontact c, string answer); /* get a (new) question for a contact and remeber it */ string getcaptchaquestion(imcontact c); bool empty(); unsigned int size(); void addquestion(string data); }; #endif centerim-4.22.10/src/imcontroller.h0000644000175000001440000000302411461606612014056 00000000000000#ifndef __IMCONTROLLER_H__ #define __IMCONTROLLER_H__ #include "icqconf.h" #include "icqcontact.h" #include struct imsearchparams { imsearchparams() { onlineonly = sincelast = reverse = photo = false; uin = checkfrequency = 0; minage = maxage = country = language = randomgroup = 0; gender = genderUnspec; agerange = ICQ2000::RANGE_NORANGE; }; imsearchparams(const string &name) { load(name); }; protocolname pname; bool onlineonly, sincelast, reverse, photo; unsigned int uin, checkfrequency; unsigned short minage, maxage, country, language, randomgroup; ICQ2000::AgeRange agerange; imgender gender; string firstname, lastname, nick, city, state, kwords, url; string company, department, position, email, room, password; string service; vector > flexparams; void save(const string &prname) const; bool load(const string &prname); }; class imcontroller { protected: unsigned int ruin; string rnick, rfname, rlname, remail, rpasswd, rserver; protected: bool regdialog(protocolname pname); bool uinreg(icqconf::imaccount &account); bool jabberregistration(icqconf::imaccount &account); void icqupdatedetails(); void aimupdateprofile(); void msnupdateprofile(); void jabberupdateprofile(); void gaduupdateprofile(); public: imcontroller(); ~imcontroller(); void registration(icqconf::imaccount &account); void updateinfo(icqconf::imaccount &account); }; extern imcontroller imcontrol; #endif centerim-4.22.10/src/icqcommon.h0000644000175000001440000000305511461606612013336 00000000000000#ifndef __ICQCOMMON_H__ #define __ICQCOMMON_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SSTREAM #include #else #include #endif #include "kkiproc.h" #include "kkstrtext.h" #include "conf.h" #include #ifdef __GNU__ #include #elif defined BSD #include #else #include #endif #define PERIOD_RECONNECT 40 #ifdef ENABLE_NLS #include #define _(s) ::gettext(s) #else #define _(s) (s) #endif #ifdef __KTOOL_USE_NAMESPACES #define __CENTERIM_USE_NAMESPACES #endif #ifdef __CENTERIM_USE_NAMESPACES using namespace std; #endif #define PERIOD_RESEND 20 #define PERIOD_CHECKMAIL 30 #define PERIOD_DISPUPDATE 2 #define PERIOD_AUTOSAVE 120 #define PERIOD_TYPING 6 #define PERIOD_ATONCE 5 #define MAX_ATONCE 10 /* * * Several helper routines * */ string up(string s); string lo(string s); string stripspaces(string s); /*! .. and defines. */ #define ENUM_PLUSPLUS(tp) \ inline tp& operator ++(tp &p, int) { \ int t = p; \ return p = static_cast(++t); \ } /* if the system doesn't provide setenv we need to define our own */ #ifndef HAVE_SETENV int setenv(const char* name, const char* value, const int overwrite); #endif #endif centerim-4.22.10/src/icqgroups.h0000644000175000001440000000100311461606612013354 00000000000000#ifndef __ICQGROUPS_H__ #define __ICQGROUPS_H__ #include "icqgroup.h" class icqgroups: private vector { private: public: icqgroups(); ~icqgroups(); string getfname() const; void load(); void save(); int add(const string &aname); void remove(int gid); string getname(int gid) const; int size() const { return vector::size(); } iterator begin() { return vector::begin(); } iterator end() { return vector::end(); } }; extern icqgroups groups; #endif centerim-4.22.10/src/icqcommon.cc0000644000175000001440000000076711461606612013503 00000000000000 #include #include #include #include #ifndef HAVE_SETENV /* Emulation for IRIX which has no setenv(3)*/ int setenv(const char *name, const char *value, const int overwrite) { char *buffer = NULL; int size = strlen(name) + strlen(value) + 2; if ((buffer = (char*)calloc(size, sizeof(char)))) { snprintf(buffer, size, "%s=%s", name, value); return putenv(buffer); } return -1; } #endif centerim-4.22.10/src/icqgroups.cc0000644000175000001440000000463511461606612013530 00000000000000/* * * centerim IM contacts group listing class * $Id: icqgroups.cc,v 1.12 2003/11/05 14:54:27 konst Exp $ * * Copyright (C) 2001 by Konstantin Klyagin * * 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 "icqgroups.h" #include "icqconf.h" icqgroups::icqgroups() { } icqgroups::~icqgroups() { } string icqgroups::getfname() const { return conf->getdirname() + "groups"; } void icqgroups::load() { string buf; ifstream f; int gid; vector::iterator ig; clear(); f.open(getfname().c_str()); if(f.is_open()) { while(!f.eof()) { getstring(f, buf); gid = atol(getword(buf).c_str()); if(gid) { if(!buf.empty()) { push_back(icqgroup(gid, buf)); } else { ig = find(begin(), end(), gid); if(ig != end()) ig->changecollapsed(); } } } f.close(); } if(find(begin(), end(), 1) == end()) { push_back(icqgroup(1, _("General"))); } } void icqgroups::save() { ofstream f; iterator i; if(conf->enoughdiskspace()) { f.open(getfname().c_str()); if(f.is_open()) { for(i = begin(); i != end(); ++i) { f << i->getid() << "\t" << i->getname() << endl; } for(i = begin(); i != end(); ++i) if(i->iscollapsed()) f << i->getid() << endl; f.close(); } } } int icqgroups::add(const string &aname) { int i; for(i = 1; find(begin(), end(), i) != end(); i++); push_back(icqgroup(i, aname)); return i; } void icqgroups::remove(int gid) { iterator i = find(begin(), end(), gid); if(i != end()) { erase(i); } } string icqgroups::getname(int gid) const { string r; const_iterator i = find(vector::begin(), vector::end(), gid); if(i != vector::end()) r = i->getname(); return r; } centerim-4.22.10/src/imotr.cc0000644000175000001440000004753011461606612012647 00000000000000#include "imotr.h" #include "icqconf.h" #include "icqface.h" #include "icqcontacts.h" #include "abstracthook.h" #include "centerim.h" #include "hooks/jabberhook.h" #include "imevents.h" /* libotr headers */ #ifdef __cplusplus extern "C" { #endif #include #include #include #include #ifdef __cplusplus } #endif imotr otr; //#define OTRDEBUG static OtrlPolicy policy_cb(void *opdata, ConnContext *context) { #ifdef OTRDEBUG // face.log(_("[OTR-DEBUG] policy_cb(...) - returning OTRL_POLICY_DEFAULT")); #endif return OTRL_POLICY_DEFAULT; // TODO: add user specific policies return (OTRL_POLICY_ALLOW_V2 | OTRL_POLICY_REQUIRE_ENCRYPTION | OTRL_POLICY_SEND_WHITESPACE_TAG | OTRL_POLICY_WHITESPACE_START_AKE | OTRL_POLICY_ERROR_START_AKE); } static void create_privkey_cb(void *opdata, const char *accountname, const char *protocol) { #ifdef OTRDEBUG face.log("[OTR-DEBUG] create_privkey_cb(..., " + string(accountname) + ")"); #endif // Generate the key otrl_privkey_generate(otr.get_userstate(), (string(conf->getdirname()) + PRIVKEYFNAME).c_str(), accountname, protocol); // gaim-otr: otrg_ui_update_fingerprint(); } static int is_logged_in_cb(void *opdata, const char *accountname, const char *protocol, const char *recipient) { icqcontact *c; string recipientname = recipient; recipientname = recipientname.substr(0, recipientname.find_last_of('/')); // removing "/" if (c = clist.get(imcontact(recipientname, jabber))) { if (c->getstatus() == offline) { #ifdef OTRDEBUG face.log("[OTR-DEBUG] is_logged_in_cb(..., " + string(accountname) + ", " + string(protocol)+ ", " + string(recipient) + ") - returning 0"); #endif return 0; // 0: offline } else { #ifdef OTRDEBUG face.log("[OTR-DEBUG] is_logged_in_cb(..., " + string(accountname) + ", " + string(protocol)+ ", " + string(recipient) + ") - returning 1"); #endif return 1; // 1: online } } else { // recipient not found in contact list #ifdef OTRDEBUG face.log("[OTR-DEBUG] is_logged_in_cb(..., " + string(accountname) + ", " + string(protocol)+ ", " + string(recipient) + ") - returning -1"); #endif return -1; // -1: no idea if he's online... } } static void inject_message_cb(void *opdata, const char *accountname, const char *protocol, const char *recipient, const char *message) { icqcontact *c; string recipientname = recipient; recipientname = recipientname.substr(0, recipientname.find_last_of('/')); // removing "/" #ifdef OTRDEBUG face.log("[OTR-DEBUG] inject_message_cp(" + string(accountname) + ", " + string(protocol) + ", " + recipientname + ", " + string(message) + ")"); #endif if (c = clist.get(imcontact(recipientname, jabber))) { jhook.send(immessage(c->getdesc(), imevent::outgoing, string(message))); } else { face.log(_("[OTR] Error: inject_message_cb, recipient \"") + recipientname + _("\" not found")); } } static void notify_cb(void *opdata, OtrlNotifyLevel level, const char *accountname, const char *protocol, const char *username, const char *title, const char *primary, const char *secondary) { // Display a notification message for a particular accountname / protocol / username conversation. #ifdef OTRDEBUG face.log("[OTR-DEBUG] notify_cb"); #endif string notify_level = ""; switch (level) { case OTRL_NOTIFY_ERROR: notify_level = _("Error"); break; case OTRL_NOTIFY_WARNING: notify_level = _("Warning"); break; case OTRL_NOTIFY_INFO: notify_level = _("Info"); break; } face.log("[OTR] " + notify_level); if (accountname) face.log(_(" accountname: ") + string(accountname)); if (protocol) face.log(_(" protocol: ") + string(protocol)); if (username) face.log(_(" username: ") + string(username)); if (title) face.log(_(" title: ") + string(title)); if (primary) face.log(_(" primary: ") + string(primary)); if (secondary) face.log(_(" secondary: ") + string(secondary)); } static int display_otr_message_cb(void *opdata, const char *accountname, const char *protocol, const char *username, const char *msg) { /* Display an OTR control message for a particular accountname / * protocol / username conversation. Return 0 if you are able to * successfully display it. If you return non-0 (or if this * function is NULL), the control message will be displayed inline, * as a received message, or else by using the above notify() * callback. */ #ifdef OTRDEBUG face.log("[OTR-DEBUG] display_otr_message_cb(...) - returning -1"); #endif return -1; } static void update_context_list_cb(void *opdata) { /* When the list of ConnContexts changes (including a change in * state), this is called so the UI can be updated. */ #ifdef OTRDEBUG face.log("[OTR-DEBUG] update_context_list_cb(...)"); #endif } static const char *protocol_name_cb(void *opdata, const char *protocol) { /* Return a newly-allocated string containing a human-friendly name * for the given protocol id */ #ifdef OTRDEBUG face.log("[OTR-DEBUG] protocol_name_cb(...) - returning NULL"); #endif return NULL; } static void protocol_name_free_cb(void *opdata, const char *protocol_name) { // Deallocate a string allocated by protocol_name // Do nothing, since we didn't actually allocate any memory in protocol_name_cb. #ifdef OTRDEBUG face.log("[OTR-DEBUG] protocol_name_free_cb"); #endif } static void confirm_fingerprint_cb(void *opdata, OtrlUserState us, const char *accountname, const char *protocol, const char *username, unsigned char fingerprint[20]) { // A new fingerprint for the given user has been received. #ifdef OTRDEBUG face.log("[OTR-DEBUG] confirm_fingerprint_cb"); #endif face.log(_("[OTR] Received unknown fingerprint from \"") + string(username) + "\"."); face.log(_(" You can verify it in the OTR options.")); } static void write_fingerprints() { otrl_privkey_write_fingerprints(otr.get_userstate(), (string(conf->getdirname()) + STOREFNAME).c_str()); } static void write_fingerprints_cb(void *opdata) { // The list of known fingerprints has changed. Write them to disk. #ifdef OTRDEBUG face.log("[OTR-DEBUG] write_fingerprints_cb"); #endif write_fingerprints(); } static void gone_secure_cb(void *opdata, ConnContext *context) { // A ConnContext has entered a secure state. #ifdef OTRDEBUG face.log("[OTR-DEBUG] gone_secure_cb"); #endif face.log(_("[OTR] Connection is now secure...")); } static void gone_insecure_cb(void *opdata, ConnContext *context) { // A ConnContext has left a secure state. #ifdef OTRDEBUG face.log("[OTR-DEBUG] gone_insecure_cb"); #endif face.log(_("[OTR] Connection is insecure...")); } static void still_secure_cb(void *opdata, ConnContext *context, int is_reply) { /* We have completed an authentication, using the D-H keys we * already knew. is_reply indicates whether we initiated the AKE. */ #ifdef OTRDEBUG face.log("[OTR-DEBUG] still_secure_cb"); #endif } static void log_message_cb(void *opdata, const char *message) { // Log a message. The passed message will end in "\n". #ifdef OTRDEBUG face.log("[OTR-DEBUG] log_message_cb(..., " + string(message) + ")"); #endif face.log(_("[OTR] Log: ") + string(message)); } static OtrlMessageAppOps ui_ops = { policy_cb, create_privkey_cb, is_logged_in_cb, inject_message_cb, notify_cb, display_otr_message_cb, update_context_list_cb, protocol_name_cb, protocol_name_free_cb, confirm_fingerprint_cb, write_fingerprints_cb, gone_secure_cb, gone_insecure_cb, still_secure_cb, log_message_cb }; void imotr::init() { OTRL_INIT; // Initialize the OTR library userstate = otrl_userstate_create(); // Make our OtrlUserState; we'll only use the one. otrl_privkey_read(userstate, (string(conf->getdirname()) + PRIVKEYFNAME).c_str()); otrl_privkey_read_fingerprints(userstate, (string(conf->getdirname()) + STOREFNAME).c_str(), NULL, NULL); } imotr::imotr() : userstate(0) { } imotr::~imotr() { if (0 != userstate) otrl_userstate_free(userstate); } OtrlUserState imotr::get_userstate() { return userstate; } bool imotr::send_message(const protocolname pname, const string &recipient, string &text) { if (pname != jabber) // at the moment, otr is only with jabber supported... { return true; } gcry_error_t err = 0; char *newmessage = NULL; string accountname = conf->getourid(pname).nickname + "@" + conf->getourid(pname).server; string protocolname = "jabber"; #ifdef OTRDEBUG face.log("[OTR-DEBUG] otrl_message_sending(" + accountname + ", " + protocolname + ", " + recipient + ", " + text + ")"); #endif if (otrl_proto_message_type(text.c_str()) == OTRL_MSGTYPE_NOTOTR) { err = otrl_message_sending(userstate, &ui_ops, NULL, accountname.c_str(), protocolname.c_str(), recipient.c_str(), text.c_str(), NULL, &newmessage, NULL, NULL); } if (err) { face.log(_("[OTR] Error while encrypting message... no message sent!")); face.log(_(" accountname: ") + accountname); face.log(_(" recipient: ") + recipient); if (newmessage) otrl_message_free(newmessage); return false; } if (newmessage) { text = newmessage; #ifdef OTRDEBUG face.log("[OTR-DEBUG] otrl_message_sending - newmessage: \"" + text + "\")"); #endif otrl_message_free(newmessage); } return true; } bool imotr::receive_message(const protocolname pname, const string &from, string &text) { if (pname != jabber) // at the moment, otr is only with jabber supported... { return true; } int ignore_message; char *newmessage = NULL; string accountname = conf->getourid(pname).nickname + "@" + conf->getourid(pname).server; string protocolname = "jabber"; string sendername = from.substr(0, from.find_last_of('/')); // remove "/" #ifdef OTRDEBUG face.log("[OTR-DEBUG] otrl_message_receive(" + accountname + ", " + protocolname + ", " + sendername + ", " + text + ")"); #endif ignore_message = otrl_message_receiving(userstate, &ui_ops, NULL, accountname.c_str(), protocolname.c_str(), sendername.c_str(), text.c_str(), &newmessage, NULL, NULL, NULL); if (ignore_message == 1) return false; if (newmessage == NULL) return true; text = newmessage; #ifdef OTRDEBUG face.log("[OTR-DEBUG] otrl_message_sending - newmessage: \"" + text + "\")"); #endif otrl_message_free(newmessage); return true; } void imotr::start_session(icqcontact *contact) { #ifdef OTRDEBUG face.log("[OTR-DEBUG] imotr::start_session(contact)"); #endif if (contact->getdesc().pname != jabber) // at the moment, otr is only with jabber supported... { face.log(_("[OTR] Error: At the moment, only jabber is supported")); return; } ConnContext *context; string accountname = conf->getourid(contact->getdesc().pname).nickname + "@" + conf->getourid(contact->getdesc().pname).server; string protocolname = "jabber"; string username = contact->getdesc().nickname; face.log(_("[OTR] Trying to start a secure session with \"") + username +"\"..."); inject_message_cb(NULL, accountname.c_str(), protocolname.c_str(), username.c_str(), "?OTRv2?"); } void imotr::end_session(icqcontact *contact) { #ifdef OTRDEBUG face.log("[OTR-DEBUG] imotr::end_session(contact)"); #endif if (contact->getdesc().pname != jabber) // at the moment, otr is only with jabber supported... { face.log(_("[OTR] Error: At the moment, only jabber is supported")); return; } ConnContext *context; string accountname = conf->getourid(contact->getdesc().pname).nickname + "@" + conf->getourid(contact->getdesc().pname).server; string protocolname = "jabber"; string username = contact->getdesc().nickname; face.log(_("[OTR] Ending secure session with \"") + username +"\"..."); otrl_message_disconnect(userstate, &ui_ops, NULL, accountname.c_str(), protocolname.c_str(), username.c_str()); } int imotr::yesno(const char *question) { string tmp; tmp = face.inputstr(" " + string(question) + _("yes/no") + " ", _("no")); while ((face.getlastinputkey() != KEY_ESC) && (tmp != _("yes")) && (tmp != _("no"))) { tmp = face.inputstr(_(" Please type 'yes' or 'no': "), _("no")); } if (face.getlastinputkey() == KEY_ESC) return -1; if (tmp == _("yes")) return 1; if (tmp == _("no")) return 0; } void imotr::dialog() { dialogbox db; int n, b, citem, node; string tmp; bool fin; protocolname pname; vector< pair< int, void* > > action; face.blockmainscreen(); db.setwindow(new textwindow(0, 0, face.sizeDlg.width, face.sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED, conf->getcolor(cp_dialog_highlight), _(" IM account manager "))); db.settree(new treeview(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), conf->getcolor(cp_dialog_highlight), conf->getcolor(cp_dialog_text))); db.setbar(new horizontalbar(conf->getcolor(cp_dialog_text), conf->getcolor(cp_dialog_selected), _("Change"), _("Done"), 0)); db.addautokeys(); db.idle = &face.dialogidle; treeview &t = *db.gettree(); map mod; for(protocolname pname = icq; pname != protocolname_size; pname++) mod[pname] = false; for(fin = false; !fin; ) { t.clear(); citem = 1; action.clear(); node = t.addnode(0, 0, 0, _(" Private keys ")); for (OtrlPrivKey *privkey = userstate->privkey_root; privkey != NULL; privkey = privkey->next) { string accountname = privkey->accountname; string protocol = privkey->protocol; char hash[45]; if (!otrl_privkey_fingerprint(userstate, hash, accountname.c_str(), protocol.c_str())) { strncpy(hash, _("Error calculating Fingerprint"), 45); } n = t.addnode(node, 0, 0, (_(" Account: ") + accountname + " ").c_str()); t.addleaff(n, 0, 0, (_(" Protocol: ") + protocol + " ").c_str()); t.addleaff(n, 0, 0, (_(" Fingerprint: ") + string(hash) + " ").c_str()); t.addleaff(n, 0, citem++, _(" Forget key ")); action.push_back(pair(0x100, privkey)); // t.addleaff(n, 0, citem++, " Generate new key "); // action.push_back(pair(0x101, privkey)); } // for (all privkeys) node = t.addnode(0, 0, 0, _(" Public keys ")); for (ConnContext *context = userstate->context_root; context != NULL; context = context->next) { char hash[45]; string username = context->username; string accountname = context->accountname; string protocol = context->protocol; n = t.addnode(node, 0, 0, (_(" User: ") + username + " ").c_str()); t.addleaff(n, 0, 0, (_(" Protocol: ") + protocol + " ").c_str()); t.addleaff(n, 0, 0, (_(" Account: ") + accountname + " ").c_str()); for (Fingerprint *fingerprint = context->fingerprint_root.next; fingerprint != NULL; fingerprint = fingerprint->next) { int newnode; string verified = (fingerprint->trust && (string(fingerprint->trust) == "yes")) ? _("Yes") : _("No"); otrl_privkey_hash_to_human(hash, fingerprint->fingerprint); newnode = t.addnode(n, 0, 0, (_(" Fingerprint: ") + string(hash) + " ").c_str()); t.addleaff(newnode, 0, citem++, (_(" Verified: ") + verified).c_str()); action.push_back(pair(0x200, fingerprint)); t.addleaff(newnode, 0, citem++, _(" Forget key ")); action.push_back(pair(0x201, fingerprint)); } if (context->active_fingerprint) { otrl_privkey_hash_to_human(hash, context->active_fingerprint->fingerprint); t.addleaff(n, 0, 0, (_(" Active fingerprint: ") + string(hash) + " ").c_str()); } } fin = !db.open(n, b, (void **) &citem) || (b == 1); if(!fin && citem) { int answer; citem--; switch (action[citem].first) { case (0x100): // forget privkey answer = yesno(_("Do you want to forget the selected key?")); if (answer == 1) { otrl_privkey_forget((OtrlPrivKey*)action[citem].second); write_fingerprints(); } break; case (0x101): // generate new privkey break; case (0x200): // verify fingerprint answer = yesno(_("Do you want verify the selected key?")); if (answer == -1) break; otrl_context_set_trust((Fingerprint*)action[citem].second, ((answer) ? "yes" : "no")); write_fingerprints(); break; case (0x201): // forget fingerprint answer = yesno(_("Do you want to forget the selected key?")); if (answer == 1) { otrl_context_forget_fingerprint((Fingerprint*)action[citem].second, 1); write_fingerprints(); } break; default: break; } } } db.close(); face.unblockmainscreen(); face.relaxedupdate(); } string imotr::get_msg_state(const protocolname pname, const string user) { if (pname != jabber) // at the moment, otr is only with jabber supported... { return _("No Jabber"); } ConnContext *context; string accountname = conf->getourid(pname).nickname + "@" + conf->getourid(pname).server; string protocolname = "jabber"; context = otrl_context_find(userstate, user.c_str(), accountname.c_str(), protocolname.c_str(), 0, NULL, NULL, NULL); if (!context) { return _("No OTR"); } switch (context->msgstate) { case (OTRL_MSGSTATE_PLAINTEXT): return _("Plaintext"); case (OTRL_MSGSTATE_ENCRYPTED): return _("Encrypted"); case (OTRL_MSGSTATE_FINISHED): return _("Finished"); default: return _("Unknown"); } } string imotr::is_verified(const protocolname pname, const string user) { if (pname != jabber) // at the moment, otr is only with jabber supported... { return _("No Jabber"); } ConnContext *context; string accountname = conf->getourid(pname).nickname + "@" + conf->getourid(pname).server; string protocolname = "jabber"; context = otrl_context_find(userstate, user.c_str(), accountname.c_str(), protocolname.c_str(), 0, NULL, NULL, NULL); if (context == NULL) { return _("No OTR"); } if (context->active_fingerprint == NULL) { return _("No Encryption"); } if (string(context->active_fingerprint->trust) == "yes") { return _("Verified"); } return _("Unverified"); } centerim-4.22.10/src/icqface.cc0000644000175000001440000032133311473007750013105 00000000000000/* * * centerim user interface class * $Id: icqface.cc,v 1.249 2005/08/28 01:33:21 konst Exp $ * * Copyright (C) 2001-2004 by Konstantin Klyagin * * 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 "icqconf.h" #ifdef HAVE_STDINT_H #include /* for intptr_t */ #endif #include "icqface.h" #include "centerim.h" #include "icqcontact.h" #include "icqcontacts.h" #include "icqmlist.h" #include "icqgroups.h" #include "abstracthook.h" #include "imlogger.h" #include "irchook.h" #include "imexternal.h" #include "impgp.h" #ifdef HAVE_LIBOTR #include "imotr.h" #endif const char *stryesno(bool b) { return b ? _("yes") : _("no"); } const char *strgender(imgender g) { switch(g) { case genderMale: return _("Male"); case genderFemale: return _("Female"); } return _("Not specified"); } const char *geteventviewresult(icqface::eventviewresult r) { switch(r) { case icqface::ok: return _("Ok"); case icqface::next: return _("Next"); case icqface::forward: return _("Fwd"); case icqface::reply: return _("Reply"); case icqface::open: return _("Open"); case icqface::accept: return _("Accept"); case icqface::reject: return _("Reject"); case icqface::info: return _("User info"); case icqface::add: return _("Add"); case icqface::prev: return _("Prev"); } return ""; } const char *strregsound(icqconf::regsound s) { switch(s) { case icqconf::rscard: return _("sound card"); case icqconf::rsspeaker: return _("speaker"); case icqconf::rsdisable: return _("disable"); } return _("don't change"); } const char *strregcolor(icqconf::regcolor c) { switch(c) { case icqconf::rcdark: return _("dark"); case icqconf::rcblue: return _("blue"); } return _("don't change"); } const char *strcolormode(icqconf::colormode cm) { switch(cm) { case icqconf::cmproto : return _("protocol"); case icqconf::cmstatus : return _("status"); } return _("don't change"); } const char *strint(unsigned int i) { static char buf[64]; if(i) { snprintf(buf, sizeof(buf), "%lu", i); } else { buf[0] = 0; } return buf; } const char *strgroupmode(icqconf::groupmode gmode) { switch(gmode) { case icqconf::group1: return _("mode 1"); case icqconf::group2: return _("mode 2"); } return _("no"); } icqface::icqface() { workareas.freeitem = &freeworkareabuf; #ifdef HAVE_NCURSESW workareas2.freeitem = &freeworkareabuf; #endif mainscreenblock = inited = onlinefolder = dotermresize = inchat = doredraw = false; mcontacts = 0; } icqface::~icqface() { kendinterface(); if(inited) { for(int i = 0; i < LINES; i++) printf("\n"); } if(conf->getdebug()) if(flog.is_open()) flog.close(); } void icqface::init() { if(conf->getdebug()) if(!flog.is_open()) { time_t logtime = time(0); flog.open((conf->getdirname() + "debug").c_str(), ios::app); if(flog.is_open()) flog << endl << "-- centerim debug log started on " << ctime(&logtime); } /* Calculate various sizes and coordinates */ sizeDlg.width = COLS-20; sizeDlg.height = LINES-10; sizeBigDlg.width = COLS-10; sizeBigDlg.height = LINES-7; sizeWArea.x1 = conf->getleftpanelwidth(); if(sizeWArea.x1 < MinPanelWidth || sizeWArea.x1 > (COLS - MinPanelWidth)) { sizeWArea.x1 = (int) (COLS*0.32); conf->setleftpanelwidth(sizeWArea.x1); } sizeWArea.x2 = COLS-1; sizeWArea.y1 = 1; sizeWArea.y2 = conf->getlogpanelheight(); if(sizeWArea.y2 < MinPanelHeight || sizeWArea.y2 > (LINES - MinPanelHeight)) { sizeWArea.y2 = (int) LINES / 4; conf->setlogpanelheight(sizeWArea.y2); } sizeWArea.y2 = LINES - sizeWArea.y2; if(!mcontacts) { mcontacts = new treeview(conf->getcolor(cp_main_menu), conf->getcolor(cp_main_selected), conf->getcolor(cp_main_menu), conf->getcolor(cp_main_menu)); } mcontacts->setcoords(1, 2, sizeWArea.x1, LINES-2); mcontacts->menu.idle = &menuidle; mcontacts->menu.otherkeys = &contactskeys; input.setcolor(conf->getcolor(cp_status)); input.idle = &textinputidle; mainw = textwindow(0, 1, COLS-1, LINES-2, conf->getcolor(cp_main_frame)); selector.setcolor(conf->getcolor(cp_dialog_menu), conf->getcolor(cp_dialog_highlight), conf->getcolor(cp_dialog_selected), conf->getcolor(cp_dialog_frame)); mhist = verticalmenu(conf->getcolor(cp_main_text), conf->getcolor(cp_main_selected)); attrset(conf->getcolor(cp_status)); mvhline(0, 0, ' ', COLS); mvhline(LINES, 0, ' ', COLS); inited = true; kt_resize_event = &termresize; } void icqface::done() { kt_resize_event = 0; workareas.empty(); xtermtitlereset(); } void icqface::draw() { mainw.open(); mainw.separatex(sizeWArea.x1); workarealine(sizeWArea.y2); mvhline(sizeWArea.y2, sizeWArea.x1, LTEE, 1); mvhline(sizeWArea.y2, sizeWArea.x2, RTEE, 1); update(); } void icqface::showtopbar() { string buf; protocolname pname; icqconf::imaccount ia; for(pname = icq; pname != protocolname_size; pname++) { ia = conf->getourid(pname); if(!ia.empty()) { buf += " "; buf += conf->getprotocolname(pname) + ":"; buf += imstatus2char[gethook(pname).getstatus()]; // buf += ">"; } } attrset(conf->getcolor(cp_status)); mvhline(0, 0, ' ', COLS); mvprintw(0, 0, _(" CENTERIM %s UNSENT: %lu"), centerim::version, em.getunsentcount()); mvprintw(0, COLS-buf.size()-1, "%s", buf.c_str()); } void icqface::update() { showtopbar(); fillcontactlist(); fneedupdate = false; if(doredraw) redraw(); } int icqface::contextmenu(icqcontact *c) { int i; static int lastr = 0; imcontact cont; char buf[64]; if(!c) return 0; verticalmenu m(conf->getcolor(cp_main_text), conf->getcolor(cp_main_selected)); static map actnames; if(actnames.empty()) { actnames[ACT_URL] = getmenuitem(_("Send an URL"), 25, key_send_url, section_contact); actnames[ACT_SMS] = _(" Send an SMS"); actnames[ACT_CONTACT] = getmenuitem(_("Send contacts"), 25, key_send_contact, section_contact); actnames[ACT_AUTH] = _(" Request authorization"); actnames[ACT_EDITUSER] = getmenuitem(_("Edit details"), 25, key_edit, section_contact); actnames[ACT_FETCHAWAY] = getmenuitem(_("Fetch away message"), 25, key_fetch_away_message, section_contact); actnames[ACT_ADD] = getmenuitem(_("Add to list"), 25, key_add, section_contact); actnames[ACT_RENAME] = getmenuitem(_("Rename contact"), 25, key_rename, section_contact); actnames[ACT_GROUPMOVE] = _(" Move to group.."); actnames[ACT_PING] = _(" Ping"); actnames[ACT_VERSION] = getmenuitem(_("Fetch version info"), 25, key_rename, section_contact); actnames[ACT_FILE] = _(" Send file(s)"); actnames[ACT_CONFER] = _(" Invite to conference.."); } if(ischannel(c)) { m.setwindow(textwindow(sizeWArea.x1, sizeWArea.y1, sizeWArea.x1+33, sizeWArea.y1+6, conf->getcolor(cp_main_text))); actnames[ACT_MSG] = _(" Send a channel message enter"); actnames[ACT_HISTORY] = getmenuitem(_("Channel chat history"), 25, key_history, section_contact); actnames[ACT_REMOVE] = _(" Remove channel del"); actnames[ACT_JOIN] = _(" Join channel"); actnames[ACT_LEAVE] = _(" Leave channel"); actnames[ACT_INFO] = getmenuitem(_("List nicknames"), 25, key_info, section_contact); if(lst.inlist(c, csignore)) actnames[ACT_IGNORE] = getmenuitem(_("UnBlock channel messages"), 25, key_ignore, section_contact); else actnames[ACT_IGNORE] = getmenuitem(_("Block channel messages"), 25, key_ignore, section_contact); } else { m.setwindow(textwindow(sizeWArea.x1, sizeWArea.y1, sizeWArea.x1+27, sizeWArea.y1+6, conf->getcolor(cp_main_text))); if(c->getdesc().pname != rss) actnames[ACT_MSG] = getmenuitem(_("Send a message"), 25, key_compose, section_contact); actnames[ACT_HISTORY] = getmenuitem(_("Event history"), 25, key_history, section_contact); actnames[ACT_REMOVE] = getmenuitem(_("Remove user"), 25, key_remove, section_contact); actnames[ACT_INFO] = getmenuitem(_("User's details"), 25, key_info, section_contact); actnames[ACT_EXTERN] = getmenuitem(_("External actions.."), 25, key_contact_external_action, section_contact); actnames[ACT_IGNORE] = getmenuitem(lst.inlist(c, csignore) ? _("Unset ignore user") : _("Ignore user"), 25, key_ignore, section_contact); actnames[ACT_PGPKEY] = c->getpgpkey().empty() ? _(" Assign PGP key..") : _(" Unassign PGP key"); snprintf(buf, sizeof(buf), _(" Turn PGP encryption %s"), c->getusepgpkey() ? "OFF" : "ON"); actnames[ACT_PGPSWITCH] = buf; if(c->getdesc().pname == rss) actnames[ACT_PING] = getmenuitem(_("Force check"), 25, key_rss_check, section_contact); } cont = c->getdesc(); set capab = gethook(cont.pname).getCapabs(); vector actions; vector::const_iterator ia; if(ischannel(cont)) { actions.push_back(ACT_MSG); actions.push_back(ACT_HISTORY); actions.push_back(ACT_REMOVE); actions.push_back(ACT_IGNORE); if(gethook(cont.pname).logged()) { actions.push_back(ACT_INFO); actions.push_back((c->getstatus() != offline) ? ACT_LEAVE : ACT_JOIN); } if(conf->getgroupmode() != icqconf::nogroups) actions.push_back(ACT_GROUPMOVE); } else if(c->getdesc().pname != rss) { if(cont.pname != infocard) actions.push_back(ACT_MSG); if(capab.count(hookcapab::urls)) actions.push_back(ACT_URL); if(!conf->getourid(icq).empty()) actions.push_back(ACT_SMS); if(capab.count(hookcapab::contacts)) actions.push_back(ACT_CONTACT); if(capab.count(hookcapab::authrequests)) actions.push_back(ACT_AUTH); if(capab.count(hookcapab::files)) actions.push_back(ACT_FILE); #ifdef HAVE_GPGME if(capab.count(hookcapab::pgp)) { actions.push_back(ACT_PGPKEY); if(pgp.havekey(c->getpgpkey())) actions.push_back(ACT_PGPSWITCH); } #endif if(!actions.empty()) actions.push_back(0); actions.push_back(ACT_INFO); actions.push_back(ACT_EDITUSER); if(c->getstatus() != offline) { if(capab.count(hookcapab::fetchaway)) actions.push_back(ACT_FETCHAWAY); if(capab.count(hookcapab::version)) actions.push_back(ACT_VERSION); if(capab.count(hookcapab::ping)) actions.push_back(ACT_PING); if(capab.count(hookcapab::conferencesaretemporary)) actions.push_back(ACT_CONFER); } actions.push_back(ACT_HISTORY); actions.push_back(ACT_EXTERN); actions.push_back(0); actions.push_back(ACT_IGNORE); if(!c->inlist()) actions.push_back(ACT_ADD); actions.push_back(ACT_REMOVE); actions.push_back(ACT_RENAME); if(conf->getgroupmode() != icqconf::nogroups && c->inlist()) actions.push_back(ACT_GROUPMOVE); } else { actions.push_back(ACT_HISTORY); actions.push_back(ACT_REMOVE); actions.push_back(ACT_IGNORE); actions.push_back(ACT_INFO); actions.push_back(ACT_EDITUSER); actions.push_back(ACT_PING); if(conf->getgroupmode() != icqconf::nogroups) actions.push_back(ACT_GROUPMOVE); } for(ia = actions.begin(); ia != actions.end(); ++ia) { if(*ia) { m.additem(0, *ia, actnames[*ia].c_str()); if(*ia == lastr) m.setpos(m.getcount()-1); } else { m.addline(); } } m.scale(); m.idle = &menuidle; i = (intptr_t) m.getref(m.open()-1); m.close(); if(i) lastr = i; return i; } int icqface::generalmenu() { int i, r = 0; static int lastitem = 0; verticalmenu m(conf->getcolor(cp_main_text), conf->getcolor(cp_main_selected)); m.setwindow(textwindow(sizeWArea.x1, sizeWArea.y1, sizeWArea.x1+40, sizeWArea.y1+11, conf->getcolor(cp_main_text))); m.idle = &menuidle; m.additem(0, ACT_STATUS, getmenuitem(_("Change status"), 38, key_change_status, section_contact)); m.additem(0, ACT_QUICKFIND, getmenuitem(_("Go to contact.."), 38, key_quickfind, section_contact)); m.additem(0, ACT_DETAILS, _(" Accounts..")); m.additem(0, ACT_CONF, _(" CenterIM config options")); #ifdef HAVE_LIBOTR m.additem(0, ACT_OTR, _(" OTR options and fingerprints")); #endif m.additem(0, ACT_TRANSFERS, _(" File transfers monitor")); m.addline(); m.additem(0, ACT_FIND, _(" Find/add users")); m.additem(0, ACT_JOINDIALOG, _(" Join channel/conference")); #ifdef BUILD_RSS m.additem(0, ACT_RSS, _(" Link an RSS feed")); #endif m.addline(); m.additem(0, ACT_IGNORELIST, _(" View/edit ignore list")); m.additem(0, ACT_INVISLIST, _(" View/edit invisible list")); m.additem(0, ACT_VISIBLELIST, _(" View/edit visible list")); m.addline(); if(conf->gethideoffline()) m.additem(0, ACT_HIDEOFFLINE, getmenuitem(_("Show offline users"), 38, key_hide_offline, section_contact)); else m.additem(0, ACT_HIDEOFFLINE, getmenuitem(_("Hide offline users"), 38, key_hide_offline, section_contact)); if(conf->getgroupmode() != icqconf::nogroups) { m.additem(0, ACT_ORG_GROUPS, _(" Organize contact groups")); m.additem(0, ACT_MASS_MOVE, _(" Mass group move..")); } m.setpos(lastitem); m.scale(); i = m.open(); m.close(); if(i) { lastitem = i-1; r = (intptr_t) m.getref(lastitem); } return r; } /* called to prepare the next chat contact, returns true if it found one, false otherwise parameter is true if its next chat contact or false if is the previous */ bool icqface::next_chat(bool next) { find_next_action = (next ? 1:-1); if (last_selected) last_selected->setopenedforchat(false); return true; } icqcontact *icqface::find_next_chat() { if (find_next_action == 0) return 0; int i; if (last_selected){ for(i = 0; i < clist.count && clist.at(i) != last_selected; i++) ; i += find_next_action; } else i = find_next_action == 1 ? 0 : clist.count -1; icqcontact *c; for (; i < clist.count && i >= 0; i += find_next_action){ c = (icqcontact *) clist.at(i); if (c->isopenedforchat() || c->hasevents()) { find_next_action = 0; extk = ACT_MSG; return c; } } find_next_action = 0; return 0; } icqcontact *icqface::mainloop(int &action) { int i, curid; icqcontact *c = 0, *c1 = 0; icqgroup *g; bool fin; for(fin = false; !fin; ) { extk = ACT_MSG; // Set vi keybindings if configured // if (conf->getvi()) { define_key("j", KEY_DOWN); define_key("k", KEY_UP); } /* Obtain the (icqcontact *) from the treeview. If a node is selected, throw out the contact and obtain the correct (icqgroup *). */ if (!(c = c1 = find_next_chat())){ //check if next_chat was called from inside a chat window last_selected = 0; // next_chat (if called) was called from contacts menu so there was no last selected contact c = (icqcontact *) mcontacts->open(&i); if ((c1 = find_next_chat())) c = c1; //check if next_chat was called from contacts menu } if(!c1 && c && mcontacts->isnode(i)) { c = 0; g = (icqgroup *) mcontacts->getref(mcontacts->getid(mcontacts->menu.getpos())); } else { g = 0; } if((intptr_t) c < 100) c = 0; if(i) { switch(action = extk) { case ACT_GMENU: if(!(action = generalmenu())) { continue; } else { fin = true; } break; } if(c) { if(action == ACT_MSG && !c->hasevents()) { switch(c->getdesc().pname) { case infocard: action = ACT_SMS; break; case livejournal: action = ACT_LJ; break; } } if(action == ACT_MENU) if(!(action = contextmenu(c))) continue; } else { switch(action) { case ACT_MSG: curid = mcontacts->getid(mcontacts->menu.getpos()); /* kkconsui::treeview has collapsing built in, but when doing it this way contacts with pending messages get moved to the top even if their group is colapsed. */ if(mcontacts->isnodeopen(curid)) { mcontacts->closenode(curid); } else { mcontacts->opennode(curid); } /* Handling of collapse events should happen in centerim:: mainloop, but as it stands this method doesn't handle icqgroups, only icqcontacts, so we'll deal with collapsing here. */ if(g) { g->changecollapsed(); update(); } break; case ACT_QUIT: case ACT_STATUS: case ACT_FIND: case ACT_QUICKFIND: case ACT_HIDEOFFLINE: break; default: continue; } } break; } } if (c) last_selected = c; // If vi bindings configured, // do not restore bindings for these // if (conf->getvi()) { if (action == ACT_STATUS || action == ACT_GROUPMOVE || action == ACT_REMOVE || action == ACT_IGNORE || action == ACT_INFO || action == ACT_FETCHAWAY || action == ACT_VERSION || action == ACT_HISTORY || action == ACT_EXTERN || action == ACT_TRANSFERS || action == ACT_IGNORELIST || action == ACT_INVISLIST || action == ACT_VISIBLELIST || action == ACT_HIDEOFFLINE || action == ACT_ORG_GROUPS || action == ACT_MASS_MOVE ) { } else { define_key("j", 'j'); define_key("k", 'k'); } } return c; } #define ADDGROUP(nn) { \ if(groupchange && !strchr("!", sc)) \ ngroup = mcontacts->addnode(nn, conf->getcolor(cp_main_highlight), \ g, " " + g->getname() + " " \ + (g->iscollapsed() ? "(" + string(i2str(g->getcount(c->getstatus() != offline, !conf->gethideoffline() && !(c->getstatus() != offline && conf->getgroupmode() == icqconf::group2)))) + ") " : "")); \ } void icqface::fillcontactlist() { int i, nnode, ngroup, prevgid, n, nonline; string dnick; icqcontact *c; icqcontact::basicinfo bi; void *savec; char prevsc = 'x', sc; icqgroup *g = NULL; vector::iterator ig; bool online_added, prevoffline, grouponline, groupchange, ontop, iscurrentnode, birthday; time_t timer = time(0); grouponline = true; online_added = prevoffline = false; nnode = ngroup = prevgid = 0; iscurrentnode = mcontacts->isnode(mcontacts->getid(mcontacts->menu.getpos())); ontop = !mcontacts->menu.getpos() && iscurrentnode; savec = mcontacts->getref(mcontacts->getid(mcontacts->menu.getpos())); int ccolor = conf->getcolor(cp_main_text); if(!iscurrentnode && savec) { ig = find(groups.begin(), groups.end(), ((icqcontact *) savec)->getgroupid()); if(ig != groups.end()) { g = &(*ig); if(g->iscollapsed() && !((icqcontact *) savec)->hasevents()) savec = g; } } /* if savec is a group, we need to figure out of it's the top or bottom one when we're in groupmode mode 2. */ if(savec && iscurrentnode && conf->getgroupmode() == icqconf::group2) { for(i = 0; i < mcontacts->getcount(); i++) { if(mcontacts->getref(mcontacts->getid(i)) == savec) { if(mcontacts->getid(i) != mcontacts->getid(mcontacts->menu.getpos())) grouponline = false; break; } } } mcontacts->clear(); clist.order(); for(i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); ig = find(groups.begin(), groups.end(), c->getgroupid()); if(ig != groups.end()) { g = &(*ig); } if(c->getdesc() == contactroot) continue; c->remindbirthday(birthday = c->isbirthday()); abstracthook &h = gethook(c->getdesc().pname); if(c->getstatus() == offline) if(conf->gethideoffline()) if(!c->hasevents()) if(c->inlist() || !h.logged() || h.getCapabs().count(hookcapab::cltemporary)) { continue; } sc = icqcontacts::sort_order->sortstatus(*c); groupchange = (conf->getgroupmode() != icqconf::nogroups) && ((c->getgroupid() != prevgid) || ((conf->getgroupmode() == icqconf::group2) && (prevoffline == false) && (c->getstatus() == offline))) && (sc != '#'); if(conf->getgroupmode() == icqconf::group1) ADDGROUP(0); if(groupchange || (sc != '#')) { if(strchr("candilfo", sc)) sc = 'O'; if((sc != prevsc) || groupchange) { switch(conf->getgroupmode()) { case icqconf::group1: n = ngroup; break; case icqconf::group2: if(prevsc == sc) { n = -1; } else { n = 0; } break; default: n = 0; break; } /* Hide 'offline' and 'online' items when in group mode 1 and the current group is collapsed */ if(n != -1) { switch(sc) { case 'O': nnode = (conf->getgroupmode() == icqconf::group1 && g->iscollapsed()) || (conf->gethideoffline() && (conf->getgroupmode() != icqconf::nogroups)) ? n : mcontacts->addnode(n, conf->getcolor(cp_main_highlight), 0, " Online "); online_added = true; break; case '_': nnode = (conf->getgroupmode() == icqconf::group1 && g->iscollapsed()) ? n : mcontacts->addnode(n, conf->getcolor(cp_main_highlight), 0, " Offline "); break; case '!': ngroup = 0; nnode = mcontacts->addnode(ngroup, conf->getcolor(cp_main_highlight), 0, " Not in list "); break; } nonline = nnode; } if(conf->getgroupmode() == icqconf::group2) if(groupchange && (sc != '!')) { ADDGROUP(nonline); nnode = ngroup; } } if(groupchange) prevgid = c->getgroupid(); prevoffline = (c->getstatus() == offline) ? true : false; prevsc = sc; } dnick = c->getdispnick(); if(birthday) dnick += " :)"; bi = c->getbasicinfo(); if(bi.authawait) dnick += " !A"; if(conf->getgroupmode() != icqconf::nogroups && g->iscollapsed() && !c->hasevents() && sc != '!') continue; if(conf->getcolormode() == icqconf::cmstatus) { ccolor = conf->getstatuscolor(c->getstatus()); } else { ccolor = conf->getprotcolor(c->getdesc().pname); } if(c->getstatus() == offline) { mcontacts->addleaff(nnode, c->hasevents() ? conf->getcolor(cp_main_highlight) : ccolor, c, "%s%s ", c->hasevents() ? "#" : c->getpostponed().empty() ? (c->isopenedforchat() ? "*" : " ") : ">", dnick.c_str()); } else { if(conf->getcolormode() == icqconf::cmstatus) { // When: 'Color contacts according to: status' is selected; protocol is not visible. Ordered by status char *fmt = "%s[%c]%s%s "; if(lst.inlist(c->getdesc(), csvisible)) fmt = "%s<%c>%s%s "; else if(lst.inlist(c->getdesc(), csinvisible)) fmt = "%s{%c}%s%s "; char shortstatus = c->getshortstatus(); if(c->getlasttyping()) { if(timer-c->getlasttyping() > PERIOD_TYPING) c->setlasttyping(0); else shortstatus = 'T'; } mcontacts->addleaff(nnode, c->hasevents() ? conf->getcolor(cp_main_highlight) : ccolor, c, fmt, c->hasevents() ? "#" : (c->isopenedforchat() ? "*" : " "), shortstatus, c->getpostponed().empty() ? " " : ">", dnick.c_str()); } else { // Color contact by protocol. Ordered by status char *fmt = "%s[%c]%s%s "; if(lst.inlist(c->getdesc(), csvisible)) fmt = "%s<%c>%s%s "; else if(lst.inlist(c->getdesc(), csinvisible)) fmt = "%s{%c}%s%s "; char shortstatus = c->getshortstatus(); if(c->getlasttyping()) { if(timer-c->getlasttyping() > PERIOD_TYPING) c->setlasttyping(0); else shortstatus = 'T'; } mcontacts->addleaff(nnode, c->hasevents() ? conf->getcolor(cp_main_highlight) : ccolor, c, fmt, c->hasevents() ? "#" : (c->isopenedforchat() ? "*" : " "), shortstatus, c->getpostponed().empty() ? " " : ">", dnick.c_str()); } } } if(!mainscreenblock) { mcontacts->redraw(); if (inchat && ineditor) { workarealine(sizeWArea.y2); drawopenedchats(chatlines + sizeWArea.y1 + 1, sizeWArea.x2 - 32); } else { drawopenedchats(sizeWArea.y2, sizeWArea.x2 - 1); } } if(!savec || ontop || (!onlinefolder && online_added && conf->gethideoffline())) { mcontacts->menu.setpos(0); } else if(savec) { for(i = 0; i < mcontacts->menu.getcount(); i++) if(mcontacts->getref(mcontacts->getid(i)) == savec) { if(!grouponline) grouponline = true; else { mcontacts->menu.setpos(i); break; } } } onlinefolder = online_added; if(!mainscreenblock) mcontacts->menu.redraw(); } bool icqface::findresults(const imsearchparams &sp, bool fauto) { bool finished = false, ret = false; icqcontact *c; dialogbox db; int r, b; saveworkarea(); clearworkarea(); abstracthook &h = gethook(sp.pname); db.setwindow(new textwindow(sizeWArea.x1+1, sizeWArea.y1+2, sizeWArea.x2, sizeWArea.y2, conf->getcolor(cp_main_text), TW_NOBORDER)); db.setmenu(new verticalmenu(conf->getcolor(cp_main_menu), conf->getcolor(cp_main_selected))); if(!h.getCapabs().count(hookcapab::nochat)) { db.setbar(new horizontalbar(conf->getcolor(cp_main_highlight), conf->getcolor(cp_main_selected), _("Details"), _("Message"), _("Add"), fauto ? 0 : _("New search"), (char*)0)); } else { db.setbar(new horizontalbar(conf->getcolor(cp_main_highlight), conf->getcolor(cp_main_selected), _("Details"), _("Add"), fauto ? 0 : _("New search"), (char*)0)); } db.addautokeys(); db.redraw(); if(!sp.nick.empty() && h.getCapabs().count(hookcapab::directadd)) { imcontact ic(sp.nick, sp.pname); static icqcontact *singlec = 0, *c; delete singlec; singlec = 0; mainw.write(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), _("Contact to add")); c = clist.get(ic); if(!c) c = singlec = new icqcontact(ic); db.getmenu()->additem(conf->getprotcolor(sp.pname), c, (string) " " + sp.nick); } else { mainw.write(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), _("Searching contacts..")); h.lookup(sp, *db.getmenu()); } db.idle = &dialogidle; db.otherkeys = &findreskeys; workarealine(sizeWArea.y1+2); workarealine(sizeWArea.y2-2); while(!finished) { finished = !db.open(r, b); h.stoplookup(); if(h.getCapabs().count(hookcapab::nochat) && b > 0) b++; if(!finished) { if(r == -3) { quickfind(db.getmenu()); } else switch(b) { case 0: if(r) { c = (icqcontact *) db.getmenu()->getref(r-1); if(c) cicq.userinfo(c->getdesc()); } break; case 1: if(r) { bool existed; if(c = (icqcontact *) db.getmenu()->getref(r-1)) { imcontact cont = c->getdesc(); existed = (c = clist.get(cont)); if(!existed) c = clist.addnew(cont); if(c) if(!cicq.sendevent(immessage(cont, imevent::outgoing, ""), icqface::ok)) if(!existed) clist.remove(cont); } } break; case 2: if(r) { c = (icqcontact *) db.getmenu()->getref(r-1); if(c) cicq.addcontact(c->getdesc(), c->getbasicinfo().requiresauth); } break; case 3: ret = finished = true; break; } } } db.close(); restoreworkarea(); return ret; } void icqface::findready() { mvhline(sizeWArea.x1+2, sizeWArea.y1, ' ', sizeWArea.x2-sizeWArea.x1-2); mainw.write(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), _("Search results [done]")); } void icqface::infoclear(dialogbox &db, icqcontact *c, const imcontact realdesc) { for(int i = sizeWArea.y1+1; i < sizeWArea.y2; i++) { workarealine(i, ' '); } db.redraw(); mainw.writef(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), _("Information about %s"), realdesc.totext().c_str()); workarealine(sizeWArea.y1+2); workarealine(sizeWArea.y2-2); icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); icqcontact::workinfo wi = c->getworkinfo(); extracturls(bi.city + " " + bi.state + " " + bi.street + " " + wi.city + " " + wi.state + " " + wi.street + " " + wi.company + " " + wi.dept + " " + wi.position + " " + c->getabout()); if(!mi.homepage.empty()) extractedurls.push_back(mi.homepage); if(!wi.homepage.empty()) extractedurls.push_back(wi.homepage); } void commacat(string &text, string sub, bool nocomma = false) { if(!sub.empty()) { if(!nocomma) if(text[text.size()-1] != ',') text += ","; text += sub; } } void commaform(string &text) { int pos = 0, ipos; while((pos = text.find(",", pos)) != -1) { if(text.substr(pos+1, 1) != " ") { text.insert(pos+1, " "); } ipos = pos-1; while(ipos > 0) { if(text.substr(ipos, 1) == " ") { text.erase(ipos--, 1); } else { break; } } pos++; } } void icqface::infolivejournal(dialogbox &db, icqcontact *c) { icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); workarealine(sizeWArea.y1+5); workarealine(sizeWArea.y1+7); mainw.write(sizeWArea.x1+2, sizeWArea.y1+2, conf->getcolor(cp_main_highlight), _("Nickname")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+3, conf->getcolor(cp_main_highlight), _("Name")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+5, conf->getcolor(cp_main_highlight), _("URL")); mainw.write(sizeWArea.x1+14, sizeWArea.y1+2, conf->getcolor(cp_main_text), c->getnick()); mainw.write(sizeWArea.x1+14, sizeWArea.y1+3, conf->getcolor(cp_main_text), bi.fname + " " + bi.lname); mainw.write(sizeWArea.x1+14, sizeWArea.y1+5, conf->getcolor(cp_main_text), mi.homepage); mainw.write(sizeWArea.x1+2, sizeWArea.y1+7, conf->getcolor(cp_main_highlight), _("This is your LiveJournal account. Use it to")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+8, conf->getcolor(cp_main_highlight), _("post new entries to your journal.")); } void icqface::infofriends(dialogbox &db, icqcontact *c) { string text, buf; icqcontact::basicinfo bi = c->getbasicinfo(); text += (string) "* " + _("The following users have you listed as their friend:") + " "; while(!(buf = getword(bi.zip)).empty()) { text += buf; if(!bi.zip.empty()) text += ", "; } db.getbrowser()->setbuf(text); } void icqface::infogeneral(dialogbox &db, icqcontact *c) { string langs, options, buf; icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); workarealine(sizeWArea.y1+8); workarealine(sizeWArea.y1+12); #ifdef HAVE_GPGME if(gethook(c->getdesc().pname).getCapabs().count(hookcapab::pgp)) if(!c->getpgpkey().empty()) { buf = (string) "[" + string(5, ' ') + c->getpgpkey() + ": "; if(pgp.havekey(c->getpgpkey())) { buf += _("found"); buf += ", "; buf += (pgp.enabled(c) ? _("used") : _("not used")); } else { buf += _("not found"); } buf += " ]"; mainw.write(sizeWArea.x2-buf.size()-1, sizeWArea.y1+11, conf->getcolor(cp_main_text), buf); mainw.write(sizeWArea.x2-buf.size()+1, sizeWArea.y1+11, conf->getcolor(cp_main_highlight), "PGP"); } #endif mainw.write(sizeWArea.x1+2, sizeWArea.y1+2, conf->getcolor(cp_main_highlight), _("Nickname")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+3, conf->getcolor(cp_main_highlight), _("Name")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+4, conf->getcolor(cp_main_highlight), _("E-mail")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+5, conf->getcolor(cp_main_highlight), _("2nd e-mail")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+6, conf->getcolor(cp_main_highlight), _("Old e-mail")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+8, conf->getcolor(cp_main_highlight), _("Gender")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+9, conf->getcolor(cp_main_highlight), _("Birthdate")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+10, conf->getcolor(cp_main_highlight), _("Age")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+12, conf->getcolor(cp_main_highlight), _("Languages")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+13, conf->getcolor(cp_main_highlight), _("Last IP")); mainw.write(sizeWArea.x1+14, sizeWArea.y1+2, conf->getcolor(cp_main_text), c->getnick()); mainw.write(sizeWArea.x1+14, sizeWArea.y1+3, conf->getcolor(cp_main_text), bi.fname + " " + bi.lname); mainw.write(sizeWArea.x1+14, sizeWArea.y1+4, conf->getcolor(cp_main_text), bi.email); mainw.write(sizeWArea.x1+14, sizeWArea.y1+8, conf->getcolor(cp_main_text), strgender(mi.gender)); mainw.write(sizeWArea.x1+14, sizeWArea.y1+9, conf->getcolor(cp_main_text), mi.strbirthdate()); mainw.write(sizeWArea.x1+14, sizeWArea.y1+10, conf->getcolor(cp_main_text), mi.age ? i2str(mi.age) : ""); if(mi.lang1) commacat(langs, abstracthook::getLanguageIDtoString(mi.lang1), langs.empty()); if(mi.lang2) commacat(langs, abstracthook::getLanguageIDtoString(mi.lang2), langs.empty()); if(mi.lang3) commacat(langs, abstracthook::getLanguageIDtoString(mi.lang3), langs.empty()); commaform(langs); mainw.write(sizeWArea.x1+14, sizeWArea.y1+12, conf->getcolor(cp_main_text), langs); mainw.write(sizeWArea.x1+14, sizeWArea.y1+13, conf->getcolor(cp_main_text), c->getlastip()); time_t ls; buf = ""; int offs = 15; if(c->getstatus() == offline) { ls = c->getlastseen(); mainw.write(sizeWArea.x1+2, sizeWArea.y1+14, conf->getcolor(cp_main_highlight), _("Last seen")); mainw.write(sizeWArea.x1+14, sizeWArea.y1+14, conf->getcolor(cp_main_text), ls ? strdateandtime(ls) : _("Never")); } else if(c->getdesc() != contactroot) { ls = c->getonlinesince(); if (!ls) ls = c->getlastseen(); int days, hours, minutes, tdiff = timer_current-ls; days = (int) (tdiff/86400); hours = (int) ((tdiff-days*86400)/3600); minutes = (int) ((tdiff-days*86400-hours*3600)/60); if(days) buf = i2str(days) + " " + _("days"); if(hours) { if(!buf.empty()) buf += ", "; buf += i2str(hours) + " " + _("hours"); } if(minutes) { if(!buf.empty()) buf += ", "; buf += i2str(minutes) + " " + _("min"); } if(buf.empty()) buf = i2str(tdiff) + " " + _("seconds"); if (c->getidlefor() > 0) { string buf2; tdiff = timer_current-c->getidlefor(); days = (int) (tdiff/86400); hours = (int) ((tdiff-days*86400)/3600); minutes = (int) ((tdiff-days*86400-hours*3600)/60); if(days) buf2 = i2str(days) + " " + _("days"); if(hours) { if(!buf2.empty()) buf2 += ", "; buf2 += i2str(hours) + " " + _("hours"); } if(minutes) { if(!buf2.empty()) buf2 += ", "; buf2 += i2str(minutes) + " " + _("min"); } buf += " (" + buf2 + " " + _("idle") + ")"; } mainw.write(sizeWArea.x1+2, sizeWArea.y1+14, conf->getcolor(cp_main_highlight), _("Online")); mainw.write(sizeWArea.x1+14, sizeWArea.y1+14, conf->getcolor(cp_main_text), buf); } buf = ""; if (bi.serverbased) buf += _("Server-based contact"); if (bi.authawait) { if (!buf.empty()) buf += ", "; buf += _("Awaiting authorization"); } if (!buf.empty()) { mainw.write(sizeWArea.x1+2, sizeWArea.y1+offs, conf->getcolor(cp_main_highlight), buf); offs++; } // if (buf.empty()) if(!bi.avatar.empty()) { mainw.write(sizeWArea.x1+2, sizeWArea.y1+offs, conf->getcolor(cp_main_highlight), _("Avatar file")); mainw.write(sizeWArea.x1+14, sizeWArea.y1+offs, conf->getcolor(cp_main_text), bi.avatar); offs++; } } void icqface::infohome(dialogbox &db, icqcontact *c) { int i, x; icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); workarealine(sizeWArea.y1+10); x = sizeWArea.x1+2; mainw.write(x, sizeWArea.y1+2, conf->getcolor(cp_main_highlight), _("Address")); mainw.write(x, sizeWArea.y1+3, conf->getcolor(cp_main_highlight), _("Location")); mainw.write(x, sizeWArea.y1+4, conf->getcolor(cp_main_highlight), _("Zip code")); mainw.write(x, sizeWArea.y1+5, conf->getcolor(cp_main_highlight), _("Phone")); mainw.write(x, sizeWArea.y1+6, conf->getcolor(cp_main_highlight), _("Fax")); mainw.write(x, sizeWArea.y1+7, conf->getcolor(cp_main_highlight), _("Cellular")); mainw.write(x, sizeWArea.y1+8, conf->getcolor(cp_main_highlight), _("Timezone")); mainw.write(x, sizeWArea.y1+10, conf->getcolor(cp_main_highlight), _("Homepage")); if(!bi.state.empty()) { if(bi.city.size()) bi.city += ", "; bi.city += bi.state; } if(bi.country) { if(bi.city.size()) bi.city += ", "; bi.city += abstracthook::getCountryIDtoString(bi.country); } x += 10; mainw.write(x, sizeWArea.y1+2, conf->getcolor(cp_main_text), bi.street); mainw.write(x, sizeWArea.y1+3, conf->getcolor(cp_main_text), bi.city); mainw.write(x, sizeWArea.y1+4, conf->getcolor(cp_main_text), bi.zip); mainw.write(x, sizeWArea.y1+5, conf->getcolor(cp_main_text), bi.phone); mainw.write(x, sizeWArea.y1+6, conf->getcolor(cp_main_text), bi.fax); mainw.write(x, sizeWArea.y1+7, conf->getcolor(cp_main_text), bi.cellular); mainw.write(x, sizeWArea.y1+8, conf->getcolor(cp_main_text), mi.strtimezone()); for(i = 0; !mi.homepage.empty(); i++) { mainw.write(x, sizeWArea.y1+10+i, conf->getcolor(cp_main_text), mi.homepage.substr(0, sizeWArea.x2-sizeWArea.x1-12)); mi.homepage.erase(0, sizeWArea.x2-sizeWArea.x1-12); } } void icqface::infowork(dialogbox &db, icqcontact *c) { int i; icqcontact::workinfo wi = c->getworkinfo(); workarealine(sizeWArea.y1+6); workarealine(sizeWArea.y1+11); mainw.write(sizeWArea.x1+2, sizeWArea.y1+2, conf->getcolor(cp_main_highlight), _("Address")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+3, conf->getcolor(cp_main_highlight), _("Location")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+4, conf->getcolor(cp_main_highlight), _("Zip code")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+6, conf->getcolor(cp_main_highlight), _("Company")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+7, conf->getcolor(cp_main_highlight), _("Department")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+8, conf->getcolor(cp_main_highlight), _("Title")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+11, conf->getcolor(cp_main_highlight), _("Phone")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+12, conf->getcolor(cp_main_highlight), _("Fax")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+13, conf->getcolor(cp_main_highlight), _("Homepage")); if(!wi.state.empty()) { if(wi.city.size()) wi.city += ", "; wi.city += wi.state; } if(wi.country) { if(wi.city.size()) wi.city += ", "; wi.city += abstracthook::getCountryIDtoString(wi.country); } mainw.write(sizeWArea.x1+14, sizeWArea.y1+2, conf->getcolor(cp_main_text), wi.street); mainw.write(sizeWArea.x1+14, sizeWArea.y1+3, conf->getcolor(cp_main_text), wi.city); mainw.write(sizeWArea.x1+14, sizeWArea.y1+4, conf->getcolor(cp_main_text), wi.zip); mainw.write(sizeWArea.x1+14, sizeWArea.y1+6, conf->getcolor(cp_main_text), wi.company); mainw.write(sizeWArea.x1+14, sizeWArea.y1+7, conf->getcolor(cp_main_text), wi.dept); mainw.write(sizeWArea.x1+14, sizeWArea.y1+8, conf->getcolor(cp_main_text), wi.position); mainw.write(sizeWArea.x1+14, sizeWArea.y1+11, conf->getcolor(cp_main_text), wi.phone); mainw.write(sizeWArea.x1+14, sizeWArea.y1+12, conf->getcolor(cp_main_text), wi.fax); for(i = 0; !wi.homepage.empty(); i++) { mainw.write(sizeWArea.x1+14, sizeWArea.y1+13+i, conf->getcolor(cp_main_text), wi.homepage.substr(0, sizeWArea.x2-sizeWArea.x1-14)); wi.homepage.erase(0, sizeWArea.x2-sizeWArea.x1-14); } } void icqface::infoabout(dialogbox &db, icqcontact *c) { db.getbrowser()->setbuf(c->getabout()); } void icqface::infointerests(dialogbox &db, icqcontact *c) { string text; vector data; vector::iterator i; data = c->getinterests(); if(!data.empty()) { text += (string) "* " + _("Interests") + "\n"; for(i = data.begin(); i != data.end(); ++i) { text += " + " + *i + "\n"; } text += "\n"; } data = c->getbackground(); if(!data.empty()) { text += (string) "* " + _("Background") + "\n"; for(i = data.begin(); i != data.end(); ++i) text += " + " + *i + "\n"; } commaform(text); db.getbrowser()->setbuf(text); } void icqface::inforss(dialogbox &db, icqcontact *c) { icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); icqcontact::workinfo wi = c->getworkinfo(); workarealine(sizeWArea.y1+7); workarealine(sizeWArea.y1+10); mainw.write(sizeWArea.x1+2, sizeWArea.y1+2, conf->getcolor(cp_main_highlight), _("Handle")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+3, conf->getcolor(cp_main_highlight), _("RSS doc")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+4, conf->getcolor(cp_main_highlight), _("Version")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+5, conf->getcolor(cp_main_highlight), _("Encoding")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+7, conf->getcolor(cp_main_highlight), _("Title")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+8, conf->getcolor(cp_main_highlight), _("Link")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+10, conf->getcolor(cp_main_highlight), _("Frequency")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+11, conf->getcolor(cp_main_highlight), _("Last check")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+12, conf->getcolor(cp_main_highlight), _("Next check")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+13, conf->getcolor(cp_main_highlight), _("Last result")); mainw.write(sizeWArea.x1+14, sizeWArea.y1+2, conf->getcolor(cp_main_text), c->getnick()); mainw.write(sizeWArea.x1+14, sizeWArea.y1+3, conf->getcolor(cp_main_text), wi.homepage); mainw.write(sizeWArea.x1+14, sizeWArea.y1+4, conf->getcolor(cp_main_text), bi.city); mainw.write(sizeWArea.x1+14, sizeWArea.y1+5, conf->getcolor(cp_main_text), bi.state); mainw.write(sizeWArea.x1+14, sizeWArea.y1+7, conf->getcolor(cp_main_text), bi.fname); mainw.write(sizeWArea.x1+14, sizeWArea.y1+8, conf->getcolor(cp_main_text), mi.homepage); string freq, last, next; char buf[512]; if(mi.checkfreq) { snprintf(buf, sizeof(buf), _("%lu minutes"), mi.checkfreq); freq = buf; if(mi.checklast) next = strdateandtime(mi.checklast+mi.checkfreq*60); else next = _("Now"); } else { freq = next = _("Never"); } if(mi.checklast) last = strdateandtime(mi.checklast); else last = _("Never"); mainw.write(sizeWArea.x1+14, sizeWArea.y1+10, conf->getcolor(cp_main_text), freq); mainw.write(sizeWArea.x1+14, sizeWArea.y1+11, conf->getcolor(cp_main_text), last); mainw.write(sizeWArea.x1+14, sizeWArea.y1+12, conf->getcolor(cp_main_text), next); mainw.write(sizeWArea.x1+14, sizeWArea.y1+13, conf->getcolor(cp_main_text), bi.lname); } void icqface::infoljrss(dialogbox &db, icqcontact *c) { icqcontact::basicinfo bi = c->getbasicinfo(); icqcontact::moreinfo mi = c->getmoreinfo(); mainw.write(sizeWArea.x1+2, sizeWArea.y1+2, conf->getcolor(cp_main_highlight), _("Birthdate")); mainw.write(sizeWArea.x1+2, sizeWArea.y1+3, conf->getcolor(cp_main_highlight), _("Full name")); mainw.write(sizeWArea.x1+14, sizeWArea.y1+2, conf->getcolor(cp_main_text), mi.strbirthdate()); mainw.write(sizeWArea.x1+14, sizeWArea.y1+3, conf->getcolor(cp_main_text), bi.email); } void icqface::userinfo(const imcontact &cinfo, const imcontact &realinfo) { bool finished = false, showinfo; textbrowser tb(conf->getcolor(cp_main_text)); dialogbox db; int k, lastb, b; imcontact savepassinfo = passinfo; icqcontact *c = clist.get(passinfo = realinfo); b = lastb = 0; saveworkarea(); clearworkarea(); status(_("%s to URLs, %s external actions, %s close"), getstatkey(key_show_urls, section_info).c_str(), getstatkey(key_user_external_action, section_info).c_str(), getstatkey(key_quit, section_editor).c_str()); xtermtitle(_("user info for %s"), realinfo.totext().c_str()); db.setwindow(new textwindow(sizeWArea.x1+1, sizeWArea.y1+2, sizeWArea.x2, sizeWArea.y2, conf->getcolor(cp_main_text), TW_NOBORDER)); if(cinfo.pname == rss) { if(c->inlist() && realinfo != contactroot) { db.setbar(new horizontalbar(sizeWArea.x1+2, sizeWArea.y2-1, conf->getcolor(cp_main_highlight), conf->getcolor(cp_main_selected), _("Info"), _("About"), _("Check"), _("Edit"), islivejournal(c) ? _("LJ") : 0, (char*)0)); } else { db.setbar(new horizontalbar(sizeWArea.x1+2, sizeWArea.y2-1, conf->getcolor(cp_main_highlight), conf->getcolor(cp_main_selected), _("Info"), _("About"), _("Retreive"), (char*)0)); } } else if(cinfo.pname == livejournal) { db.setbar(new horizontalbar(sizeWArea.x1+2, sizeWArea.y2-1, conf->getcolor(cp_main_highlight), conf->getcolor(cp_main_selected), _("Info"), _("Friend of"), (char*)0)); } else { db.setbar(new horizontalbar(sizeWArea.x1+2, sizeWArea.y2-1, conf->getcolor(cp_main_highlight), conf->getcolor(cp_main_selected), _("Info"), _("Home"), _("Work"), _("More"), _("About"), cinfo.pname != infocard ? _("Retrieve") : _("Edit"), (char*)0)); } showinfo = true; db.addautokeys(); db.idle = &dialogidle; db.otherkeys = &userinfokeys; while(!finished) { if(!showinfo) { if(cicq.idle(HIDL_SOCKEXIT)) { finished = !db.open(k, b); showinfo = !finished; } } if(c->updated()) { showinfo = true; c->unsetupdated(); } if(showinfo) { db.setbrowser(0); infoclear(db, c, cinfo); if(cinfo.pname == rss) switch(b) { case 0: inforss(db, c); break; case 1: db.setbrowser(&tb, false); infoabout(db, c); infoclear(db, c, cinfo); break; case 2: gethook(cinfo.pname).ping(c); b = lastb; continue; case 3: updatedetails(c, c->getdesc().pname); showinfo = true; b = lastb; continue; case 4: infoljrss(db, c); break; } else if(cinfo.pname == livejournal) switch(b) { case 0: infolivejournal(db, c); break; case 1: db.setbrowser(&tb, false); infofriends(db, c); infoclear(db, c, cinfo); break; } else switch(b) { case 0: infogeneral(db, c); break; case 1: infohome(db, c); break; case 2: infowork(db, c); break; case 3: db.setbrowser(&tb, false); infointerests(db, c); infoclear(db, c, cinfo); break; case 4: db.setbrowser(&tb, false); infoabout(db, c); infoclear(db, c, cinfo); break; case 5: switch(cinfo.pname) { case infocard: updatedetails(c); showinfo = true; break; default: gethook(cinfo.pname).requestinfo(cinfo); break; } b = lastb; continue; } refresh(); showinfo = false; lastb = b; } } db.close(); restoreworkarea(); status("@"); passinfo = savepassinfo; } void icqface::makeprotocolmenu(verticalmenu &m) { icqconf::imaccount ia; protocolname ipname; static const string pitems[protocolname_size] = { _(" [icq] ICQ network"), _(" [yahoo] YAIM"), _(" [msn] M$ Messenger"), _(" [aim] AOL TOC"), _(" [irc] IRC"), _(" [jab] Jabber"), "", _(" [lj] LiveJournal"), _(" [gg] Gadu-Gadu"), "" }; for(ipname = icq; ipname != protocolname_size; ipname++) { ia = conf->getourid(ipname); if(!ia.empty()) { m.additem(0, ipname, pitems[ipname]); } } } bool icqface::changestatus(vector &pnames, imstatus &st) { int i, choice, protcount; bool r, alrlogged = false; verticalmenu m(conf->getcolor(cp_main_text), conf->getcolor(cp_main_selected)); vector mst; vector::iterator im; protocolname pname, onechoice; m.setwindow(textwindow(sizeWArea.x1, sizeWArea.y1, sizeWArea.x1+27, sizeWArea.y1+9, conf->getcolor(cp_main_text))); m.idle = &menuidle; for(protcount = 0, pname = icq; pname != protocolname_size; pname++) { if(!conf->getourid(pname).empty()) { protcount++; onechoice = pname; } alrlogged = alrlogged || gethook(pname).getstatus() != offline; } if(protcount < 2) { i = 1; choice = onechoice; } else { m.additem(0, -1, _(" All protocols")); if(alrlogged) m.additem(0, -2, _(" Already logged in only")); m.addline(); makeprotocolmenu(m); m.scale(); i = m.open(); choice = (intptr_t) m.getref(i-1); m.close(); } if(r = i) { switch(choice) { case -1: for(pname = icq; pname != protocolname_size; pname++) if(!conf->getourid(pname).empty()) pnames.push_back(pname); break; case -2: for(pname = icq; pname != protocolname_size; pname++) if(!conf->getourid(pname).empty()) if(gethook(pname).getstatus() != offline) pnames.push_back(pname); break; default: pnames.push_back((protocolname) choice); break; } m.clear(); mst.push_back(available); mst.push_back(offline); mst.push_back(away); mst.push_back(dontdisturb); mst.push_back(notavail); mst.push_back(outforlunch); mst.push_back(occupied); mst.push_back(freeforchat); mst.push_back(invisible); for(im = mst.begin(); im != mst.end(); ++im) { string sst = (string) " [" + imstatus2char[*im] + "] " + imstatus2str(*im); m.additem(0, *im, sst); if(pnames.size() == 1) if(gethook(pnames.front()).getstatus() == *im) m.setpos(m.getcount()-1); } if(pnames.size() > 1) { m.setpos(0); } m.otherkeys = &statuskeys; m.scale(); i = m.open(); m.close(); if(r = i) { st = (imstatus) ((intptr_t) m.getref(i-1)); } } return r; } #define INPUT_POS LINES-2 string icqface::inputstr(const string &q, const string &defl, char passwdchar) { screenarea sa(0, INPUT_POS, COLS, INPUT_POS); attrset(conf->getcolor(cp_status)); mvhline(INPUT_POS, 0, ' ', COLS); kwriteatf(0, INPUT_POS, conf->getcolor(cp_status), "%s", q.c_str()); input.setpasswordchar(passwdchar); input.removeselector(); input.setvalue(defl); input.setcoords(q.size(), INPUT_POS, COLS-q.size()); input.exec(); sa.restore(); return input.getvalue(); } string icqface::inputfile(const string &q, const string &defl) { screenarea sa(0, INPUT_POS, COLS, INPUT_POS); string r; mvhline(INPUT_POS, 0, ' ', COLS); kwriteatf(0, INPUT_POS, conf->getcolor(cp_status), "%s", q.c_str()); kwriteatf(COLS-8, INPUT_POS, conf->getcolor(cp_status), "[Ctrl-T]"); input.setpasswordchar(0); selector.setoptions(0); selector.setwindow(textwindow(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED, conf->getcolor(cp_dialog_highlight), _(" or confirm, cancel "))); input.connectselector(selector); input.setcoords(q.size(), INPUT_POS, COLS-q.size()-8); input.setvalue(defl); input.exec(); r = input.getvalue(); if(r.rfind("/") != -1) { selector.setstartpoint(r.substr(0, r.find("/"))); } sa.restore(); return r; } string icqface::inputdir(const string &q, const string &defl) { screenarea sa(0, INPUT_POS, COLS, INPUT_POS); string r; mvhline(INPUT_POS, 0, ' ', COLS); kwriteatf(0, INPUT_POS, conf->getcolor(cp_status), "%s", q.c_str()); kwriteatf(COLS-8, INPUT_POS, conf->getcolor(cp_status), "[Ctrl-T]"); input.setpasswordchar(0); selector.setoptions(FSEL_DIRSELECT); selector.setwindow(textwindow(0, 0, sizeDlg.width, sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED, conf->getcolor(cp_dialog_highlight), _(" confirm, cancel "))); input.connectselector(selector); input.setcoords(q.size(), INPUT_POS, COLS-q.size()-8); input.setvalue(defl); input.exec(); r = input.getvalue(); if(r.rfind("/") != -1) { selector.setstartpoint(r.substr(0, r.find("/"))); } sa.restore(); return r; } int icqface::getlastinputkey() const { return input.getlastkey(); } void catqstr(string &q, int option, int defl) { char c = q[q.size()-1]; if(!strchr("(/", c)) q += '/'; switch(option) { case ASK_YES: q += 'y'; break; case ASK_NO: q += 'n'; break; case ASK_CANCEL: q += 'c'; break; } if(defl == option) q[q.size()-1] = toupper(q[q.size()-1]); } int icqface::ask(string q, int options, int deflt ) { int ret; screenarea sa(0, INPUT_POS, COLS, INPUT_POS); q += " ("; if(options & ASK_YES) catqstr(q, ASK_YES, deflt); if(options & ASK_NO) catqstr(q, ASK_NO, deflt); if(options & ASK_CANCEL) catqstr(q, ASK_CANCEL, deflt); q += ") "; attrset(conf->getcolor(cp_status)); mvhline(INPUT_POS, 0, ' ', COLS); kwriteatf(0, INPUT_POS, conf->getcolor(cp_status), "%s", q.c_str()); for(ret = -1; ret == -1; ) { switch(getkey()) { case 'y': case 'Y': if(options & ASK_YES) ret = ASK_YES; break; case 'n': case 'N': if(options & ASK_NO) ret = ASK_NO; break; case 'c': case 'C': if(options & ASK_CANCEL) ret = ASK_CANCEL; break; case '\r': if(deflt != -1) ret = deflt; break; } } sa.restore(); return ret; } void icqface::saveworkarea() { int i; //don't try switch workareabuf to struct, it's broke program design #ifdef HAVE_NCURSESW wchar_t **workareabuf = (wchar_t **) malloc(sizeof(wchar_t *) * (sizeWArea.y2-sizeWArea.y1+1)); chtype **workareabuf2 = (chtype **) malloc(sizeof(chtype *) * (sizeWArea.y2-sizeWArea.y1+1)); //we need this because shit type cchar_t can't store attributes(they are store but doesn't applied by mvadd_wchstr ) #else chtype **workareabuf = (chtype **) malloc(sizeof(chtype *) * (sizeWArea.y2-sizeWArea.y1+1)); #endif //There is no another way to render text with attributes (because chtype stored multibyte broken and wchar_t doesn't have atrributes) for(i = 0; i <= sizeWArea.y2-sizeWArea.y1; i++) { #ifdef HAVE_NCURSESW workareabuf[i] = (wchar_t *) malloc(sizeof(wchar_t) * (sizeWArea.x2-sizeWArea.x1+2)); workareabuf2[i] = (chtype *) malloc(sizeof(chtype) * (sizeWArea.x2-sizeWArea.x1+2)); mvinnwstr(sizeWArea.y1+i, sizeWArea.x1, workareabuf[i], sizeWArea.x2-sizeWArea.x1+1); mvinchnstr(sizeWArea.y1+i, sizeWArea.x1, workareabuf2[i], sizeWArea.x2-sizeWArea.x1+1); //reading lines twice to read attributes and data in wide char #else workareabuf[i] = (chtype *) malloc(sizeof(chtype) * (sizeWArea.x2-sizeWArea.x1+2)); mvinchnstr(sizeWArea.y1+i, sizeWArea.x1, workareabuf[i], sizeWArea.x2-sizeWArea.x1+1); #endif } workareas.add(workareabuf); #ifdef HAVE_NCURSESW workareas2.add(workareabuf2); #endif } void icqface::restoreworkarea() { int i, j; #ifdef HAVE_NCURSESW wchar_t **workareabuf = (wchar_t **) workareas.at(workareas.count-1); chtype **workareabuf2 = (chtype **) workareas2.at(workareas2.count-1); #else chtype **workareabuf = (chtype **) workareas.at(workareas.count-1); #endif #ifdef HAVE_NCURSESW if(workareabuf && workareabuf2 && !dotermresize) { #else if(workareabuf && !dotermresize) { #endif for(i = 0; i <= sizeWArea.y2-sizeWArea.y1; i++) { #ifdef HAVE_NCURSESW const wchar_t *temp_workarea = workareabuf[i]; const chtype *temp_workarea2 = workareabuf2[i]; #endif #ifdef HAVE_NCURSESW for( j = 0; j < sizeWArea.x2-sizeWArea.x1+1; j++, temp_workarea++, temp_workarea2++) { //apply attributes step by step to each symbol(not so fast ) attrset( (*temp_workarea2 & A_ATTRIBUTES) | (*temp_workarea2 & A_COLOR)); mvaddnwstr(sizeWArea.y1+i, sizeWArea.x1+j, temp_workarea, 1); } #else mvaddchnstr(sizeWArea.y1+i, sizeWArea.x1, workareabuf[i], sizeWArea.x2-sizeWArea.x1+1); #endif } refresh(); } workareas.remove(workareas.count-1); #ifdef HAVE_NCURSESW workareas2.remove(workareas2.count-1); #endif } void icqface::clearworkarea() { int i; attrset(conf->getcolor(cp_main_text)); for(i = sizeWArea.y1+1; i < sizeWArea.y2; i++) { mvhline(i, sizeWArea.x1+1, ' ', sizeWArea.x2-sizeWArea.x1-1); refresh(); } } void icqface::freeworkareabuf(void *p) { wchar_t **workareabuf = (wchar_t **) p; //we hope chtype and wchar_t have same size ;) if(workareabuf) { for(int i = 0; i <= face.sizeWArea.y2-face.sizeWArea.y1; i++) { free((wchar_t *) workareabuf[i]); } free(workareabuf); } } void icqface::workarealine(int l, chtype c ) { attrset(conf->getcolor(cp_main_frame)); mvhline(l, sizeWArea.x1+1, c, sizeWArea.x2-sizeWArea.x1-1); } void icqface::modelist(contactstatus cs) { int i, b; icqcontact *c; dialogbox db; modelistitem it; vector::iterator ic; saveworkarea(); clearworkarea(); db.setwindow(new textwindow(sizeWArea.x1+1, sizeWArea.y1+2, sizeWArea.x2, sizeWArea.y2, conf->getcolor(cp_main_text), TW_NOBORDER)); db.setmenu(new verticalmenu(conf->getcolor(cp_main_text), conf->getcolor(cp_main_selected))); db.setbar(new horizontalbar(conf->getcolor(cp_main_highlight), conf->getcolor(cp_main_selected), _("Details"), _("Add"), _("Remove"), _("Move to contacts"), (char*)0)); db.addautokeys(); db.idle = &dialogidle; db.addkey(KEY_IC, 1); db.addkey(KEY_DC, 2); db.redraw(); workarealine(sizeWArea.y1+2); workarealine(sizeWArea.y2-2); mainw.write(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), cs == csignore ? _("Ignore list") : cs == csvisible ? _("Visible list") : cs == csinvisible ? _("Invisible list") : ""); set ps; if(cs == csvisible || cs == csinvisible) { for(protocolname pname = icq; pname != protocolname_size; pname++) if(gethook(pname).getCapabs().count(hookcapab::visibility)) ps.insert(pname); } lst.fillmenu(db.getmenu(), cs); while(db.open(i, b)) { if(!db.getmenu()->getcount() && b != 1) continue; if(b != 1) it = lst.menuat(i-1); switch(b) { case 0: cicq.userinfo(it.getdesc()); break; case 1: muins.clear(); if(multicontacts(_("Select contacts to add to the list"), ps, cs)) { bool removecl; if(cs == csignore) { char buf[512]; snprintf(buf, sizeof(buf), _("Remove the %d contacts from the contact list as well?"), muins.size()); removecl = face.ask(buf, ASK_YES | ASK_NO, ASK_NO) == ASK_YES; } for(ic = muins.begin(); ic != muins.end(); ++ic) { lst.push_back(modelistitem(clist.get(*ic)->getdispnick(), *ic, cs)); if(removecl && cs == csignore) clist.remove(*ic); } lst.fillmenu(db.getmenu(), cs); db.getmenu()->redraw(); } break; case 2: lst.del(it.getdesc(), cs); lst.fillmenu(db.getmenu(), cs); db.getmenu()->redraw(); break; case 3: if(c = cicq.addcontact(it.getdesc())) { c->setdispnick(it.getnick()); lst.del(it.getdesc(), cs); lst.fillmenu(db.getmenu(), cs); db.getmenu()->redraw(); } break; } face.relaxedupdate(); } db.close(); restoreworkarea(); } bool icqface::multicontacts(const string &ahead, const set &protos, contactstatus cs) { int i, savefirst, saveelem, prevgid = -1; bool ret = true, finished = false; string head = ahead; imcontact ic; vector::iterator c, cc; vector mlst; map groupcheck; icqcontact *cont; verticalmenu m(sizeWArea.x1+1, sizeWArea.y1+3, sizeWArea.x2, sizeWArea.y2, conf->getcolor(cp_main_text), conf->getcolor(cp_main_selected)); saveworkarea(); clearworkarea(); workarealine(sizeWArea.y1+2); if(!head.size()) head = _("Event recipients"); mainw.write(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), head); vector::iterator ig = groups.begin(); while(ig != groups.end()) { for(i = 0; i < clist.count; i++) { icqcontact *c = (icqcontact *) clist.at(i); imcontact desc = c->getdesc(); if(!desc.empty()) if(c->getgroupid() == ig->getid() || conf->getgroupmode() == icqconf::nogroups) if(protos.empty() || protos.count(desc.pname)) if(!lst.inlist(desc, cs)) mlst.push_back(desc); } ig++; } m.idle = &menuidle; m.otherkeys = &multiplekeys; while(!finished) { m.getpos(saveelem, savefirst); m.clear(); for(c = mlst.begin(); c != mlst.end(); ++c) { cont = (icqcontact *) clist.get(*c); if(conf->getgroupmode() != icqconf::nogroups) if(cont->getgroupid() != prevgid) { prevgid = cont->getgroupid(); if(groupcheck.find(prevgid) == groupcheck.end()) groupcheck[prevgid] = false; m.additemf(conf->getcolor(cp_main_highlight), 0, "\002[%c]\002\002 %s", groupcheck[prevgid] ? 'x' : ' ', groups.getname(prevgid).c_str()); } m.additemf(conf->getprotcolor(c->pname), cont, " [%c] %s", find(muins.begin(), muins.end(), *c) != muins.end() ? 'x' : ' ', cont->getdispnick().c_str()); } m.setpos(saveelem, savefirst); switch(m.open()) { case -2: if(m.getref(m.getpos())) { ic = ((icqcontact *) m.getref(m.getpos()))->getdesc(); c = find(muins.begin(), muins.end(), ic); if(c != muins.end()) muins.erase(c); else muins.push_back(ic); cont = clist.get(ic); groupcheck[cont->getgroupid()] = false; } else { bool been = false; int gid = ((icqcontact *) m.getref(m.getpos()+1))->getgroupid(); groupcheck[gid] = !groupcheck[gid]; for(c = mlst.begin(); c != mlst.end(); ++c) { cont = (icqcontact *) clist.get(*c); if(cont->getgroupid() == gid) { been = true; cc = find(muins.begin(), muins.end(), *c); if(groupcheck[gid] && cc == muins.end()) { muins.push_back(*c); } else if(!groupcheck[gid] && cc != muins.end()) { muins.erase(cc); } } else if(been) break; } } break; case -3: quickfind(&m); break; case 0: ret = false; default: finished = true; break; } } restoreworkarea(); return ret; } void icqface::log(const char *fmt, ...) { va_list ap; char buf[1024]; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); log((string) buf); va_end(ap); } void icqface::log(const string &atext) { int i; string text = atext; if(conf->getdebug()) if(flog.is_open()) flog << text << endl; /*! Add a timestamp if needed */ bool lts, lo; conf->getlogoptions(lts, lo); if(lts) if(text.size() > 3) if(ispunct(text[0]) && isspace(text[1]) && !isspace(text[2])) { time_t t; char stime[64]; time(&t); strftime(stime, 64, conf->getlogtimestampformat(), localtime(&t)); text.insert(2, stime); } while((i = text.find("\n")) != -1) text[i] = ' '; while((i = text.find("\r")) != -1) text[i] = ' '; while((lastlog.size() > LINES-sizeWArea.y2-2) && !lastlog.empty()) lastlog.erase(lastlog.begin()); lastlog.push_back(text); #ifdef HAVE_NCURSESW wchar_t *logline = new wchar_t[sizeWArea.x2-sizeWArea.x1+2]; chtype *logline2 = new chtype[sizeWArea.x2-sizeWArea.x1+2]; #else chtype *logline = new chtype[sizeWArea.x2-sizeWArea.x1+2]; #endif attrset(conf->getcolor(cp_main_text)); int j; if(!mainscreenblock && (sizeWArea.x2-sizeWArea.x1 > 0)) { for(i = sizeWArea.y2+2; i < LINES-2; i++) { #ifdef HAVE_NCURSESW mvinnwstr(i, sizeWArea.x1+1, logline, sizeWArea.x2-sizeWArea.x1); mvinchnstr(i, sizeWArea.x1+1, logline2, sizeWArea.x2-sizeWArea.x1); const wchar_t *log_ptr = logline; const chtype *log_ptr2 = logline2; for(j = 0; j < sizeWArea.x2-sizeWArea.x1; j++, log_ptr++, log_ptr2++ ) { attrset( (*log_ptr2 & A_COLOR) | (*log_ptr2 & A_ATTRIBUTES) ); mvaddnwstr(i-1, sizeWArea.x1+1+j, log_ptr, 1); } #else mvinchnstr(i, sizeWArea.x1+1, logline, sizeWArea.x2-sizeWArea.x1); mvaddchnstr(i-1, sizeWArea.x1+1, logline, sizeWArea.x2-sizeWArea.x1); #endif } delete[] logline; #ifdef HAVE_NCURSESW delete[] logline2; #endif if(text.size() > sizeWArea.x2-sizeWArea.x1-2) text.resize(sizeWArea.x2-sizeWArea.x1-2); mvhline(LINES-3, sizeWArea.x1+2, ' ', sizeWArea.x2-sizeWArea.x1-2); kwriteatf(sizeWArea.x1+2, LINES-3, conf->getcolor(cp_main_text), "%s", text.c_str()); } } void icqface::status(const string &text) { string t(text); if(t == "@") { if(!fstatus.empty()) fstatus.pop_back(); if(!fstatus.empty()) t = fstatus.back(); } else if(t == "#") { if(!fstatus.empty()) t = fstatus.back(); } else { fstatus.push_back(t); while(fstatus.size() > 5) fstatus.erase(fstatus.begin()); } attrset(conf->getcolor(cp_status)); mvhline(LINES-1, 0, ' ', COLS); kwriteatf(0, LINES-1, conf->getcolor(cp_status), "%s", t.c_str()); } void icqface::status(const char *fmt, ...) { va_list ap; char buf[1024]; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); status((string) buf); va_end(ap); } void icqface::blockmainscreen() { mainscreenblock = true; } void icqface::unblockmainscreen() { mainscreenblock = false; update(); } void icqface::quickfind(verticalmenu *multi) { bool fin; string nick, disp; int k, i, lx, ly; icqcontact *c; verticalmenu *cm = (multi ? multi : &mcontacts->menu); status(_("QuickSearch: type to find, %s find again, Enter finish"), getstatkey(key_quickfind, section_contact).c_str()); xtermtitle(_("contact list quick search")); if(multi) { lx = sizeWArea.x1+2; ly = sizeWArea.y2; } else { lx = 2; ly = LINES-2; } for(fin = false; !fin; ) { attrset(conf->getcolor(cp_main_frame)); mvhline(ly, lx, HLINE, 23); disp = nick; if(disp.size() > 18) disp.replace(0, disp.size()-18, ""); kwriteatf(lx, ly, conf->getcolor(cp_main_highlight), "[ %s ]", disp.c_str()); kgotoxy(lx+2+disp.size(), ly); refresh(); if(cicq.idle()) switch(k = getkey()) { case KEY_ESC: case '\r': fin = true; break; case KEY_BACKSPACE: case CTRL('h'): if(!nick.empty()) nick.resize(nick.size()-1); else fin = true; break; default: if(isprint(k) || (key2action(k, section_contact) == key_quickfind)) { i = cm->getpos() + (multi ? 1 : 2); if(isprint(k)) { i--; nick += k; } bool fin = false; bool fpass = true; for(; !fin; i++) { c = 0; if(i > cm->getcount()) { if(fpass) { i = 0; fpass = false; } else { fin = true; break; } } if(!multi && mcontacts->isnode(i)) { c = 0; } else if(!multi) { c = (icqcontact *) mcontacts->getref(i); } else { c = (icqcontact *) cm->getref(i); } if((intptr_t) c > 100) { string current = c->getdispnick(); if (0 != strcasestr(current.c_str(), nick.c_str())) { cm->setpos(i - (multi ? 0 : 1)); break; } } } if(!multi) mcontacts->redraw(); else cm->redraw(); } break; } } attrset(conf->getcolor(cp_main_frame)); mvhline(ly, lx, HLINE, 23); } void icqface::extracturls(const string &buf) { int pos = 0; regex_t r; regmatch_t rm[1]; extractedurls.clear(); if(!regcomp(&r, "(http://[^ \t\n]+|https://[^ \t\n]+|ftp://[^ \t\n]+|www\\.[^ \t\n]+)", REG_EXTENDED)) { while(!regexec(&r, buf.substr(pos).c_str(), 1, rm, 0)) { extractedurls.push_back(buf.substr(pos+rm[0].rm_so, rm[0].rm_eo-rm[0].rm_so)); pos += rm[0].rm_eo; } regfree(&r); } } void icqface::showextractedurls() { if(extractedurls.empty()) { log(_("+ no URLs within the current context")); } else { int n; vector::iterator i; verticalmenu m(sizeWArea.x1+1, sizeWArea.y1+3, sizeWArea.x2, sizeWArea.y2, conf->getcolor(cp_main_text), conf->getcolor(cp_main_selected)); saveworkarea(); clearworkarea(); workarealine(sizeWArea.y1+2); mainw.writef(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), _("URLs within the current context")); for(i = extractedurls.begin(); i != extractedurls.end(); ++i) m.additem(" " + *i); if(n = m.open()) conf->execaction("openurl", extractedurls[n-1]); restoreworkarea(); } } void icqface::userinfoexternal(const imcontact &ic) { vector > r = external.getlist(imexternal::aomanual, ic.pname); if(r.empty()) { log(_("+ no external actions defined for %s"), conf->getprotocolname(ic.pname).c_str()); } else { verticalmenu m(conf->getcolor(cp_main_text), conf->getcolor(cp_main_selected)); m.setwindow(textwindow(sizeWArea.x1, sizeWArea.y1, sizeWArea.x1+27, sizeWArea.y1+9, conf->getcolor(cp_main_text))); m.idle = &menuidle; vector >::const_iterator ir = r.begin(); while(ir != r.end()) { m.additem((string(" ") + ir->second).c_str()); ++ir; } m.scale(); int i = m.open(); m.close(); if(i) { char cbuf[512]; snprintf(cbuf, sizeof(cbuf), _("Result of the external action %s:"), (r.begin()+i-1)->second.c_str()); string buf; external.execmanual(ic, i-1, buf); if(!buf.empty()) { imnotification ev(ic, (string) cbuf + "\n\n" + buf); saveworkarea(); eventview(&ev, vector(), true); restoreworkarea(); } } } } void icqface::showeventbottom(const imcontact &ic) { const char *text = ischannel(ic) ? _("%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s memb") : _("%s send, %s multi, %s/%s pr/nxt chat, %s hist, %s URLs, %s expand, %s info"); status(text, getstatkey(key_send_message, section_editor).c_str(), getstatkey(key_multiple_recipients, section_editor).c_str(), getstatkey(key_prev_chat, section_editor).c_str(), getstatkey(key_next_chat, section_editor).c_str(), getstatkey(key_history, section_editor).c_str(), getstatkey(key_show_urls, section_editor).c_str(), getstatkey(key_fullscreen, section_editor).c_str(), getstatkey(key_info, section_editor).c_str()); } bool icqface::eventedit(imevent &ev) { bool r; texteditor editor; icqcontact *c; string msg; editdone = r = false; passinfo = ev.getcontact(); editor.addscheme(cp_main_text, cp_main_text, 0, 0); editor.otherkeys = &editmsgkeys; editor.idle = &editidle; editor.wrap = true; editor.smarttab = false; editor.emacs = conf->getemacs(); saveworkarea(); clearworkarea(); peerinfo(2, ev.getcontact()); mainw.writef(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), _("Outgoing %s"), streventname(ev.gettype())); showeventbottom(ev.getcontact()); if(ev.gettype() == imevent::message) { editor.setcoords(sizeWArea.x1+2, sizeWArea.y1+3, sizeWArea.x2, sizeWArea.y2); immessage *m = static_cast(&ev); editor.load(msg = m->gettext(), ""); editdone = false; editor.open(); r = editdone; /* TODO, should we relly use a pointer here ? */ char *p = editor.save("\r\n"); *m = immessage(ev.getcontact(), imevent::outgoing, p); if(c = clist.get(ev.getcontact())) c->setpostponed(r ? "" : p); free (p); } else if(ev.gettype() == imevent::xml) { editor.setcoords(sizeWArea.x1+2, sizeWArea.y1+3, sizeWArea.x2, sizeWArea.y2); while(1) { imxmlevent *m = static_cast(&ev); editor.load(msg = m->gettext(), ""); editdone = false; editor.open(); r = editdone; char *p = editor.save("\r\n"); m->setfield("text", p); if(r) if(ev.getcontact().pname == livejournal) if(!setljparams(m)){ free(p); continue; } if(c = clist.get(ev.getcontact())) c->setpostponed(r ? "" : p); free(p); break; } } else if(ev.gettype() == imevent::url) { static textinputline urlinp; imurl *m = static_cast(&ev); urlinp.setvalue(m->geturl()); urlinp.setcoords(sizeWArea.x1+2, sizeWArea.y1+3, sizeWArea.x2-sizeWArea.x1-2); urlinp.setcolor(conf->getcolor(cp_main_highlight)); urlinp.idle = &textinputidle; workarealine(sizeWArea.y1+4); urlinp.exec(); string url = urlinp.getlastkey() != KEY_ESC ? urlinp.getvalue() : ""; if(!url.empty()) { editor.setcoords(sizeWArea.x1+2, sizeWArea.y1+5, sizeWArea.x2, sizeWArea.y2); editor.load(m->getdescription(), ""); editor.open(); r = editdone; char *p = editor.save("\r\n"); *m = imurl(ev.getcontact(), imevent::outgoing, url, p); free (p); } } else if(ev.gettype() == imevent::sms) { imsms *m = static_cast(&ev); editor.setcoords(sizeWArea.x1+2, sizeWArea.y1+3, sizeWArea.x2, sizeWArea.y2); editor.load(msg = m->getmessage(), ""); editor.open(); r = editdone; auto_ptr p(editor.save("\r\n")); *m = imsms(ev.getcontact(), imevent::outgoing, p.get(), m->getphone()); if(c = clist.get(ev.getcontact())) c->setpostponed(r ? "" : p.get()); } else if(ev.gettype() == imevent::authorization) { imauthorization *m = static_cast(&ev); if (gethook(ev.getcontact().pname).getCapabs().count(hookcapab::authreqwithmessages)) { editor.setcoords(sizeWArea.x1+2, sizeWArea.y1+3, sizeWArea.x2, sizeWArea.y2); editor.load(msg = m->getmessage(), ""); editor.open(); char *p = editor.save("\r\n"); *m = imauthorization(ev.getcontact(), imevent::outgoing, imauthorization::Request, p); r = editdone; free(p); } else { *m = imauthorization(ev.getcontact(), imevent::outgoing, imauthorization::Request, ""); r = true; } } else if(ev.gettype() == imevent::contacts) { imcontacts *m = static_cast(&ev); imcontact cont; vector smuins = muins; vector::iterator imc; vector< pair > clst; vector< pair >::const_iterator icc; muins.clear(); for(icc = m->getcontacts().begin(); icc != m->getcontacts().end(); ++icc) { cont = imcontact(); cont.pname = ev.getcontact().pname; if(icc->first) cont.uin = icc->first; else cont.nickname = icc->second; muins.push_back(cont); } set ps; ps.insert(ev.getcontact().pname); r = multicontacts(_("Send contacts.."), ps); for(imc = muins.begin(); imc != muins.end(); ++imc) { if(imc->uin) { icqcontact *cc = clist.get(*imc); if(cc) imc->nickname = cc->getnick(); } clst.push_back(make_pair(imc->uin, imc->nickname)); } muins = smuins; *m = imcontacts(ev.getcontact(), imevent::outgoing, clst); } else if(ev.gettype() == imevent::file) { dialogbox db; int baritem, mitem; bool finished = false, floop = true; vector::const_iterator ir; imfile *m = static_cast(&ev); db.setwindow(new textwindow(sizeWArea.x1+1, sizeWArea.y1+2, sizeWArea.x2, sizeWArea.y2, conf->getcolor(cp_main_text), TW_NOBORDER)); db.setmenu(new verticalmenu(conf->getcolor(cp_main_menu), conf->getcolor(cp_main_selected))); db.setbar(new horizontalbar(conf->getcolor(cp_main_highlight), conf->getcolor(cp_main_selected), _("Add"), _("Remove"), _("Send"), (char*)0)); db.addkey(KEY_IC, 0); db.addkey(KEY_DC, 1); db.addautokeys(); db.idle = &dialogidle; db.redraw(); workarealine(sizeWArea.y1+2); workarealine(sizeWArea.y2-2); while(!finished && !r) { db.getmenu()->clear(); for(ir = m->getfiles().begin(); ir != m->getfiles().end(); ++ir) db.getmenu()->additemf(" %s", ir->fname.c_str()); if(floop) { baritem = 0; floop = false; } else { finished = !db.open(mitem, baritem); } if(!finished) { vector files = m->getfiles(); switch(baritem) { case 0: if((msg = inputfile(_("file name: "))).size()) { struct stat st; if(!stat(msg.c_str(), &st)) { imfile::record fr; fr.fname = msg; fr.size = st.st_size; files.push_back(fr); } } break; case 1: if(mitem > 0 && mitem <= m->getfiles().size()) files.erase(files.begin()+mitem-1); break; case 2: r = true; break; } m->setfiles(files); } } } editdone = false; restoreworkarea(); status("@"); return r; } string icqface::extracttime(const imevent &ev) { string ds1, ds2, r; int tdiff; time_t t, ts; char buf[64]; ds1 = time2str(&(t = ev.gettimestamp()), conf->gettimestampformat(), buf); ds2 = time2str(&(ts = ev.getsenttimestamp()), conf->gettimestampformat(), buf); r = ds1 + " "; tdiff = ts-t; if(tdiff < 0) tdiff *= -1; if(tdiff > 5) if(ds1 != ds2) r += (string) "[" + ds2 + "] "; return r; } void icqface::renderchathistory() { int count, chatmargin; string text; time_t lastread; struct stat st; vector events; typedef pair > histentry; vector toshow; vector::iterator ir; vector::reverse_iterator il; static imevent *lastev = 0; delete lastev; passevent = lastev = 0; histentry h; icqcontact *c = clist.get(passinfo); if(!c) return; count = 0; if(!stat((c->getdirname() + "history").c_str(), &st)) { count = st.st_size-chatlines*(sizeWArea.x2-sizeWArea.x1)*2; if(count < 0) count = 0; } // Skip history items that won't be displayed c->sethistoffset(count); if (chatlastread == 0) chatlastread = 1; count = 0; events = em.getevents(passinfo, chatlastread); chatlastread = 0; lastread = c->getlastread(); if(events.size()) { c->setlastread(events.back()->gettimestamp()); } while(events.size() > chatlines) { delete events.front(); events.erase(events.begin()); } while(events.size()) { if(events.back()->getdirection() == imevent::incoming) { if(events.back()->gettimestamp() > lastread) { if(events.back()->gettype() == imevent::authorization || events.back()->gettype() == imevent::contacts || events.back()->gettype() == imevent::file) { bool fin, enough; fin = enough = false; saveworkarea(); while(!fin && !enough) cicq.readevent(*events.back(), enough, fin); restoreworkarea(); } } } if(count < chatlines) { text = extracttime(*events.back()); text += events.back()->gettext(); chatlastread = events.back()->gettimestamp()-1; h = histentry(); h.first = events.back()->getdirection(); if(c->receivedAcks.size() > 0 || c->sentAcks.size() > 0) { breakintolines(text, h.second, sizeWArea.x2-sizeWArea.x1-3); h.second[0] = ((events.back()->getack())?"+":" ") + h.second[0]; for(unsigned int i = 1; i < h.second.size(); ++i) h.second[i] = " " + h.second[i]; } else { breakintolines(text, h.second, sizeWArea.x2-sizeWArea.x1-2); } toshow.push_back(h); if(!lastev) if(h.first == imevent::incoming) { passevent = lastev = events.back()->getevent(); extracturls(text); } count += h.second.size(); } delete events.back(); events.pop_back(); } chatmargin = sizeWArea.y1+chatlines; text = string(sizeWArea.x2-sizeWArea.x1-2, ' '); attrset(conf->getcolor(cp_main_text)); for(count = 0; count < chatlines; count++) mvprintw(chatmargin-count, sizeWArea.x1+2, "%s", text.c_str()); for(count = 0, ir = toshow.begin(); ir != toshow.end() && count < chatlines; ++ir) { switch(ir->first) { case imevent::incoming: attrset(conf->getcolor(cp_main_history_incoming)); break; case imevent::outgoing: attrset(conf->getcolor(cp_main_history_outgoing)); break; } for(il = ir->second.rbegin(); il != ir->second.rend() && count < chatlines; ++il) { kgotoxy(sizeWArea.x1+2, chatmargin-count); printstring(*il); count++; } } peerinfo(chatlines+1, passinfo); } void icqface::peerinfo(int line, const imcontact &ic) { //workarealine(sizeWArea.y1+line); icqcontact *c = clist.get(ic); if(!c) return; char cstatus = c->getshortstatus(); string text = "[" + string(&cstatus, 1) + "] " + conf->getprotocolname(passinfo.pname) + " " + c->getdispnick(); int maxsize = 20; bool pgpon = false; if(text.size() > maxsize + 2) { text.erase(maxsize); text += ".."; } #ifdef HAVE_GPGME if(pgpon = pgp.enabled(passinfo)) text += string(4, ' '); #endif #ifdef HAVE_LIBOTR text += " OTR: " + otr.is_verified(ic.pname, c->getnick()) + " " + otr.get_msg_state(ic.pname, c->getnick()); #endif text = (string) "[ " + text + " ]"; workarealine(sizeWArea.y2); drawopenedchats(sizeWArea.y1+line, sizeWArea.x2 - 32); attrset(conf->getcolor(cp_main_frame)); mvhline(sizeWArea.y1+line, sizeWArea.x2 - 31, HLINE, 32 - text.size() - 1); kwriteatf(sizeWArea.x2-text.size()-1, sizeWArea.y1+line, conf->getcolor(cp_main_text), "%s", text.c_str()); attrset(conf->getcolor(cp_main_frame)); mvhline(sizeWArea.y1+line, sizeWArea.x2 - 1, HLINE, 1); if(pgpon) { kwriteatf(sizeWArea.x2-6, sizeWArea.y1+line, conf->getcolor(cp_main_highlight), "PGP"); } } void icqface::drawopenedchats(int line, int width) { // writing info about opened chats string dispnick; icqcontact *ct, *c; if (inchat) { c = clist.get(face.passinfo); } else { c = NULL; } int i, curx = sizeWArea.x1 + 3; attrset(conf->getcolor(cp_main_frame)); mvhline(line, sizeWArea.x1 + 1, HLINE, 2); if (conf->getshowopenedchats()) { time_t timer = time(0); for(i = 0; i < clist.count; i++) { ct =(icqcontact *) clist.at(i); if (ct->isopenedforchat()) { dispnick = ct->getdispnick(); if (dispnick.length() > 18) { dispnick.erase(16); dispnick += ".."; } if (curx + dispnick.size() + 5 >= width - 1) { dispnick = "[...]"; kwriteatf(curx, line, conf->getcolor(cp_main_text), "%s", dispnick.c_str()); curx += dispnick.size(); break; } dispnick = "[ " + dispnick + " "; dispnick[1] = ct->hasevents() ? '*' : ' '; if(ct->getlasttyping()) { if(timer-ct->getlasttyping() > PERIOD_TYPING) ct->setlasttyping(0); else dispnick += "(T)"; } dispnick += "]"; int col = (ct == c) ? conf->getcolor(cp_main_highlight) : conf->getcolor(cp_main_text); kwriteatf(curx, line, col, "%s", dispnick.c_str()); attrset(conf->getcolor(cp_main_frame)); mvhline(line, curx + dispnick.size(), HLINE, 1); curx += dispnick.size() + 1; } } } if (curx <= width) { attrset(conf->getcolor(cp_main_frame)); mvhline(line, curx, HLINE, width - curx + 1); } } bool icqface::chat(const imcontact &ic) { texteditor editor; vector::iterator i; int chatlines_diff = 0; // could get rid of? bool return_status = false ; face.stay_in_chat = false ; icqcontact *c = clist.get(ic); if(!c) return false; saveworkarea(); clearworkarea(); chatlastread = 0; inchat = true; passinfo = ic; c->setopenedforchat(true); muins.clear(); muins.push_back(passinfo); // resizing doesn't change the effect, so we work from the bottom, not the top chatlines_diff = sizeWArea.y2 - sizeWArea.y1 ; chatlines = conf->getchatpanelheight(); if( chatlines == 0 ) { // allow disabling reszing by setting it to zero chatlines = (int) (chatlines_diff*0.75); } else { chatlines = chatlines_diff - chatlines; // changes where the guide line is if( chatlines < MinPanelHeight ) // bottom chatlines = (int) (MinPanelHeight); if( chatlines > (chatlines_diff - MinPanelHeight)) // top chatlines = (int) (chatlines_diff - MinPanelHeight) ; } conf->setchatpanelheight(chatlines_diff - chatlines); // workarealine(sizeWArea.y1+chatlines+1); editor.addscheme(cp_main_text, cp_main_text, 0, 0); editor.otherkeys = &editmsgkeys; editor.idle = &editchatidle; editor.wrap = true; editor.smarttab = false; editor.emacs = conf->getemacs(); editor.setcoords(sizeWArea.x1+2, sizeWArea.y1+chatlines+2, sizeWArea.x2, sizeWArea.y2); editor.load(c->getpostponed(), ""); showeventbottom(ic); ineditor = true; for(bool finished = false; !finished && clist.get(ic); ) { renderchathistory(); editdone = false; editor.open(); auto_ptr p(editor.save("\r\n")); editor.close(); editor.load("", ""); if(editdone) { auto_ptr ev(new immessage(ic, imevent::outgoing, p.get())); for(i = muins.begin(); i != muins.end(); ++i) { ev.get()->setcontact(*i); em.store(*ev.get()); } muins.clear(); muins.push_back(passinfo); } else { finished = true; } c->setpostponed(editdone ? "" : p.get()); } ineditor = false; c->toggleopenedforchat(); c->save(); restoreworkarea(); status("@"); inchat = false; update(); if ( face.stay_in_chat == true ) { return_status = true; face.stay_in_chat = false; } return return_status; } icqface::eventviewresult icqface::eventview(const imevent *ev, vector abuttons, bool nobuttons) { string title_event, title_timestamp, text; horizontalbar *bar = 0; dialogbox db; int mitem, baritem; eventviewresult r; static int elem = 0; vector actions; vector::iterator ia; if(!nobuttons) { if(ev->gettype() == imevent::message || ev->gettype() == imevent::notification || ev->gettype() == imevent::xml) { actions.push_back(forward); if(ev->getdirection() == imevent::incoming) if(ev->getcontact().pname != rss /*|| islivejournal(ev->getcontact())*/) actions.push_back(reply); } else if(ev->gettype() == imevent::url) { actions.push_back(forward); actions.push_back(open); if(ev->getdirection() == imevent::incoming) { actions.push_back(reply); } } else if(ev->gettype() == imevent::sms) { if(ev->getdirection() == imevent::incoming) { actions.push_back(reply); } } else if(ev->gettype() == imevent::authorization) { if(ev->getdirection() == imevent::incoming) { actions.push_back(info); actions.push_back(accept); actions.push_back(reject); } } else if(ev->gettype() == imevent::contacts) { actions.push_back(info); actions.push_back(add); } else if(ev->gettype() == imevent::email) { actions.push_back(forward); } else if(ev->gettype() == imevent::file) { actions.push_back(info); if(gethook(ev->getcontact().pname).knowntransfer(*static_cast(ev))) { actions.push_back(accept); actions.push_back(reject); } } } actions.push_back(ok); copy(abuttons.begin(), abuttons.end(), back_inserter(actions)); switch(ev->getdirection()) { case imevent::outgoing: title_event = _("Outgoing %s to %s"); title_timestamp = _("Sent on %s"); break; case imevent::incoming: title_event = _("Incoming %s from %s"); title_timestamp = _("Received on %s"); break; } clearworkarea(); db.setwindow(new textwindow(sizeWArea.x1+1, sizeWArea.y1+3, sizeWArea.x2, sizeWArea.y2, conf->getcolor(cp_main_text), TW_NOBORDER)); db.setbar(bar = new horizontalbar(conf->getcolor(cp_main_highlight), conf->getcolor(cp_main_selected), 0)); bar->item = actions.size()-1; for(ia = actions.begin(); ia != actions.end(); ++ia) bar->items.push_back(geteventviewresult(*ia)); mainw.writef(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), title_event.c_str(), streventname(ev->gettype()), ev->getcontact().totext().c_str()); mainw.writef(sizeWArea.x1+2, sizeWArea.y1+1, conf->getcolor(cp_main_highlight), title_timestamp.c_str(), extracttime(*ev).c_str()); db.addautokeys(); if(ev->gettype() == imevent::contacts) { const imcontacts *m = static_cast(ev); db.setmenu(new verticalmenu(conf->getcolor(cp_main_menu), conf->getcolor(cp_main_selected))); vector< pair > lst = m->getcontacts(); vector< pair >::const_iterator il; for(il = lst.begin(); il != lst.end(); ++il) { db.getmenu()->additemf(" %s", il->second.c_str()); } db.getmenu()->setpos(elem-1); } else { text = ev->gettext(); db.setbrowser(new textbrowser(conf->getcolor(cp_main_text))); db.getbrowser()->setbuf(text); extracturls(text); status(_("%s to URLs, %s to full-screenize, %s close"), getstatkey(key_show_urls, section_history).c_str(), getstatkey(key_fullscreen, section_history).c_str(), getstatkey(key_quit, section_editor).c_str()); } db.redraw(); workarealine(sizeWArea.y1+3); workarealine(sizeWArea.y2-2); db.otherkeys = &eventviewkeys; db.idle = &dialogidle; passevent = ev; if(db.open(mitem, baritem)) { r = actions[baritem]; } else { r = cancel; } elem = mitem; switch(r) { case add: case info: extk = elem; break; } passevent = 0; return r; } void icqface::fullscreenize(const imevent *ev) { textwindow w(0, 1, COLS, LINES-1, conf->getcolor(cp_main_text), TW_NOBORDER); textbrowser tb(0, 4, COLS, LINES-1, conf->getcolor(cp_main_text)); char buf[512], *fmt = 0; vector lines; vector::const_iterator il; w.open(); switch(ev->getdirection()) { case imevent::incoming: fmt = _("%s from %s, received on %s"); break; case imevent::outgoing: fmt = _("%s to %s, sent on %s"); break; } snprintf(buf, sizeof(buf), fmt, streventname(ev->gettype()), ev->getcontact().totext().c_str(), strdateandtime(ev->gettimestamp()).c_str()); w.write(0, 1, conf->getcolor(cp_main_highlight), buf); xtermtitle((string) _("full-screen view") + " " + buf); tb.setbuf(ev->gettext()); blockmainscreen(); status(_("%s or %s to close, Up/Down and PgUp/PgDn to scroll"), getstatkey(key_quit, section_editor).c_str(), getstatkey(key_fullscreen, section_editor).c_str()); tb.idle = &textbrowseridle; tb.otherkeys = &fullscreenkeys; tb.open(); unblockmainscreen(); status("@"); w.close(); } void icqface::histmake(const vector &hist) { vector::const_reverse_iterator i; string text; time_t t, ts; char buf[64]; int color; mhist.clear(); mhist.setpos(0); for(i = hist.rbegin(); i != hist.rend(); ++i) { imevent &ev = **i; color = 0; t = ev.gettimestamp(); ts = ev.getsenttimestamp(); text = (string) + ((ev.getack())?"+":" ") + time2str(&t, conf->gettimestampformat(), buf) + " "; if ((t - ts) > 0) text += (string) + "[" + time2str(&ts, conf->gettimestampformat(), buf) + "] "; text += ev.gettext(); if(ev.getdirection() == imevent::incoming) { color = conf->getcolor(cp_main_history_incoming); } else if(ev.getdirection() == imevent::outgoing) { color = conf->getcolor(cp_main_history_outgoing); } mhist.additem(color, (void *) *i, text); } } bool icqface::histexec(imevent *&im) { dialogbox db; bool r, fin; int k; static string sub; char buf[512]; r = fin = false; if(!mhist.empty()) { db.setwindow(new textwindow(sizeWArea.x1+1, sizeWArea.y1+2, sizeWArea.x2, sizeWArea.y2, conf->getcolor(cp_main_text), TW_NOBORDER)); db.setmenu(&mhist, false); if (!im) im = static_cast (mhist.getref(0)); /* * * Now set the menu position * */ for(k = 0; k < mhist.getcount(); k++) { imevent *rim = static_cast (mhist.getref(k)); if(rim == im) { mhist.setpos(k); break; } } db.idle = &dialogidle; db.otherkeys = &historykeys; saveworkarea(); clearworkarea(); db.redraw(); workarealine(sizeWArea.y1+2); snprintf(buf, sizeof(buf), _("History for %s, %d events total"), im->getcontact().totext().c_str(), mhist.getcount()); mainw.write(sizeWArea.x1+2, sizeWArea.y1, conf->getcolor(cp_main_highlight), buf); status(_("%s search, %s again, %s cancel"), getstatkey(key_search, section_history).c_str(), getstatkey(key_search_again, section_history).c_str(), getstatkey(key_quit, section_editor).c_str()); while(!fin) { if(db.open(k)) { switch(k) { case -2: sub = face.inputstr(_("search for: "), sub); if(input.getlastkey() == KEY_ESC) break; case -3: if(!sub.empty()) for(k = mhist.getpos()+1; k < mhist.getcount(); k++) { im = static_cast (mhist.getref(k)); if(im) if(im->contains(sub)) { mhist.setpos(k); break; } } break; case -4: r = false; fin = true; break; default: if(mhist.getref(k-1)) { im = static_cast (mhist.getref(k-1)); r = fin = true; } break; } } else { r = false; fin = true; } } db.close(); restoreworkarea(); } return r; } // ---------------------------------------------------------------------------- void icqface::menuidle(verticalmenu &m) { cicq.idle(); if(face.dotermresize) { if(&m == &face.mcontacts->menu) { face.redraw(); face.dotermresize = false; } } } void icqface::dialogidle(dialogbox &caller) { cicq.idle(); } void icqface::textbrowseridle(textbrowser &b) { cicq.idle(); } void icqface::transferidle(dialogbox &b) { time_t tstart = time(0); while(!cicq.idle(HIDL_SOCKEXIT)) { if(time(0)-tstart > 3) { b.gettree()->menu.abort(); break; } } } string icqface::getstatkey(int key, int section) const { int i = 2; string key2; string keys = action2key(key, section); while((key2 = action2key(key, section, i)) != "") { keys += "/" + key2; i++; } return keys; } string icqface::getmenuitem(string mtext, int width, int key, int section) { int i = 2; string text = " " + mtext + " "; string keyname = action2key(key, section); string key2; int s = keyname.size()+text.size(); if (s > width) return text; while ((key2 = action2key(key, section, i)) != "" && (s += key2.size()+1) < width) { keyname += "/" + key2; i++; } for (s = keyname.size()+text.size(); s < width; s++) text += " "; text += keyname; return text; } int icqface::key2action(int k, int s) { for(vector::size_type i = 0; i < icqconf::keys.size(); i++) if(k == icqconf::keys[i].key && s == icqconf::keys[i].section) return icqconf::keys[i].action; return -1; } string icqface::action2key(int a, int s, int n) const { string key; #ifdef HAVE_SSTREAM std::ostringstream o; #else std::ostrstream o; #endif vector::size_type i = 0; for( ; i < icqconf::keys.size(); i++) if(a == icqconf::keys[i].action && s == icqconf::keys[i].section) { if (n <= 1) break; n--; } if (i == icqconf::keys.size()) return ""; else if(icqconf::keys[i].key == '\r') return "enter"; else if(icqconf::keys[i].key == ' ') return "space"; else if(icqconf::keys[i].key == '/') return "\'/\'"; else if(icqconf::keys[i].key == ALT('\r')) return "alt-enter"; else if(icqconf::keys[i].key == CTRL(' ')) return "^space"; else if(icqconf::keys[i].key == ALT(' ')) return "alt-space"; else if(icqconf::keys[i].key == 339) return "pageup"; else if(icqconf::keys[i].key == 338) return "pagedown"; else if(icqconf::keys[i].key == 9) return "tab"; else if(icqconf::keys[i].key == 27) return "esc-esc"; else if(icqconf::keys[i].key == 331) return "insert"; else if(icqconf::keys[i].key == KEY_DC) return "del"; else if(icqconf::keys[i].alt && icqconf::keys[i].ctrl) o << "F" << (icqconf::keys[i].key-KEY_F0); else if(icqconf::keys[i].alt) o << "alt-" << (char)icqconf::keys[i].key; else if(icqconf::keys[i].ctrl) o << "^" << (char)(icqconf::keys[i].key+64); else o << (char)icqconf::keys[i].key; string ret; #ifdef HAVE_SSTREAM ret = o.str(); #else ret = string(o.str(), o.pcount()); o.freeze(false); #endif return ret; } int icqface::contactskeys(verticalmenu &m, int k) { icqcontact *c = NULL; int id = face.mcontacts->getid(face.mcontacts->menu.getpos()); if(id != -1 && ! face.mcontacts->isnode(id)) c = (icqcontact *) face.mcontacts->getref(m.getpos()+1); set capab; face.extk = 0; if(c) if(c->getdesc() != contactroot) { capab = gethook(c->getdesc().pname).getCapabs(); } switch(face.key2action(k, section_contact)) { case key_info: face.extk = ACT_INFO; break; case key_remove: face.extk = ACT_REMOVE; break; case key_quit: if (conf->getaskquit()) if(face.ask("Really Quit?", ASK_YES | ASK_NO, ASK_NO) == ASK_NO) break; face.extk = ACT_QUIT; break; case key_send_url: if(capab.count(hookcapab::urls)) face.extk = ACT_URL; break; case key_change_status: face.extk = ACT_STATUS; break; case key_history: face.extk = ACT_HISTORY; break; case key_next_chat: face.extk = ACT_DUMMY; face.next_chat(true); break; case key_prev_chat: face.extk = ACT_DUMMY; face.next_chat(false); break; case key_add: face.extk = ACT_ADD; break; case key_send_contact: if(capab.count(hookcapab::contacts)) face.extk = ACT_CONTACT; break; case key_rss_check: if(c && c->getdesc().pname == rss) face.extk = ACT_PING; break; case key_fetch_away_message: if(capab.count(hookcapab::fetchaway)) face.extk = ACT_FETCHAWAY; break; case key_user_menu: face.extk = ACT_MENU; break; case key_general_menu: face.extk = ACT_GMENU; break; case key_hide_offline: face.extk = ACT_HIDEOFFLINE; break; case key_contact_external_action: if(!ischannel(c) && c) face.extk = ACT_EXTERN; break; case key_rename: if(!ischannel(c) && c) face.extk = ACT_RENAME; break; case key_version: if(capab.count(hookcapab::version)) face.extk = ACT_VERSION; break; case key_edit: if(!ischannel(c) && c) face.extk = ACT_EDITUSER; break; case key_ignore: if(c) face.extk = ACT_IGNORE; break; case key_left_panel_move_right: face.leftpanelwidth_inc(1); face.redraw(); break; case key_left_panel_move_left: face.leftpanelwidth_inc(-1); face.redraw(); break; case key_log_panel_move_up: face.logpanelheight_inc(1); face.redraw(); break; case key_log_panel_move_down: face.logpanelheight_inc(-1); face.redraw(); break; case key_quickfind: face.extk = ACT_QUICKFIND; break; } if(face.extk && face.key2action(k, section_contact) != -1) { return m.getpos()+1; } else { return -1; } } int icqface::multiplekeys(verticalmenu &m, int k) { switch(k) { case ' ': case 'x': case 'X': return -2; case '/': return -3; } if(face.key2action(k, section_contact) == key_quickfind) return -3; return -1; } int icqface::findpgpkeys(dialogbox &db, int k) { int r; r = face.key2action(k, section_contact); switch(r) { case key_quickfind: return -3; } return -1; } string icqface::getprotocolchar(protocolname pname) const { static const string pprefixes[protocolname_size] = { "i", "y", "m", "a", "#", "j", "r", "l", "g", "n" }; if(pname > protocolname_size) return "x"; return pprefixes[pname]; } int icqface::historykeys(dialogbox &db, int k) { static string sub; switch(face.key2action(k, section_history)) { case key_search: return -2; case key_search_again: return -3; case key_quit: return -4; } return -1; } int icqface::editmsgkeys(texteditor &e, int k) { char *p; if(k == '\r' && conf->getentersends(face.passinfo.pname)) { p = e.save(""); face.editdone = strlen(p); free(p); if(face.editdone) return -1; else return 0; } switch(face.key2action(k, section_editor)) { case key_send_message: p = e.save(""); face.editdone = strlen(p); free(p); if(face.editdone) return -1; else break; case key_multiple_recipients: face.ineditor = false; face.multicontacts(""); face.ineditor = true; break; case key_history: face.ineditor = false; cicq.history(face.passinfo); face.ineditor = true; break; case key_prev_chat: face.editdone = false; face.ineditor = false; face.next_chat(false); return -1; case key_next_chat: face.editdone = false; face.ineditor = false; face.next_chat(true); return -1; case key_out_chat: face.ineditor = false; face.editdone = false; face.next_chat(false); face.last_selected = (icqcontact* ) clist.at(0); return -1; case key_info: face.ineditor = false; cicq.userinfo(face.passinfo); face.ineditor = true; break; case key_show_urls: face.ineditor = false; face.showextractedurls(); face.ineditor = true; break; case key_fullscreen: if(face.passevent) face.fullscreenize(face.passevent); break; case key_chat_panel_move_up: face.chatpanelheight_inc(1); face.stay_in_chat = true; return -1; break; case key_chat_panel_move_down: face.chatpanelheight_inc(-1); face.stay_in_chat = true; return -1; break; #ifdef HAVE_LIBOTR case key_otr_start_session: otr.start_session(face.last_selected); face.stay_in_chat = true; return -1; break; case key_otr_end_session: otr.end_session(face.last_selected); face.stay_in_chat = true; return -1; break; #endif case key_quit: return -1; } return 0; } int icqface::userinfokeys(dialogbox &db, int k) { switch(face.key2action(k, section_info)) { case key_show_urls: face.showextractedurls(); break; case key_user_external_action: face.userinfoexternal(face.passinfo); break; } return -1; } int icqface::eventviewkeys(dialogbox &db, int k) { switch(face.key2action(k, section_history)) { case key_show_urls: face.showextractedurls(); break; case key_fullscreen: face.fullscreenize(face.passevent); break; case key_quit: return 0; } return -1; } int icqface::findreskeys(dialogbox &db, int k) { if(face.key2action(k, section_contact) == key_quickfind) return -3; return -1; } int icqface::statuskeys(verticalmenu &m, int k) { char *status_order = "o_adnlcfi"; // Shortcuts for status char *p = strchr(status_order, k); if (p) return (1 + p - status_order); return -1; } int icqface::fullscreenkeys(textbrowser &m, int k) { switch(face.key2action(k, section_editor)) { case key_fullscreen: return 0; } return -1; } void icqface::editidle(texteditor &e) { cicq.idle(); } void icqface::editchatidle(texteditor &e) { icqcontact *c; cicq.idle(HIDL_SOCKEXIT); if(c = clist.get(face.passinfo)) if(c->hasevents()) { face.renderchathistory(); } } void icqface::textinputidle(textinputline &il) { cicq.idle(); } void icqface::termresize(void) { face.dotermresize = true; } void icqface::relaxedupdate() { fneedupdate = true; } bool icqface::updaterequested() { return fneedupdate; } void icqface::redraw() { if(!mainscreenblock) { done(); init(); draw(); /* * Terminal resize specific */ vector flog; vector::iterator il; face.status("#"); flog = face.lastlog; face.lastlog.clear(); bool lts, lo; conf->getlogoptions(lts, lo); conf->setlogoptions(false, lo); for(il = flog.begin() ; il != flog.end(); ++il) face.log(*il); conf->setlogoptions(lts, lo); doredraw = fneedupdate = false; } else { doredraw = fneedupdate = true; } } void icqface::xtermtitle(const string &text) { if(conf->getxtitles()) { string term = getenv("TERM") ? getenv("TERM") : ""; if(term == "xterm" || term == "Eterm" || term == "aterm" || term == "rxvt" || term.substr(0, 6) == "screen") cout << "\x1b]1;\x07\x1b]0;" << "centerim" << (text.empty() ? "" : (string) ": " + text) << "\x07" << flush; } } void icqface::xtermtitle(const char *fmt, ...) { if(conf->getxtitles()) { va_list ap; char buf[1024]; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); xtermtitle((string) buf); va_end(ap); } } void icqface::xtermtitlereset() { if(conf->getxtitles()) { const char *p = getenv("TERM"); if(p) xtermtitle((string) p); } } // ---------------------------------------------------------------------------- icqface::icqprogress::icqprogress() { w = 0; } icqface::icqprogress::~icqprogress() { delete w; } void icqface::icqprogress::log(const char *fmt, ...) { va_list ap; char buf[1024]; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); if(curline >= face.sizeDlg.height-1) { w->redraw(); curline = 0; } w->write(2, 1+curline++, buf); } void icqface::icqprogress::show(const string &title ) { if(!w) { w = new textwindow(0, 0, face.sizeDlg.width, face.sizeDlg.height, conf->getcolor(cp_dialog_frame), TW_CENTERED); } w->set_title(conf->getcolor(cp_dialog_highlight), title); w->open(); curline = 0; } void icqface::icqprogress::hide() { w->close(); } void icqface::leftpanelwidth_inc(const int inc) { int i = conf->getleftpanelwidth(); if ( ((i+inc) >= MinPanelWidth) && ((i+inc) <= (COLS - MinPanelWidth))) { conf->setleftpanelwidth(i+inc); dotermresize = true ; } } void icqface::logpanelheight_inc(const int inc) { int i = conf->getlogpanelheight(); if (((i+inc) >= MinPanelHeight) && ((i+inc) <= (LINES - MinPanelHeight))) { conf->setlogpanelheight(i+inc); dotermresize = true ; } } void icqface::chatpanelheight_inc(const int inc ) { chatlines = conf->getchatpanelheight()+inc; conf->setchatpanelheight(chatlines); } centerim-4.22.10/src/imlogger.cc0000644000175000001440000001041711473007750013315 00000000000000/* * * centerim events logger class * $Id: imlogger.cc,v 1.11 2003/10/31 00:55:53 konst Exp $ * * Copyright (C) 2002 by Konstantin Klyagin * * 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 "imlogger.h" #include "icqconf.h" #include "icqcontacts.h" #include "icqmlist.h" #include "icqface.h" static const char* imstatus2name(imstatus st) { switch(st) { case offline: return _("Offline"); case available: return _("Online"); case invisible: return _("Invisible"); case freeforchat: return _("Free for chat"); case dontdisturb: return _("DND"); case occupied: return _("Occupied"); case notavail: return _("N/A"); case outforlunch: return _("Out for Lunch"); case away: return _("Away"); } return ""; } const char *streventname(imevent::imeventtype type) { switch(type) { case imevent::message: return _("message"); case imevent::url: return _("URL"); case imevent::sms: return _("SMS"); case imevent::authorization: return _("authorization"); case imevent::email: return _("e-mail"); case imevent::notification: return _("notification"); case imevent::contacts: return _("contacts"); case imevent::file: return _("files"); case imevent::xml: return _("event"); } return ""; } imlogger logger; imlogger::imlogger() { } imlogger::~imlogger() { if(f.is_open()) { f.close(); } } bool imlogger::checkopen() { if(conf->getmakelog()) { if(!f.is_open()) { f.open((conf->getdirname() + "log").c_str(), ios::app); if(f.is_open()) putmessage(_("events log started")); } return f.is_open(); } return false; } void imlogger::putmessage(const string &text) { string towrite; time_t t; if(checkopen()) { time(&t); towrite = ctime(&t); towrite.resize(towrite.size()-1); towrite += ": " + text; f << towrite << endl; // f.flush(); } } void imlogger::putevent(const imevent &ev) { char buf[512], *fmt; string text, name; icqcontact *c; if(checkopen()) { switch(ev.getdirection()) { case imevent::outgoing: fmt = _("outgoing %s to %s"); break; case imevent::incoming: fmt = _("incoming %s from %s"); break; } name = ev.getcontact().totext(); if(c = clist.get(ev.getcontact())) { name += " (" + c->getdispnick() + ")"; } snprintf(buf, sizeof(buf), fmt, streventname(ev.gettype()), name.c_str()); text = buf; if(lst.inlist(ev.getcontact(), csignore)) { text += string() + ", " + _("ignored"); } putmessage(text); } } void imlogger::putonline(const imcontact &cont, const imstatus &oldst, const imstatus &st) { char buf[512], *fmt; string name; icqcontact *c; if(st != oldst) { if(oldst == offline) { fmt = _("%s [%s] comes online"); } else if(st == offline) { fmt = _("%s went offline"); } else { fmt = _("%s is now %s, was %s"); } name = cont.totext(); if(c = clist.get(cont)) { name += " (" + c->getdispnick() + ")"; } snprintf(buf, sizeof(buf), fmt, name.c_str(), imstatus2name(st), imstatus2name(oldst)); if(checkopen()) { putmessage(buf); } bool lts, lo; conf->getlogoptions(lts, lo); if(lo) { face.log((string) "+ " + buf); } } } void imlogger::putourstatus(const protocolname &pname, const imstatus &oldst, const imstatus &st) { char *fmt, buf[512]; if(checkopen()) { if(st != oldst) { if(oldst == offline) { fmt = _("%s: went online, with status %s"); } else if(st == offline) { fmt = _("%s: went offline"); } else { fmt = _("changed our %s status to %s from %s"); } snprintf(buf, sizeof(buf), fmt, conf->getprotocolname(pname).c_str(), imstatus2name(st), imstatus2name(oldst)); putmessage(buf); } } } centerim-4.22.10/src/imcontact.h0000644000175000001440000000255511461606612013336 00000000000000#ifndef __imcontact_H__ #define __imcontact_H__ #include "icqcommon.h" enum protocolname { icq = 0, yahoo, msn, aim, irc, jabber, rss, livejournal, gadu, infocard, protocolname_size }; ENUM_PLUSPLUS(protocolname) enum imstatus { offline = 0, available, invisible, freeforchat, dontdisturb, occupied, notavail, away, outforlunch, imstatus_size }; ENUM_PLUSPLUS(imstatus) static char imstatus2char[imstatus_size] = { '_', 'o', 'i', 'f', 'd', 'c', 'n', 'a', 'l' }; class icqcontact; struct imcontact { imcontact(); imcontact(unsigned long auin, protocolname apname); imcontact(const string &anick, protocolname apname); imcontact(const icqcontact *c); string nickname; unsigned long uin; protocolname pname; bool operator == (const imcontact &ainfo) const; bool operator != (const imcontact &ainfo) const; bool operator < (const imcontact &ainfo) const; bool operator == (protocolname pname) const; bool operator != (protocolname pname) const; bool operator < (protocolname pname) const; bool empty() const; string totext() const; }; extern imcontact contactroot; bool ischannel(const imcontact &cont); bool islivejournal(const icqcontact *c); bool islivejournal(const imcontact &cont); string imstatus2str(imstatus st); #endif centerim-4.22.10/src/centerim.cc0000644000175000001440000012007111461606612013313 00000000000000/* * * centerim core routines * $Id: centerim.cc,v 1.197 2005/05/02 15:23:58 konst Exp $ * * Copyright (C) 2001-2003 by Konstantin Klyagin * * 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 "centerim.h" #include "icqconf.h" #include "icqhook.h" #include "irchook.h" #include "yahoohook.h" #include "rsshook.h" #include "ljhook.h" #include "icqface.h" #include "icqcontact.h" #include "icqcontacts.h" #include "icqmlist.h" #include "icqgroups.h" #include "accountmanager.h" #include "imexternal.h" #ifdef HAVE_LIBOTR #include "imotr.h" #endif #ifdef HAVE_LIBXSS #include #endif volatile bool centerim::signaled = false; centerim::centerim() : timer_checkmail(0), timer_update(0), timer_resend(0), timer_autosave(0), regmode(false) { } centerim::~centerim() { } void centerim::exec() { struct sigaction sact; memset(&sact, 0, sizeof(sact)); sact.sa_handler = &handlesignal; sigaction(SIGINT, &sact, 0); sigaction(SIGCHLD, &sact, 0); sigaction(SIGALRM, &sact, 0); sigaction(SIGUSR1, &sact, 0); sigaction(SIGUSR2, &sact, 0); sigaction(SIGTERM, &sact, 0); kinterface(); raw(); conf->load(); face.init(); if(regmode = !conf->getouridcount()) { bool rus = false; char *p = setlocale(LC_MESSAGES, NULL); if(p) if(rus = ((string(p)).substr(0, 2) == "ru")) { conf->setcharsets("cp1251", "koi8-r"); for(protocolname pname = icq; pname != protocolname_size; pname++) conf->setcpconvert(pname, true); } if(updateconf()) { manager.exec(); } regmode = false; } if(conf->getouridcount()) { conf->checkdir(); conf->load(); groups.load(); clist.load(); lst.load(); conf->loadsounds(); face.done(); face.init(); face.draw(); checkparallel(); inithooks(); if(checkpasswords()) { mainloop(); } lst.save(); clist.save(); groups.save(); } face.done(); conf->save(); } bool centerim::checkpasswords() { protocolname pname; icqconf::imaccount ia; bool r; r = regmode = true; for(pname = icq; pname != protocolname_size; pname++) { if(gethook(pname).enabled() && !gethook(pname).getCapabs().count(hookcapab::optionalpassword)) { if(!(ia = conf->getourid(pname)).empty()) { if(ia.password.empty()) { conf->setsavepwd(false); ia.password = face.inputstr("[" + conf->getprotocolname(pname) + "] " + _("password: "), "", '*'); if(ia.password.empty()) { r = false; break; } else if(face.getlastinputkey() != KEY_ESC) { conf->setourid(ia); } } } } } regmode = false; return r; } void centerim::inithooks() { protocolname pname; for(pname = icq; pname != protocolname_size; pname++) { gethook(pname).init(); } } void centerim::mainloop() { bool finished = false; string text, url; int action, gid; icqcontact *c; char buf[512]; vector::iterator i; face.draw(); while(!finished) { face.status(_("%s contact menu, %s status, %s general, %s/%s next/prev chat, %s quit"), face.getstatkey(key_user_menu, section_contact).c_str(), face.getstatkey(key_change_status, section_contact).c_str(), face.getstatkey(key_general_menu, section_contact).c_str(), face.getstatkey(key_next_chat, section_contact).c_str(), face.getstatkey(key_prev_chat, section_contact).c_str(), face.getstatkey(key_quit, section_contact).c_str()); face.xtermtitle(); c = face.mainloop(action); switch(action) { case ACT_IGNORELIST: face.modelist(csignore); break; case ACT_VISIBLELIST: face.modelist(csvisible); break; case ACT_INVISLIST: face.modelist(csinvisible); break; case ACT_STATUS: changestatus(); break; case ACT_ORG_GROUPS: face.organizegroups(); break; case ACT_MASS_MOVE: massmove(); break; case ACT_TRANSFERS: face.transfermonitor(); break; case ACT_HIDEOFFLINE: conf->sethideoffline(!conf->gethideoffline()); face.update(); break; case ACT_DETAILS: manager.exec(); break; case ACT_FIND: find(); break; case ACT_JOINDIALOG: joindialog(); break; case ACT_RSS: linkfeed(); break; #ifdef HAVE_LIBOTR case ACT_OTR: otr.dialog(); break; #endif case ACT_CONF: updateconf(); break; case ACT_QUICKFIND: face.quickfind(); break; case ACT_QUIT: finished = true; break; } if(!c) continue; switch(action) { case ACT_URL: sendevent(imurl(c->getdesc(), imevent::outgoing, "", ""), icqface::ok); break; case ACT_SMS: sendevent(imsms(c->getdesc(), imevent::outgoing, c->getpostponed()), icqface::ok); break; case ACT_LJ: sendevent(imxmlevent(c->getdesc(), imevent::outgoing, c->getpostponed()), icqface::ok); break; case ACT_CONTACT: sendevent(imcontacts(c->getdesc(), imevent::outgoing, vector< pair >()), icqface::ok); break; case ACT_AUTH: sendevent(imauthorization(c->getdesc(), imevent::outgoing, imauthorization::Request, ""), icqface::ok); break; case ACT_FILE: sendevent(imfile(c->getdesc(), imevent::outgoing), icqface::ok); break; case ACT_IGNORE: if(lst.inlist(c->getdesc(), csignore)) { lst.del(c->getdesc(), csignore); } else { snprintf(buf, sizeof(buf), _("Ignore all events from %s?"), c->getdesc().totext().c_str()); if(face.ask(buf, ASK_YES | ASK_NO, ASK_NO) == ASK_YES) { lst.push_back(modelistitem(c->getdispnick(), c->getdesc(), csignore)); if(!ischannel(c)) { snprintf(buf, sizeof(buf), _("Remove %s from the contact list as well?"), c->getdesc().totext().c_str()); if(face.ask(buf, ASK_YES | ASK_NO, ASK_NO) == ASK_YES) { clist.remove(c->getdesc()); face.update(); } } } } break; case ACT_EDITUSER: c->save(); if(face.updatedetails(c, c->getdesc().pname)) { if(c->getdesc().pname == infocard) c->setdispnick(c->getnick()); c->save(); face.relaxedupdate(); } else { c->load(); } break; case ACT_ADD: if(!c->inlist()) if(!ischannel(c) || !gethook(c->getdesc().pname).getCapabs().count(hookcapab::conferencesaretemporary)) addcontact(c->getdesc()); break; case ACT_INFO: userinfo(c->getdesc()); break; case ACT_REMOVE: snprintf(buf, sizeof(buf), _("Are you sure want to remove %s?"), c->getdesc().totext().c_str()); if(face.ask(buf, ASK_YES | ASK_NO, ASK_NO) == ASK_YES) { clist.remove(c->getdesc()); face.update(); } break; case ACT_RENAME: text = face.inputstr(_("New nickname to show: "), c->getdispnick()); if(face.getlastinputkey() != KEY_ESC) { c->setdispnick(text); gethook(c->getdesc().pname).updatecontact(c); face.update(); } break; case ACT_GROUPMOVE: if(gid = face.selectgroup(_("Select a group to move the user to"))) { c->setgroupid(gid); face.fillcontactlist(); face.update(); } break; case ACT_HISTORY: history(c->getdesc()); break; case ACT_FETCHAWAY: { abstracthook &hook = gethook(c->getdesc().pname); if(hook.getstatus() != offline) { hook.requestawaymsg(c->getdesc()); } else { face.log(_("+ cannot fetch away messages being offline")); } } break; case ACT_VERSION: gethook(c->getdesc().pname).requestversion(c->getdesc()); break; case ACT_PING: gethook(c->getdesc().pname).ping(c->getdesc()); break; case ACT_CONFER: if(gethook(c->getdesc().pname).getCapabs().count(hookcapab::conferencesaretemporary)) createconference(c); break; case ACT_JOIN: case ACT_LEAVE: { icqcontact::basicinfo cb = c->getbasicinfo(); cb.requiresauth = c->getstatus() == offline; c->setstatus(cb.requiresauth ? available : offline); c->setbasicinfo(cb); } break; case ACT_EXTERN: face.userinfoexternal(c->getdesc()); break; case ACT_PGPSWITCH: c->setusepgpkey(!c->getusepgpkey()); break; case ACT_PGPKEY: text = c->getpgpkey(); if(!text.empty()) { c->setpgpkey(""); } else { if(face.selectpgpkey(text, false)) c->setpgpkey(text); } break; case ACT_MSG: case 0: if(conf->getchatmode(c->getdesc().pname)) { while(face.chat(c->getdesc()) == true); } else { if(c->hasevents()) { readevents(c->getdesc()); } else { if(c->getdesc().pname != infocard && c->getdesc().pname != rss) { sendevent(immessage(c->getdesc(), imevent::outgoing, c->getpostponed()), icqface::ok); } } } break; } } } void centerim::changestatus() { imstatus st; bool proceed, setaway; string tmp, prompt, awaymsg; icqconf::imaccount ia; vector pnames; vector::const_iterator ipname; if(face.changestatus(pnames, st)) { if(!conf->enoughdiskspace()) { face.log(_("! cannot connect, free disk space is less than 10k")); } else { proceed = true; setaway = false; bool same = true; for(ipname = pnames.begin(); ipname != pnames.end(); ++ipname) { if(conf->getaskaway()) setaway = setaway || gethook(*ipname).getCapabs().count(hookcapab::setaway); if(!conf->getourid(*ipname).empty()) { tmp = conf->getawaymsg(*ipname); if(!tmp.empty()) { if(awaymsg.empty()) awaymsg = tmp; else same = same && tmp == awaymsg; } } } if(!same) awaymsg = ""; if(setaway) switch(st) { case away: case notavail: case outforlunch: case occupied: case dontdisturb: if(pnames.size() == 1) prompt = conf->getprotocolname(pnames.front()) + ": "; prompt += _("away message"); proceed = setaway = face.edit(tmp = conf->getawaymsg(pnames.front()), prompt); break; default: setaway = false; break; } if(proceed) for(ipname = pnames.begin(); ipname != pnames.end(); ++ipname) { if(!gethook(*ipname).enabled()) { face.log(_("! support for %s was disabled at build time"), conf->getprotocolname(*ipname).c_str()); } else { abstracthook &hook = gethook(*ipname); if(setaway && !tmp.empty()) if(hook.getCapabs().count(hookcapab::setaway)) conf->setawaymsg(*ipname, tmp); hook.setstatus(st); reconnect[*ipname].timer = timer_current; } } face.update(); } } } void centerim::joindialog() { static imsearchparams s; icqcontact *c; if(face.finddialog(s, icqface::fschannel)) { imcontact ic(s.nick, s.pname); abstracthook &h = gethook(s.pname); if(ic.nickname.substr(0, 1) != "#") ic.nickname.insert(0, "#"); if(h.getCapabs().count(hookcapab::groupchatservices)) { if(ic.nickname.find("@") == -1) ic.nickname += "@" + s.service; } if(h.getCapabs().count(hookcapab::conferencesaretemporary)) { createconference(imcontact("", s.pname)); } else if(c = cicq.addcontact(ic)) { icqcontact::basicinfo cb = c->getbasicinfo(); if(h.getCapabs().count(hookcapab::channelpasswords)) cb.zip = s.password; cb.requiresauth = true; c->setbasicinfo(cb); c->setstatus(available); } } } void centerim::linkfeed() { icqcontact *c; imsearchparams s; s.pname = rss; s.checkfrequency = 120; if(face.finddialog(s, icqface::fsrss)) { if(c = cicq.addcontact(imcontact(0, rss))) { icqcontact::workinfo wi = c->getworkinfo(); wi.homepage = s.url; // syndication url c->setworkinfo(wi); icqcontact::moreinfo mi = c->getmoreinfo(); mi.checkfreq = s.checkfrequency; c->setmoreinfo(mi); c->setnick(s.nick); c->setdispnick(s.nick); c->save(); } } } void centerim::find() { static imsearchparams s; bool ret = true; icqcontact *c; while(ret) { if(ret = face.finddialog(s, icqface::fsuser)) { switch(s.pname) { case infocard: c = clist.addnew(imcontact(0, infocard), true); c->setnick(s.nick); c->setdispnick(s.nick); if(face.updatedetails(c)) { addcontact(c->getdesc()); } if(!c->inlist()) { clist.remove(c->getdesc()); } else { c->save(); } face.update(); ret = false; break; default: ret = face.findresults(s); break; } } } } void centerim::userinfo(const imcontact &cinfo) { if(ischannel(cinfo)) { imsearchparams s; s.pname = cinfo.pname; s.room = cinfo.nickname; face.findresults(s, true); } else { imcontact realuin = cinfo; icqcontact *c = clist.get(cinfo); if(!c) { c = clist.get(contactroot); realuin = contactroot; c->clear(); gethook(cinfo.pname).requestinfo(cinfo); } if(c) { face.userinfo(cinfo, realuin); } } } bool centerim::updateconf() { bool r; icqconf::regsound snd = icqconf::rsdontchange; icqconf::regcolor clr = icqconf::rcdontchange; if(r = face.updateconf(snd, clr)) { if(snd != icqconf::rsdontchange) { conf->setregsound(snd); unlink(conf->getconfigfname("sounds").c_str()); conf->loadsounds(); configstats.erase("sound"); } if(clr != icqconf::rcdontchange) { conf->setregcolor(clr); unlink(conf->getconfigfname("colorscheme").c_str()); conf->loadcolors(); face.done(); face.init(); face.draw(); configstats.erase("colorscheme"); } face.update(); } return r; } void centerim::checkmail() { if(!getenv("MAIL")) return; struct stat st; int mcount = 0; char buf[512]; string lastfrom, fname(getenv("MAIL")); bool prevempty, header; FILE *f; static int fsize = -1; static int oldcount = -1; bool lts, lo; conf->getlogoptions(lts, lo); if(conf->getmailcheck()) if(!stat(fname.c_str(), &st)) if(st.st_size != fsize && (st.st_mode & S_IFREG)) { if(fsize != -1 && st.st_size > fsize) { /* * * I.e. only if mailbox has grown after the recent check. * */ if(f = fopen(fname.c_str(), "r")) { prevempty = header = true; while(!feof(f)) { freads(f, buf, sizeof(buf)); if(prevempty && !strncmp(buf, "From ", 5)) { lastfrom = strim(buf+5); mcount++; header = true; } else if(header && !strncmp(buf, "From: ", 6)) { lastfrom = strim(buf+6); } if(prevempty = !buf[0]) header = false; } fclose(f); } if(mcount && (oldcount == -1 || (mcount > oldcount))) { const struct tm *lt; lt = localtime(&timer_current); if (lts) face.log(_("+ new mail arrived, %d messages"), mcount); else face.log(_("+ [%02d:%02d:%02d] new mail arrived, %d messages"), lt->tm_hour, lt->tm_min, lt->tm_sec, mcount); face.log(_("+ last msg from %s"), lastfrom.c_str()); clist.get(contactroot)->playsound(imevent::email); } oldcount = mcount; } fsize = st.st_size; } else if(st.st_mode & S_IFDIR) { DIR *d; struct dirent *e; string dname; time_t last = -1; dname = (string) fname + "/new/"; if(!stat(dname.c_str(), &st) && st.st_mode & S_IFDIR) if(d = opendir(dname.c_str())) { fname = ""; while((e = readdir(d))) if(!stat((dname+e->d_name).c_str(), &st) && (st.st_mode & S_IFREG)) { mcount++; if(st.st_mtime >= last) { last = st.st_mtime; fname = dname + e->d_name; } } closedir(d); if(f = fopen(fname.c_str(), "r")) { header = true; while(header && !feof(f)) { freads(f, buf, sizeof(buf)); if(!strncmp(buf, "From: ", 6)) { lastfrom = strim(buf+6); header = false; // we're done } } fclose(f); } if(mcount && (oldcount == -1 || (mcount > oldcount))) { const struct tm *lt; lt = localtime(&timer_current); if (lts) face.log(_("+ new mail arrived, %d messages"), mcount); else face.log(_("+ [%02d:%02d:%02d] new mail arrived, %d messages"), lt->tm_hour, lt->tm_min, lt->tm_sec, mcount); face.log(_("+ last msg from %s"), lastfrom.c_str()); clist.get(contactroot)->playsound(imevent::email); } oldcount = mcount; } } } void centerim::checkconfigs() { static const char *configs[] = { "sounds", "colorscheme", "actions", "external", "keybindings", 0 }; struct stat st; const char *p; for(int i = 0; p = configs[i]; i++) { if(stat(conf->getconfigfname(p).c_str(), &st)) st.st_mtime = 0; if(configstats.find(p) != configstats.end()) { if(st.st_mtime != configstats[p]) { switch(i) { case 0: conf->loadsounds(); break; case 1: endwin(); initscr(); conf->loadcolors(); face.redraw(); break; case 2: conf->loadactions(); break; case 3: external.load(); break; case 4: conf->loadkeys(); break; } face.log(_("+ the %s configuration was changed, reloaded"), p); } } configstats[p] = st.st_mtime; } } void centerim::handlesignal(int signum) { int status, pid; switch(signum) { case SIGCHLD: /*while((pid = wait3(&status, WNOHANG, 0)) > 0) { // In case the child was a nowait external action string sname = conf->getdirname() + "centerim-external-tmp." + i2str(pid); unlink(sname.c_str()); }*/ signaled = true; break; case SIGUSR1: cicq.rereadstatus(); break; case SIGUSR2: clist.load(); break; case SIGALRM: break; case SIGTERM: lst.save(); clist.save(); groups.save(); conf->save(); face.done(); signal(SIGTERM, 0); kill(0, SIGTERM); break; } } void centerim::checkparallel() { string pidfname = conf->getdirname() + "pid", fname; int pid = 0; //Not used - char exename[512]; ifstream f(pidfname.c_str()); if(f.is_open()) { f >> pid; f.close(); } if(!(fname = readlink((string) "/proc/" + i2str(pid) + "/exe")).empty() && (pid != getpid())) { if(justfname(fname) == "centerim") { face.log(_("! another running copy of centerim detected")); face.log(_("! this may cause problems. pid %lu"), pid); } } else { pid = 0; } if(!pid) { ofstream of(pidfname.c_str()); if(of.is_open()) { of << getpid() << endl; of.close(); } } } void centerim::rereadstatus() { protocolname pname; icqconf::imaccount ia; for(pname = icq; pname != protocolname_size; pname++) { ia = conf->getourid(pname); if(!ia.empty()) { char cst; imstatus st; string fname = conf->getconfigfname((string) "status-" + conf->getprotocolname(pname)); ifstream f(fname.c_str()); if(f.is_open()) { f >> cst, f.close(), f.clear(); unlink(fname.c_str()); for(st = offline; st != imstatus_size; st++) { if(imstatus2char[st] == cst) { gethook(pname).setstatus(st); break; } } } } } } bool centerim::sendevent(const imevent &ev, icqface::eventviewresult r) { bool proceed; string text, fwdnote; imevent *sendev; icqcontact *c; vector::iterator i; sendev = 0; face.muins.clear(); if(ev.getdirection() == imevent::incoming) { fwdnote = ev.getcontact().totext(); } else { fwdnote = "I"; } fwdnote += " wrote:\n\n"; if(ev.gettype() == imevent::message) { const immessage *m = dynamic_cast(&ev); text = m->gettext(); if(r == icqface::reply) { if(m->getcontact().pname == rss) if(islivejournal(m->getcontact())) { imxmlevent *x = new imxmlevent(m->getcontact(), imevent::outgoing, ""); string url = clist.get(m->getcontact())->getmoreinfo().homepage; int npos = text.rfind(url), id = 0; if(npos != -1) id = strtoul(text.c_str()+url.size()+npos, 0, 0); x->setfield("_eventkind", "comment"); x->setfield("replyto", i2str(id)); sendev = x; } if(conf->getquote()) text = quotemsg(text); else text = ""; } else if(r == icqface::forward) { text = fwdnote + text; } if(!sendev) { sendev = new immessage(m->getcontact(), imevent::outgoing, text); } } else if(ev.gettype() == imevent::xml) { const imxmlevent *m = dynamic_cast(&ev); text = m->gettext(); if(r == icqface::reply) { if(conf->getquote()) text = quotemsg(text); else text = ""; } else if(r == icqface::forward) { text = fwdnote + text; sendev = new immessage(m->getcontact(), imevent::outgoing, text); } if(!sendev) { sendev = new imxmlevent(m->getcontact(), imevent::outgoing, text); } } else if(ev.gettype() == imevent::url) { const imurl *m = dynamic_cast(&ev); text = m->getdescription(); switch(r) { case icqface::forward: text = fwdnote + text; case icqface::ok: sendev = new imurl(m->getcontact(), imevent::outgoing, m->geturl(), text); break; case icqface::reply: /* reply to an URL is a message */ sendev = new immessage(m->getcontact(), imevent::outgoing, ""); break; } } else if(ev.gettype() == imevent::authorization) { const imauthorization *m = dynamic_cast(&ev); text = m->getmessage(); switch(r) { case icqface::ok: sendev = new imauthorization(m->getcontact(), imevent::outgoing, m->getauthtype(), text); break; case icqface::forward: text = fwdnote + m->gettext(); case icqface::reply: /* reply to an URL is a message */ sendev = new immessage(m->getcontact(), imevent::outgoing, text); break; } } else if(ev.gettype() == imevent::sms) { const imsms *m = dynamic_cast(&ev); string phone = m->getphone(); if(phone.empty() && (c = clist.get(ev.getcontact()))) { icqcontact::basicinfo b = c->getbasicinfo(); if(b.cellular.find_first_of("0123456789") == -1) { b.cellular = face.inputstr(_("Mobile number: "), b.cellular); if((b.cellular.find_first_of("0123456789") == -1) || (face.getlastinputkey() == KEY_ESC)) return false; c->setbasicinfo(b); c->save(); } phone = b.cellular; } text = m->getmessage(); if(r == icqface::reply) { if(conf->getquote()) { text = quotemsg(text); } else { text = ""; } } else if(r == icqface::forward) { text = fwdnote + text; } sendev = new imsms(m->getcontact(), imevent::outgoing, text, phone); } else if(ev.gettype() == imevent::contacts) { const imcontacts *m = dynamic_cast(&ev); switch(r) { case icqface::forward: case icqface::ok: sendev = new imcontacts(m->getcontact(), imevent::outgoing, m->getcontacts()); break; case icqface::reply: /* reply to contacts is a message */ sendev = new immessage(m->getcontact(), imevent::outgoing, ""); break; } } else if(ev.gettype() == imevent::file) { sendev = new imfile(ev); } else if(ev.gettype() == imevent::notification) { const imnotification *m = dynamic_cast(&ev); text = m->gettext(); if(r == icqface::reply) { if(conf->getquote()) text = quotemsg(text); else text = ""; } else if(r == icqface::forward) { text = fwdnote + text; } if(!sendev) { sendev = new immessage(m->getcontact(), imevent::outgoing, text); } } if(proceed = sendev) { switch(r) { case icqface::forward: if(proceed = face.multicontacts()) proceed = !face.muins.empty(); break; case icqface::reply: case icqface::ok: face.muins.push_back(ev.getcontact()); break; } if(proceed) { if(r == icqface::forward) sendev->setcontact(*(face.muins.begin())); if(proceed = face.eventedit(*sendev)) if(proceed = !sendev->empty()) { for(i = face.muins.begin(); i != face.muins.end(); ++i) { sendev->setcontact(*i); em.store(*sendev); } face.muins.clear(); face.muins.push_back(ev.getcontact()); } } } if(sendev) { delete sendev; } face.update(); return proceed; } icqface::eventviewresult centerim::readevent(const imevent &ev, const vector &buttons) { bool b1, b2; return readevent(ev, b1, b2, buttons); } icqface::eventviewresult centerim::readevent(const imevent &ev, bool &enough, bool &fin, const vector &buttons) { icqface::eventviewresult r = face.eventview(&ev, buttons); imcontact cont = ev.getcontact(); string nickname, tmp; if(ev.gettype() == imevent::contacts) { const imcontacts *m = static_cast(&ev); if(face.extk <= m->getcontacts().size() && face.extk > 0) { vector< pair >::const_iterator icc = m->getcontacts().begin()+face.extk-1; nickname = icc->second; cont = imcontact(); cont.pname = ev.getcontact().pname; if(!(cont.uin = icc->first)) cont.nickname = nickname; } } switch(r) { case icqface::forward: sendevent(ev, r); break; case icqface::reply: sendevent(ev, r); enough = true; break; case icqface::ok: enough = true; break; case icqface::cancel: fin = true; break; case icqface::open: if(const imurl *m = static_cast(&ev)) conf->execaction("openurl", m->geturl()); break; case icqface::accept: switch(ev.gettype()) { case imevent::authorization: em.store(imauthorization(ev.getcontact(), imevent::outgoing, imauthorization::Granted, "accepted")); enough = true; break; case imevent::file: tmp = face.inputdir(_("directory to save the file(s) to: "), getenv("HOME")); if(enough = (!tmp.empty() && !access(tmp.c_str(), X_OK))) { if(enough = !access(tmp.c_str(), W_OK)) { const imfile *f = static_cast(&ev); gethook(ev.getcontact().pname).replytransfer(*f, true, tmp); } else { face.status(_("The specified directory is not writable")); } } else { face.status(_("The specified directory does not exist")); } break; } break; case icqface::reject: switch(ev.gettype()) { case imevent::authorization: em.store(imauthorization(ev.getcontact(), imevent::outgoing, imauthorization::Rejected, "rejected")); break; case imevent::file: gethook(ev.getcontact().pname).replytransfer(*static_cast(&ev), false); break; } enough = true; break; case icqface::info: cicq.userinfo(cont); break; case icqface::add: icqcontact *c = cicq.addcontact(cont); if(c) c->setdispnick(nickname); break; } return r; } void centerim::readevents(const imcontact cont) { vector events; vector::iterator iev; icqcontact *c = clist.get(cont); bool fin, enough; if(c) { fin = false; face.saveworkarea(); while(c->hasevents() && !fin) { events = em.getevents(cont, c->getlastread()); fin = events.empty(); for(iev = events.begin(); (iev != events.end()) && !fin; ++iev) { if((*iev)->getdirection() == imevent::incoming) { enough = false; while(!enough && !fin) { readevent(**iev, enough, fin); } } c->setlastread((*iev)->gettimestamp()); } while(!events.empty()) { delete events.back(); events.pop_back(); } } c->save(); face.restoreworkarea(); face.update(); } } void centerim::history(const imcontact &cont) { icqface::eventviewresult r; imevent *im = 0; bool enough; vector events; vector::iterator i; vector buttons; buttons.push_back(icqface::prev); buttons.push_back(icqface::next); events = em.getevents(cont, 0); if(!events.empty()) { face.saveworkarea(); face.histmake(events); while(face.histexec(im)) { enough = false; while(!enough) { r = readevent(*im, buttons); switch(r) { case icqface::cancel: case icqface::ok: enough = true; break; case icqface::next: i = ::find(events.begin(), events.end(), im); enough = i == events.begin(); if(!enough) { i--; im = *i; } break; case icqface::prev: i = ::find(events.begin(), events.end(), im); enough = i == events.end()-1; if(!enough) { i++; im = *i; } break; } } } face.restoreworkarea(); face.status("@"); while(!events.empty()) { delete events.back(); events.pop_back(); } } else { face.log(_("+ no history items for %s"), cont.totext().c_str()); } } string centerim::quotemsg(const string &text) { string ret; vector lines; vector::iterator i; breakintolines(text, lines, 50/*face.sizeWArea.x2-face.sizeWArea.x1-4*/); for(i = lines.begin(); i != lines.end(); ++i) { if(!i->empty()) ret += (string) "> " + *i; ret = trailcut(ret); ret += "\n"; } return ret; } icqcontact *centerim::addcontact(const imcontact &ic, bool reqauth) { icqcontact *c; int groupid = 0; if(c = clist.get(ic)) { if(c->inlist()) { face.log(_("+ user %s is already on the list"), ic.totext().c_str()); return 0; } } imauthorization auth(ic, imevent::outgoing, imauthorization::Request, ""); if(reqauth) if(!face.eventedit(auth)) return 0; if(conf->getgroupmode() != icqconf::nogroups) { groupid = face.selectgroup(_("Select a group to add the user to")); if(!groupid) return 0; } if(!c) { if(ic.pname == rss) { c = clist.addnew(imcontact(0, rss), false, groupid); icqcontact::workinfo wi = c->getworkinfo(); wi.homepage = ic.nickname; c->setworkinfo(wi); if(!ic.nickname.empty()) { string bfeed = ic.nickname; getrword(bfeed, "/"); c->setnick(getrword(bfeed, "/") + "@lj"); c->setdispnick(c->getnick()); gethook(ic.pname).sendnewuser(c); } } else { c = clist.addnew(ic, false, groupid, reqauth); } } else { c->includeintolist(groupid, reqauth); } if(reqauth) { em.store(auth); } face.log(_("+ %s has been added to the list"), c->getdesc().totext().c_str()); face.relaxedupdate(); return c; } bool centerim::idle(int options ) { bool keypressed, online, fin; fd_set rfds, wfds, efds; struct timeval tv; int hsockfd; protocolname pname; for(keypressed = fin = false; !keypressed && !fin; ) { timer_keypress = lastkeypress(); FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds); hsockfd = 0; FD_SET(hsockfd, &rfds); online = false; if(!regmode) { exectimers(); for(pname = icq; pname != protocolname_size; pname++) { abstracthook &hook = gethook(pname); if(hook.online()) { hook.getsockets(rfds, wfds, efds, hsockfd); online = true; } } } tv.tv_sec = face.updaterequested() ? 1 : 20; tv.tv_usec = 0; select(hsockfd+1, &rfds, &wfds, &efds, &tv); if(FD_ISSET(0, &rfds)) { keypressed = true; time(&timer_keypress); } else { for(pname = icq; pname != protocolname_size; pname++) { abstracthook &hook = gethook(pname); if(hook.online()) if(hook.isoursocket(rfds, wfds, efds)) { hook.main(); fin = fin || (options & HIDL_SOCKEXIT); } } } } return keypressed; } void centerim::setauto(imstatus astatus) { protocolname pname; imstatus stcurrent; static bool autoset = false; bool nautoset, changed = false; if(astatus == available && !autoset) return; nautoset = autoset; if(autoset && (astatus == available)) { face.log(_("+ the user is back")); nautoset = false; } for(pname = icq; pname != protocolname_size; pname++) { abstracthook &hook = gethook(pname); stcurrent = hook.getstatus(); if(hook.logged()) switch(stcurrent) { case invisible: case offline: break; default: if(autoset && (astatus == available)) { face.log(_("+ [%s] status restored"), conf->getprotocolname(pname).c_str()); hook.restorestatus(); nautoset = false; changed = true; } else { if(astatus == away && stcurrent == notavail) break; if(astatus != stcurrent) if(!autoset || (autoset && (stcurrent == away))) { hook.setautostatus(astatus); nautoset = changed = true; face.log(_("+ [%s] automatically set %s"), conf->getprotocolname(pname).c_str(), astatus == away ? _("away") : _("n/a")); } } break; } } if(changed) { autoset = nautoset; face.relaxedupdate(); } } #define MINCK0(x, y) (x ? (y ? (x > y ? y : x) : x) : y) void centerim::exectimers() { protocolname pname; int paway, pna; bool fonline = false; bool pusex = false; time(&timer_current); /* * * Execute regular actions for all the hooks. * */ for(pname = icq; pname != protocolname_size; pname++) { if(!conf->getourid(pname).empty() || (pname == rss)) { abstracthook &hook = gethook(pname); /* * * A hook's own action goes first. * */ hook.exectimers(); if(timer_current-reconnect[pname].timer > reconnect[pname].period) { /* * * Any need to try auto re-connecting? * */ if(!hook.logged()) { reconnect[pname].timer = timer_current; if(reconnect[pname].period < 180) reconnect[pname].period += reconnect[pname].period/2; if(hook.online()) { hook.disconnect(); } else if(hook.getmanualstatus() != offline) { if(conf->enoughdiskspace() && !manager.isopen()) { hook.connect(); } } } else { fonline = true; reconnect[pname] = reconnectInfo(); } } } } /* * * How let's find out how are the auto-away mode is doing. * */ conf->getauto(paway, pna, pusex); if(fonline && (paway || pna || conf->getscreenna())) { imstatus toset = offline; static map autostat; if(autostat.empty()) { autostat[available] = false; autostat[notavail] = false; autostat[away] = false; } /* * Use auto-away or auto-na? */ if(paway || pna) { #ifndef HAVE_LIBXSS if(paway && timer_current-timer_keypress > paway*60) toset = away; if(pna && timer_current-timer_keypress > pna*60) toset = notavail; if(timer_current-timer_keypress < MINCK0(paway, pna)*60) toset = available; #else time_t idle_time = timer_current - timer_keypress; if (pusex) { Display* dpy = XOpenDisplay(0); if (dpy) { XScreenSaverInfo i; Status s = XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), &i); if (s != 0) { // XScreenSaver extension supported idle_time = i.idle / 1000; } XCloseDisplay(dpy); } } if(paway && idle_time > paway*60) toset = away; if(pna && idle_time > pna*60) toset = notavail; if(idle_time < MINCK0(paway, pna)*60) toset = available; #endif } /* * Check if we are still attached to our screen session */ if (conf->getscreenna()) { // this section is based on the patch of danne@wiberg.nu // See: http://www.wiberg.nu/software/cicq-patches/centericq-4.20.0-screenaway.patch const char *screen_socket_path; char *screen_socket_name, *screen_user; char screen_socket[256] = ""; int screen_socket_bytes = 0; // Bytes written in the screen_socket int screen_attached = 0; /* Screen is attached by default */ /* Check if we're really running centerim in a screen session */ if((screen_socket_name=getenv("STY")) != NULL) { /* * Construct socket path, e.g.: * /var/run/screen/S-oliver/1234.centerim */ screen_socket_path = conf->getscreensocketpath().c_str(); screen_user=getenv("USER"); screen_socket_bytes = snprintf(screen_socket, sizeof(screen_socket), "%s/S-%s/%s", screen_socket_path, screen_user, screen_socket_name); /* Check if the socket path really exists */ if(!conf->getscreensocketpath().empty() && !access(conf->getscreensocketpath().c_str(), X_OK) && screen_socket_bytes > 0 && screen_socket_bytes < sizeof(screen_socket)) { screen_attached = access(screen_socket, X_OK); /* Screen is no longer attached, change status to N/A */ if(screen_attached != 0) { toset = notavail; if(autostat[notavail] == false) /* We just changed to away */ face.log(_("+ Set N/A after screen detach")); } else { /* Screen is attached */ /* The user attached the screen */ if ((autostat[notavail] == true) && (toset != notavail)) { toset = available; } } } else { face.log(_("! Screen socket path doesn't exist!")); face.log(_("! Correct path or disable screen auto presence change")); } } } /* * Check if the status needs to be changed */ if(toset != offline && !autostat[toset]) { setauto(toset); if(toset == available) { autostat[away] = autostat[notavail] = false; } else { autostat[toset] = true; } } } if(timer_current-timer_resend > PERIOD_RESEND) { /* * * We'll check for free disk space here too. * */ checkconfigs(); conf->checkdiskspace(); if(!conf->enoughdiskspace()) { if(fonline) { for(pname = icq; pname != protocolname_size; pname++) gethook(pname).disconnect(); face.log(_("! free disk space is less than 10k, going offline")); face.log(_("! otherwise we can lose events and configuration")); } } else { if (signaled) { /* Check for finished external actions */ signaled = false; pid_t child; while ((child = waitpid(-1, NULL, WNOHANG)) > 0) { string sname = conf->getdirname() + "centerim-external-tmp." + i2str(child); unlink(sname.c_str()); } } /* * * Re-send the idle IM events. * */ em.resend(); face.relaxedupdate(); } timer_resend = timer_current; } if(timer_current-timer_checkmail > PERIOD_CHECKMAIL) { checkmail(); timer_checkmail = timer_current; } if(timer_current-timer_autosave > PERIOD_AUTOSAVE) { clist.save(false); timer_autosave = timer_current; } if(face.updaterequested()) if(timer_current-timer_update > PERIOD_DISPUPDATE) { face.update(); timer_update = timer_current; } } void centerim::createconference(const imcontact &ic) { int apid = 0; imcontact confid("", ic.pname); set ps; ps.insert(ic.pname); face.muins.clear(); if(!ic.empty()) face.muins.push_back(ic); if(face.multicontacts(_("Invite to conference.."), ps)) if(!face.muins.empty()) { do { confid.nickname = (string) "#" + conf->getourid(ic.pname).nickname + "-" + i2str(getpid() + ++apid); } while(clist.get(confid)); icqcontact *nc = clist.addnew(confid); nc->setstatus(available); abstracthook &hook = gethook(ic.pname); hook.conferencecreate(nc, face.muins); } } void centerim::massmove() { int gid; vector::iterator im; icqcontact *c; face.muins.clear(); if(face.multicontacts(_("Select contacts to move"))) if(!face.muins.empty()) if(gid = face.selectgroup(_("Mass move selected users to.."))) { for(im = face.muins.begin(); im != face.muins.end(); ++im) { if(c = clist.get(*im)) { c->setgroupid(gid); } } face.fillcontactlist(); face.update(); } } // ---------------------------------------------------------------------------- bool ischannel(const imcontact &cont) { if(cont.nickname.substr(0, 1) == "#") if(gethook(cont.pname).getCapabs().count(hookcapab::conferencing)) return true; return false; } bool islivejournal(const icqcontact *c) { bool r = false; #ifdef BUILD_LJ if(c->getnick().size() > 3) r = c->getnick().substr(c->getnick().size()-3) == "@lj"; #endif return r; } bool islivejournal(const imcontact &cont) { icqcontact *c = clist.get(cont); return c ? islivejournal(c) : false; } string up(string s) { string::iterator is = s.begin(); while(is != s.end()) { *is = toupper(*is); ++is; } return s; } string lo(string s) { string::iterator is = s.begin(); while(is != s.end()) { *is = tolower(*is); ++is; } return s; } string stripspaces(string s) { string::iterator is = s.begin(); string result; while (is != s.end()) { if (*is != ' ') result.push_back(*is); is++; }; return result; } centerim-4.22.10/src/icqmlist.cc0000644000175000001440000000713511461606612013337 00000000000000/* * * centerim user mode list class * $Id: icqmlist.cc,v 1.17 2002/11/29 15:57:39 konst Exp $ * * Copyright (C) 2001,2002 by Konstantin Klyagin * * 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 "icqmlist.h" #include "icqconf.h" #include "abstracthook.h" icqlist::icqlist() { } icqlist::~icqlist() { } string icqlist::getfname() const { return conf->getconfigfname("modelist"); } void icqlist::load() { string buf, tok, nick; protocolname pname; ifstream f; int i; f.open(getfname().c_str()); if(f.is_open()) { while(!f.eof()) { getstring(f, buf); tok = getword(buf); if(!tok.empty()) if(i = atoi(tok.c_str())) { nick = unmime(getword(buf)); if(!nick.empty() && !buf.empty()) { pname = conf->getprotocolbyletter(buf[0]); switch(pname) { case icq: lst.push_back(modelistitem(nick, imcontact(strtoul(buf.c_str(), 0, 0), icq), (contactstatus) i)); break; default: lst.push_back(modelistitem(nick, imcontact(nick, pname), (contactstatus) i)); break; } } } } f.close(); } } void icqlist::save() { vector::iterator i; ofstream f; if(conf->enoughdiskspace()) { f.open(getfname().c_str()); if(f.is_open()) { for(i = begin(); i != end(); ++i) { f << (int) i->getstatus() << "\t"; f << mime(i->getnick()) << "\t"; f << conf->getprotocolprefix(i->getdesc().pname); if(i->getdesc().uin) f << i->getdesc().uin; f << endl; } f.close(); } } } void icqlist::fillmenu(verticalmenu *m, contactstatus ncs) { int capab; vector::iterator i; m->clear(); menucontents.clear(); for(i = begin(); i != end(); ++i) { if(i->getstatus() == ncs) { m->additem(conf->getprotcolor(i->getdesc().pname), 0, " " + i->getnick()); menucontents.push_back(*i); } } } bool icqlist::inlist(const imcontact &cinfo, contactstatus ncs) const { vector::const_iterator i; i = begin(); while((i = find(i, end(), cinfo)) != end()) { if(i->getstatus() == ncs) return true; i++; } return false; } void icqlist::del(const imcontact &cinfo, contactstatus ncs) { vector::iterator i; i = begin(); while((i = find(i, end(), cinfo)) != end()) { if(i->getstatus() == ncs) { erase(i); break; } i++; } } modelistitem icqlist::menuat(int pos) const { return menucontents[pos]; } // ---------------------------------------------------------------------------- string modelistitem::getnick() const { return nick; } contactstatus modelistitem::getstatus() const { return cs; } imcontact modelistitem::getdesc() const { return cdesc; } void modelistitem::setstatus(contactstatus ncs) { cs = ncs; } bool modelistitem::operator == (const imcontact &cinfo) const { return cdesc == cinfo; } bool modelistitem::operator != (const imcontact &cinfo) const { return !(*this == cinfo); } centerim-4.22.10/src/git-version.cc0000644000175000001440000000014511461606612013752 00000000000000 #include "centerim.h" #include "git-version.h" char const * const centerim::version = GIT_VERSION; centerim-4.22.10/src/captcha.cc0000644000175000001440000000362411461606612013114 00000000000000#include "icqconf.h" #include "icqface.h" #include "captcha.h" captcha::captcha() { } captcha::~captcha() { questions_t::iterator i; for (i = questions.begin() ; i != questions.end() ; i++ ) { delete *i; } } bool captcha::docaptcha(imcontact c) { if (captchas.find(c) == captchas.end()) { return false; } else { captchas_t::iterator i; captchaasked_t *ca; set *a; i = captchas.find(c); ca = &(i->second); a = ca->answers; return true; } } void captcha::donecaptcha(imcontact c) { captchas.erase(c); } bool captcha::checkcaptcha(imcontact c, string answer) { captchas_t::iterator i; captchaasked_t *ca; i = captchas.find(c); if (i != captchas.end()) { ca = &(i->second); if (ca->expiry < time(NULL)) { captchas.erase(c); return false; } else { return (ca->answers->find(lo(answer)) != ca->answers->end()); } } return false; } string captcha::getcaptchaquestion(imcontact c) { question_t *t; captchaasked_t ca; t = questions[(int)(questions.size() * (rand() / (RAND_MAX + 1.0)))]; ca.answers = &t->answers; ca.expiry = conf->getcaptchatimeout() * 60 + time(NULL); captchas[c] = ca; return t->question; } void captcha::addquestion(string data) { question_t *q; string::size_type pos; pos = data.find("//"); if (pos == string::npos) { return; } else { q = new question_t; q->question = data.substr(0, pos); data.erase(0, pos + 2); while (data.length()) { pos = data.find("::"); if (pos == string::npos) { q->answers.insert(lo(data)); data.erase(); } else if (pos == 0) { data.erase(); } else { q->answers.insert(lo(data.substr(0, pos))); data.erase(0, pos + 2); } } if (q->answers.empty()) { delete q; } else { questions.push_back(q); } } } bool captcha::empty() { return questions.empty(); } unsigned int captcha::size() { return questions.size(); } centerim-4.22.10/src/imcontact.cc0000644000175000001440000000572611461606612013477 00000000000000/* * * centerim IM contact basic info class * $Id: imcontact.cc,v 1.21 2005/01/23 13:21:46 konst Exp $ * * Copyright (C) 2002 by Konstantin Klyagin * * 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 "imcontact.h" #include "icqcontact.h" #include "icqconf.h" imcontact contactroot(0, icq); imcontact::imcontact() { } imcontact::imcontact(unsigned long auin, protocolname apname) { uin = auin; pname = apname; } imcontact::imcontact(const string &anick, protocolname apname) { nickname = anick; pname = apname; uin = 0; } imcontact::imcontact(const icqcontact *c) { if(c) *this = c->getdesc(); } bool imcontact::operator == (const imcontact &ainfo) const { bool r = (ainfo.uin == uin) && (ainfo.pname == pname); if(r) switch(pname) { case aim: r = r & (up(stripspaces(ainfo.nickname)) == up(stripspaces(nickname))); break; case irc: case yahoo: case jabber: r = r & (up(ainfo.nickname) == up(nickname)); break; default: r = r & (ainfo.nickname == nickname); break; } return r; } bool imcontact::operator != (const imcontact &ainfo) const { return !(*this == ainfo); } bool imcontact::operator < (const imcontact &ainfo) const { return false; /*TODO: fix this to something meaningfull! */ } bool imcontact::operator == (protocolname apname) const { return apname == pname; } bool imcontact::operator != (protocolname apname) const { return !(*this == apname); } bool imcontact::operator < (protocolname apname) const { return (*this < apname); } bool imcontact::empty() const { return !uin && nickname.empty(); } string imcontact::totext() const { string r; if(!uin && nickname.empty()) r = "..."; else if(uin) r = "[" + conf->getprotocolname(pname) + "] " + i2str(uin); else r = "[" + conf->getprotocolname(pname) + "] " + nickname; return r; } string imstatus2str(imstatus st) { static map mst; if(mst.empty()) { mst[offline] = _("Offline"); mst[available] = _("Online"); mst[invisible] = _("Invisible"); mst[freeforchat] = _("Free for chat"); mst[dontdisturb] = _("Do not disturb"); mst[occupied] = _("Occupied"); mst[notavail] = _("Not available"); mst[away] = _("Away"); mst[outforlunch] = _("Out for Lunch"); mst[imstatus_size] = ""; } return mst[st]; } centerim-4.22.10/src/eventmanager.h0000644000175000001440000000117711461606612014030 00000000000000#ifndef __EVENTMANAGER_H__ #define __EVENTMANAGER_H__ #include "imevents.h" class imeventmanager { private: int unsent, recentlysent; time_t lastevent; enum eventwritemode { history, offline }; void eventwrite(const imevent &ev, eventwritemode mode); imevent *eventread(ifstream &f) const; void setlock(const string &fname) const; void releaselock(const string &fname) const; public: imeventmanager(); ~imeventmanager(); void store(const imevent &ev); vector getevents(const imcontact &cont, time_t lastread) const; void resend(); int getunsentcount() const; }; extern imeventmanager em; #endif centerim-4.22.10/libicq2000/0000755000175000001440000000000011473011456012232 500000000000000centerim-4.22.10/libicq2000/INSTALL0000644000175000001440000001722711461606612013215 00000000000000Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. centerim-4.22.10/libicq2000/AUTHORS0000644000175000001440000000021211461606612013216 00000000000000 The code is copyright (C) 2001 Barnaby Gray Nils Nordman Alex Antropoff centerim-4.22.10/libicq2000/NEWS0000644000175000001440000000075711461606612012663 0000000000000020th July 2002 A minor bug-fix release of libicq2000, mainly for the benefit of the new release of ickle. Lots of tidying up for gcc 3.1. 26th April 2002 Next minor release of libicq2000. Fixes include: - Fixed handling offline messages whilst in Occupied/DND. - Fixes to direct connections - Much better capability support - Included a TODO - Firewall friendly port-range binding 16th April 2002 First release of libicq2000. 19th December 2001 libicq2000 has entered it's own CVS tree. centerim-4.22.10/libicq2000/Makefile.in0000644000175000001440000005104511473011437014223 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libicq2000 DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ AUTHORS COPYING ChangeLog INSTALL NEWS THANKS TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru liblibicq2000_a_AR = $(AR) $(ARFLAGS) liblibicq2000_a_DEPENDENCIES = src/ContactTree.o src/ContactList.o \ src/SNAC-MSG.o src/Translator.o src/SNAC-UIN.o \ src/MessageHandler.o src/SocketClient.o src/UserInfoBlock.o \ src/TLV.o src/SNAC.o src/version.o src/SNAC-BOS.o src/Xml.o \ src/SNAC-BUD.o src/exceptions.o src/Client.o src/Contact.o \ src/socket.o src/ICQ.o src/SNAC-SBL.o src/ICBMCookie.o \ src/time_extra.o src/DirectClient.o src/SNAC-base.o \ src/SNAC-LOC.o src/FileTransferClient.o src/buffer.o \ src/SMTPClient.o src/SNAC-SRV.o src/events.o src/SNAC-GEN.o \ src/Capabilities.o src/RateLimits.o am_liblibicq2000_a_OBJECTS = liblibicq2000_a_OBJECTS = $(am_liblibicq2000_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(liblibicq2000_a_SOURCES) DIST_SOURCES = $(liblibicq2000_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = NEWS TODO README THANKS AUTHORS INSTALL ChangeLog COPYING SUBDIRS = libicq2000 src AM_CPPFLAGS = -I$(top_srcdir)/libicq2000/libicq2000 noinst_LIBRARIES = liblibicq2000.a liblibicq2000_a_SOURCES = liblibicq2000_a_LIBADD = src/ContactTree.o src/ContactList.o src/SNAC-MSG.o src/Translator.o src/SNAC-UIN.o src/MessageHandler.o src/SocketClient.o src/UserInfoBlock.o src/TLV.o src/SNAC.o src/version.o src/SNAC-BOS.o src/Xml.o src/SNAC-BUD.o src/exceptions.o src/Client.o src/Contact.o src/socket.o src/ICQ.o src/SNAC-SBL.o src/ICBMCookie.o src/time_extra.o src/DirectClient.o src/SNAC-base.o src/SNAC-LOC.o src/FileTransferClient.o src/buffer.o src/SMTPClient.o src/SNAC-SRV.o src/events.o src/SNAC-GEN.o src/Capabilities.o src/RateLimits.o all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libicq2000/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu libicq2000/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) liblibicq2000.a: $(liblibicq2000_a_OBJECTS) $(liblibicq2000_a_DEPENDENCIES) -rm -f liblibicq2000.a $(liblibicq2000_a_AR) liblibicq2000.a $(liblibicq2000_a_OBJECTS) $(liblibicq2000_a_LIBADD) $(RANLIB) liblibicq2000.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/libicq2000/THANKS0000644000175000001440000000116311461606612013067 00000000000000Below is list of contributors to the libicq2000 project, as a word of thanks from the main developers. Konstantin Klyagin - Fixes Dominik 'Aeneas' Schnitzer - debian pkg stuff David Hill - fixes Alexandr Kukushkin - User info translation patch Tobias Hoffmann - invisible status info patch - socket IP order bug - port range binding Michael Smith - fix for non-printable characters in terminals Serhiy Brytskyy - translation file for wincp1251 - koi8-u (UKRAINIAN_WIN) Jason Townsend - Warnings fixes when compiling with (the somewhat pedantic) -Wall. Nils Björklund - connecting signal centerim-4.22.10/libicq2000/COPYING0000644000175000001440000005766011461606612013224 00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. ^L Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. ^L GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. ^L 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. ^L 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. ^L 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. ^L 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ^L centerim-4.22.10/libicq2000/Makefile.am0000644000175000001440000000136211461606612014211 00000000000000EXTRA_DIST = NEWS TODO README THANKS AUTHORS INSTALL ChangeLog COPYING SUBDIRS = libicq2000 src AM_CPPFLAGS = -I$(top_srcdir)/libicq2000/libicq2000 noinst_LIBRARIES = liblibicq2000.a liblibicq2000_a_SOURCES = liblibicq2000_a_LIBADD = src/ContactTree.o src/ContactList.o src/SNAC-MSG.o src/Translator.o src/SNAC-UIN.o src/MessageHandler.o src/SocketClient.o src/UserInfoBlock.o src/TLV.o src/SNAC.o src/version.o src/SNAC-BOS.o src/Xml.o src/SNAC-BUD.o src/exceptions.o src/Client.o src/Contact.o src/socket.o src/ICQ.o src/SNAC-SBL.o src/ICBMCookie.o src/time_extra.o src/DirectClient.o src/SNAC-base.o src/SNAC-LOC.o src/FileTransferClient.o src/buffer.o src/SMTPClient.o src/SNAC-SRV.o src/events.o src/SNAC-GEN.o src/Capabilities.o src/RateLimits.o centerim-4.22.10/libicq2000/ChangeLog0000644000175000001440000007030011461606612013725 000000000000002002-07-20 13:01 barnabygray * examples/Makefile.am: More header files to include in SOURCES for dist target 2002-07-18 20:46 barnabygray * examples/: Makefile.am, Select.cpp, Select.h, shell.cpp, shell.h: Fixed up working example again. 2002-07-11 00:28 barnabygray * libicq2000/DCCache.h, libicq2000/ICBMCookieCache.h, libicq2000/RequestIDCache.h, libicq2000/SeqNumCache.h, src/Client.cpp: Fix some memory leaks (thanks to lukasm for pointing them out). 2002-06-25 18:47 barnabygray * THANKS, libicq2000/Client.h, libicq2000/events.h, src/Client.cpp, src/events.cpp: Nils Björklund - connecting signal 2002-06-20 15:08 barnabygray * configure.in: Fix so libtoolize will actually be run. 2002-06-08 14:51 barnabygray * libicq2000/ICQ.h, libicq2000/MessageHandler.h, libicq2000/TLV.h, libicq2000/events.h, src/ICQ.cpp, src/MessageHandler.cpp, src/TLV.cpp, src/events.cpp: Support for Web pager messages (almost identical to Email express ones). 2002-06-08 12:57 barnabygray * src/MessageHandler.cpp: Remove updating contact status based on accept-status in ACK. 2002-05-19 15:36 barnabygray * libicq2000.m4: Correction to the m4 macro. 2002-05-17 18:18 barnabygray * examples/Makefile.am: Don't compile the examples for the moment 2002-05-17 11:40 barnabygray * examples/: PipeExec.cpp, PipeExec.h, Select.cpp, Select.h: Improved the examples 2002-05-17 11:38 barnabygray * examples/Makefile.am, examples/shell.cpp, src/Client.cpp: Aborting sending correctly when switching to offline whilst messages are still in delivery. 2002-05-16 19:02 barnabygray * src/Capabilities.cpp: Seems this capability is relevant too - re: ICQ2Go 2002-05-11 13:28 barnabygray * libicq2000/events.h, src/events.cpp: Support for copying some events easily 2002-05-10 01:09 barnabygray * src/MessageHandler.cpp: All acks to away message requests are delivered.. well they should be. 2002-05-06 01:14 barnabygray * libicq2000/Client.h, src/Client.cpp: Couple of convenience methods 2002-05-06 00:49 barnabygray * src/ICQ.cpp: Fix for compatability with licq, which seems to use different (incorrect?) accept-status flags 2002-05-05 19:38 barnabygray * src/MessageHandler.cpp: Default to delivered so it's at least defined for clients that don't do this 2002-04-30 01:03 barnabygray * configure.in: By default compile without -g flag, as discussed on ickle mailing list 2002-04-29 17:13 mitz * libicq2000/Client.h, libicq2000/SNAC-GEN.h, src/Client.cpp, src/SNAC-GEN.cpp: Web-aware 2002-04-28 23:33 barnabygray * Makefile.am: Removing debian bits 2002-04-28 23:33 barnabygray * debian/: README, changelog, control, copyright, libicq2000-dev.files, libicq2000-dev.links, libicq2000-dev.manpages, libicq2000-doc.files, libicq2000-doc.links, libicq2000.docs, libicq2000.files, rules: Removed debian files, since it's now actually in debian.. 2002-04-27 19:50 barnabygray * autogen.sh: Pick up alternate forms of libtool macro 2002-04-27 15:34 barnabygray * configure.in, src/Client.cpp: The server seems to have started sending user info updates with blank IP fields, ignore these. 2002-04-26 23:36 alant * src/Capabilities.cpp: Fix for strange RedHat's gcc-2.96 behaviour. Need to read Stroustrup once more. 2002-04-26 16:47 barnabygray * configure.in: Inc. version numbers 2002-04-26 16:44 barnabygray * libicq2000/DirectClient.h, src/DirectClient.cpp: Boo 2002-04-26 16:41 barnabygray * ChangeLog, NEWS, README, src/DirectClient.cpp: Stuff what need to be done for the next release 2002-04-26 16:18 barnabygray * libicq2000/Capabilities.h, libicq2000/Client.h, libicq2000/MessageHandler.h, libicq2000/events.h, src/Capabilities.cpp, src/Client.cpp, src/Contact.cpp, src/DirectClient.cpp, src/ICQ.cpp, src/MessageHandler.cpp, src/SMTPClient.cpp, src/SNAC-SRV.cpp, src/buffer.cpp: - Unifying more of the message handling stuff - Fix receiving offline messages whilst in occupied/DND 2002-04-23 16:09 barnabygray * libicq2000/Capabilities.h, src/Capabilities.cpp: Fix sizes 2002-04-23 14:39 barnabygray * src/Capabilities.cpp: Oops.. get it right! 2002-04-23 14:31 barnabygray * libicq2000/Capabilities.h, src/Capabilities.cpp, src/Contact.cpp, src/SNAC-MSG.cpp: Much better capability support 2002-04-22 09:55 barnabygray * libicq2000/DCCache.h: And another fix. 2002-04-22 01:24 barnabygray * libicq2000/DCCache.h, src/DirectClient.cpp: Fix direct connection (rare) segfault. 2002-04-21 15:47 barnabygray * Makefile.am: Oops.. weren't including TODO in dist 2002-04-21 15:25 barnabygray * THANKS, autogen.sh, libicq2000/Client.h, libicq2000/socket.h, src/Client.cpp, src/socket.cpp: Port range binding (esp. for people behind firewalls) thanks to Tobias Hoffmann. 2002-04-16 22:13 barnabygray * NEWS, README, TODO: For the release 2002-04-16 20:41 barnabygray * libicq2000/Client.h, libicq2000/DCCache.h, src/Client.cpp: What I want is all of the power and none of the responsibility. 2002-04-16 00:13 barnabygray * src/SNAC-MSG.cpp: Finally.. caught the bastard. (Sending advanced through server was failing) 2002-04-14 20:39 barnabygray * src/SNAC-MSG.cpp: Fixes 2002-04-14 20:09 barnabygray * libicq2000/Contact.h, libicq2000/UserInfoBlock.h, src/Client.cpp, src/Contact.cpp, src/MessageHandler.cpp, src/UserInfoBlock.cpp: Added some time statistics 2002-04-13 22:31 barnabygray * libicq2000/Capabilities.h, libicq2000/Contact.h, libicq2000/Makefile.am, libicq2000/SNAC-MSG.h, libicq2000/TLV.h, libicq2000/UserInfoBlock.h, src/Capabilities.cpp, src/Client.cpp, src/Contact.cpp, src/Makefile.am, src/SNAC-MSG.cpp, src/TLV.cpp, src/UserInfoBlock.cpp: More flexible handling of capabilities. General tidying up of code for messaging. 2002-04-11 19:07 barnabygray * src/ContactList.cpp: Better to use make_pair, it does exist in gcc 3.0 just needed the namespace prefix. 2002-04-11 15:56 thekonst * src/: ContactList.cpp, MessageHandler.cpp: Fixed two minor issues that made it impossible to build the library with gcc 3.x.x 2002-04-11 12:09 barnabygray * libicq2000/Client.h, libicq2000/SNAC-SRV.h, libicq2000/events.h, src/Client.cpp, src/SNAC-SRV.cpp: Added keyword searching in Whitepages 2002-04-10 17:32 barnabygray * Makefile.am: docs built on dist target 2002-04-08 00:24 barnabygray * libicq2000/events.h, src/Client.cpp, src/SNAC-MSG.cpp, src/events.cpp: setOfflineMessage(true) for messages sent through server as offline 2002-04-06 23:31 barnabygray * libicq2000/socket.h, src/Client.cpp, src/socket.cpp: Fixed up sockets behaviour, some of the signalling was a bit fscked. This was probably the cause of ickle being a little CPU hungry recently too. 2002-04-06 21:09 barnabygray * src/MessageHandler.cpp: Fixed bug that prevented people from reading away message 2002-04-06 16:03 barnabygray * src/SNAC-SRV.cpp: Fixed status reported for contacts searched for when they are not web-aware (it shouldn't have been STATUS_NA). 2002-04-03 07:41 mitz * libicq2000/Client.h, libicq2000/SNAC-BOS.h, src/Client.cpp, src/SNAC-BOS.cpp: Visible/invisible lists 2002-04-02 01:25 barnabygray * src/socket.cpp: Oops.. my bad 2002-04-01 22:44 alant * libicq2000/ref_ptr.h: operator= should return value 2002-04-01 20:19 mitz * libicq2000/Contact.h, libicq2000/events.h, src/Contact.cpp, src/events.cpp: Added an indicator to UserInfoChangeEvent of whether the change is a transient detail or a permanent detail. 2002-04-01 12:24 barnabygray * libicq2000/events.h, src/Client.cpp, src/events.cpp: - More small fixes/tweaks 2002-04-01 01:46 barnabygray * libicq2000/Client.h, src/Client.cpp, src/socket.cpp: - General connection/disconnection code cleanup - maybe this will catch the phantom gezillion disconnection dialogs bug 2002-03-31 21:54 barnabygray * src/ICQ.cpp: Eek.. perl good. 2002-03-31 21:22 barnabygray * libicq2000/ICQ.h, libicq2000/events.h, src/Client.cpp, src/ICQ.cpp, src/MessageHandler.cpp, src/SNAC-MSG.cpp, src/events.cpp: Fixed up User Add 'user has added you' stuff, which someone, (ehhum) didn't do fully first time. 2002-03-31 17:53 barnabygray * libicq2000/ICQ.h, libicq2000/buffer.h, src/ICQ.cpp, src/MessageHandler.cpp, src/buffer.cpp: Fixed up auth requests 2002-03-29 11:54 barnabygray * src/Contact.cpp: Status changing bug (thanks Justin for pointing it out) 2002-03-28 18:24 barnabygray * examples/shell.cpp, libicq2000/Client.h, libicq2000/Contact.h, libicq2000/ContactList.h, libicq2000/DCCache.h, libicq2000/DirectClient.h, libicq2000/ICBMCookieCache.h, libicq2000/ICQ.h, libicq2000/Makefile.am, libicq2000/MessageHandler.h, libicq2000/RequestIDCache.h, libicq2000/SMTPClient.h, libicq2000/SNAC-BUD.h, libicq2000/SNAC-SRV.h, libicq2000/SocketClient.h, libicq2000/events.h, libicq2000/ref_ptr.h, src/Client.cpp, src/Contact.cpp, src/ContactList.cpp, src/DirectClient.cpp, src/ICQ.cpp, src/Makefile.am, src/MessageHandler.cpp, src/SMTPClient.cpp, src/SNAC-BOS.cpp, src/SNAC-BUD.cpp, src/SNAC-SBL.cpp, src/SNAC-SRV.cpp, src/events.cpp: Fairly major reorganisation of library: - Changed Contacts over to using a reference counted scheme - Moved around the hierarchy of the events (especially related to ContactList and Contact events) - Removed queueing of messages in the library - Maybe some other stuff 2002-03-12 19:40 barnabygray * src/Client.cpp: EmailExpress never worked for when you receive them whilst online - probably because it was never actually implemented.. ;-) 2002-03-12 18:45 barnabygray * libicq2000/ContactList.h, src/Client.cpp, src/ContactList.cpp: Fixes for EmailExpress (pager) messages. 2002-03-07 00:13 barnabygray * src/exceptions: Be gone, you foul being. 2002-03-05 15:34 barnabygray * src/Client.cpp: Downgrade client capabilities when we fail to get an ACK on an advanced message. These seems to be occuring with ICQ2001 clients.. need to investigate. 2002-03-03 17:33 thekonst * src/userinfohelpers.cpp: Damn. 2002-03-02 17:15 barnabygray * src/Contact.cpp: Clear dynamic fields on going offline. 2002-03-02 17:13 barnabygray * src/Contact.cpp: Never attempt direct connections for offline contacts. 2002-03-02 17:06 barnabygray * src/time_extra.cpp: Ooops 2002-03-02 17:00 barnabygray * libicq2000/Makefile.am, libicq2000/time_extra.h, src/Makefile.am, src/SNAC-SRV.cpp, src/time_extra.cpp: Fix to offline messages being timestamped incorrectly if your timezone isn't GMT 2002-03-02 16:20 thekonst * libicq2000/SMTPClient.h, src/SMTPClient.cpp, src/userinfohelpers.cpp: - an interests lookup bug was fixed - and I always knew my name was difficult to spell :) 2002-03-02 14:09 barnabygray * libicq2000/ICQ.h, src/ICQ.cpp: Fixed last breakages.. hopefully I've really caught the problem as to why ACKs were screwed up for Normal messages. 2002-03-01 19:36 barnabygray * libicq2000/Client.h, src/Client.cpp: - Added setStatus for setting status without touching invisibility - Added setInvisible similarly to above 2002-03-01 17:09 thekonst * libicq2000/userinfohelpers.h, src/userinfohelpers.cpp: Just tired of seeing "todo" there all the time :) 2002-03-01 15:55 barnabygray * libicq2000/ICQ.h, src/DirectClient.cpp, src/ICQ.cpp, src/SNAC-MSG.cpp, src/SNAC-SRV.cpp, src/TLV.cpp: Fixed a major screw-up in a very recent commit that meant acks weren't being parsed properly. 2002-02-28 17:31 barnabygray * libicq2000/Client.h, libicq2000/DirectClient.h, libicq2000/ICQ.h, libicq2000/Makefile.am, libicq2000/SMTPClient.h, libicq2000/SocketClient.h, src/Client.cpp, src/DirectClient.cpp, src/ICQ.cpp, src/Makefile.am, src/SMTPClient.cpp, src/SocketClient.cpp: Fixes up to konst's really buggy code.. (only joking) :-) Just a few small minor changes. 2002-02-28 16:23 thekonst * libicq2000/Client.h, libicq2000/DirectClient.h, libicq2000/SMTPClient.h, libicq2000/events.h, src/Client.cpp, src/DirectClient.cpp, src/SMTPClient.cpp, src/events.cpp: - Added basic SMTP support to send SMS messages through E-mail gateways (SMTPClient) - Created a base interface for DirectClient and SMTPClient - Added the EmailMessageEvent class, which represents usual E-mail messages - .. and it cannot be true there are no bugs ;) 2002-02-28 08:30 thekonst * libicq2000/buffer.h, src/buffer.cpp: Added a method to extract an LF terminated string from Buffer 2002-02-27 19:17 barnabygray * src/buffer.cpp, libicq2000/buffer.h: Fixed bug in Buffer::UnpackUint16Null that meant possible evil clients could remote segfault the library. Not exploitable - no worries! 2002-02-26 16:14 barnabygray * libicq2000/events.h, src/SNAC-SRV.cpp, src/events.cpp: Fixed 2002-02-26 15:36 barnabygray * libicq2000/SNAC-SRV.h, src/Client.cpp, src/SNAC-SRV.cpp: - Changes for SMTP sending 2002-02-26 14:19 barnabygray * src/SNAC-SRV.cpp: oops, libicq2000 != ickle 2002-02-26 13:48 barnabygray * libicq2000/Contact.h, src/Client.cpp, src/Contact.cpp: - Changed icq/virtual contact system slightly - Distinguish SMSable from virtual contacts (which are not necessarily SMSable) - Fixed bug in email express created contacts 2002-02-25 19:45 barnabygray * libicq2000/constants.h, src/Client.cpp, src/DirectClient.cpp: - Log split packets only once - Make library more robust to evil people sending crap at our listening port 2002-02-21 15:53 barnabygray * libicq2000/ICQ.h, src/Client.cpp, src/ICQ.cpp, src/SNAC-MSG.cpp: Fixed auth responses. General code clean up for the really messy Message send SNAC stuff. 2002-02-20 22:51 barnabygray * src/Client.cpp: Should have been sending to normalised mobile number 2002-02-16 09:52 mitz * libicq2000/Client.h, libicq2000/events.h, src/Client.cpp, src/events.cpp: Changed server-based contact list signaling from contact-at-a-time to list-at-a-time 2002-02-15 17:36 barnabygray * THANKS, libicq2000/RequestIDCache.h, libicq2000/constants.h, libicq2000/userinfoconstants.h, src/TLV.cpp: More -Wall fixes 2002-02-13 16:08 thekonst * src/Client.cpp: Reverted the latest modification. 2002-02-13 15:25 thekonst * src/Client.cpp: Made it a little bit harder for user to add theirselves to contact list. Caused problems before. Now works great for me allowing to fetch self details without a problem. 2002-02-10 16:59 mitz * src/SNAC-SBL.cpp: Process entries where the UIN is not the first piece of information correctly. 2002-02-05 17:13 barnabygray * libicq2000/: constants.h, userinfoconstants.h: Moved AgeRange constants to a more appropriate place 2002-02-05 16:27 thekonst * libicq2000/Client.h, libicq2000/constants.h, src/Client.cpp: Min and max ages were replaced with ranges for the full WhitePages search mode. 2002-02-02 08:34 mitz * src/SNAC-SRV.cpp: Filled in the request ID field inside server requests with the low word of the SNAC request ID field. 2002-02-01 19:47 barnabygray * examples/shell.cpp, libicq2000/Cache.h, libicq2000/DCCache.h, libicq2000/RequestIDCache.h, libicq2000/events.h, src/Client.cpp, src/Contact.cpp, src/DirectClient.cpp, src/ICQ.cpp, src/SNAC-SRV.cpp, src/TLV.cpp, src/Xml.cpp, src/buffer.cpp, src/events.cpp: Removed a lot of warnings when compiled under -Wall. Thanks Jason Townsend for the patch. 2002-02-01 17:55 barnabygray * src/Client.cpp: Bug fix, for sending through server which the last priority changes broke. 2002-02-01 12:47 thekonst * libicq2000/Client.h, libicq2000/ContactList.h, libicq2000/ICQ.h, libicq2000/events.h, src/Client.cpp, src/ContactList.cpp, src/ICQ.cpp, src/events.cpp: Added support for "you were added" and e-mail express messages. 2002-01-30 22:02 barnabygray * libicq2000/Client.h, libicq2000/ICQ.h, libicq2000/events.h, src/Client.cpp, src/DirectClient.cpp, src/ICQ.cpp, src/events.cpp: Sending/receiving urgent + to contact list priorities on messages (untested) 2002-01-27 13:19 thekonst * configure.in, src/userinfohelpers.cpp: The getSystemTimezone routine couldn't be compiled under FreeBSD and obviously other system that hadn't the timezone variable in time.h. Fixed. 2002-01-26 19:31 barnabygray * libicq2000/SNAC-BOS.h, src/Client.cpp, src/DirectClient.cpp, src/SNAC-BOS.cpp: Message ACK temporary fix - send an accept-status of zero for now. 2002-01-26 13:51 thekonst * libicq2000/userinfohelpers.h, src/userinfohelpers.cpp: Time zone related routines were added to UserInfoHelpers. 2002-01-25 15:38 barnabygray * libicq2000/Client.h, libicq2000/Contact.h, libicq2000/DirectClient.h, libicq2000/events.h, src/Client.cpp, src/Contact.cpp, src/DirectClient.cpp, src/events.cpp: - Migrating status & invisibility settings across to self contact in Client - Fixed sending own status in messages - so sending whilst not online should not mess up status of remote end 2002-01-25 01:35 barnabygray * libicq2000/Makefile.am, libicq2000/userinfohelpers.h, src/Makefile.am, src/userinfohelpers.cpp: Added convenience stuff for user info 2002-01-24 15:06 thekonst * libicq2000/ICQ.h, libicq2000/events.h, src/Client.cpp, src/ICQ.cpp, src/events.cpp: Choppy choppy choppy... :) Removed unused fields from the authorization request related classes. 2002-01-24 14:41 thekonst * src/ICQ.cpp: Wrong parsing of authorization request packets was fixed. Now the message is read correctly. 2002-01-24 14:01 barnabygray * src/SNAC-SRV.cpp: Stupid mistake fix #2 of today 2002-01-24 13:48 barnabygray * src/Client.cpp: setInvisible to false when going offline.. stupid me, thanks Dominic 2002-01-23 16:49 barnabygray * libicq2000/Contact.h, src/Contact.cpp, src/ContactList.cpp, src/SNAC-SRV.cpp: Correctly associates sms responses to contacts now. 2002-01-21 14:39 barnabygray * src/socket.cpp: And actually include config.h so we will pick up the fix 2002-01-21 14:05 barnabygray * acinclude.m4, config.h.in, configure.in: Added configure check (+fix) for missing socklen_t type to help compilation on MacOS X and goodness knows what else. 2002-01-21 13:29 barnabygray * libicq2000/Contact.h, libicq2000/buffer.h, libicq2000/userinfoconstants.h, src/Contact.cpp, src/SNAC-SRV.cpp: Changed MainHomeInfo.gmt to proper type and renamed it 'timezone', which makes a lot more sense to me. 2002-01-19 15:22 thekonst * libicq2000/userinfoconstants.h: Added constants for interests categories and background types. 2002-01-19 15:19 barnabygray * libicq2000/Client.h, libicq2000/events.h, src/Client.cpp, src/Contact.cpp, src/events.cpp: - Rearrangement of events for SelfEvent - Renaming of some methods on Client for consistency 2002-01-18 16:46 barnabygray * libicq2000/Client.h, libicq2000/Contact.h, src/Client.cpp, src/Contact.cpp: Tidying up after self contact. 2002-01-18 16:17 barnabygray * libicq2000/Client.h, libicq2000/SNAC-SRV.h, libicq2000/Translator.h, libicq2000/buffer.h, libicq2000/events.h, src/Client.cpp, src/SNAC-SRV.cpp, src/Translator.cpp, src/buffer.cpp, src/events.cpp: - Added retrieving + setting own info support, thanks to Mitz's work. - Added/Fixed a few ServerToClient translations that should have been taking place. 2002-01-18 15:55 barnabygray * libicq2000/ICQ.h, src/Client.cpp, src/ICQ.cpp: Fixed invisible users -> offline not clearing invisible flag. 2002-01-15 18:44 barnabygray * libicq2000/SNAC-UIN.h: gcc 3.0 namespace fixes 2002-01-14 00:33 barnabygray * Makefile.am: Temporary fix 2002-01-13 17:18 barnabygray * Makefile.am: Updated 2002-01-13 17:18 barnabygray * libicq2000-config.1: Added manpage for libicq2000-config, mainly to meet the strict debian policy. 2002-01-13 17:17 barnabygray * doxyfile.conf: Changed doxygen config 2002-01-13 17:16 barnabygray * debian/: README, changelog, control, copyright, libicq2000-dev.files, libicq2000-dev.links, libicq2000-dev.manpages, libicq2000-doc.files, libicq2000-doc.links, libicq2000.docs, libicq2000.files, rules: Debian packaging stuff 2002-01-13 17:15 barnabygray * src/Client.cpp, libicq2000/Client.h: - Changed old FLAPHeader/FLAPFooter system over to using Buffer::marker's - Reduced a lot of code duplication in sending SNACs, with new functions FLAPwrapSNAC and FLAPwrapSNACandSend 2002-01-11 21:38 barnabygray * libicq2000/Contact.h: gcc 3.0 fixes - thanks Alex for pointing them out 2002-01-11 01:02 barnabygray * autogen.sh, config.h.in, configure.in, doxyfile.conf, libicq2000/Cache.h, libicq2000/Client.h, libicq2000/Contact.h, libicq2000/ContactList.h, libicq2000/DCCache.h, libicq2000/DirectClient.h, libicq2000/ICQ.h, libicq2000/RequestIDCache.h, libicq2000/SNAC-MSG.h, libicq2000/SNAC-SRV.h, libicq2000/SNAC-base.h, libicq2000/SeqNumCache.h, libicq2000/buffer.h, libicq2000/events.h, libicq2000/socket.h, libicq2000/userinfoconstants.h, libicq2000/version.h.in, src/Client.cpp, src/Contact.cpp, src/ContactList.cpp, src/DirectClient.cpp, src/ICBMCookie.cpp, src/ICQ.cpp, src/SNAC-MSG.cpp, src/SNAC-SRV.cpp, src/SNAC-UIN.cpp, src/SNAC-base.cpp, src/SNAC.cpp, src/TLV.cpp, src/buffer.cpp, src/events.cpp, src/socket.cpp, src/sstream_fix.h, src/version.cpp: - Added 3 types of searching - Put userinfo constants into ICQ2000 namespace - Renamed UINRelatedSubtype to UINICQSubtype - Fixes to DC timeouts - Other stuff.. etc.. blah blah 2002-01-09 20:18 nordman * libicq2000/constants.h: Wrap in the ICQ2000 namespace. 2001-12-26 17:48 mitz * src/: Client.cpp, ICQ.cpp: Mitz cleaning up his mess before somebody gets killed. 2001-12-26 17:30 mitz * src/: Client.cpp, ICQ.cpp: - Invisible mode - Additional settings (server host and port, ignore unlisted users) 2001-12-25 23:59 barnabygray * libicq2000/TLV.h, src/SNAC-LOC.cpp, src/TLV.cpp: Fixes for what Ian's patch broke. The Capabilities TLV coded was not for parsing incoming capabilities which arrive with a different TLV type then the sent ones. Changing the Capabilities TLV to parse your incoming ones and then changing the constant broke my code, and I spent a long while tracking this down so am rightfully a bit annoyed. 2001-12-25 22:28 barnabygray * libicq2000/Client.h, src/Client.cpp: Removed setInvisible at Mitz's suggestion, to avoid confusion. setStatus should always be used. 2001-12-25 21:48 barnabygray * libicq2000/Client.h, libicq2000/events.h, src/Client.cpp, src/events.cpp: Invisibility fixes 2001-12-25 19:33 barnabygray * libicq2000/Client.h, libicq2000/DirectClient.h, src/Client.cpp, src/DirectClient.cpp, src/ICQ.cpp, src/SNAC-SRV.cpp: - Away message setting 2001-12-24 18:14 mitz * src/Client.cpp: Fixes to invisibility: - Enabled logging in as invisible - Changes to visibility trigger a MyStatusChangedEvent 2001-12-24 14:26 barnabygray * libicq2000/SNAC.h, src/Client.cpp: Note to self: Check it actually compiles before a commit 2001-12-24 14:15 barnabygray * libicq2000/Client.h, libicq2000/Contact.h, libicq2000/TLV.h, libicq2000/UserInfoBlock.h, src/Client.cpp, src/Contact.cpp, src/TLV.cpp, src/UserInfoBlock.cpp: - Enabled invisibility, could do with a per user customisability. - Added fix to try to distinguish ICQlite for non-advanced message delivery. 2001-12-21 21:41 barnabygray * Makefile.am, autogen.sh, config.h.in, configure.in, libicq2000.m4, libicq2000/Makefile.am, libicq2000/version.h.in, src/Makefile.am, src/version.cpp: - m4 macros for testing for libicq2000 - version symbols in library 2001-12-21 20:05 barnabygray * Makefile.am, configure.in, libicq2000-config.in: Created a libicq2000-config script 2001-12-21 18:09 barnabygray * libicq2000/Makefile.am: Added Makefile for library headers directory 2001-12-21 17:43 barnabygray * Makefile.am, configure.in, examples/shell.cpp, libicq2000/Cache.h, libicq2000/Client.h, libicq2000/Contact.h, libicq2000/ContactList.h, libicq2000/DCCache.h, libicq2000/DirectClient.h, libicq2000/ICBMCookie.h, libicq2000/ICBMCookieCache.h, libicq2000/ICQ.h, libicq2000/RequestIDCache.h, libicq2000/SNAC-BOS.h, libicq2000/SNAC-BUD.h, libicq2000/SNAC-GEN.h, libicq2000/SNAC-LOC.h, libicq2000/SNAC-MSG.h, libicq2000/SNAC-SBL.h, libicq2000/SNAC-SRV.h, libicq2000/SNAC-UIN.h, libicq2000/SNAC-base.h, libicq2000/SNAC.h, libicq2000/SeqNumCache.h, libicq2000/TLV.h, libicq2000/Translator.h, libicq2000/UserInfoBlock.h, libicq2000/Xml.h, libicq2000/buffer.h, libicq2000/constants.h, libicq2000/custom_marshal.h, libicq2000/events.h, libicq2000/exceptions.h, libicq2000/socket.h, libicq2000/userinfoconstants.h, src/Cache.h, src/Client.cpp, src/Client.h, src/Contact.cpp, src/Contact.h, src/ContactList.cpp, src/ContactList.h, src/DCCache.h, src/DirectClient.cpp, src/DirectClient.h, src/ICBMCookie.cpp, src/ICBMCookie.h, src/ICBMCookieCache.h, src/ICQ.cpp, src/ICQ.h, src/Makefile.am, src/RequestIDCache.h, src/SNAC-BOS.cpp, src/SNAC-BUD.cpp, src/SNAC-BUD.h, src/SNAC-GEN.cpp, src/SNAC-GEN.h, src/SNAC-LOC.cpp, src/SNAC-LOC.h, src/SNAC-MSG.cpp, src/SNAC-MSG.h, src/SNAC-SBL.cpp, src/SNAC-SRV.cpp, src/SNAC-SRV.h, src/SNAC-UIN.cpp, src/SNAC-UIN.h, src/SNAC-base.cpp, src/SNAC-base.h, src/SNAC.cpp, src/SNAC.h, src/SeqNumCache.h, src/TLV.cpp, src/TLV.h, src/Translator.cpp, src/Translator.h, src/UserInfoBlock.cpp, src/UserInfoBlock.h, src/Xml.cpp, src/Xml.h, src/buffer.cpp, src/buffer.h, src/constants.h, src/custom_marshal.h, src/events.cpp, src/events.h, src/exceptions.cpp, src/exceptions.h, src/socket.cpp, src/socket.h, src/userinfoconstants.h: Many changes: - imported Mitz's additions (needs more work) - move all the installed headers in a libicq2000 directory - fixes to build process - removed uses of the hash_map, to ease compatibility with STL implementations 2001-12-20 15:33 barnabygray * doxyfile.conf: doxygen config file 2001-12-20 15:32 barnabygray * README: Spelling mistakes 2001-12-20 13:31 barnabygray * Makefile.am, README, src/Client.cpp, src/Client.h, src/DirectClient.h, src/Translator.h, src/events.cpp, src/events.h: Documented a lot of the library. Small fixes to Translator (const methods) 2001-12-20 13:13 thekonst * src/: Client.cpp, Contact.cpp, Contact.h, SNAC-SRV.cpp, SNAC-SRV.h: 100% of user details are now read. Work info along with personal interests and background/past are fetched, parsed and passed to the Contact class. 2001-12-19 18:57 barnabygray * configure.in: Autoconf guff 2001-12-19 18:24 barnabygray * ChangeLog, Makefile.am: More additions 2001-12-19 16:37 barnabygray * configure.in: Configure should now work 2001-12-19 15:56 barnabygray * configure.in: Updated 2001-12-19 15:41 barnabygray * src/: Makefile, Makefile.in: Oops, shouldn't have been in CVS 2001-12-19 15:20 barnabygray * AUTHORS, COPYING, INSTALL, NEWS, README, THANKS, TODO, autogen.sh, configure.in, src/Makefile.in: Administrivia stuff 2001-12-19 15:13 barnabygray * examples/Makefile.am, examples/shell.cpp, src/Cache.h, src/Client.cpp, src/Client.h, src/Contact.cpp, src/Contact.h, src/ContactList.cpp, src/ContactList.h, src/DCCache.h, src/DirectClient.cpp, src/DirectClient.h, src/ICBMCookie.cpp, src/ICBMCookie.h, src/ICBMCookieCache.h, src/ICQ.cpp, src/ICQ.h, src/RequestIDCache.h, src/SNAC-BUD.cpp, src/SNAC-BUD.h, src/SNAC-GEN.cpp, src/SNAC-GEN.h, src/SNAC-LOC.cpp, src/SNAC-LOC.h, src/SNAC-MSG.cpp, src/SNAC-MSG.h, src/SNAC-SRV.cpp, src/SNAC-SRV.h, src/SNAC-UIN.cpp, src/SNAC-UIN.h, src/SNAC-base.cpp, src/SNAC-base.h, src/SNAC.cpp, src/SNAC.h, src/SeqNumCache.h, src/TLV.cpp, src/TLV.h, src/Translator.cpp, src/Translator.h, src/UserInfoBlock.cpp, src/UserInfoBlock.h, src/Xml.cpp, src/Xml.h, src/buffer.cpp, src/buffer.h, src/constants.h, src/custom_marshal.h, src/events.cpp, src/events.h, src/exceptions.cpp, src/exceptions.h, src/socket.cpp, src/socket.h, src/sstream_fix.h, src/userinfoconstants.h: Modified licensing to LGPL. 2001-12-19 14:12 barnabygray * src/: Cache.h, Client.cpp, Client.h, Contact.cpp, Contact.h, ContactList.cpp, ContactList.h, DCCache.h, DirectClient.cpp, DirectClient.h, ICBMCookie.cpp, ICBMCookie.h, ICBMCookieCache.h, ICQ.cpp, ICQ.h, Makefile, Makefile.am, Makefile.in, RequestIDCache.h, SNAC-BUD.cpp, SNAC-BUD.h, SNAC-GEN.cpp, SNAC-GEN.h, SNAC-LOC.cpp, SNAC-LOC.h, SNAC-MSG.cpp, SNAC-MSG.h, SNAC-SRV.cpp, SNAC-SRV.h, SNAC-UIN.cpp, SNAC-UIN.h, SNAC-base.cpp, SNAC-base.h, SNAC.cpp, SNAC.h, SeqNumCache.h, TLV.cpp, TLV.h, Translator.cpp, Translator.h, UserInfoBlock.cpp, UserInfoBlock.h, Xml.cpp, Xml.h, buffer.cpp, buffer.h, constants.h, custom_marshal.h, events.cpp, events.h, exceptions, exceptions.cpp, exceptions.h, socket.cpp, socket.h, sstream_fix.h, userinfoconstants.h: Moved library from ickle to libicq2000 centerim-4.22.10/libicq2000/README0000644000175000001440000002306011461606612013034 00000000000000 ,--------------------------------------------------------------------, | | | libicq2000 - The C++ ICQ2000/2001 Library | | | `--------------------------------------------------------------------' Version 0.3.2 http://libicq2000.sourceforge.net/ -------------------------------------------------------------------- - Contents - -------------------------------------------------------------------- 1. Features 2. Installation - 1. Prerequisites - 2. Compiling - 3. Installation 3. History 4. Clients 5. More info for developers - 1. Contributing to libicq2000 - 2. Anonymous CVS - 3. API 6. Comments, bug fixes, etc.. 7. License -------------------------------------------------------------------- - Features - -------------------------------------------------------------------- libicq2000 is an opensource C++ library being developed to support the icq2000/2001 protocol. It is easy for developers to use as the backbone for their clients' connection to the ICQ network - all the protocol work is abstracted away in one nice object-orientated interface. libicq2000 supports: - Message sending/receiving - URL sending/receiving - SMS sending/receiving, including delivery reports (SMTP gateway delivery too) - Status changes - Authorisation Requests - "You were added" messages - Fetching user info from server (both basic and advanced) - Fetching away messages - Setting custom away messages - Direct Connections - Invisibility, including visible/invisible lists - Ignore lists See the TODO for information about planned features in progress. Please don't duplicate requests for features already mentioned in the TODO. Send legitimate feature requests to the libicq2000-devel mailing list on sourceforge: (you don't need to subscribe to post). libicq2000 is in no way affiliated with 'ICQ' or 'Mirabilis'. -------------------------------------------------------------------- - Installation - -------------------------------------------------------------------- ------------------------------------------------------------------ - Prerequisites - ------------------------------------------------------------------ You will need: * libstdc++ library (the standard C++ library) Distribution Packages required ------------ ----------------- Redhat 7.1 libstdc++-2.96-81.i386.rpm, libstdc++-devel-2.96-81.i386.rpm Other I'd appreciate any input from people on success/failures. Redhats For RPM distributions (Redhat, SuSE, etc..) - make sure you install the 'development' RPMs for all these libraries as well. Usually these are called library-devel.rpm or similar. I'm trying to build up a list of the names of the rpms that are required, so send me info about what you needed for your distribution if it's not already here. Debian libstdc++2.10 and libstdc++2.10-dev (+ Progeny, etc..) Sources for these libraries can be found at the following addresses: libstdc++: http://www.gnu.org/software/gcc/libstdc++/ (should have come with your version of gcc) ------------------------------------------------------------------ - Compiling - ------------------------------------------------------------------ Generic configure instructions can be found in INSTALL. These are the brief instructions for libicq2000: 1. Type './configure' 2. Type 'make' to compile the package On some systems that don't have gmake as the default make you might have to install and explicitly use that (usually named as gmake in that case). ------------------------------------------------------------------ - Installation - ------------------------------------------------------------------ 1. Type 'make install' as root to install the libraries. Easy as that. -------------------------------------------------------------------- - History - -------------------------------------------------------------------- libicq2000 started life out as part of the gtk-- client ickle. (http://ickle.sourceforge.net). Since the 0.3.0 release of ickle, libicq2000 has been split off into it's own release schedule, CVS tree and sourceforge project. It was always designed to work as a separate library, it seemed now that there was enough demand for it to warrant splitting development off. -------------------------------------------------------------------- - Clients - -------------------------------------------------------------------- Known clients that use this library are: * ickle - a gtkmm graphical client http://ickle.sourceforge.net/ * CenterIM - a console client http://www.centerim.org/ * ICQv7-t - an ICQ transport for Jabber http://icqv7-t.sourceforge.net/ * IcyJuice - a Mac OS X graphical client http://www.mitzpettel.com/software/icyjuice.html * Fire - a Mac OS X graphical client http://www.epicware.com/fire.html * Proteus - a Mac OS X graphical client http://www.indigofield.com/ -------------------------------------------------------------------- - More info for developers - -------------------------------------------------------------------- ------------------------------------------------------------------ - Contributing to libicq2000 - ------------------------------------------------------------------ In the spirit of opensource libicq2000 is a community effort with contributions welcomely accepted. If it's just a small patch for a bug fix, or you are wishing to help out more big time in the development please feel free to contribute. I'd prefer patches and development related questions to go to the sourceforge libicq20000-devel mailing list - so they can be seen by all the developers rather than just me. I'd suggest subscribing, although you can post even if you aren't subscribed. For submitting patches, please: a) Make sure you are working on a recent checked out copy of the anonymous CVS, often the problem has been fixed already. b) Follow code conventions in the layout of the code as it is at the moment. c) Produce the diff by running 'cvs diff -uN > my-patch.diff' d) Email the diff to I am happy to add developers to the sourceforge project, so they are able to checkout CVS with write access and contribute directly back into CVS. This will be a lot easier for both you and me in the long run, rather than exchanging patches constantly. ------------------------------------------------------------------ - Anonymous CVS - ------------------------------------------------------------------ If you are interested in using libicq2000 with your client, I'd recommend looking at the latest CVS: http://sourceforge.net/cvs/?group_id=36654 The modulename is libicq2000. Once you have checked out the sources, you must run the autogen.sh file to generate configure. Beware though - the CVS is often unstable inbetween releases. Please subscribe to the libicq2000-devel mailing list on sourceforge to stay up to date on what is going on in CVS. You will also probably want to subscribe to libicq2000-commits, so you can see what work is being done on the source. If you find a problem in CVS please check back in the archives for libicq2000-devel to check it hasn't already been acknowledged/solved. ------------------------------------------------------------------ - API - ------------------------------------------------------------------ You can find doxygen generated documentation on the libicq2000 homepage (the API link on the right). The API should be more stable now, and I am aiming to avoid breaking backward compatability in future as much as possible from now onwards. The examples directory contains the shell example, which shows how to use the library from the shell simply and how the socket callbacks interact. Other good sources of information are the ickle sourcecode, which should support all the latest features of the API. -------------------------------------------------------------------- - Comments, bug reports, etc.. - -------------------------------------------------------------------- Bug reports and development related comments should be sent to: (You don't need to be subscribed to post to the list) To keep up to date with the CVS subscribe to: This will automatically send you a brief summary of commits to CVS when they are made. You can send me mail to: Although the list is the preferred option. I am available on icq (ICQ# 12137587 Alias bee). -------------------------------------------------------------------- - License - -------------------------------------------------------------------- libicq2000 is released under the GNU LGPL license, see COPYING for copying conditions. centerim-4.22.10/libicq2000/TODO0000644000175000001440000000156311461606612012650 00000000000000 ,--------------------------------------------------------------------, | | | libicq2000 - The C++ ICQ2000/2001 Library | | | `--------------------------------------------------------------------' The official TODO list Roughly order of when they will get done, most pressing first * File transfer * Server-based contact lists * Limit message length * Parse Message too long error responses * Contact list sending/receiving * Foreground/background colour support for sending/receiving messages there is some support library side for this * Non-blocking DNS lookup at startup * Chat * Web presence enable/disable * Implement all of the login procedure - Requesting rights information, advert servers, etc.. centerim-4.22.10/libicq2000/src/0000755000175000001440000000000011473011456013021 500000000000000centerim-4.22.10/libicq2000/src/SNAC-MSG.cpp0000644000175000001440000003207611461606612014626 00000000000000/* * SNAC - Messaging services * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SNAC-MSG.h" #include "sstream_fix.h" #include "TLV.h" #include "Contact.h" using std::string; using std::ostringstream; namespace ICQ2000 { // --------------- Message (Family 0x0004) SNACs ----------------- const unsigned short MESSAGEFLAG_ALLOWED = 0x00000001; const unsigned short MESSAGEFLAG_MISSEDCALLS = 0x00000002; const unsigned short MESSAGEFLAG_TYPING = 0x00000008; void MsgAddICBMParameterSNAC::OutputBody(Buffer& b) const { b << (unsigned short)0x0000 // channel << (unsigned int) (MESSAGEFLAG_ALLOWED | MESSAGEFLAG_MISSEDCALLS | (m_typing_notif ? MESSAGEFLAG_TYPING : 0)) // message flags << (unsigned short)0x1f40 // max message snac size << (unsigned short)0x03e7 // max sender warning level << (unsigned short)0x03e7 // max receiver warning level << (unsigned short)0x0000 // min message interval << (unsigned short)0x0000; // unknown } MsgSendSNAC::MsgSendSNAC(ICQSubType *icqsubtype, bool ad) : m_icqsubtype(icqsubtype), m_advanced(ad) { } void MsgSendSNAC::setSeqNum(unsigned short seqnum) { m_seqnum = seqnum; } void MsgSendSNAC::setAdvanced(bool ad) { m_advanced = ad; } void MsgSendSNAC::setICBMCookie(const ICBMCookie& c) { m_cookie = c; } void MsgSendSNAC::set_capabilities(const Capabilities& c) { m_dest_capabilities = c; } void MsgSendSNAC::OutputBody(Buffer& b) const { // ICBM Cookie b << m_cookie; /* There is no consistency in the protocol here, * Messages are sent on channel 1 * Advanced messages are sent on channel 2 * Everything else on channel 4 */ if (m_advanced) { b << (unsigned short)0x0002; UINICQSubType *ust = dynamic_cast(m_icqsubtype); if (ust == NULL) return; // should fix // Destination UIN (screenname) b.PackByteString( Contact::UINtoString(ust->getDestination()) ); b << (unsigned short)0x0005; Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned short)0x0000 // status << m_cookie; Capabilities c; c.set_capability_flag( Capabilities::ICQServerRelay ); c.Output(b); b << (unsigned short)0x000a // TLV << (unsigned short)0x0002 << (unsigned short)0x0001; b << (unsigned short)0x000f // TLV << (unsigned short)0x0000; b << (unsigned short)0x2711; // TLV Buffer::marker m2 = b.getAutoSizeShortMarker(); b.setLittleEndian(); // -- start of first subsection Buffer::marker m3 = b.getAutoSizeShortMarker(); // unknown.. b << (unsigned short)0x0007; // Protocol version b << (unsigned int) 0x00000000 // Unknown << (unsigned int) 0x00000000 << (unsigned int) 0x00000000 << (unsigned int) 0x00000000 << (unsigned short)0x0000; b << (unsigned int) 0x00000003; // Client features (?) b << (unsigned char) 0x00; // Unknown b << m_seqnum; b.setAutoSizeMarker(m3); // -- end of first subsection // -- start of second subsection Buffer::marker m4 = b.getAutoSizeShortMarker(); b << m_seqnum; // unknown b << (unsigned int)0x00000000 << (unsigned int)0x00000000 << (unsigned int)0x00000000; b.setAutoSizeMarker(m4); // -- end of second subsection m_icqsubtype->Output(b); b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); b.setBigEndian(); b << (unsigned short)0x0003 // TLV << (unsigned short)0x0000; return; } // non-advanced if (m_icqsubtype->getType() == MSG_Type_Normal) { NormalICQSubType *nst = static_cast(m_icqsubtype); b << (unsigned short)0x0001; // Destination UIN (screenname) b.PackByteString( Contact::UINtoString(nst->getDestination()) ); string text = nst->getMessage(); /* * Message Block TLV * - contains two TLVs * 0x0501 - don't know what this is * 0x0101 - the message */ b << (unsigned short)0x0002; Buffer::marker m1 = b.getAutoSizeShortMarker(); // TLV 0x0501 - unknown b << (unsigned short)0x0501 << (unsigned short)0x0001 << (unsigned char) 0x01; // TLV 0x0101 - flags + the message b << (unsigned short)0x0101; Buffer::marker m2 = b.getAutoSizeShortMarker(); // flags - for what? b << (unsigned short)0x0000 << (unsigned short)0x0000; b.Pack(text); b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } else if (m_icqsubtype->getType() == MSG_Type_URL || m_icqsubtype->getType() == MSG_Type_AuthReq || m_icqsubtype->getType() == MSG_Type_AuthAcc || m_icqsubtype->getType() == MSG_Type_AuthRej || m_icqsubtype->getType() == MSG_Type_UserAdd) { UINICQSubType *ust = dynamic_cast(m_icqsubtype); if (ust == NULL) return; b << (unsigned short)0x0004; // Destination UIN (screenname) b.PackByteString( Contact::UINtoString(ust->getDestination()) ); /* * Data Block TLV */ b << (unsigned short)0x0005; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); b << (unsigned int)ust->getSource(); ust->Output(b); b.setAutoSizeMarker(m1); } /* * Another TLV - dunno what it means * - it doesn't seem to matter if I take this out */ b.setBigEndian(); b << (unsigned short)0x0006 << (unsigned short)0x0000; } MessageSNAC::MessageSNAC() : m_icqsubtype(NULL) { } MessageSNAC::MessageSNAC(const std::string &uin) { m_icqsubtype = new UserAddICQSubType(uin, "", "", "", false); UINICQSubType *st = dynamic_cast(m_icqsubtype); if (st != NULL) st->setSource(Contact::StringtoUIN(uin)); } MessageSNAC::MessageSNAC(const std::string &uin, const std::string &reason) { m_icqsubtype = new AuthReqICQSubType(uin, "", "", "", false, reason); UINICQSubType *st = dynamic_cast(m_icqsubtype); if (st != NULL) st->setSource(Contact::StringtoUIN(uin)); } MessageSNAC::MessageSNAC(const std::string &uin, const std::string &reason, bool granted) { if (granted) m_icqsubtype = new AuthAccICQSubType(); else m_icqsubtype = new AuthRejICQSubType(reason); UINICQSubType *st = dynamic_cast(m_icqsubtype); if (st != NULL) st->setSource(Contact::StringtoUIN(uin)); } MessageSNAC::~MessageSNAC() { if (m_icqsubtype != NULL) delete m_icqsubtype; } ICQSubType* MessageSNAC::grabICQSubType() { ICQSubType *ret = m_icqsubtype; m_icqsubtype = NULL; return ret; } void MessageSNAC::ParseBody(Buffer& b) { // ICBM Cookie b >> m_cookie; /* * Channel 0x0001 = Normal message * Channel 0x0002 = Advanced messages * Channel 0x0004 = ICQ specific features (URLs, Added to Contact List, SMS, etc.) */ unsigned short channel; b >> channel; if (channel != 0x0001 && channel != 0x0002 && channel != 0x0004) throw ParseException("Message SNAC 0x0004 0x0007 received on unknown channel"); /* * the UserInfo block comes next * this is a screenname, then some tlvs */ m_userinfo.Parse(b); /* * the Message block comes now * this is one (maybe more TLVs) with the message garbled * up inside */ if (channel == 0x0001) { TLVList tlvlist; tlvlist.Parse(b, TLV_ParseMode_MessageBlock, 40000u); // Normal message if (!tlvlist.exists(TLV_MessageData)) throw ParseException("No message data in SNAC"); MessageDataTLV *t = static_cast(tlvlist[TLV_MessageData]); // coerce this into the NormalICQSubType NormalICQSubType *nst = new NormalICQSubType(false); nst->setAdvanced(false); nst->setMessage( t->getMessage() ); nst->setEncoding( t->getFlag1() ); m_icqsubtype = nst; } else if (channel == 0x0002) { TLVList tlvlist; tlvlist.Parse(b, TLV_ParseMode_AdvMsgBlock, 40000u); if (!tlvlist.exists(TLV_AdvMsgData)) throw ParseException("No Advanced Message TLV in SNAC 0x0004 0x0007 on channel 2"); AdvMsgDataTLV *t = static_cast(tlvlist[TLV_AdvMsgData]); m_icqsubtype = t->grabICQSubType(); } else if (channel == 0x0004) { TLVList tlvlist; tlvlist.Parse(b, TLV_ParseMode_MessageBlock, 40000u); /* ICQ hacked in messages * - SMS message * - URLs * - Added to contactlist * .. */ if (!tlvlist.exists(TLV_ICQData)) throw ParseException("No ICQ data TLV in SNAC 0x0004 0x0007 on channel 4"); ICQDataTLV *t = static_cast(tlvlist[TLV_ICQData]); m_icqsubtype = t->grabICQSubType(); } else { ostringstream ostr; ostr << "Message SNAC on unsupported channel: 0x" << std::hex << channel; throw ParseException(ostr.str()); } if (m_icqsubtype != NULL && dynamic_cast(m_icqsubtype) != NULL) { UINICQSubType *ust = dynamic_cast(m_icqsubtype); ust->setSource( m_userinfo.getUIN() ); } } MessageACKSNAC::MessageACKSNAC() : m_icqsubtype(NULL) { } MessageACKSNAC::MessageACKSNAC(ICBMCookie c, UINICQSubType *icq) : m_cookie(c), m_icqsubtype(icq) { } MessageACKSNAC::~MessageACKSNAC() { if (m_icqsubtype != NULL) delete m_icqsubtype; } void MessageACKSNAC::OutputBody(Buffer& b) const { b << m_cookie << (unsigned short)0x0002; b.PackByteString( Contact::UINtoString( m_icqsubtype->getSource() ) ); b << (unsigned short)0x0003; // unknown b.setLittleEndian(); // -- start of first subsection Buffer::marker m1 = b.getAutoSizeShortMarker(); // unknown.. b << (unsigned short)0x0007; // Protocol version b << (unsigned int) 0x00000000 // Unknown << (unsigned int) 0x00000000 << (unsigned int) 0x00000000 << (unsigned int) 0x00000000 << (unsigned short)0x0000; b << (unsigned int) 0x00000003; // Client features (?) b << (unsigned char) 0x00; // Unknown b << m_icqsubtype->getSeqNum(); b.setAutoSizeMarker(m1); // -- end of first subsection // -- start of second subsection Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_icqsubtype->getSeqNum(); // unknown b << (unsigned int)0x00000000 << (unsigned int)0x00000000 << (unsigned int)0x00000000; b.setAutoSizeMarker(m2); // -- end of second subsection m_icqsubtype->Output(b); } void MessageACKSNAC::ParseBody(Buffer& b) { b >> m_cookie; unsigned short channel; b >> channel; string sn; unsigned int uin; b.UnpackByteString(sn); uin = Contact::StringtoUIN(sn); b.advance(2); // 0x0003 unknown unsigned short len; b.setLittleEndian(); // -- first section, mostly unknown/useless b >> len; b.advance(len); // ---- // -- second section unsigned short seqnum; b >> len; b >> seqnum; b.advance(len - 2); // 12 zeroes usually // ---- ICQSubType *t = ICQSubType::ParseICQSubType(b, true, true); if (t != NULL) { m_icqsubtype = dynamic_cast(t); if (m_icqsubtype != NULL) { m_icqsubtype->setSource(uin); m_icqsubtype->setSeqNum(seqnum); } else { delete t; } } /* trailing GUID ? */ if (b.remains() > 0) { unsigned int len; b >> len; b.advance(len); } } void MessageOfflineUserSNAC::ParseBody(Buffer& b) { /** * The server sends this packet to you if you try sending a * message to a user who is offline. If it was an advanced * message you sent, then it needs to be retried as a * non-advanced message. */ b >> m_cookie >> m_channel; unsigned char len; string sn; b >> len; b.Unpack(sn, len); m_uin = Contact::StringtoUIN(sn); } void MessageTypingNotificationSNAC::ParseBody(Buffer& b) { b >> m_cookie >> m_channel; unsigned char len; string sn; b >> len; b.Unpack(sn, len); m_uin = Contact::StringtoUIN(sn); b >> m_type; } } centerim-4.22.10/libicq2000/src/Capabilities.cpp0000644000175000001440000001404711461606612016045 00000000000000/* * Capabilities * * Copyright (C) 2002 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "Capabilities.h" #include using std::set; namespace ICQ2000 { /* * Capability blocks. (Thanks libfaim for figuring out these - many * are only relevant to AIM, but included for completeness) * * These are CLSIDs. They should actually be of the form: * * {0x0946134b, 0x4c7f, 0x11d1, * {0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, * * But, eh. */ const struct Capabilities::Block Capabilities::caps[] = { /* * Chat is oddball. */ {Chat, {0x74, 0x8f, 0x24, 0x20, 0x62, 0x87, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, /* * These are mostly in order. */ {Voice, {0x09, 0x46, 0x13, 0x41, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {SendFile, {0x09, 0x46, 0x13, 0x43, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, /* * Advertised by the EveryBuddy client. */ {ICQ, {0x09, 0x46, 0x13, 0x44, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {IMImage, {0x09, 0x46, 0x13, 0x45, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {BuddyIcon, {0x09, 0x46, 0x13, 0x46, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {SaveStocks, {0x09, 0x46, 0x13, 0x47, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {GetFile, {0x09, 0x46, 0x13, 0x48, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {ICQServerRelay, {0x09, 0x46, 0x13, 0x49, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, /* * Indeed, there are two of these. The former appears to be correct, * but in some versions of winaim, the second one is set. Either they * forgot to fix endianness, or they made a typo. It really doesn't * matter which. */ {Games, {0x09, 0x46, 0x13, 0x4a, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {Games2, {0x09, 0x46, 0x13, 0x4a, 0x4c, 0x7f, 0x11, 0xd1, 0x22, 0x82, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {SendBuddyList, {0x09, 0x46, 0x13, 0x4b, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {ICQUnknown2, {0x09, 0x46, 0x13, 0x4e, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}, {ICQRTF, {0x97, 0xb1, 0x27, 0x51, 0x24, 0x3c, 0x43, 0x34, 0xad, 0x22, 0xd6, 0xab, 0xf7, 0x3f, 0x14, 0x92}}, {ICQUnknown, {0x2e, 0x7a, 0x64, 0x75, 0xfa, 0xdf, 0x4d, 0xc8, 0x88, 0x6f, 0xea, 0x35, 0x95, 0xfd, 0xb6, 0xdf}}, {Empty, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, {TrillianCrypt, {0xf2, 0xe7, 0xc7, 0xf4, 0xfe, 0xad, 0x4d, 0xfb, 0xb2, 0x35, 0x36, 0x79, 0x8b, 0xdf, 0x00, 0x00}}, {APInfo, {0xaa, 0x4a, 0x32, 0xb5, 0xf8, 0x84, 0x48, 0xc6, 0xa3, 0xd7, 0x8c, 0x50, 0x97, 0x19, 0xfd, 0x5b}}, {Typing, {0x56, 0x3f, 0xc8, 0x09, 0x0b, 0x6f, 0x41, 0xbd, 0x9f, 0x79, 0x42, 0x26, 0x09, 0xdf, 0xa2, 0xf3}} }; Capabilities::Capabilities() { } void Capabilities::default_icq2000_capabilities() { clear(); set_capability_flag( ICQ ); set_capability_flag( ICQServerRelay ); } void Capabilities::default_icq2002_capabilities() { clear(); set_capability_flag( ICQ ); set_capability_flag( ICQServerRelay ); set_capability_flag( ICQRTF ); // set_capability_flag( ICQUnknown2 ); } void Capabilities::clear() { m_flags.clear(); } void Capabilities::set_capability_flag(Flag f) { m_flags.insert(f); } void Capabilities::clear_capability_flag(Flag f) { m_flags.erase(f); } bool Capabilities::has_capability_flag(Flag f) const { return (m_flags.count(f) > 0); } void Capabilities::Parse(Buffer& b, unsigned short len) { int i = len / sizeof_cap; unsigned char cap[sizeof_cap]; for (int j = 0; j < i; ++j) { b.Unpack(cap, sizeof_cap); // search for capability in list for (unsigned int k = 0; k < sizeof(caps) / sizeof(Block); ++k) if ( memcmp( caps[k].data, cap, sizeof_cap ) == 0 ) { set_capability_flag( caps[k].flag ); break; } // might be nice to catch unknown capabilities } // any remainder (there shouldn't be any, but..) b.advance( len - i * sizeof_cap ); } void Capabilities::Output(Buffer& b) const { for (set::const_iterator curr = m_flags.begin(); curr != m_flags.end(); ++curr) for (unsigned int i = 0; i < sizeof(caps) / sizeof(Block); ++i) if ( caps[i].flag == *curr ) { b.Pack( caps[i].data, sizeof_cap ); break; } } unsigned short Capabilities::get_length() const { return sizeof_cap * m_flags.size(); } /* * This can be done properly based on the actual capability now - as * opposed to the dodgy method based on length that was used before. */ bool Capabilities::get_accept_adv_msgs() const { return (has_capability_flag(ICQ) && has_capability_flag(ICQServerRelay)); } } centerim-4.22.10/libicq2000/src/SNAC-LOC.h0000644000175000001440000000306311461606612014254 00000000000000/* * SNAC - Location services * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SNAC_LOC_H #define SNAC_LOC_H #include "SNAC-base.h" namespace ICQ2000 { // Locate (Family 0x0002) const unsigned short SNAC_LOC_Error = 0x0001; const unsigned short SNAC_LOC_RightsReq = 0x0002; const unsigned short SNAC_LOC_Rights = 0x0003; const unsigned short SNAC_LOC_SetUserInfo = 0x0004; // ----------------- Location (Family 0x0002) SNACs ------------- class LOCFamilySNAC : virtual public SNAC { public: unsigned short Family() const { return SNAC_FAM_LOC; } }; class SetUserInfoSNAC : public LOCFamilySNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: SetUserInfoSNAC() { } unsigned short Subtype() const { return SNAC_LOC_SetUserInfo; } }; } #endif centerim-4.22.10/libicq2000/src/DirectClient.h0000644000175000001440000000637311461606612015475 00000000000000/* * DirectClient * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef DIRECTCLIENT_H #define DIRECTCLIENT_H #include #include "libicq2000/sigslot.h" #include #include "socket.h" #include "buffer.h" #include "events.h" #include "exceptions.h" #include "Contact.h" #include "ContactTree.h" #include "SeqNumCache.h" #include "SocketClient.h" #include "MessageHandler.h" namespace ICQ2000 { class UINICQSubType; class DirectClient : public SocketClient { private: enum State { NOT_CONNECTED, WAITING_FOR_INIT, WAITING_FOR_INIT_ACK, WAITING_FOR_INIT2, CONNECTED }; State m_state; Buffer m_recv; ContactRef m_self_contact; ContactRef m_contact; ContactTree *m_contact_list; MessageHandler *m_message_handler; bool m_incoming; unsigned short m_remote_tcp_version; unsigned int m_remote_uin; unsigned char m_tcp_flags; unsigned short m_eff_tcp_version; unsigned int m_local_ext_ip, m_session_id; unsigned short m_local_server_port; void Parse(); void ParseInitPacket(Buffer &b); void ParseInitAck(Buffer &b); void ParseInit2(Buffer &b); void ParsePacket(Buffer& b); void ParsePacketInt(Buffer& b); void SendInitAck(); void SendInitPacket(); void SendInit2(); void SendPacketEvent(MessageEvent *ev); void SendPacketAck(ICQSubType *i); void Send(Buffer &b); bool Decrypt(Buffer& in, Buffer& out); void Encrypt(Buffer& in, Buffer& out); static unsigned char client_check_data[]; SeqNumCache m_msgcache; std::list m_msgqueue; unsigned short m_seqnum; unsigned short NextSeqNum(); void ConfirmUIN(); void expired_cb(MessageEvent *ev); void flush_queue(); void Init(); public: DirectClient(ContactRef self, TCPSocket *sock, MessageHandler *mh, ContactTree *cl, unsigned int ext_ip, unsigned short server_port); DirectClient(ContactRef self, ContactRef c, MessageHandler *mh, unsigned int ext_ip, unsigned short server_port); ~DirectClient(); void Connect(); void FinishNonBlockingConnect(); void Recv(); unsigned int getUIN() const; unsigned int getIP() const; unsigned short getPort() const; int getfd() const; TCPSocket* getSocket() const; void clearoutMessagesPoll(); void setContact(ContactRef c); ContactRef getContact() const; void SendEvent(MessageEvent* ev); void SendFTACK(FileTransferEvent *ev); void SendFTCancel(FileTransferEvent *ev); }; } #endif centerim-4.22.10/libicq2000/src/SNAC-BOS.cpp0000644000175000001440000000725211461606612014621 00000000000000/* * SNAC - Visible/invisible lists * Mitz Pettel, 2001 * * based on: SNAC - Buddy List * * Copyright (C) 2001 Barnaby Gray . * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "SNAC-BOS.h" #include "TLV.h" using std::string; using std::list; namespace ICQ2000 { // --------------- Visible/invisible List (Family 0x0009) SNACs -------------- BOSListSNAC::BOSListSNAC() { } BOSListSNAC::BOSListSNAC(const ContactList& l) : m_buddy_list() { ContactList::const_iterator curr = l.begin(); while (curr != l.end()) { if ((*curr)->isICQContact()) m_buddy_list.push_back((*curr)->getStringUIN()); ++curr; } } BOSListSNAC::BOSListSNAC(const ContactRef& c) : m_buddy_list(1, c->getStringUIN()) { } BOSListSNAC::BOSListSNAC(const string& s) : m_buddy_list(1, s) { } void BOSListSNAC::addContact(const ContactRef& c) { m_buddy_list.push_back(c->getStringUIN()); } void BOSListSNAC::OutputBody(Buffer& b) const { list::const_iterator curr = m_buddy_list.begin(); while (curr != m_buddy_list.end()) { b << (unsigned char)(*curr).size(); b.Pack(*curr); curr++; } } AddVisibleSNAC::AddVisibleSNAC() : BOSListSNAC() { } AddVisibleSNAC::AddVisibleSNAC(const ContactList& l) : BOSListSNAC(l) { } AddVisibleSNAC::AddVisibleSNAC(const ContactRef& c) : BOSListSNAC(c) { } AddVisibleSNAC::AddVisibleSNAC(const string& s) : BOSListSNAC(s) { } AddInvisibleSNAC::AddInvisibleSNAC() : BOSListSNAC() { } AddInvisibleSNAC::AddInvisibleSNAC(const ContactList& l) : BOSListSNAC(l) { } AddInvisibleSNAC::AddInvisibleSNAC(const ContactRef& c) : BOSListSNAC(c) { } AddInvisibleSNAC::AddInvisibleSNAC(const string& s) : BOSListSNAC(s) { } AddTmpVisibleSNAC::AddTmpVisibleSNAC() : BOSListSNAC() { } AddTmpVisibleSNAC::AddTmpVisibleSNAC(const ContactList& l) : BOSListSNAC(l) { } AddTmpVisibleSNAC::AddTmpVisibleSNAC(const ContactRef& c) : BOSListSNAC(c) { } AddTmpVisibleSNAC::AddTmpVisibleSNAC(const string& s) : BOSListSNAC(s) { } RemoveVisibleSNAC::RemoveVisibleSNAC() : BOSListSNAC() { } RemoveVisibleSNAC::RemoveVisibleSNAC(const ContactList& l) : BOSListSNAC(l) { } RemoveVisibleSNAC::RemoveVisibleSNAC(const ContactRef& c) : BOSListSNAC(c) { } RemoveVisibleSNAC::RemoveVisibleSNAC(const string& s) : BOSListSNAC(s) { } RemoveInvisibleSNAC::RemoveInvisibleSNAC() : BOSListSNAC() { } RemoveInvisibleSNAC::RemoveInvisibleSNAC(const ContactList& l) : BOSListSNAC(l) { } RemoveInvisibleSNAC::RemoveInvisibleSNAC(const ContactRef& c) : BOSListSNAC(c) { } RemoveInvisibleSNAC::RemoveInvisibleSNAC(const string& s) : BOSListSNAC(s) { } RemoveTmpVisibleSNAC::RemoveTmpVisibleSNAC() : BOSListSNAC() { } RemoveTmpVisibleSNAC::RemoveTmpVisibleSNAC(const ContactList& l) : BOSListSNAC(l) { } RemoveTmpVisibleSNAC::RemoveTmpVisibleSNAC(const ContactRef& c) : BOSListSNAC(c) { } RemoveTmpVisibleSNAC::RemoveTmpVisibleSNAC(const string& s) : BOSListSNAC(s) { } } centerim-4.22.10/libicq2000/src/SNAC-SRV.h0000644000175000001440000003061111461606612014310 00000000000000/* * SNAC - Server * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SNAC_SRV_H #define SNAC_SRV_H #include #include #include "SNAC-base.h" #include "ICQ.h" #include "constants.h" #include "Contact.h" namespace ICQ2000 { // Server Messages (Family 0x0015) - messages through the server const unsigned short SNAC_SRV_Error = 0x0001; const unsigned short SNAC_SRV_Send = 0x0002; const unsigned short SNAC_SRV_Response = 0x0003; /* * SRV_Response is very generic - ICQ have hacked all the extra ICQ * functionality into this one */ // --------------------- Server (Family 0x0015) SNACs --------- class SrvFamilySNAC : virtual public SNAC { public: unsigned short Family() const { return SNAC_FAM_SRV; } }; class SrvSendSNAC : public SrvFamilySNAC, public OutSNAC { protected: std::string m_text, m_destination, m_senders_name; unsigned int m_senders_UIN; bool m_delivery_receipt; void OutputBody(Buffer& b) const; public: SrvSendSNAC(const std::string& text, const std::string& destination, unsigned int senders_UIN, const std::string& senders_name, bool delrpt); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvRequestOfflineSNAC : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_uin; protected: void OutputBody(Buffer& b) const; public: SrvRequestOfflineSNAC(unsigned int uin); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvAckOfflineSNAC : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_uin; protected: void OutputBody(Buffer& b) const; public: SrvAckOfflineSNAC(unsigned int uin); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvRequestSimpleUserInfo : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin, m_user_uin; protected: void OutputBody(Buffer& b) const; public: SrvRequestSimpleUserInfo(unsigned int my_uin, unsigned int user_uin); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvRequestShortWP : public SrvFamilySNAC, public OutSNAC { protected: unsigned int m_my_uin; std::string m_nickname, m_firstname, m_lastname; void OutputBody(Buffer& b) const; public: SrvRequestShortWP(unsigned int my_uin, const std::string& nickname, const std::string& firstname, const std::string& lastname); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvRequestFullWP : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin; std::string m_nickname, m_firstname, m_lastname, m_email; unsigned short m_min_age, m_max_age; unsigned char m_sex; unsigned char m_language; std::string m_city, m_state, m_company_name, m_department, m_position; unsigned short m_country; bool m_only_online; protected: void OutputBody(Buffer& b) const; public: SrvRequestFullWP(unsigned int my_uin, const std::string& nickname, const std::string& firstname, const std::string& lastname, const std::string& email, unsigned short min_age, unsigned short max_age, unsigned char sex, unsigned char language, const std::string& city, const std::string& state, unsigned short country, const std::string& company_name, const std::string& department, const std::string& position, bool only_online); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvRequestKeywordSearch : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin; std::string m_keyword; protected: void OutputBody(Buffer& b) const; public: SrvRequestKeywordSearch(unsigned int my_uin, const std::string& keyword); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvRequestDetailUserInfo : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin, m_user_uin; protected: void OutputBody(Buffer& b) const; public: SrvRequestDetailUserInfo(unsigned int my_uin, unsigned int user_uin); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvUpdateMainHomeInfo : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin; const Contact::MainHomeInfo& m_main_home_info; protected: void OutputBody(Buffer& b) const; public: SrvUpdateMainHomeInfo(unsigned int my_uin, const Contact::MainHomeInfo& main_home_info); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvUpdateWorkInfo : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin; const Contact::WorkInfo& m_work_info; protected: void OutputBody(Buffer& b) const; public: SrvUpdateWorkInfo(unsigned int my_uin, const Contact::WorkInfo& work_info); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvUpdateHomepageInfo : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin; const Contact::HomepageInfo& m_homepage_info; protected: void OutputBody(Buffer& b) const; public: SrvUpdateHomepageInfo(unsigned int my_uin, const Contact::HomepageInfo& homepage_info); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvUpdateAboutInfo : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin; const std::string& m_about_info; protected: void OutputBody(Buffer& b) const; public: SrvUpdateAboutInfo(unsigned int my_uin, const std::string& about_info); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvRequestRandomChat : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin; unsigned short m_random_group; protected: void OutputBody(Buffer& b) const; public: SrvRequestRandomChat(unsigned int my_uin, unsigned short random_group); unsigned short Subtype() const { return SNAC_SRV_Send; } }; class SrvSetRandomChatGroup : public SrvFamilySNAC, public OutSNAC { private: unsigned int m_my_uin; unsigned short m_random_group; protected: void OutputBody(Buffer& b) const; public: SrvSetRandomChatGroup(unsigned int my_uin, unsigned short random_group); unsigned short Subtype() const { return SNAC_SRV_Send; } }; const unsigned short SrvResponse_Error = 0x0001; const unsigned short SrvResponse_AckMainHomeInfoChange = 0x0064; // used to be SrvResponse_SMS const unsigned short SrvResponse_AckWorkInfoChange = 0x006E; const unsigned short SrvResponse_AckHomepageInfoChange = 0x0078; const unsigned short SrvResponse_AckAboutInfoChange = 0x0082; const unsigned short SrvResponse_AckRandomGroupSet = 0x0370; const unsigned short SrvResponse_SMS_Done = 0x0096; const unsigned short SrvResponse_SimpleUI = 0x0190; const unsigned short SrvResponse_SimpleUI_Done = 0x019a; const unsigned short SrvResponse_SearchUI = 0x01a4; const unsigned short SrvResponse_SearchUI_Done = 0x01ae; const unsigned short SrvResponse_MainHomeInfo = 0x00c8; const unsigned short SrvResponse_WorkInfo = 0x00d2; const unsigned short SrvResponse_HomePageInfo = 0x00dc; const unsigned short SrvResponse_AboutInfo = 0x00e6; const unsigned short SrvResponse_EmailInfo = 0x00eb; const unsigned short SrvResponse_InterestInfo = 0x00f0; const unsigned short SrvResponse_BackgroundInfo = 0x00fa; const unsigned short SrvResponse_RandomChatFound = 0x0366; const unsigned short SrvResponse_Unknown = 0x010e; class SrvResponseSNAC : public SrvFamilySNAC, public InSNAC { public: enum ResponseType { OfflineMessage, OfflineMessagesComplete, SMS_Error, SMS_Response, SimpleUserInfo, SearchSimpleUserInfo, RMainHomeInfo, RHomepageInfo, REmailInfo, RUnknown, RWorkInfo, RAboutInfo, RInterestInfo, RBackgroundInfo, AckMainHomeInfoChange, AckHomepageInfoChange, AckWorkInfoChange, AckAboutInfoChange, RandomChatFound, RandomGroupSet }; protected: ResponseType m_type; // SMS Response fields std::string m_source, m_network, m_message_id, m_messages_left; bool m_deliverable, m_smtp_deliverable; int m_error_id; std::string m_error_param; std::string m_smtp_from, m_smtp_to, m_smtp_subject; // Offline Message fields time_t m_time; unsigned int m_sender_UIN; ICQSubType *m_icqsubtype; // SimpleUserInfo fields bool m_empty_contact; unsigned int m_uin; std::string m_alias, m_firstname, m_lastname, m_email; bool m_last_in_search; // DetailedUserInfo fields Contact::MainHomeInfo m_main_home_info; Contact::HomepageInfo m_homepage_info; Contact::EmailInfo m_email_info; Contact::WorkInfo m_work_info; Contact::BackgroundInfo m_background_info; Contact::PersonalInterestInfo m_personal_interest_info; std::string m_about; unsigned char m_sex, m_age; bool m_authreq; Status m_status; unsigned int m_more_results; void ParseBody(Buffer& b); void ParseICQResponse(Buffer& b); void ParseOfflineMessage(Buffer& b); void ParseInfoChangeAck(Buffer &b, unsigned short subtype); void ParseSMSError(Buffer& b); void ParseSMSResponse(Buffer& b); void ParseSimpleUserInfo(Buffer &b, unsigned short subtype); void ParseDetailedUserInfo(Buffer &b, unsigned short subtype); void ParseRandomChatFound(Buffer& b); void ParseRandomGroupSetAck(Buffer& b); public: SrvResponseSNAC(); ~SrvResponseSNAC(); ResponseType getType() const { return m_type; } std::string getSource() const { return m_source; } bool deliverable() const { return m_deliverable; } bool smtp_deliverable() const { return m_smtp_deliverable; } std::string getSMTPFrom() const { return m_smtp_from; } std::string getSMTPTo() const { return m_smtp_to; } std::string getSMTPSubject() const { return m_smtp_subject; } std::string getNetwork() const { return m_network; } std::string getMessageId() const { return m_message_id; } std::string getMessagesLeft() const { return m_messages_left; } int getErrorId() const { return m_error_id; } std::string getErrorParam() const { return m_error_param; } ICQSubType *getICQSubType() const { return m_icqsubtype; } unsigned int getSenderUIN() const { return m_sender_UIN; } time_t getTime() const { return m_time; } bool isEmptyContact() const { return m_empty_contact; } unsigned int getUIN() const { return m_uin; } std::string getAlias() const { return m_alias; } std::string getFirstName() const { return m_firstname; } std::string getLastName() const { return m_lastname; } std::string getEmail() const { return m_email; } bool getAuthReq() const { return m_authreq; } Status getStatus() const { return m_status; } bool isLastInSearch() const { return m_last_in_search; } unsigned int getNumberMoreResults() const { return m_more_results; } unsigned short Subtype() const { return SNAC_SRV_Response; } // detailed user info structures Contact::MainHomeInfo& getMainHomeInfo() { return m_main_home_info; } Contact::HomepageInfo& getHomepageInfo() { return m_homepage_info; } Contact::EmailInfo& getEmailInfo() { return m_email_info; } Contact::WorkInfo& getWorkInfo() { return m_work_info; } Contact::BackgroundInfo& getBackgroundInfo() { return m_background_info; } Contact::PersonalInterestInfo& getPersonalInterestInfo() { return m_personal_interest_info; } std::string getAboutInfo() const { return m_about; } }; } #endif centerim-4.22.10/libicq2000/src/Cache.h0000644000175000001440000001335111461606612014121 00000000000000/* * Cache * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef CACHE_H #define CACHE_H #include #include namespace ICQ2000 { /* * This class will cache an id to an object, it's templated * since it'll be useful in several places with different sorts of * ids and objects. */ template class CacheItem { protected: unsigned int m_timeout; time_t m_timestamp; Key m_key; Value m_value; public: CacheItem(const Key &k, const Value &v, unsigned int timeout); const Key& getKey() const; Value& getValue(); time_t getTimestamp() const; time_t getExpiryTime() const; void setTimestamp(time_t t); void setTimeout(time_t t); void refresh(); }; template < typename Key, typename Value > class Cache { protected: typedef typename std::list< CacheItem >::iterator literator; typedef typename std::list< CacheItem >::const_iterator citerator; unsigned int m_timeout; /* * list for storing them in order to timeout * a hash could be used as well, but efficiency isn't really an * issue - there shouldn't be more than 10 items in here at any one point */ std::list< CacheItem > m_list; citerator lookup(const Key& k) const { citerator curr = m_list.begin(); while (curr != m_list.end()) { if ((*curr).getKey() == k) return curr; ++curr; } return m_list.end(); } literator lookup(const Key& k) { literator curr = m_list.begin(); while (curr != m_list.end()) { if ((*curr).getKey() == k) return curr; ++curr; } return m_list.end(); } public: Cache(); virtual ~Cache(); bool exists(const Key &k) const { citerator i = lookup(k); return (i != m_list.end()); } Value& operator[](const Key &k) { literator i = lookup(k); if (i == m_list.end()) { return insert(k, Value()); } else { return (*i).getValue(); } } void remove(const Key &k) { literator i = lookup(k); if (i != m_list.end()) removeItem(i); } virtual void removeItem(const literator& l) { m_list.erase(l); } virtual void expireItem(const literator& l) { // might want to override to add signalling on expiring of items removeItem(l); } void expireAll() { while (!m_list.empty()) { expireItem(m_list.begin()); } } void removeAll() { while (!m_list.empty()) { removeItem(m_list.begin()); } } Value& insert(const Key &k, const Value &v) { CacheItem t(k,v,m_timeout); return (*insert(t)).getValue(); } literator insert(const CacheItem& t) { time_t exp_time = t.getExpiryTime(); literator l = m_list.end(); while (l != m_list.begin()) { --l; if ( (*l).getExpiryTime() < exp_time ) { ++l; break; } } return m_list.insert(l, t); } bool empty() const { return m_list.empty(); } const Key& front() const { return m_list.front().getKey(); } void refresh(const Key &k) { literator i = lookup(k); if (i != m_list.end()) { CacheItem t(*i); m_list.erase(i); insert(t); } } unsigned int getDefaultTimeout() { return m_timeout; } void setDefaultTimeout(unsigned int s) { m_timeout = s; } void setTimeout(const Key &k, unsigned int s) { literator i = lookup(k); if (i != m_list.end()) { CacheItem t(*i); t.setTimeout(s); m_list.erase(i); insert(t); } } void clearoutPoll() { time_t n = time(NULL); while (!m_list.empty() && m_list.front().getExpiryTime() < n) expireItem( m_list.begin() ); } }; template CacheItem::CacheItem(const Key &k, const Value &v, unsigned int timeout) : m_timeout(timeout), m_timestamp(time(NULL)), m_key(k), m_value(v) { } template void CacheItem::setTimestamp(time_t t) { m_timestamp = t; } template void CacheItem::setTimeout(time_t t) { m_timeout = t; } template time_t CacheItem::getTimestamp() const { return m_timestamp; } template time_t CacheItem::getExpiryTime() const { return m_timestamp + m_timeout; } template void CacheItem::refresh() { m_timestamp = time(NULL); } template const Key& CacheItem::getKey() const { return m_key; } template Value& CacheItem::getValue() { return m_value; } template Cache::Cache() { setDefaultTimeout(60); // default timeout } template Cache::~Cache() { removeAll(); } } #endif centerim-4.22.10/libicq2000/src/Xml.cpp0000644000175000001440000002015411461606612014210 00000000000000/* * XML Parser/Generator * * Copyright (C) 2001 Barnaby Gray * improvements (C) 2003 Konstantin Klyagin * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "Xml.h" using std::string; using std::list; using std::pair; // ---------- XmlNode --------------------------- XmlNode::XmlNode(const string& at) { parseAttr(at); } XmlNode::~XmlNode() { } bool XmlNode::isLeaf() { return !isBranch(); } string XmlNode::getTag() { return tag; } string XmlNode::replace_all(const string& s, const string& r1, const string& r2) { string t(s); int curr = 0, next; while ( (next = t.find( r1, curr )) != -1) { t.replace( next, r1.size(), r2 ); curr = next + r2.size(); } return t; } string XmlNode::quote(const string& a) { return replace_all( replace_all( replace_all( replace_all( replace_all(a, "&", "&"), "<", "<"), "\"", """), "`", "'"), ">", ">"); } string XmlNode::unquote(const string& a) { return replace_all( replace_all( replace_all( replace_all( replace_all( replace_all( replace_all(a, "<", "<"), ">", ">"), """, "\""), "'", "`"), " ", " "), "™", "(tm)"), "&", "&"); } XmlNode *XmlNode::parse(string::iterator& curr, string::iterator end) { int npos; string tag, tagname, cdata; do { skipWS(curr,end); if (curr == end || *curr != '<') return NULL; tag = parseTag(curr, end); tagname = tag; if (tag.empty() || tag[0] == '/') return NULL; } while(tag[0] == '?' || tag[0] == '!'); if (*(tag.end()-1) == '/') return new XmlLeaf(unquote(tag.substr(0, tag.size()-1)),""); if ((npos = tagname.find_first_of(" \r\n\t")) != -1) tagname.erase(npos); skipWS(curr,end); if (curr == end) return NULL; if (string(curr, end).substr(0, 9) == "') { endtag += *curr; if(endtag != string("]]>").substr(0, endtag.size())) { cdata += endtag; endtag = ""; } } else { cdata += *curr; } ++curr; } } if (*curr == '<' && cdata.empty()) { XmlNode *p = NULL; while (curr != end) { string::iterator mark = curr; string nexttag = parseTag(curr,end); if (nexttag.empty()) { if (p != NULL) delete p; return NULL; } if (nexttag[0] == '/') { // should be the closing if (nexttag.size() == tagname.size()+1 && nexttag.find(tagname,1) == 1) { // is closing tag if (p == NULL) p = new XmlLeaf(unquote(tag),""); return p; } else { if (p != NULL) delete p; return NULL; } } else { if (p == NULL) p = new XmlBranch(unquote(tag)); // an opening tag curr = mark; XmlNode *c = parse(curr,end); if (c != NULL) ((XmlBranch*)p)->pushnode(c); } skipWS(curr,end); if(curr == end || *curr != '<') { if (p != NULL) delete p; return NULL; } } } else { // XmlLeaf string value; while (curr != end && *curr != '<') { value += *curr; curr++; } if(curr == end) return NULL; string nexttag = parseTag(curr,end); if (nexttag.empty() || nexttag[0] != '/') return NULL; if(value.empty()) value = cdata; if (nexttag.size() == tagname.size()+1 && nexttag.find(tagname,1) == 1) { return new XmlLeaf(unquote(tag),unquote(value)); } else { // error return NULL; } } // should never get here return NULL; } string XmlNode::parseTag(string::iterator& curr, string::iterator end) { string tag; if(curr == end || *curr != '<') return string(); curr++; while(curr != end && *curr != '>') { tag += *curr; curr++; } if (curr == end) return string(); curr++; return tag; } void XmlNode::skipWS(string::iterator& curr, string::iterator end) { while(curr != end && isspace(*curr)) curr++; } void XmlNode::parseAttr(const string &at) { string t(at); string::iterator is = t.begin(); skipWS(is, t.end()); tag = ""; while(is != t.end() && !isspace(*is)) { tag += *is; is++; } char qchar; string aname, aval; while(is != t.end()) { aname = aval = ""; skipWS(is, t.end()); while(is != t.end() && !isspace(*is) && *is != '=') { aname += *is; is++; } if(is == t.end()) break; if(*is == '=') ++is; skipWS(is, t.end()); if(is == t.end()) break; if(*is != '"' && *is != '\'') break; qchar = *is; is++; while(is != t.end() && *is != qchar) { aval += *is; is++; } if(is == t.end()) break; is++; attributes.push_back(make_pair(aname, aval)); } } bool XmlNode::existsAttrib(const std::string& attrib) const { for(list >::const_iterator ia = attributes.begin(); ia != attributes.end(); ++ia) { if(ia->first == attrib) return true; } return false; } std::string XmlNode::getAttrib(const string &aname) const { for(list >::const_iterator ia = attributes.begin(); ia != attributes.end(); ++ia) { if(ia->first == aname) return ia->second; } return ""; } // ----------- XmlBranch ------------------------ XmlBranch::XmlBranch(const string& t) : XmlNode(t) { } XmlBranch::~XmlBranch() { list::iterator curr = children.begin(); while (curr != children.end()) { delete (*curr); curr++; } children.clear(); } bool XmlBranch::isBranch() { return true; } bool XmlBranch::exists(const string& tag) { list::iterator curr = children.begin(); while (curr != children.end()) { if ((*curr)->getTag() == tag) return true; curr++; } return false; } XmlNode *XmlBranch::getNode(const string& tag, int n) { int ncount = 0; list::iterator curr = children.begin(); while (curr != children.end()) { if ((*curr)->getTag() == tag) if (ncount++ == n) return (*curr); curr++; } return NULL; } XmlBranch *XmlBranch::getBranch(const string& tag, int n) { XmlNode *t = getNode(tag, n); if (t == NULL || dynamic_cast(t) == NULL) return NULL; return dynamic_cast(t); } XmlLeaf *XmlBranch::getLeaf(const string& tag) { XmlNode *t = getNode(tag); if (t == NULL || dynamic_cast(t) == NULL) return NULL; return dynamic_cast(t); } void XmlBranch::pushnode(XmlNode *c) { children.push_back(c); } string XmlBranch::toString(int n) { string ret(n,'\t'); ret += "<" + quote(tag) + ">\n"; list::iterator curr = children.begin(); while (curr != children.end()) { ret += (*curr)->toString(n+1); curr++; } ret += string(n,'\t') + "\n"; return ret; } list XmlBranch::getChildren() const { list r; list::const_iterator curr = children.begin(); while (curr != children.end()) { r.push_back((*curr)->getTag()); curr++; } return r; } // ----------- XmlLeaf -------------------------- XmlLeaf::XmlLeaf(const string& t, const string& v) : XmlNode(t), value(unquote(v)) { } XmlLeaf::~XmlLeaf() { } bool XmlLeaf::isBranch() { return false; } string XmlLeaf::getValue() { return value; } string XmlLeaf::toString(int n) { string r = string(n,'\t') + "<" + quote(tag); list >::const_iterator ia = attributes.begin(); while(ia != attributes.end()) { r += (string) " " + ia->first + "=\"" + ia->second + "\""; } return r + ">" + quote(value) + "\n"; } centerim-4.22.10/libicq2000/src/SNAC-UIN.cpp0000644000175000001440000000354711461606612014634 00000000000000/* * SNAC - New UIN services * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SNAC-UIN.h" #include "buffer.h" using std::string; namespace ICQ2000 { // -------------- New UIN (0x0017) Family ----------------------- UINRequestSNAC::UINRequestSNAC(const string& p) : m_password(p) { } void UINRequestSNAC::OutputBody(Buffer& b) const{ b<<(unsigned int)0x00010039; b<<(unsigned int)0x0; b<<(unsigned int)0x28000300; b<<(unsigned int)0x0; b<<(unsigned int)0x0; b<<(unsigned int)0x624e0000; b<<(unsigned int)0x624e0000; b<<(unsigned int)0x0; b<<(unsigned int)0x0; b<<(unsigned int)0x0; b<<(unsigned int)0x0; b.setLittleEndian(); b.PackUint16StringNull(m_password); b.setBigEndian(); b<<(unsigned int)0x624e0000; b<<(unsigned int)0x0000d601; } UINResponseSNAC::UINResponseSNAC() { } void UINResponseSNAC::ParseBody(Buffer& b){ b.advance(46); b.setLittleEndian(); b >> m_uin; b.advance(10); } UINRequestErrorSNAC::UINRequestErrorSNAC() { } void UINRequestErrorSNAC::ParseBody(Buffer& b){ b.advance(32); } } centerim-4.22.10/libicq2000/src/SMTPClient.h0000644000175000001440000000501011461606612015031 00000000000000/* * SMTPClient * * Copyright (C) 2002 Konstantin Klyagin * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SMTPCLIENT_H #define SMTPCLIENT_H #include "SocketClient.h" #include "buffer.h" namespace ICQ2000 { class SMTPClient : public SocketClient { private: enum State { NOT_CONNECTED, WAITING_FOR_CONNECT, WAITING_FOR_INVITATION, WAITING_FOR_HELO_ACK, WAITING_FOR_MAIL_ACK, WAITING_FOR_RCPT_ACK, WAITING_FOR_DATA_ACK, WAITING_FOR_TEXT_ACK, DISCONNECTING }; State m_state; std::list m_msgqueue; Buffer m_recv; std::string m_server_name; unsigned short m_server_port; time_t m_last_operation, m_timeout; void expired_cb(MessageEvent *ev); void flush_queue(); void check_timeout(); std::string getContactEmail(ContactRef cont) const; void Init(); void Parse(); void Send(Buffer &b); ContactRef m_self_contact; void SayHello(); void SayFrom(); void SayTo(); void SayData(); void SayQuit(); void SendText(); void Disconnect(); public: SMTPClient(ContactRef self, const std::string& server_name, unsigned short server_port); ~SMTPClient(); void Connect(); void FinishNonBlockingConnect(); void Recv(); void clearoutMessagesPoll(); void setServerHost(const std::string& host); std::string getServerHost() const; void setServerPort(unsigned short port); unsigned short getServerPort() const; void setTimeout(time_t t); time_t getTimeout() const; void SendEvent(MessageEvent* ev); }; class SMTPException : public std::exception { private: std::string m_errortext; public: SMTPException(); SMTPException(const std::string& text); ~SMTPException() throw() { } const char* what() const throw(); }; } #endif centerim-4.22.10/libicq2000/src/ICBMCookie.h0000644000175000001440000000251711461606612014764 00000000000000/* * ICBM Cookie * Simple 8 byte message cookie * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef ICBMCOOKIE_H #define ICBMCOOKIE_H #include "buffer.h" namespace ICQ2000 { class ICBMCookie { private: unsigned int m_c1, m_c2; public: ICBMCookie(); void generate(); void Parse(Buffer& b); void Output(Buffer& b) const; bool operator==(const ICBMCookie& c) const; ICBMCookie& operator=(const ICBMCookie& c); }; Buffer& operator<<(Buffer& b, const ICQ2000::ICBMCookie& c); Buffer& operator>>(Buffer& b, ICQ2000::ICBMCookie& c); } #endif centerim-4.22.10/libicq2000/src/Capabilities.h0000644000175000001440000000452111461606612015506 00000000000000/* * Capabilities * Some handling of the mysterious capabilities byte strings * * Copyright (C) 2002 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef CAPABILITIES_H #define CAPABILITIES_H #include "buffer.h" #include namespace ICQ2000 { class Capabilities { public: /* * A lot of these flags are AIM specific - so we're unlikely to * see/use them unless the other end is a 'libfaim pretending to * be ICQ' client. */ enum Flag { Chat = 0, Voice = 1, SendFile = 2, ICQ = 3, IMImage = 4, BuddyIcon = 5, SaveStocks = 6, GetFile = 7, ICQServerRelay = 8, Games = 9, Games2 = 10, SendBuddyList = 11, ICQRTF = 12, ICQUnknown = 13, Empty = 14, TrillianCrypt = 15, APInfo = 16, ICQUnknown2 = 17, Typing = 18 }; private: static const unsigned int sizeof_cap = 16; struct Block { Flag flag; unsigned char data[sizeof_cap]; }; static const Block caps[]; std::set m_flags; public: Capabilities(); void default_icq2000_capabilities(); void default_icq2002_capabilities(); void clear(); void set_capability_flag(Flag f); void clear_capability_flag(Flag f); bool has_capability_flag(Flag f) const; void Parse(Buffer& b, unsigned short len); void Output(Buffer& b) const; unsigned short get_length() const; bool get_accept_adv_msgs() const; }; } #endif centerim-4.22.10/libicq2000/src/SNAC-SBL.h0000644000175000001440000003611111461606612014257 00000000000000/* * SNAC - Server-based list management * Mitz Pettel, 2001 * Copyright (C) 2002 Barnaby Gray . * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef SNAC_SBL_H #define SNAC_SBL_H #include #include #include "SNAC-base.h" #include "Contact.h" #include "ContactList.h" #include "ContactTree.h" #include "UserInfoBlock.h" namespace ICQ2000 { // Server-based list stuff (Family 0x0013) const unsigned short SNAC_SBL_Error = 0x0001; // In/Out const unsigned short SNAC_SBL_Req_Rights = 0x0002; // Out const unsigned short SNAC_SBL_Rights_Reply = 0x0003; // In const unsigned short SNAC_SBL_Request_List = 0x0004; // Out const unsigned short SNAC_SBL_Check_List = 0x0005; // Out const unsigned short SNAC_SBL_List_From_Server = 0x0006; // In const unsigned short SNAC_SBL_List_ACK = 0x0007; // Out const unsigned short SNAC_SBL_Add_Entry = 0x0008; // Out const unsigned short SNAC_SBL_Update_Entry = 0x0009; // Out const unsigned short SNAC_SBL_Remove_Entry = 0x000a; // Out const unsigned short SNAC_SBL_Edit_ACK = 0x000e; // In const unsigned short SNAC_SBL_List_Unchanged = 0x000f; // In const unsigned short SNAC_SBL_Begin_Edit = 0x0011; // Out const unsigned short SNAC_SBL_Commit_Edit = 0x0012; // Out const unsigned short SNAC_SBL_Request_Auth = 0x0018; // Out const unsigned short SNAC_SBL_Auth_Request = 0x0019; // In const unsigned short SNAC_SBL_Authorise = 0x001a; // Out const unsigned short SNAC_SBL_Auth_Received = 0x001b; // In const unsigned short SNAC_SBL_User_Added_You = 0x001c; // In // ----------------- Server-based Lists (Family 0x0013) SNACs ----------- class SBLFamilySNAC : virtual public SNAC { public: unsigned short Family() const { return SNAC_FAM_SBL; } }; // ============================================================================ // Request SBL rights // ============================================================================ class SBLRequestRightsSNAC : public SBLFamilySNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: SBLRequestRightsSNAC(); unsigned short Subtype() const { return SNAC_SBL_Req_Rights; } }; // ============================================================================ // SBL rights reply // ============================================================================ class SBLRightsReplySNAC : public SBLFamilySNAC, public InSNAC { protected: void ParseBody(Buffer& b); public: SBLRightsReplySNAC(); unsigned short Subtype() const { return SNAC_SBL_Rights_Reply; } }; // ============================================================================ // Unconditional SBL list request // ============================================================================ class SBLRequestListSNAC : public SBLFamilySNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: SBLRequestListSNAC(); unsigned short Subtype() const { return SNAC_SBL_Request_List; } }; // ============================================================================ // SBL list reply // ============================================================================ class SBLListSNAC : public SBLFamilySNAC, public InSNAC { private: ContactTree m_tree; unsigned short m_size; std::list m_unassigned; std::set m_other_ids; unsigned short m_privacy_id; protected: void ParseBody(Buffer& b); public: SBLListSNAC(); ContactTree& getContactTree() { return m_tree; } std::list& getUnassigned() { return m_unassigned; } std::set& other_ids() { return m_other_ids; } unsigned short getPrivacyID() { return m_privacy_id; } unsigned short get_size() const { return m_size; } unsigned short Subtype() const { return SNAC_SBL_List_From_Server; } }; // ============================================================================ // SBL list received ACK // ============================================================================ class SBLListACKSNAC : public SBLFamilySNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: SBLListACKSNAC(); unsigned short Subtype() const { return SNAC_SBL_List_ACK; } }; // ============================================================================ // SBL Begin Edit // ============================================================================ class SBLBeginEditSNAC : public SBLFamilySNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: SBLBeginEditSNAC(); unsigned short Subtype() const { return SNAC_SBL_Begin_Edit; } }; // ============================================================================ // SBL Add Buddy // ============================================================================ class SBLAddBuddySNAC : public SBLFamilySNAC, public OutSNAC { private: Sbl_item m_buddy; unsigned short m_buddy_group; protected: void OutputBody(Buffer& b) const; public: SBLAddBuddySNAC(); SBLAddBuddySNAC(const Sbl_item &buddy, unsigned short group_id); Sbl_item getBuddy() const { return m_buddy; } unsigned short group_id() const { return m_buddy_group; } unsigned short Subtype() const { return SNAC_SBL_Add_Entry; } }; // ============================================================================ // SBL Add Group // ============================================================================ class SBLAddGroupSNAC : public SBLFamilySNAC, public OutSNAC { private: std::string m_group_name; unsigned short m_group_id; protected: void OutputBody(Buffer& b) const; public: SBLAddGroupSNAC(); SBLAddGroupSNAC(const std::string &group_name, unsigned short group_id); std::string get_label() const { return m_group_name; } unsigned short group_id() const { return m_group_id; } unsigned short Subtype() const { return SNAC_SBL_Add_Entry; } }; // ============================================================================ // SBL Update Entry // ============================================================================ /*class SBLUpdateEntrySNAC : public SBLFamilySNAC, public OutSNAC { private: std::string m_group_name; unsigned short m_group_id; std::vector m_ids; const ContactRef &m_cont; protected: void OutputBody(Buffer& b) const; public: SBLUpdateEntrySNAC(const std::string &group_name, unsigned short group_id, const std::vector &ids); SBLUpdateEntrySNAC(const ContactRef &c); unsigned short Subtype() const { return SNAC_SBL_Update_Entry; } }; */ class SBLUpdateGroupSNAC : public SBLFamilySNAC, public OutSNAC { private: std::string m_group_name; unsigned short m_group_id; std::set m_ids; protected: void OutputBody(Buffer& b) const; public: SBLUpdateGroupSNAC(const std::string &group_name, unsigned short group_id, const std::set &ids); SBLUpdateGroupSNAC(const Sbl_group& group); std::set getBuddies() const { return m_ids; } std::string get_label() const { return m_group_name; } unsigned short group_id() const { return m_group_id; } unsigned short Subtype() const { return SNAC_SBL_Update_Entry; } }; // ============================================================================ // SBL Update Privacy Settings // ============================================================================ class SBLUpdatePrivacySNAC : public SBLFamilySNAC, public OutSNAC { private: unsigned short m_buddy_id; unsigned char m_privacy; protected: void OutputBody(Buffer& b) const; public: SBLUpdatePrivacySNAC(unsigned short buddy_id, unsigned char privacy); unsigned short Subtype() const { return SNAC_SBL_Update_Entry; } }; // ============================================================================ // SBL Remove Entry // ============================================================================ /*class SBLRemoveEntrySNAC : public SBLFamilySNAC, public OutSNAC { private: std::string m_group_name; std::list m_buddy_list; unsigned short m_group_id; protected: void OutputBody(Buffer& b) const; public: SBLRemoveEntrySNAC(); SBLRemoveEntrySNAC(const ContactList& l); SBLRemoveEntrySNAC(const ContactRef& c); SBLRemoveEntrySNAC(const std::string &group_name, unsigned short group_id); unsigned short Subtype() const { return SNAC_SBL_Remove_Entry; } };*/ // ============================================================================ // SBL Remove Buddy // ============================================================================ class SBLRemoveBuddySNAC : public SBLFamilySNAC, public OutSNAC { private: Sbl_item m_buddy; unsigned short m_buddy_group; protected: void OutputBody(Buffer& b) const; public: SBLRemoveBuddySNAC(); SBLRemoveBuddySNAC(const Sbl_item &buddy, unsigned short group_id); Sbl_item getBuddy() const { return m_buddy; } unsigned short group_id() const { return m_buddy_group; } unsigned short Subtype() const { return SNAC_SBL_Remove_Entry; } }; // ============================================================================ // SBL Remove Group // ============================================================================ class SBLRemoveGroupSNAC : public SBLFamilySNAC, public OutSNAC { private: std::string m_group_name; unsigned short m_group_id; protected: void OutputBody(Buffer& b) const; public: SBLRemoveGroupSNAC(); SBLRemoveGroupSNAC(const std::string &group_name, unsigned short group_id); std::string get_label() const { return m_group_name; } unsigned short group_id() const { return m_group_id; } unsigned short Subtype() const { return SNAC_SBL_Remove_Entry; } }; // ============================================================================ // SBL Commit Edit // ============================================================================ class SBLCommitEditSNAC : public SBLFamilySNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: SBLCommitEditSNAC(); unsigned short Subtype() const { return SNAC_SBL_Commit_Edit; } }; // ============================================================================ // SBL Edit ACK // ============================================================================ class SBLEditACKSNAC : public SBLFamilySNAC, public InSNAC { public: enum Result { Success, Failed, AuthRequired, AlreadyExists }; protected: std::vector m_results; void ParseBody(Buffer& b); public: SBLEditACKSNAC(); std::vector getResults() const { return m_results; } unsigned short Subtype() const { return SNAC_SBL_Edit_ACK; } }; // ============================================================================ // SBL List Unchanged reply // ============================================================================ class SBLListUnchangedSNAC : public SBLFamilySNAC, public InSNAC { protected: void ParseBody(Buffer& b); public: SBLListUnchangedSNAC(); unsigned short Subtype() const { return SNAC_SBL_List_Unchanged; } }; // ============================================================================ // SBL Request authorisation // ============================================================================ class SBLRequestAuthSNAC : public SBLFamilySNAC, public OutSNAC { private: const ContactRef m_cont; std::string m_msg; protected: void OutputBody(Buffer& b) const; public: SBLRequestAuthSNAC(const ContactRef &c, const std::string &message); unsigned short Subtype() const { return SNAC_SBL_Request_Auth; } }; // ============================================================================ // SBL Incoming request authorisation // ============================================================================ class SBLAuthRequestSNAC : public SBLFamilySNAC, public InSNAC { private: std::string m_msg; std::string m_uin; protected: void ParseBody(Buffer& b); public: SBLAuthRequestSNAC(); std::string getMessage() const { return m_msg; } std::string getUIN() const { return m_uin; } unsigned short Subtype() const { return SNAC_SBL_Auth_Request; } }; // ============================================================================ // SBL Authorisation request reply (outgoing) // ============================================================================ class SBLAuthoriseSNAC : public SBLFamilySNAC, public OutSNAC { private: const std::string m_reason; const ContactRef m_cont; const bool m_grant; protected: void OutputBody(Buffer& b) const; public: SBLAuthoriseSNAC(const ContactRef &c, const std::string reason, bool grant); unsigned short Subtype() const { return SNAC_SBL_Authorise; } }; // ============================================================================ // SBL Authorisation request reply (incoming) // ============================================================================ class SBLAuthReceivedSNAC : public SBLFamilySNAC, public InSNAC { private: std::string m_msg; std::string m_uin; bool m_grant; protected: void ParseBody(Buffer& b); public: SBLAuthReceivedSNAC(); std::string getMessage() const { return m_msg; } std::string getUIN() const { return m_uin; } bool granted() const { return m_grant; } unsigned short Subtype() const { return SNAC_SBL_Auth_Received; } }; // ============================================================================ // SBL Another user added you (incoming) // ============================================================================ class SBLUserAddedYouSNAC : public SBLFamilySNAC, public InSNAC { private: std::string m_uin; bool m_grant; protected: void ParseBody(Buffer& b); public: SBLUserAddedYouSNAC(); std::string getUIN() const { return m_uin; } unsigned short Subtype() const { return SNAC_SBL_User_Added_You; } }; } #endif centerim-4.22.10/libicq2000/src/Makefile.in0000644000175000001440000004540111473011437015011 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libicq2000/src DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libsrc_a_AR = $(AR) $(ARFLAGS) libsrc_a_LIBADD = am_libsrc_a_OBJECTS = ContactTree.$(OBJEXT) ContactList.$(OBJEXT) \ SNAC-MSG.$(OBJEXT) Translator.$(OBJEXT) SNAC-UIN.$(OBJEXT) \ MessageHandler.$(OBJEXT) SocketClient.$(OBJEXT) \ UserInfoBlock.$(OBJEXT) TLV.$(OBJEXT) SNAC.$(OBJEXT) \ version.$(OBJEXT) SNAC-BOS.$(OBJEXT) Xml.$(OBJEXT) \ SNAC-BUD.$(OBJEXT) exceptions.$(OBJEXT) Client.$(OBJEXT) \ Contact.$(OBJEXT) socket.$(OBJEXT) ICQ.$(OBJEXT) \ SNAC-SBL.$(OBJEXT) ICBMCookie.$(OBJEXT) time_extra.$(OBJEXT) \ DirectClient.$(OBJEXT) SNAC-base.$(OBJEXT) SNAC-LOC.$(OBJEXT) \ FileTransferClient.$(OBJEXT) buffer.$(OBJEXT) \ SMTPClient.$(OBJEXT) SNAC-SRV.$(OBJEXT) events.$(OBJEXT) \ SNAC-GEN.$(OBJEXT) Capabilities.$(OBJEXT) RateLimits.$(OBJEXT) libsrc_a_OBJECTS = $(am_libsrc_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libsrc_a_SOURCES) DIST_SOURCES = $(libsrc_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/libicq2000/libicq2000 -I$(top_srcdir)/libicq2000 noinst_LIBRARIES = libsrc.a libsrc_a_SOURCES = ContactTree.cpp ContactList.cpp SNAC-MSG.cpp Translator.cpp SNAC-UIN.cpp MessageHandler.cpp SocketClient.cpp UserInfoBlock.cpp TLV.cpp SNAC.cpp version.cpp SNAC-BOS.cpp Xml.cpp SNAC-BUD.cpp exceptions.cpp Client.cpp Contact.cpp socket.cpp ICQ.cpp SNAC-SBL.cpp ICBMCookie.cpp time_extra.cpp DirectClient.cpp SNAC-base.cpp SNAC-LOC.cpp FileTransferClient.cpp buffer.cpp SMTPClient.cpp SNAC-SRV.cpp events.cpp SNAC-GEN.cpp Capabilities.cpp RateLimits.cpp noinst_HEADERS = FileTransferClient.h Capabilities.h ICQ.h TLV.h Xml.h Cache.h SNAC.h DirectClient.h sstream_fix.h ICBMCookieCache.h SeqNumCache.h SocketClient.h SNAC-BOS.h SNAC-BUD.h SNAC-GEN.h SNAC-LOC.h SNAC-MSG.h SNAC-SBL.h SNAC-SRV.h SNAC-UIN.h UserInfoBlock.h DCCache.h RequestIDCache.h buffer.h SMTPClient.h MessageHandler.h SNAC-base.h ICBMCookie.h socket.h FTCache.h RateLimits.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libicq2000/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu libicq2000/src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libsrc.a: $(libsrc_a_OBJECTS) $(libsrc_a_DEPENDENCIES) -rm -f libsrc.a $(libsrc_a_AR) libsrc.a $(libsrc_a_OBJECTS) $(libsrc_a_LIBADD) $(RANLIB) libsrc.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Capabilities.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Contact.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ContactList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ContactTree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DirectClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileTransferClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ICBMCookie.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ICQ.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MessageHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RateLimits.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SMTPClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC-BOS.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC-BUD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC-GEN.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC-LOC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC-MSG.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC-SBL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC-SRV.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC-UIN.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC-base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNAC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SocketClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TLV.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Translator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UserInfoBlock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Xml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/events.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exceptions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_extra.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/libicq2000/src/DirectClient.cpp0000644000175000001440000005415211461606612016026 00000000000000/* * DirectClient * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "DirectClient.h" #include "ICQ.h" #include "constants.h" #include "sstream_fix.h" #include using std::string; using std::ostringstream; using std::endl; namespace ICQ2000 { unsigned char DirectClient::client_check_data[] = { "As part of this software beta version Mirabilis is " "granting a limited access to the ICQ network, " "servers, directories, listings, information and databases (\"" "ICQ Services and Information\"). The " "ICQ Service and Information may databases (\"" "ICQ Services and Information\"). The " "ICQ Service and Information may\0" }; /* * Constructor when receiving an incoming connection */ DirectClient::DirectClient(ContactRef self, TCPSocket *sock, MessageHandler *mh, ContactTree *cl, unsigned int ext_ip, unsigned short server_port) : m_state(WAITING_FOR_INIT), m_recv(), m_self_contact(self), m_contact(NULL), m_contact_list(cl), m_message_handler(mh), m_incoming(true), m_local_ext_ip(ext_ip), m_local_server_port(server_port) { m_socket = sock; Init(); } /* * Constructor for making an outgoing connection */ DirectClient::DirectClient(ContactRef self, ContactRef c, MessageHandler *mh, unsigned int ext_ip, unsigned short server_port) : m_state(NOT_CONNECTED), m_recv(), m_self_contact(self), m_contact(c), m_message_handler(mh), m_incoming(false), m_local_ext_ip(ext_ip), m_local_server_port(server_port) { Init(); m_socket = new TCPSocket(); m_remote_uin = c->getUIN(); } DirectClient::~DirectClient() { m_msgcache.expireAll(); while (!m_msgqueue.empty()) { expired_cb( m_msgqueue.front() ); m_msgqueue.pop_front(); } if ( m_socket->getSocketHandle() > -1) SignalRemoveSocket( m_socket->getSocketHandle() ); delete m_socket; } void DirectClient::Init() { m_seqnum = 0xFFFF; m_msgcache.setDefaultTimeout(30); m_msgcache.expired.connect( this, &DirectClient::expired_cb) ; } void DirectClient::Connect() { m_remote_tcp_version = m_contact->getTCPVersion(); if (m_remote_tcp_version >= 7) m_eff_tcp_version = 7; else if (m_remote_tcp_version == 6) m_eff_tcp_version = 6; else throw DisconnectedException("Cannot direct connect to client with too old TCP version"); m_socket->setRemoteIP( m_contact->getLanIP() ); m_socket->setRemotePort( m_contact->getLanPort() ); m_socket->setBlocking(false); m_socket->Connect(); SignalAddSocket( m_socket->getSocketHandle(), SocketEvent::WRITE ); if (m_contact->getDCCookie() != 0) { m_session_id = m_contact->getDCCookie(); } else { m_session_id = (unsigned int)(0xffffffff*(rand()/(RAND_MAX+1.0))); } m_state = WAITING_FOR_INIT_ACK; } void DirectClient::FinishNonBlockingConnect() { SendInitPacket(); } void DirectClient::clearoutMessagesPoll() { m_msgcache.clearoutPoll(); } void DirectClient::expired_cb(MessageEvent *ev) { ev->setFinished(false); ev->setDelivered(false); ev->setDirect(true); messageack.emit(ev); } void DirectClient::Recv() { try { while ( m_socket->connected() ) { if ( !m_socket->Recv(m_recv) ) break; Parse(); } } catch(SocketException e) { ostringstream ostr; ostr << "Failed on recv: " << e.what(); throw DisconnectedException( ostr.str() ); } catch(ParseException e) { ostringstream ostr; ostr << "Failed parsing: " << e.what(); throw DisconnectedException( ostr.str() ); } } void DirectClient::Parse() { if (m_recv.empty()) return; unsigned int length; while (!m_recv.empty()) { m_recv.setPos(0); m_recv.setLittleEndian(); m_recv >> length; if (length == 0) return; // short read, toss it back (nothing to do) if (length > Incoming_Packet_Limit) throw ParseException("Received too long incoming packet"); if (m_recv.remains() < length) return; // waiting for more of the packet Buffer sb; m_recv.chopOffBuffer( sb, length+2 ); ostringstream ostr; ostr << "Received packet from " << IPtoString( m_socket->getRemoteIP() ) << ":" << m_socket->getRemotePort() << endl << sb; SignalLog(LogEvent::DIRECTPACKET, ostr.str()); if (m_state == WAITING_FOR_INIT) { ParseInitPacket(sb); if (m_incoming) { SendInitAck(); SendInitPacket(); m_state = WAITING_FOR_INIT_ACK; } else { SendInitAck(); if (m_eff_tcp_version == 7) { SendInit2(); m_state = WAITING_FOR_INIT2; } else { m_state = CONNECTED; flush_queue(); connected.emit(this); } } } else if (m_state == WAITING_FOR_INIT_ACK) { ParseInitAck(sb); if (m_incoming) { // Incoming if (m_eff_tcp_version == 7) m_state = WAITING_FOR_INIT2; // v7 has an extra stage of handshaking else { ConfirmUIN(); m_state = CONNECTED; // v5 is done handshaking now flush_queue(); connected.emit(this); } } else { // Outgoing - next packet should be their INIT m_state = WAITING_FOR_INIT; } } else if (m_state == WAITING_FOR_INIT2) { ParseInit2(sb); // This is a V7 only packet if (m_incoming) { SendInit2(); ConfirmUIN(); } m_state = CONNECTED; flush_queue(); connected.emit(this); } else if (m_state == CONNECTED) { ParsePacket(sb); } if (sb.beforeEnd()) { /* we assert that parsing code eats uses all data * in the FLAP - seems useful to know when they aren't * as it probably means they are faulty */ ostringstream ostr; ostr << "Buffer pointer not at end after parsing packet was: 0x" << std::hex << sb.pos() << " should be: 0x" << sb.size(); SignalLog(LogEvent::WARN, ostr.str()); } } } void DirectClient::ConfirmUIN() { if ( m_contact_list->exists(m_remote_uin) ) { ContactRef c = (*m_contact_list)[ m_remote_uin ]; if ( (c->getExtIP() == m_local_ext_ip && c->getLanIP() == getIP() ) /* They are behind the same masquerading box, * and the Lan IP matches */ || c->getExtIP() == getIP()) { m_contact = c; } else { // spoofing attempt most likely ostringstream ostr; ostr << "Refusing direct connection from someone that claims to be UIN " << m_remote_uin << " since their IP " << IPtoString( getIP() ) << " != " << IPtoString( c->getExtIP() ); throw DisconnectedException( ostr.str() ); } } else { // don't accept direct connections from contacts not on contact list throw DisconnectedException("Refusing direct connection to contact not on contact list"); } } void DirectClient::SendInitPacket() { Buffer b; b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned char)0xff; // start byte b << (unsigned short)0x0007; // tcp version Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_remote_uin; b << (unsigned short)0x0000; b << (unsigned int)m_local_server_port; b << m_self_contact->getUIN(); b.setBigEndian(); b << m_local_ext_ip; b << m_socket->getLocalIP(); b << (unsigned char)0x04; // mode b.setLittleEndian(); b << (unsigned int)m_local_server_port; b << m_session_id; b << (unsigned int)0x00000050; // unknown b << (unsigned int)0x00000003; // unknown if (m_eff_tcp_version == 7) b << (unsigned int)0x00000000; // unknown b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); Send(b); } void DirectClient::ParseInitPacket(Buffer &b) { b.setLittleEndian(); unsigned short length; b >> length; unsigned char start_byte; b >> start_byte; if (start_byte != 0xff) throw ParseException("Init Packet didn't start with 0xff"); unsigned short tcp_version; b >> tcp_version; b.advance(2); // revision or a length ?? if (m_incoming) { m_remote_tcp_version = tcp_version; if (tcp_version <= 5) throw ParseException("Too old client < ICQ99"); if (tcp_version == 6) m_eff_tcp_version = 6; else m_eff_tcp_version = 7; } else { if (tcp_version != m_remote_tcp_version) throw ParseException("Client claiming different TCP versions"); } unsigned int our_uin; b >> our_uin; if (our_uin != m_self_contact->getUIN()) throw ParseException("Local UIN in Init Packet not same as our Local UIN"); // 00 00 // xx xx senders open port // 00 00 b.advance(6); unsigned int remote_uin; b >> remote_uin; if (m_incoming) { m_remote_uin = remote_uin; } else { if (m_remote_uin != remote_uin) throw ParseException("Remote UIN in Init Packet for Remote Client not what was expected"); } // xx xx xx xx senders external IP // xx xx xx xx senders lan IP b.advance(8); b >> m_tcp_flags; // xx xx senders port again // 00 00 b.advance(4); // xx xx xx xx session id unsigned int session_id; b >> session_id; if (m_incoming) { m_session_id = session_id; } else { if (m_session_id != session_id) throw ParseException("Session ID from Remote Client doesn't match the one we sent"); } // 50 00 00 00 unknown // 03 00 00 00 unknown b.advance(8); if (m_eff_tcp_version == 7) { b.advance(4); // 00 00 00 00 unknown } } void DirectClient::ParseInitAck(Buffer &b) { b.setLittleEndian(); unsigned short length; b >> length; if (length != 4) throw ParseException("Init Ack not as expected"); unsigned int a; b >> a; // should be 0x00000001 really } void DirectClient::ParseInit2(Buffer &b) { b.setLittleEndian(); unsigned short length; b >> length; if (length != 0x0021) throw ParseException("V7 final handshake packet incorrect length"); unsigned char type; b >> type; if (type != 0x03) throw ParseException("Expecting V7 final handshake packet, received something else"); unsigned int unknown; b >> unknown // 0x0000000a >> unknown; b.advance(24); // unknowns } void DirectClient::SendInit2() { Buffer b; b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned char) 0x03 // start byte << (unsigned int) 0x0000000a // unknown << (unsigned int) 0x00000001 // unknown << (unsigned int) (m_incoming ? 0x00000001 : 0x00000000) // unknown << (unsigned int) 0x00000000 // unknown << (unsigned int) 0x00000000; // unknown if (m_incoming) { b << (unsigned int) 0x00040001 // unknown << (unsigned int) 0x00000000 // unknown << (unsigned int) 0x00000000; // unknown } else { b << (unsigned int) 0x00000000 // unknown << (unsigned int) 0x00000000 // unknown << (unsigned int) 0x00040001; // unknown } b.setAutoSizeMarker(m1); Send(b); } void DirectClient::ParsePacket(Buffer& b) { Buffer c; if (!Decrypt(b, c)) throw ParseException("Decrypting failed"); ParsePacketInt(c); } void DirectClient::ParsePacketInt(Buffer& b) { b.setLittleEndian(); unsigned short length; b >> length; // we should get the decrypted packet in unsigned int checksum; unsigned short command, seqnum, unknown, version; unsigned char junk; string msg; ostringstream ostr; if (m_eff_tcp_version == 7) { unsigned char start_byte; b >> start_byte; if (start_byte != 0x02) throw ParseException("Message Packet didn't start with 0x02"); } b >> checksum >> command >> unknown // 0x000e or 0x0012 in probe packets >> seqnum; if (unknown != 0x000e) throw ParseException("Ignoring weird packet"); b.advance(12); // unknown 3 ints ICQSubType *i = ICQSubType::ParseICQSubType(b, true, (command == V6_TCP_ACK)); if (dynamic_cast(i) == NULL) throw ParseException("Unknown ICQ subtype"); UINICQSubType *icqsubtype = dynamic_cast(i); icqsubtype->setSeqNum(seqnum); icqsubtype->setSource( m_contact->getUIN() ); if (command == 0) throw ParseException("Invalid TCP Packet"); switch(command) { case V6_TCP_START: { if (icqsubtype->getType() == MSG_Type_FT) { FTICQSubType *fticqsubtype = static_cast( icqsubtype ); FileTransferEvent *ev = m_message_handler->handleIncomingFT( fticqsubtype, true ); m_msgcache.insert( seqnum, ev ); } else { bool ack = m_message_handler->handleIncoming( icqsubtype ); if (ack) SendPacketAck(icqsubtype); } } break; case V6_TCP_ACK: if ( m_msgcache.exists(seqnum) ) { MessageEvent *ev = m_msgcache[seqnum]; ev->setDirect(true); m_message_handler->handleIncomingACK( ev, icqsubtype ); m_msgcache.remove(seqnum); if (icqsubtype->getType() != MSG_Type_FT) delete ev; //WARNING!!! FileTransferEvent shall not be deleted here? } else { SignalLog(LogEvent::WARN, "Received Direct ACK for unknown message"); } break; case V6_TCP_CANCEL: // FileTransfer was cancelled before we responded if ( icqsubtype->getType() == MSG_Type_FT && m_msgcache.exists(seqnum) ) { MessageEvent *ev = m_msgcache[seqnum]; if ( ev->getType() == MessageEvent::FileTransfer ) { FileTransferEvent *eev = static_cast(ev); m_message_handler->handleIncomingFTCancel( eev ); m_msgcache.remove(seqnum); } } else { SignalLog(LogEvent::WARN, "Received Direct Cancel for unknown message"); } break; default: ostr << "Unknown TCP Command received 0x" << command; throw ParseException( ostr.str() ); } delete icqsubtype; b >> junk >> version; } bool DirectClient::Decrypt(Buffer& in, Buffer& out) { if (m_eff_tcp_version >= 6) { // Huge *thanks* to licq for this code unsigned long hex, key, B1, M1; unsigned int i; unsigned char X1, X2, X3; unsigned int correction; if (m_eff_tcp_version == 7) correction = 3; else correction = 2; unsigned int size = in.size()-correction; in.setLittleEndian(); out.setLittleEndian(); unsigned short length; in >> length; out << length; if (m_eff_tcp_version == 7) { unsigned char start_byte; in >> start_byte; out << start_byte; } unsigned int check; in >> check; out << check; // main XOR key key = 0x67657268 * size + check; for(i=4; i<(size+3)/4; i+=4) { hex = key + client_check_data[i&0xFF]; out << (unsigned char)(in.UnpackChar() ^ (hex&0xFF)); out << (unsigned char)(in.UnpackChar() ^ ((hex>>8)&0xFF)); out << (unsigned char)(in.UnpackChar() ^ ((hex>>16)&0xFF)); out << (unsigned char)(in.UnpackChar() ^ ((hex>>24)&0xFF)); } unsigned char c; while (in.remains()) { in >> c; out << c; } B1 = (out[4+correction]<<24) | (out[6+correction]<<16) | (out[4+correction]<<8) | (out[6+correction]<<0); // special decryption B1 ^= check; // validate packet M1 = (B1 >> 24) & 0xFF; if(M1 < 10 || M1 >= size) return false; X1 = out[M1+correction] ^ 0xFF; if(((B1 >> 16) & 0xFF) != X1) return false; X2 = ((B1 >> 8) & 0xFF); if(X2 < 220) { X3 = client_check_data[X2] ^ 0xFF; if((B1 & 0xFF) != X3) return false; } } ostringstream ostr; ostr << "Decrypted Direct packet from " << IPtoString( m_socket->getRemoteIP() ) << ":" << m_socket->getRemotePort() << endl << out; SignalLog(LogEvent::DIRECTPACKET, ostr.str()); return true; } void DirectClient::Encrypt(Buffer& in, Buffer& out) { ostringstream ostr; ostr << "Unencrypted packet to " << IPtoString( m_socket->getRemoteIP() ) << ":" << m_socket->getRemotePort() << endl << in; SignalLog(LogEvent::DIRECTPACKET, ostr.str()); if (m_eff_tcp_version == 6 || m_eff_tcp_version == 7) { // Huge *thanks* to licq for this code unsigned long hex, key, B1, M1; unsigned int i, check; unsigned char X1, X2, X3; unsigned int size = in.size(); in.setLittleEndian(); out.setLittleEndian(); if (m_eff_tcp_version == 7) { // correction for next byte out << (unsigned short)(size + 1); out << (unsigned char)0x02; } else { out << (unsigned short)size; } // calculate verification data M1 = (rand() % ((size < 255 ? size : 255)-10))+10; X1 = in[M1] ^ 0xFF; X2 = rand() % 220; X3 = client_check_data[X2] ^ 0xFF; B1 = (in[4]<<24)|(in[6]<<16)|(in[4]<<8)|(in[6]); // calculate checkcode check = (M1 << 24) | (X1 << 16) | (X2 << 8) | X3; check ^= B1; out << check; // main XOR key key = 0x67657268 * size + check; // XORing the actual data in.advance(4); for(i=4;i<(size+3)/4;i+=4){ hex = key + client_check_data[i&0xFF]; out << (unsigned char)(in.UnpackChar() ^ (hex&0xFF)); out << (unsigned char)(in.UnpackChar() ^ ((hex>>8)&0xFF)); out << (unsigned char)(in.UnpackChar() ^ ((hex>>16)&0xFF)); out << (unsigned char)(in.UnpackChar() ^ ((hex>>24)&0xFF)); } unsigned char c; while (in.remains()) { in >> c; out << c; } } } void DirectClient::SendInitAck() { Buffer b; b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned int)0x00000001; b.setAutoSizeMarker(m1); Send(b); } void DirectClient::SendPacketAck(ICQSubType *icqsubtype) { Buffer b; b.setLittleEndian(); b << (unsigned int)0x00000000 // checksum (filled in by Encrypt) << V6_TCP_ACK << (unsigned short)0x000e << icqsubtype->getSeqNum() << (unsigned int)0x00000000 << (unsigned int)0x00000000 << (unsigned int)0x00000000; icqsubtype->Output(b); Buffer c; Encrypt(b,c); Send(c); } void DirectClient::SendPacketEvent(MessageEvent *ev) { Buffer b; unsigned short seqnum = NextSeqNum(); UINICQSubType *ist = m_message_handler->handleOutgoing(ev); if (ist == NULL) return; ist->setAdvanced(true); b.setLittleEndian(); b << (unsigned int)0x00000000 // checksum (filled in by Encrypt) << V6_TCP_START << (unsigned short)0x000e << seqnum << (unsigned int)0x00000000 << (unsigned int)0x00000000 << (unsigned int)0x00000000; ist->Output(b); Buffer c; Encrypt(b,c); Send(c); // Save seqnum so later ACK or CANCEL could be sent. if (ist->getType() == MSG_Type_FT) { FileTransferEvent *fev = static_cast(ev); fev->setSeqNum(seqnum); } m_msgcache.insert(seqnum, ev); delete ist; } void DirectClient::Send(Buffer &b) { try { ostringstream ostr; ostr << "Sending packet to " << IPtoString( m_socket->getRemoteIP() ) << ":" << m_socket->getRemotePort() << endl << b; SignalLog(LogEvent::DIRECTPACKET, ostr.str()); m_socket->Send(b); } catch(SocketException e) { ostringstream ostr; ostr << "Failed to send: " << e.what(); throw DisconnectedException( ostr.str() ); } } void DirectClient::SendFTACK(FileTransferEvent *ev) { FTICQSubType icqsubtype; icqsubtype.setAdvanced(true); icqsubtype.setSeqNum(ev->getSeqNum()); icqsubtype.setACK(true); if (ev->getState() == FileTransferEvent::ACCEPTED) { icqsubtype.setPort(ev->getPort()); icqsubtype.setRevPort(ev->getPort()); icqsubtype.setSize(0); icqsubtype.setMessage(""); // port numbers, etc.. } else { icqsubtype.setStatus( AcceptStatus_Denied ); icqsubtype.setPort(0); icqsubtype.setSize(0); icqsubtype.setMessage( ev->getRefusalMessage() ); } SendPacketAck(&icqsubtype); while (m_msgcache.exists(ev->getSeqNum())) { m_msgcache.remove(ev->getSeqNum()); } } void DirectClient::SendFTCancel(FileTransferEvent *ev) { FTICQSubType fist; fist.setAdvanced(true); fist.setSeqNum(ev->getSeqNum()); fist.setPort(0); fist.setSize(0); fist.setMessage( "" ); Buffer b; b.setLittleEndian(); b << (unsigned int)0x00000000 // checksum (filled in by Encrypt) << V6_TCP_CANCEL << (unsigned short)0x000e << fist.getSeqNum() << (unsigned int)0x00000000 << (unsigned int)0x00000000 << (unsigned int)0x00000000; fist.Output(b); Buffer c; Encrypt(b,c); Send(c); m_msgcache.remove(ev->getSeqNum()); } void DirectClient::SendEvent(MessageEvent *ev) { if (m_state == CONNECTED) { // send straight away SendPacketEvent(ev); } else { // queue message m_msgqueue.push_back(ev); } } void DirectClient::flush_queue() { while (!m_msgqueue.empty()) { SendPacketEvent( m_msgqueue.front() ); m_msgqueue.pop_front(); } } unsigned short DirectClient::NextSeqNum() { return m_seqnum--; } unsigned int DirectClient::getUIN() const { return m_remote_uin; } unsigned int DirectClient::getIP() const { return m_socket->getRemoteIP(); } unsigned short DirectClient::getPort() const { return m_socket->getRemotePort(); } int DirectClient::getfd() const { return m_socket->getSocketHandle(); } TCPSocket* DirectClient::getSocket() const { return m_socket; } void DirectClient::setContact(ContactRef c) { m_contact = c; } ContactRef DirectClient::getContact() const { return m_contact; } } centerim-4.22.10/libicq2000/src/RateLimits.cpp0000644000175000001440000000365511461606612015534 00000000000000/* * RateLimits - Limitation of rate of messages between server and client * * Copyright (C) 2007 Stéphane Bisinger * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "RateLimits.h" namespace ICQ2000 { RateClass::RateClass() : members() {} RateClass::RateClass(unsigned int win, unsigned int clr, unsigned int alrt, unsigned int lim, unsigned int disc, unsigned int cur, unsigned int max, unsigned int last, unsigned char cur_st) : window(win), clear_l(clr), alert_l(alrt), limited_l(lim), disconnected_l(disc), current_l(cur), max_l(max), last_time(last), current_state(cur_st), members() {} void RateClass::setMembers( unsigned short n, Buffer& b ) { for( int i = 0; i < n; i++ ) { unsigned short f, s; b >> f; b >> s; members.insert( std::pair(f, s) ); } } RateClass& RateClass::operator<<(Buffer& b) { b >> window; b >> clear_l; b >> alert_l; b >> limited_l; b >> disconnected_l; b >> current_l; b >> max_l; b >> last_time; b >> current_state; return (*this); } } centerim-4.22.10/libicq2000/src/SNAC-SBL.cpp0000644000175000001440000004106611473007750014620 00000000000000/* * SNAC - Server-based lists * Mitz Pettel, 2001 * * based on: SNAC - Buddy List * * Copyright (C) 2001 Barnaby Gray . * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "SNAC-SBL.h" #include "TLV.h" using std::string; namespace ICQ2000 { // --------------- Server-based Lists (Family 0x0013) SNACs -------------- // ============================================================================ // Request SBL rights // ============================================================================ SBLRequestRightsSNAC::SBLRequestRightsSNAC() { } void SBLRequestRightsSNAC::OutputBody(Buffer& b) const { // empty } // ============================================================================ // SBL rights reply // ============================================================================ SBLRightsReplySNAC::SBLRightsReplySNAC() { } void SBLRightsReplySNAC::ParseBody(Buffer& b) { // several unknown TLVs, skip TLVList tlvlist; tlvlist.Parse(b, TLV_ParseMode_SBL_Rights, b.remains()); } // ============================================================================ // Unconditional SBL list request // ============================================================================ SBLRequestListSNAC::SBLRequestListSNAC() { } void SBLRequestListSNAC::OutputBody(Buffer& b) const { // empty } // ============================================================================ // SBL list reply // ============================================================================ SBLListSNAC::SBLListSNAC() : m_privacy_id(0) { } const unsigned short Entry_UIN = 0x0000; const unsigned short Entry_Group = 0x0001; const unsigned short Entry_VisSetting = 0x0004; const unsigned short Entry_ICQTIC = 0x0009; const unsigned short Entry_Invisible = 0x000e; const unsigned short Entry_ImportTime = 0x0013; void SBLListSNAC::ParseBody(Buffer& b) { b.advance(1); // 00 b >> m_size; // remember for client unsigned short l = m_size; while (l--) { string name; unsigned short group_id, tag_id, type, len, end; b >> name >> group_id >> tag_id >> type >> len; end = b.pos() + len; // Parse TLVs TLVList tlvlist; tlvlist.ParseByLength(b, TLV_ParseMode_SBL, len); switch(type) { case Entry_UIN: { unsigned int uin; string nick; uin = Contact::StringtoUIN(name); ContactRef ct = ContactRef(new Contact(uin)); ct->setServerSideInfo(group_id, tag_id); if (tlvlist.exists(TLV_SBL_Nick)) { SBLNickTLV *tlv = static_cast(tlvlist[TLV_SBL_Nick]); ct->setAlias(tlv->Value()); // translate (?) } else { ct->setAlias(name); } if (tlvlist.exists(TLV_SBL_SMS_No)) { SBLSMSNoTLV *tlv = static_cast(tlvlist[TLV_SBL_SMS_No]); ct->setMobileNo(tlv->Value()); } if (tlvlist.exists(TLV_SBL_Await_Auth)) { ct->setAuthAwait(true); } else { ct->setAuthAwait(false); } // add to contact tree under group if (!m_tree.exists_group( group_id )) { //throw ParseException("Contact group_id doesn't match any group"); m_unassigned.push_back( ct ); } else { ContactTree::Group& gp = m_tree.lookup_group( group_id ); gp.add(ct); } break; } case Entry_Group: if (group_id > 0) m_tree.add_group( name, group_id ); break; case Entry_VisSetting: m_privacy_id = tag_id; break; /* case Entry_ICQTIC: // ignore break; case Entry_Invisible: // TODO break; case Entry_ImportTime: // ignore break;*/ default: m_other_ids.insert(tag_id); // save tag_id break; } } b.advance(4); } // ============================================================================ // SBL List Received ACK // ============================================================================ SBLListACKSNAC::SBLListACKSNAC() { } void SBLListACKSNAC::OutputBody(Buffer& b) const { // empty } // ============================================================================ // SBL Begin Edit // ============================================================================ SBLBeginEditSNAC::SBLBeginEditSNAC() { } void SBLBeginEditSNAC::OutputBody(Buffer& b) const { // empty } // ============================================================================ // SBL Commit Edit // ============================================================================ SBLCommitEditSNAC::SBLCommitEditSNAC() { } void SBLCommitEditSNAC::OutputBody(Buffer& b) const { // empty } // ============================================================================ // SBL Add Buddy // ============================================================================ SBLAddBuddySNAC::SBLAddBuddySNAC() { } SBLAddBuddySNAC::SBLAddBuddySNAC(const Sbl_item &buddy, unsigned short group_id) : m_buddy(buddy), m_buddy_group(group_id) { } void SBLAddBuddySNAC::OutputBody(Buffer& b) const { b << Contact::UINtoString(m_buddy.uin); b << (unsigned short) m_buddy_group; b << (unsigned short) m_buddy.tag_id; b << (unsigned short) 0x0000; Buffer::marker m = b.getAutoSizeShortMarker(); // Contact Nickname TLV b << TLV_ContactNickname; b << m_buddy.nickname; // Auth awaiting TLV if(m_buddy.awaitAuth) { b << TLV_AuthAwaited; b << (unsigned short) 0x0000; } b.setAutoSizeMarker(m); } // ============================================================================ // SBL Add Group // ============================================================================ SBLAddGroupSNAC::SBLAddGroupSNAC() { } SBLAddGroupSNAC::SBLAddGroupSNAC(const string& group_name, unsigned short group_id) : m_group_name(group_name), m_group_id(group_id) { } void SBLAddGroupSNAC::OutputBody(Buffer& b) const { // a Group b << m_group_name; b << m_group_id; b << (unsigned short) 0x0000; b << (unsigned short) 0x0001; b << (unsigned short) 0x0000; } // ============================================================================ // SBL Update Entry // ============================================================================ #if 0 SBLUpdateEntrySNAC::SBLUpdateEntrySNAC(const string &group_name, unsigned short group_id, const std::vector &ids) : m_group_name(group_name), m_group_id(group_id), m_ids(ids), m_cont(0) { } SBLUpdateEntrySNAC::SBLUpdateEntrySNAC(const ContactRef &c) : m_cont(c), m_group_id(0) { } void SBLUpdateEntrySNAC::OutputBody(Buffer& b) const { if(!m_cont.get()) { b << (unsigned short) m_group_name.size(); b.Pack(m_group_name); b << m_group_id; b << (unsigned short) 0x0000; b << (unsigned short) 0x0001; if(m_ids.empty()) { b << (unsigned short) 0x0000; } else { b << (unsigned short) (4 + m_ids.size()*2); b << (unsigned short) 0x00c8; b << (unsigned short) (m_ids.size()*2); // raw-coded TLV, found no suitable data structures in TLV.h std::vector::const_iterator curr = m_ids.begin(); while (curr != m_ids.end()) { b << (unsigned short) *curr; ++curr; } } } else { string suin = m_cont->getStringUIN(); b << (unsigned short) suin.size(); b.Pack(suin); b << m_cont->getServerSideGroupID(); b << m_cont->getServerSideID(); b << (unsigned short) 0x0000; Buffer::marker m = b.getAutoSizeShortMarker(); // Auth awaiting TLV if(m_cont->getAuthAwait()) { b << TLV_AuthAwaited; b << (unsigned short) 0x0000; } b.setAutoSizeMarker(m); } } #endif // ============================================================================ // SBL Update Group // ============================================================================ SBLUpdateGroupSNAC::SBLUpdateGroupSNAC(const string &group_name, unsigned short group_id, const std::set &ids) : m_group_name(group_name), m_group_id(group_id), m_ids(ids) { } SBLUpdateGroupSNAC::SBLUpdateGroupSNAC(const Sbl_group& group) : m_group_name(group.name), m_group_id(group.group_id), m_ids(group.buddies) { } void SBLUpdateGroupSNAC::OutputBody(Buffer& b) const { b << (unsigned short) m_group_name.size(); b.Pack(m_group_name); b << m_group_id; b << (unsigned short) 0x0000; b << (unsigned short) 0x0001; if(m_ids.empty()) { b << (unsigned short) 0x0000; } else { b << (unsigned short) (4 + m_ids.size()*2); b << (unsigned short) 0x00c8; b << (unsigned short) (m_ids.size()*2); // raw-coded TLV, found no suitable data structures in TLV.h std::set::const_iterator curr = m_ids.begin(); while (curr != m_ids.end()) { b << (unsigned short) *curr; ++curr; } } } // ============================================================================ // SBL Update Privacy Settings // ============================================================================ SBLUpdatePrivacySNAC::SBLUpdatePrivacySNAC(unsigned short buddy_id, unsigned char privacy) { m_buddy_id = buddy_id; m_privacy = privacy; } void SBLUpdatePrivacySNAC::OutputBody(Buffer& b) const { b << (unsigned short) 0x0000; // no buddy name b << (unsigned short) 0x0000; // master group b << m_buddy_id; // buddy ID b << (unsigned short) 0x0004; // Permit/Deny record Buffer::marker m = b.getAutoSizeShortMarker(); b << (unsigned short) 0x00ca; // Privacy TLV b << (unsigned short) 0x0001; b << m_privacy; b << (unsigned short) 0x00cb; // Class visibility TLV b << (unsigned short) 0x0004; b << (unsigned short) 0xFFFF; // All classes b << (unsigned short) 0xFFFF; b.setAutoSizeMarker(m); } // ============================================================================ // SBL Remove Entry // ============================================================================ #if 0 SBLRemoveEntrySNAC::SBLRemoveEntrySNAC() { } SBLRemoveEntrySNAC::SBLRemoveEntrySNAC(const ContactList& l) : m_buddy_list(), m_group_id(0) { ContactList::const_iterator curr = l.begin(); while (curr != l.end()) { if ((*curr)->isICQContact()) m_buddy_list.push_back(*curr); ++curr; } } SBLRemoveEntrySNAC::SBLRemoveEntrySNAC(const ContactRef& c) : m_buddy_list(1, c), m_group_id(0) { } SBLRemoveEntrySNAC::SBLRemoveEntrySNAC(const string &group_name, unsigned short group_id) : m_group_name(group_name), m_group_id(group_id) { } void SBLRemoveEntrySNAC::OutputBody(Buffer& b) const { if(m_group_id) { b << (unsigned short) m_group_name.size(); b.Pack(m_group_name); b << m_group_id; b << (unsigned short) 0x0000; b << (unsigned short) 0x0001; b << (unsigned short) 0x0000; } else { std::list::const_iterator curr = m_buddy_list.begin(); while (curr != m_buddy_list.end()) { string suin = (*curr)->getStringUIN(); string alias = (*curr)->getAlias(); b << (unsigned short) suin.size(); b.Pack(suin); b << (unsigned short) (*curr)->getServerSideGroupID(); b << (unsigned short) (*curr)->getServerSideID(); b << (unsigned short) 0x0000; int tlvlen = 4 + alias.size(); if((*curr)->getAuthAwait()) tlvlen += 4; b << (unsigned short) tlvlen; b << TLV_ContactNickname; b << (unsigned short) alias.size(); b.Pack(alias); if((*curr)->getAuthAwait()) { b << TLV_AuthAwaited; b << (unsigned short) 0x0000; } ++curr; } } } #endif // ============================================================================ // SBL Remove Buddy // ============================================================================ SBLRemoveBuddySNAC::SBLRemoveBuddySNAC() { } SBLRemoveBuddySNAC::SBLRemoveBuddySNAC(const Sbl_item &buddy, unsigned short group_id) : m_buddy(buddy), m_buddy_group(group_id) { } void SBLRemoveBuddySNAC::OutputBody(Buffer& b) const { b << Contact::UINtoString(m_buddy.uin); b << (unsigned short) m_buddy_group; b << (unsigned short) m_buddy.tag_id; b << (unsigned short) 0x0000; Buffer::marker m = b.getAutoSizeShortMarker(); // Contact Nickname TLV b << TLV_ContactNickname; b << m_buddy.nickname; // Auth awaiting TLV if(m_buddy.awaitAuth) { b << TLV_AuthAwaited; b << (unsigned short) 0x0000; } b.setAutoSizeMarker(m); } // ============================================================================ // SBL Remove Group // ============================================================================ SBLRemoveGroupSNAC::SBLRemoveGroupSNAC() { } SBLRemoveGroupSNAC::SBLRemoveGroupSNAC(const string& group_name, unsigned short group_id) : m_group_name(group_name), m_group_id(group_id) { } void SBLRemoveGroupSNAC::OutputBody(Buffer& b) const { // a Group b << m_group_name; b << m_group_id; b << (unsigned short) 0x0000; b << (unsigned short) 0x0001; b << (unsigned short) 0x0000; } // ============================================================================ // SBL Edit ACK // ============================================================================ SBLEditACKSNAC::SBLEditACKSNAC() { } void SBLEditACKSNAC::ParseBody(Buffer& b) { unsigned short errcode; while(b.remains() >= 2) { b >> errcode; switch(errcode) { case 0x0000: m_results.push_back(Success); break; case 0x0003: m_results.push_back(AlreadyExists); break; case 0x000a: m_results.push_back(Failed); break; case 0x000e: m_results.push_back(AuthRequired); break; } } } // ============================================================================ // SBL List Unchanged reply // ============================================================================ SBLListUnchangedSNAC::SBLListUnchangedSNAC() { } void SBLListUnchangedSNAC::ParseBody(Buffer& b) { // anything? } // ============================================================================ // SBL Request authorisation // ============================================================================ SBLRequestAuthSNAC::SBLRequestAuthSNAC(const ContactRef &c, const std::string &message) : m_cont(c), m_msg(message) { } void SBLRequestAuthSNAC::OutputBody(Buffer& b) const { b.PackByteString(m_cont->getStringUIN()); b << m_msg; b << (unsigned short) 0x0000; } // ============================================================================ // SBL Incoming request authorisation // ============================================================================ SBLAuthRequestSNAC::SBLAuthRequestSNAC() { } void SBLAuthRequestSNAC::ParseBody(Buffer& b) { unsigned short unk; b.UnpackByteString(m_uin); b >> m_msg; b >> unk; } // ============================================================================ // SBL Authorisation request reply (outgoing) // ============================================================================ SBLAuthoriseSNAC::SBLAuthoriseSNAC(const ContactRef &c, const std::string reason, const bool grant) : m_cont(c), m_reason(reason), m_grant(grant) { } void SBLAuthoriseSNAC::OutputBody(Buffer &b) const { b.PackByteString(m_cont->getStringUIN()); b << (unsigned char)(m_grant ? 1 : 0); b << m_reason; } // ============================================================================ // SBL Authorisation request reply (incoming) // ============================================================================ SBLAuthReceivedSNAC::SBLAuthReceivedSNAC() { } void SBLAuthReceivedSNAC::ParseBody(Buffer& b) { unsigned char res; b.UnpackByteString(m_uin); b >> res; m_grant = res; b >> m_msg; } // ============================================================================ // SBL "User added you" incoming message // ============================================================================ SBLUserAddedYouSNAC::SBLUserAddedYouSNAC() { } void SBLUserAddedYouSNAC::ParseBody(Buffer& b) { b.UnpackByteString(m_uin); } } centerim-4.22.10/libicq2000/src/TLV.h0000644000175000001440000004440511461606612013567 00000000000000/* * TLVs (Type, Length, Value) * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef TLV_H #define TLV_H #include #include #include #include #include "Xml.h" #include "exceptions.h" #include "buffer.h" #include "constants.h" #include "ICQ.h" #include "Capabilities.h" namespace ICQ2000 { // ------------- TLV numerical constants ------------ /* * TLV types * Originally I thought TLV types were distinct within * each channel, but in Messages it turns out they are only * distinct within each block. To complicate matters you * then get TLVs inside TLVs.. * Solution: the TLV parser must be told what it is expecting * to parse so that the correct TLV types are associated */ enum TLV_ParseMode { TLV_ParseMode_Channel01, TLV_ParseMode_Channel02, TLV_ParseMode_Channel04, TLV_ParseMode_MessageBlock, TLV_ParseMode_AdvMsgBlock, TLV_ParseMode_InMessageData, TLV_ParseMode_InAdvMsgData, TLV_ParseMode_SBL, TLV_ParseMode_SBL_Rights }; // Channel 0x0001 const unsigned short TLV_Screenname = 0x0001; const unsigned short TLV_Password = 0x0002; const unsigned short TLV_ClientProfile = 0x0003; const unsigned short TLV_UserInfo = 0x0005; const unsigned short TLV_Cookie = 0x0006; const unsigned short TLV_CountryCode = 0x000e; const unsigned short TLV_Language = 0x000f; const unsigned short TLV_ClientBuildMinor = 0x0014; const unsigned short TLV_ClientType = 0x0016; const unsigned short TLV_ClientVersionMajor = 0x0017; const unsigned short TLV_ClientVersionMinor = 0x0018; const unsigned short TLV_ClientICQNumber = 0x0019; const unsigned short TLV_ClientBuildMajor = 0x001a; const unsigned short TLV_Type94 = 0x0094; // Channel 0x0002 const unsigned short TLV_UserClass = 0x0001; const unsigned short TLV_SignupDate = 0x0002; const unsigned short TLV_SignonDate = 0x0003; const unsigned short TLV_Port = 0x0004; // ?? const unsigned short TLV_UserInfoCapabilities = 0x0005; const unsigned short TLV_Status = 0x0006; const unsigned short TLV_Unknown = 0x0008; // ?? const unsigned short TLV_IPAddress = 0x000a; const unsigned short TLV_WebAddress = 0x000b; const unsigned short TLV_LANDetails = 0x000c; const unsigned short TLV_Capabilities = 0x000d; const unsigned short TLV_TimeOnline = 0x000f; const unsigned short TLV_ContactNickname = 0x0131; const unsigned short TLV_AuthAwaited = 0x0066; // Channel 0x0004 // const unsigned short TLV_Screenname = 0x0001; const unsigned short TLV_ErrorURL = 0x0004; const unsigned short TLV_Redirect = 0x0005; // const unsigned short TLV_Cookie = 0x0006; const unsigned short TLV_ErrorCode = 0x0008; const unsigned short TLV_DisconnectReason = 0x0009; const unsigned short TLV_DisconnectMessage = 0x000b; const unsigned short TLV_Unknown3 = 0x000c; const unsigned short TLV_EmailAddress = 0x0011; const unsigned short TLV_RegStatus = 0x0013; // Message Block const unsigned short TLV_MessageData = 0x0002; const unsigned short TLV_ServerAckRequested = 0x0003; const unsigned short TLV_MessageIsAutoResponse = 0x0004; const unsigned short TLV_ICQData = 0x0005; // Advanced Message Block const unsigned short TLV_AdvMsgData = 0x0005; // In Message Data const unsigned short TLV_Unknown0501 = 0x0501; const unsigned short TLV_MessageText = 0x0101; // In Advanced Message Data const unsigned short TLV_AdvMsgBody = 0x2711; // loads more - but we don't parse them yet // In Server-based list data const unsigned short TLV_SBL_Await_Auth = 0x0066; const unsigned short TLV_SBL_Ids = 0x00c8; const unsigned short TLV_SBL_Visibility = 0x00ca; const unsigned short TLV_SBL_ICQTIC = 0x00cd; const unsigned short TLV_SBL_ImportTime = 0x00d4; const unsigned short TLV_SBL_Nick = 0x0131; const unsigned short TLV_SBL_SMS_No = 0x013a; // ------------- abstract TLV classes --------------- class TLV { public: virtual ~TLV() { } virtual unsigned short Type() const = 0; virtual unsigned short Length() const = 0; }; // -- Inbound TLV -- class InTLV : public TLV { public: virtual void ParseValue(Buffer& b) = 0; static InTLV* ParseTLV(Buffer& b, TLV_ParseMode pm); }; // -- Outbound TLV -- class OutTLV : public TLV { protected: virtual void OutputHeader(Buffer& b) const; virtual void OutputValue(Buffer& b) const = 0; public: virtual void Output(Buffer& b) const; }; // -------------- base classes ---------------------- class CharTLV : public OutTLV, public InTLV { protected: unsigned char m_value; virtual void OutputValue(Buffer& b) const; public: CharTLV(); CharTLV(unsigned char n); unsigned short Length() const { return 1; } virtual void ParseValue(Buffer& b); virtual unsigned char Value() const { return m_value; } }; class ShortTLV : public OutTLV, public InTLV { protected: unsigned short m_value; virtual void OutputValue(Buffer& b) const; public: ShortTLV(); ShortTLV(unsigned short n); unsigned short Length() const { return 2; } virtual void ParseValue(Buffer& b); virtual unsigned short Value() const { return m_value; } }; class LongTLV : public OutTLV, public InTLV { protected: unsigned int m_value; virtual void OutputValue(Buffer& b) const; public: LongTLV(); LongTLV(unsigned int n); unsigned short Length() const { return 4; } virtual void ParseValue(Buffer& b); virtual unsigned int Value() const { return m_value; } }; class StringTLV : public OutTLV, public InTLV { protected: std::string m_value; virtual void OutputValue(Buffer& b) const; public: StringTLV(); StringTLV(const std::string& val); unsigned short Length() const { return m_value.size(); } virtual void ParseValue(Buffer& b); virtual std::string Value() const { return m_value; } }; // --------------- actual classes ------------------- class ErrorURLTLV : public StringTLV { public: ErrorURLTLV() { } unsigned short Type() const { return TLV_ErrorURL; } }; class ErrorCodeTLV : public ShortTLV { public: ErrorCodeTLV() { } unsigned short Type() const { return TLV_ErrorCode; } }; class DisconnectReasonTLV : public ShortTLV { public: DisconnectReasonTLV() { } unsigned short Type() const { return TLV_DisconnectReason; } }; class DisconnectMessageTLV : public StringTLV { public: DisconnectMessageTLV() { } unsigned short Type() const { return TLV_DisconnectMessage; } }; class ScreenNameTLV : public StringTLV { public: ScreenNameTLV(); ScreenNameTLV(const std::string& val); unsigned short Type() const { return TLV_Screenname; } }; class PasswordTLV : public OutTLV { protected: std::string m_password; void OutputValue(Buffer& b) const; public: PasswordTLV(const std::string& pw); unsigned short Type() const { return TLV_Password; } unsigned short Length() const { return m_password.size(); } }; const unsigned char ALLOWDIRECT_EVERYONE = 0x00; const unsigned char ALLOWDIRECT_AUTHORIZATION = 0x10; const unsigned char ALLOWDIRECT_CONTACTLIST = 0x20; const unsigned char WEBAWARE_NORMAL = 0x02; const unsigned char WEBAWARE_WEBAWARE = 0x03; class StatusTLV : public OutTLV, public InTLV { private: unsigned char m_allowDirect; unsigned char m_webAware; unsigned short m_status; protected: void OutputValue(Buffer& b) const; void ParseValue(Buffer& b); public: StatusTLV(unsigned char ad, unsigned char wa, unsigned short st) : m_allowDirect(ad), m_webAware(wa), m_status(st) { } StatusTLV() { } unsigned short Type() const { return TLV_Status; } unsigned short Length() const { return 4; } unsigned char getAllowDirect() { return m_allowDirect; } unsigned char getWebAware() { return m_webAware; } unsigned short getStatus() { return m_status; } bool getBirthday() { return ((m_webAware & 0x08) == 0x08); } void setAllowDirect(unsigned char m) { m_allowDirect = m; } void setWebAware(unsigned char m) { m_webAware = m; } void setStatus(unsigned short m) { m_status = m; } }; // -- Client*TLVs -- class ClientProfileTLV : public StringTLV { public: ClientProfileTLV(const std::string& val) : StringTLV(val) { } unsigned short Type() const { return TLV_ClientProfile; } }; class ClientTypeTLV : public ShortTLV { public: ClientTypeTLV(unsigned short n) : ShortTLV(n) { } unsigned short Type() const { return TLV_ClientType; } }; class ClientVersionMajorTLV : public ShortTLV { public: ClientVersionMajorTLV(unsigned short n) : ShortTLV(n) { } unsigned short Type() const { return TLV_ClientVersionMajor; } }; class ClientVersionMinorTLV : public ShortTLV { public: ClientVersionMinorTLV(unsigned short n) : ShortTLV(n) { } unsigned short Type() const { return TLV_ClientVersionMinor; } }; class ClientICQNumberTLV : public ShortTLV { public: ClientICQNumberTLV(unsigned short n) : ShortTLV(n) { } unsigned short Type() const { return TLV_ClientICQNumber; } }; class ClientBuildMajorTLV : public ShortTLV { public: ClientBuildMajorTLV(unsigned short n) : ShortTLV(n) { } unsigned short Type() const { return TLV_ClientBuildMajor; } }; class ClientBuildMinorTLV : public LongTLV { public: ClientBuildMinorTLV(unsigned int n) : LongTLV(n) { } unsigned short Type() const { return TLV_ClientBuildMinor; } }; class CountryCodeTLV : public StringTLV { public: CountryCodeTLV(std::string val) : StringTLV(val) { } unsigned short Type() const { return TLV_CountryCode; } }; class LanguageTLV : public StringTLV { public: LanguageTLV(const std::string& val) : StringTLV(val) { } unsigned short Type() const { return TLV_Language; } }; class Type94TLV : public CharTLV { public: Type94TLV(unsigned char n) : CharTLV(n) { } unsigned short Type() const { return TLV_Type94; } }; // -- class WebAddressTLV : public StringTLV { public: WebAddressTLV() { } unsigned short Type() const { return TLV_WebAddress; } }; class UserClassTLV : public ShortTLV { public: UserClassTLV() { } unsigned short Type() const { return TLV_UserClass; } }; class TimeOnlineTLV : public LongTLV { public: TimeOnlineTLV() { } unsigned short Type() const { return TLV_TimeOnline; } }; class SignupDateTLV : public LongTLV { public: SignupDateTLV() { } unsigned short Type() const { return TLV_SignupDate; } }; class SignonDateTLV : public LongTLV { public: SignonDateTLV() { } unsigned short Type() const { return TLV_SignonDate; } }; class UnknownTLV : public ShortTLV { public: UnknownTLV() : ShortTLV(0) { } unsigned short Type() const { return TLV_Unknown; } }; class IPAddressTLV : public LongTLV { public: IPAddressTLV() { } unsigned short Type() const { return TLV_IPAddress; } }; class PortTLV : public ShortTLV { public: PortTLV() { } unsigned short Type() const { return TLV_Port; } }; class UserInfoCapabilitiesTLV : public OutTLV { private: Capabilities m_capabilities; public: UserInfoCapabilitiesTLV(); unsigned short Type() const { return TLV_UserInfoCapabilities; } unsigned short Length() const; void OutputValue(Buffer& b) const; }; class CapabilitiesTLV : public InTLV { private: Capabilities m_capabilities; public: CapabilitiesTLV() { } unsigned short Type() const { return TLV_Capabilities; } unsigned short Length() const { return m_capabilities.get_length(); } Capabilities get_capabilities() const; void ParseValue(Buffer& b); }; class RedirectTLV : public InTLV { private: std::string m_server; unsigned short m_port; public: RedirectTLV() { } unsigned short Length() const { return m_server.size(); } unsigned short Type() const { return TLV_Redirect; } void ParseValue(Buffer& b); std::string getHost() { return m_server; } unsigned short getPort() { return m_port; } }; class CookieTLV : public InTLV, public OutTLV { private: unsigned char *m_value; unsigned short m_length; public: CookieTLV() : m_value(NULL), m_length(0) { } CookieTLV(const unsigned char *ck, unsigned short len); ~CookieTLV(); unsigned short Length() const { return m_length; } unsigned short Type() const { return TLV_Cookie; } void ParseValue(Buffer& b); void OutputValue(Buffer& b) const; const unsigned char* Value() { return m_value; } }; // can go out as well class LANDetailsTLV : public InTLV, public OutTLV { private: unsigned int m_lan_ip; unsigned short m_lan_port, m_firewall; unsigned char m_tcp_version; unsigned int m_dc_cookie; public: LANDetailsTLV(); LANDetailsTLV(unsigned int ip, unsigned short port); unsigned short Length() const { return 0; } // varies unsigned short Type() const { return TLV_LANDetails; } unsigned int getLanIP() const { return m_lan_ip; } unsigned short getLanPort() const { return m_lan_port; } unsigned short getFirewall() const { return m_firewall; } unsigned char getTCPVersion() const { return m_tcp_version; } unsigned int getDCCookie() const { return m_dc_cookie; } void ParseValue(Buffer& b); void OutputValue(Buffer& b) const; }; class RawTLV : public InTLV { protected: unsigned short m_type; unsigned short m_length; public: RawTLV(unsigned short type); unsigned short Type() const { return m_type; } unsigned short Length() const { return m_length; } void ParseValue(Buffer& b); }; const unsigned short MESSAGETEXT_FLAG1_UCS2 = 0x02; const unsigned short MESSAGETEXT_FLAG1_ISO8859_1 = 0x03; class MessageTextTLV : public InTLV { protected: std::string m_message; unsigned short m_flag1, m_flag2; public: MessageTextTLV() : m_message(), m_flag1(0), m_flag2(0) { } std::string getMessage() { return m_message; } unsigned short getFlag1() { return m_flag1; } unsigned short getFlag2() { return m_flag1; } void ParseValue(Buffer& b); unsigned short Type() const { return TLV_MessageText; } unsigned short Length() const { return 0; } }; class MessageDataTLV : public InTLV { MessageTextTLV mttlv; public: MessageDataTLV(); std::string getMessage() { return mttlv.getMessage(); } unsigned short getFlag1() { return mttlv.getFlag1(); } unsigned short getFlag2() { return mttlv.getFlag2(); } void ParseValue(Buffer& b); unsigned short Type() const { return TLV_MessageData; } unsigned short Length() const { return 0; } }; class AdvMsgBodyTLV : public InTLV { protected: ICQSubType *m_icqsubtype; public: AdvMsgBodyTLV(); ~AdvMsgBodyTLV(); ICQSubType* grabICQSubType(); void ParseValue(Buffer& b); unsigned short Type() const { return TLV_AdvMsgBody; } unsigned short Length() const { return 0; } }; class AdvMsgDataTLV : public InTLV { ICQSubType *m_icqsubtype; public: AdvMsgDataTLV(); ~AdvMsgDataTLV(); ICQSubType* grabICQSubType(); void ParseValue(Buffer& b); unsigned short Type() const { return TLV_AdvMsgData; } unsigned short Length() const { return 0; } }; // ============================================================================ // SBL TLVs // ============================================================================ class SBLAwaitAuthTLV : public InTLV { public: SBLAwaitAuthTLV() { } unsigned short Type() const { return TLV_SBL_Await_Auth; } unsigned short Length() const { return 0; } void ParseValue(Buffer& b); }; class SBLIdsTLV : public InTLV { public: SBLIdsTLV() { } unsigned short Type() const { return TLV_SBL_Ids; } unsigned short Length() const { return 0; } void ParseValue(Buffer& b); }; class SBLVisibilityTLV : public CharTLV { public: SBLVisibilityTLV() { } unsigned short Type() const { return TLV_SBL_Visibility; } }; class SBLICQTICTLV : public StringTLV { public: SBLICQTICTLV() { } unsigned short Type() const { return TLV_SBL_ICQTIC; } }; class SBLImportTimeTLV : public LongTLV { public: SBLImportTimeTLV() { } unsigned short Type() const { return TLV_SBL_ImportTime; } }; class SBLNickTLV : public StringTLV { public: SBLNickTLV() { } unsigned short Type() const { return TLV_SBL_Nick; } }; class SBLSMSNoTLV : public StringTLV { public: SBLSMSNoTLV() { } unsigned short Type() const { return TLV_SBL_SMS_No; } }; // --------------- ICQDataTLV ------------------ class ICQDataTLV : public InTLV { private: ICQSubType *m_icqsubtype; public: ICQDataTLV(); ~ICQDataTLV(); ICQSubType* getICQSubType() const; ICQSubType* grabICQSubType(); void ParseValue(Buffer& b); unsigned short Type() const { return TLV_ICQData; } unsigned short Length() const { return 0; } }; // ---------------- TLV List ------------------- class TLVList { private: std::map tlvmap; public: TLVList(); ~TLVList(); void Parse(Buffer& b, TLV_ParseMode pm, unsigned short no_tlvs); void ParseByLength(Buffer& b, TLV_ParseMode pm, unsigned int len); bool exists(unsigned short type); InTLV* & operator[](unsigned short type); }; Buffer& operator<<(Buffer& b, const ICQ2000::OutTLV& t); } #endif centerim-4.22.10/libicq2000/src/SNAC.cpp0000644000175000001440000000725011461606612014176 00000000000000/* * SNACs * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SNAC.h" namespace ICQ2000 { InSNAC* ParseSNAC(Buffer& b) { unsigned short family, subtype; b >> family >> subtype; InSNAC *snac = NULL; switch(family) { case SNAC_FAM_BOS: switch(subtype) { case SNAC_BOS_Error: snac = new ErrorInSNAC(family, subtype); break; } break; case SNAC_FAM_GEN: switch(subtype) { case SNAC_GEN_ServerReady: snac = new ServerReadySNAC(); break; case SNAC_GEN_RateInfo: snac = new RateInfoSNAC(); break; case SNAC_GEN_CapAck: snac = new CapAckSNAC(); break; case SNAC_GEN_UserInfo: snac = new UserInfoSNAC(); break; case SNAC_GEN_MOTD: snac = new MOTDSNAC(); break; case SNAC_GEN_RateInfoChange: snac = new RateInfoChangeSNAC(); break; case SNAC_GEN_Error: snac = new ErrorInSNAC(family, subtype); break; } break; case SNAC_FAM_BUD: switch(subtype) { case SNAC_BUD_Online: snac = new BuddyOnlineSNAC(); break; case SNAC_BUD_Offline: snac = new BuddyOfflineSNAC(); break; case SNAC_BUD_Error: snac = new ErrorInSNAC(family, subtype); break; } break; case SNAC_FAM_MSG: switch(subtype) { case SNAC_MSG_Message: snac = new MessageSNAC(); break; case SNAC_MSG_MessageACK: snac = new MessageACKSNAC(); break; case SNAC_MSG_OfflineUser: snac = new MessageOfflineUserSNAC(); break; case SNAC_MSG_TypingNotification: snac = new MessageTypingNotificationSNAC(); break; case SNAC_MSG_Error: snac = new ErrorInSNAC(family, subtype); break; } break; case SNAC_FAM_SRV: switch(subtype) { case SNAC_SRV_Response: snac = new SrvResponseSNAC(); break; case SNAC_SRV_Error: snac = new ErrorInSNAC(family, subtype); break; } break; case SNAC_FAM_UIN: switch(subtype) { case SNAC_UIN_RequestError: snac = new UINRequestErrorSNAC(); break; case SNAC_UIN_Response: snac = new UINResponseSNAC(); break; } case SNAC_FAM_SBL: switch(subtype) { case SNAC_SBL_Rights_Reply: snac = new SBLRightsReplySNAC(); break; case SNAC_SBL_List_From_Server: snac = new SBLListSNAC(); break; case SNAC_SBL_List_Unchanged: snac = new SBLListUnchangedSNAC(); break; case SNAC_SBL_Edit_ACK: snac = new SBLEditACKSNAC(); break; case SNAC_SBL_Auth_Request: snac = new SBLAuthRequestSNAC(); break; case SNAC_SBL_Auth_Received: snac = new SBLAuthReceivedSNAC(); break; case SNAC_SBL_User_Added_You: snac = new SBLUserAddedYouSNAC(); break; case SNAC_SBL_Error: snac = new ErrorInSNAC(family, subtype); break; } break; } if (snac == NULL) { // unrecognised SNAC // parse as a RawSNAC snac = new RawSNAC(family, subtype); } snac->Parse(b); return snac; } } centerim-4.22.10/libicq2000/src/ICQ.h0000644000175000001440000002736311461606612013542 00000000000000/* * ICQ Subtypes * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef ICQ_H #define ICQ_H #include #include #include "Xml.h" #include "buffer.h" #include "exceptions.h" #include "constants.h" #include "Contact.h" namespace ICQ2000 { // ------------- TCP Command Types ------------------ const unsigned short V6_TCP_START = 0x07ee; const unsigned short V6_TCP_ACK = 0x07da; const unsigned short V6_TCP_CANCEL = 0x07d0; // ------------- Message Types ---------------------- const unsigned char MSG_Type_Normal = 0x01; const unsigned char MSG_Type_FT = 0x03; const unsigned char MSG_Type_URL = 0x04; const unsigned char MSG_Type_AuthReq = 0x06; const unsigned char MSG_Type_AuthRej = 0x07; const unsigned char MSG_Type_AuthAcc = 0x08; const unsigned char MSG_Type_UserAdd = 0x0c; const unsigned char MSG_Type_WebPager= 0x0d; const unsigned char MSG_Type_EmailEx = 0x0e; const unsigned char MSG_Type_SMS = 0x1a; const unsigned char MSG_Type_Contact = 0x13; const unsigned char MSG_Type_AutoReq_Away = 0xe8; const unsigned char MSG_Type_AutoReq_Occ = 0xe9; const unsigned char MSG_Type_AutoReq_NA = 0xea; const unsigned char MSG_Type_AutoReq_DND = 0xeb; const unsigned char MSG_Type_AutoReq_FFC = 0xec; const unsigned char MSG_Flag_AutoReq = 0x03; const unsigned char MSG_Flag_Multi = 0x80; const unsigned short Priority_Normal = 0x0001; const unsigned short Priority_Urgent = 0x0002; const unsigned short Priority_ToContactList = 0x0004; const unsigned short AcceptStatus_Online = 0x0000; // accepted const unsigned short AcceptStatus_Denied = 0x0001; // not accepted - denied const unsigned short AcceptStatus_Away = 0x0004; // accepted in away const unsigned short AcceptStatus_Occupied = 0x0009; // not accepted in occupied const unsigned short AcceptStatus_DND = 0x000a; // not accepted in DND const unsigned short AcceptStatus_Occ_Accept = 0x000c; // accepted from a to contact list in occupied const unsigned short AcceptStatus_NA = 0x000e; // accepted in NA /* ICQSubtype classes * An attempt at clearing up the complete * mess ICQ have made of bundling everything * into one TLV */ class ICQSubType { protected: unsigned short m_seqnum; unsigned char m_flags; public: ICQSubType(); virtual ~ICQSubType() { } static ICQSubType* ParseICQSubType(Buffer& b, bool adv, bool ack); void Output(Buffer& b) const; virtual void ParseBody(Buffer& b) = 0; virtual void OutputBody(Buffer& b) const = 0; virtual unsigned short Length() const = 0; virtual unsigned char getType() const = 0; virtual unsigned char getFlags() const { return m_flags; } virtual void setFlags(unsigned char f) { m_flags = f; } unsigned short getSeqNum() const { return m_seqnum; } void setSeqNum(unsigned short s) { m_seqnum = s; } }; class UINICQSubType : public ICQSubType { protected: unsigned int m_source, m_destination; bool m_advanced, m_ack; bool m_urgent, m_tocontactlist; unsigned short m_status; std::string m_away_message; public: UINICQSubType(); UINICQSubType(unsigned int s, unsigned int d); void setDestination(unsigned int uin); void setSource(unsigned int uin); unsigned int getSource() const; unsigned int getDestination() const; unsigned short getStatus() const; void setStatus(unsigned short s); void ParseBody(Buffer& b); void OutputBody(Buffer& b) const; virtual void ParseBodyUIN(Buffer& b) = 0; virtual void ParseBodyUINACK(Buffer& b); virtual void OutputBodyUIN(Buffer& b) const = 0; virtual void OutputBodyUINACK(Buffer& b) const; bool isAdvanced() const; void setAdvanced(bool b); void setACK(bool b); bool isACK() const; void setUrgent(bool b); bool isUrgent() const; void setToContactList(bool b); bool isToContactList() const; void setAwayMessage(const std::string& m); std::string getAwayMessage() const; }; class NormalICQSubType : public UINICQSubType { private: std::string m_message; bool m_multi; unsigned int m_foreground, m_background; unsigned short m_encoding; public: NormalICQSubType(bool multi); NormalICQSubType(const std::string& msg); std::string getMessage() const; bool isMultiParty() const; void setMessage(const std::string& message); void setEncoding(const unsigned short encoding); unsigned short getEncoding() const; void setForeground(unsigned int f); void setBackground(unsigned int f); unsigned int getForeground() const; unsigned int getBackground() const; void ParseBodyUIN(Buffer& b); void OutputBodyUIN(Buffer& b) const; void ParseBodyUINACK(Buffer& b); void OutputBodyUINACK(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; }; class URLICQSubType : public UINICQSubType { private: std::string m_message; std::string m_url; public: URLICQSubType(); URLICQSubType(const std::string& msg, const std::string& url); std::string getMessage() const; void setMessage(const std::string& msg); std::string getURL() const; void setURL(const std::string& url); void ParseBodyUIN(Buffer& b); void OutputBodyUIN(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; }; class AwayMsgSubType : public UINICQSubType { private: unsigned char m_type; std::string m_message; public: AwayMsgSubType(Status s); AwayMsgSubType(unsigned char m_type); void ParseBodyUIN(Buffer& b); void OutputBodyUIN(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; unsigned char getFlags() const; }; class SMSICQSubType : public ICQSubType { public: enum Type { SMS, SMS_Receipt }; private: // SMS fields std::string m_source, m_sender, m_senders_network, m_time; // SMS Receipt fields std::string m_message_id, m_destination, m_submission_time, m_delivery_time; bool m_delivered; std::string m_message; Type m_type; public: SMSICQSubType(); std::string getMessage() const; Type getSMSType() const; void ParseBody(Buffer& b); void OutputBody(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; // -- SMS fields -- std::string getSource() const { return m_source; } std::string getSender() const { return m_sender; } std::string getSenders_network() const { return m_senders_network; } std::string getTime() const { return m_time; } // -- SMS Receipt fields -- std::string getMessageId() const { return m_message_id; } std::string getDestination() const { return m_destination; } std::string getSubmissionTime() const { return m_submission_time; } std::string getDeliveryTime() const { return m_delivery_time; } bool delivered() const { return m_delivered; } }; class AuthReqICQSubType : public UINICQSubType { private: std::string m_alias, m_firstname, m_lastname, m_email, m_message; bool m_auth; public: AuthReqICQSubType(); AuthReqICQSubType(const std::string& alias, const std::string& firstname, const std::string& lastname, const std::string& email, bool auth, const std::string& msg); std::string getMessage() const; void ParseBodyUIN(Buffer& b); void OutputBodyUIN(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; }; class AuthAccICQSubType : public UINICQSubType { public: AuthAccICQSubType(); void ParseBodyUIN(Buffer& b); void OutputBodyUIN(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; }; class AuthRejICQSubType : public UINICQSubType { private: std::string m_message; public: AuthRejICQSubType(); AuthRejICQSubType(const std::string& msg); std::string getMessage() const; void setMessage(const std::string& msg); void ParseBodyUIN(Buffer& b); void OutputBodyUIN(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; }; class EmailExICQSubType : public ICQSubType { private: std::string m_message, m_email, m_sender; public: EmailExICQSubType(); void ParseBody(Buffer& b); void OutputBody(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; std::string getMessage() const; std::string getEmail() const; std::string getSender() const; }; /* * (why the hell ICQ invented another subtype for this when it's almost identical to * an email express message is anyones guess..) */ class WebPagerICQSubType : public ICQSubType { private: std::string m_message, m_email, m_sender; public: WebPagerICQSubType(); void ParseBody(Buffer& b); void OutputBody(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; std::string getMessage() const; std::string getEmail() const; std::string getSender() const; }; class UserAddICQSubType : public UINICQSubType { private: std::string m_alias, m_firstname, m_lastname, m_email; bool m_auth; public: UserAddICQSubType(); UserAddICQSubType(const std::string& alias, const std::string& firstname, const std::string& lastname, const std::string& email, bool auth); void ParseBodyUIN(Buffer& b); void OutputBodyUIN(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; }; class FTICQSubType : public UINICQSubType { private: std::string m_message, m_description; unsigned int m_size; unsigned short m_port, m_revport; public: FTICQSubType(); FTICQSubType(const std::string& msg, const std::string& desc, const int size); void ParseBodyUIN(Buffer& b); void ParseBodyUINACK(Buffer& b); void OutputBodyUIN(Buffer& b) const; void OutputBodyUINACK(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; unsigned int getSize() const; unsigned short getPort() const; unsigned short getRevPort() const; std::string getMessage() const; std::string getDescription() const; void setMessage(const std::string& msg); void setDescription(const std::string& msg); void setPort(unsigned short port); void setRevPort(unsigned short port); void setSize(unsigned int size); }; class ContactICQSubType : public UINICQSubType { private: std::list m_content; public: ContactICQSubType(); ContactICQSubType(const std::list &content); void ParseBodyUIN(Buffer& b); void OutputBodyUIN(Buffer& b) const; unsigned short Length() const; unsigned char getType() const; std::list getContacts() const; }; // helper functions void string_split(const std::string& in, const std::string& sep, int count, std::list& fields); } #endif centerim-4.22.10/libicq2000/src/UserInfoBlock.cpp0000644000175000001440000001045011461606612016153 00000000000000/* * UserInfoBlock * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "UserInfoBlock.h" #include "Contact.h" #include "TLV.h" using std::string; namespace ICQ2000 { UserInfoBlock::UserInfoBlock() : m_contains_capabilities(false) { } string UserInfoBlock::getScreenName() const { return m_screenname; } unsigned int UserInfoBlock::getUIN() const { return Contact::StringtoUIN(m_screenname); } unsigned int UserInfoBlock::getTimeOnline() const { return m_timeOnline; } unsigned int UserInfoBlock::getSignupDate() const { return m_signupDate; } unsigned int UserInfoBlock::getSignonDate() const { return m_signonDate; } unsigned int UserInfoBlock::getLanIP() const { return m_lan_ip; } unsigned int UserInfoBlock::getExtIP() const { return m_ext_ip; } unsigned short UserInfoBlock::getLanPort() const { return m_lan_port; } unsigned short UserInfoBlock::getExtPort() const { return m_ext_port; } unsigned short UserInfoBlock::getFirewall() const { return m_firewall; } unsigned int UserInfoBlock::getDCCookie() const { return m_dc_cookie; } unsigned char UserInfoBlock::getTCPVersion() const { return m_tcp_version; } unsigned short UserInfoBlock::getStatus() const { return m_status; } bool UserInfoBlock::getBirthday() const { return m_birthday; } bool UserInfoBlock::contains_capabilities() const { return m_contains_capabilities; } Capabilities UserInfoBlock::get_capabilities() const { return m_capabilities; } void UserInfoBlock::Parse(Buffer& b) { TLVList tlvlist; unsigned short no_tlvs; // (byte)length, string screenname b.UnpackByteString(m_screenname); b >> m_warninglevel; b >> no_tlvs; tlvlist.Parse(b, TLV_ParseMode_Channel02, no_tlvs); m_userClass = 0; if (tlvlist.exists(TLV_UserClass)) { UserClassTLV *t = (UserClassTLV*)tlvlist[TLV_UserClass]; m_userClass = t->Value(); } m_status = 0; m_allowDirect = 0; m_webAware = 0; if (tlvlist.exists(TLV_Status)) { StatusTLV *t = (StatusTLV*)tlvlist[TLV_Status]; m_allowDirect = t->getAllowDirect(); m_webAware = t->getWebAware(); m_status = t->getStatus(); m_birthday = t->getBirthday(); } m_timeOnline = 0; if (tlvlist.exists(TLV_TimeOnline)) { TimeOnlineTLV *t = (TimeOnlineTLV*)tlvlist[TLV_TimeOnline]; m_timeOnline = t->Value(); } m_signupDate = 0; if (tlvlist.exists(TLV_SignupDate)) { SignupDateTLV *t = (SignupDateTLV*)tlvlist[TLV_SignupDate]; m_signupDate = t->Value(); } m_signonDate = 0; if (tlvlist.exists(TLV_SignonDate)) { SignonDateTLV *t = (SignonDateTLV*)tlvlist[TLV_SignonDate]; m_signonDate = t->Value(); } m_lan_ip = 0; m_lan_port = 0; m_firewall = 0; m_tcp_version = 0; if (tlvlist.exists(TLV_LANDetails)) { LANDetailsTLV *t = (LANDetailsTLV*)tlvlist[TLV_LANDetails]; m_lan_ip = t->getLanIP(); m_lan_port = t->getLanPort(); m_firewall = t->getFirewall(); m_tcp_version = t->getTCPVersion(); m_dc_cookie = t->getDCCookie(); } m_ext_ip = 0; if (tlvlist.exists(TLV_IPAddress)) { IPAddressTLV *t = (IPAddressTLV*)tlvlist[TLV_IPAddress]; m_ext_ip = t->Value(); } m_ext_port = 0; if (tlvlist.exists(TLV_Port)) { PortTLV *t = (PortTLV*)tlvlist[TLV_Port]; m_ext_port = t->Value(); } if (tlvlist.exists(TLV_Capabilities)) { CapabilitiesTLV *t = (CapabilitiesTLV*)tlvlist[TLV_Capabilities]; m_contains_capabilities = true; m_capabilities = t->get_capabilities(); } } } centerim-4.22.10/libicq2000/src/Client.cpp0000644000175000001440000037340411473007750014700 00000000000000/* * libICQ2000 Client * * Copyright (C) 2001-2003 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "TLV.h" #include "UserInfoBlock.h" #include "Client.h" #include "buffer.h" #include "socket.h" #include "SNAC.h" #include "DirectClient.h" #include "FileTransferClient.h" #include "DCCache.h" #include "FTCache.h" #include "MessageHandler.h" #include "RequestIDCache.h" #include "ICBMCookieCache.h" #include "SMTPClient.h" #include "Translator.h" #include "sstream_fix.h" #include #include #include using std::string; using std::ostringstream; using std::endl; using std::vector; namespace ICQ2000 { static const char* const Status_text[] = { "Online", "Away", "N/A", "Occupied", "DND", "Free for chat", "Offline" }; /** * Constructor for creating the Client object. Use this when * uin/password are unavailable at time of creation, they can * always be set later. */ Client::Client() : m_self( new Contact(0) ), m_translator( new NULLTranslator() ), m_message_handler( new MessageHandler(m_self, &m_contact_tree, m_translator) ), m_serverSocket( new TCPSocket() ), m_listenServer( new TCPServer() ), m_smtp( new SMTPClient( m_self, "localhost", 25 ) ), m_dccache( new DCCache() ), m_ftcache( new FTCache() ), m_reqidcache( new RequestIDCache() ), m_cookiecache( new ICBMCookieCache() ), m_recv( new Buffer() ) { Init(); } /** * Constructor for creating the Client object. Use this when the * uin/password are available at time of creation, to save having * to set them later. * * @param uin the owner's uin * @param password the owner's password */ Client::Client(const unsigned int uin, const string& password) : m_self( new Contact(uin) ), m_password(password), m_translator( new NULLTranslator() ), m_message_handler( new MessageHandler( m_self, &m_contact_tree, m_translator ) ), m_serverSocket( new TCPSocket() ), m_listenServer( new TCPServer() ), m_smtp( new SMTPClient( m_self, "localhost", 25 ) ), m_dccache( new DCCache() ), m_ftcache( new FTCache() ), m_reqidcache( new RequestIDCache() ), m_cookiecache( new ICBMCookieCache() ), m_recv( new Buffer() ) { Init(); } /** * Destructor for the Client object. This will free up all * resources used by Client, including any Contact objects. It also * automatically disconnects if you haven't done so already. */ Client::~Client() { if (m_cookie_data) delete [] m_cookie_data; Disconnect(DisconnectedEvent::REQUESTED); delete m_message_handler; delete m_serverSocket; delete m_listenServer; delete m_smtp; delete m_dccache; delete m_ftcache; delete m_reqidcache; delete m_cookiecache; delete m_recv; delete m_translator; } void Client::Init() { m_authorizerHostname = "login.icq.com"; m_authorizerPort = 5190; m_bosOverridePort = false; m_in_dc = true; m_out_dc = true; m_state = NOT_CONNECTED; m_cookie_data = NULL; m_cookie_length = 0; m_self->setStatus(STATUS_OFFLINE, false); m_status_wanted = STATUS_OFFLINE; m_invisible_wanted = false; m_web_aware = false; m_ext_ip = 0; m_use_portrange = false; m_lower_port = 0; m_upper_port = 0; m_use_typing_notif = true; m_fetch_sbl = false; m_sbl_canedit = false; m_cookiecache->setDefaultTimeout(30); // 30 seconds is hopefully enough for even the slowest connections m_cookiecache->expired.connect( this,&Client::ICBMCookieCache_expired_cb) ; m_dccache->setDefaultTimeout(30); // set timeout on direct connections to 30 seconds // this will be increased once they are established m_dccache->expired.connect( this,&Client::dccache_expired_cb) ; m_ftcache->setDefaultTimeout(30); // set timeout on direct connections to 30 seconds // this will be increased once they are established m_ftcache->expired.connect( this,&Client::ftcache_expired_cb) ; m_reqidcache->expired.connect( this, &Client::reqidcache_expired_cb) ; m_smtp->logger.connect( this, &Client::dc_log_cb) ; m_smtp->messageack.connect( this, &Client::dc_messageack_cb) ; m_smtp->socket.connect( this, &Client::dc_socket_cb) ; /* contact list callbacks */ m_contact_tree.contactlist_signal.connect( this, &Client::contactlist_cb) ; /* contact callbacks */ m_contact_tree.contact_status_change_signal.connect( contact_status_change_signal ); m_contact_tree.contact_userinfo_change_signal.connect( contact_userinfo_change_signal ); /* visible, invisible lists callbacks */ // m_visible_list.contactlist_signal.connect( this, &Client::visiblelist_cb) ; // m_invisible_list.contactlist_signal.connect( this, &Client::invisiblelist_cb) ; /* self contact callbacks */ m_self->status_change_signal.connect( self_contact_status_change_signal ); m_self->userinfo_change_signal.connect( self_contact_userinfo_change_signal ); /* message handler callbacks */ m_message_handler->messaged.connect( messaged ); m_message_handler->messageack.connect( messageack ); m_message_handler->want_auto_resp.connect( want_auto_resp ); m_message_handler->logger.connect( logger ); m_message_handler->filetransfer_incoming_signal.connect( filetransfer_incoming_signal ); m_message_handler->filetransfer_update_signal.connect( filetransfer_update_signal ); } unsigned short Client::NextSeqNum() { m_client_seq_num = ++m_client_seq_num & 0x7fff; return m_client_seq_num; } unsigned int Client::NextRequestID() { m_requestid = ++m_requestid & 0x7fffffff; return m_requestid; } void Client::ConnectAuthorizer(State state) { SignalLog(LogEvent::INFO, "Client connecting"); try { /* * all sorts of SocketExceptions can be thrown * here - for * - sockets not being created * - DNS lookup failures */ { ostringstream ostr; ostr << "Looking up host name of authorizer: " << m_authorizerHostname.c_str(); SignalLog(LogEvent::INFO, ostr.str()); } m_serverSocket->setRemoteHost(m_authorizerHostname.c_str()); m_serverSocket->setRemotePort(m_authorizerPort); m_serverSocket->setBindHost(m_client_bind_host.c_str()); m_serverSocket->setBlocking(false); SignalLog(LogEvent::INFO, "Establishing TCP connection to authorizer"); m_serverSocket->Connect(); } catch(SocketException e) { // signal connection failure ostringstream ostr; ostr << "Failed to connect to Authorizer: " << e.what(); SignalLog(LogEvent::ERROR, ostr.str()); SignalDisconnect(DisconnectedEvent::FAILED_LOWLEVEL); return; } SignalAddSocket( m_serverSocket->getSocketHandle(), SocketEvent::WRITE ); // randomize sequence number srand(time(0)); m_client_seq_num = (unsigned short)(0x7fff*(rand()/(RAND_MAX+1.0))); m_requestid = (unsigned int)(0x7fffffff*(rand()/(RAND_MAX+1.0))); unsigned int n = rand(), s = 0; for (unsigned int i = n; i >>= 3; s += i); m_client_seq_num = (((0 - s) ^ (unsigned char)n) & (7 ^ n)) + 2; m_state = state; } void Client::DisconnectAuthorizer() { SignalRemoveSocket( m_serverSocket->getSocketHandle() ); m_serverSocket->Disconnect(); m_state = NOT_CONNECTED; } void Client::ConnectBOS() { try { m_serverSocket->setRemoteHost(m_bosHostname.c_str()); m_serverSocket->setRemotePort(m_bosPort); m_serverSocket->setBindHost(m_client_bind_host.c_str()); SignalLog(LogEvent::INFO, "Establishing TCP Connection to BOS Server"); m_serverSocket->setBlocking(false); m_serverSocket->Connect(); } catch(SocketException e) { ostringstream ostr; ostr << "Failed to connect to BOS server: " << e.what(); SignalLog(LogEvent::ERROR, ostr.str()); SignalDisconnect(DisconnectedEvent::FAILED_LOWLEVEL); return; } SignalAddSocket( m_serverSocket->getSocketHandle(), SocketEvent::WRITE ); m_state = BOS_AWAITING_CONN_ACK; } void Client::DisconnectBOS() { m_state = NOT_CONNECTED; SignalRemoveSocket( m_serverSocket->getSocketHandle() ); m_serverSocket->Disconnect(); if (m_listenServer->isStarted()) { SignalRemoveSocket( m_listenServer->getSocketHandle() ); m_listenServer->Disconnect(); } DisconnectDirectConns(); } void Client::DisconnectDirectConns() { m_dccache->removeAll(); m_ftcache->removeAll(); } void Client::DisconnectDirectConn(int fd) { if (m_dccache->exists(fd)) { m_dccache->remove(fd); } else if (m_ftcache->exists(fd)) { FileTransferEvent *fev = (*m_ftcache)[fd]->getEvent(); m_ftcache->remove(fd); SignalLog(LogEvent::WARN, "Disconnecting filetransfer"); if ((fev->getState() != FileTransferEvent::COMPLETE) && (fev->getState() != FileTransferEvent::CLOSE) && (fev->getState() != FileTransferEvent::ERROR)) { fev->setState(FileTransferEvent::CANCELLED); } filetransfer_update_signal.emit(fev); } else if (m_smtp->getfd() == fd) { SignalRemoveSocket( m_smtp->getfd() ); } else { SignalLog(LogEvent::WARN, "Trying to disconnect unknown filedescriptor"); } } // ------------------ Signal Dispatchers ----------------- void Client::SignalConnect() { m_state = BOS_LOGGED_IN; m_sbl_edits.clear(); m_sbl_map.clear(); m_sbl_groups.clear(); m_sbl_groupnames.clear(); m_sbl_tags.clear(); m_sbl_canedit = false; ConnectedEvent ev; connected.emit(&ev); } void Client::SignalDisconnect(DisconnectedEvent::Reason r) { m_sbl_canedit = false; DisconnectedEvent ev(r); disconnected.emit(&ev); if (m_self->getStatus() != STATUS_OFFLINE) { m_self->setStatus(STATUS_OFFLINE, false); } // ensure all contacts return to Offline ContactTree::iterator curr = m_contact_tree.begin(); while(curr != m_contact_tree.end()) { ContactTree::Group::iterator gcurr = (*curr).begin(); while (gcurr != (*curr).end()) { Status old_st = (*gcurr)->getStatus(); if ( old_st != STATUS_OFFLINE ) (*gcurr)->setStatus(STATUS_OFFLINE, false); ++gcurr; } ++curr; } } void Client::SignalAddSocket(int fd, SocketEvent::Mode m) { AddSocketHandleEvent ev( fd, m ); socket.emit(&ev); } void Client::SignalRemoveSocket(int fd) { RemoveSocketHandleEvent ev(fd); socket.emit(&ev); } void Client::SignalMessage(MessageSNAC *snac) { ContactRef contact; ICQSubType *st = snac->getICQSubType(); if (st == NULL) return; if (st->getType() == MSG_Type_FT) { ostringstream ostr; ostr << "File transfer through server"; SignalLog(LogEvent::INFO, ostr.str() ); ICBMCookie c = snac->getICBMCookie(); if ( m_cookiecache->exists( c ) ) { MessageEvent *ev = (*m_cookiecache)[c]; ev->setDirect(false); m_message_handler->handleIncomingACK( static_cast(ev), static_cast(st) ); m_cookiecache->remove(c); } else { //FIX ME!!! old ACK could arrive m_cookiecache->insert(snac->getICBMCookie(), m_message_handler->handleIncomingFT(static_cast(st), false)); } } else { bool ack = m_message_handler->handleIncoming( st ); if (ack) SendAdvancedACK(snac); } } void Client::SignalMessageACK(MessageACKSNAC *snac) { UINICQSubType *st = snac->getICQSubType(); if (st == NULL) return; unsigned char type = st->getType(); switch(type) { case MSG_Type_Normal: case MSG_Type_URL: case MSG_Type_FT: case MSG_Type_AutoReq_Away: case MSG_Type_AutoReq_Occ: case MSG_Type_AutoReq_NA: case MSG_Type_AutoReq_DND: case MSG_Type_AutoReq_FFC: { ICBMCookie c = snac->getICBMCookie(); if ( m_cookiecache->exists( c ) ) { MessageEvent *ev = (*m_cookiecache)[c]; ev->setDirect(false); m_message_handler->handleIncomingACK( ev, st ); m_cookiecache->remove(c); } else { SignalLog(LogEvent::WARN, "Received ACK for unknown message"); } } break; default: SignalLog(LogEvent::WARN, "Received ACK for unknown message type"); } } void Client::SignalMessageOfflineUser(MessageOfflineUserSNAC *snac) { /** * Mmm.. it'd be nice to use this as an ack for messages but it's * not consistently sent for all messages through the server * doesn't seem to be sent for normal (non-advanced) messages to * online users. */ ICBMCookie c = snac->getICBMCookie(); if ( m_cookiecache->exists( c ) ) { /* indicate sending through server */ MessageEvent *ev = (*m_cookiecache)[c]; if (ev->getType() == MessageEvent::FileTransfer) SignalLog( LogEvent::INFO, "FileTransfer request received by server ACK"); ev->setFinished(false); ev->setDelivered(false); ev->setDirect(false); messageack.emit(ev); } else { SignalLog(LogEvent::WARN, "Received Offline ACK for unknown message"); } } void Client:: SignalTypingNotification(MessageTypingNotificationSNAC *snac) { /* Typing notification from user */ if (m_contact_tree.exists(snac->getUIN())) { ContactRef c = m_contact_tree[snac->getUIN()]; bool isTyping = (snac->getType() > 1); UserTypingNotificationEvent ev(c, isTyping); contact_typing_signal.emit(&ev); } } void Client::dc_messageack_cb(MessageEvent *ev) { if (ev->getType() == MessageEvent::FileTransfer) { FileTransferEvent *fev = static_cast(ev); fev->setFinished(true); fev->setState(FileTransferEvent::TIMEOUT); filetransfer_update_signal.emit(fev); } else { messageack.emit(ev); if (!ev->isFinished()) { ev->getContact()->setDirect(false); // attempt to deliver via server instead SendViaServer(ev); } } } void Client::ftc_messageack_cb(MessageEvent *ev) { if (ev->getType() == MessageEvent::FileTransfer) { FileTransferEvent *fev = static_cast(ev); filetransfer_update_signal.emit(fev); } } void Client::SignalSrvResponse(SrvResponseSNAC *snac) { if (snac->getType() == SrvResponseSNAC::OfflineMessagesComplete) { /* We are now meant to ACK this to say * the we have got the offline messages * and the server can dispose of storing * them */ SendOfflineMessagesACK(); } else if (snac->getType() == SrvResponseSNAC::OfflineMessage) { // wow.. this is so much simpler now :-) m_message_handler->handleIncoming(snac->getICQSubType(), snac->getTime()); } else if (snac->getType() == SrvResponseSNAC::SMS_Error) { // mmm } else if (snac->getType() == SrvResponseSNAC::SMS_Response) { unsigned int reqid = snac->RequestID(); if ( m_reqidcache->exists( reqid ) ) { RequestIDCacheValue *v = (*m_reqidcache)[ reqid ]; if ( v->getType() == RequestIDCacheValue::SMSMessage ) { SMSEventCacheValue *uv = static_cast(v); SMSMessageEvent *ev = uv->getEvent(); if (snac->deliverable()) { ev->setFinished(true); ev->setDelivered(true); ev->setDirect(false); messageack.emit(ev); m_reqidcache->remove( reqid ); } else if (snac->smtp_deliverable()) { // todo - konst have volunteered :-) // yeah I did.. ;) ev->setSMTPFrom(snac->getSMTPFrom()); ev->setSMTPTo(snac->getSMTPTo()); ev->setSMTPSubject(snac->getSMTPSubject()); m_smtp->SendEvent(ev); } else { if (snac->getErrorParam() != "DUPLEX RESPONSE") { // ignore DUPLEX RESPONSE since I always get that ev->setFinished(true); ev->setDelivered(false); ev->setDirect(false); ev->setDeliveryFailureReason(MessageEvent::Failed); messageack.emit(ev); m_reqidcache->remove( reqid ); } } } else { throw ParseException("Request ID cached value is not for an SMS Message"); } } else { throw ParseException("Received an SMS response for unknown request id"); } } else if (snac->getType() == SrvResponseSNAC::SimpleUserInfo) { if ( m_reqidcache->exists( snac->RequestID() ) ) { RequestIDCacheValue *v = (*m_reqidcache)[ snac->RequestID() ]; if ( v->getType() == RequestIDCacheValue::Search ) { SearchCacheValue *sv = static_cast(v); SearchResultEvent *ev = sv->getEvent(); if (snac->isEmptyContact()) { ev->setLastContactAdded( NULL ); } else { ContactRef c = new Contact( snac->getUIN() ); c->setAlias(snac->getAlias()); c->setFirstName(snac->getFirstName()); c->setLastName(snac->getLastName()); c->setEmail(snac->getEmail()); c->setStatus(snac->getStatus(), false); c->setAuthReq(snac->getAuthReq()); ContactList& cl = ev->getContactList(); ev->setLastContactAdded( cl.add(c) ); if (snac->isLastInSearch()) ev->setNumberMoreResults( snac->getNumberMoreResults() ); } if (snac->isLastInSearch()) ev->setFinished(true); search_result.emit(ev); if (ev->isFinished()) { delete ev; m_reqidcache->remove( snac->RequestID() ); } } else { SignalLog(LogEvent::WARN, "Request ID cached value is not for a Search request"); } } else { if ( m_contact_tree.exists( snac->getUIN() ) ) { // update Contact ContactRef c = m_contact_tree[ snac->getUIN() ]; c->setAlias( snac->getAlias() ); c->setEmail( snac->getEmail() ); c->setFirstName( snac->getFirstName() ); c->setLastName( snac->getLastName() ); c->setAuthReq(snac->getAuthReq()); } } } else if (snac->getType() == SrvResponseSNAC::SearchSimpleUserInfo) { if ( m_reqidcache->exists( snac->RequestID() ) ) { RequestIDCacheValue *v = (*m_reqidcache)[ snac->RequestID() ]; if ( v->getType() == RequestIDCacheValue::Search ) { SearchCacheValue *sv = static_cast(v); SearchResultEvent *ev = sv->getEvent(); if (snac->isEmptyContact()) { ev->setLastContactAdded( NULL ); } else { ContactRef c = new Contact( snac->getUIN() ); c->setAlias(snac->getAlias()); c->setFirstName(snac->getFirstName()); c->setLastName(snac->getLastName()); c->setEmail(snac->getEmail()); c->setStatus(snac->getStatus(), false); c->setAuthReq(snac->getAuthReq()); ContactList& cl = ev->getContactList(); ev->setLastContactAdded( cl.add(c) ); if (snac->isLastInSearch()) ev->setNumberMoreResults( snac->getNumberMoreResults() ); } if (snac->isLastInSearch()) ev->setFinished(true); search_result.emit(ev); if (ev->isFinished()) { delete ev; m_reqidcache->remove( snac->RequestID() ); } } else { SignalLog(LogEvent::WARN, "Request ID cached value is not for a Search request"); } } else { SignalLog(LogEvent::WARN, "Received a Search Result for unknown request id"); } } else if (snac->getType() == SrvResponseSNAC::RMainHomeInfo) { try { ContactRef c = getUserInfoCacheContact( snac->RequestID() ); ICQ2000::Contact::MainHomeInfo& imh = snac->getMainHomeInfo(); ICQ2000::Contact::MainHomeInfo omh; omh.alias = m_translator->server_to_client( imh.alias, ENCODING_CONTACT_LOCALE, c ); omh.firstname = m_translator->server_to_client( imh.firstname, ENCODING_CONTACT_LOCALE, c ); omh.lastname = m_translator->server_to_client( imh.lastname, ENCODING_CONTACT_LOCALE, c ); omh.email = m_translator->server_to_client( imh.email, ENCODING_CONTACT_LOCALE, c ); omh.city = m_translator->server_to_client( imh.city, ENCODING_CONTACT_LOCALE, c ); omh.state = m_translator->server_to_client( imh.state, ENCODING_CONTACT_LOCALE, c ); omh.phone = m_translator->server_to_client( imh.phone, ENCODING_CONTACT_LOCALE, c ); omh.fax = m_translator->server_to_client( imh.fax, ENCODING_CONTACT_LOCALE, c ); omh.street = m_translator->server_to_client( imh.street, ENCODING_CONTACT_LOCALE, c ); omh.zip = m_translator->server_to_client( imh.zip, ENCODING_CONTACT_LOCALE, c ); omh.setMobileNo( imh.getMobileNo() ); omh.country = imh.country; omh.timezone = imh.timezone; c->setMainHomeInfo( omh ); } catch(ParseException e) { SignalLog(LogEvent::WARN, e.what()); } } else if (snac->getType() == SrvResponseSNAC::RHomepageInfo) { try { ContactRef c = getUserInfoCacheContact( snac->RequestID() ); m_translator->server_to_client_inplace( snac->getHomepageInfo().homepage, ENCODING_CONTACT_LOCALE, c ); c->setHomepageInfo( snac->getHomepageInfo() ); } catch(ParseException e) { SignalLog(LogEvent::WARN, e.what()); } } else if (snac->getType() == SrvResponseSNAC::RWorkInfo) { try { ContactRef c = getUserInfoCacheContact( snac->RequestID() ); ICQ2000::Contact::WorkInfo& imh = snac->getWorkInfo(); ICQ2000::Contact::WorkInfo omh; omh.city = m_translator->server_to_client( imh.city, ENCODING_CONTACT_LOCALE, c ); omh.state = m_translator->server_to_client( imh.state, ENCODING_CONTACT_LOCALE, c ); omh.street = m_translator->server_to_client( imh.street, ENCODING_CONTACT_LOCALE, c ); omh.zip = m_translator->server_to_client( imh.zip, ENCODING_CONTACT_LOCALE, c ); omh.company_name = m_translator->server_to_client( imh.company_name, ENCODING_CONTACT_LOCALE, c ); omh.company_dept = m_translator->server_to_client( imh.company_dept, ENCODING_CONTACT_LOCALE, c ); omh.company_position = m_translator->server_to_client( imh.company_position, ENCODING_CONTACT_LOCALE, c ); omh.company_web = m_translator->server_to_client( imh.company_web, ENCODING_CONTACT_LOCALE, c ); c->setWorkInfo( omh ); } catch(ParseException e) { SignalLog(LogEvent::WARN, e.what()); } } else if (snac->getType() == SrvResponseSNAC::RBackgroundInfo) { try { ContactRef c = getUserInfoCacheContact( snac->RequestID() ); for (Contact::BackgroundInfo::SchoolList::iterator iter = snac->getBackgroundInfo().schools.begin(); iter != snac->getBackgroundInfo().schools.end(); ++iter ) m_translator->server_to_client_inplace( iter->second, ENCODING_CONTACT_LOCALE, c ); c->setBackgroundInfo( snac->getBackgroundInfo() ); } catch(ParseException e) { SignalLog(LogEvent::WARN, e.what()); } } else if (snac->getType() == SrvResponseSNAC::RInterestInfo) { try { ContactRef c = getUserInfoCacheContact( snac->RequestID() ); for (Contact::PersonalInterestInfo::InterestList::iterator iter = snac->getPersonalInterestInfo().interests.begin(); iter != snac->getPersonalInterestInfo().interests.end(); ++iter ) m_translator->server_to_client_inplace( iter->second, ENCODING_CONTACT_LOCALE, c ); c->setInterestInfo( snac->getPersonalInterestInfo() ); } catch(ParseException e) { SignalLog(LogEvent::WARN, e.what()); } } else if (snac->getType() == SrvResponseSNAC::REmailInfo) { try { ContactRef c = getUserInfoCacheContact( snac->RequestID() ); for (Contact::EmailInfo::EmailList::iterator iter = snac->getEmailInfo().emails.begin(); iter != snac->getEmailInfo().emails.end(); ++iter ) m_translator->server_to_client_inplace( *iter, ENCODING_CONTACT_LOCALE, c ); c->setEmailInfo( snac->getEmailInfo() ); c->userinfo_change_emit(); } catch(ParseException e) { SignalLog(LogEvent::WARN, e.what()); } } else if (snac->getType() == SrvResponseSNAC::RAboutInfo) { try { ContactRef c = getUserInfoCacheContact( snac->RequestID() ); c->setAboutInfo( m_translator->server_to_client( snac->getAboutInfo(), ENCODING_CONTACT_LOCALE, c ) ); } catch(ParseException e) { SignalLog(LogEvent::WARN, e.what()); } } else if (snac->getType() == SrvResponseSNAC::RandomChatFound) { if ( m_reqidcache->exists( snac->RequestID() ) ) { RequestIDCacheValue *v = (*m_reqidcache)[ snac->RequestID() ]; if ( v->getType() == RequestIDCacheValue::Search ) { SearchCacheValue *sv = static_cast(v); SearchResultEvent *ev = sv->getEvent(); ContactRef c = new Contact( snac->getUIN() ); ContactList& cl = ev->getContactList(); ev->setLastContactAdded( cl.add(c) ); ev->setFinished(true); search_result.emit(ev); delete ev; m_reqidcache->remove( snac->RequestID() ); } else { SignalLog(LogEvent::WARN, "Request ID cached value is not for a Search request"); } } } } void Client::mergeSBL(ContactTree& tree) { SBLReceivedEvent ev(tree); sbl_received.emit(&ev); } ContactRef Client::getUserInfoCacheContact(unsigned int reqid) { if ( m_reqidcache->exists( reqid ) ) { RequestIDCacheValue *v = (*m_reqidcache)[ reqid ]; if ( v->getType() == RequestIDCacheValue::UserInfo ) { UserInfoCacheValue *uv = static_cast(v); return uv->getContact(); } else { throw ParseException("Request ID cached value is not for a User Info request"); } } else { throw ParseException("Received a UserInfo response for unknown request id"); } } void Client::SignalUINResponse(UINResponseSNAC *snac) { unsigned int uin = snac->getUIN(); NewUINEvent e(uin); newuin.emit(&e); } void Client::SignalUINRequestError() { NewUINEvent e(0,false); newuin.emit(&e); } void Client::SignalRateInfoChange(RateInfoChangeSNAC *snac) { RateInfoChangeEvent e(snac->getCode(), snac->getRateClass(), snac->getWindowSize(), snac->getClear(), snac->getAlert(), snac->getLimit(), snac->getDisconnect(), snac->getCurrentAvg(), snac->getMaxAvg()); rate.emit(&e); } void Client::SignalLog(LogEvent::LogType type, const string& msg) { LogEvent ev(type,msg); logger.emit(&ev); } void Client::ICBMCookieCache_expired_cb(MessageEvent *ev) { if (ev->getType() == MessageEvent::FileTransfer) { FileTransferEvent *fev = static_cast(ev); fev->setState(FileTransferEvent::TIMEOUT); filetransfer_update_signal.emit(fev); return; } SignalLog(LogEvent::WARN, "Message timeout without receiving ACK, sending offline"); SendViaServerNormal(ev); /* downgrade Contact's capabilities, so we don't attempt to send it as advanced again */ ev->getContact()->set_capabilities(Capabilities()); } void Client::reqidcache_expired_cb(RequestIDCacheValue* v) { if ( v->getType() == RequestIDCacheValue::Search ) { SearchCacheValue *sv = static_cast(v); SearchResultEvent *ev = sv->getEvent(); ev->setLastContactAdded( NULL ); ev->setExpired(true); ev->setFinished(true); search_result.emit(ev); delete ev; } } void Client::dccache_expired_cb(DirectClient *dc) { SignalLog(LogEvent::WARN, "Direct connection timeout reached"); } void Client::ftcache_expired_cb(FileTransferClient *ftc) { SignalLog(LogEvent::WARN, "FileTransfer connection timeout reached"); } void Client::dc_connected_cb(SocketClient *dc) { m_dccache->setTimeout(dc->getfd(), 600); // once we are properly connected a direct // connection will only timeout after 10 mins } void Client::dc_log_cb(LogEvent *ev) { logger.emit(ev); } void Client::dc_socket_cb(SocketEvent *ev) { socket.emit(ev); } void Client::SignalUserOnline(BuddyOnlineSNAC *snac) { const UserInfoBlock& userinfo = snac->getUserInfo(); if (m_contact_tree.exists(userinfo.getUIN())) { ContactRef c = m_contact_tree[userinfo.getUIN()]; Status old_st = c->getStatus(); // Birthday Flag set? if (userinfo.getBirthday()) c->setBirthday(true); c->set_signon_time( userinfo.getSignonDate() ); c->setExtPort( userinfo.getExtPort() ); c->setDirect(true); // reset flags when a user goes online c->setStatus( Contact::MapICQStatusToStatus(userinfo.getStatus()), Contact::MapICQStatusToInvisible(userinfo.getStatus()) ); if ( userinfo.getExtIP() != 0 ) c->setExtIP( userinfo.getExtIP() ); if ( userinfo.getLanIP() != 0 ) c->setLanIP( userinfo.getLanIP() ); if ( userinfo.getLanPort() != 0 ) c->setLanPort( userinfo.getLanPort() ); if ( userinfo.getTCPVersion() != 0 ) c->setTCPVersion( userinfo.getTCPVersion() ); if ( userinfo.getDCCookie() != 0 ) c->setDCCookie( userinfo.getDCCookie() ); if (userinfo.contains_capabilities()) c->set_capabilities( userinfo.get_capabilities() ); ostringstream ostr; ostr << "Received Buddy Online for " << c->getAlias() << " (" << c->getUIN() << ") " << Status_text[old_st] << "->" << Status_text[ c->getStatus() ] << " from server"; SignalLog(LogEvent::INFO, ostr.str() ); } else { ostringstream ostr; ostr << "Received Status change for user not on contact list: " << userinfo.getUIN(); SignalLog(LogEvent::WARN, ostr.str()); } } void Client::SignalUserOffline(BuddyOfflineSNAC *snac) { const UserInfoBlock& userinfo = snac->getUserInfo(); if (m_contact_tree.exists(userinfo.getUIN())) { ContactRef c = m_contact_tree[userinfo.getUIN()]; c->setStatus(STATUS_OFFLINE, false); ostringstream ostr; ostr << "Received Buddy Offline for " << c->getAlias() << " (" << c->getUIN() << ") from server"; SignalLog(LogEvent::INFO, ostr.str() ); } else { ostringstream ostr; ostr << "Received Status change for user not on contact list: " << userinfo.getUIN(); SignalLog(LogEvent::WARN, ostr.str()); } } // ------------------ Outgoing packets ------------------- Buffer::marker FLAPHeader(Buffer& b, unsigned char channel, unsigned short seq) { b.setBigEndian(); b << (unsigned char) 42; b << channel; b << seq; Buffer::marker mk = b.getAutoSizeShortMarker(); return mk; } void FLAPFooter(Buffer& b, Buffer::marker& mk) { b.setAutoSizeMarker(mk); } void Client::FLAPwrapSNAC(Buffer& b, const OutSNAC& snac) { Buffer::marker mk = FLAPHeader(b, 0x02, NextSeqNum()); b << snac; FLAPFooter(b,mk); } void Client::FLAPwrapSNACandSend(const OutSNAC& snac) { Buffer b; FLAPwrapSNAC(b, snac); Send(b); } void Client::SendAuthReq() { Buffer b; Buffer::marker mk = FLAPHeader(b, 0x01, NextSeqNum()); b << (unsigned int)0x00000001; b << ScreenNameTLV(m_self->getStringUIN()) << PasswordTLV(m_password) << ClientProfileTLV("ICQ Client") << ClientTypeTLV(266) << ClientVersionMajorTLV(6) << ClientVersionMinorTLV(5) << ClientICQNumberTLV(0) << ClientBuildMajorTLV(0x001a) << ClientBuildMinorTLV(0x00007537) << LanguageTLV("en") << CountryCodeTLV("us") << Type94TLV(0); FLAPFooter(b,mk); SignalLog(LogEvent::INFO, "Sending Authorisation Request"); Send(b); } void Client::SendNewUINReq() { Buffer b; Buffer::marker mk; mk = FLAPHeader(b, 0x01, NextSeqNum()); b << (unsigned int)0x00000001; FLAPFooter(b,mk); Send(b); SignalLog(LogEvent::INFO, "Sending New UIN Request"); FLAPwrapSNACandSend( UINRequestSNAC(m_password) ); } void Client::SendCookie() { Buffer b; Buffer::marker mk = FLAPHeader(b,0x01,NextSeqNum()); b << (unsigned int)0x00000001; b << CookieTLV(m_cookie_data, m_cookie_length); FLAPFooter(b,mk); SignalLog(LogEvent::INFO, "Sending Login Cookie"); Send(b); } void Client::SendCapabilities() { SignalLog(LogEvent::INFO, "Sending Capabilities"); FLAPwrapSNACandSend( CapabilitiesSNAC() ); } void Client::SendSetUserInfo() { SignalLog(LogEvent::INFO, "Sending Set User Info"); FLAPwrapSNACandSend( SetUserInfoSNAC() ); } void Client::SendRateInfoRequest() { SignalLog(LogEvent::INFO, "Sending Rate Info Request"); FLAPwrapSNACandSend( RequestRateInfoSNAC() ); } void Client::SendRateInfoAck() { SignalLog(LogEvent::INFO, "Sending Rate Info Ack"); FLAPwrapSNACandSend( RateInfoAckSNAC() ); } void Client::SendPersonalInfoRequest() { SignalLog(LogEvent::INFO, "Sending Personal Info Request"); FLAPwrapSNACandSend( PersonalInfoRequestSNAC() ); } void Client::SendAddICBMParameter() { SignalLog(LogEvent::INFO, "Sending Add ICBM Parameter"); FLAPwrapSNACandSend( MsgAddICBMParameterSNAC(m_use_typing_notif) ); } void Client::SendLogin() { Buffer b; // startup listening server at this point, so we // know the listening port and ip if (m_in_dc) { m_listenServer->setBindHost(m_client_bind_host.c_str()); if (m_use_portrange) { m_listenServer->StartServer(m_lower_port, m_upper_port); } else { m_listenServer->StartServer(); } SignalAddSocket( m_listenServer->getSocketHandle(), SocketEvent::READ ); ostringstream ostr; ostr << "Server listening on " << IPtoString( m_serverSocket->getLocalIP() ) << ":" << m_listenServer->getPort(); SignalLog(LogEvent::INFO, ostr.str()); } else { SignalLog(LogEvent::INFO, "Not starting listening server, incoming Direct connections disabled"); } /* if (!m_contact_tree.empty()) FLAPwrapSNAC(b, AddBuddySNAC(m_contact_tree) );*/ if (m_invisible_wanted) FLAPwrapSNAC(b, AddVisibleSNAC(m_visible_list) ); SetStatusSNAC sss(Contact::MapStatusToICQStatus(m_status_wanted, m_invisible_wanted), m_web_aware); sss.setSendExtra(true); sss.setIP( m_serverSocket->getLocalIP() ); sss.setPort( (m_in_dc ? m_listenServer->getPort() : 0) ); FLAPwrapSNAC( b, sss ); if (!m_invisible_wanted) FLAPwrapSNAC(b, AddInvisibleSNAC(m_invisible_list) ); FLAPwrapSNAC( b, ClientReadySNAC() ); FLAPwrapSNAC( b, SetIdleSNAC() ); FLAPwrapSNAC( b, SrvRequestOfflineSNAC(m_self->getUIN()) ); SignalLog(LogEvent::INFO, "Sending Status, Client Ready and Offline Messages Request"); Send(b); SignalConnect(); m_last_server_ping = time(NULL); } void Client::SendRequestSBL() { Buffer b; FLAPwrapSNAC( b, SBLRequestRightsSNAC() ); FLAPwrapSNAC( b, SBLRequestListSNAC() ); SignalLog(LogEvent::INFO, "Sending Request Server-based list"); Send(b); } void Client::SendSBLReceivedACK() { FLAPwrapSNACandSend( SBLListACKSNAC() ); } void Client::SendOfflineMessagesACK() { SignalLog(LogEvent::INFO, "Sending Offline Messages ACK"); FLAPwrapSNACandSend( SrvAckOfflineSNAC(m_self->getUIN()) ); } void Client::SendAdvancedACK(MessageSNAC *snac) { ICQSubType *st = snac->getICQSubType(); if (st == NULL || dynamic_cast(st) == NULL ) return; UINICQSubType *ust = dynamic_cast(snac->grabICQSubType()); SignalLog(LogEvent::INFO, "Sending Advanced Message ACK"); FLAPwrapSNACandSend( MessageACKSNAC( snac->getICBMCookie(), ust ) ); } void Client::Send(Buffer& b) { try { ostringstream ostr; ostr << "Sending packet to Server" << endl << b; SignalLog(LogEvent::PACKET, ostr.str()); m_serverSocket->Send(b); } catch(SocketException e) { ostringstream ostr; ostr << "Failed to send: " << e.what(); SignalLog(LogEvent::ERROR, ostr.str()); Disconnect(DisconnectedEvent::FAILED_LOWLEVEL); } } // ------------------ Incoming packets ------------------- void Client::RecvFromServer() { try { while (m_serverSocket->connected()) { if (!m_serverSocket->Recv(*m_recv)) break; Parse(); } } catch(SocketException e) { ostringstream ostr; ostr << "Failed on recv: " << e.what(); SignalLog(LogEvent::ERROR, ostr.str()); Disconnect(DisconnectedEvent::FAILED_LOWLEVEL); } } void Client::Parse() { // -- FLAP header -- unsigned char start_byte, channel; unsigned short seq_num, data_len; // process FLAP(s) in packet if (m_recv->empty()) return; while (!m_recv->empty()) { m_recv->setPos(0); *m_recv >> start_byte; if (start_byte != 42) { m_recv->clear(); SignalLog(LogEvent::WARN, "Invalid Start Byte on FLAP"); return; } /* if we don't have at least six bytes we don't have enough * info to determine if we have the whole of the FLAP */ if (m_recv->remains() < 5) return; *m_recv >> channel; *m_recv >> seq_num; // check sequence number - todo *m_recv >> data_len; if (m_recv->remains() < data_len) return; // waiting for more of the FLAP /* Copy into another Buffer which is passed * onto the separate parse code that way * multiple FLAPs in one packet are split up */ Buffer sb; m_recv->chopOffBuffer( sb, data_len+6 ); { ostringstream ostr; ostr << "Received packet from Server" << endl << sb; SignalLog(LogEvent::PACKET, ostr.str()); } sb.advance(6); // -- FLAP body -- ostringstream ostr; switch(channel) { case 1: ParseCh1(sb,seq_num); break; case 2: ParseCh2(sb,seq_num); break; case 3: ParseCh3(sb,seq_num); break; case 4: ParseCh4(sb,seq_num); break; default: ostr << "FLAP on unrecognised channel 0x" << std::hex << (int)channel; SignalLog(LogEvent::WARN, ostr.str()); break; } if (sb.beforeEnd()) { /* we assert that parsing code eats uses all data * in the FLAP - seems useful to know when they aren't * as it probably means they are faulty */ ostringstream ostr; ostr << "Buffer pointer not at end after parsing FLAP was: 0x" << std::hex << sb.pos() << " should be: 0x" << sb.size(); SignalLog(LogEvent::WARN, ostr.str()); } } } void Client::ParseCh1(Buffer& b, unsigned short seq_num) { if (b.remains() == 4 && (m_state == AUTH_AWAITING_CONN_ACK || m_state == UIN_AWAITING_CONN_ACK)) { // Connection Acknowledge - first packet from server on connection unsigned int unknown; b >> unknown; // always 0x0001 if (m_state == AUTH_AWAITING_CONN_ACK) { SendAuthReq(); SignalLog(LogEvent::INFO, "Connection Acknowledge from server"); m_state = AUTH_AWAITING_AUTH_REPLY; } else if (m_state == UIN_AWAITING_CONN_ACK) { SendNewUINReq(); SignalLog(LogEvent::INFO, "Connection Acknowledge from server"); m_state = UIN_AWAITING_UIN_REPLY; } } else if (b.remains() == 4 && m_state == BOS_AWAITING_CONN_ACK) { SignalLog(LogEvent::INFO, "Connection Acknowledge from server"); // Connection Ack, send the cookie unsigned int unknown; b >> unknown; // always 0x0001 SendCookie(); m_state = BOS_AWAITING_LOGIN_REPLY; } else { SignalLog(LogEvent::WARN, "Unknown packet received on channel 0x01"); } } void Client::ParseCh2(Buffer& b, unsigned short seq_num) { InSNAC *snac; try { snac = ParseSNAC(b); } catch(ParseException e) { ostringstream ostr; ostr << "Problem parsing SNAC: " << e.what(); SignalLog(LogEvent::WARN, ostr.str()); return; } switch(snac->Family()) { case SNAC_FAM_BOS: switch(snac->Subtype()) { case SNAC_BOS_Error: SignalLog(LogEvent::ERROR, "Received BOS error message from server"); break; } break; case SNAC_FAM_GEN: switch(snac->Subtype()) { case SNAC_GEN_ServerReady: SignalLog(LogEvent::INFO, "Received Server Ready from server"); { ServerReadySNAC *sn = dynamic_cast(snac); if (!sn) { SignalLog(LogEvent::INFO, "Errors parsing server capabilities"); break; } std::vector caps = sn->getCapabilities(); for( std::vector::iterator i = caps.begin(); i != caps.end(); i++ ) { ostringstream ostr; ostr << "Family: 0x" << std::hex << *i; SignalLog(LogEvent::INFO, ostr.str()); } } SendCapabilities(); break; case SNAC_GEN_RateInfo: SignalLog(LogEvent::INFO, "Received Rate Information from server"); { RateInfoSNAC *sn = dynamic_cast(snac); if(!sn) { SignalLog(LogEvent::INFO, "Errors parsing server rates"); break; } std::map r = sn->getRates(); ostringstream ostr; for( std::map::iterator it = r.begin(); it != r.end(); it++ ) { RateClass rc = it->second; ostr << "Class ID: " << it->first << " Window: 0x" << std::hex << rc.getWindow() << " Clear: 0x" << rc.getClearLevel() << " Alert: 0x" << rc.getAlertLevel() << " Limited: 0x" << rc.getLimitedLevel() << " Disconnected: 0x" << rc.getDisconnectedLevel() << " Current: 0x" << rc.getCurrentLevel() << " Max Level: 0x" << rc.getMaxLevel() << " Last: 0x" << rc.getLastTime() << " Current state: 0x" << rc.getCurrentState() << "\n"; ostr << "Members: "; std::multimap m = rc.getMembers(); for( std::multimap::iterator i = m.begin(); i != m.end(); i++ ) { ostr << "Family 0x" << i->first << ", Subtype 0x" << i->second << "\n"; } } SignalLog(LogEvent::INFO, ostr.str()); } SendRateInfoAck(); SendPersonalInfoRequest(); SendAddICBMParameter(); SendSetUserInfo(); //if (m_fetch_sbl) SendRequestSBL(); SendLogin(); break; case SNAC_GEN_CapAck: SignalLog(LogEvent::INFO, "Received Capabilities Ack from server"); SendRateInfoRequest(); break; case SNAC_GEN_UserInfo: SignalLog(LogEvent::INFO, "Received User Info from server"); HandleUserInfoSNAC(static_cast(snac)); break; case SNAC_GEN_MOTD: SignalLog(LogEvent::INFO, "Received MOTD from server"); break; case SNAC_GEN_RateInfoChange: SignalLog(LogEvent::INFO, "Received Rate Info Change from server"); SignalRateInfoChange(static_cast(snac)); break; case SNAC_GEN_Error: SignalLog(LogEvent::ERROR, "Received General error message from server"); break; } break; case SNAC_FAM_BUD: switch(snac->Subtype()) { case SNAC_BUD_Error: SignalLog(LogEvent::ERROR, "Received Buddy error from server"); break; case SNAC_BUD_Online: SignalUserOnline(static_cast(snac)); break; case SNAC_BUD_Offline: SignalUserOffline(static_cast(snac)); break; } break; case SNAC_FAM_MSG: switch(snac->Subtype()) { case SNAC_MSG_Message: SignalLog(LogEvent::INFO, "Received Message from server"); SignalMessage(static_cast(snac)); break; case SNAC_MSG_MessageACK: SignalLog(LogEvent::INFO, "Received Message ACK from server"); SignalMessageACK(static_cast(snac)); break; case SNAC_MSG_OfflineUser: SignalLog(LogEvent::INFO, "Received Message to Offline User from server"); SignalMessageOfflineUser(static_cast(snac)); break; case SNAC_MSG_TypingNotification: SignalLog(LogEvent::INFO, "Received Typing notification from server"); SignalTypingNotification(static_cast(snac)); break; case SNAC_MSG_Error: SignalLog(LogEvent::ERROR, "Received Message error from server"); break; } break; case SNAC_FAM_SRV: switch(snac->Subtype()) { case SNAC_SRV_Response: SignalLog(LogEvent::INFO, "Received Server Response from server"); SignalSrvResponse(static_cast(snac)); break; case SNAC_SRV_Error: SignalLog(LogEvent::ERROR, "Received Server error from server"); break; } break; case SNAC_FAM_UIN: switch(snac->Subtype()) { case SNAC_UIN_Response: SignalLog(LogEvent::INFO, "Received UIN Response from server"); SignalUINResponse(static_cast(snac)); break; case SNAC_UIN_RequestError: SignalLog(LogEvent::ERROR, "Received UIN Request Error from server"); SignalUINRequestError(); break; } break; case SNAC_FAM_SBL: switch(snac->Subtype()) { case SNAC_SBL_Rights_Reply: SignalLog(LogEvent::INFO, "Server-based contact list rights granted\n"); break; case SNAC_SBL_List_From_Server: { SignalLog(LogEvent::INFO, "Received server-based list from server\n"); SBLListSNAC *sbs = static_cast(snac); fillSBLMap(sbs); if (sbs->getPrivacyID()) m_sbl_privacy_id = sbs->getPrivacyID(); mergeSBL( sbs->getContactTree()); if ((snac->Flags() & 0x01) == 0) // last/only List packet { SendSBLReceivedACK(); m_sbl_canedit = true; processSblEdits(); } break; } case SNAC_SBL_Edit_ACK: { vector r = static_cast(snac)->getResults(); vector::iterator ir; bool reauth = false; bool succ = false; for(ir = r.begin(); ir != r.end(); ++ir) switch( *ir ) { case SBLEditACKSNAC::Success: SignalLog(LogEvent::INFO, "Server-based contact list modification succeeded\n"); succ = true; //updresults.push_back(ServerBasedContactEvent::Success); break; case SBLEditACKSNAC::Failed: SignalLog(LogEvent::INFO, "Server-based contact list modification failed\n"); //updresults.push_back(ServerBasedContactEvent::Failed); break; case SBLEditACKSNAC::AuthRequired: SignalLog(LogEvent::INFO, "Failed, authentification is required to add a user\n"); reauth = true; //updresults.push_back(ServerBasedContactEvent::AuthRequired); break; case SBLEditACKSNAC::AlreadyExists: SignalLog(LogEvent::INFO, "Already exists on the server-based contact list\n"); break; } // ROGER: send next SBL SNAC if available, otherwise end SBL edit if (!sblSNACs.empty()) { OutSNAC *sn = sblSNACs.front(); if (sn->RequestID() == snac->RequestID()) // it's the last sent SNAC { sblSNACs.pop_front(); if (succ) // apply change on local data switch (sn->Subtype()) { case SNAC_SBL_Add_Entry: { SBLAddBuddySNAC *addBuddy = dynamic_cast(sn); if (addBuddy == NULL) { SBLAddGroupSNAC *addGroup = dynamic_cast(sn); if (addGroup == NULL) break; m_sbl_groups[addGroup->get_label()] = Sbl_group(addGroup->get_label(), addGroup->group_id()); m_sbl_groupnames[m_sbl_groups[addGroup->get_label()].group_id] = addGroup->get_label(); } else // SBLAddBuddySNAC { m_sbl_map[addBuddy->getBuddy().uin] = addBuddy->getBuddy(); } } break; case SNAC_SBL_Update_Entry: { SBLUpdateGroupSNAC *updGroup = dynamic_cast(sn); if (updGroup == NULL) { // TODO: buddy update /*SBLUpdateBuddySNAC updBuddy = dynamic_cast(sn); if (updBuddy == NULL) break;*/ } else { if (updGroup->group_id() == 0) // ignore updates of master group break; string old_name = m_sbl_groupnames[updGroup->group_id()]; m_sbl_groupnames[updGroup->group_id()] = updGroup->get_label(); m_sbl_groups.erase(old_name); m_sbl_groups[updGroup->get_label()] = Sbl_group(updGroup->get_label(), updGroup->group_id()); m_sbl_groups[updGroup->get_label()].buddies = updGroup->getBuddies(); } } case SNAC_SBL_Remove_Entry: { SBLRemoveBuddySNAC *remBuddy = dynamic_cast(sn); if (remBuddy == NULL) { SBLRemoveGroupSNAC *remGroup = dynamic_cast(sn); if (remGroup == NULL) break; if (m_sbl_groupnames.find(remGroup->group_id()) == m_sbl_groupnames.end()) { SignalLog(LogEvent::WARN, "Removing unknown group!\n"); break; } m_sbl_groupnames.erase(remGroup->group_id()); /*for (std::set::iterator git = m_sbl_groups[remGroup->get_label()].buddies.begin(); git != m_sbl_groups[remGroup->get_label()].buddies.end(); git++) { m_sbl_map.erase(*git) }*/ std::map::iterator mit, next; mit = m_sbl_map.begin(); while (mit != m_sbl_map.end()) { if (m_sbl_groups[remGroup->get_label()].buddies.find(mit->second.uin) != m_sbl_groups[remGroup->get_label()].buddies.end()) { next = mit; next++; m_sbl_map.erase(mit); mit = next; } else mit++; } m_sbl_groups.erase(remGroup->get_label()); } else { if (m_sbl_map.find(remBuddy->getBuddy().uin) == m_sbl_map.end()) { SignalLog(LogEvent::WARN, "Removing non-existent buddy!\n"); break; } SignalLog(LogEvent::INFO, "Removing buddy from SBL list\n"); m_sbl_groups[m_sbl_map[remBuddy->getBuddy().uin].group_name].buddies.erase(remBuddy->getBuddy().uin); m_sbl_map.erase(remBuddy->getBuddy().uin); } } break; } delete sn; if (sblSNACs.empty()) { FLAPwrapSNACandSend(SBLCommitEditSNAC() ); m_sbl_inedit = false; processSblEdits(); } else { sn = sblSNACs.front(); FLAPwrapSNACandSend(*sn); } } } /* ** haven't yet decided the best way to recode this for groups and contacts ** vector updresults; vector::iterator iur; if(!updresults.empty()) { if( m_reqidcache->exists( snac->RequestID() ) ) { RequestIDCacheValue *v = (*m_reqidcache)[ snac->RequestID() ]; if ( v->getType() == RequestIDCacheValue::ServerBasedContact ) { ServerBasedContactCacheValue *sv = static_cast(v); ServerBasedContactEvent *ev = sv->getEvent(); ContactList &cl = ev->getContactList(); ContactList::iterator ic = cl.begin(); iur = updresults.begin(); while(iur != updresults.end() && ic != cl.end()) { if(*iur == ServerBasedContactEvent::Success || *iur == ServerBasedContactEvent::AuthRequired) { (*ic)->setServerBased(ev->getType() == ServerBasedContactEvent::Upload); ContactRef ct = getContact((*ic)->getUIN()); if(ct.get()) { ct->setServerBased(ev->getType() == ServerBasedContactEvent::Upload); } } ++iur; ++ic; } ev->setUploadResults(updresults); server_based_contact_list.emit(ev); delete ev; m_reqidcache->remove( snac->RequestID() ); } else { SignalLog(LogEvent::WARN, "Request ID cached value is not for a server-based contacts upload request"); } } else { SignalLog(LogEvent::WARN, "SBL Edit acknowledge from server for a non-existent upload"); } */ } break; case SNAC_SBL_Error: SignalLog(LogEvent::ERROR, "Received Server-base List error from server"); break; case SNAC_SBL_Auth_Request: { SBLAuthRequestSNAC *sn = static_cast(snac); MessageSNAC *msg = new MessageSNAC(sn->getUIN(), sn->getMessage()); SignalMessage(msg); delete msg; } break; case SNAC_SBL_Auth_Received: { SBLAuthReceivedSNAC *snr = static_cast(snac); MessageSNAC *msgr = new MessageSNAC(snr->getUIN(), snr->getMessage(), snr->granted()); SignalMessage(msgr); delete msgr; } break; case SNAC_SBL_User_Added_You: { SBLUserAddedYouSNAC *snr = static_cast(snac); MessageSNAC *msgr = new MessageSNAC(snr->getUIN()); SignalMessage(msgr); delete msgr; } break; } // switch(SBL Subtype) break; } // switch(Family) ErrorInSNAC *err = dynamic_cast(snac); if (err) { ostringstream ostr; ostr << "Error received: 0x" << std::hex << err->getCode() << " - " << err->getErrorDescription(); SignalLog(LogEvent::WARN, ostr.str()); } if (dynamic_cast(snac)) { ostringstream ostr; ostr << "Unknown SNAC packet received - Family: 0x" << std::hex << snac->Family() << " Subtype: 0x" << snac->Subtype(); SignalLog(LogEvent::WARN, ostr.str()); } delete snac; } void Client::ParseCh3(Buffer& b, unsigned short seq_num) { SignalLog(LogEvent::INFO, "Received packet on channel 0x03"); } void Client::ParseCh4(Buffer& b, unsigned short seq_num) { if (m_state == AUTH_AWAITING_AUTH_REPLY || m_state == UIN_AWAITING_UIN_REPLY) { // An Authorisation Reply / Error TLVList tlvlist; tlvlist.Parse(b, TLV_ParseMode_Channel04, (short unsigned int)-1); if (tlvlist.exists(TLV_Cookie) && tlvlist.exists(TLV_Redirect)) { RedirectTLV *r = static_cast(tlvlist[TLV_Redirect]); ostringstream ostr; ostr << "Redirected to: " << r->getHost(); if (r->getPort() != 0) ostr << " port: " << std::dec << r->getPort(); SignalLog(LogEvent::INFO, ostr.str()); m_bosHostname = r->getHost(); if (!m_bosOverridePort) { if (r->getPort() != 0) m_bosPort = r->getPort(); else m_bosPort = m_authorizerPort; } // Got our cookie - yum yum :-) CookieTLV *t = static_cast(tlvlist[TLV_Cookie]); m_cookie_length = t->Length(); if (m_cookie_data) delete [] m_cookie_data; m_cookie_data = new unsigned char[m_cookie_length]; memcpy(m_cookie_data, t->Value(), m_cookie_length); SignalLog(LogEvent::INFO, "Authorisation accepted"); DisconnectAuthorizer(); ConnectBOS(); } else { // Problemo DisconnectedEvent::Reason st; if (tlvlist.exists(TLV_ErrorCode)) { ErrorCodeTLV *t = static_cast(tlvlist[TLV_ErrorCode]); ostringstream ostr; ostr << "Error logging in Error Code: " << t->Value(); SignalLog(LogEvent::ERROR, ostr.str()); switch(t->Value()) { case 0x01: st = DisconnectedEvent::FAILED_BADUSERNAME; break; case 0x02: st = DisconnectedEvent::FAILED_TURBOING; break; case 0x03: st = DisconnectedEvent::FAILED_BADPASSWORD; break; case 0x05: st = DisconnectedEvent::FAILED_MISMATCH_PASSWD; break; case 0x18: st = DisconnectedEvent::FAILED_TURBOING; break; default: st = DisconnectedEvent::FAILED_UNKNOWN; } } else if (m_state == AUTH_AWAITING_AUTH_REPLY) { SignalLog(LogEvent::ERROR, "Error logging in, no error code given(?!)"); st = DisconnectedEvent::FAILED_UNKNOWN; } else { st = DisconnectedEvent::REQUESTED; } DisconnectAuthorizer(); SignalDisconnect(st); // signal client (error) } } else { TLVList tlvlist; tlvlist.Parse(b, TLV_ParseMode_Channel04, (short unsigned int)-1); DisconnectedEvent::Reason st; if (tlvlist.exists(TLV_DisconnectReason)) { DisconnectReasonTLV *t = static_cast(tlvlist[TLV_DisconnectReason]); switch(t->Value()) { case 0x0001: st = DisconnectedEvent::FAILED_DUALLOGIN; break; default: st = DisconnectedEvent::FAILED_UNKNOWN; } } else { SignalLog(LogEvent::WARN, "Unknown packet received on channel 4, disconnecting"); st = DisconnectedEvent::FAILED_UNKNOWN; } DisconnectBOS(); SignalDisconnect(st); // signal client (error) } } // ----------------------------------------------------- /** * Perform any regular time dependant tasks. * * Poll must be called regularly (at least every 60 seconds) but I * recommended 5 seconds, so timeouts work with good granularity. * It is not related to the socket callback and socket listening. * The client must call this Poll fairly regularly, to ensure that * timeouts on message sending works correctly, and that the server * is pinged once every 60 seconds. */ void Client::Poll() { time_t now = time(NULL); if (now > m_last_server_ping + 60) { PingServer(); m_last_server_ping = now; } m_reqidcache->clearoutPoll(); m_cookiecache->clearoutPoll(); m_dccache->clearoutPoll(); m_dccache->clearoutMessagesPoll(); m_ftcache->clearoutMessagesPoll(); m_smtp->clearoutMessagesPoll(); } /** * Callback from client to tell library the socket is ready. The * client must call this method when select says that the file * descriptor is available for mode (read, write or exception). * The client will know what socket descriptors to select on, and * with what mode from the SocketEvent's it receives. It is worth * looking at the shell.cpp example in the examples directory and * fully understanding how it works with select. * * @param fd the socket descriptor * @param m the mode that the socket is available on */ void Client::socket_cb(int fd, SocketEvent::Mode m) { if ( fd == m_serverSocket->getSocketHandle() ) { /* * File descriptor is the socket we have open to server */ /* if (m & SocketEvent::WRITE) SignalLog(LogEvent::INFO, "socket_cb for write"); if (m & SocketEvent::READ) SignalLog(LogEvent::INFO, "socket_cb for read"); if (m & SocketEvent::EXCEPTION) SignalLog(LogEvent::INFO, "socket_cb for exception"); if (m_serverSocket->getState() == TCPSocket::NOT_CONNECTED) SignalLog(LogEvent::INFO, "server socket in state NOT_CONNECTED"); if (m_serverSocket->getState() == TCPSocket::NONBLOCKING_CONNECT) SignalLog(LogEvent::INFO, "server socket in state NONBLOCKING_CONNECT"); if (m_serverSocket->getState() == TCPSocket::CONNECTED) SignalLog(LogEvent::INFO, "server socket in state CONNECTED"); */ if (m_serverSocket->getState() == TCPSocket::NONBLOCKING_CONNECT && (m & SocketEvent::WRITE)) { // the non-blocking connect has completed (good/bad) try { m_serverSocket->FinishNonBlockingConnect(); } catch(SocketException e) { // signal connection failure ostringstream ostr; ostr << "Failed on non-blocking connect: " << e.what(); SignalLog(LogEvent::ERROR, ostr.str()); Disconnect(DisconnectedEvent::FAILED_LOWLEVEL); return; } SignalLog(LogEvent::INFO, "Connection established"); SignalRemoveSocket(fd); // no longer select on write SignalAddSocket(fd, SocketEvent::READ); // select on read now } else if (m_serverSocket->getState() == TCPSocket::CONNECTED && (m & SocketEvent::READ)) { RecvFromServer(); } else { SignalLog(LogEvent::ERROR, "Server socket in inconsistent state!"); Disconnect(DisconnectedEvent::FAILED_LOWLEVEL); } } else if ( m_in_dc && fd == m_listenServer->getSocketHandle() ) { /* * File descriptor is the listening socket - someone is connected in */ TCPSocket *sock = m_listenServer->Accept(); DirectClient *dc = new DirectClient(m_self, sock, m_message_handler, &m_contact_tree, m_ext_ip, m_listenServer->getPort() ); (*m_dccache)[ sock->getSocketHandle() ] = dc; dc->logger.connect( this, &Client::dc_log_cb ); dc->messageack.connect( this, &Client::dc_messageack_cb ); dc->connected.connect( this, &Client::dc_connected_cb ); dc->socket.connect( this, &Client::dc_socket_cb ); SignalAddSocket( sock->getSocketHandle(), SocketEvent::READ ); } else if ( m_ftcache->exists_listenfd( fd ) ) { FileTransferClient *ftc = (*m_ftcache)[fd]; if ( (ftc->getSocket()==0) ) { ftc->setSocket(); ftc->logger.connect( this, &Client::dc_log_cb ); ftc->messageack.connect( this, &Client::ftc_messageack_cb ); ftc->socket.connect( this, &Client::dc_socket_cb ); m_ftcache->remove_and_not_delete(fd); (*m_ftcache)[ftc->getfd()] = ftc; SignalAddSocket( ftc->getfd(), SocketEvent::READ ); SignalLog(LogEvent::INFO, "Incoming filetransfer connection"); } else { SignalLog(LogEvent::INFO, "Incoming filetransfer connection on already open connection."); } } else { /* * File descriptor is a direct connection we have open to someone * */ SocketClient *dc; if (m_dccache->exists(fd)) { dc = (*m_dccache)[fd]; } else if(m_smtp->getfd() == fd) { dc = m_smtp; } else if (m_ftcache->exists(fd)) { dc = (*m_ftcache)[fd]; } else { SignalLog(LogEvent::ERROR, "Problem: Unassociated socket"); return; } TCPSocket *sock = dc->getSocket(); if (sock->getState() == TCPSocket::NONBLOCKING_CONNECT && (m & SocketEvent::WRITE)) { // the non-blocking connect has completed (good/bad) try { sock->FinishNonBlockingConnect(); } catch(SocketException e) { // signal connection failure ostringstream ostr; ostr << "Failed on non-blocking connect for direct connection: " << e.what(); SignalLog(LogEvent::ERROR, ostr.str()); DisconnectDirectConn( fd ); return; } SignalRemoveSocket(fd); // no longer select on write SignalAddSocket(fd, SocketEvent::READ); // select on read now try { dc->FinishNonBlockingConnect(); } catch(DisconnectedException e) { // first Send on socket could have failed SignalLog(LogEvent::WARN, e.what()); DisconnectDirectConn( fd ); } if (dynamic_cast(dc) != NULL) { SignalRemoveSocket(fd); // no longer select on read SignalAddSocket(fd, SocketEvent::WRITE); // select on write now } } else if (sock->getState() == TCPSocket::CONNECTED && (m & SocketEvent::READ)) { try { dc->Recv(); } catch(DisconnectedException e) { // tear down connection SignalLog(LogEvent::WARN, e.what()); DisconnectDirectConn( fd ); } } else if (sock->getState() == TCPSocket::CONNECTED && (m & SocketEvent::WRITE)) { // Should maybe make sure only FileTransferClients enter here.. // Rate could be controlled here or in FileTransferClient try { dc->Recv(); dc->SendEvent(NULL); } catch(DisconnectedException e) { // tear down connection SignalLog(LogEvent::WARN, e.what()); DisconnectDirectConn( fd ); } } else { SignalLog(LogEvent::ERROR, "Direct Connection socket in inconsistent state!"); DisconnectDirectConn( fd ); } } } /** * Register a new UIN. */ void Client::RegisterUIN() { if (m_state == NOT_CONNECTED) ConnectAuthorizer(UIN_AWAITING_CONN_ACK); } /** * Boolean to determine if you are connected or not. * * @return connected */ bool Client::isConnected() const { return (m_state == BOS_LOGGED_IN); } void Client::HandleUserInfoSNAC(UserInfoSNAC *snac) { // this should only be personal info const UserInfoBlock &ub = snac->getUserInfo(); if (ub.getUIN() == m_self->getUIN()) { // currently only interested in our external IP // - we might be behind NAT if (ub.getExtIP() != 0) m_ext_ip = ub.getExtIP(); // Check for status change Status newstat = Contact::MapICQStatusToStatus( ub.getStatus() ); bool newinvis = Contact::MapICQStatusToInvisible( ub.getStatus() ); m_self->setStatus(newstat, newinvis); } } /** * Used for sending a message event from the client. The Client * should create the specific MessageEvent by dynamically * allocating it with new. The library will take care of deleting * it when appropriate. The MessageEvent will persist whilst the * message has not be confirmed as delivered or failed yet. Exactly * the same MessageEvent is signalled back in the messageack signal * callback, so a client could use pointer equality comparison to * match messages it has sent up to their acks. */ void Client::SendEvent(MessageEvent *ev) { switch (ev->getType()) { case MessageEvent::Normal: case MessageEvent::URL: case MessageEvent::AwayMessage: case MessageEvent::FileTransfer: case MessageEvent::Contacts: if (!SendDirect(ev)) SendViaServer(ev); break; case MessageEvent::Email: m_smtp->SendEvent(ev); break; case MessageEvent::AuthReq: SendSBLAuthReq(static_cast(ev)); break; case MessageEvent::AuthAck: SendSBLAuthReply(static_cast(ev)); break; default: SendViaServer(ev); break; } } bool Client::SendDirect(MessageEvent *ev) { ContactRef c = ev->getContact(); if (!c->getDirect()) return false; DirectClient *dc = ConnectDirect(c); if (dc == NULL) return false; dc->SendEvent(ev); return true; } DirectClient* Client::ConnectDirect(const ContactRef& c) { DirectClient *dc = m_dccache->getByContact(c); if (dc == NULL) { if (!m_out_dc) return NULL; /* * If their external IP != internal IP then it's * only worth trying if their external IP == my external IP * (when we are behind the same masq box) */ if ( c->getExtIP() != c->getLanIP() && m_ext_ip != c->getExtIP() ) return NULL; if ( c->getLanIP() == 0 ) return NULL; SignalLog(LogEvent::INFO, "Establishing direct connection"); dc = new DirectClient(m_self, c, m_message_handler, m_ext_ip, (m_in_dc ? m_listenServer->getPort() : 0) ); dc->logger.connect( this, &Client::dc_log_cb) ; dc->messageack.connect( this, &Client::dc_messageack_cb) ; dc->connected.connect( this, &Client::dc_connected_cb ) ; dc->socket.connect( this, &Client::dc_socket_cb) ; try { dc->Connect(); } catch(DisconnectedException e) { SignalLog(LogEvent::WARN, e.what()); delete dc; return NULL; } catch(SocketException e) { SignalLog(LogEvent::WARN, e.what()); delete dc; return NULL; } catch(...) { SignalLog(LogEvent::WARN, "Uncaught exception"); return NULL; } (*m_dccache)[ dc->getfd() ] = dc; } return dc; } void Client::SendViaServer(MessageEvent *ev) { ContactRef c = ev->getContact(); if (ev->getType() == MessageEvent::Normal || ev->getType() == MessageEvent::URL || ev->getType() == MessageEvent::Contacts) { /* * Normal messages and URL messages sent via the server * can be sent as advanced for ICQ2000 users online, in which * case they can be ACKed, otherwise there is no way of * knowing if it's received */ if (c->get_accept_adv_msgs()) SendViaServerAdvanced(ev); else { SendViaServerNormal(ev); delete ev; } } else if (ev->getType() == MessageEvent::AwayMessage) { /* * Away message requests sent via the server only * work for ICQ2000 clients online, otherwise there * is no way of getting the away message, so we signal the ack * to the client as non-delivered */ if (c->get_accept_adv_msgs()) SendViaServerAdvanced(ev); else { ev->setFinished(true); ev->setDelivered(false); ev->setDirect(false); ev->setDeliveryFailureReason(MessageEvent::Failed_ClientNotCapable); messageack.emit(ev); delete ev; } } else if (ev->getType() == MessageEvent::AuthReq || ev->getType() == MessageEvent::AuthAck || ev->getType() == MessageEvent::UserAdd) { /* * This seems the sure way of sending authorisation messages and * user added me notices. They can't be sent direct. */ SendViaServerNormal(ev); delete ev; } else if (ev->getType() == MessageEvent::SMS) { /* * SMS Messages are sent via a completely different mechanism. * */ SMSMessageEvent *sv = static_cast(ev); SrvSendSNAC ssnac(sv->getMessage(), c->getNormalisedMobileNo(), m_self->getUIN(), "", sv->getRcpt()); unsigned int reqid = NextRequestID(); m_reqidcache->insert( reqid, new SMSEventCacheValue( sv ) ); ssnac.setRequestID( reqid ); FLAPwrapSNACandSend( ssnac ); } else if (ev->getType() == MessageEvent::FileTransfer) { ostringstream ostr; ostr << "Sending FileTransfer via Server "; SignalLog(LogEvent::INFO, ostr.str() ); SendViaServerAdvanced(ev); } } void Client::SendViaServerAdvanced(MessageEvent *ev) { if (m_state == NOT_CONNECTED) { ev->setFinished(true); ev->setDelivered(false); ev->setDirect(false); ev->setDeliveryFailureReason(MessageEvent::Failed_NotConnected); messageack.emit(ev); delete ev; return; } ContactRef c = ev->getContact(); UINICQSubType *ist = m_message_handler->handleOutgoing(ev); ist->setAdvanced(true); MsgSendSNAC msnac(ist); msnac.setAdvanced(true); msnac.setSeqNum( c->nextSeqNum() ); ICBMCookie ck = m_cookiecache->generateUnique(); msnac.setICBMCookie( ck ); m_cookiecache->insert( ck, ev ); msnac.set_capabilities( c->get_capabilities() ); FLAPwrapSNACandSend( msnac ); delete ist; } void Client::SendViaServerNormal(MessageEvent *ev) { if (m_state == NOT_CONNECTED) { ev->setFinished(true); ev->setDelivered(false); ev->setDirect(false); ev->setDeliveryFailureReason(MessageEvent::Failed_NotConnected); messageack.emit(ev); return; } ContactRef c = ev->getContact(); UINICQSubType *ist = m_message_handler->handleOutgoing(ev); ist->setAdvanced(false); MsgSendSNAC msnac(ist); msnac.setAdvanced(false); FLAPwrapSNACandSend( msnac ); ev->setFinished(true); ev->setDelivered(true); ev->setDirect(false); ICQMessageEvent *cev; if ((cev = dynamic_cast(ev)) != NULL) cev->setOfflineMessage(true); if (ev->getType() == MessageEvent::AuthReq) { ev->getContact()->setAuthAwait(true); } messageack.emit(ev); delete ist; } void Client::PingServer() { Buffer b; Buffer::marker mk = FLAPHeader(b,0x05,NextSeqNum()); FLAPFooter(b,mk); Send(b); } void Client::uploadSelfDetails() { Buffer b; ICQ2000::Contact::MainHomeInfo& imh = m_self->getMainHomeInfo(); ICQ2000::Contact::MainHomeInfo omh; omh.alias = m_translator->client_to_server( imh.alias, ENCODING_CONTACT_LOCALE, m_self ); omh.firstname = m_translator->client_to_server( imh.firstname, ENCODING_CONTACT_LOCALE, m_self ); omh.lastname = m_translator->client_to_server( imh.lastname, ENCODING_CONTACT_LOCALE, m_self ); omh.email = m_translator->client_to_server( imh.email, ENCODING_CONTACT_LOCALE, m_self ); omh.city = m_translator->client_to_server( imh.city, ENCODING_CONTACT_LOCALE, m_self ); omh.state = m_translator->client_to_server( imh.state, ENCODING_CONTACT_LOCALE, m_self ); omh.phone = m_translator->client_to_server( imh.phone, ENCODING_CONTACT_LOCALE, m_self ); omh.fax = m_translator->client_to_server( imh.fax, ENCODING_CONTACT_LOCALE, m_self ); omh.street = m_translator->client_to_server( imh.street, ENCODING_CONTACT_LOCALE, m_self ); omh.zip = m_translator->client_to_server( imh.zip, ENCODING_CONTACT_LOCALE, m_self ); omh.setMobileNo( imh.getMobileNo() ); omh.country = imh.country; omh.timezone = imh.timezone; ICQ2000::Contact::HomepageInfo ohp = m_self->getHomepageInfo(); m_translator->client_to_server_inplace( ohp.homepage, ENCODING_CONTACT_LOCALE, m_self ); ICQ2000::Contact::WorkInfo& iw = m_self->getWorkInfo(); ICQ2000::Contact::WorkInfo ow; ow.city = m_translator->client_to_server( iw.city, ENCODING_CONTACT_LOCALE, m_self ); ow.state = m_translator->client_to_server( iw.state, ENCODING_CONTACT_LOCALE, m_self ); ow.street = m_translator->client_to_server( iw.street, ENCODING_CONTACT_LOCALE, m_self ); ow.zip = m_translator->client_to_server( iw.zip, ENCODING_CONTACT_LOCALE, m_self ); ow.company_name = m_translator->client_to_server( iw.company_name, ENCODING_CONTACT_LOCALE, m_self ); ow.company_dept = m_translator->client_to_server( iw.company_dept, ENCODING_CONTACT_LOCALE, m_self ); ow.company_position = m_translator->client_to_server( iw.company_position, ENCODING_CONTACT_LOCALE, m_self ); ow.company_web = m_translator->client_to_server( iw.company_web, ENCODING_CONTACT_LOCALE, m_self ); FLAPwrapSNAC( b, SrvUpdateMainHomeInfo(m_self->getUIN(), omh) ); FLAPwrapSNAC( b, SrvUpdateWorkInfo(m_self->getUIN(), ow) ); FLAPwrapSNAC( b, SrvUpdateHomepageInfo(m_self->getUIN(), ohp) ); FLAPwrapSNAC( b, SrvUpdateAboutInfo(m_self->getUIN(), m_translator->client_to_server( m_self->getAboutInfo(), ENCODING_CONTACT_LOCALE, m_self ) ) ); Send(b); } void Client::fillSBLMap(SBLListSNAC *sbl) { ContactTree& sbl_tree = sbl->getContactTree(); std::list& unass = sbl->getUnassigned(); std::set& others = sbl->other_ids(); if (!unass.empty()) { std::list::iterator it; for (it = unass.begin(); it != unass.end(); it++) { if (!sbl_tree.exists_group( (*it)->getServerSideGroupID() )) { if (m_sbl_groupnames.find((*it)->getServerSideGroupID()) == m_sbl_groupnames.end()) { SignalLog(LogEvent::WARN, "Server group doesn't exist anywhere!"); continue; } //ContactTree::Group& grp = m_contact_tree.lookup_group( (*it)->getServerSideGroupID() ); SignalLog(LogEvent::WARN, "Importing existing group"); sbl_tree.add_group( m_sbl_groupnames[(*it)->getServerSideGroupID()], (*it)->getServerSideGroupID() ); } SignalLog(LogEvent::WARN, "Setting previous group"); sbl_tree.lookup_group( (*it)->getServerSideGroupID() ).add(*it); } } if (!others.empty()) { std::set::iterator oit; char buff[100]; for (oit = others.begin(); oit != others.end(); oit++) { m_sbl_tags.insert(*oit); snprintf(buff, sizeof(buff), "Importing unknown tag #%d", *oit); SignalLog(LogEvent::INFO, buff); } } ContactTree::iterator curr = sbl_tree.begin(); while (curr != sbl_tree.end()) { // add groups to lists string curr_name = (*curr).get_label(); m_sbl_tags.insert((*curr).get_id()); if (m_sbl_groupnames.find((*curr).get_id()) == m_sbl_groupnames.end()) { char buff[100]; snprintf(buff, sizeof(buff), "New imported SBL group %d (%s)", (*curr).get_id(), curr_name.c_str()); SignalLog(LogEvent::INFO, buff); m_sbl_groupnames[(*curr).get_id()] = curr_name; m_sbl_groups[curr_name] = Sbl_group(curr_name, (*curr).get_id()); } ContactTree::Group::iterator gcurr = (*curr).begin(); while (gcurr != (*curr).end()) { m_sbl_tags.insert((*gcurr)->getServerSideID()); m_sbl_map.insert(std::pair((*gcurr)->getUIN(), Sbl_item((*gcurr), (*gcurr)->getServerSideID(), curr_name))); m_sbl_groups[curr_name].buddies.insert((*gcurr)->getServerSideID()); //fprintf(stderr, "New imported SBL contact %d (%ul)\n", (*gcurr)->getServerSideID(), (*gcurr)->getUIN()); ++gcurr; } ++curr; } } void Client::fetchServerBasedContactList() { m_fetch_sbl = true; if (m_state == BOS_LOGGED_IN) SendRequestSBL(); } void Client::fetchServerBasedContactList(int) { // TODO! } /** * Set your status. This is used to set your status, as well as to * connect and disconnect from the network. When you wish to * connect to the ICQ network, set status to something other than * STATUS_OFFLINE and connecting will be initiated. When you wish * to disconnect set the status to STATUS_OFFLINE and disconnection * will be initiated. * * @param st the status * @param inv whether to be invisible or not */ void Client::setStatus(const Status st, bool inv) { m_status_wanted = st; m_invisible_wanted = inv; if (st == STATUS_OFFLINE) { if (m_state != NOT_CONNECTED) Disconnect(DisconnectedEvent::REQUESTED); return; } if (m_state == BOS_LOGGED_IN) { /* * The correct sequence of events are: * - when going from visible to invisible * - send the Add to Visible list (or better named Set in this case) * - send set Status * - when going from invisible to visible * - send set Status * - send the Add to Invisible list (or better named Set in this case) */ Buffer b; OutSNAC *privacySNAC = NULL; if (!m_self->isInvisible() && inv) { // visible -> invisible FLAPwrapSNAC( b, AddVisibleSNAC(m_visible_list) ); //privacySNAC = new SBLUpdatePrivacySNAC(m_sbl_privacy_id, 3); } FLAPwrapSNAC( b, SetStatusSNAC(Contact::MapStatusToICQStatus(st, inv), m_web_aware) ); if (m_self->isInvisible() && !inv) { // invisible -> visible FLAPwrapSNAC( b, AddInvisibleSNAC(m_invisible_list) ); //privacySNAC = new SBLUpdatePrivacySNAC(m_sbl_privacy_id, 4); } Send(b); if (privacySNAC != NULL) SendSBLSNAC(privacySNAC); } else { // We'll set this as the initial status upon connecting m_status_wanted = st; m_invisible_wanted = inv; // start connecting if not already if (m_state == NOT_CONNECTED) { ConnectingEvent ev; connecting.emit(&ev); ConnectAuthorizer(AUTH_AWAITING_CONN_ACK); } } } /** * Set your status, without effecting invisibility (your last * requested invisible state will be used). * * @param st the status */ void Client::setStatus(const Status st) { setStatus(st, m_invisible_wanted); } /** * Set your invisibility, without effecting status (your last * requested status will be used). * * @param inv invisibility */ void Client::setInvisible(bool inv) { setStatus(m_status_wanted, inv); } void Client::setWebAware(bool wa) { if (m_web_aware!=wa) { m_web_aware = wa; if (m_self->getStatus() != STATUS_OFFLINE) setStatus(m_status_wanted, m_invisible_wanted); } } void Client::setRandomChatGroup(unsigned short group) { if(m_random_group != group && m_state != NOT_CONNECTED) { m_random_group = group; unsigned int reqid = NextRequestID(); SrvSetRandomChatGroup ssnac( m_self->getUIN(), group ); SignalLog(LogEvent::INFO, "Setting random chat group"); FLAPwrapSNACandSend( ssnac ); } } /** * Get your current status. * * @return your current status */ Status Client::getStatus() const { return m_self->getStatus(); } /** * Get your invisible status * @return Invisible boolean * */ bool Client::getInvisible() const { return m_self->isInvisible(); } /** * Get the last requested status */ Status Client::getStatusWanted() const { return m_status_wanted; } /** * Get the last invisibility status wanted */ bool Client::getInvisibleWanted() const { return m_invisible_wanted; } bool Client::getWebAware() const { return m_web_aware; } unsigned short Client::get_random_buddy_id() { if (m_sbl_tags.empty()) { m_sbl_tags.insert(0); m_sbl_tags.insert(1); return 1; } unsigned short result = 0; result = (*m_sbl_tags.rbegin() + 1) % 0x7FFF; while (m_sbl_tags.find(result) != m_sbl_tags.end()) result = (result + 1) % 0x7FFF; m_sbl_tags.insert(result); return result; } void Client::contactlist_cb(ContactListEvent *ev) { if (ev->getType() == ContactListEvent::UserAdded) { UserAddedEvent *cev = static_cast(ev); ContactRef c = cev->getContact(); ContactTree::Group &grp = cev->get_group(); if (c->isICQContact() && m_state == BOS_LOGGED_IN) { Sbl_edit edit; edit.operation = USER_ADD; edit.item = Sbl_item(c, 0, grp.get_label()); m_sbl_edits.push_back(edit); // fetch detailed userinfo from server fetchDetailContactInfo(c); } } else if (ev->getType() == ContactListEvent::UserRemoved) { UserRemovedEvent *cev = static_cast(ev); ContactRef c = cev->getContact(); if (c->isICQContact() && m_state == BOS_LOGGED_IN) { Sbl_edit edit; edit.operation = USER_REMOVE; edit.item = Sbl_item(c, 0, ""); m_sbl_edits.push_back(edit); } // remove all direct connections for that contact m_dccache->removeContact(c); } else if (ev->getType() == ContactListEvent::GroupAdded) { GroupAddedEvent *gev = static_cast(ev); const ContactTree::Group &grp = gev->get_group(); if (grp.get_label().size() == 0) { char buff[200]; snprintf(buff, sizeof(buff), "Dropping empty-named group addition\n"); SignalLog(LogEvent::INFO, buff); } else { Sbl_edit edit; edit.operation = GROUP_ADD; edit.item = Sbl_item(0, grp.get_label()); m_sbl_edits.push_back(edit); } } else if (ev->getType() == ContactListEvent::GroupRemoved) { GroupRemovedEvent *gev = static_cast(ev); const ContactTree::Group &grp = gev->get_group(); Sbl_edit edit; edit.operation = GROUP_REMOVE; edit.item = Sbl_item(0, grp.get_label()); m_sbl_edits.push_back(edit); } else if (ev->getType() == ContactListEvent::CompleteUpdate) { } processSblEdits(); // process any pending SBL edits // re-emit on the Client signal contactlist.emit(ev); } void Client::processSblEdits() { if (m_sbl_inedit || m_sbl_edits.empty() || (!m_sbl_canedit)) { //fprintf(stderr, "Already processing or no queued edits\n"); return; } while (!(m_sbl_inedit || m_sbl_edits.empty())) { Sbl_edit edit = m_sbl_edits.front(); m_sbl_edits.pop_front(); switch (edit.operation) { case USER_ADD: { string grp_name = edit.item.group_name; if (grp_name.size() == 0) { // adding to unspecified group if (!m_sbl_groups.empty()) { grp_name = (m_sbl_groups.begin())->first; // select first available char buff[100]; snprintf(buff, sizeof(buff), "Adding to %s as first available group\n", grp_name.c_str()); SignalLog(LogEvent::INFO, buff); } else { SignalLog(LogEvent::WARN, "No group exists!"); break; } } if (m_sbl_groups.find(grp_name) == m_sbl_groups.end()) { SignalLog(LogEvent::WARN, "Group being added to doesn't exist!"); break; } if (m_sbl_map.find(edit.item.uin) == m_sbl_map.end()) { // new contact Sbl_item new_item(edit.item, get_random_buddy_id(), grp_name); char buff[200]; snprintf(buff, sizeof(buff), "Creating new SBL contact %u/%s (%d, %s)\n", new_item.uin, new_item.nickname.c_str(), new_item.tag_id, new_item.group_name.c_str()); SignalLog(LogEvent::INFO, buff); SendSBLSNAC( new SBLAddBuddySNAC(new_item, m_sbl_groups[grp_name].group_id) ); snprintf(buff, sizeof(buff), "Adding new contact %d to SBL group %d/%s\n", new_item.tag_id, m_sbl_groups[grp_name].group_id, grp_name.c_str()); SignalLog(LogEvent::INFO, buff); m_sbl_groups[grp_name].buddies.insert(new_item.tag_id); // temporarily add to new group to generate packet SendSBLSNAC( new SBLUpdateGroupSNAC(grp_name, m_sbl_groups[grp_name].group_id, m_sbl_groups[grp_name].buddies) ); m_sbl_groups[grp_name].buddies.erase(new_item.tag_id); // remove again, until it's really added } else { // moving existing contact char buff[200]; if (grp_name == m_sbl_map[edit.item.uin].group_name) // same group, do nothing { snprintf(buff, sizeof(buff), "Dropped addition of existing SBL contact %u/%d/%s\n", edit.item.uin, m_sbl_map.find(edit.item.uin)->second.tag_id, edit.item.nickname.c_str()); SignalLog(LogEvent::INFO, buff); break; } string old_group = m_sbl_map[edit.item.uin].group_name; snprintf(buff, sizeof(buff), "Moving SBL contact %u/%s from group %s/%d to %s/%d\n", edit.item.uin, edit.item.nickname.c_str(), old_group.c_str(), m_sbl_groups[old_group].group_id, grp_name.c_str(), m_sbl_groups[grp_name].group_id); SignalLog(LogEvent::INFO, buff); m_sbl_groups[old_group].buddies.erase(m_sbl_map[edit.item.uin].tag_id); SendSBLSNAC( new SBLUpdateGroupSNAC(m_sbl_groups[old_group]) ); // upload old group m_sbl_groups[old_group].buddies.insert(m_sbl_map[edit.item.uin].tag_id); m_sbl_groups[grp_name].buddies.insert(m_sbl_map[edit.item.uin].tag_id); SendSBLSNAC( new SBLUpdateGroupSNAC(m_sbl_groups[grp_name]) ); // upload new group m_sbl_groups[grp_name].buddies.erase(m_sbl_map[edit.item.uin].tag_id); } } break; case USER_REMOVE: { if (m_sbl_map.find(edit.item.uin) == m_sbl_map.end()) { char buff[100]; snprintf(buff, sizeof(buff), "Removing unknown user (%d)!\n", edit.item.uin); SignalLog(LogEvent::WARN, buff); break; } char buff[100]; string grp_name = m_sbl_map[edit.item.uin].group_name; edit.item.tag_id = m_sbl_map[edit.item.uin].tag_id; snprintf(buff, sizeof(buff), "Removing user %d/%d from group %d\n", edit.item.uin, m_sbl_map[edit.item.uin].tag_id, m_sbl_groups[grp_name].group_id); SignalLog(LogEvent::INFO, buff); SendSBLSNAC( new SBLRemoveBuddySNAC(edit.item, m_sbl_groups[grp_name].group_id) ); snprintf(buff, sizeof(buff), "Updating group %d\n", m_sbl_groups[grp_name].group_id); SignalLog(LogEvent::INFO, buff); m_sbl_groups[grp_name].buddies.erase(m_sbl_map[edit.item.uin].tag_id); SendSBLSNAC( new SBLUpdateGroupSNAC(m_sbl_groups[grp_name]) ); m_sbl_groups[grp_name].buddies.insert(m_sbl_map[edit.item.uin].tag_id); } break; case GROUP_ADD: if (m_sbl_groups.find(edit.item.group_name) == m_sbl_groups.end()) { // new group edit.item.tag_id = get_random_buddy_id(); /* m_sbl_groups[edit.group_name] = Sbl_group(edit.group_name, get_random_buddy_id()); m_sbl_groupnames[m_sbl_groups[edit.group_name].group_id] = edit.group_name;*/ char buff[200]; snprintf(buff, sizeof(buff), "Creating new SBL group %d (%s)\n", edit.item.tag_id, edit.item.group_name.c_str()); SignalLog(LogEvent::INFO, buff); SendSBLSNAC( new SBLAddGroupSNAC( edit.item.group_name, edit.item.tag_id ) ); snprintf(buff, sizeof(buff), "Rebuilding master group"); SignalLog(LogEvent::INFO, buff); std::set groups; for (std::map::iterator git = m_sbl_groups.begin(); git != m_sbl_groups.end(); git++) { groups.insert(git->second.group_id); } groups.insert(edit.item.tag_id); SendSBLSNAC( new SBLUpdateGroupSNAC("", 0, groups) ); } break; case GROUP_REMOVE: { string grp_name = edit.item.group_name; if (m_sbl_groups.find(grp_name) == m_sbl_groups.end()) { char buff[100]; snprintf(buff, sizeof(buff), "Removing unknown group %s\n", grp_name.c_str()); SignalLog(LogEvent::WARN, buff); break; } char buff[100]; snprintf(buff, sizeof(buff), "Removing group %s (%d)\n", grp_name.c_str(), m_sbl_groups[grp_name].group_id); SignalLog(LogEvent::INFO, buff); SendSBLSNAC( new SBLRemoveGroupSNAC(grp_name, m_sbl_groups[grp_name].group_id) ); snprintf(buff, sizeof(buff), "Rebuilding master group"); SignalLog(LogEvent::INFO, buff); std::set groups; for (std::map::iterator git = m_sbl_groups.begin(); git != m_sbl_groups.end(); git++) { groups.insert(git->second.group_id); } groups.erase(m_sbl_groups[grp_name].group_id); SendSBLSNAC( new SBLUpdateGroupSNAC("", 0, groups) ); } break; }// switch }// while } void Client::visiblelist_cb(ContactListEvent *ev) { if (ev->getType() == ContactListEvent::UserAdded) { UserAddedEvent *cev = static_cast(ev); ContactRef c = cev->getContact(); if (c->isICQContact() && m_state == BOS_LOGGED_IN && m_self->isInvisible()) { FLAPwrapSNACandSend( AddVisibleSNAC(c) ); } } else { UserRemovedEvent *cev = static_cast(ev); ContactRef c = cev->getContact(); if (c->isICQContact() && m_state == BOS_LOGGED_IN && m_self->isInvisible()) { FLAPwrapSNACandSend( RemoveVisibleSNAC(c) ); } } } void Client::invisiblelist_cb(ContactListEvent *ev) { if (ev->getType() == ContactListEvent::UserAdded) { UserAddedEvent *cev = static_cast(ev); ContactRef c = cev->getContact(); if (c->isICQContact() && m_state == BOS_LOGGED_IN && !m_self->isInvisible()) { FLAPwrapSNACandSend( AddInvisibleSNAC(c) ); } } else { UserRemovedEvent *cev = static_cast(ev); ContactRef c = cev->getContact(); if (c->isICQContact() && m_state == BOS_LOGGED_IN && !m_self->isInvisible()) { FLAPwrapSNACandSend( RemoveInvisibleSNAC(c) ); } } } /** * Add a contact to your visible list. * * @param c the contact passed as a reference counted object (ref_ptr or ContactRef). */ void Client::addVisible(ContactRef c) { if (!m_visible_list.exists(c->getUIN())) { m_visible_list.add(c); } } /** * Remove a contact from your visible list. * * @param uin the uin of the contact to be removed */ void Client::removeVisible(const unsigned int uin) { if (m_visible_list.exists(uin)) { m_visible_list.remove(uin); } } /** * Add a contact to your invisible list. * * @param c the contact passed as a reference counted object (ref_ptr or ContactRef). */ void Client::addInvisible(ContactRef c) { if (!m_invisible_list.exists(c->getUIN())) { m_invisible_list.add(c); } } /** * Remove a contact from your invisible list. * * @param uin the uin of the contact to be removed */ void Client::removeInvisible(const unsigned int uin) { if (m_invisible_list.exists(uin)) { m_invisible_list.remove(uin); } } ContactRef Client::getSelfContact() { return m_self; } /** * Get the Contact object for a given uin. * * @param uin the uin * @return a pointer to the Contact object. NULL if no Contact with * that uin exists on your list. */ ContactRef Client::getContact(const unsigned int uin) { if (m_contact_tree.exists(uin)) { return m_contact_tree[uin]; } else { return NULL; } } /** * Get the ContactTree object used for the main library. * * @return a reference to the ContactTree */ ContactTree& Client::getContactTree() { return m_contact_tree; } /** * Request the simple contact information for a Contact. This * consists of the contact alias, firstname, lastname and * email. When the server has replied with the details the library * will signal a user info changed for this contact. * * @param c contact to fetch info for * @see ContactListEvent */ void Client::fetchSimpleContactInfo(ContactRef c) { Buffer b; if ( !c->isICQContact() ) return; SignalLog(LogEvent::INFO, "Sending request Simple Userinfo Request"); FLAPwrapSNACandSend( SrvRequestSimpleUserInfo( m_self->getUIN(), c->getUIN() ) ); } /** * Request the detailed contact information for a Contact. When the * server has replied with the details the library will signal a * user info changed for this contact. * * @param c contact to fetch info for * @see ContactListEvent */ void Client::fetchDetailContactInfo(ContactRef c) { if ( !c->isICQContact() ) return; SignalLog(LogEvent::INFO, "Sending request Detailed Userinfo Request"); unsigned int reqid = NextRequestID(); m_reqidcache->insert( reqid, new UserInfoCacheValue(c) ); SrvRequestDetailUserInfo ssnac( m_self->getUIN(), c->getUIN() ); ssnac.setRequestID( reqid ); FLAPwrapSNACandSend( ssnac ); } void Client::fetchSelfSimpleContactInfo() { fetchSimpleContactInfo(m_self); } void Client::fetchSelfDetailContactInfo() { fetchDetailContactInfo(m_self); } void Client::SendSBLSNAC(OutSNAC *sn) { if (sn == NULL) return; sn->setRequestID(NextRequestID()); sblSNACs.push_back(sn); if (!m_sbl_inedit) { m_sbl_inedit = true; FLAPwrapSNACandSend(SBLBeginEditSNAC() ); FLAPwrapSNACandSend(*sn); } } void Client::upgradeToSBL() { { SignalLog(LogEvent::INFO, "Upgrading Server-based list"); #if 0 /* Buffer b; FLAPwrapSNAC(b, SBLBeginEditSNAC() );*/ // FLAPwrapSNAC(b, SBLAddEntrySNAC(m_contact_tree) ); ContactTree::const_iterator curr = m_contact_tree.begin(); std::set mod_groups; while (curr != m_contact_tree.end()) { ContactTree::Group::const_iterator gcurr = curr->begin(); /* if (m_group_map.find(curr->get_label()) == m_group_map.end()) { // ROGER: add new group m_group_map.insert(std::pair(curr->get_label(), curr->get_id())); }*/ if (!curr->getServerBased()) SendSBLSNAC(new SBLAddEntrySNAC(curr->get_label(), curr->get_id()) ); // FLAPwrapSNAC(b, SBLAddEntrySNAC(curr->get_label(), curr->get_id()) ); while (gcurr != curr->end()) { if ((*gcurr)->isICQContact()) if (!(*gcurr)->getServerBased()) { if ((*curr).get_id()) { ContactRef cr = *gcurr; cr->setServerSideInfo((*curr).get_id(), cr->getServerSideID()); // cr->setAuthAwait(true); // if (mod_groups.find((*curr).get_id()) == mod_groups.end()) // newly modified group { mod_groups.insert((*curr).get_id()); } } // m_buddy_list.push_back(*gcurr); SendSBLSNAC(new SBLAddEntrySNAC(*gcurr) ); // FLAPwrapSNAC(b, SBLAddEntrySNAC(*gcurr) ); } ++gcurr; } ++curr; } fprintf(stderr, "Updating %d groups\n", mod_groups.size()); std::set::const_iterator git = mod_groups.begin(); while (git != mod_groups.end()) { std::vector entries; ContactTree::Group& gp = m_contact_tree.lookup_group(*git); ContactTree::Group::iterator gcurr = gp.begin(); while (gcurr != gp.end()) { entries.push_back((*gcurr)->getServerSideID()); gcurr++; } // FLAPwrapSNAC(b, SBLUpdateEntrySNAC(gp.get_label(), gp.get_id(), entries) ); SBLUpdateEntrySNAC *upd = new SBLUpdateEntrySNAC(gp.get_label(), gp.get_id(), entries); SendSBLSNAC( upd ); git++; } /* FLAPwrapSNAC(b, SBLCommitEditSNAC() ); Send(b);*/ #endif } } /** * Sends authorisation request to given contact */ void Client::SendSBLAuthReq(AuthReqEvent *ev) { Buffer b; FLAPwrapSNAC(b, SBLRequestAuthSNAC(ev->getContact(), ev->getMessage()) ); Send(b); Sbl_edit edit; edit.operation = USER_ADD; ContactRef cont = ev->getContact(); if (m_sbl_map.find(cont->getUIN()) == m_sbl_map.end()) // contact not added, try again { cont->setAuthAwait(true); ContactTree::Group &g = m_contact_tree.lookup_group_containing_contact(cont); edit.item = Sbl_item(cont, 0, g.get_label()); m_sbl_edits.push_back(edit); //fprintf(stderr, "Pushing req. user add\n"); processSblEdits(); } } void Client::SendSBLAuthReply(AuthAckEvent *ev) { if (ev == NULL) return; Buffer b; FLAPwrapSNAC(b, SBLAuthoriseSNAC(ev->getContact(), ev->getMessage(), ev->isGranted()) ); Send(b); } SearchResultEvent* Client::searchForContacts (const string& nickname, const string& firstname, const string& lastname) { SearchResultEvent *ev = new SearchResultEvent( SearchResultEvent::ShortWhitepage ); unsigned int reqid = NextRequestID(); m_reqidcache->insert( reqid, new SearchCacheValue( ev ) ); SrvRequestShortWP ssnac( m_self->getUIN(), nickname, firstname, lastname ); ssnac.setRequestID( reqid ); SignalLog(LogEvent::INFO, "Sending short whitepage search"); FLAPwrapSNACandSend( ssnac ); return ev; } SearchResultEvent* Client::searchForContacts (const string& nickname, const string& firstname, const string& lastname, const string& email, AgeRange age, Sex sex, unsigned char language, const string& city, const string& state, unsigned short country, const string& company_name, const string& department, const string& position, bool only_online) { SearchResultEvent *ev = new SearchResultEvent( SearchResultEvent::FullWhitepage ); unsigned int reqid = NextRequestID(); m_reqidcache->insert( reqid, new SearchCacheValue( ev ) ); unsigned short min_age, max_age; switch(age) { case RANGE_18_22: min_age = 18; max_age = 22; break; case RANGE_23_29: min_age = 23; max_age = 29; break; case RANGE_30_39: min_age = 30; max_age = 39; break; case RANGE_40_49: min_age = 40; max_age = 49; break; case RANGE_50_59: min_age = 50; max_age = 59; break; case RANGE_60_ABOVE: min_age = 60; max_age = 0x2710; break; default: min_age = max_age = 0; break; } SrvRequestFullWP ssnac( m_self->getUIN(), nickname, firstname, lastname, email, min_age, max_age, (unsigned char)sex, language, city, state, country, company_name, department, position, only_online); ssnac.setRequestID( reqid ); SignalLog(LogEvent::INFO, "Sending full whitepage search"); FLAPwrapSNACandSend( ssnac ); return ev; } SearchResultEvent* Client::searchForContacts(unsigned int uin) { SearchResultEvent *ev = new SearchResultEvent( SearchResultEvent::UIN ); unsigned int reqid = NextRequestID(); m_reqidcache->insert( reqid, new SearchCacheValue( ev ) ); SrvRequestSimpleUserInfo ssnac( m_self->getUIN(), uin ); ssnac.setRequestID( reqid ); SignalLog(LogEvent::INFO, "Sending simple user info request"); FLAPwrapSNACandSend( ssnac ); return ev; } SearchResultEvent* Client::searchForContacts(const string& keyword) { SearchResultEvent *ev = new SearchResultEvent( SearchResultEvent::Keyword ); unsigned int reqid = NextRequestID(); m_reqidcache->insert( reqid, new SearchCacheValue( ev ) ); SrvRequestKeywordSearch ssnac( m_self->getUIN(), keyword ); ssnac.setRequestID( reqid ); SignalLog(LogEvent::INFO, "Sending contact keyword search request"); FLAPwrapSNACandSend( ssnac ); return ev; } SearchResultEvent* Client::searchForContacts(RandomChatGroup group) { SearchResultEvent *ev = new SearchResultEvent( SearchResultEvent::RandomChat ); unsigned int reqid = NextRequestID(); m_reqidcache->insert( reqid, new SearchCacheValue( ev ) ); SrvRequestRandomChat ssnac( m_self->getUIN(), group ); ssnac.setRequestID( reqid ); SignalLog(LogEvent::INFO, "Sending contact random chat search request"); FLAPwrapSNACandSend( ssnac ); return ev; } void Client::Disconnect(DisconnectedEvent::Reason r) { if (m_state == NOT_CONNECTED) return; SignalLog(LogEvent::INFO, "Client disconnecting"); if (m_state == AUTH_AWAITING_CONN_ACK || m_state == AUTH_AWAITING_AUTH_REPLY || m_state == UIN_AWAITING_CONN_ACK || m_state == UIN_AWAITING_UIN_REPLY) { DisconnectAuthorizer(); } else { DisconnectBOS(); } SignalDisconnect(r); } /** * Call this method when you want to initiate a file transfer to a * remote client. The File Transfer object must have the message, * description and list of files that will be transfered all set up * before passing here. * * @param ev the FileTransferEvent */ void Client::SendFileTransfer(FileTransferEvent *ev) { if (ev->getState() == FileTransferEvent::NOT_CONNECTED) { if (!FileTransferClient::SetupFileTransfer(ev)) { // TODO - enum! ev->setError("I/O error trying to resolve given filename."); ev->setState(FileTransferEvent::ERROR); filetransfer_update_signal.emit(ev); return; } else { ev->setState(FileTransferEvent::WAIT_RESPONS); filetransfer_update_signal.emit(ev); ev->setDirect(ev->getContact()->getDirect()); SendEvent(ev); return; } } FileTransferClient *ftc = new FileTransferClient(m_self, ev->getContact(), m_message_handler, m_ext_ip, ev); ftc->logger.connect( this, &Client::dc_log_cb) ; ftc->socket.connect( this, &Client::dc_socket_cb) ; try { ftc->Connect(); } catch(DisconnectedException e) { SignalLog(LogEvent::WARN, e.what()); ev->setError("ERROR while trying to connect"); ev->setState(FileTransferEvent::ERROR); filetransfer_update_signal.emit(ev); delete ftc; return; } catch(SocketException e) { SignalLog(LogEvent::WARN, e.what()); ev->setError("ERROR while trying to connect"); ev->setState(FileTransferEvent::ERROR); filetransfer_update_signal.emit(ev); delete ftc; return; } catch(...) { SignalLog(LogEvent::WARN, "Uncaught exception"); return; } (*m_ftcache)[ ftc->getfd() ] = ftc; try { ftc->SendEvent(NULL); ev->setState(FileTransferEvent::SEND); filetransfer_update_signal.emit(ev); } catch(DisconnectedException e) { SignalLog(LogEvent::WARN, e.what()); DisconnectDirectConn(ftc->getfd()); } } /** * Call this method after an incoming request has been signalled, * with accept/refuse (and a message) indicated. * * @param ev the FileTransferEvent * @see filetransfer_incoming_signal */ void Client::SendFileTransferACK(FileTransferEvent *ev) { if (ev->isDirect()) { DirectClient *dc = m_dccache->getByContact(ev->getContact()); if (dc == NULL) dc = ConnectDirect(ev->getContact()); if (dc == NULL) { ev->setState(FileTransferEvent::ERROR); ev->setError("Couldn't open an Direct connection to target"); filetransfer_update_signal.emit(ev); return; } if (ev->getState() == FileTransferEvent::ACCEPTED) { FileTransferClient *ftc = new FileTransferClient(m_self, m_message_handler, &m_contact_tree, m_ext_ip, ev); SignalAddSocket(ftc->getlistenfd(), SocketEvent::READ ); ev->setPort(ftc->getlistenPort()); (*m_ftcache)[ftc->getlistenfd()] = ftc; } try { SignalLog(LogEvent::INFO, "Sending FileTransfer ACK direct"); dc->SendFTACK(ev); } catch(DisconnectedException e) { // tear down connection SignalLog(LogEvent::WARN, e.what()); DisconnectDirectConn( dc->getfd() ); } if (ev->getState() == FileTransferEvent::ACCEPTED) ev->setState(FileTransferEvent::RECEIVE); else ev->setState(FileTransferEvent::NOT_CONNECTED); } else { // ughh. MessageSNAC *snac = new MessageSNAC(); ICBMCookie cookie; cookie.generate(); snac->setICBMCookie(cookie); FTICQSubType *fst = new FTICQSubType(ev->getMessage(), ev->getDescription(), ev->getTotalSize()); if (ev->getState() == FileTransferEvent::ACCEPTED) { FileTransferClient *ftc = new FileTransferClient(m_self, m_message_handler, &m_contact_tree, m_ext_ip, ev); SignalAddSocket(ftc->getlistenfd(), SocketEvent::READ ); ev->setPort(ftc->getlistenPort()); fst->setPort(ev->getPort()); fst->setRevPort(ev->getPort()); (*m_ftcache)[ftc->getlistenfd()] = ftc; ev->setState(FileTransferEvent::RECEIVE); } else { ev->setState(FileTransferEvent::NOT_CONNECTED); } snac->setICQSubType(fst); SignalLog(LogEvent::INFO, "Sending FileTransfer ACK through server"); //Don't know if it should be advanced??? SendAdvancedACK(snac); } filetransfer_update_signal.emit(ev); } void Client::CancelFileTransfer(FileTransferEvent *ev) { if (ev != NULL) { switch (ev->getState()) { case FileTransferEvent::NOT_CONNECTED: // Do nothing. case FileTransferEvent::ERROR: // FileTransferClient is case FileTransferEvent::CANCELLED: // already deleted. case FileTransferEvent::COMPLETE: break; case FileTransferEvent::WAIT_RESPONS: if (ev->isDirect()) { // Through Direct Connection DirectClient *dc = m_dccache->getByContact(ev->getContact()); if (dc == NULL) dc = ConnectDirect(ev->getContact()); if (dc == NULL) { ev->setState(FileTransferEvent::ERROR); ev->setError("Couldn't send filetransfer cancel to target direct"); filetransfer_update_signal.emit(ev); return; } try { dc->SendFTCancel(ev); } catch(DisconnectedException e) { // tear down connection SignalLog(LogEvent::WARN, e.what()); DisconnectDirectConn( dc->getfd() ); } SignalLog(LogEvent::INFO, "Sending FT Cancel through direct connection"); } else { // Through Server SignalLog(LogEvent::INFO, "Sending FT Cancel through server not implemented yet."); //Don't know how to do this } break; case FileTransferEvent::CLOSE: case FileTransferEvent::ACCEPTED: case FileTransferEvent::TIMEOUT: { FileTransferClient *ftc = m_ftcache->getByEvent(ev); if (ftc != NULL) DisconnectDirectConn(ftc->getfd()); break; } default: break; // really? } } ev->setState(FileTransferEvent::NOT_CONNECTED); filetransfer_update_signal.emit(ev); } /** * Get your uin. * @return your UIN */ unsigned int Client::getUIN() const { return m_self->getUIN(); } /** * Set your uin. * Use to set what the uin you would like to log in as, before connecting. * @param uin your UIN */ void Client::setUIN(unsigned int uin) { m_self->setUIN(uin); } /** * Set the password to use at login. * @param password your password */ void Client::setPassword(const string& password) { m_password = password; } /** * Get the password you set for login * @return your password */ string Client::getPassword() const { return m_password; } /** * set the hostname of the login server. * You needn't touch this normally, it will default automatically to login.icq.com. * * @param host The host name of the server */ void Client::setLoginServerHost(const string& host) { m_authorizerHostname = host; } /** * get the hostname for the currently set login server. * * @return the hostname */ string Client::getLoginServerHost() const { return m_authorizerHostname; } /** * set the port on the login server to connect to * * @param port the port number */ void Client::setLoginServerPort(const unsigned short& port) { m_authorizerPort = port; } /** * get the currently set port on the login server. * * @return the port number */ unsigned short Client::getLoginServerPort() const { return m_authorizerPort; } /** * set whether to override the port used to connect to the BOS * server. If you would like to ignore the port that the login * server tells you to connect to on the BOS server and instead use * your own, set this to true and call setBOSServerPort with the * port you would like to use. This method is largely unnecessary, * if you set a different login port - for example to get through * firewalls that block 5190, the login server will accept it fine * and in the redirect message doesn't specify a port, so the * library will default to using the same one as it used to connect * to the login server anyway. * * @param b override redirect port */ void Client::setBOSServerOverridePort(const bool& b) { m_bosOverridePort = b; } /** * get whether the BOS redirect port will be overridden. * * @return override redirect port */ bool Client::getBOSServerOverridePort() const { return m_bosOverridePort; } /** * set the port to use to connect to the BOS server. This will only * be used if you also called setBOSServerOverridePort(true). * * @param port the port number */ void Client::setBOSServerPort(const unsigned short& port) { m_bosPort = port; } /** * get the port that will be used on the BOS server. * * @return the port number */ unsigned short Client::getBOSServerPort() const { return m_bosPort; } void Client::setSMTPServerHost(const string& host) { m_smtp->setServerHost(host); } string Client::getSMTPServerHost() const { return m_smtp->getServerHost(); } void Client::setSMTPServerPort(unsigned short port) { m_smtp->setServerPort(port); } unsigned short Client::getSMTPServerPort() const { return m_smtp->getServerPort(); } /** * set whether to accept incoming direct connections * * @d whether to accept incoming direct connections */ void Client::setAcceptInDC(bool d) { m_in_dc = d; if (!m_in_dc && m_listenServer->isStarted()) { SignalRemoveSocket( m_listenServer->getSocketHandle() ); m_listenServer->Disconnect(); } } /** * get whether to accept incoming direct connections * * @return whether to accept incoming direct connections */ bool Client::getAcceptInDC() const { return m_in_dc; } /** * set whether to make outgoing direct connections * * @d whether to make outgoing direct connections */ void Client::setUseOutDC(bool d) { m_out_dc = d; } /** * get whether to make outgoing direct connections * * @return whether to make outgoing direct connections */ bool Client::getUseOutDC() const { return m_out_dc; } /** * set the upper bound of the portrange for incoming connections (esp. behind a firewall) * you have to restart the TCPServer(s) for this to take effect * * @param upper upper bound */ void Client::setPortRangeUpperBound(unsigned short upper) { m_upper_port=upper; } /** * set the lower bound of the portrange for incoming connections (esp. behind a firewall) * you have to restart the TCPServer(s) for this to take effect * * @param lower lower bound */ void Client::setPortRangeLowerBound(unsigned short lower) { m_lower_port=lower; } /** * get upper bound of the portrange used for incoming connections * * @return upper bound */ unsigned short Client::getPortRangeUpperBound() const { return m_upper_port; } /** * get lower bound of the portrange used for incoming connections * * @return lower bound */ unsigned short Client::getPortRangeLowerBound() const { return m_lower_port; } /** * set whether a portrange should be used for incoming connections * * @param b whether to use a portrange */ void Client::setUsePortRange(bool b) { m_use_portrange=b; } /** * get whether a portrange should be used for incoming connections * * @return whether to use a portrange */ bool Client::getUsePortRange() const { return m_use_portrange; } void Client::setClientBindHost(const std::string& host) { m_client_bind_host = host; m_smtp->setClientBindHost(host); } std::string Client::getClientBindHost() const { return m_client_bind_host; } /** * set whether to enable the flag at login which indicates you'd * like to send and receive typing notifications * * @param b whether to enable typing notifications */ void Client::setTypingNotifications(bool b) { m_use_typing_notif = b; } /** * set the translator class to use in character set translations. * Memory management of the object is assumed to be passed onto * libicq2000, which will destroy it on destruction of the Client * object, or on assignment of a different translator. Passing NULL * for translator will disable any character set translation. * * @param t the translator */ void Client::set_translator(Translator * t) { if (m_translator != NULL) { delete m_translator; } if (t == NULL) { m_translator = new NULLTranslator(); } else { m_translator = t; } } } centerim-4.22.10/libicq2000/src/SocketClient.h0000644000175000001440000000444011461606612015504 00000000000000/* * SocketClient * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SOCKETCLIENT_H #define SOCKETCLIENT_H #include #include "libicq2000/sigslot.h" #include "socket.h" #include "events.h" namespace ICQ2000 { class SocketClient : public sigslot::has_slots<> { protected: void SignalAddSocket(int fd, SocketEvent::Mode m); void SignalRemoveSocket(int fd); TCPSocket *m_socket; std::string m_bindhost; public: virtual void Connect() = 0; virtual void FinishNonBlockingConnect() = 0; virtual void Recv() = 0; // ------------------ Signal dispatchers ----------------- void SignalLog(LogEvent::LogType type, const std::string& msg); // ------------------ Signals --------------------------- sigslot::signal1 logger; sigslot::signal1 messageack; sigslot::signal1 socket; sigslot::signal1 connected; int getfd() const; TCPSocket* getSocket() const; void setClientBindHost(const std::string &host); virtual void clearoutMessagesPoll() = 0; virtual void SendEvent(MessageEvent* ev) = 0; }; class SocketClientException : public std::exception { private: std::string m_errortext; public: SocketClientException(); SocketClientException(const std::string& text); ~SocketClientException() throw() { } const char* what() const throw(); }; class DisconnectedException : public SocketClientException { public: DisconnectedException(const std::string& text); }; } #endif centerim-4.22.10/libicq2000/src/buffer.h0000644000175000001440000000727011461606612014372 00000000000000/* * Buffer class header * * Copyright (C) 2001 Barnaby Gray . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef BUFFER_H #define BUFFER_H #include #include #include #include #include namespace ICQ2000 { class Buffer { public: typedef unsigned int size_type; enum endian { BIG, LITTLE }; struct marker { size_type position; endian endianness; int size; }; private: typedef std::vector::iterator iterator; std::vector m_data; endian m_endn; size_type m_out_pos; public: Buffer(); Buffer(const unsigned char *d, unsigned int size); // construct from an array Buffer(Buffer& b, unsigned int start, unsigned int data_len); // construct by copying from another Buffer unsigned int size() const { return m_data.size(); } unsigned int pos() const { return m_out_pos; } unsigned int remains() const { return m_data.size() - m_out_pos; } iterator begin() { return m_data.begin(); } iterator end() { return m_data.end(); } void clear(); bool empty(); void advance(unsigned int ad) { m_out_pos += ad; } bool beforeEnd() const { return (m_out_pos < m_data.size()); } void setPos(unsigned int o) { m_out_pos = o; } void chopOffBuffer(Buffer& b, unsigned int sz); void setEndianness(endian e); void setBigEndian(); void setLittleEndian(); marker getAutoSizeShortMarker(); marker getAutoSizeIntMarker(); void setAutoSizeMarker(const marker& m); Buffer& operator<<(unsigned char); Buffer& operator<<(unsigned short); Buffer& operator<<(unsigned int); Buffer& operator<<(signed char l) { return (*this) << (unsigned char)l; } Buffer& operator<<(signed short l) { return (*this) << (unsigned short)l; } Buffer& operator<<(signed int l) { return (*this) << (unsigned int)l; } Buffer& operator<<(const std::string&); Buffer& operator>>(unsigned char&); Buffer& operator>>(unsigned short&); Buffer& operator>>(unsigned int&); Buffer& operator>>(signed char& l) { return (*this) >> (unsigned char&)l; } Buffer& operator>>(signed short& l) { return (*this) >> (unsigned short&)l; } Buffer& operator>>(signed int& l) { return (*this) >> (unsigned int&)l; } Buffer& operator>>(std::string&); void Pack(const unsigned char *d, unsigned int size); void Pack(const std::string& s); void PackUint16StringNull(const std::string& s); void PackByteString(const std::string& s); void UnpackCRLFString(std::string& s); void Unpack(std::string& s, unsigned int size); void Unpack(unsigned char *const d, unsigned int size); unsigned char UnpackChar(); void UnpackUint32String(std::string& s); void UnpackUint16StringNull(std::string& s); void UnpackByteString(std::string& s); unsigned char& operator[](unsigned int p); void dump(std::ostream& out); }; std::ostream& operator<<(std::ostream&,Buffer&); } #endif centerim-4.22.10/libicq2000/src/TLV.cpp0000644000175000001440000003677211461606612014132 00000000000000/* * TLVs * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "TLV.h" using std::string; using std::map; namespace ICQ2000 { static const unsigned char XORtable[] = { 0xf3, 0x26, 0x81, 0xc4, 0x39, 0x86, 0xdb, 0x92, 0x71, 0xa3, 0xb9, 0xe6, 0x53, 0x7a, 0x95, 0x7c }; // ------------------ Generic TLV --------------- InTLV* InTLV::ParseTLV(Buffer& b, TLV_ParseMode parsemode) { unsigned short type; b >> type; InTLV *tlv = NULL; switch(parsemode) { // ----- CHANNEL 1 ----- case TLV_ParseMode_Channel01: switch(type) { case TLV_Screenname: tlv = new ScreenNameTLV(); break; case TLV_Cookie: tlv = new CookieTLV(); break; } break; // ----- CHANNEL 2 ----- case TLV_ParseMode_Channel02: switch(type) { case TLV_UserClass: tlv = new UserClassTLV(); break; case TLV_SignupDate: tlv = new SignupDateTLV(); break; case TLV_SignonDate: tlv = new SignonDateTLV(); break; case TLV_Status: tlv = new StatusTLV(); break; case TLV_WebAddress: tlv = new WebAddressTLV(); break; case TLV_TimeOnline: tlv = new TimeOnlineTLV(); break; case TLV_LANDetails: tlv = new LANDetailsTLV(); break; case TLV_IPAddress: tlv = new IPAddressTLV(); break; case TLV_Port: tlv = new PortTLV(); break; case TLV_Capabilities: tlv = new CapabilitiesTLV(); break; case TLV_Unknown: tlv = new UnknownTLV(); break; } break; // ----- CHANNEL 3 ----- // todo // ----- CHANNEL 4 ----- case TLV_ParseMode_Channel04: switch(type) { case TLV_Screenname: tlv = new ScreenNameTLV(); break; case TLV_Redirect: tlv = new RedirectTLV(); break; case TLV_Cookie: tlv = new CookieTLV(); break; case TLV_ErrorURL: tlv = new ErrorURLTLV(); break; case TLV_ErrorCode: tlv = new ErrorCodeTLV(); break; case TLV_DisconnectReason: tlv = new DisconnectReasonTLV(); break; case TLV_DisconnectMessage: tlv = new DisconnectMessageTLV(); break; } break; // ----- MESSAGEBLOCK ----- case TLV_ParseMode_MessageBlock: switch(type) { case TLV_MessageData: tlv = new MessageDataTLV(); break; case TLV_ICQData: tlv = new ICQDataTLV(); break; } break; // ----- ADVMSGBLOCK ------- case TLV_ParseMode_AdvMsgBlock: switch(type) { case TLV_AdvMsgData: tlv = new AdvMsgDataTLV(); break; } break; // ----- INMESSAGEDATA ----- case TLV_ParseMode_InMessageData: switch(type) { case TLV_MessageText: tlv = new MessageTextTLV(); break; } break; case TLV_ParseMode_InAdvMsgData: switch(type) { case TLV_AdvMsgBody: tlv = new AdvMsgBodyTLV(); break; } break; // ----- SBLDATA ----- case TLV_ParseMode_SBL: switch(type) { case TLV_SBL_Await_Auth: tlv = new SBLAwaitAuthTLV(); break; case TLV_SBL_Ids: tlv = new SBLIdsTLV(); break; case TLV_SBL_Visibility: tlv = new SBLVisibilityTLV(); break; case TLV_SBL_ICQTIC: tlv = new SBLICQTICTLV(); break; case TLV_SBL_ImportTime: tlv = new SBLImportTimeTLV(); break; case TLV_SBL_Nick: tlv = new SBLNickTLV(); break; case TLV_SBL_SMS_No: tlv = new SBLSMSNoTLV(); break; } break; default: // do what? break; } if (tlv == NULL) { // unrecognised tlv // parse as a RawTLV tlv = new RawTLV(type); } tlv->ParseValue(b); return tlv; } void OutTLV::Output(Buffer& b) const { OutputHeader(b); OutputValue(b); } void OutTLV::OutputHeader(Buffer& b) const { b << Type(); } // ----------------- Base Classes --------------- CharTLV::CharTLV() { } CharTLV::CharTLV(unsigned char n) : m_value(n) { } void CharTLV::OutputValue(Buffer& b) const { b << Length(); b << m_value; } void CharTLV::ParseValue(Buffer& b) { unsigned short l; b >> l; // should be 1 b >> m_value; } ShortTLV::ShortTLV() { } ShortTLV::ShortTLV(unsigned short n) : m_value(n) { } void ShortTLV::OutputValue(Buffer& b) const { b << Length(); b << m_value; } void ShortTLV::ParseValue(Buffer& b) { unsigned short l; b >> l; // should be 2 b >> m_value; } LongTLV::LongTLV() { } LongTLV::LongTLV(unsigned int n) : m_value(n) { } void LongTLV::OutputValue(Buffer& b) const { b << Length(); b << m_value; } void LongTLV::ParseValue(Buffer& b) { unsigned short l; b >> l; // should be 4 b >> m_value; } StringTLV::StringTLV() { } StringTLV::StringTLV(const string& val) : m_value(val) { } void StringTLV::OutputValue(Buffer& b) const { b << m_value; } void StringTLV::ParseValue(Buffer& b) { b >> m_value; } // ----------------- Actual Classes ------------- // ----------------- ScreenName TLV ------------- ScreenNameTLV::ScreenNameTLV() { } ScreenNameTLV::ScreenNameTLV(const string& val) : StringTLV(val) { } // ----------------- Password TLV --------------- PasswordTLV::PasswordTLV(const string& pw) : m_password(pw) { } void PasswordTLV::OutputValue(Buffer& b) const { b << (unsigned short)m_password.size(); for(unsigned int i = 0; i < m_password.size(); i++) b << (unsigned char)(m_password[i] ^ XORtable[i%16]); } // ----------------- UserInfoCapabilities TLV ----------- UserInfoCapabilitiesTLV::UserInfoCapabilitiesTLV() { m_capabilities.default_icq2002_capabilities(); m_capabilities.set_capability_flag(Capabilities::Typing); } unsigned short UserInfoCapabilitiesTLV::Length() const { return m_capabilities.get_length(); } void UserInfoCapabilitiesTLV::OutputValue(Buffer& b) const { b << Length(); m_capabilities.Output(b); } // ----------------- Capabilities TLV ----------- void CapabilitiesTLV::ParseValue(Buffer& b) { unsigned short l; b >> l; // ICQ2001 sends out 64 bytes or so // ICQ2000 sends out 32 bytes // ICQLite sends out 16, so this is what we'll use for now until someone // figures out what those capabilities mean m_capabilities.Parse(b, l); } Capabilities CapabilitiesTLV::get_capabilities() const { return m_capabilities; } // ----------------- Status TLV ----------------- void StatusTLV::OutputValue(Buffer& b) const { b << Length(); b << m_allowDirect << m_webAware << m_status; } void StatusTLV::ParseValue(Buffer& b) { unsigned short l; b >> l; // should be 4 b >> m_allowDirect >> m_webAware >> m_status; } // ----------------- Redirect TLV --------------- void RedirectTLV::ParseValue(Buffer& b) { string hp; b >> hp; int d = hp.find(':'); if (d != -1) { m_server = hp.substr(0,d); m_port = atoi(hp.substr(d+1).c_str()); } else { m_server = hp; m_port = 0; } } // ----------------- Cookie TLV ----------------- CookieTLV::CookieTLV(const unsigned char *ck, unsigned short len) : m_length(len) { m_value = new unsigned char[m_length]; memcpy(m_value, ck, m_length); } CookieTLV::~CookieTLV() { if (m_value) delete [] m_value; } void CookieTLV::ParseValue(Buffer& b) { b >> m_length; m_value = new unsigned char[m_length]; unsigned char c; for (unsigned short a = 0; a < m_length; a++) { b >> c; m_value[a] = c; } } void CookieTLV::OutputValue(Buffer& b) const { b << m_length; for (unsigned short a = 0; a < m_length; a++) b << m_value[a]; } // ----------------- LAN Details TLV ------------ LANDetailsTLV::LANDetailsTLV() : m_firewall(0x0400), m_tcp_version(7), m_dc_cookie(0) { } LANDetailsTLV::LANDetailsTLV(unsigned int ip, unsigned short port) : m_lan_ip(ip), m_lan_port(port), m_firewall(0x0400), m_tcp_version(7), m_dc_cookie(0) { } void LANDetailsTLV::ParseValue(Buffer& b) { unsigned short length; b >> length; if (length == 0x0025) { // user accepts direct connections b >> m_lan_ip; b.advance(2); b >> m_lan_port; } unsigned short no_timestamps; unsigned int unknown; b >> m_firewall >> m_tcp_version >> m_dc_cookie; b >> unknown; // always 0x00000050 WRONG: seen 0x00000000, then no_timestamps is 0 b.advance(2); // unknown b >> no_timestamps; if (unknown==0x00000000) no_timestamps = 3; if (no_timestamps > 100) no_timestamps = 100; // place a sensible limit while(no_timestamps-- > 0) { b.advance(4); // don't really know the purpose of these timestamps } b.advance(2); // unknown } void LANDetailsTLV::OutputValue(Buffer& b) const { b << (unsigned short)0x0025; b << (unsigned int)m_lan_ip; b << (unsigned int)m_lan_port; b << m_firewall << m_tcp_version << (unsigned int)0x00000000 // dc cookie (server picks it for us (apparently)) << (unsigned int)0x00000050 << (unsigned short)0x0000 << (unsigned short)0x0003 // number of timestamps << (unsigned int)0x3AA773EE // timestamp1 << (unsigned int)0x3AA66380 // timestamp1 << (unsigned int)0x3A877A42 // timestamp1 << (unsigned short)0x0000; } // ----------------- Raw TLV -------------------- RawTLV::RawTLV(unsigned short type) : m_type(type) { } void RawTLV::ParseValue(Buffer& b) { b >> m_length; b.advance(m_length); } MessageDataTLV::MessageDataTLV() { } void MessageDataTLV::ParseValue(Buffer& b) { unsigned short length; b >> length; /* * A list of TLVs inside a TLV, these AOL * guys are craaazy.. */ TLVList tlvlist; tlvlist.Parse(b, TLV_ParseMode_InMessageData, (short unsigned int)-1); if (tlvlist.exists(TLV_MessageText)) mttlv = *(static_cast(tlvlist[TLV_MessageText])); } void MessageTextTLV::ParseValue(Buffer& b) { unsigned short length; b >> length; b >> m_flag1; b >> m_flag2; b.Unpack(m_message, length-4); } AdvMsgDataTLV::AdvMsgDataTLV() : m_icqsubtype(NULL) { } AdvMsgDataTLV::~AdvMsgDataTLV() { if (m_icqsubtype != NULL) delete m_icqsubtype; } ICQSubType *AdvMsgDataTLV::grabICQSubType() { ICQSubType *ret = m_icqsubtype; m_icqsubtype = NULL; return ret; } void AdvMsgDataTLV::ParseValue(Buffer& b) { unsigned short length; b >> length; unsigned short type; b >> type; b.advance(8); // ICBM Cookie again b.advance(16); // a capability TLVList tlvlist; tlvlist.Parse(b, TLV_ParseMode_InAdvMsgData, (short unsigned int)-1); if (!tlvlist.exists(TLV_AdvMsgBody)) throw ParseException("No Advanced Message Body TLV in SNAC 0x0004 0x0007 on channel 2"); AdvMsgBodyTLV *t = static_cast(tlvlist[TLV_AdvMsgBody]); m_icqsubtype = t->grabICQSubType(); } AdvMsgBodyTLV::AdvMsgBodyTLV() : m_icqsubtype(NULL) { } AdvMsgBodyTLV::~AdvMsgBodyTLV() { if (m_icqsubtype != NULL) delete m_icqsubtype; } ICQSubType *AdvMsgBodyTLV::grabICQSubType() { ICQSubType *ret = m_icqsubtype; m_icqsubtype = NULL; return ret; } void AdvMsgBodyTLV::ParseValue(Buffer& b) { unsigned short length, unknown; b >> length; b.advance(27); // unknown b.setLittleEndian(); unsigned short seqnum; b >> seqnum >> unknown >> seqnum; // again /* unknown * = 0x000e for normal messages * = 0x0012 for the weird query ones sent by icq2000 clients through server */ if (unknown != 0x000e && unknown != 0x0012) throw ParseException("Received unknown Server-Message type"); b.advance(12); // unknown - all zeroes m_icqsubtype = ICQSubType::ParseICQSubType(b, true, false); /* this TLV occurs in the MessageSNAC it is in advanced form and is not an ack (otherwise it'd be in MessageACKSNAC) */ if (m_icqsubtype != NULL) m_icqsubtype->setSeqNum(seqnum); if (unknown == 0x0012) { /* this is a botch, we let the weird messages * get parsed as normal messages, then throw it away */ delete m_icqsubtype; m_icqsubtype = NULL; } } // ============================================================================ // SBL TLVs // ============================================================================ void SBLAwaitAuthTLV::ParseValue(Buffer& b) { unsigned short l; b >> l; // should be 0 b.advance(l); } void SBLIdsTLV::ParseValue(Buffer& b) { unsigned short l; b >> l; b.advance(l); // TODO } // ============================================================================ // ICQ TLVs // ============================================================================ ICQDataTLV::ICQDataTLV() : m_icqsubtype(NULL) { } ICQDataTLV::~ICQDataTLV() { if (m_icqsubtype != NULL) delete m_icqsubtype; } ICQSubType* ICQDataTLV::getICQSubType() const { return m_icqsubtype; } ICQSubType* ICQDataTLV::grabICQSubType() { ICQSubType *ret = m_icqsubtype; m_icqsubtype = NULL; return ret; } void ICQDataTLV::ParseValue(Buffer& b) { unsigned short length; b >> length; /* Now this part you can see is where * the ICQ folks take over from the AOL folks * Intel byte ordering from now on.. */ b.setLittleEndian(); /* * UIN * For SMS - Magic UIN 1002 */ unsigned int uin; b >> uin; m_icqsubtype = ICQSubType::ParseICQSubType(b, false, false); /* non-advanced, non-ack message */ } // ----------------- TLV List ------------------- TLVList::TLVList() { } TLVList::~TLVList() { // delete all elements from map map::iterator i = tlvmap.begin(); while (i != tlvmap.end()) { InTLV *t = (*i).second; delete t; i++; } tlvmap.clear(); } void TLVList::Parse(Buffer& b, TLV_ParseMode pm, unsigned short no_tlvs) { InTLV *t; unsigned short ntlv = 0; while (b.beforeEnd() && ntlv < no_tlvs) { t = InTLV::ParseTLV(b,pm); // duplicate TLVs of one type - this shouldn't happen! if (tlvmap.count(t->Type())) { delete tlvmap[t->Type()]; } tlvmap[t->Type()] = t; ntlv++; } } void TLVList::ParseByLength(Buffer& b, TLV_ParseMode pm, unsigned int len) { InTLV *t; unsigned int end = b.pos() + len; while (b.pos() < end) { t = InTLV::ParseTLV(b,pm); // duplicate TLVs of one type - this shouldn't happen! if (tlvmap.count(t->Type())) { delete tlvmap[t->Type()]; } tlvmap[t->Type()] = t; } } bool TLVList::exists(unsigned short type) { return (tlvmap.count(type) != 0); } InTLV* & TLVList::operator[](unsigned short type) { return tlvmap[type]; } Buffer& operator<<(Buffer& b, const ICQ2000::OutTLV& tlv) { tlv.Output(b); return b; } } centerim-4.22.10/libicq2000/src/SNAC-BOS.h0000644000175000001440000000755611461606612014275 00000000000000/* * SNAC - Visible/invisible list management * Mitz Pettel, 2001 * * based on: SNAC - Buddy (Contact) list management * Copyright (C) 2001 Barnaby Gray . * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef SNAC_BOS_H #define SNAC_BOS_H #include #include #include "SNAC-base.h" #include "Contact.h" #include "ContactList.h" #include "UserInfoBlock.h" namespace ICQ2000 { // List stuff (Family 0x0009) const unsigned short SNAC_BOS_Error = 0x0001; const unsigned short SNAC_BOS_Add_Visible = 0x0005; const unsigned short SNAC_BOS_Remove_Visible = 0x0006; const unsigned short SNAC_BOS_Add_Invisible = 0x0007; const unsigned short SNAC_BOS_Remove_Invisible = 0x0008; const unsigned short SNAC_BOS_Add_Tmp_Visible = 0x000A; const unsigned short SNAC_BOS_Remove_Tmp_Visible = 0x000B; // ----------------- Visible/invisible List (Family 0x0009) SNACs ----------- class BOSFamilySNAC : virtual public SNAC { public: unsigned short Family() const { return SNAC_FAM_BOS; } }; class BOSListSNAC : virtual public BOSFamilySNAC, public OutSNAC { protected: std::list m_buddy_list; void OutputBody(Buffer& b) const; public: BOSListSNAC(); BOSListSNAC(const ContactList& l); BOSListSNAC(const ContactRef& c); BOSListSNAC(const std::string& s); void addContact(const ContactRef& c); }; class AddVisibleSNAC : public BOSListSNAC { public: unsigned short Subtype() const { return SNAC_BOS_Add_Visible; } AddVisibleSNAC(); AddVisibleSNAC(const ContactList& l); AddVisibleSNAC(const ContactRef& c); AddVisibleSNAC(const std::string& s); }; class AddInvisibleSNAC : public BOSListSNAC { public: unsigned short Subtype() const { return SNAC_BOS_Add_Invisible; } AddInvisibleSNAC(); AddInvisibleSNAC(const ContactList& l); AddInvisibleSNAC(const ContactRef& c); AddInvisibleSNAC(const std::string& s); }; class AddTmpVisibleSNAC : public BOSListSNAC { public: unsigned short Subtype() const { return SNAC_BOS_Add_Tmp_Visible; } AddTmpVisibleSNAC(); AddTmpVisibleSNAC(const ContactList& l); AddTmpVisibleSNAC(const ContactRef& c); AddTmpVisibleSNAC(const std::string& s); }; class RemoveVisibleSNAC : public BOSListSNAC { public: unsigned short Subtype() const { return SNAC_BOS_Remove_Visible; } RemoveVisibleSNAC(); RemoveVisibleSNAC(const ContactList& l); RemoveVisibleSNAC(const ContactRef& c); RemoveVisibleSNAC(const std::string& s); }; class RemoveInvisibleSNAC : public BOSListSNAC { public: unsigned short Subtype() const { return SNAC_BOS_Remove_Invisible; } RemoveInvisibleSNAC(); RemoveInvisibleSNAC(const ContactList& l); RemoveInvisibleSNAC(const ContactRef& c); RemoveInvisibleSNAC(const std::string& s); }; class RemoveTmpVisibleSNAC : public BOSListSNAC { public: unsigned short Subtype() const { return SNAC_BOS_Remove_Tmp_Visible; } RemoveTmpVisibleSNAC(); RemoveTmpVisibleSNAC(const ContactList& l); RemoveTmpVisibleSNAC(const ContactRef& c); RemoveTmpVisibleSNAC(const std::string& s); }; } #endif centerim-4.22.10/libicq2000/src/Makefile.am0000644000175000001440000000171011461606612014775 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/libicq2000/libicq2000 -I$(top_srcdir)/libicq2000 noinst_LIBRARIES = libsrc.a libsrc_a_SOURCES = ContactTree.cpp ContactList.cpp SNAC-MSG.cpp Translator.cpp SNAC-UIN.cpp MessageHandler.cpp SocketClient.cpp UserInfoBlock.cpp TLV.cpp SNAC.cpp version.cpp SNAC-BOS.cpp Xml.cpp SNAC-BUD.cpp exceptions.cpp Client.cpp Contact.cpp socket.cpp ICQ.cpp SNAC-SBL.cpp ICBMCookie.cpp time_extra.cpp DirectClient.cpp SNAC-base.cpp SNAC-LOC.cpp FileTransferClient.cpp buffer.cpp SMTPClient.cpp SNAC-SRV.cpp events.cpp SNAC-GEN.cpp Capabilities.cpp RateLimits.cpp noinst_HEADERS = FileTransferClient.h Capabilities.h ICQ.h TLV.h Xml.h Cache.h SNAC.h DirectClient.h sstream_fix.h ICBMCookieCache.h SeqNumCache.h SocketClient.h SNAC-BOS.h SNAC-BUD.h SNAC-GEN.h SNAC-LOC.h SNAC-MSG.h SNAC-SBL.h SNAC-SRV.h SNAC-UIN.h UserInfoBlock.h DCCache.h RequestIDCache.h buffer.h SMTPClient.h MessageHandler.h SNAC-base.h ICBMCookie.h socket.h FTCache.h RateLimits.h centerim-4.22.10/libicq2000/src/SocketClient.cpp0000644000175000001440000000364211461606612016042 00000000000000/* * SocketClient * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SocketClient.h" #include "sstream_fix.h" using std::string; namespace ICQ2000 { void SocketClient::SignalAddSocket(int fd, SocketEvent::Mode m) { AddSocketHandleEvent ev( fd, m ); socket.emit(&ev); } void SocketClient::SignalRemoveSocket(int fd) { RemoveSocketHandleEvent ev(fd); socket.emit(&ev); } void SocketClient::SignalLog(LogEvent::LogType type, const string& msg) { LogEvent ev(type,msg); logger.emit(&ev); } int SocketClient::getfd() const { return m_socket->getSocketHandle(); } TCPSocket* SocketClient::getSocket() const { return m_socket; } void SocketClient::setClientBindHost(const std::string &host) { m_bindhost = host; } // -- exceptions ------------------------------------------------------------ SocketClientException::SocketClientException() { } SocketClientException::SocketClientException(const string& text) : m_errortext(text) { } const char* SocketClientException::what() const throw() { return m_errortext.c_str(); } DisconnectedException::DisconnectedException(const string& text) : SocketClientException(text) { } } centerim-4.22.10/libicq2000/src/socket.h0000644000175000001440000000617411461606612014413 00000000000000/* * General sockets class wrapper * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SOCKET_H #define SOCKET_H #include #include #include #include #include #include #include #include #include #include #include #include namespace ICQ2000 { unsigned int StringtoIP(const std::string& ip); std::string IPtoString(unsigned int ip); class Buffer; class TCPSocket { public: enum State { NOT_CONNECTED, NONBLOCKING_CONNECT, CONNECTED }; static unsigned long gethostname(const char *hostname); private: static const unsigned int max_receive_size = 4096; int m_socketDescriptor; bool m_socketDescriptor_valid; struct sockaddr_in remoteAddr, localAddr; bool blocking; State m_state; void fcntlSetup(); public: TCPSocket(); ~TCPSocket(); // used after a successful accept on TCPServer TCPSocket( int fd, struct sockaddr_in addr ); void Connect(); void FinishNonBlockingConnect(); void Disconnect(); int getSocketHandle(); void Send(Buffer& b); bool Recv(Buffer& b); bool connected(); void setRemoteHost(const char *host); void setRemotePort(unsigned short port); void setRemoteIP(unsigned int ip); void setBindHost(const char *host); void setBlocking(bool b); bool isBlocking() const; State getState() const; unsigned int getRemoteIP() const; unsigned short getRemotePort() const; unsigned int getLocalIP() const; unsigned short getLocalPort() const; }; class TCPServer { private: int m_socketDescriptor; bool m_socketDescriptor_valid; struct sockaddr_in localAddr; public: TCPServer(); ~TCPServer(); int getSocketHandle(); void StartServer(); void StartServer(unsigned short lower, unsigned short upper); void Disconnect(); void setBindHost(const char *host); bool isStarted() const; // blocking accept TCPSocket* Accept(); unsigned short getPort() const; unsigned int getIP() const; }; class SocketException : std::exception { private: std::string m_errortext; public: SocketException(const std::string& text); ~SocketException() throw() { } const char* what() const throw(); }; } #endif centerim-4.22.10/libicq2000/src/FileTransferClient.cpp0000644000175000001440000006673511461606612017212 00000000000000/* * FileTransferClient * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "FileTransferClient.h" #include "ICQ.h" #include "constants.h" #include "sstream_fix.h" #include #include #include #include #include #include #include using std::string; using std::ostringstream; using std::endl; using std::ofstream; using std::min; using std::max; namespace ICQ2000 { /* * Constructor when receiving an incoming connection */ FileTransferClient::FileTransferClient(ContactRef self, MessageHandler *mh, ContactTree *cl, unsigned int ext_ip, FileTransferEvent* ev) : m_ev(ev), m_state(WAITING_FOR_INIT), m_recv(), m_self_contact(self), m_contact(NULL), m_contact_list(cl), m_message_handler(mh), m_incoming(true), m_local_ext_ip(ext_ip) { Init(); m_listenserver.StartServer(); } /* * Constructor for making an outgoing connection */ FileTransferClient::FileTransferClient(ContactRef self, ContactRef c, MessageHandler *mh, unsigned int ext_ip, FileTransferEvent* ev) : m_ev(ev), m_state(NOT_CONNECTED), m_recv(), m_self_contact(self), m_contact(c), m_message_handler(mh), m_incoming(false), m_local_ext_ip(ext_ip) { Init(); m_socket = new TCPSocket(); m_remote_uin = c->getUIN(); } FileTransferClient::~FileTransferClient() { if (m_listenserver.isStarted()) { SignalRemoveSocket( m_listenserver.getSocketHandle() ); m_listenserver.Disconnect(); } if ( m_socket->getSocketHandle() > -1) SignalRemoveSocket( m_socket->getSocketHandle() ); delete m_socket; if (m_fout.is_open()) m_fout.close(); if (m_fin.is_open()) m_fin.close(); } void FileTransferClient::Init() { m_more = false; m_continue = false; m_msgqueue = false; m_senddir = false; m_base_dir = NULL; m_timestamp = time(NULL); m_timeout = 60; // will time out in 60 seconds } void FileTransferClient::Connect() { m_remote_tcp_version = m_contact->getTCPVersion(); if (m_remote_tcp_version >= 7) m_eff_tcp_version = 7; else if (m_remote_tcp_version == 6) m_eff_tcp_version = 6; else throw DisconnectedException("Cannot direct connect to client with too old TCP version"); m_socket->setRemoteIP( m_contact->getLanIP() ); m_socket->setRemotePort( m_ev->getPort() ); m_socket->setBlocking(false); m_socket->Connect(); SignalAddSocket( m_socket->getSocketHandle(), SocketEvent::WRITE ); if (m_contact->getDCCookie() != 0) m_session_id = m_contact->getDCCookie(); else m_session_id = (unsigned int)(0xffffffff*(rand()/(RAND_MAX+1.0))); m_state = WAITING_FOR_INIT_ACK; } void FileTransferClient::FinishNonBlockingConnect() { SendInitPacket(); } void FileTransferClient::clearoutMessagesPoll() { if ((m_state != CONNECTED) && (time(NULL) > (m_timestamp + m_timeout))) expired(); } void FileTransferClient::SendFile() { if (m_state == CONNECTED && m_msgqueue) { SendPacket0x00(); m_msgqueue = false; } else if (m_continue) { if (m_more) { SendPacket0x06(); } else if (m_ev->getCurrFile() < m_ev->getTotalFiles()) { SendPacket0x02(); m_continue = false; m_more = false; } else { m_ev->setState(FileTransferEvent::COMPLETE); SignalLog(LogEvent::INFO, "FileTransfer is Complete"); throw DisconnectedException("FileTransfer is Complete"); m_continue = false; } } m_message_handler->handleUpdateFT(m_ev); } void FileTransferClient::expired() { m_ev->setFinished(false); m_ev->setDelivered(false); m_ev->setDirect(true); m_ev->setState(FileTransferEvent::TIMEOUT); messageack.emit(m_ev); } void FileTransferClient::Recv() { try { while ( m_socket->connected() ) { if ( !m_socket->Recv(m_recv) ) break; Parse(); } } catch(SocketException e) { ostringstream ostr; ostr << "Failed on recv: " << e.what(); throw DisconnectedException( ostr.str() ); } catch(ParseException e) { ostringstream ostr; ostr << "Failed parsing: " << e.what(); throw DisconnectedException( ostr.str() ); } } void FileTransferClient::Parse() { if (m_recv.empty()) return; unsigned short length; while (!m_recv.empty()) { m_recv.setPos(0); m_recv.setLittleEndian(); m_recv >> length; if (length > Incoming_Packet_Limit) throw ParseException("Received too long incoming packet"); if (length == 0) return; if (m_recv.remains() < length) return; // waiting for more of the packet // Optimize??? not create new buffer and copy and erase in old. Buffer sb; m_recv.chopOffBuffer( sb, length+2 ); if (m_state != CONNECTED) { ostringstream ostr; ostr << "Received filepacket from " << IPtoString( m_socket->getRemoteIP() ) << ":" << m_socket->getRemotePort() << endl << sb; SignalLog(LogEvent::DIRECTPACKET, ostr.str()); } if (m_state == WAITING_FOR_INIT) { ParseInitPacket(sb); if (m_incoming) { SendInitAck(); SendInitPacket(); m_state = WAITING_FOR_INIT_ACK; } else { SendInitAck(); m_state = CONNECTED; flush_queue(); connected.emit(this); } } else if (m_state == WAITING_FOR_INIT_ACK) { ParseInitAck(sb); if (m_incoming) { // Incoming ConfirmUIN(); m_state = CONNECTED; // v5 is done handshaking now flush_queue(); connected.emit(this); } else { // Outgoing - next packet should be their INIT m_state = WAITING_FOR_INIT; } } else if (m_state == WAITING_FOR_INIT2) { ParseInit2(sb); // This is a V7 only packet if (m_incoming) { SendInit2(); ConfirmUIN(); } m_state = CONNECTED; flush_queue(); connected.emit(this); } else if (m_state == CONNECTED) { ParsePacket(sb); } if (sb.beforeEnd()) { ostringstream ostr; ostr << "Buffer pointer not at end after parsing packet was: 0x" << std::hex << sb.pos() << " should be: 0x" << sb.size(); SignalLog(LogEvent::WARN, ostr.str()); } } } void FileTransferClient::ConfirmUIN() { if ( m_contact_list->exists(m_remote_uin) ) { ContactRef c = (*m_contact_list)[ m_remote_uin ]; if ( (c->getExtIP() == m_local_ext_ip && c->getLanIP() == getIP() ) /* They are behind the same masquerading box, * and the Lan IP matches */ || c->getExtIP() == getIP()) { m_contact = c; } else { // spoofing attempt most likely ostringstream ostr; ostr << "Refusing direct connection from someone that claims to be UIN " << m_remote_uin << " since their IP " << IPtoString( getIP() ) << " != " << IPtoString( c->getExtIP() ); throw DisconnectedException( ostr.str() ); } } else { // don't accept direct connections from contacts not on contact list throw DisconnectedException("Refusing direct connection to contact not on contact list"); } } void FileTransferClient::SendInitPacket() { Buffer b; b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned char)0xff; // start byte b << (unsigned short)0x0007; // tcp version Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_remote_uin; b << (unsigned short)0x0000; b << (unsigned int)m_local_server_port; b << m_self_contact->getUIN(); b.setBigEndian(); b << m_local_ext_ip; b << m_socket->getLocalIP(); b << (unsigned char)0x04; // mode b.setLittleEndian(); b << (unsigned int)m_local_server_port; b << m_session_id; b << (unsigned int)0x00000050; // unknown b << (unsigned int)0x00000003; // unknown if (m_eff_tcp_version == 7) b << (unsigned int)0x00000000; // unknown b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); Send(b); } void FileTransferClient::ParseInitPacket(Buffer &b) { b.setLittleEndian(); unsigned short length; b >> length; unsigned char start_byte; b >> start_byte; if (start_byte != 0xff) throw ParseException("Init Packet didn't start with 0xff"); unsigned short tcp_version; b >> tcp_version; b.advance(2); // revision or a length ?? if (m_incoming) { m_remote_tcp_version = tcp_version; if (tcp_version <= 5) throw ParseException("Too old client < ICQ99"); if (tcp_version == 6) m_eff_tcp_version = 6; else m_eff_tcp_version = 7; } else { if (tcp_version != m_remote_tcp_version) throw ParseException("Client claiming different TCP versions"); } unsigned int our_uin; b >> our_uin; if (our_uin != m_self_contact->getUIN()) throw ParseException("Local UIN in Init Packet not same as our Local UIN"); // 00 00 // xx xx senders open port // 00 00 b.advance(6); unsigned int remote_uin; b >> remote_uin; if (m_incoming) { m_remote_uin = remote_uin; } else { if (m_remote_uin != remote_uin) throw ParseException("Remote UIN in Init Packet for Remote Client not what was expected"); } // xx xx xx xx senders external IP // xx xx xx xx senders lan IP b.advance(8); b >> m_tcp_flags; // xx xx senders port again // 00 00 b.advance(4); // xx xx xx xx session id unsigned int session_id; b >> session_id; if (m_incoming) { m_session_id = session_id; } else { if (m_session_id != session_id) throw ParseException("Session ID from Remote Client doesn't match the one we sent"); } // 50 00 00 00 unknown // 03 00 00 00 unknown b.advance(8); if (m_eff_tcp_version == 7) { b.advance(4); // 00 00 00 00 unknown } } void FileTransferClient::ParseInitAck(Buffer &b) { b.setLittleEndian(); unsigned short length; b >> length; if (length != 4) throw ParseException("Init Ack not as expected"); unsigned int a; b >> a; // should be 0x00000001 really } void FileTransferClient::ParseInit2(Buffer &b) { b.setLittleEndian(); unsigned short length; b >> length; if (length != 0x0021) throw ParseException("V7 final handshake packet incorrect length"); unsigned char type; b >> type; if (type != 0x03) throw ParseException("Expecting V7 final handshake packet, received something else"); unsigned int unknown; b >> unknown // 0x0000000a >> unknown;// 0x00000001 on genuine connections, otherwise some weird connections which we drop if (unknown != 0x00000001) throw DisconnectedException("Ignoring weird direct connection"); b.advance(24); // unknowns } void FileTransferClient::SendInit2() { Buffer b; b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned char) 0x03 // start byte << (unsigned int) 0x0000000a // unknown << (unsigned int) 0x00000001 // unknown << (unsigned int) (m_incoming ? 0x00000001 : 0x00000000) // unknown << (unsigned int) 0x00000000 // unknown << (unsigned int) 0x00000000; // unknown if (m_incoming) { b << (unsigned int) 0x00040001 // unknown << (unsigned int) 0x00000000 // unknown << (unsigned int) 0x00000000; // unknown } else { b << (unsigned int) 0x00000000 // unknown << (unsigned int) 0x00000000 // unknown << (unsigned int) 0x00040001; // unknown } b.setAutoSizeMarker(m1); Send(b); } void FileTransferClient::ParsePacket(Buffer& b) { b.setLittleEndian(); unsigned short length; b >> length; unsigned char type; b >> type; switch (type) { case 0: ParsePacket0x00(b); SendPacket0x05(); SendPacket0x01(); break; case 1: ParsePacket0x01(b); SendPacket0x02(); break; case 2: ParsePacket0x02(b); SendPacket0x03(0,m_ev->getCurrFile()); break; case 3: ParsePacket0x03(b); m_continue = true; SendFile(); break; case 5: ParsePacket0x05(b); break; case 6: ParsePacket0x06(b); break; default: SignalLog(LogEvent::WARN, "Received unknown FileTransfer Packet"); } } void FileTransferClient::ParsePacket0x00(Buffer& b) { unsigned int x1, t_num_files, t_size, speed; string nick; b >> x1 >> t_num_files >> t_size >> speed; b.UnpackUint16StringNull(nick); m_ev->setTotalSize(t_size); m_ev->setTotalFiles(t_num_files); m_ev->setCurrFile(0); m_ev->setSpeed(speed); m_path = m_ev->getSavePath(); } void FileTransferClient::ParsePacket0x01(Buffer& b) { unsigned int speed; std::string nick; b >> speed; b.UnpackUint16StringNull(nick); m_ev->setSpeed(speed); } void FileTransferClient::ParsePacket0x02(Buffer& b) { unsigned int size, speed; string filename, subdir; unsigned char file_or_dir, tmp1; b >> file_or_dir; b.UnpackUint16StringNull(filename); b.UnpackUint16StringNull(subdir); b >> size; b >> tmp1; b >> tmp1; b >> tmp1; b >> tmp1; b >> speed; m_ev->setSize(size); m_ev->setPos(0); m_ev->setCurrFile(m_ev->getCurrFile()+1); m_ev->setSpeed(speed); m_path = m_ev->getSavePath(); // Add backslash if missing in path if (m_path.find_last_of('/') != (m_path.length()-1)) { m_path += "/"; } int pos = 0; while ((pos = subdir.find('\\')) != std::string::npos) { subdir[pos] = '/'; } m_path += subdir; // Add backslash if missing in path again if (m_path.find_last_of('/') != (m_path.length()-1)) { m_path += "/"; } if (file_or_dir == 1) { m_path += filename; m_path += "/"; mkdir(m_path.c_str(), S_IXUSR | S_IWUSR | S_IRUSR | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH); } else { if (m_ev->getCurrFile() > 1) { if (m_fout.is_open()) { m_fout.close(); } } m_fout.open(std::string(m_path+filename).c_str(), std::ios::out | std::ios::binary); if (!m_fout.good()) { ostringstream ostr; ostr << "Opening " << m_path << filename << " for writing."; m_ev->setState(FileTransferEvent::ERROR); m_ev->setError(ostr.str()); throw DisconnectedException("I/O error"); } } // Notify the Gui that an new file is on it's way.. m_message_handler->handleUpdateFT(m_ev); } void FileTransferClient::ParsePacket0x03(Buffer& b) { unsigned int npos, nfiles, x1, x2; b >> npos >> x1 >> x2 >> nfiles; // Resume is handled m_ev->setPos(npos); m_ev->setTotalPos(m_ev->getTotalPos()+npos); m_ev->setCurrFile(nfiles); if (npos > m_ev->getSize()) { ostringstream ostr; ostr << "FileTransfer resume request got wrong offset: " << npos << " when file only is " << m_ev->getSize(); m_ev->setState(FileTransferEvent::ERROR); m_ev->setError(ostr.str()); throw DisconnectedException("I/O error"); } else { // We support resume ostringstream ostr; ostr << "Resuming filetransfer " << npos << "/" << m_ev->getSize(); SignalLog(LogEvent::INFO, ostr.str()); m_fin.seekg(npos); } if (!m_senddir) { m_more = true; } } void FileTransferClient::ParsePacket0x05(Buffer& b) { unsigned int speed; b >> speed; m_ev->setSpeed(speed); } void FileTransferClient::ParsePacket0x06(Buffer& b) { unsigned short length; length = b.remains(); m_ev->setPos(m_ev->getPos()+length); m_ev->setTotalPos(m_ev->getTotalPos()+length); while ( length>0 ) { b.Unpack( m_const_buf, min(length, (unsigned short)MAX_FileChunk) ); m_fout.write((const char*)m_const_buf, std::min(length, (unsigned short)MAX_FileChunk) ); length = max(0, length-(unsigned short)MAX_FileChunk); } m_fout.flush(); //prob. isn't needed.. but I feel safer ;) if (m_ev->getTotalPos() >= m_ev->getTotalSize()) { m_ev->setState(FileTransferEvent::COMPLETE); throw DisconnectedException("FileTransfer is Complete"); } } void FileTransferClient::SendPacket0x00() { Buffer b; unsigned int tmp_speed = m_ev->getSpeed(); unsigned int tmp_tot_nr = m_ev->getTotalFiles(); unsigned int tmp_tot_size = m_ev->getTotalSize(); b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned char)0x00; b << (unsigned int)0x00000000; //0x00000000 X1 b << tmp_tot_nr; //total number of files to send CHANGE!!!! b << tmp_tot_size; //total number of bytes to send CHANGE!!!! b << tmp_speed; b.PackUint16StringNull(m_self_contact->getAlias()); b.setAutoSizeMarker(m1); Send(b); } void FileTransferClient::SendPacket0x01() { Buffer b; unsigned int tmp_speed = m_ev->getSpeed(); b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned char)0x01; b << tmp_speed; //Speed CHANGE!!!! b.PackUint16StringNull(m_self_contact->getAlias()); b.setAutoSizeMarker(m1); Send(b); } void FileTransferClient::SendPacket0x02() { Buffer b; string tmp_name = m_ev->getFile(); unsigned int tmp_size; unsigned int tmp_speed = m_ev->getSpeed(); struct stat tmp_stat; unsigned char file_or_dir; stat(tmp_name.c_str(), &tmp_stat); if (S_ISDIR(tmp_stat.st_mode)) { file_or_dir = 1; tmp_size = 0; m_senddir = true; //setting base_dir if (m_base_dir == NULL) { m_base_dir = new std::string(tmp_name.substr(0, tmp_name.find_last_of('/', tmp_name.find_last_not_of('/'))+1)); } } else if (S_ISREG(tmp_stat.st_mode)) { file_or_dir = 0; tmp_size = tmp_stat.st_size; //setting base_dir if (m_base_dir == NULL) { m_base_dir = new std::string(""); } m_senddir = false; if (m_fin.is_open()) { m_fin.clear(); m_fin.close(); } m_fin.open(tmp_name.c_str(), std::ios::in | std::ios::binary); if (!m_fin.good()) { ostringstream ostr; ostr << "Opening " << tmp_name << " for Reading."; m_ev->setState(FileTransferEvent::ERROR); m_ev->setError(ostr.str()); throw DisconnectedException("I/O error"); } } else { ostringstream ostr; ostr << "Trying to send unknown file type: "<< tmp_name; SignalLog(LogEvent::WARN, ostr.str()); return; } std::string subdir = ""; if (m_base_dir->length() != 0) subdir = tmp_name.substr(m_base_dir->length(), tmp_name.find_last_of('/', tmp_name.find_last_not_of('/'))); int pos = 0; while ((pos = subdir.find('/')) != std::string::npos) subdir[pos] = '\\'; // Chopping of so just name is sent. pos = tmp_name.find_last_of('/'); if (pos == tmp_name.length()-1) { tmp_name = tmp_name.substr(0,pos); pos = tmp_name.find_last_of('/'); } tmp_name = tmp_name.substr(pos+1, tmp_name.length()-pos); // Chopping of filename if (m_base_dir->length() != 0) subdir = subdir.substr(0, subdir.length() - tmp_name.length() -1); // Remove last backslash from subdir if ((file_or_dir == 1) && (subdir.find_last_of('\\') == (subdir.length()-1))) subdir = subdir.substr(0, subdir.length() -1); m_ev->setCurrFile(m_ev->getCurrFile()+1); m_ev->setPos(0); m_ev->setSize(tmp_size); b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned char)0x02; b << file_or_dir; b.PackUint16StringNull(tmp_name); //name of next file. b.PackUint16StringNull(subdir); //subdir b << tmp_size; b << (unsigned char)0x00; b << (unsigned char)0x00; b << (unsigned char)0x00; b << (unsigned char)0x00; b << tmp_speed; b.setAutoSizeMarker(m1); Send(b); } void FileTransferClient::SendPacket0x03(unsigned int npos, unsigned int nfiles) { Buffer b; unsigned int speed = m_ev->getSpeed(); b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned char)0x03; b << npos; //filepos RESUME? b << (unsigned int)0x00000000; // X1 Unknown b << speed; //(unsigned int)0x00000064; // speed b << nfiles; b.setAutoSizeMarker(m1); Send(b); } void FileTransferClient::SendPacket0x05() { Buffer b; unsigned int speed; b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); speed = m_ev->getSpeed(); b << (unsigned char)0x05; b << speed; b.setAutoSizeMarker(m1); Send(b); } void FileTransferClient::SendPacket0x06() { Buffer b; unsigned short length; b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); if (!m_fin.good()) { m_ev->setState(FileTransferEvent::ERROR); m_ev->setError("I/O error while sending data"); throw DisconnectedException("I/O error in SendPacket0x06"); } m_fin.read((char*)m_const_buf, 2048); length = m_fin.gcount(); b << (unsigned char)0x06; b.Pack(m_const_buf, length); b.setAutoSizeMarker(m1); m_ev->setPos(m_ev->getPos()+length); m_ev->setTotalPos(m_ev->getTotalPos()+length); Send(b); // Send more? if (m_ev->getPos() < m_ev->getSize()) { m_more = true; } else { m_more = false; if (m_ev->getFilesInQueue() == 0) { m_ev->setState(FileTransferEvent::COMPLETE); SignalLog(LogEvent::INFO, "FileTransfer is Complete"); throw DisconnectedException("FileTransfer is Complete"); } } } void FileTransferClient::SendInitAck() { Buffer b; b.setLittleEndian(); Buffer::marker m1 = b.getAutoSizeShortMarker(); b << (unsigned int)0x00000001; b.setAutoSizeMarker(m1); Send(b); } void FileTransferClient::SendPacketAck(ICQSubType *icqsubtype) { Buffer b; b.setLittleEndian(); b << (unsigned int)0x00000000 // checksum (filled in by Encrypt) << V6_TCP_ACK << (unsigned short)0x000e << icqsubtype->getSeqNum() << (unsigned int)0x00000000 << (unsigned int)0x00000000 << (unsigned int)0x00000000; icqsubtype->Output(b); Buffer c; //Encrypt(b,c); Send(c); } void FileTransferClient::Send(Buffer &b) { try { m_socket->Send(b); } catch(SocketException e) { ostringstream ostr; ostr << "Failed to send: " << e.what(); throw DisconnectedException( ostr.str() ); } } void FileTransferClient::SendEvent(MessageEvent *ev) { if (m_state == CONNECTED) { // send straight away SendFile(); } else { // queue message m_msgqueue = true; } } void FileTransferClient::flush_queue() { if (m_msgqueue) { SendFile(); } } unsigned int FileTransferClient::getUIN() const { return m_remote_uin; } unsigned int FileTransferClient::getIP() const { return m_socket->getRemoteIP(); } unsigned short FileTransferClient::getPort() const { return m_socket->getRemotePort(); } unsigned short FileTransferClient::getlistenPort() const { return m_listenserver.getPort(); } int FileTransferClient::getfd() const { return m_socket->getSocketHandle(); } int FileTransferClient::getlistenfd() { return m_listenserver.getSocketHandle(); } TCPSocket* FileTransferClient::getSocket() const { return m_socket; } void FileTransferClient::setSocket() { m_socket = m_listenserver.Accept(); SignalLog(LogEvent::INFO, "Accepting incoming filetransfer"); } void FileTransferClient::setContact(ContactRef c) { m_contact = c; } ContactRef FileTransferClient::getContact() const { return m_contact; } bool FileTransferClient::SetupFileTransfer(FileTransferEvent *ev) { struct stat tmp_stat; std::string str = ev->getDescription(); stat(str.c_str(), &tmp_stat); /* MITZ - what's the idea?! if (S_ISDIR(tmp_stat.st_mode)) { int size = 0; int files = 0; int dirs = 0; listDirectory(str, size, files, dirs, ev); ev->setTotalSize(size); ostringstream ostr; ostr << files << " files in " << dirs << " directories"; ev->setDescription(ostr.str()); } else if (S_ISREG(tmp_stat.st_mode)) { ev->addFile(str); ev->setTotalSize(tmp_stat.st_size); // Chopping of so just name is sent. int pos = str.find_last_of('/'); if (pos == str.length()-1) { str = str.substr(0,pos); pos = str.find_last_of('/'); } str = str.substr(pos+1, str.length()-pos); ev->setDescription(str); } else { return false; } */ ev->setTotalFiles(ev->getFilesInQueue()); ev->setCurrFile(0); return true; } void FileTransferClient::listDirectory(std::string str, int &size, int &files, int &dirs, FileTransferEvent *ev) { struct stat tmp_stat; if (str.length() > 1 && (str.substr(str.length()-1, str.length()) == "." || str.substr(str.length()-2, str.length()) == "..")) return; // Add backslash if missing in path if (str.find_last_of('/') != (str.length()-1)) str += "/"; ev->addFile(str); dirs++; DIR *dir = opendir(str.c_str()); if (dir == NULL) return; struct dirent *dent = readdir(dir); std::string tmp_str; while (dent != NULL) { tmp_str = str; tmp_str += dent->d_name; stat(tmp_str.c_str(), &tmp_stat); if (S_ISREG(tmp_stat.st_mode)) { ev->addFile(tmp_str); size += tmp_stat.st_size; files++; } else if (S_ISDIR(tmp_stat.st_mode)) { listDirectory(tmp_str, size, files, dirs, ev); } dent = readdir(dir); //delete on old dent? } closedir(dir); } FileTransferEvent* FileTransferClient::getEvent() { return m_ev; } } centerim-4.22.10/libicq2000/src/ICBMCookie.cpp0000644000175000001440000000326411461606612015317 00000000000000/* * ICBM Cookie * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "ICBMCookie.h" #include namespace ICQ2000 { ICBMCookie::ICBMCookie() : m_c1(0), m_c2(0) { } void ICBMCookie::generate() { m_c1 = (unsigned int)(0xffffffff*(rand()/(RAND_MAX+1.0))); m_c2 = (unsigned int)(0xffffffff*(rand()/(RAND_MAX+1.0))); } void ICBMCookie::Parse(Buffer& b) { b.setBigEndian(); b >> m_c1 >> m_c2; } void ICBMCookie::Output(Buffer& b) const { b.setBigEndian(); b << m_c1 << m_c2; } bool ICBMCookie::operator==(const ICBMCookie& c) const { return (m_c1 == c.m_c1 && m_c2 == c.m_c2); } ICBMCookie& ICBMCookie::operator=(const ICBMCookie& c) { m_c1 = c.m_c1; m_c2 = c.m_c2; return *this; } Buffer& operator<<(Buffer& b, const ICQ2000::ICBMCookie& c) { c.Output(b); return b; } Buffer& operator>>(Buffer& b, ICQ2000::ICBMCookie& c) { c.Parse(b); return b; } } centerim-4.22.10/libicq2000/src/SNAC.h0000644000175000001440000000216111461606612013637 00000000000000/* * SNACs * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SNAC_H #define SNAC_H #include "buffer.h" #include "SNAC-base.h" #include "SNAC-BUD.h" #include "SNAC-LOC.h" #include "SNAC-GEN.h" #include "SNAC-UIN.h" #include "SNAC-MSG.h" #include "SNAC-SRV.h" #include "SNAC-BOS.h" #include "SNAC-SBL.h" namespace ICQ2000 { InSNAC* ParseSNAC(Buffer& b); } #endif centerim-4.22.10/libicq2000/src/Translator.cpp0000644000175000001440000000612611461606612015604 00000000000000/* * Translator class * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "Translator.h" namespace ICQ2000 { // ====================================================================== // Translator // ====================================================================== Translator::Translator() { } Translator::~Translator() { } void Translator::client_to_server_inplace(std::string& str, Encoding en, const ICQ2000::ContactRef& c) { std::string tstr = client_to_server(str, en, c); str = tstr; } void Translator::server_to_client_inplace(std::string& str, Encoding en, const ICQ2000::ContactRef& c) { std::string tstr = server_to_client(str, en, c); str = tstr; } // ====================================================================== // NULLTranslator // ====================================================================== NULLTranslator::NULLTranslator() { } std::string NULLTranslator::client_to_server(const std::string& str, Encoding en, const ICQ2000::ContactRef& c) { return str; } std::string NULLTranslator::server_to_client(const std::string& str, Encoding en, const ICQ2000::ContactRef& c) { return str; } // ====================================================================== // CRLFTranslator // ====================================================================== CRLFTranslator::CRLFTranslator() { } std::string CRLFTranslator::client_to_server(const std::string& str, Encoding en, const ICQ2000::ContactRef& c) { std::string::const_iterator curr = str.begin(); std::string ret; while ( curr != str.end() ) { if (*curr == '\n') { ret += "\r\n"; } else { ret += *curr; } ++curr; } return ret; } std::string CRLFTranslator::server_to_client(const std::string& str, Encoding en, const ICQ2000::ContactRef& c) { std::string::const_iterator curr = str.begin(); std::string::const_iterator ncurr = curr; std::string ret; while ( curr != str.end() ) { ++ncurr; if (*curr == '\r' && ncurr != str.end() && *ncurr == '\n') { ret += '\n'; ++curr; ++ncurr; } else { ret += *curr; } ++curr; } return ret; } } centerim-4.22.10/libicq2000/src/ICQ.cpp0000644000175000001440000006273011461606612014072 00000000000000/* * ICQ Subtypes * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "ICQ.h" #include "sstream_fix.h" #include #include using std::string; using std::list; using std::ostringstream; using std::auto_ptr; namespace ICQ2000 { // ----------------- ICQSubtypes ---------------- ICQSubType::ICQSubType() : m_flags(0x0000) { } ICQSubType* ICQSubType::ParseICQSubType(Buffer& b, bool adv, bool ack) { unsigned char type, flags; b >> type >> flags; bool multi = (flags & MSG_Flag_Multi); ICQSubType *ist; switch(type) { case MSG_Type_Normal: ist = new NormalICQSubType(multi); break; case MSG_Type_URL: ist = new URLICQSubType(); break; case MSG_Type_SMS: ist = new SMSICQSubType(); break; case MSG_Type_AuthReq: ist = new AuthReqICQSubType(); break; case MSG_Type_AuthRej: ist = new AuthRejICQSubType(); break; case MSG_Type_AuthAcc: ist = new AuthAccICQSubType(); break; case MSG_Type_EmailEx: ist = new EmailExICQSubType(); break; case MSG_Type_WebPager: ist = new WebPagerICQSubType(); break; case MSG_Type_UserAdd: ist = new UserAddICQSubType(); break; case MSG_Type_Contact: ist = new ContactICQSubType(); break; case MSG_Type_AutoReq_Away: case MSG_Type_AutoReq_Occ: case MSG_Type_AutoReq_NA: case MSG_Type_AutoReq_DND: case MSG_Type_AutoReq_FFC: ist = new AwayMsgSubType(type); break; case MSG_Type_FT: ist = new FTICQSubType(); break; default: { ostringstream ostr; ostr << "Unknown ICQ Subtype: 0x" << std::hex << (int) type; throw ParseException(ostr.str()); } } if (dynamic_cast(ist) != NULL) { UINICQSubType *ust = dynamic_cast(ist); ust->setAdvanced(adv); ust->setACK(ack); /* There is nothing in the encoding of the ICQ subtype that distinguishes whether it is an ack or not - this is implied by the protocol layer above this. As such it has to be passed as an argument and set body the rest of parsing continues */ } ist->setFlags(flags); ist->ParseBody(b); return ist; } void ICQSubType::Output(Buffer& b) const { b << getType() << getFlags(); OutputBody(b); } UINICQSubType::UINICQSubType() : m_source(0), m_destination(0), m_advanced(false), m_ack(false), m_urgent(false), m_tocontactlist(false), m_status(0) { } UINICQSubType::UINICQSubType(unsigned int s, unsigned int d) : m_source(s), m_destination(d), m_advanced(false), m_ack(false), m_urgent(false), m_tocontactlist(false), m_status(0) { } unsigned int UINICQSubType::getSource() const { return m_source; } unsigned int UINICQSubType::getDestination() const { return m_destination; } void UINICQSubType::setDestination(unsigned int d) { m_destination = d; } void UINICQSubType::setSource(unsigned int s) { m_source = s; } bool UINICQSubType::isAdvanced() const { return m_advanced; } void UINICQSubType::setAdvanced(bool b) { m_advanced = b; } bool UINICQSubType::isACK() const { return m_ack; } void UINICQSubType::setACK(bool b) { m_ack = b; } unsigned short UINICQSubType::getStatus() const { return m_status; } void UINICQSubType::setStatus(unsigned short s) { m_status = s; } bool UINICQSubType::isUrgent() const { return m_urgent; } void UINICQSubType::setUrgent(bool b) { m_urgent = b; } bool UINICQSubType::isToContactList() const { return m_tocontactlist; } void UINICQSubType::setToContactList(bool b) { m_tocontactlist = b; } void UINICQSubType::setAwayMessage(const string& m) { m_away_message = m; } string UINICQSubType::getAwayMessage() const { return m_away_message; } void UINICQSubType::ParseBody(Buffer& b) { if (m_advanced) { unsigned short priority; b >> m_status >> priority; m_urgent = priority & Priority_Urgent; m_tocontactlist = priority & Priority_ToContactList; if (!m_urgent && priority != Priority_Normal && priority != 0) m_tocontactlist = true; // the official clients seem fairly lenient on what they'll accept in status flags } if (!m_ack) { ParseBodyUIN(b); } else { ParseBodyUINACK(b); } } void UINICQSubType::OutputBody(Buffer& b) const { if (m_advanced) { b << (unsigned short)m_status; unsigned short priority = 0x0000; if (!m_ack) { priority = Priority_Normal; if (m_urgent) priority = Priority_Urgent; if (m_tocontactlist) priority = Priority_ToContactList; } b << priority; } if (!m_ack) { OutputBodyUIN(b); } else { OutputBodyUINACK(b); } } void UINICQSubType::OutputBodyUINACK(Buffer& b) const { b.PackUint16StringNull(m_away_message); } void UINICQSubType::ParseBodyUINACK(Buffer& b) { /* whatever the message type, ACKs are always the same - the current away message */ b.UnpackUint16StringNull(m_away_message); } NormalICQSubType::NormalICQSubType(bool multi) : m_multi(multi), m_foreground(0x00000000), m_background(0x00ffffff) { } NormalICQSubType::NormalICQSubType(const string& msg) : m_message(msg), m_foreground(0x00000000), m_background(0x00ffffff) { } string NormalICQSubType::getMessage() const { return m_message; } bool NormalICQSubType::isMultiParty() const { return m_multi; } void NormalICQSubType::setMessage(const string& msg) { m_message = msg; } void NormalICQSubType::setEncoding(const unsigned short encoding) { m_encoding = encoding; } unsigned short NormalICQSubType::getEncoding() const { return m_encoding; } void NormalICQSubType::ParseBodyUIN(Buffer& b) { b.UnpackUint16StringNull(m_message); if (m_advanced) { b >> m_foreground >> m_background; } else { m_foreground = 0x00000000; m_background = 0x00ffffff; } } void NormalICQSubType::OutputBodyUIN(Buffer& b) const { b.PackUint16StringNull(m_message); if (m_advanced) { b << (unsigned int)m_foreground << (unsigned int)m_background; } } void NormalICQSubType::ParseBodyUINACK(Buffer& b) { b.UnpackUint16StringNull(m_away_message); b.advance(8); } void NormalICQSubType::OutputBodyUINACK(Buffer& b) const { /* hmmff.. Normal messages differ from all the other ACKs by having these two pointless ints. */ b.PackUint16StringNull(m_away_message); if (m_advanced) { b << (unsigned int)0x00000000 << (unsigned int)0xffffffff; } } unsigned short NormalICQSubType::Length() const { return m_message.size() + (m_advanced ? 13 : 5); } unsigned char NormalICQSubType::getType() const { return MSG_Type_Normal; } void NormalICQSubType::setForeground(unsigned int f) { m_foreground = f; } void NormalICQSubType::setBackground(unsigned int b) { m_background = b; } unsigned int NormalICQSubType::getForeground() const { return m_foreground; } unsigned int NormalICQSubType::getBackground() const { return m_background; } URLICQSubType::URLICQSubType() { } URLICQSubType::URLICQSubType(const string& msg, const string& url) : m_message(msg), m_url(url) { } string URLICQSubType::getMessage() const { return m_message; } string URLICQSubType::getURL() const { return m_url; } void URLICQSubType::setMessage(const string& msg) { m_message = msg; } void URLICQSubType::setURL(const string& url) { m_url = url; } void URLICQSubType::ParseBodyUIN(Buffer& b) { string text; b.UnpackUint16StringNull(text); /* * Format is [message] 0xfe [url] */ int l = text.find( 0xfe ); if (l != -1) { m_message = text.substr( 0, l ); m_url = text.substr( l+1 ); } else { m_message = text; m_url = ""; } } void URLICQSubType::OutputBodyUIN(Buffer& b) const { if (m_ack) { b.PackUint16StringNull(""); } else { ostringstream ostr; string message = m_message; string url = m_url; ostr << message << (unsigned char)0xfe << url; b.PackUint16StringNull( ostr.str() ); } } unsigned short URLICQSubType::Length() const { return m_message.size() + 6; } unsigned char URLICQSubType::getType() const { return MSG_Type_URL; } AwayMsgSubType::AwayMsgSubType(unsigned char type) : m_type(type) { } AwayMsgSubType::AwayMsgSubType(Status s) { switch(s) { case STATUS_AWAY: m_type = MSG_Type_AutoReq_Away; break; case STATUS_OCCUPIED: m_type = MSG_Type_AutoReq_Occ; break; case STATUS_NA: m_type = MSG_Type_AutoReq_NA; break; case STATUS_DND: m_type = MSG_Type_AutoReq_DND; break; case STATUS_FREEFORCHAT: m_type = MSG_Type_AutoReq_FFC; break; default: m_type = MSG_Type_AutoReq_Away; } } void AwayMsgSubType::ParseBodyUIN(Buffer& b) { // dummy string dummy; b.UnpackUint16StringNull(dummy); } void AwayMsgSubType::OutputBodyUIN(Buffer& b) const { // dummy string dummy; b.PackUint16StringNull( dummy ); } unsigned short AwayMsgSubType::Length() const { // This doesn't appear to be called when sending an away message // response, so I'm leaving this as 9. return 9; } unsigned char AwayMsgSubType::getType() const { return m_type; } unsigned char AwayMsgSubType::getFlags() const { return 0x03; } SMSICQSubType::SMSICQSubType() { } string SMSICQSubType::getMessage() const { return m_message; } SMSICQSubType::Type SMSICQSubType::getSMSType() const { return m_type; } void SMSICQSubType::ParseBody(Buffer& b) { /* * Here we go... this is a biggy */ /* Next 21 bytes * Unknown * 01 00 00 20 00 0e 28 f6 00 11 e7 d3 11 bc f3 00 04 ac 96 9d c2 */ b.advance(21); /* Delivery status * 0x0000 = SMS * 0x0002 = SMS Receipt Success * 0x0003 = SMS Receipt Failure */ unsigned short del_stat; b >> del_stat; switch (del_stat) { case 0x0000: m_type = SMS; break; case 0x0002: case 0x0003: m_type = SMS_Receipt; break; default: throw ParseException("Unknown Type for SMS ICQ Subtype"); } /* * A Tag for the type, can be: * - "ICQSMS" NULL (?) * - "IrCQ-Net Invitation" * - ... * 07 00 00 00 49 43 51 53 4d 53 00 * ---length-- ---string----------- */ string tagstr; b.UnpackUint32String(tagstr); if (tagstr != string("ICQSMS")+'\0') { ostringstream ostr; ostr << "Unknown SNAC 0x0004 0x0007 ICQ SubType 0x001a tag string: " << tagstr; throw ParseException(ostr.str()); } /* Next 3 bytes * Unknown * 00 00 00 */ b.advance(3); /* Length till end * 4 bytes */ unsigned int msglen; b >> msglen; string xmlstr; b.UnpackUint32String(xmlstr); string::iterator s = xmlstr.begin(); auto_ptr top(XmlNode::parse(s, xmlstr.end())); if (top.get() == NULL) throw ParseException("Couldn't parse xml data in Message SNAC"); if (m_type == SMS) { // -------- Normal SMS Message --------- if (top->getTag() != "sms_message") throw ParseException("No tag found in xml data"); XmlBranch *sms_message = dynamic_cast(top.get()); if (sms_message == NULL || !sms_message->exists("text")) throw ParseException("No tag found in xml data"); XmlLeaf *text = sms_message->getLeaf("text"); if (text == NULL) throw ParseException(" tag is not a leaf in xml data"); m_message = text->getValue(); /** * Extra fields * senders_network is always blank from my mobile */ XmlLeaf *source = sms_message->getLeaf("source"); if (source != NULL) m_source = source->getValue(); XmlLeaf *sender = sms_message->getLeaf("sender"); if (sender != NULL) m_sender = sender->getValue(); XmlLeaf *senders_network = sms_message->getLeaf("senders_network"); if (senders_network != NULL) m_senders_network = senders_network->getValue(); XmlLeaf *time = sms_message->getLeaf("time"); if (time != NULL) m_time = time->getValue(); // ---------------------------------- } else if (m_type == SMS_Receipt) { // -- SMS Delivery Receipt Success -- if (top->getTag() != "sms_delivery_receipt") throw ParseException("No tag found in xml data"); XmlBranch *sms_rcpt = dynamic_cast(top.get()); if (sms_rcpt == NULL) throw ParseException("No tags found in "); XmlLeaf *message_id = sms_rcpt->getLeaf("message_id"); if (message_id != NULL) m_message_id = message_id->getValue(); XmlLeaf *destination = sms_rcpt->getLeaf("destination"); if (destination != NULL) m_destination = destination->getValue(); XmlLeaf *delivered = sms_rcpt->getLeaf("delivered"); m_delivered = false; if (delivered != NULL && delivered->getValue() == "Yes") m_delivered = true; XmlLeaf *text = sms_rcpt->getLeaf("text"); if (text != NULL) m_message = text->getValue(); XmlLeaf *submission_time = sms_rcpt->getLeaf("submition_time"); // can they not spell! if (submission_time != NULL) m_submission_time = submission_time->getValue(); XmlLeaf *delivery_time = sms_rcpt->getLeaf("delivery_time"); if (delivery_time != NULL) m_delivery_time = delivery_time->getValue(); // could do with parsing errors for Failure // --------------------------------- } } void SMSICQSubType::OutputBody(Buffer& b) const { } unsigned short SMSICQSubType::Length() const { return 0; } unsigned char SMSICQSubType::getType() const { return MSG_Type_SMS; } AuthReqICQSubType::AuthReqICQSubType() { } AuthReqICQSubType::AuthReqICQSubType(const string& alias, const string& firstname, const string& lastname, const string& email, bool auth, const string& msg) : m_alias(alias), m_firstname(firstname), m_lastname(lastname), m_email(email), m_message(msg), m_auth(auth) { } string AuthReqICQSubType::getMessage() const { return m_message; } void AuthReqICQSubType::ParseBodyUIN(Buffer& b) { string text; b.UnpackUint16StringNull(text); /* * * The packet does have nickname, first and last name fields, * but they're better to fetch with user details lookup request * for different versions of Windows client either have or don't * have them in packets they send. * */ list fields; string_split( text, string("\xfe"), 6, fields); list::iterator iter = fields.begin(); m_alias = *(iter++); m_firstname = *(iter++); m_lastname = *(iter++); m_email = *(iter++); m_auth = ((*(iter++)) == "1"); m_message = *(iter++); } void AuthReqICQSubType::OutputBodyUIN(Buffer& b) const { ostringstream ostr; ostr << m_alias << (unsigned char)0xfe << m_firstname << (unsigned char)0xfe << m_lastname << (unsigned char)0xfe << m_email << (unsigned char)0xfe << (m_auth ? "1" : "0") << (unsigned char)0xfe << m_message; b.PackUint16StringNull( ostr.str() ); } unsigned short AuthReqICQSubType::Length() const { return 0; } unsigned char AuthReqICQSubType::getType() const { return MSG_Type_AuthReq; } AuthRejICQSubType::AuthRejICQSubType() { } AuthRejICQSubType::AuthRejICQSubType(const string& msg) : m_message(msg) { } string AuthRejICQSubType::getMessage() const { return m_message; } void AuthRejICQSubType::setMessage(const string& msg) { m_message = msg; } void AuthRejICQSubType::ParseBodyUIN(Buffer& b) { b.UnpackUint16StringNull(m_message); } void AuthRejICQSubType::OutputBodyUIN(Buffer& b) const { b.PackUint16StringNull(m_message); } unsigned short AuthRejICQSubType::Length() const { return m_message.size()+3; } unsigned char AuthRejICQSubType::getType() const { return MSG_Type_AuthRej; } AuthAccICQSubType::AuthAccICQSubType() { } void AuthAccICQSubType::ParseBodyUIN(Buffer& b) { string nothing_much; b.UnpackUint16StringNull(nothing_much); } void AuthAccICQSubType::OutputBodyUIN(Buffer& b) const { b.PackUint16StringNull(""); } unsigned short AuthAccICQSubType::Length() const { return 0; } unsigned char AuthAccICQSubType::getType() const { return MSG_Type_AuthAcc; } // ============================================================================ // Email Express message // ============================================================================ EmailExICQSubType::EmailExICQSubType() { } void EmailExICQSubType::ParseBody(Buffer& b) { string text; b.UnpackUint16StringNull(text); list fields; string_split( text, string("\xfe"), 6, fields); list::iterator iter = fields.begin(); m_sender = *(iter++); ++iter; // ??? ++iter; // ??? m_email = *(iter++); ++iter; // ??? m_message = *(iter++); } void EmailExICQSubType::OutputBody(Buffer& b) const { // never sent } unsigned short EmailExICQSubType::Length() const { return 0; } unsigned char EmailExICQSubType::getType() const { return MSG_Type_EmailEx; } string EmailExICQSubType::getMessage() const { return m_message; } string EmailExICQSubType::getEmail() const { return m_email; } string EmailExICQSubType::getSender() const { return m_sender; } // ============================================================================ // Web Pager message // ============================================================================ WebPagerICQSubType::WebPagerICQSubType() { } void WebPagerICQSubType::ParseBody(Buffer& b) { string text; b.UnpackUint16StringNull(text); list fields; string_split( text, string("\xfe"), 6, fields); list::iterator iter = fields.begin(); m_sender = *(iter++); ++iter; // ??? ++iter; // ??? m_email = *(iter++); ++iter; // ??? m_message = *(iter++); } void WebPagerICQSubType::OutputBody(Buffer& b) const { // never sent } unsigned short WebPagerICQSubType::Length() const { return 0; } unsigned char WebPagerICQSubType::getType() const { return MSG_Type_WebPager; } string WebPagerICQSubType::getMessage() const { return m_message; } string WebPagerICQSubType::getEmail() const { return m_email; } string WebPagerICQSubType::getSender() const { return m_sender; } // ============================================================================ // "You were added" message // ============================================================================ UserAddICQSubType::UserAddICQSubType() { } UserAddICQSubType::UserAddICQSubType(const string& alias, const string& firstname, const string& lastname, const string& email, bool auth) : m_alias(alias), m_firstname(firstname), m_lastname(lastname), m_email(email), m_auth(auth) { } void UserAddICQSubType::ParseBodyUIN(Buffer& b) { string text; b.UnpackUint16StringNull(text); /* * * The packet does have nickname, first and last name fields, * but they're better to fetch with user details lookup request * for different versions of Windows client either have or don't * have them in packets they send. * */ list fields; string_split( text, string("\xfe"), 5, fields); list::iterator iter = fields.begin(); m_alias = *(iter++); m_firstname = *(iter++); m_lastname = *(iter++); m_email = *(iter++); m_auth = ((*(iter++)) == "1"); } void UserAddICQSubType::OutputBodyUIN(Buffer& b) const { ostringstream ostr; ostr << m_alias << (unsigned char)0xfe << m_firstname << (unsigned char)0xfe << m_lastname << (unsigned char)0xfe << m_email << (unsigned char)0xfe << (m_auth ? "1" : "0") << (unsigned char)0xfe; b.PackUint16StringNull( ostr.str() ); } unsigned short UserAddICQSubType::Length() const { return 0; } unsigned char UserAddICQSubType::getType() const { return MSG_Type_UserAdd; } // ============================================================================ // File Transfer request message // ============================================================================ FTICQSubType::FTICQSubType() : m_port(0), m_revport(0), m_size(0) { } FTICQSubType::FTICQSubType(const std::string& msg, const std::string& desc, const int size) : m_port(0), m_revport(0), m_size(size), m_message(msg), m_description(desc) { } void FTICQSubType::ParseBodyUIN(Buffer& b) { b.UnpackUint16StringNull(m_message); b >> m_revport; // network order b.advance(2); // unknown b.UnpackUint16StringNull(m_description); b >> m_size; // total size of transfer b >> m_port; b.advance(2); // unknown } void FTICQSubType::ParseBodyUINACK(Buffer& b) { b.UnpackUint16StringNull(m_message); b >> m_revport; // network order b.advance(2); // unknown b.UnpackUint16StringNull(m_description); b >> m_size; // total size of transfer b >> m_port; b.advance(2); // unknown } void FTICQSubType::OutputBodyUIN(Buffer& b) const { b.PackUint16StringNull(m_message); b << m_revport; b << (unsigned short)0; b.PackUint16StringNull(m_description); b << m_size; b << m_port; b << (unsigned short)0; } void FTICQSubType::OutputBodyUINACK(Buffer& b) const { b.PackUint16StringNull(m_message); b << m_revport; b << (unsigned short)0; b.PackUint16StringNull(m_description); b << m_size; b << m_port; b << (unsigned short)0; } unsigned short FTICQSubType::Length() const { return 0; } unsigned char FTICQSubType::getType() const { return MSG_Type_FT; } unsigned int FTICQSubType::getSize() const { return m_size; } unsigned short FTICQSubType::getPort() const { return m_port; } unsigned short FTICQSubType::getRevPort() const { return ( ((m_revport & 0xFF) << 8) + ((m_revport >> 8) &0xFF) ); } std::string FTICQSubType::getMessage() const { return m_message; } std::string FTICQSubType::getDescription() const { return m_description; } void FTICQSubType::setMessage(const string& msg) { m_message = msg; } void FTICQSubType::setDescription(const string& desc) { m_description = desc; } void FTICQSubType::setPort(unsigned short port) { m_port = port; } void FTICQSubType::setRevPort(unsigned short port) { m_revport = ((port >> 8) & 0xFF) + ((port & 0xFF) << 8); } void FTICQSubType::setSize(unsigned int size) { m_size = size; } ContactICQSubType::ContactICQSubType() { } ContactICQSubType::ContactICQSubType(const std::list &content) : m_content(content) { } void ContactICQSubType::ParseBodyUIN(Buffer& b) { int pos, n; string text; b.UnpackUint16StringNull(text); if((pos = text.find("\xfe")) != -1) { n = atoi(text.substr(0, pos).c_str()); text.erase(0, pos+1); list fields; string_split(text, string("\xfe"), n, fields); // handle odd number of fields (last one is 0) in offline contact messages (possibly only when sent from Mac ICQ) if ( 0!=fields.size()%2 ) fields.pop_back(); list::iterator iter = fields.begin(); while(iter != fields.end()) { ContactRef ct(new Contact(atoi((iter++)->c_str()))); ct->setAlias(*(iter++)); m_content.push_back(ct); } } } void ContactICQSubType::OutputBodyUIN(Buffer& b) const { ostringstream ostr; ostr << m_content.size() << (unsigned char)0xfe; list::const_iterator curr = m_content.begin(); while(curr != m_content.end()) { ostr << (*curr)->getUIN() << (unsigned char)0xfe << (*curr)->getAlias() << (unsigned char)0xfe; ++curr; } b.PackUint16StringNull( ostr.str() ); } unsigned short ContactICQSubType::Length() const { return 0; } unsigned char ContactICQSubType::getType() const { return MSG_Type_Contact; } std::list ContactICQSubType::getContacts() const { return m_content; } void string_split(const string& in, const string& sep, int count, std::list& fields) { // oh for perl.. :-) string::size_type lpos = 0, pos = 0; while (lpos != in.size()) { pos = in.find(sep, lpos); fields.push_back(in.substr(lpos, pos-lpos)); if (pos == string::npos) { lpos = in.size(); } else { lpos = pos + sep.size(); } } // add blank fields if necessary count -= fields.size(); while(count > 0) { fields.push_back(string()); --count; } } } centerim-4.22.10/libicq2000/src/ContactList.cpp0000644000175000001440000000576011461606612015705 00000000000000/* * ContactList * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "ContactList.h" #include "events.h" using std::string; namespace ICQ2000 { ContactList::ContactList() { } ContactList::ContactList(const ContactList& cl) : m_cmap(cl.m_cmap) { } ContactList::ContactList(ContactRef ct) { add(ct); } ContactRef ContactList::operator[](unsigned int uin) { return lookup_uin(uin); } ContactRef ContactList::lookup_uin(unsigned int uin) { if (m_cmap.count(uin) != 0) return (*(m_cmap.find(uin))).second; return NULL; } ContactRef ContactList::lookup_mobile(const string& m) { iterator curr = begin(); while (curr != end()) { if ((*curr)->getNormalisedMobileNo() == m) return (*curr); ++curr; } return NULL; } ContactRef ContactList::lookup_email(const string& em) { iterator curr = begin(); while (curr != end()) { if ((*curr)->getEmail() == em) return (*curr); ++curr; } return NULL; } ContactRef ContactList::add(ContactRef ct) { m_cmap.insert( std::make_pair(ct->getUIN(), ct) ); return ct; } void ContactList::remove(unsigned int uin) { if (m_cmap.count(uin) != 0) { m_cmap.erase(uin); } } bool ContactList::empty() const { return m_cmap.empty(); } unsigned int ContactList::size() const { return m_cmap.size(); } bool ContactList::exists(unsigned int uin) { return (m_cmap.count(uin) != 0); } bool ContactList::mobile_exists(const string& m) { iterator curr = begin(); while (curr != end()) { if ((*curr)->getNormalisedMobileNo() == m) return true; ++curr; } return false; } bool ContactList::email_exists(const string& em) { iterator curr = begin(); while (curr != end()) { if ((*curr)->getEmail() == em) return true; ++curr; } return false; } ContactList::iterator ContactList::begin() { return iterator(m_cmap.begin()); } ContactList::iterator ContactList::end() { return iterator(m_cmap.end()); } ContactList::const_iterator ContactList::begin() const { return const_iterator(m_cmap.begin()); } ContactList::const_iterator ContactList::end() const { return const_iterator(m_cmap.end()); } } centerim-4.22.10/libicq2000/src/SNAC-SRV.cpp0000644000175000001440000007133111461606612014647 00000000000000/* * SNAC - Server * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SNAC-SRV.h" #include #include "sstream_fix.h" #include "TLV.h" #include "Xml.h" #include "time_extra.h" using std::string; using std::auto_ptr; using std::istringstream; namespace ICQ2000 { // --------------------- Server (Family 0x0015) SNACs --------- SrvSendSNAC::SrvSendSNAC(const string& text, const string& destination, unsigned int senders_UIN, const string& senders_name, bool delrpt) : m_text(text), m_destination(destination), m_senders_name(senders_name), m_senders_UIN(senders_UIN), m_delivery_receipt(delrpt) { } void SrvSendSNAC::OutputBody(Buffer& b) const { /* * Sending SMS messages * This is the biggest hodge-podge of a mess you * could imagine in a protocol, a mix of Big and Little Endian, * AIM TLVs and ICQ binary data and add in some XML * to top it all off. :-) */ XmlBranch xmltree("icq_sms_message"); xmltree.pushnode(new XmlLeaf("destination",m_destination)); xmltree.pushnode(new XmlLeaf("text",m_text)); xmltree.pushnode(new XmlLeaf("codepage","1252")); xmltree.pushnode(new XmlLeaf("senders_UIN",Contact::UINtoString(m_senders_UIN))); xmltree.pushnode(new XmlLeaf("senders_name",m_senders_name)); xmltree.pushnode(new XmlLeaf("delivery_receipt",(m_delivery_receipt ? "Yes" : "No"))); /* Time string, format: Wkd, DD Mnm YYYY HH:MM:SS TMZ */ char timestr[30]; time_t t; struct tm *tm; time(&t); tm = gmtime(&t); strftime(timestr, 30, "%a, %d %b %Y %T %Z", tm); xmltree.pushnode(new XmlLeaf("time",string(timestr))); string xmlstr = xmltree.toString(0); // this is a TLV header b << (unsigned short)0x0001; b << (unsigned short)(xmlstr.size()+37); b.setLittleEndian(); b << (unsigned short)(xmlstr.size()+35); b << m_senders_UIN; // think this is the message type b << (unsigned short)2000; // think this is a request id of sorts b << (unsigned short)m_requestID; /* low word of the request ID */ b.setBigEndian(); // SMS send subtype b << (unsigned short)0x8214; // not sure about what this means b << (unsigned short)0x0001; b << (unsigned short)0x0016; for(int a = 0; a < 16; a++) b << (unsigned char)0x00; b << (unsigned short)0x0000; b.PackUint16StringNull(xmlstr); } SrvRequestOfflineSNAC::SrvRequestOfflineSNAC(unsigned int uin) : m_uin(uin) { } void SrvRequestOfflineSNAC::OutputBody(Buffer& b) const { // this is a TLV header b << (unsigned short)0x0001 << (unsigned short)0x000a; b.setLittleEndian(); b << (unsigned short)0x0008; b << m_uin; // message type b << (unsigned short)60; // a request id b << (unsigned short)m_requestID; /* low word of the request ID */ } SrvAckOfflineSNAC::SrvAckOfflineSNAC(unsigned int uin) : m_uin(uin) { } void SrvAckOfflineSNAC::OutputBody(Buffer& b) const { // this is a TLV header b << (unsigned short)0x0001 << (unsigned short)0x000a; b.setLittleEndian(); b << (unsigned short)0x0008; b << m_uin; // message type b << (unsigned short)62; // a request id b << (unsigned short)m_requestID; /* low word of the request ID */ } SrvRequestSimpleUserInfo::SrvRequestSimpleUserInfo(unsigned int my_uin, unsigned int user_uin) : m_my_uin(my_uin), m_user_uin(user_uin) { } void SrvRequestSimpleUserInfo::OutputBody(Buffer& b) const { b << (unsigned short)0x0001 << (unsigned short)0x0010; b.setLittleEndian(); b << (unsigned short)0x000e; b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)1311 /* subtype (unsigned short)1311 */ << m_user_uin; } SrvRequestShortWP::SrvRequestShortWP (unsigned int my_uin, const string& nickname, const string& firstname, const string& lastname) : m_my_uin(my_uin), m_nickname(nickname), m_firstname(firstname), m_lastname(lastname) { } void SrvRequestShortWP::OutputBody(Buffer& b) const { b << (unsigned short)0x0001; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x0515; /* subtype wp-short-request */ b.PackUint16StringNull(m_firstname); b.PackUint16StringNull(m_lastname); b.PackUint16StringNull(m_nickname); b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } SrvRequestFullWP::SrvRequestFullWP (unsigned int my_uin, const string& nickname, const string& firstname, const string& lastname, const string& email, unsigned short min_age, unsigned short max_age, unsigned char sex, unsigned char language, const string& city, const string& state, unsigned short country, const string& company_name, const string& department, const string& position, bool only_online) : m_my_uin(my_uin), m_nickname(nickname), m_firstname(firstname), m_lastname(lastname), m_email(email), m_min_age(min_age), m_max_age(max_age), m_sex(sex), m_language(language), m_city(city), m_state(state), m_company_name(company_name), m_department(department), m_position(position), m_country(country), m_only_online(only_online) { } void SrvRequestFullWP::OutputBody(Buffer& b) const { b << (unsigned short)0x0001; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x0533; /* subtype wp-full-request */ b.PackUint16StringNull(m_firstname); b.PackUint16StringNull(m_lastname); b.PackUint16StringNull(m_nickname); b.PackUint16StringNull(m_email); b << (unsigned short)m_min_age; // minimum age b << (unsigned short)m_max_age; // maximum age b << (unsigned char)m_sex; // sex b << (unsigned char)m_language; // language b.PackUint16StringNull(m_city); // city b.PackUint16StringNull(m_state); // state b << (unsigned short)m_country; // country b.PackUint16StringNull(m_company_name); // company name b.PackUint16StringNull(m_department); // department b.PackUint16StringNull(m_position); // position b << (unsigned char)0x00; // occupation b << (unsigned short)0x0000; // past info category b.PackUint16StringNull(""); // description b << (unsigned short)0x0000; // interests category b.PackUint16StringNull(""); // description b << (unsigned short)0x0000; // affiliation/organization b.PackUint16StringNull(""); // description b << (unsigned short)0x0000; // homepage category b.PackUint16StringNull(""); // description b << (unsigned char)(m_only_online ? 0x01 : 0x00); // only-online flag b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } SrvRequestKeywordSearch::SrvRequestKeywordSearch(unsigned int my_uin, const string& keyword) : m_my_uin(my_uin), m_keyword(keyword) { } void SrvRequestKeywordSearch::OutputBody(Buffer& b) const { b << (unsigned short)0x0001; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x055F /* subtype keyword-search */ << (unsigned short)0x0226; /* unknown */ Buffer::marker m3 = b.getAutoSizeShortMarker(); b.PackUint16StringNull(m_keyword); b.setAutoSizeMarker(m3); b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } SrvRequestDetailUserInfo::SrvRequestDetailUserInfo(unsigned int my_uin, unsigned int user_uin) : m_my_uin(my_uin), m_user_uin(user_uin) { } void SrvRequestDetailUserInfo::OutputBody(Buffer& b) const { b << (unsigned short)0x0001 << (unsigned short)0x0010; b.setLittleEndian(); b << (unsigned short)0x000e; b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x04b2 /* subtype (unsigned short)1311 */ << m_user_uin; } SrvUpdateMainHomeInfo::SrvUpdateMainHomeInfo(unsigned int my_uin, const Contact::MainHomeInfo& main_home_info) : m_my_uin(my_uin), m_main_home_info(main_home_info) { } void SrvUpdateMainHomeInfo::OutputBody(Buffer& b) const { b << (unsigned short)0x0001; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x03ea; /* subtype */ b.PackUint16StringNull(m_main_home_info.alias); // alias b.PackUint16StringNull(m_main_home_info.firstname); // first name b.PackUint16StringNull(m_main_home_info.lastname); // last name b.PackUint16StringNull(m_main_home_info.email); // email b.PackUint16StringNull(m_main_home_info.city); // city b.PackUint16StringNull(m_main_home_info.state); // state b.PackUint16StringNull(m_main_home_info.phone); // phone b.PackUint16StringNull(m_main_home_info.fax); // fax b.PackUint16StringNull(m_main_home_info.street); // street b.PackUint16StringNull(m_main_home_info.getMobileNo()); // cellular b.PackUint16StringNull(m_main_home_info.zip); // zip b << m_main_home_info.country; b << m_main_home_info.timezone; unsigned char publish_email = 0; b << publish_email; b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } SrvUpdateWorkInfo::SrvUpdateWorkInfo(unsigned int my_uin, const Contact::WorkInfo& work_info) : m_my_uin(my_uin), m_work_info(work_info) { } void SrvUpdateWorkInfo::OutputBody(Buffer& b) const { b << (unsigned short)0x0001; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x03f3; /* subtype */ b.PackUint16StringNull(m_work_info.city); // city b.PackUint16StringNull(m_work_info.state); // state b << (unsigned short)0x0000 << (unsigned short)0x0000; b.PackUint16StringNull(m_work_info.street); // street b.PackUint16StringNull(m_work_info.zip); // zip b << m_work_info.country; // country-code b.PackUint16StringNull(m_work_info.company_name); // company: name b.PackUint16StringNull(m_work_info.company_dept); // company: department b.PackUint16StringNull(m_work_info.company_position); // company: position b << (unsigned short)0x0000; b.PackUint16StringNull(m_work_info.company_web); // company: homepage b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } SrvUpdateHomepageInfo::SrvUpdateHomepageInfo(unsigned int my_uin, const Contact::HomepageInfo& homepage_info) : m_my_uin(my_uin), m_homepage_info(homepage_info) { } void SrvUpdateHomepageInfo::OutputBody(Buffer& b) const { b << (unsigned short)0x0001; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x03fd; /* subtype */ b << (unsigned char)m_homepage_info.age; // age b << (unsigned char)0x00; b << (unsigned char)m_homepage_info.sex; // sex-code b.PackUint16StringNull(m_homepage_info.homepage); b << (unsigned short)m_homepage_info.birth_year; b << (unsigned char)m_homepage_info.birth_month; b << (unsigned char)m_homepage_info.birth_day; b << (unsigned char)m_homepage_info.lang1; b << (unsigned char)m_homepage_info.lang2; b << (unsigned char)m_homepage_info.lang3; b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } SrvUpdateAboutInfo::SrvUpdateAboutInfo(unsigned int my_uin, const string& about_info) : m_my_uin(my_uin), m_about_info(about_info) { } void SrvUpdateAboutInfo::OutputBody(Buffer& b) const { b << (unsigned short)0x0001; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x0406; /* subtype */ b.PackUint16StringNull(m_about_info); b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } SrvRequestRandomChat::SrvRequestRandomChat(unsigned int my_uin, unsigned short random_group) : m_my_uin(my_uin), m_random_group(random_group) { } void SrvRequestRandomChat::OutputBody(Buffer& b) const { b << (unsigned short)0x0001; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x074E; /* subtype */ b << (unsigned short)m_random_group; b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } SrvSetRandomChatGroup::SrvSetRandomChatGroup(unsigned int my_uin, unsigned short random_group) : m_my_uin(my_uin), m_random_group(random_group) { } void SrvSetRandomChatGroup::OutputBody(Buffer& b) const { int i; b << (unsigned short)0x0001; Buffer::marker m1 = b.getAutoSizeShortMarker(); b.setLittleEndian(); Buffer::marker m2 = b.getAutoSizeShortMarker(); b << m_my_uin; b << (unsigned short)2000 /* type 9808 */ << (unsigned short)m_requestID /* low word of the request ID */ << (unsigned short)0x0758; /* subtype */ b << (unsigned short)m_random_group; b << (unsigned short) 0x0000; b << (unsigned short) 0x0220; for(i = 0; i < 6; i++) b << (unsigned short) 0x0000; b << (char) 0x0; for(i = 0; i < 3; i++) b << (unsigned short) 0x0000; b << (char) 0x50; for(i = 0; i < 3; i++) b << (char) 0x0; b << (char) 0x03; for(i = 0; i < 3; i++) b << (char) 0x0; b.setAutoSizeMarker(m1); b.setAutoSizeMarker(m2); } SrvResponseSNAC::SrvResponseSNAC() : m_icqsubtype(NULL) { } SrvResponseSNAC::~SrvResponseSNAC() { if (m_icqsubtype != NULL) delete m_icqsubtype; } void SrvResponseSNAC::ParseBody(Buffer& b) { /* It is worth making the distinction between * sms responses and sms delivery responses * - an sms response is sent on this channel always * after an sms is sent * - an sms delivery response is sent from the mobile * if requested and arrives as SNAC 0x0004 0x0007 */ // a TLV header unsigned short type, length; b >> type; b >> length; b.setLittleEndian(); // the length again in little endian b >> length; unsigned int uin; b >> uin; /* Command type: * 65 (dec) = An Offline message * 66 (dec) = Offline Messages Finish * 2010 (dec) = ICQ Extended response * others.. ?? */ unsigned short command_type; b >> command_type; unsigned short request_id; b >> request_id; if (command_type == 65) { ParseOfflineMessage(b); } else if (command_type == 66) { m_type = OfflineMessagesComplete; unsigned char waste_char; b >> waste_char; } else if (command_type == 2010) { ParseICQResponse(b); } else { throw ParseException("Unknown command type for Server Response SNAC"); } } void SrvResponseSNAC::ParseOfflineMessage(Buffer& b) { b >> m_sender_UIN; unsigned short year; unsigned char month, day, hour, minute; b >> year >> month >> day >> hour >> minute; struct tm timetm; timetm.tm_sec = 0; timetm.tm_min = minute; timetm.tm_hour = hour; timetm.tm_mday = day; timetm.tm_mon = month-1; timetm.tm_year = year-1900; timetm.tm_isdst = 0; m_time = gmt_mktime(&timetm); m_type = OfflineMessage; m_icqsubtype = ICQSubType::ParseICQSubType(b, false, false); /* offline message is non-advanced, and not an ack */ b.advance(2); // unknown if (m_icqsubtype != NULL && dynamic_cast(m_icqsubtype) != NULL) { UINICQSubType *ust = dynamic_cast(m_icqsubtype); ust->setSource( m_sender_UIN ); } } void SrvResponseSNAC::ParseICQResponse(Buffer& b) { unsigned short subtype; b >> subtype; switch(subtype) { case SrvResponse_Error: ParseSMSError(b); // fix break; case SrvResponse_SMS_Done: ParseSMSResponse(b); break; case SrvResponse_SimpleUI: case SrvResponse_SimpleUI_Done: case SrvResponse_SearchUI: case SrvResponse_SearchUI_Done: ParseSimpleUserInfo(b, subtype); break; case SrvResponse_MainHomeInfo: case SrvResponse_WorkInfo: case SrvResponse_HomePageInfo: case SrvResponse_AboutInfo: case SrvResponse_EmailInfo: case SrvResponse_InterestInfo: case SrvResponse_BackgroundInfo: case SrvResponse_Unknown: ParseDetailedUserInfo(b, subtype); break; case SrvResponse_AckMainHomeInfoChange: case SrvResponse_AckWorkInfoChange: case SrvResponse_AckHomepageInfoChange: case SrvResponse_AckAboutInfoChange: ParseInfoChangeAck(b, subtype); break; case SrvResponse_RandomChatFound: ParseRandomChatFound(b); break; case SrvResponse_AckRandomGroupSet: ParseRandomGroupSetAck(b); break; default: throw ParseException("Unknown ICQ subtype for Server response SNAC"); } } void SrvResponseSNAC::ParseInfoChangeAck(Buffer &b, unsigned short subtype) { switch(subtype) { case SrvResponse_AckMainHomeInfoChange: m_type = AckMainHomeInfoChange; break; case SrvResponse_AckWorkInfoChange: m_type = AckWorkInfoChange; break; case SrvResponse_AckHomepageInfoChange: m_type = AckHomepageInfoChange; break; case SrvResponse_AckAboutInfoChange: m_type = AckAboutInfoChange; break; default: throw ParseException("Unknown info change acknowledgment"); } b.advance(1); // there's a 0x0a there if (b.beforeEnd()) throw ParseException("Extra data at info change acknowledgment (could be an SMS response)"); } void SrvResponseSNAC::ParseSMSError(Buffer& b) { m_type = SMS_Error; // to do - maybe? } void SrvResponseSNAC::ParseSMSResponse(Buffer& b) { /* Not sure what the difference between 100 and 150 is * when successful it sends the erroneous 100 and then 150 * otherwise only 150 I think */ m_type = SMS_Response; /* Don't know what the next lot of data * means: * 0a 00 01 00 08 00 01 */ unsigned char waste_char; for (int a = 0; a < 7; a++) b >> waste_char; b.setBigEndian(); string tag; b >> tag; string xmlstr; b >> xmlstr; string::iterator s = xmlstr.begin(); auto_ptr top(XmlNode::parse(s, xmlstr.end())); if (top.get() == NULL) throw ParseException("Couldn't parse xml data in Server Response SNAC"); if (top->getTag() != "sms_response") throw ParseException("No tag found in xml data"); XmlBranch *sms_response = dynamic_cast(top.get()); if (sms_response == NULL) throw ParseException("No tags found in xml data"); XmlLeaf *source = sms_response->getLeaf("source"); if (source != NULL) m_source = source->getValue(); XmlLeaf *deliverable = sms_response->getLeaf("deliverable"); m_deliverable = false; m_smtp_deliverable = false; if (deliverable != NULL) { if (deliverable->getValue() == "Yes") m_deliverable = true; if (deliverable->getValue() == "SMTP") { m_deliverable = false; m_smtp_deliverable = true; } } if (m_deliverable) { // -- deliverable = Yes -- XmlLeaf *network = sms_response->getLeaf("network"); if (network != NULL) m_network = network->getValue(); XmlLeaf *message_id = sms_response->getLeaf("message_id"); if (message_id != NULL) m_message_id = message_id->getValue(); XmlLeaf *messages_left = sms_response->getLeaf("messages_left"); if (messages_left != NULL) m_messages_left = messages_left->getValue(); // always 0, unsurprisingly } else if (m_smtp_deliverable) { // -- deliverable = SMTP -- XmlLeaf *smtp_from = sms_response->getLeaf("from"); if (smtp_from != NULL) m_smtp_from = smtp_from->getValue(); XmlLeaf *smtp_to = sms_response->getLeaf("to"); if (smtp_to != NULL) m_smtp_to = smtp_to->getValue(); XmlLeaf *smtp_subject = sms_response->getLeaf("subject"); if (smtp_subject != NULL) m_smtp_subject = smtp_subject->getValue(); } else { // -- deliverable = No -- // should be an tag XmlBranch *error = sms_response->getBranch("error"); if (error != NULL) { // should be an tag XmlLeaf *error_id = error->getLeaf("id"); if (error_id != NULL) { // convert error id to a number istringstream istr(error_id->getValue()); m_error_id = 0; istr >> m_error_id; } // should also be a branch XmlBranch *params = error->getBranch("params"); if (params != NULL) { // assume only one tag XmlLeaf *param = params->getLeaf("param"); if (param != NULL) m_error_param = param->getValue(); } } // end tag } // end deliverable = No } void SrvResponseSNAC::ParseDetailedUserInfo(Buffer& b, unsigned short subtype) { unsigned char wb; b >> wb; // status code ? switch(subtype) { case SrvResponse_MainHomeInfo: { string s; b.UnpackUint16StringNull(m_main_home_info.alias); // alias b.UnpackUint16StringNull(m_main_home_info.firstname); // first name b.UnpackUint16StringNull(m_main_home_info.lastname); // last name b.UnpackUint16StringNull(m_main_home_info.email); // email b.UnpackUint16StringNull(m_main_home_info.city); // city b.UnpackUint16StringNull(m_main_home_info.state); // state b.UnpackUint16StringNull(m_main_home_info.phone); // phone b.UnpackUint16StringNull(m_main_home_info.fax); // fax b.UnpackUint16StringNull(m_main_home_info.street); // street b.UnpackUint16StringNull(s); // cellular m_main_home_info.setMobileNo(s); b.UnpackUint16StringNull(m_main_home_info.zip); // zip unsigned short country; b >> country; m_main_home_info.country = Country(country); signed char timezone; b >> timezone; m_main_home_info.timezone = Timezone(timezone); b.advance(1); // some end marker? unsigned short wi; b >> wi; m_type = RMainHomeInfo; break; } case SrvResponse_HomePageInfo: { b >> m_homepage_info.age; unsigned char unk; b >> unk; unsigned char sex; b >> sex; m_homepage_info.sex = Sex(sex); b.UnpackUint16StringNull(m_homepage_info.homepage); b >> m_homepage_info.birth_year; b >> m_homepage_info.birth_month; b >> m_homepage_info.birth_day; unsigned char lang1, lang2, lang3; b >> lang1; m_homepage_info.lang1 = Language(lang1); b >> lang2; m_homepage_info.lang2 = Language(lang2); b >> lang3; m_homepage_info.lang3 = Language(lang3); b >> wb; b >> wb; m_type = RHomepageInfo; break; } case SrvResponse_EmailInfo: { unsigned char n; b >> n; while(n > 0) { string s; b.UnpackUint16StringNull(s); m_email_info.addEmailAddress(s); --n; } m_type = REmailInfo; break; } case SrvResponse_WorkInfo: { b.UnpackUint16StringNull(m_work_info.city); b.UnpackUint16StringNull(m_work_info.state); string s; // these fields are incorrect in the spec b.UnpackUint16StringNull(s); b.UnpackUint16StringNull(s); b.UnpackUint16StringNull(m_work_info.street); b.UnpackUint16StringNull(m_work_info.zip); b >> m_work_info.country; b.UnpackUint16StringNull(m_work_info.company_name); b.UnpackUint16StringNull(m_work_info.company_dept); b.UnpackUint16StringNull(m_work_info.company_position); b.advance(2); b.UnpackUint16StringNull(m_work_info.company_web); m_type = RWorkInfo; break; } case SrvResponse_AboutInfo: b.UnpackUint16StringNull(m_about); m_type = RAboutInfo; break; case SrvResponse_InterestInfo: { unsigned char n; b >> n; while (n > 0) { unsigned short cat; string spec; b >> cat; b.UnpackUint16StringNull(spec); m_personal_interest_info.addInterest(cat, spec); --n; } m_type = RInterestInfo; break; } case SrvResponse_BackgroundInfo: { unsigned char n; b >> n; while (n > 0) { unsigned short cat; string s; b >> cat; b.UnpackUint16StringNull(s); m_background_info.addSchool(cat, s); --n; } unsigned char junk; b >> junk; m_type = RBackgroundInfo; break; } case SrvResponse_Unknown: { unsigned short ws; b >> ws; m_type = RUnknown; break; } default: throw ParseException("Unknown mode for Detailed user info parsing"); } } void SrvResponseSNAC::ParseSimpleUserInfo(Buffer& b, unsigned short subtype) { if (subtype == SrvResponse_SimpleUI || subtype == SrvResponse_SimpleUI_Done) m_type = SimpleUserInfo; if (subtype == SrvResponse_SearchUI || subtype == SrvResponse_SearchUI_Done) m_type = SearchSimpleUserInfo; if (subtype == SrvResponse_SimpleUI_Done || subtype == SrvResponse_SearchUI_Done) m_last_in_search = true; else m_last_in_search = false; unsigned char wb; b >> wb; /* * status code * = 0a usually * = 32 on returning no contacts */ if (wb == 0x32 || wb == 0x14) { m_empty_contact = true; return; } m_empty_contact = false; unsigned short ws; b >> ws; // unknown b >> m_uin; b.UnpackUint16StringNull(m_alias); b.UnpackUint16StringNull(m_firstname); b.UnpackUint16StringNull(m_lastname); b.UnpackUint16StringNull(m_email); // Auth required b >> wb; if (wb == 0) m_authreq = true; else m_authreq = false; // Status unsigned char st; b >> st; switch(st) { case 0: m_status = STATUS_OFFLINE; break; case 1: m_status = STATUS_ONLINE; break; case 2: // status disabled m_status = STATUS_OFFLINE; break; default: m_status = STATUS_OFFLINE; } b >> wb; // unknown if (b.remains() == 3 || b.remains() == 7) { b >> m_sex; b >> m_age; b >> wb; // unknown } if (subtype == SrvResponse_SimpleUI_Done || subtype == SrvResponse_SearchUI_Done) { b >> m_more_results; } } void SrvResponseSNAC::ParseRandomChatFound(Buffer& b) { unsigned char wb; m_empty_contact = false; m_type = RandomChatFound; b >> wb; b >> m_uin; b >> wb; } void SrvResponseSNAC::ParseRandomGroupSetAck(Buffer& b) { m_type = RandomGroupSet; } } centerim-4.22.10/libicq2000/src/SNAC-BUD.h0000644000175000001440000000571311461606612014255 00000000000000/* * SNAC - Buddy (Contact) list management * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SNAC_BUD_H #define SNAC_BUD_H #include #include #include "SNAC-base.h" #include "Contact.h" #include "ContactList.h" #include "ContactTree.h" #include "UserInfoBlock.h" namespace ICQ2000 { // Buddy stuff (Family 0x0003) const unsigned short SNAC_BUD_Error = 0x0001; const unsigned short SNAC_BUD_AddBuddy = 0x0004; const unsigned short SNAC_BUD_RemoveBuddy = 0x0005; const unsigned short SNAC_BUD_Online = 0x000b; const unsigned short SNAC_BUD_Offline = 0x000c; // ----------------- Buddy List (Family 0x0003) SNACs ----------- class BUDFamilySNAC : virtual public SNAC { public: unsigned short Family() const { return SNAC_FAM_BUD; } }; class AddBuddySNAC : public BUDFamilySNAC, public OutSNAC { private: std::list m_buddy_list; protected: void OutputBody(Buffer& b) const; public: AddBuddySNAC(); AddBuddySNAC(const ContactTree& l); AddBuddySNAC(const ContactRef& c); void addBuddy(const ContactRef& c); unsigned short Subtype() const { return SNAC_BUD_AddBuddy; } }; class RemoveBuddySNAC : public BUDFamilySNAC, public OutSNAC { private: std::list m_buddy_list; protected: void OutputBody(Buffer& b) const; public: RemoveBuddySNAC(); RemoveBuddySNAC(const ContactList& l); RemoveBuddySNAC(const ContactRef& c); void removeBuddy(const ContactRef& c); unsigned short Subtype() const { return SNAC_BUD_RemoveBuddy; } }; class BuddyOnlineSNAC : public BUDFamilySNAC, public InSNAC { private: UserInfoBlock m_userinfo; protected: void ParseBody(Buffer& b); public: BuddyOnlineSNAC(); const UserInfoBlock& getUserInfo() const { return m_userinfo; } unsigned short Subtype() const { return SNAC_BUD_Online; } }; class BuddyOfflineSNAC : public BUDFamilySNAC, public InSNAC { private: UserInfoBlock m_userinfo; protected: void ParseBody(Buffer& b); public: BuddyOfflineSNAC(); UserInfoBlock getUserInfo() const { return m_userinfo; } unsigned short Subtype() const { return SNAC_BUD_Offline; } }; } #endif centerim-4.22.10/libicq2000/src/MessageHandler.cpp0000644000175000001440000004333211461606612016335 00000000000000/* * Message Handler * * Copyright (C) 2002 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "MessageHandler.h" #include "ContactTree.h" #include "SNAC-MSG.h" #include "SNAC-SRV.h" #include "sstream_fix.h" #include "Translator.h" using std::string; using std::ostringstream; using std::endl; namespace ICQ2000 { MessageHandler::MessageHandler(ContactRef self, ContactTree *cl, Translator * & tr) : m_self_contact(self), m_contact_list(cl), m_translator(tr) { } /* * This method handles: * - Receiving incoming messages * - Signalling the message * - Setting up the UINICQSubType for the ACK * (the actual ACK is sent in the caller - dependent on whether it * was direct/thru server) */ bool MessageHandler::handleIncoming(ICQSubType *ist, time_t t) { ContactRef contact; bool advanced, ack = false; if (ist->getType() == MSG_Type_FT) { ostringstream ostr; ostr << "FileTransfer request through server." <(ist)); return false; } UINICQSubType *uist = dynamic_cast(ist); MessageEvent *ev = ICQSubTypeToEvent(ist, contact, advanced); ICQMessageEvent *mev = dynamic_cast(ev); Status st = m_self_contact->getStatus(); if (advanced) { // update the status of the contact with that sent in the packet unsigned short s = uist->getStatus(); contact->setStatus( Contact::MapICQStatusToStatus(s), Contact::MapICQStatusToInvisible(s) ); } else { /* mark all non-advanced (ICQ) messages when in Occupied/DND as 'to * contact list', so they can be guaranteed to arrive, as they should * never be turned down (no ack is sent back) */ if (mev != NULL && (st == STATUS_OCCUPIED || st == STATUS_DND)) mev->setToContactList(true); } if (t == 0) t = ev->getTime(); else ev->setTime(t); ev->setDelivered(true); // default to true - for clients that ignore this functionality if (ev->getType() != MessageEvent::AwayMessage) { messaged.emit(ev); contact->set_last_message_time( t ); } else { contact->set_last_away_msg_check_time( t ); ostringstream ostr; ostr << "Away_msg respons to: " << contact->getAlias() << endl; SignalLog( LogEvent::INFO, ostr.str() ); } if (advanced) { /* All these operations only apply to advanced messages - * UINICQSubType messages, those that are associated to a UIN and * that were sent as an advanced message (through server or * direct, NOT offline), and consequently will the ack'ed. */ /* request away message if we are not online */ if (st != STATUS_ONLINE && advanced) { want_auto_resp.emit(mev); uist->setAwayMessage( m_translator->client_to_server(mev->getAwayMessage(), ENCODING_CONTACT_LOCALE, contact ) ); } else { uist->setAwayMessage( "" ); } /* update the UINICQSubType */ uist->setACK(true); ack = true; if (ev->isDelivered()) { /* set accept-status of ACK */ switch(st) { case STATUS_ONLINE: uist->setStatus(AcceptStatus_Online); break; case STATUS_AWAY: uist->setStatus(AcceptStatus_Away); break; case STATUS_NA: uist->setStatus(AcceptStatus_NA); break; case STATUS_OCCUPIED: uist->setStatus(AcceptStatus_Occ_Accept); break; default: uist->setStatus(AcceptStatus_Online); } } else { MessageEvent::DeliveryFailureReason r = ev->getDeliveryFailureReason(); /* set accept-status of ACK */ switch(r) { case MessageEvent::Failed_Denied: uist->setStatus(AcceptStatus_Denied); break; case MessageEvent::Failed_Occupied: uist->setStatus(AcceptStatus_Occupied); break; case MessageEvent::Failed_DND: uist->setStatus(AcceptStatus_DND); break; case MessageEvent::Failed_Ignored: ack = false; break; default: uist->setStatus(AcceptStatus_Denied); } } } // delete the temporary event delete ev; // whether the message needs ack'ing return ack; } FileTransferEvent* MessageHandler::handleIncomingFT(FTICQSubType *ist, bool direct) { ContactRef contact = lookupUIN( ist->getSource() ); FileTransferEvent *ev = new FileTransferEvent(contact, ist->getMessage(), ist->getDescription(), ist->getSize(), ist->getSeqNum()); ev->setDelivered(true); ev->setDirect(direct); ev->setFinished(true); ostringstream ostr; ostr << "Incoming file transfer received."; SignalLog(LogEvent::INFO, ostr.str() ); filetransfer_incoming_signal.emit(ev); return ev; } /* * This method handles: * - Setting up the UINICQSubType for Sending messages * (the actual message is sent by the caller - * dependent on whether it is going direct/thru server) */ UINICQSubType* MessageHandler::handleOutgoing(MessageEvent *ev) { UINICQSubType *icq = EventToUINICQSubType(ev); /* our status is sent in packets */ icq->setStatus( Contact::MapStatusToICQStatus(m_self_contact->getStatus(), m_self_contact->isInvisible() ) ); icq->setDestination( ev->getContact()->getUIN() ); icq->setSource( m_self_contact->getUIN() ); return icq; } void MessageHandler::handleIncomingFTACK(FileTransferEvent *ev, FTICQSubType *ft) { if ( ft->getStatus()==AcceptStatus_Online && ( ft->getPort() != 0 || ft->getRevPort() != 0 ) ) ev->setState(FileTransferEvent::ACCEPTED); else ev->setState(FileTransferEvent::REJECTED); ev->setRefusalMessage(ft->getMessage()); ev->setPort(ft->getPort()); if ( ev->getPort()==0 ) ev->setPort( ft->getRevPort() ); ostringstream ostr; ostr << "Incoming file transfer ACK: "; if (ev->getState() == FileTransferEvent::ACCEPTED) ostr << "Is Accepted to port: " << ev->getPort(); else ostr << "Is Rejected: " << ev->getRefusalMessage(); SignalLog(LogEvent::INFO, ostr.str() ); filetransfer_update_signal.emit(ev); } void MessageHandler::handleIncomingACK(MessageEvent *ev, UINICQSubType *icq) { ICQMessageEvent *aev = dynamic_cast(ev); if (aev == NULL) return; aev->setAwayMessage( m_translator->server_to_client( icq->getAwayMessage(), ENCODING_CONTACT_LOCALE, ev->getContact() ) ); aev->setFinished(true); switch(icq->getStatus()) { case AcceptStatus_Online: aev->setDelivered(true); break; case AcceptStatus_Denied: aev->setDelivered(false); aev->setDeliveryFailureReason(MessageEvent::Failed_Denied); break; case AcceptStatus_Away: aev->setDelivered(true); break; case AcceptStatus_Occupied: aev->setDelivered(false); aev->setDeliveryFailureReason(MessageEvent::Failed_Occupied); break; case AcceptStatus_DND: aev->setDelivered(false); aev->setDeliveryFailureReason(MessageEvent::Failed_DND); break; case AcceptStatus_Occ_Accept: aev->setDelivered(true); break; case AcceptStatus_NA: aev->setDelivered(true); break; default: { ostringstream ostr; ostr << "Unknown accept-status in ACK: " << icq->getStatus() << endl; SignalLog( LogEvent::WARN, ostr.str() ); } } if (aev->getType() == MessageEvent::AwayMessage) { // count any ack to an away message request as always delivered aev->setDelivered(true); } else if (aev->getType() == MessageEvent::FileTransfer) { handleIncomingFTACK(static_cast(ev), static_cast(icq)); aev->setDelivered(true); } messageack.emit(ev); } void MessageHandler::handleUpdateFT(FileTransferEvent *ev) { filetransfer_update_signal.emit(ev); } void MessageHandler::handleIncomingFTCancel(FileTransferEvent *ev) { ev->setState(FileTransferEvent::CANCELLED); ostringstream ostr; ostr << "FileTransfer cancel received" << endl; SignalLog( LogEvent::WARN, ostr.str() ); filetransfer_update_signal.emit(ev); } /** * Convert a UINICQSubType into an ICQMessageEvent */ ICQMessageEvent* MessageHandler::UINICQSubTypeToEvent(UINICQSubType *st, const ContactRef& contact) { ICQMessageEvent *e = NULL; unsigned short type = st->getType(); switch(type) { case MSG_Type_Normal: { NormalICQSubType *nst = static_cast(st); e = new NormalMessageEvent(contact, m_translator->server_to_client( nst->getMessage(), ENCODING_CONTACT_LOCALE, contact ), nst->isMultiParty() ); (static_cast(e))->setEncoding( nst->getEncoding() ); break; } case MSG_Type_URL: { URLICQSubType *ust = static_cast(st); e = new URLMessageEvent(contact, m_translator->server_to_client( ust->getMessage(), ENCODING_CONTACT_LOCALE, contact ), m_translator->server_to_client( ust->getURL(), ENCODING_CONTACT_LOCALE, contact )); break; } case MSG_Type_AuthReq: { AuthReqICQSubType *ust = static_cast(st); e = new AuthReqEvent(contact, m_translator->server_to_client( ust->getMessage(), ENCODING_CONTACT_LOCALE, contact ) ); break; } case MSG_Type_AuthRej: { AuthRejICQSubType *ust = static_cast(st); e = new AuthAckEvent(contact, m_translator->server_to_client( ust->getMessage(), ENCODING_CONTACT_LOCALE, contact ), false); break; } case MSG_Type_AuthAcc: { e = new AuthAckEvent(contact, true); e->getContact()->setAuthAwait(false); break; } case MSG_Type_AutoReq_Away: case MSG_Type_AutoReq_Occ: case MSG_Type_AutoReq_NA: case MSG_Type_AutoReq_DND: case MSG_Type_AutoReq_FFC: { e = new AwayMessageEvent(contact); break; } case MSG_Type_UserAdd: { e = new UserAddEvent(contact); break; } case MSG_Type_Contact: { ContactICQSubType *cst = static_cast(st); e = new ContactMessageEvent(contact, cst->getContacts()); break; } default: break; } // end of switch if (e != NULL) { e->setUrgent( st->isUrgent() ); e->setToContactList( st->isToContactList() ); } return e; } /** * Convert an ICQSubType into a MessageEvent */ MessageEvent* MessageHandler::ICQSubTypeToEvent(ICQSubType *st, ContactRef& contact, bool& adv) { MessageEvent *e = NULL; adv = false; switch(st->getType()) { case MSG_Type_Normal: case MSG_Type_URL: case MSG_Type_AuthReq: case MSG_Type_AuthRej: case MSG_Type_AuthAcc: case MSG_Type_AutoReq_Away: case MSG_Type_AutoReq_Occ: case MSG_Type_AutoReq_NA: case MSG_Type_AutoReq_DND: case MSG_Type_AutoReq_FFC: case MSG_Type_UserAdd: case MSG_Type_FT: case MSG_Type_Contact: { UINICQSubType *ist = static_cast(st); adv = ist->isAdvanced(); contact = lookupUIN( ist->getSource() ); e = UINICQSubTypeToEvent(ist, contact); break; } case MSG_Type_EmailEx: { // these come from 'magic' UIN 10 EmailExICQSubType *subtype = static_cast(st); std::string email = m_translator->server_to_client( subtype->getEmail(), ENCODING_ISO_8859_1, contact ); contact = lookupEmail( email, subtype->getSender() ); e = new EmailExEvent(contact, email, m_translator->server_to_client( subtype->getSender(), ENCODING_ISO_8859_1, contact ), m_translator->server_to_client( subtype->getMessage(), ENCODING_ISO_8859_1, contact )); break; } case MSG_Type_WebPager: { WebPagerICQSubType *subtype = static_cast(st); std::string email = m_translator->server_to_client( subtype->getEmail(), ENCODING_ISO_8859_1, contact ); contact = lookupEmail( email, subtype->getSender() ); e = new WebPagerEvent(contact, email, m_translator->server_to_client( subtype->getEmail(), ENCODING_ISO_8859_1, contact ), m_translator->server_to_client( subtype->getMessage(), ENCODING_ISO_8859_1, contact )); break; } case MSG_Type_SMS: { /* TODO: Encoding!?! Someone told me once SMSs are UTF-8 encoded.. need to verify! */ SMSICQSubType *sst = static_cast(st); if (sst->getSMSType() == SMSICQSubType::SMS) { contact = lookupMobile(sst->getSender()); e = new SMSMessageEvent(contact, sst->getMessage(), sst->getSource(),sst->getSenders_network(), sst->getTime()); } else if (sst->getSMSType() == SMSICQSubType::SMS_Receipt) { contact = lookupMobile(sst->getDestination()); e = new SMSReceiptEvent(contact, sst->getMessage(), sst->getMessageId(), sst->getSubmissionTime(), sst->getDeliveryTime(), sst->delivered()); } break; } default: break; } // end of switch return e; } /** * Convert a MessageEvent into a UINICQSubType */ UINICQSubType* MessageHandler::EventToUINICQSubType(MessageEvent *ev) { ContactRef c = ev->getContact(); UINICQSubType *ist = NULL; if (ev->getType() == MessageEvent::Normal) { NormalMessageEvent *nv = static_cast(ev); ist = new NormalICQSubType( m_translator->client_to_server( nv->getMessage(), ENCODING_CONTACT_LOCALE, c ) ); } else if (ev->getType() == MessageEvent::URL) { URLMessageEvent *uv = static_cast(ev); ist = new URLICQSubType( m_translator->client_to_server( uv->getMessage(), ENCODING_CONTACT_LOCALE, c ), m_translator->client_to_server( uv->getURL(), ENCODING_CONTACT_LOCALE, c )); } else if (ev->getType() == MessageEvent::FileTransfer) { FileTransferEvent *uv = static_cast(ev); ist = new FTICQSubType( m_translator->client_to_server( uv->getMessage(), ENCODING_CONTACT_LOCALE, c ), m_translator->client_to_server( uv->getDescription(), ENCODING_CONTACT_LOCALE, c ), uv->getTotalSize()); } else if (ev->getType() == MessageEvent::AwayMessage) { ist = new AwayMsgSubType( c->getStatus() ); } else if (ev->getType() == MessageEvent::AuthReq) { AuthReqEvent *uv = static_cast(ev); ist = new AuthReqICQSubType( m_translator->client_to_server( m_self_contact->getAlias(), ENCODING_CONTACT_LOCALE, c ), m_translator->client_to_server( m_self_contact->getFirstName(), ENCODING_CONTACT_LOCALE, c ), m_translator->client_to_server( m_self_contact->getLastName(), ENCODING_CONTACT_LOCALE, c ), m_translator->client_to_server( m_self_contact->getEmail(), ENCODING_CONTACT_LOCALE, c ), m_self_contact->getAuthReq(), m_translator->client_to_server( uv->getMessage(), ENCODING_CONTACT_LOCALE, c )); } else if (ev->getType() == MessageEvent::AuthAck) { AuthAckEvent *uv = static_cast(ev); if(uv->isGranted()) ist = new AuthAccICQSubType(); else ist = new AuthRejICQSubType( m_translator->client_to_server( uv->getMessage(), ENCODING_CONTACT_LOCALE, c ) ); } else if (ev->getType() == MessageEvent::UserAdd) { ist = new UserAddICQSubType( m_translator->client_to_server( m_self_contact->getAlias(), ENCODING_CONTACT_LOCALE, c ), m_translator->client_to_server( m_self_contact->getFirstName(), ENCODING_CONTACT_LOCALE, c ), m_translator->client_to_server( m_self_contact->getLastName(), ENCODING_CONTACT_LOCALE, c ), m_translator->client_to_server( m_self_contact->getEmail(), ENCODING_CONTACT_LOCALE, c ), m_self_contact->getAuthReq() ); } else if (ev->getType() == MessageEvent::Contacts) { ContactMessageEvent *cv = static_cast(ev); ist = new ContactICQSubType(cv->getContacts()); } ICQMessageEvent *iev; if (ist != NULL && (iev = dynamic_cast(ev)) != NULL) { ist->setUrgent( iev->isUrgent() ); ist->setToContactList( iev->isToContactList() ); } return ist; } void MessageHandler::SignalLog(LogEvent::LogType type, const string& msg) { LogEvent ev(type,msg); logger.emit(&ev); } ContactRef MessageHandler::lookupUIN(unsigned int uin) { ContactRef ret; if (m_contact_list->exists(uin)) { ret = m_contact_list->lookup_uin(uin); } else { ret = ContactRef( new Contact(uin) ); } return ret; } ContactRef MessageHandler::lookupMobile(const string& m) { ContactRef ret; if (m_contact_list->mobile_exists(m)) { ret = m_contact_list->lookup_mobile(m); } else { ret = ContactRef( new Contact(m) ); ret->setMobileNo(m); } return ret; } ContactRef MessageHandler::lookupEmail(const string& email, const string& alias) { ContactRef ret; if (m_contact_list->email_exists(email)) { ret = m_contact_list->lookup_email(email); } else { ret = ContactRef( new Contact(alias) ); ret->setEmail(email); } return ret; } } centerim-4.22.10/libicq2000/src/MessageHandler.h0000644000175000001440000000604011461606612015775 00000000000000/** * MessageHandler * * Copyright (C) 2002 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef MESSAGEHANDLER_H #define MESSAGEHANDLER_H #include #include "libicq2000/sigslot.h" #include "Contact.h" #include "events.h" namespace ICQ2000 { class ContactTree; class ICQSubType; class UINICQSubType; class FTICQSubType; class MessageEvent; class ICQMessageEvent; class Translator; /** * This is the central place all message signalling to the client * goes through. They can come from three sources: 1. A MessageSNAC * through the server, 2. A SrvResponseSNAC - offline message, 3. a * direct message */ class MessageHandler : public sigslot::has_slots<> { private: ContactRef m_self_contact; ContactTree *m_contact_list; Translator * & m_translator; /* a reference to the pointer in Client */ MessageEvent* ICQSubTypeToEvent(ICQSubType *st, ContactRef& contact, bool& adv); ICQMessageEvent* UINICQSubTypeToEvent(UINICQSubType *st, const ContactRef& contact); ContactRef lookupUIN(unsigned int uin); ContactRef lookupEmail(const std::string& email, const std::string& alias); ContactRef lookupMobile(const std::string& m); UINICQSubType* EventToUINICQSubType(MessageEvent *ev); void SignalLog(LogEvent::LogType type, const std::string& msg); public: MessageHandler(ContactRef self, ContactTree *cl, Translator * & tr); // incoming messages bool handleIncoming(ICQSubType* icq, time_t t = 0); FileTransferEvent* handleIncomingFT(FTICQSubType* icq, bool direct); // outgoing messages UINICQSubType* handleOutgoing(MessageEvent *ev); // incoming ACKs void handleIncomingACK(MessageEvent *ev, UINICQSubType* icq); void handleIncomingFTACK(FileTransferEvent *ev, FTICQSubType* ft); // filetransfer info update void handleUpdateFT(FileTransferEvent *ev); // incoming File transfer cancels void handleIncomingFTCancel(FileTransferEvent *ev); sigslot::signal1 messaged; sigslot::signal1 messageack; sigslot::signal1 want_auto_resp; sigslot::signal1 logger; sigslot::signal1 filetransfer_incoming_signal; sigslot::signal1 filetransfer_update_signal; }; } #endif centerim-4.22.10/libicq2000/src/SNAC-BUD.cpp0000644000175000001440000000562311461606612014610 00000000000000/* * SNAC - Buddy List * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SNAC-BUD.h" #include "TLV.h" using std::string; using std::list; namespace ICQ2000 { // --------------- Buddy List (Family 0x0003) SNACs -------------- AddBuddySNAC::AddBuddySNAC() { } AddBuddySNAC::AddBuddySNAC(const ContactTree& l) : m_buddy_list() { ContactTree::const_iterator curr = l.begin(); while (curr != l.end()) { ContactTree::Group::const_iterator gcurr = curr->begin(); while (gcurr != curr->end()) { if ((*gcurr)->isICQContact()) m_buddy_list.push_back((*gcurr)->getStringUIN()); ++gcurr; } ++curr; } } AddBuddySNAC::AddBuddySNAC(const ContactRef& c) : m_buddy_list(1, c->getStringUIN()) { } void AddBuddySNAC::addBuddy(const ContactRef& c) { m_buddy_list.push_back(c->getStringUIN()); } void AddBuddySNAC::OutputBody(Buffer& b) const { list::const_iterator curr = m_buddy_list.begin(); while (curr != m_buddy_list.end()) { b << (unsigned char)(*curr).size(); b.Pack(*curr); curr++; } } RemoveBuddySNAC::RemoveBuddySNAC() { } RemoveBuddySNAC::RemoveBuddySNAC(const ContactList& l) : m_buddy_list() { ContactList::const_iterator curr = l.begin(); while (curr != l.end()) { if ((*curr)->isICQContact()) m_buddy_list.push_back((*curr)->getStringUIN()); ++curr; } } RemoveBuddySNAC::RemoveBuddySNAC(const ContactRef& c) : m_buddy_list(1, c->getStringUIN()) { } void RemoveBuddySNAC::removeBuddy(const ContactRef& c) { m_buddy_list.push_back(c->getStringUIN()); } void RemoveBuddySNAC::OutputBody(Buffer& b) const { list::const_iterator curr = m_buddy_list.begin(); while (curr != m_buddy_list.end()) { b << (unsigned char)(*curr).size(); b.Pack(*curr); curr++; } } BuddyOnlineSNAC::BuddyOnlineSNAC() { } void BuddyOnlineSNAC::ParseBody(Buffer& b) { /* All BuddyOnline consists of is the user info * block TLVs */ m_userinfo.Parse(b); } BuddyOfflineSNAC::BuddyOfflineSNAC() { } void BuddyOfflineSNAC::ParseBody(Buffer& b) { m_userinfo.Parse(b); } } centerim-4.22.10/libicq2000/src/ICBMCookieCache.h0000644000175000001440000000332311461606612015704 00000000000000/* * ICBMCookieCache * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef ICBMCOOKIECACHE_H #define ICBMCOOKIECACHE_H #include "Cache.h" #include "ICBMCookie.h" #include "events.h" #include "libicq2000/sigslot.h" namespace ICQ2000 { class ICBMCookieCache : public Cache { public: ICBMCookieCache() { } ~ICBMCookieCache() { removeAll(); } void removeItem(const ICBMCookieCache::literator& l) { if (((*l).getValue())->getType() != MessageEvent::FileTransfer) delete ((*l).getValue()); Cache::removeItem(l); } void expireItem(const ICBMCookieCache::literator& l) { expired.emit( (*l).getValue() ); Cache::expireItem(l); } ICBMCookie generateUnique() const { ICBMCookie c; c.generate(); while (exists(c)) c.generate(); return c; } sigslot::signal1 expired; }; } #endif centerim-4.22.10/libicq2000/src/DCCache.h0000644000175000001440000000632411461606612014332 00000000000000/* * DCCache * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef DCCACHE_H #define DCCACHE_H #include "Cache.h" #include "libicq2000/sigslot.h" namespace ICQ2000 { /* predeclare classes */ class DirectClient; /* fd -> DirectClient cache * * Where the party is at. Once a DirectClient object is added to the * cache MM for it is assumed on the cache. Also lookups for a * Contact are done in linear time now, it was just too much of a * head-ache maintaining the uin map in Client. */ class DCCache : public Cache { public: DCCache() { } ~DCCache() { removeAll(); } void removeItem(const DCCache::literator& l) { delete ((*l).getValue()); Cache::removeItem(l); } void expireItem(const DCCache::literator& l) { expired.emit( (*l).getValue() ); Cache::expireItem(l); /* this will removeItem(..), which'll delete the DirectClient * (see above). */ } void removeContact(const ContactRef& c) { literator curr = m_list.begin(); literator next = curr; while ( curr != m_list.end() ) { DirectClient *dc = (*curr).getValue(); ++next; if ( dc->getContact().get() != NULL /* Direct Connections won't have a contact associated * with them initially just after having been accepted as * an incoming connection (we don't know who they are * yet) - so Contact could be a NULL ref. */ && dc->getContact()->getUIN() == c->getUIN() ) { removeItem(curr); } curr = next; } } DirectClient* getByContact(const ContactRef& c) { // linear lookup literator curr = m_list.begin(); while ( curr != m_list.end() ) { DirectClient *dc = (*curr).getValue(); if ( dc->getContact().get() != NULL /* Direct Connections won't have a contact associated * with them initially just after having been accepted as * an incoming connection (we don't know who they are * yet) - so Contact could be a NULL ref. */ && dc->getContact()->getUIN() == c->getUIN() ) return dc; // found it ++curr; } return NULL; // not found } void clearoutMessagesPoll() { literator curr = m_list.begin(); while ( curr != m_list.end() ) { DirectClient *dc = (*curr).getValue(); dc->clearoutMessagesPoll(); ++curr; } } sigslot::signal1 expired; }; } #endif centerim-4.22.10/libicq2000/src/RequestIDCache.h0000644000175000001440000000603211461606612015705 00000000000000/* * RequestIDCache * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef REQUESTIDCACHE_H #define REQUESTIDCACHE_H #include "Cache.h" #include "libicq2000/sigslot.h" namespace ICQ2000 { class RequestIDCacheValue { public: enum Type { UserInfo, SMSMessage, Search, ServerBasedContact }; virtual ~RequestIDCacheValue() { } virtual Type getType() const = 0; }; class UserInfoCacheValue : public RequestIDCacheValue { private: ContactRef m_contact; public: UserInfoCacheValue(ContactRef c) : m_contact(c) { } unsigned int getUIN() const { return m_contact->getUIN(); } ContactRef getContact() const { return m_contact; } Type getType() const { return UserInfo; } }; class SMSEventCacheValue : public RequestIDCacheValue { private: SMSMessageEvent *m_ev; public: SMSEventCacheValue( SMSMessageEvent *ev ) : m_ev(ev) { } virtual ~SMSEventCacheValue() { delete m_ev; } SMSMessageEvent* getEvent() const { return m_ev; } ContactRef getContact() const { return m_ev->getContact(); } Type getType() const { return SMSMessage; } }; class SearchCacheValue : public RequestIDCacheValue { private: SearchResultEvent *m_ev; public: SearchCacheValue( SearchResultEvent *ev ) : m_ev(ev) { } SearchResultEvent* getEvent() const { return m_ev; } Type getType() const { return Search; } }; /* class ServerBasedContactCacheValue : public RequestIDCacheValue { private: ServerBasedContactEvent *m_ev; public: ServerBasedContactCacheValue( ServerBasedContactEvent *ev ) : m_ev(ev) { } ServerBasedContactEvent *getEvent() const { return m_ev; } Type getType() const { return ServerBasedContact; } }; */ class RequestIDCache : public Cache { public: RequestIDCache() { } ~RequestIDCache() { removeAll(); } sigslot::signal1 expired; void expireItem(const RequestIDCache::literator& l) { expired.emit( (*l).getValue() ); Cache::expireItem(l); } void removeItem(const RequestIDCache::literator& l) { delete ((*l).getValue()); Cache::removeItem(l); } }; } #endif centerim-4.22.10/libicq2000/src/time_extra.cpp0000644000175000001440000000306511461606612015613 00000000000000/* * Extra time functions * (Mainly to make up for deficiencies/quirks in libc implementations) * * Copyright (C) 2002 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "time_extra.h" namespace ICQ2000 { time_t gmt_mktime (struct tm *tm) { static const int epoch = 1970; time_t when; int day, year; static const int days[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, }; year = tm->tm_year + 1900; day = days[tm->tm_mon] + tm->tm_mday - 1; /* adjust for leap years */ day += ((year - (epoch - (epoch % 4)))-1) / 4; day -= (year - (epoch - (epoch % 100))) / 100; day += (year - (epoch - (epoch % 400))) / 400; when = ((year - epoch) * 365 + day) * 24 + tm->tm_hour; when = (when * 60 + tm->tm_min) * 60 + tm->tm_sec; return when; } } centerim-4.22.10/libicq2000/src/ContactTree.cpp0000644000175000001440000002336011461606612015665 00000000000000/* * ContactTree * * Copyright (C) 2002 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "ContactTree.h" #include "events.h" namespace ICQ2000 { using std::string; #define ITERATE_CONTACTS_BEGIN \ iterator curr = begin(); \ while (curr != end()) { #define ITERATE_CONTACTS_END \ ++curr; \ } #define ITERATE_GROUPS_BEGIN \ iterator curr = m_groups.begin(); \ while (curr != m_groups.end()) { #define ITERATE_GROUPS_END \ ++curr; \ } #define CONST_ITERATE_GROUPS_BEGIN \ const_iterator curr = m_groups.begin(); \ while (curr != m_groups.end()) { #define CONST_ITERATE_GROUPS_END \ ++curr; \ } // ============================================================================ // ContactTree Group object // ============================================================================ _ContactTree_Group::_ContactTree_Group(const std::string& l, unsigned short id) : m_id(id), m_label(l) { } _ContactTree_Group::_ContactTree_Group() : m_id(0), m_label("") { } _ContactTree_Group::_ContactTree_Group(const _ContactTree_Group& gp) : m_crefs( gp.m_crefs ), m_id( gp.m_id ), m_label( gp.m_label ) { } unsigned short _ContactTree_Group::get_id() const { return m_id; } string _ContactTree_Group::get_label() const { return m_label; } void _ContactTree_Group::set_label(const string& l) { if (m_label == l) return; m_label = l; GroupChangeEvent ev( *this ); contactlist_signal.emit( &ev ); } ContactRef _ContactTree_Group::operator[](unsigned int uin) { return lookup_uin(uin); } ContactRef _ContactTree_Group::lookup_uin(unsigned int uin) { if (m_crefs.count(uin) != 0) return (*(m_crefs.find(uin))).second; return NULL; } ContactRef _ContactTree_Group::lookup_mobile(const string& m) { ITERATE_CONTACTS_BEGIN if ((*curr)->getNormalisedMobileNo() == m) return (*curr); ITERATE_CONTACTS_END return NULL; } ContactRef _ContactTree_Group::lookup_email(const string& em) { ITERATE_CONTACTS_BEGIN if ((*curr)->getEmail() == em) return (*curr); ITERATE_CONTACTS_END return NULL; } ContactRef _ContactTree_Group::add(ContactRef ct) { m_crefs.insert( std::make_pair(ct->getUIN(), ct) ); // fire off signal UserAddedEvent uev( ct, *this ); contactlist_signal.emit( &uev ); // connect up contact's status signals to propagate up group ct->status_change_signal.connect( contact_status_change_signal ); ct->userinfo_change_signal.connect( contact_userinfo_change_signal ); return ct; } void _ContactTree_Group::relocate_from(ContactRef ct) { if (m_crefs.count(ct->getUIN()) != 0) m_crefs.erase(ct->getUIN()); } void _ContactTree_Group::relocate_to(ContactRef ct) { m_crefs.insert( std::make_pair(ct->getUIN(), ct) ); } void _ContactTree_Group::remove(unsigned int uin) { if (m_crefs.count(uin) != 0) { // first fire off signal UserRemovedEvent uev( m_crefs[uin], *this ); contactlist_signal.emit( &uev ); m_crefs.erase(uin); } } bool _ContactTree_Group::empty() const { return m_crefs.empty(); } unsigned int _ContactTree_Group::size() const { return m_crefs.size(); } bool _ContactTree_Group::exists(unsigned int uin) { return (m_crefs.count(uin) != 0); } bool _ContactTree_Group::mobile_exists(const string& m) { ITERATE_CONTACTS_BEGIN if ((*curr)->getNormalisedMobileNo() == m) return true; ITERATE_CONTACTS_END return false; } bool _ContactTree_Group::email_exists(const string& em) { ITERATE_CONTACTS_BEGIN if ((*curr)->getEmail() == em) return true; ITERATE_CONTACTS_END return false; } _ContactTree_Group::iterator _ContactTree_Group::begin() { return iterator(m_crefs.begin()); } _ContactTree_Group::iterator _ContactTree_Group::end() { return iterator(m_crefs.end()); } _ContactTree_Group::const_iterator _ContactTree_Group::begin() const { return const_iterator(m_crefs.begin()); } _ContactTree_Group::const_iterator _ContactTree_Group::end() const { return const_iterator(m_crefs.end()); } // ============================================================================ // ContactTree // ============================================================================ ContactTree::ContactTree() { } ContactTree::ContactTree(const ContactTree& ct) : m_groups( ct.m_groups ) { } ContactRef ContactTree::operator[](unsigned int uin) { return lookup_uin(uin); } ContactRef ContactTree::lookup_uin(unsigned int uin) { ITERATE_GROUPS_BEGIN if ((*curr).exists(uin)) return (*curr).lookup_uin(uin); ITERATE_GROUPS_END return NULL; } ContactRef ContactTree::lookup_mobile(const std::string& m) { ITERATE_GROUPS_BEGIN if ((*curr).mobile_exists(m)) return (*curr).lookup_mobile(m); ITERATE_GROUPS_END return NULL; } ContactRef ContactTree::lookup_email(const std::string& em) { ITERATE_GROUPS_BEGIN if ((*curr).email_exists(em)) return (*curr).lookup_email(em); ITERATE_GROUPS_END return NULL; } ContactTree::Group& ContactTree::add_group(const string& l) { return add_group(l, get_unique_group_id() ); } ContactTree::Group& ContactTree::add_group(const string& l, unsigned short group_id) { if (exists_group(group_id)) { // oops.. trying to add one with a duplicate group_id group_id = get_unique_group_id(); } Group gp( l, group_id ); m_groups.push_back(gp); // propagate signals up to ContactTree object m_groups.back().contactlist_signal.connect( contactlist_signal ); m_groups.back().contact_status_change_signal.connect( contact_status_change_signal ); m_groups.back().contact_userinfo_change_signal.connect( contact_userinfo_change_signal ); // fireoff event GroupAddedEvent ev(m_groups.back()); contactlist_signal.emit( &ev ); return m_groups.back(); } void ContactTree::remove_group(Group& gp) { remove_group(gp.get_id()); } void ContactTree::remove_group(unsigned short group_id) { ITERATE_GROUPS_BEGIN if ((*curr).get_id() == group_id) { // emit event GroupRemovedEvent ev(*curr); contactlist_signal.emit( &ev ); // remove from list m_groups.erase(curr); break; } ITERATE_GROUPS_END } bool ContactTree::exists_group(unsigned short group_id) { ITERATE_GROUPS_BEGIN if ((*curr).get_id() == group_id) return true; ITERATE_GROUPS_END return false; } ContactTree::Group& ContactTree::lookup_group(unsigned short group_id) { ITERATE_GROUPS_BEGIN if ((*curr).get_id() == group_id) return (*curr); ITERATE_GROUPS_END return add_group(""); } ContactTree::Group& ContactTree::lookup_group_containing_contact(ContactRef ct) { unsigned int uin = ct->getUIN(); ITERATE_GROUPS_BEGIN if ((*curr).exists(uin)) return (*curr); ITERATE_GROUPS_END return add_group(""); } void ContactTree::relocate_contact(ContactRef ct, Group& from, Group& to) { from.relocate_from(ct); to.relocate_to(ct); UserRelocatedEvent ev(ct, to, from); contactlist_signal.emit( &ev ); } void ContactTree::remove(unsigned int uin) { ITERATE_GROUPS_BEGIN if ((*curr).exists(uin)) { (*curr).remove(uin); break; } ITERATE_GROUPS_END } unsigned int ContactTree::size() const { unsigned int ret = 0; CONST_ITERATE_GROUPS_BEGIN ret += (*curr).size(); CONST_ITERATE_GROUPS_END return ret; } unsigned int ContactTree::group_size() const { return m_groups.size(); } bool ContactTree::empty() const { return m_groups.empty(); } bool ContactTree::exists(unsigned int uin) { ITERATE_GROUPS_BEGIN if ((*curr).exists(uin)) return true; ITERATE_GROUPS_END return false; } bool ContactTree::mobile_exists(const std::string& m) { ITERATE_GROUPS_BEGIN if ((*curr).mobile_exists(m)) return true; ITERATE_GROUPS_END return false; } bool ContactTree::email_exists(const std::string& em) { ITERATE_GROUPS_BEGIN if ((*curr).email_exists(em)) return true; ITERATE_GROUPS_END return false; } ContactTree::iterator ContactTree::begin() { return m_groups.begin(); } ContactTree::iterator ContactTree::end() { return m_groups.end(); } ContactTree::const_iterator ContactTree::begin() const { return m_groups.begin(); } ContactTree::const_iterator ContactTree::end() const { return m_groups.end(); } unsigned short ContactTree::get_unique_group_id() const { unsigned short ret; while(1) { ret = (unsigned short) rand(); // this is fine for our simple purposes.. bool uniq = true; CONST_ITERATE_GROUPS_BEGIN if ((*curr).get_id() == ret) { uniq = false; break; } CONST_ITERATE_GROUPS_END if (uniq) break; } return ret; } } centerim-4.22.10/libicq2000/src/exceptions.cpp0000644000175000001440000000204111461606612015624 00000000000000/* * Exceptions * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "exceptions.h" using std::string; namespace ICQ2000 { ParseException::ParseException(const string& text) : m_errortext(text) { } const char* ParseException::what() const throw() { return m_errortext.c_str(); } } centerim-4.22.10/libicq2000/src/sstream_fix.h0000644000175000001440000000351111461606612015437 00000000000000/* * This file is one big nasty kludge because the older * libstdc++ libraries (before v3) have the old strstream * but I want to use the new, and much improved sstream. * - Barnaby * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #ifdef HAVE_SSTREAM # include #elif HAVE_STRSTREAM # define USE_STRSTREAM_WRAPPERS #else # error "No sstream/strstream implementation" #endif #if defined(USE_STRSTREAM_WRAPPERS) && !defined(SSTREAM_FIX_H) #define SSTREAM_FIX_H #include #include namespace std { /* * Only limited functionality from ostringstream * is implemented */ class ostringstream : public ostrstream { public: string str() { char *cstr = ostrstream::str(); freeze(0); if (cstr == 0) return string(); return string(cstr,pcount()); } }; /* * Only limited functionality from istringstream * is implemented */ class istringstream : public istrstream { public: istringstream(const string& str) : istrstream(str.c_str()) { } }; } #endif centerim-4.22.10/libicq2000/src/SNAC-GEN.h0000644000175000001440000001604411461606612014253 00000000000000/* * SNAC - General * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SNAC_GEN_H #define SNAC_GEN_H #include #include #include #include "SNAC-base.h" #include "UserInfoBlock.h" #include "RateLimits.h" namespace ICQ2000 { // Generic (Family 0x0001) const unsigned short SNAC_GEN_Error = 0x0001; const unsigned short SNAC_GEN_ClientReady = 0x0002; const unsigned short SNAC_GEN_ServerReady = 0x0003; const unsigned short SNAC_GEN_NewService = 0x0004; const unsigned short SNAC_GEN_Redirect = 0x0005; const unsigned short SNAC_GEN_RequestRateInfo = 0x0006; const unsigned short SNAC_GEN_RateInfo = 0x0007; const unsigned short SNAC_GEN_RateInfoAck = 0x0008; const unsigned short SNAC_GEN_RateInfoChange = 0x000a; const unsigned short SNAC_GEN_ServerPause = 0x000b; const unsigned short SNAC_GEN_ServerResume = 0x000d; const unsigned short SNAC_GEN_UserInfoRequest = 0x000e; const unsigned short SNAC_GEN_UserInfo = 0x000f; const unsigned short SNAC_GEN_Evil = 0x0010; // ?? const unsigned short SNAC_GEN_SetIdle = 0x0011; // maybe AIM specific? const unsigned short SNAC_GEN_MigrationRequest = 0x0012; // maybe AIM specific? const unsigned short SNAC_GEN_MOTD = 0x0013; const unsigned short SNAC_GEN_SetPrivFlags = 0x0014; const unsigned short SNAC_GEN_WellKnownURL = 0x0015; // ?? const unsigned short SNAC_GEN_NOP = 0x0016; // The next lot seem to be ICQ specific const unsigned short SNAC_GEN_Capabilities = 0x0017; const unsigned short SNAC_GEN_CapAck = 0x0018; const unsigned short SNAC_GEN_SetStatus = 0x001e; // ------------ Generic (Family 0x0001) SNACs ------------- class GenericSNAC : virtual public SNAC { public: unsigned short Family() const { return SNAC_FAM_GEN; } }; class ServerReadySNAC : public GenericSNAC, public InSNAC { private: std::vector capabilities; protected: void ParseBody(Buffer& b); public: ServerReadySNAC(); unsigned short Subtype() const { return SNAC_GEN_ServerReady; } std::vector getCapabilities() const { return capabilities; } }; class RequestRateInfoSNAC : public GenericSNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: RequestRateInfoSNAC() { } unsigned short Subtype() const { return SNAC_GEN_RequestRateInfo; } }; class RateInfoSNAC : public GenericSNAC, public InSNAC { private: std::map rates; protected: void ParseBody(Buffer& b); public: RateInfoSNAC(); unsigned short Subtype() const { return SNAC_GEN_RateInfo; } std::map getRates() const { return rates; } }; class RateInfoAckSNAC : public GenericSNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: RateInfoAckSNAC() { } unsigned short Subtype() const { return SNAC_GEN_RateInfoAck; } }; class CapabilitiesSNAC : public GenericSNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: CapabilitiesSNAC() { } unsigned short Subtype() const { return SNAC_GEN_Capabilities; } }; class CapAckSNAC : public GenericSNAC, public InSNAC { protected: void ParseBody(Buffer& b); public: CapAckSNAC() { } unsigned short Subtype() const { return SNAC_GEN_CapAck; } }; class SetStatusSNAC : public GenericSNAC, public OutSNAC { private: unsigned short m_status, m_port; unsigned int m_ip; bool m_sendextra, m_web_aware; protected: void OutputBody(Buffer& b) const; public: SetStatusSNAC(unsigned short status, bool web_aware); unsigned short Subtype() const { return SNAC_GEN_SetStatus; } void setSendExtra(bool b); void setIP(unsigned int ip); void setPort(unsigned short port); }; class SetIdleSNAC : public GenericSNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: SetIdleSNAC() { } unsigned short Subtype() const { return SNAC_GEN_SetIdle; } }; class ClientReadySNAC : public GenericSNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: ClientReadySNAC() { } unsigned short Subtype() const { return SNAC_GEN_ClientReady; } }; class PersonalInfoRequestSNAC : public GenericSNAC, public OutSNAC { protected: void OutputBody(Buffer& b) const; public: PersonalInfoRequestSNAC() { } unsigned short Subtype() const { return SNAC_GEN_UserInfoRequest; } }; class UserInfoSNAC : public GenericSNAC, public InSNAC { private: UserInfoBlock m_userinfo; protected: void ParseBody(Buffer& b); public: UserInfoSNAC() { } unsigned short Subtype() const { return SNAC_GEN_UserInfo; } const UserInfoBlock& getUserInfo() const { return m_userinfo; } }; const unsigned char MOTD_MANDATORY_UPGRADE = 0x01; // hehe - like we're going to obey this :-) const unsigned char MOTD_ADVISORY_UPGRADE = 0x02; const unsigned char MOTD_SYSTEM_BULLETIN = 0x03; const unsigned char MOTD_NORMAL = 0x04; class MOTDSNAC : public GenericSNAC, public InSNAC { private: unsigned char m_status; std::string m_url; protected: void ParseBody(Buffer& b); public: MOTDSNAC() { } unsigned short Subtype() const { return SNAC_GEN_MOTD; } }; class RateInfoChangeSNAC : public GenericSNAC, public InSNAC { private: unsigned short m_code; unsigned short m_rateclass; unsigned int m_windowsize; unsigned int m_clear; unsigned int m_alert; unsigned int m_limit; unsigned int m_disconnect; unsigned int m_currentavg; unsigned int m_maxavg; protected: void ParseBody(Buffer& b); public: RateInfoChangeSNAC() { } unsigned short getCode() const { return m_code; } unsigned short getRateClass() const { return m_rateclass; } unsigned int getWindowSize() const { return m_windowsize; } unsigned int getClear() const { return m_clear; } unsigned int getAlert() const { return m_alert; } unsigned int getLimit() const { return m_limit; } unsigned int getDisconnect() const { return m_disconnect; } unsigned int getCurrentAvg() const { return m_currentavg; } unsigned int getMaxAvg() const { return m_maxavg; } unsigned short Subtype() const { return SNAC_GEN_RateInfoChange; } }; } #endif centerim-4.22.10/libicq2000/src/Contact.cpp0000644000175000001440000003457611461606612015060 00000000000000/* * Contact * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "Contact.h" #include "sstream_fix.h" #include #include #include "userinfoconstants.h" #include "Capabilities.h" #include "events.h" using std::string; using std::ostringstream; using std::istringstream; namespace ICQ2000 { /** * Do not use this constructor outside the library. * It constructs a contact that is virtual, but doesn't have * an imaginary UIN allocated to it. */ Contact::Contact() : count(0), m_virtualcontact(true), m_uin(nextImaginaryUIN()), m_status(STATUS_OFFLINE), m_invisible(false), m_seqnum(0xffff) { Init(); } Contact::Contact(unsigned int uin) : count(0), m_virtualcontact(false), m_uin(uin), m_status(STATUS_OFFLINE), m_invisible(false), m_capabilities( new Capabilities() ), m_seqnum(0xffff) { m_main_home_info.alias = UINtoString(m_uin); Init(); } Contact::Contact(const string& a) : count(0), m_virtualcontact(true), m_uin(nextImaginaryUIN()), m_status(STATUS_OFFLINE), m_invisible(false), m_capabilities( new Capabilities() ), m_seqnum(0xffff) { m_main_home_info.alias = a; Init(); } Contact::~Contact() { delete m_capabilities; } void Contact::Init() { m_tcp_version = 0; m_dc_cookie = 0; m_ext_ip = 0; m_lan_ip = 0; m_ext_port = 0; m_lan_port = 0; m_direct = true; m_bday = false; m_signon_time = 0; m_last_online_time = 0; m_last_status_change_time = 0; m_last_message_time = 0; m_last_away_msg_check_time = 0; m_group_id = 0; m_tag_id = 0; m_server_based = false; m_authreq = false; m_authawait = false; } unsigned int Contact::getUIN() const { return m_uin; } void Contact::setUIN(unsigned int uin) { m_uin = uin; m_virtualcontact = false; userinfo_change_emit(); } string Contact::getStringUIN() const { return UINtoString(m_uin); } string Contact::getAlias() const { return m_main_home_info.alias; } string Contact::getNameAlias() const { string ret = getAlias(); if (ret.empty()) { ret = getFirstName(); if (!ret.empty() && !getLastName().empty()) ret += " "; ret += getLastName(); } if (ret.empty()) { if (isICQContact()) ret = getStringUIN(); else ret = getMobileNo(); } return ret; } Status Contact::getStatus() const { return m_status; } string Contact::getMobileNo() const { return m_main_home_info.getMobileNo(); } string Contact::getNormalisedMobileNo() const { return m_main_home_info.getNormalisedMobileNo(); } string Contact::getFirstName() const { return m_main_home_info.firstname; } string Contact::getLastName() const { return m_main_home_info.lastname; } string Contact::getEmail() const { return m_main_home_info.email; } unsigned int Contact::getExtIP() const { return m_ext_ip; } unsigned int Contact::getLanIP() const { return m_lan_ip; } unsigned short Contact::getExtPort() const { return m_ext_port; } unsigned short Contact::getLanPort() const { return m_lan_port; } unsigned char Contact::getTCPVersion() const { return m_tcp_version; } unsigned int Contact::getDCCookie() const { return m_dc_cookie; } bool Contact::getDirect() const { return (m_direct && m_status != STATUS_OFFLINE); } void Contact::setDirect(bool b) { m_direct = b; userinfo_change_emit(true); } bool Contact::get_accept_adv_msgs() const { return (m_status != STATUS_OFFLINE && m_capabilities->get_accept_adv_msgs()); } Capabilities Contact::get_capabilities() const { return * m_capabilities; } unsigned int Contact::get_signon_time() const { return m_signon_time; } unsigned int Contact::get_last_online_time() const { if (m_status == STATUS_ONLINE) { return time(NULL); } else { return m_last_online_time; } } unsigned int Contact::get_last_status_change_time() const { return m_last_status_change_time; } unsigned int Contact::get_last_message_time() const { return m_last_message_time; } unsigned int Contact::get_last_away_msg_check_time() const { return m_last_away_msg_check_time; } bool Contact::isInvisible() const { return m_invisible; } bool Contact::getAuthReq() const { return m_authreq; } bool Contact::getAuthAwait() const { return m_authawait; } bool Contact::getServerBased() const { return m_server_based; } void Contact::setMobileNo(const string& mn) { m_main_home_info.setMobileNo(mn); userinfo_change_emit(); } void Contact::setAlias(const string& al) { m_main_home_info.alias = al; userinfo_change_emit(); } void Contact::setFirstName(const string& fn) { m_main_home_info.firstname = fn; userinfo_change_emit(); } void Contact::setLastName(const string& ln) { m_main_home_info.lastname = ln; userinfo_change_emit(); } void Contact::setEmail(const string& em) { m_main_home_info.email = em; userinfo_change_emit(); } void Contact::setStatus(Status st) { setStatus(st, m_invisible); } void Contact::setStatus(Status st, bool i) { if (m_status == st && m_invisible == i) return; StatusChangeEvent sev(this, st, m_status); m_status = st; m_invisible = i; m_last_status_change_time = time(NULL); // clear dynamic fields on going OFFLINE if (m_status == STATUS_OFFLINE) { m_ext_ip = 0; m_lan_ip = 0; m_ext_port = 0; m_lan_port = 0; m_tcp_version = 0; m_capabilities->clear(); m_last_online_time = time(NULL); } status_change_signal.emit( &sev ); } void Contact::userinfo_change_emit() { userinfo_change_emit(false); } void Contact::userinfo_change_emit(bool is_transient_detail) { UserInfoChangeEvent ev(this, is_transient_detail); userinfo_change_signal.emit(&ev); } void Contact::setInvisible(bool inv) { setStatus(m_status, inv); } void Contact::setAuthReq(bool b) { m_authreq = b; userinfo_change_emit(true); } void Contact::setAuthAwait(bool b) { m_authawait = b; userinfo_change_emit(true); } void Contact::setServerBased(bool b) { m_server_based = b; userinfo_change_emit(true); } bool Contact::isICQContact() const { return !m_virtualcontact; } bool Contact::isVirtualContact() const { return m_virtualcontact; } bool Contact::isSMSable() const { // ' SMS' suffix might be better way, but isn't reliable really return !m_main_home_info.getNormalisedMobileNo().empty(); } void Contact::setExtIP(unsigned int ip) { m_ext_ip = ip; userinfo_change_emit(true); } void Contact::setLanIP(unsigned int ip) { m_lan_ip = ip; userinfo_change_emit(true); } void Contact::setExtPort(unsigned short port) { m_ext_port = port; userinfo_change_emit(true); } void Contact::setLanPort(unsigned short port) { m_lan_port = port; userinfo_change_emit(true); } void Contact::setTCPVersion(unsigned char v) { m_tcp_version = v; userinfo_change_emit(true); } void Contact::setDCCookie(unsigned int cookie) { m_dc_cookie = cookie; userinfo_change_emit(true); } void Contact::setServerSideInfo(unsigned short group_id, unsigned short tag_id) { m_group_id = group_id; m_tag_id = tag_id; userinfo_change_emit(true); } unsigned short Contact::getServerSideGroupID() const { return m_group_id; } unsigned short Contact::getServerSideID() const { unsigned short r = m_tag_id; if(!r) { r = m_uin; if(r > 50000) { r -= r-1000; r += rand()%1000; } } return r; } void Contact::set_capabilities(const Capabilities& c) { (*m_capabilities) = c; } void Contact::set_signon_time(unsigned int t) { m_signon_time = t; userinfo_change_emit(true); } void Contact::set_last_online_time(unsigned int t) { m_last_online_time = t; userinfo_change_emit(true); } void Contact::set_last_status_change_time(unsigned int t) { m_last_status_change_time = t; userinfo_change_emit(true); } void Contact::set_last_message_time(unsigned int t) { m_last_message_time = t; userinfo_change_emit(true); } void Contact::set_last_away_msg_check_time(unsigned int t) { m_last_away_msg_check_time = t; userinfo_change_emit(true); } void Contact::setMainHomeInfo(const MainHomeInfo& s) { m_main_home_info = s; userinfo_change_emit(); } void Contact::setHomepageInfo(const HomepageInfo& s) { m_homepage_info = s; userinfo_change_emit(); } void Contact::setEmailInfo(const EmailInfo& s) { m_email_info = s; userinfo_change_emit(); } void Contact::setWorkInfo(const WorkInfo& s) { m_work_info = s; userinfo_change_emit(); } void Contact::setInterestInfo(const PersonalInterestInfo& s) { m_personal_interest_info = s; userinfo_change_emit(); } void Contact::setBackgroundInfo(const BackgroundInfo& b) { m_background_info = b; userinfo_change_emit(); } void Contact::setAboutInfo(const string& about) { m_about = about; userinfo_change_emit(); } Contact::MainHomeInfo& Contact::getMainHomeInfo() { return m_main_home_info; } Contact::HomepageInfo& Contact::getHomepageInfo() { return m_homepage_info; } Contact::WorkInfo& Contact::getWorkInfo() { return m_work_info; } Contact::PersonalInterestInfo& Contact::getPersonalInterestInfo() { return m_personal_interest_info; } Contact::BackgroundInfo& Contact::getBackgroundInfo() { return m_background_info; } Contact::EmailInfo& Contact::getEmailInfo() { return m_email_info; } const string& Contact::getAboutInfo() const { return m_about; } unsigned short Contact::nextSeqNum() { return --m_seqnum; } string Contact::UINtoString(unsigned int uin) { ostringstream ostr; ostr << uin; return ostr.str(); } unsigned int Contact::StringtoUIN(const string& s) { istringstream istr(s); unsigned int uin = 0; istr >> uin; return uin; } unsigned int Contact::imag_uin = 0; unsigned int Contact::nextImaginaryUIN() { return (--imag_uin); } unsigned short Contact::MapStatusToICQStatus(Status st, bool inv) { unsigned short s; switch(st) { case STATUS_ONLINE: s = 0x0000; break; case STATUS_AWAY: s = 0x0001; break; case STATUS_NA: s = 0x0005; break; case STATUS_OCCUPIED: s = 0x0011; break; case STATUS_DND: s = 0x0013; break; case STATUS_FREEFORCHAT: s = 0x0020; break; default: s = 0x0000; } if (inv) s |= STATUS_FLAG_INVISIBLE; return s; } Status Contact::MapICQStatusToStatus(unsigned short st) { if (st & STATUS_FLAG_DND) return STATUS_DND; else if (st & STATUS_FLAG_NA) return STATUS_NA; else if (st & STATUS_FLAG_OCCUPIED) return STATUS_OCCUPIED; else if (st & STATUS_FLAG_FREEFORCHAT) return STATUS_FREEFORCHAT; else if (st & STATUS_FLAG_AWAY) return STATUS_AWAY; else return STATUS_ONLINE; } bool Contact::MapICQStatusToInvisible(unsigned short st) { return (st & STATUS_FLAG_INVISIBLE); } // Extra Detailed info class implementations; Contact::MainHomeInfo::MainHomeInfo() : country(COUNTRY_UNKNOWN), timezone(TIMEZONE_UNKNOWN) { } Country Contact::MainHomeInfo::getCountry() const { return country; } string Contact::MainHomeInfo::getMobileNo() const { return cellular; } void Contact::MainHomeInfo::setMobileNo(const string& s) { cellular = s; normaliseMobileNo(); } string Contact::MainHomeInfo::getNormalisedMobileNo() const { return normalised_cellular; } void Contact::MainHomeInfo::normaliseMobileNo() { normalised_cellular.erase(); string::iterator curr = cellular.begin(); while (curr != cellular.end()) { if (isdigit(*curr)) normalised_cellular += *curr; ++curr; } } Contact::HomepageInfo::HomepageInfo() : age(0), sex(SEX_UNKNOWN), lang1(LANGUAGE_UNKNOWN), lang2(LANGUAGE_UNKNOWN), lang3(LANGUAGE_UNKNOWN), birth_year(0), birth_month(0), birth_day(0) { } /** * Get a string representation of the birthdate. * * @deprecated This function is not internationalized - it does not * return utf-8, and returns the hard-coded "Unspecified" also. */ string Contact::HomepageInfo::getBirthDate() const { if (birth_day == 0 || birth_year == 0) return "Unspecified"; struct tm birthdate; birthdate.tm_sec = 0; birthdate.tm_min = 0; birthdate.tm_hour = 0; birthdate.tm_mday = birth_day; birthdate.tm_mon = birth_month-1; birthdate.tm_year = birth_year - 1900; birthdate.tm_isdst = 0; mktime(&birthdate); char bday[255]; strftime(bday, 255, "%B %e, %G", &birthdate); return string(bday); } Language Contact::HomepageInfo::getLanguage(int l) const { Language ret = LANGUAGE_UNKNOWN; switch(l) { case 1: ret = lang1; break; case 2: ret = lang2; break; case 3: ret = lang3; break; } return ret; } Contact::EmailInfo::EmailInfo() { } void Contact::EmailInfo::addEmailAddress(const string& e) { emails.push_back(e); } Contact::WorkInfo::WorkInfo() : country(0) { } Contact::BackgroundInfo::BackgroundInfo() { } void Contact::BackgroundInfo::addSchool(unsigned short cat, const string& s) { schools.push_back(School(cat, s)); } Contact::PersonalInterestInfo::PersonalInterestInfo() { } void Contact::PersonalInterestInfo::addInterest(unsigned short cat, const string& s) { interests.push_back(Interest(cat, s)); } bool Contact::getBirthday() const { return m_bday; } void Contact::setBirthday(bool b) { m_bday = b; userinfo_change_emit(true); } } centerim-4.22.10/libicq2000/src/version.cpp0000644000175000001440000000224111461606612015132 00000000000000/* * version * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "version.h" /* * This file is here simply to define the versioning symbols in the * library */ unsigned int libicq2000_major_version = LIBICQ2000_MAJOR_VERSION; unsigned int libicq2000_minor_version = LIBICQ2000_MINOR_VERSION; unsigned int libicq2000_micro_version = LIBICQ2000_MICRO_VERSION; const char* libicq2000_version = LIBICQ2000_VERSION; centerim-4.22.10/libicq2000/src/SNAC-UIN.h0000644000175000001440000000415111461606612014271 00000000000000/* * SNAC - UIN * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SNAC_UIN_H #define SNAC_UIN_H #include #include "SNAC-base.h" namespace ICQ2000 { // UIN Registration (Family 0x0017) const unsigned short SNAC_UIN_RequestError = 0x0001; const unsigned short SNAC_UIN_Request = 0x0004; const unsigned short SNAC_UIN_Response = 0x0005; // --------------------- UIN Registration (Family 0x0017) SNACs --------- class UINFamilySNAC : virtual public SNAC { public: unsigned short Family() const { return SNAC_FAM_UIN; } }; class UINRequestSNAC : public UINFamilySNAC, public OutSNAC { protected: std::string m_password; void OutputBody(Buffer& b) const; public: UINRequestSNAC(const std::string& p); unsigned short Subtype() const { return SNAC_UIN_Request; } }; class UINRequestErrorSNAC : public UINFamilySNAC, public InSNAC { protected: void ParseBody(Buffer& b); public: UINRequestErrorSNAC(); unsigned short Subtype() const { return SNAC_UIN_RequestError; } }; class UINResponseSNAC : public UINFamilySNAC, public InSNAC { protected: unsigned int m_uin; void ParseBody(Buffer& b); public: UINResponseSNAC(); unsigned short Subtype() const { return SNAC_UIN_Response; } unsigned int getUIN() const { return m_uin; } }; } #endif centerim-4.22.10/libicq2000/src/SNAC-MSG.h0000644000175000001440000001142511461606612014266 00000000000000/* * SNAC - Message Family * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SNAC_MSG_H #define SNAC_MSG_H #include "SNAC-base.h" #include "ICQ.h" #include "UserInfoBlock.h" #include "ICBMCookie.h" #include "Capabilities.h" namespace ICQ2000 { // Messages (Family 0x0004) const unsigned short SNAC_MSG_Error = 0x0001; const unsigned short SNAC_MSG_AddICBMParameter = 0x0002; const unsigned short SNAC_MSG_Send = 0x0006; const unsigned short SNAC_MSG_Message = 0x0007; const unsigned short SNAC_MSG_MessageACK = 0x000b; const unsigned short SNAC_MSG_OfflineUser = 0x000c; const unsigned short SNAC_MSG_TypingNotification = 0x0014; // ----------------- Message (Family 0x0004) SNACs -------------- class MsgFamilySNAC : virtual public SNAC { public: unsigned short Family() const { return SNAC_FAM_MSG; } }; class MsgAddICBMParameterSNAC : public MsgFamilySNAC, public OutSNAC { private: bool m_typing_notif; protected: void OutputBody(Buffer& b) const; public: MsgAddICBMParameterSNAC(bool typing_notif) : m_typing_notif(typing_notif) { } unsigned short Subtype() const { return SNAC_MSG_AddICBMParameter; } }; class MsgSendSNAC : public MsgFamilySNAC, public OutSNAC { protected: ICQSubType *m_icqsubtype; bool m_advanced; unsigned short m_seqnum; ICBMCookie m_cookie; Capabilities m_dest_capabilities; void OutputBody(Buffer& b) const; public: MsgSendSNAC(ICQSubType *icqsubtype, bool ad = false); void setSeqNum(unsigned short sn); void setAdvanced(bool ad); void setICBMCookie(const ICBMCookie& c); void set_capabilities(const Capabilities& c); unsigned short Subtype() const { return SNAC_MSG_Send; } }; class MessageSNAC : public MsgFamilySNAC, public InSNAC { protected: // General fields UserInfoBlock m_userinfo; ICQSubType *m_icqsubtype; ICBMCookie m_cookie; void ParseBody(Buffer& b); public: MessageSNAC(); MessageSNAC(const std::string &uin); MessageSNAC(const std::string &uin, const std::string &reason); MessageSNAC(const std::string &uin, const std::string &reason, bool granted); ~MessageSNAC(); ICQSubType* getICQSubType() const { return m_icqsubtype; } ICQSubType* grabICQSubType(); void setICQSubType(ICQSubType *ist) { m_icqsubtype = ist; } void setICBMCookie(const ICBMCookie& c) { m_cookie = c; } ICBMCookie getICBMCookie() const { return m_cookie; } unsigned short Subtype() const { return SNAC_MSG_Message; } }; class MessageACKSNAC : public MsgFamilySNAC, public InSNAC, public OutSNAC { protected: ICBMCookie m_cookie; UINICQSubType *m_icqsubtype; void ParseBody(Buffer& b); void OutputBody(Buffer& b) const; public: MessageACKSNAC(); MessageACKSNAC(ICBMCookie c, UINICQSubType *icqsubtype); ~MessageACKSNAC(); UINICQSubType* getICQSubType() const { return m_icqsubtype; } ICBMCookie getICBMCookie() const { return m_cookie; } unsigned short Subtype() const { return SNAC_MSG_MessageACK; } }; class MessageOfflineUserSNAC : public MsgFamilySNAC, public InSNAC { protected: ICBMCookie m_cookie; unsigned short m_channel; unsigned int m_uin; void ParseBody(Buffer& b); public: ICBMCookie getICBMCookie() const { return m_cookie; } unsigned short getChannel() const { return m_channel; } unsigned short Subtype() const { return SNAC_MSG_OfflineUser; } unsigned int getUIN() const { return m_uin; } }; class MessageTypingNotificationSNAC : public MsgFamilySNAC, public InSNAC { protected: ICBMCookie m_cookie; unsigned short m_channel; unsigned int m_uin; unsigned short m_type; void ParseBody(Buffer& b); public: ICBMCookie getICBMCookie() const { return m_cookie; } unsigned short getChannel() const { return m_channel; } unsigned short getType() const { return m_type; } unsigned short Subtype() const { return SNAC_MSG_TypingNotification; } unsigned int getUIN() const { return m_uin; } }; } #endif centerim-4.22.10/libicq2000/src/SNAC-GEN.cpp0000644000175000001440000001177211461606612014611 00000000000000/* * SNAC - General Family * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SNAC-GEN.h" #include "TLV.h" #include "buffer.h" namespace ICQ2000 { // --------------- Generic (Family 0x0001) ------------ ServerReadySNAC::ServerReadySNAC(): capabilities() {} void ServerReadySNAC::ParseBody(Buffer& b) { /* The body of the server ready SNAC seems * to be a list of the SNAC families the server * will accept - the client is then expected * to send back a list of those it wants * - save the list */ unsigned short cap; while(b.beforeEnd()) { b >> cap; capabilities.push_back(cap); } } void RequestRateInfoSNAC::OutputBody(Buffer& b) const { // empty } RateInfoSNAC::RateInfoSNAC() : rates() {} void RateInfoSNAC::ParseBody(Buffer& b) { unsigned short n; b >> n; for (unsigned short a = 0; a < n; a++) { unsigned short cl_id; unsigned int win, clr, alert, limit, disc, current, max, last; unsigned char cur_st; b >> cl_id; rates[cl_id] = RateClass(); rates[cl_id] << b; } for (unsigned short a = 0; a < n; a++) { unsigned short rg_id, pairs; b >> rg_id >> pairs; rates[rg_id].setMembers( pairs, b ); } } void RateInfoAckSNAC::OutputBody(Buffer& b) const { b << (unsigned short)0x0001 << (unsigned short)0x0002 << (unsigned short)0x0003 << (unsigned short)0x0004 << (unsigned short)0x0005; } void RateInfoChangeSNAC::ParseBody(Buffer& b) { b >> m_code; b >> m_rateclass; b >> m_windowsize; b >> m_clear; b >> m_alert; b >> m_limit; b >> m_disconnect; b >> m_currentavg; b >> m_maxavg; b.advance(5); } void CapabilitiesSNAC::OutputBody(Buffer& b) const { /* doesn't seem any need currently to do more * than copy the official client */ unsigned short v1 = 0x0001, v2 = 0x0002, v3 = 0x0003, v4 = 0x0004, v5 = 0x0005; b << SNAC_FAM_GEN << v3 << SNAC_FAM_SBL << v5 << SNAC_FAM_LOC << v1 << SNAC_FAM_BUD << v1 << SNAC_FAM_SRV << v2 << SNAC_FAM_MSG << v1 << SNAC_FAM_INV << v1 << SNAC_FAM_BOS << v1 << SNAC_FAM_LUP << v1 << SNAC_FAM_SBL << v4; } void CapAckSNAC::ParseBody(Buffer& b) { /* server sends back the list from ServerReady again * but with versions of families included * - ignore for the moment */ unsigned short cap, ver; while(b.beforeEnd()) { b >> cap >> ver; } } SetStatusSNAC::SetStatusSNAC(unsigned short status, bool web_aware) : m_status(status), m_sendextra(false), m_web_aware(web_aware) { } void SetStatusSNAC::OutputBody(Buffer& b) const { StatusTLV stlv(ALLOWDIRECT_EVERYONE, (m_web_aware ? WEBAWARE_WEBAWARE : WEBAWARE_NORMAL), m_status); b << stlv; if (m_sendextra) { UnknownTLV utlv; b << utlv; LANDetailsTLV ltlv(m_ip, m_port); b << ltlv; } } void SetStatusSNAC::setSendExtra(bool b) { m_sendextra = b; } void SetStatusSNAC::setIP(unsigned int ip) { m_ip = ip; } void SetStatusSNAC::setPort(unsigned short port) { m_port = port; } void SetIdleSNAC::OutputBody(Buffer& b) const { /* don't know what this value means exactly */ b << (unsigned int)0x00000000; } void ClientReadySNAC::OutputBody(Buffer& b) const { /* related to capabilities again * - figure this out sometime */ b << 0x00010003 << 0x0110028a << 0x00020001 << 0x0101028a << 0x00030001 << 0x0110028a << 0x00150001 << 0x0110028a << 0x00040001 << 0x0110028a << 0x00060001 << 0x0110028a << 0x00090001 << 0x0110028a << 0x000a0001 << 0x0110028a << 0x00130004 << 0x01100629; } void PersonalInfoRequestSNAC::OutputBody(Buffer& b) const { // empty } void UserInfoSNAC::ParseBody(Buffer& b) { m_userinfo.Parse(b); } void MOTDSNAC::ParseBody(Buffer& b) { b >> m_status; /* as far as I know only one TLV follows, * but we'll treat it as a list */ TLVList tlvlist; tlvlist.Parse(b, TLV_ParseMode_Channel02, (short unsigned int)-1); if (tlvlist.exists(TLV_WebAddress)) { WebAddressTLV *t = (WebAddressTLV*)tlvlist[TLV_WebAddress]; m_url = t->Value(); } } } centerim-4.22.10/libicq2000/src/socket.cpp0000644000175000001440000002442111461606612014741 00000000000000/* * TCPSocket class * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "sstream_fix.h" #include #include #include "socket.h" #include "buffer.h" #ifdef HAVE_CONFIG_H # include #endif #ifdef MSG_NOSIGNAL #define SEND_FLAGS MSG_NOSIGNAL #else #define SEND_FLAGS 0 #endif using std::string; using std::ostringstream; using std::istringstream; //using std::copy; namespace ICQ2000 { // StringtoIP and IPtoString both work on host order ip address expressed as unsigned int's unsigned int StringtoIP(const string& s) { istringstream istr(s); unsigned char d1,d2,d3,d4; unsigned int b1,b2,b3,b4; istr >> b1 >> d1 >> b2 >> d2 >> b3 >> d3 >> b4; if (!istr) return 0; istr >> d4; if (istr) return 0; if (d1 == '.' && d2 == '.' && d3 == '.' && b1 < 256 && b2 < 256 && b3 < 256 && b4 < 256) { return (b1 << 24) | (b2 << 16) | (b3 << 8) | (b4 << 0); } else { return 0; } } string IPtoString(unsigned int ip) { ostringstream ostr; ostr << (ip >> 24) << "." << ((ip >> 16) & 0xff) << "." << ((ip >> 8) & 0xff) << "." << (ip & 0xff); return ostr.str(); } TCPSocket::TCPSocket() : m_socketDescriptor(-1), m_socketDescriptor_valid(false), blocking(false), m_state(NOT_CONNECTED) { memset(&remoteAddr, 0, sizeof(remoteAddr)); } TCPSocket::TCPSocket( int fd, struct sockaddr_in addr ) : m_socketDescriptor(fd), m_socketDescriptor_valid(true), remoteAddr(addr), blocking(false), m_state(CONNECTED) { socklen_t localLen = sizeof(struct sockaddr_in); getsockname( m_socketDescriptor, (struct sockaddr *)&localAddr, &localLen ); fcntlSetup(); } TCPSocket::~TCPSocket() { Disconnect(); } extern "C" int cw_connect(int sockfd, const struct sockaddr *serv_addr, int addrlen, int ssl); void TCPSocket::Connect() { if (m_state != NOT_CONNECTED) throw SocketException("Already connected"); m_socketDescriptor = socket(AF_INET,SOCK_STREAM,0); if (m_socketDescriptor == -1) throw SocketException("Couldn't create socket"); m_socketDescriptor_valid = true; remoteAddr.sin_family = AF_INET; fcntlSetup(); if (cw_connect(m_socketDescriptor,(struct sockaddr *)&remoteAddr,sizeof(struct sockaddr), 0) == -1) { if (errno == EINPROGRESS) { m_state = NONBLOCKING_CONNECT; return; // non-blocking connect } // m_state will still be NOT_CONNECTED close(m_socketDescriptor); m_socketDescriptor_valid = false; throw SocketException("Couldn't connect socket"); } socklen_t localLen = sizeof(struct sockaddr_in); getsockname( m_socketDescriptor, (struct sockaddr *)&localAddr, &localLen ); m_state = CONNECTED; } void TCPSocket::FinishNonBlockingConnect() { // this should be called for non blocking connects // after the socket is writeable int so_error; socklen_t optlen = sizeof(so_error); if (getsockopt(m_socketDescriptor, SOL_SOCKET, SO_ERROR, (char *) &so_error, &optlen) == -1 || so_error != 0) { m_state = NOT_CONNECTED; close(m_socketDescriptor); m_socketDescriptor_valid = false; throw SocketException("Couldn't connect socket"); } // success socklen_t localLen = sizeof(struct sockaddr_in); getsockname( m_socketDescriptor, (struct sockaddr *)&localAddr, &localLen ); m_state = CONNECTED; } void TCPSocket::Disconnect() { if (m_socketDescriptor_valid) { close(m_socketDescriptor); m_socketDescriptor_valid = false; } m_state = NOT_CONNECTED; } int TCPSocket::getSocketHandle() { return m_socketDescriptor; } TCPSocket::State TCPSocket::getState() const { return m_state; } bool TCPSocket::connected() { return (m_state == CONNECTED); } void TCPSocket::setBlocking(bool b) { blocking = b; fcntlSetup(); } bool TCPSocket::isBlocking() const { return blocking; } void TCPSocket::fcntlSetup() { if (m_socketDescriptor_valid) { int f = fcntl(m_socketDescriptor, F_GETFL); if (blocking) fcntl(m_socketDescriptor, F_SETFL, f & ~O_NONBLOCK); else fcntl(m_socketDescriptor, F_SETFL, f | O_NONBLOCK); } } void TCPSocket::Send(Buffer& b) { if (!connected()) throw SocketException("Not connected"); int ret; unsigned int sent = 0; unsigned char *data = (unsigned char *) malloc(b.size()); copy( b.begin(), b.end(), data ); while (sent < b.size()) { ret = send(m_socketDescriptor, (char *) (data + sent), b.size() - sent, SEND_FLAGS); if (ret == -1) { m_state = NOT_CONNECTED; close(m_socketDescriptor); m_socketDescriptor_valid = false; free(data); throw SocketException("Sending on socket"); } sent += ret; } free(data); } bool TCPSocket::Recv(Buffer& b) { if (!connected()) throw SocketException("Not connected"); unsigned char buffer[max_receive_size]; int ret = recv(m_socketDescriptor, (char *) buffer, max_receive_size, 0); if (ret <= 0) { if (ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) return false; m_state = NOT_CONNECTED; close(m_socketDescriptor); m_socketDescriptor_valid = false; if (ret == 0) throw SocketException( "Other end closed connection" ); else throw SocketException( strerror(errno) ); } b.Pack(buffer,ret); return true; } void TCPSocket::setBindHost(const char *host) { memset(&localAddr, 0, sizeof(localAddr)); if(strlen(host)) { localAddr.sin_addr.s_addr = gethostname(host); localAddr.sin_port = 0; } } void TCPSocket::setRemoteHost(const char *host) { remoteAddr.sin_addr.s_addr = gethostname(host); } void TCPSocket::setRemotePort(unsigned short port) { remoteAddr.sin_port = htons(port); } void TCPSocket::setRemoteIP(unsigned int ip) { remoteAddr.sin_addr.s_addr = htonl(ip); } unsigned short TCPSocket::getRemotePort() const { return ntohs( remoteAddr.sin_port ); } unsigned int TCPSocket::getRemoteIP() const { return ntohl( remoteAddr.sin_addr.s_addr ); } unsigned short TCPSocket::getLocalPort() const { return ntohs( localAddr.sin_port ); } unsigned int TCPSocket::getLocalIP() const { return ntohl( localAddr.sin_addr.s_addr ); } // returns ip address of host in network byte order unsigned long TCPSocket::gethostname(const char *hostname) { unsigned int ip = htonl( StringtoIP(hostname) ); if (ip != 0) return ip; // try and resolve hostname struct hostent *hostEnt; if ((hostEnt = gethostbyname(hostname)) == NULL || hostEnt->h_addrtype != AF_INET) { throw SocketException("DNS lookup failed"); } else { return *((unsigned long *)(hostEnt->h_addr)); } } /** * TCPServer class */ TCPServer::TCPServer() : m_socketDescriptor_valid(false) { } TCPServer::~TCPServer() { Disconnect(); } void TCPServer::StartServer() { StartServer(0, 0); } void TCPServer::StartServer(unsigned short lower, unsigned short upper) { if (m_socketDescriptor_valid) throw SocketException("Already listening"); m_socketDescriptor = socket( AF_INET, SOCK_STREAM, 0 ); if (m_socketDescriptor < 0) throw SocketException("Couldn't create socket"); m_socketDescriptor_valid = true; localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = INADDR_ANY; bool bound = false; if (lower && upper) { unsigned short port; // attempt to bind to a port within the range for (port=lower;port<=upper;port++) { localAddr.sin_port = htons(port); if ( bind( m_socketDescriptor,(struct sockaddr *)&localAddr,sizeof(struct sockaddr) ) >= 0 ) { bound = true; break; } } } if (!bound) { // bind to a random port localAddr.sin_port = 0; if ( bind( m_socketDescriptor,(struct sockaddr *)&localAddr,sizeof(struct sockaddr) ) < 0 ) throw SocketException("Couldn't bind socket"); } listen( m_socketDescriptor, 5 ); // queue size of 5 should be sufficient socklen_t localLen = sizeof(struct sockaddr_in); getsockname( m_socketDescriptor, (struct sockaddr *)&localAddr, &localLen ); } unsigned short TCPServer::getPort() const { return ntohs( localAddr.sin_port ); } unsigned int TCPServer::getIP() const { return ntohl( localAddr.sin_addr.s_addr ); } TCPSocket* TCPServer::Accept() { int newsockfd; socklen_t remoteLen; struct sockaddr_in remoteAddr; if (!m_socketDescriptor_valid) throw SocketException("Not connected"); remoteLen = sizeof(remoteAddr); newsockfd = accept( m_socketDescriptor, (struct sockaddr *) &remoteAddr, &remoteLen ); if (newsockfd < 0) { close(m_socketDescriptor); m_socketDescriptor_valid = false; throw SocketException("Error on accept"); } return new TCPSocket( newsockfd, remoteAddr ); } int TCPServer::getSocketHandle() { return m_socketDescriptor; } void TCPServer::Disconnect() { if (m_socketDescriptor_valid) { close(m_socketDescriptor); m_socketDescriptor = 0; m_socketDescriptor_valid = false; } } bool TCPServer::isStarted() const { return m_socketDescriptor_valid; } void TCPServer::setBindHost(const char *host) { memset(&localAddr, 0, sizeof(localAddr)); if(strlen(host)) { localAddr.sin_addr.s_addr = TCPSocket::gethostname(host); localAddr.sin_port = 0; } } /** * SocketException class */ SocketException::SocketException(const string& text) : m_errortext(text) { } const char* SocketException::what() const throw() { return m_errortext.c_str(); } } centerim-4.22.10/libicq2000/src/FTCache.h0000644000175000001440000000755011461606612014357 00000000000000/* * FTCache * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef FTCACHE_H #define FTCACHE_H #include "Cache.h" #include "libicq2000/sigslot.h" namespace ICQ2000 { /* predeclare classes */ class FileTransferClient; class FileTransferEvent; /* fd -> FileTransferClient cache * * Where the party is at. Once a FileTransferClient object is added to the * cache MM for it is assumed on the cache. Also lookups for a * Contact are done in linear time now, it was just too much of a * head-ache maintaining the uin map in Client. */ class FTCache : public Cache { public: FTCache() { } ~FTCache() { removeAll(); } FileTransferClient* getByEvent(FileTransferEvent* ev) { literator l = m_list.begin(); while (l != m_list.end()) { if ((*l).getValue()->getEvent() == ev) return (*l).getValue(); ++l; } return NULL; } bool exists_listenfd(int fd) { literator l = m_list.begin(); while (l != m_list.end()) { if ((*l).getValue()->getlistenfd() == fd) return true; ++l; } return false; } void remove_and_not_delete(const int &k) { literator i = lookup(k); if (i != m_list.end()) m_list.erase(i); } void removeItem(const FTCache::literator& l) { delete ((*l).getValue()); Cache::removeItem(l); } void expireItem(const FTCache::literator& l) { expired.emit( (*l).getValue() ); //Cache::expireItem(l); /* this will removeItem(..), which'll delete the DirectClient * (see above). */ } void removeContact(const ContactRef& c) { literator curr = m_list.begin(); literator next = curr; while ( curr != m_list.end() ) { FileTransferClient *ftc = (*curr).getValue(); ++next; if ( ftc->getContact().get() != NULL /* Direct Connections won't have a contact associated * with them initially just after having been accepted as * an incoming connection (we don't know who they are * yet) - so Contact could be a NULL ref. */ && ftc->getContact()->getUIN() == c->getUIN() ) { removeItem(curr); } curr = next; } } FileTransferClient* getByContact(const ContactRef& c) { // linear lookup literator curr = m_list.begin(); while ( curr != m_list.end() ) { FileTransferClient *ftc = (*curr).getValue(); if ( ftc->getContact().get() != NULL /* Direct Connections won't have a contact associated * with them initially just after having been accepted as * an incoming connection (we don't know who they are * yet) - so Contact could be a NULL ref. */ && ftc->getContact()->getUIN() == c->getUIN() ) return ftc; // found it ++curr; } return NULL; // not found } void clearoutMessagesPoll() { literator curr = m_list.begin(); while ( curr != m_list.end() ) { FileTransferClient *ftc = (*curr).getValue(); ftc->clearoutMessagesPoll(); ++curr; } } sigslot::signal1 expired; }; } #endif centerim-4.22.10/libicq2000/src/FileTransferClient.h0000644000175000001440000000774311461606612016651 00000000000000/* * FileTransferClient * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef FILETRANSFERCLIENT_H #define FILETRANSFERCLIENT_H #include #include #include #include "libicq2000/sigslot.h" #include #include #include "socket.h" #include "buffer.h" #include "events.h" #include "exceptions.h" #include "Contact.h" #include "ContactTree.h" #include "SocketClient.h" #include "MessageHandler.h" namespace ICQ2000 { #define MAX_FileChunk 4096 class UINICQSubType; class FileTransferClient : public SocketClient { private: enum State { NOT_CONNECTED, WAITING_FOR_INIT, WAITING_FOR_INIT_ACK, WAITING_FOR_INIT2, CONNECTED }; TCPServer m_listenserver; FileTransferEvent* m_ev; std::string m_path, *m_base_dir; State m_state; bool m_more, m_continue; bool m_senddir; Buffer m_recv; unsigned char m_const_buf[MAX_FileChunk]; std::ofstream m_fout; std::ifstream m_fin; ContactRef m_self_contact; ContactRef m_contact; ContactTree *m_contact_list; MessageHandler *m_message_handler; bool m_incoming; unsigned short m_remote_tcp_version; unsigned int m_remote_uin; unsigned char m_tcp_flags; unsigned short m_eff_tcp_version; unsigned int m_local_ext_ip, m_session_id; unsigned short m_local_server_port; void Parse(); void ParseInitPacket(Buffer &b); void ParseInitAck(Buffer &b); void ParseInit2(Buffer &b); void ParsePacket(Buffer& b); void ParsePacketInt(Buffer& b); void ParsePacket0x00(Buffer& b); void ParsePacket0x01(Buffer& b); void ParsePacket0x02(Buffer& b); void ParsePacket0x03(Buffer& b); void ParsePacket0x05(Buffer& b); void ParsePacket0x06(Buffer& b); void SendPacket0x00(); void SendPacket0x01(); void SendPacket0x02(); void SendPacket0x03(unsigned int npos, unsigned int nfiles); void SendPacket0x05(); void SendPacket0x06(); void SendInitAck(); void SendInitPacket(); void SendInit2(); void SendPacketAck(ICQSubType *i); void Send(Buffer &b); unsigned int m_timeout; time_t m_timestamp; bool m_msgqueue; void ConfirmUIN(); void expired(); void flush_queue(); void Init(); static void listDirectory(std::string str, int &size, int &files, int &dirs, FileTransferEvent *ev); void SendFile(); public: FileTransferClient(ContactRef self, MessageHandler *mh, ContactTree *cl, unsigned int ext_ip, FileTransferEvent* ev); FileTransferClient(ContactRef self, ContactRef c, MessageHandler *mh, unsigned int ext_ip, FileTransferEvent* ev); ~FileTransferClient(); void Connect(); void FinishNonBlockingConnect(); void Recv(); static bool SetupFileTransfer(FileTransferEvent *ev); FileTransferEvent* getEvent(); unsigned int getUIN() const; unsigned int getIP() const; unsigned short getPort() const; unsigned short getlistenPort() const; int getfd() const; int getlistenfd(); TCPSocket* getSocket() const; void setSocket(); void clearoutMessagesPoll(); void setContact(ContactRef c); ContactRef getContact() const; void SendEvent(MessageEvent* ev); }; } #endif centerim-4.22.10/libicq2000/src/SMTPClient.cpp0000644000175000001440000002123311461606612015371 00000000000000/* * SMTPClient * * Copyright (C) 2002 Konstantin Klyagin * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SMTPClient.h" #include "exceptions.h" #include "sstream_fix.h" using std::string; using std::ostringstream; using std::endl; namespace ICQ2000 { SMTPClient::SMTPClient(ContactRef self, const string& server_name, unsigned short server_port) : m_state(NOT_CONNECTED), m_recv(), m_server_name(server_name), m_server_port(server_port), m_timeout(30), m_self_contact(self) { m_socket = new TCPSocket(); Init(); } SMTPClient::~SMTPClient() { if ( m_socket->getSocketHandle() > -1) SignalRemoveSocket( m_socket->getSocketHandle() ); delete m_socket; } void SMTPClient::Init() { } void SMTPClient::Connect() { try { m_socket->setRemoteHost( m_server_name.c_str() ); m_socket->setRemotePort( m_server_port ); m_socket->setBindHost( m_bindhost.c_str() ); m_socket->setBlocking(false); m_socket->Connect(); SignalAddSocket( m_socket->getSocketHandle(), SocketEvent::WRITE ); time(&m_last_operation); m_state = WAITING_FOR_CONNECT; } catch(DisconnectedException e) { SignalLog(LogEvent::WARN, e.what()); Disconnect(); } catch(SocketException e) { SignalLog(LogEvent::WARN, e.what()); Disconnect(); } catch(...) { SignalLog(LogEvent::WARN, "Uncaught SMTP connect exception"); Disconnect(); } } void SMTPClient::FinishNonBlockingConnect() { m_state = WAITING_FOR_INVITATION; } void SMTPClient::Recv() { try { while ( m_socket->connected() ) { if ( !m_socket->Recv(m_recv) ) break; Parse(); } } catch(SocketException e) { ostringstream ostr; ostr << "Failed on recv: " << e.what(); Disconnect(); throw DisconnectedException( ostr.str() ); } catch(ParseException e) { ostringstream ostr; ostr << "Failed parsing: " << e.what(); m_state = NOT_CONNECTED; throw DisconnectedException( ostr.str() ); } catch(SMTPException e) { SignalLog(LogEvent::ERROR, e.what()); MessageEvent *ev = *m_msgqueue.begin(); ev->setDelivered(false); ev->setFinished(true); ev->setDeliveryFailureReason(MessageEvent::Failed_SMTP); messageack.emit(ev); delete ev; m_msgqueue.pop_front(); if(m_msgqueue.size()) { // process the next queued message SayFrom(); } else { ostringstream ostr; ostr << "SMTP failed: " << e.what(); m_state = NOT_CONNECTED; throw DisconnectedException( ostr.str() ); } } } void SMTPClient::Parse() { if (m_recv.empty()) return; string response; m_recv.UnpackCRLFString(response); time(&m_last_operation); ostringstream ostr; ostr << "Received SMTP response from " << IPtoString( m_socket->getRemoteIP() ) << ":" << m_socket->getRemotePort() << endl << response; SignalLog(LogEvent::DIRECTPACKET, ostr.str()); int code, npos; code = 0; if((npos = response.find(" ")) != -1) { code = strtoul(response.substr(0, npos).c_str(), 0, 0); } if(m_state == WAITING_FOR_INVITATION) { if(code == 220) { SayHello(); } else throw ParseException("Didn't receive 220 response"); } else if(m_state == WAITING_FOR_HELO_ACK) { if(code == 250) { SayFrom(); } else throw ParseException("HELO command wasn't accepted"); } else if(m_state == WAITING_FOR_MAIL_ACK) { if(code == 250) { SayTo(); } else throw SMTPException("MAIL command wasn't accepted"); } else if(m_state == WAITING_FOR_RCPT_ACK) { if(code == 250) { SayData(); } else throw SMTPException("RCPT command wasn't accepted"); } else if(m_state == WAITING_FOR_DATA_ACK) { if(code == 354) { SendText(); } else throw SMTPException("DATA command wasn't accepted"); } else if(m_state == WAITING_FOR_TEXT_ACK) { if(code == 250) { MessageEvent *ev = *m_msgqueue.begin(); ev->setDelivered(true); ev->setFinished(true); messageack.emit(ev); m_msgqueue.pop_front(); if(m_msgqueue.empty()) { SayQuit(); } else { SayFrom(); } } else throw SMTPException("The message text wasn't accepted"); } } void SMTPClient::clearoutMessagesPoll() { if(!m_msgqueue.empty()) { if(m_state == NOT_CONNECTED) { Connect(); } else { check_timeout(); } } } void SMTPClient::SendEvent(MessageEvent* ev) { m_msgqueue.push_back(ev); if(m_state == NOT_CONNECTED) { Connect(); } } void SMTPClient::Send(Buffer &b) { try { ostringstream ostr; ostr << "Sending SMTP command to " << IPtoString( m_socket->getRemoteIP() ) << ":" << m_socket->getRemotePort() << endl << b; SignalLog(LogEvent::DIRECTPACKET, ostr.str()); m_socket->Send(b); } catch(SocketException e) { ostringstream ostr; ostr << "Failed to send: " << e.what(); m_state = NOT_CONNECTED; throw DisconnectedException( ostr.str() ); } } void SMTPClient::SayHello() { Buffer b; b.Pack("HELO localhost\n"); Send(b); m_state = WAITING_FOR_HELO_ACK; } void SMTPClient::SayFrom() { Buffer b; MessageEvent *ev = *m_msgqueue.begin(); b.Pack("MAIL FROM:"); if(ev->getType() == MessageEvent::SMS) { const SMSMessageEvent *aev = static_cast(ev); b.Pack(aev->getSMTPFrom()); } else if(ev->getType() == MessageEvent::Email) { b.Pack(getContactEmail(m_self_contact)); } b.Pack("\n"); Send(b); m_state = WAITING_FOR_MAIL_ACK; } void SMTPClient::SayTo() { Buffer b; MessageEvent *ev = *m_msgqueue.begin(); b.Pack("RCPT TO:"); if(ev->getType() == MessageEvent::SMS) { const SMSMessageEvent *aev = static_cast(ev); b.Pack(aev->getSMTPTo()); } else if(ev->getType() == MessageEvent::Email) { b.Pack(getContactEmail( ev->getContact() )); } b.Pack("\n"); Send(b); m_state = WAITING_FOR_RCPT_ACK; } void SMTPClient::SayData() { Buffer b; b.Pack("DATA\n"); Send(b); m_state = WAITING_FOR_DATA_ACK; } void SMTPClient::SendText() { Buffer b; MessageEvent *ev = *m_msgqueue.begin(); if(ev->getType() == MessageEvent::SMS) { const SMSMessageEvent *aev = static_cast(ev); if(!aev->getSMTPSubject().empty()) { b.Pack("Subject: "); b.Pack(aev->getSMTPSubject()); b.Pack("\n\n"); } b.Pack(aev->getMessage()); } else { const EmailMessageEvent *aev = static_cast(ev); b.Pack(aev->getMessage()); } b.Pack("\n.\n"); Send(b); time(&m_last_operation); m_state = WAITING_FOR_TEXT_ACK; } void SMTPClient::SayQuit() { Buffer b; b.Pack("QUIT\n"); Send(b); m_state = DISCONNECTING; } void SMTPClient::check_timeout() { time_t now = time(0); if(now-m_last_operation > m_timeout) { Disconnect(); } } void SMTPClient::Disconnect() { m_socket->Disconnect(); m_state = NOT_CONNECTED; if ( m_socket->getSocketHandle() > -1) SignalRemoveSocket( m_socket->getSocketHandle() ); } string SMTPClient::getContactEmail(ContactRef cont) const { if(cont->getEmail().empty()) { ostringstream ostr; ostr << std::dec << cont->getUIN() << "@pager.icq.com"; return ostr.str(); } else { return cont->getEmail(); } } void SMTPClient::setServerHost(const string& host) { m_server_name = host; } string SMTPClient::getServerHost() const { return m_server_name; } void SMTPClient::setServerPort(unsigned short port) { m_server_port = port; } unsigned short SMTPClient::getServerPort() const { return m_server_port; } void SMTPClient::setTimeout(time_t t) { m_timeout = t; } time_t SMTPClient::getTimeout() const { return m_timeout; } SMTPException::SMTPException() { } SMTPException::SMTPException(const string& text) : m_errortext(text) { } const char* SMTPException::what() const throw() { return m_errortext.c_str(); } } centerim-4.22.10/libicq2000/src/SNAC-base.h0000644000175000001440000000755111461606612014557 00000000000000/* * SNAC - base classes * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SNAC_BASE_H #define SNAC_BASE_H #include #include namespace ICQ2000 { /* predeclare classes */ class Buffer; // ------------- SNAC numerical constants ------------ // SNAC Families const unsigned short SNAC_FAM_GEN = 0x0001; const unsigned short SNAC_FAM_LOC = 0x0002; const unsigned short SNAC_FAM_BUD = 0x0003; const unsigned short SNAC_FAM_MSG = 0x0004; const unsigned short SNAC_FAM_ADS = 0x0005; const unsigned short SNAC_FAM_INV = 0x0006; const unsigned short SNAC_FAM_ADM = 0x0007; const unsigned short SNAC_FAM_POP = 0x0008; const unsigned short SNAC_FAM_BOS = 0x0009; const unsigned short SNAC_FAM_LUP = 0x000a; const unsigned short SNAC_FAM_STS = 0x000b; const unsigned short SNAC_FAM_TRT = 0x000c; const unsigned short SNAC_FAM_CNV = 0x000d; const unsigned short SNAC_FAM_CHT = 0x000e; const unsigned short SNAC_FAM_SBL = 0x0013; // Server-based lists const unsigned short SNAC_FAM_SRV = 0x0015; // Server messages const unsigned short SNAC_FAM_UIN = 0x0017; // UIN registration // ------------- abstract SNAC classes --------------- class SNAC { protected: unsigned short m_flags; unsigned int m_requestID; public: SNAC(); virtual ~SNAC() { } virtual unsigned short Family() const = 0; virtual unsigned short Subtype() const = 0; virtual unsigned short Flags() const; virtual unsigned int RequestID() const; void setRequestID(unsigned int id); void setFlags(unsigned short fl); }; // -- Inbound SNAC -- class InSNAC : virtual public SNAC { protected: unsigned short m_version; virtual void ParseBody(Buffer& b) = 0; public: virtual unsigned short Version() const; virtual void Parse(Buffer& b); }; // -- Outbound SNAC -- class OutSNAC : virtual public SNAC { protected: virtual void OutputHeader(Buffer& b) const; virtual void OutputBody(Buffer& b) const = 0; public: virtual void Output(Buffer& b) const; }; // ------------ Raw SNAC ---------------------------------- class RawSNAC : public InSNAC { protected: unsigned short m_family, m_subtype; void ParseBody(Buffer& b); public: RawSNAC(unsigned short f, unsigned short t); unsigned short Family() const { return m_family; } unsigned short Subtype() const { return m_subtype; } }; // -- Error SNAC -- class ErrorSNAC : virtual public SNAC { protected: unsigned short m_error_code; std::map codeDescriptions; void initCodeDescriptions(); public: unsigned short getCode() const { return m_error_code; } std::string getErrorDescription(); }; class ErrorInSNAC : public ErrorSNAC, public InSNAC { protected: unsigned short m_family, m_subtype; void ParseBody(Buffer& b); public: ErrorInSNAC(unsigned short f, unsigned short t); unsigned short Family() const { return m_family; } unsigned short Subtype() const { return m_subtype; } }; Buffer& operator<<(Buffer& b, const ICQ2000::OutSNAC& t); } #endif centerim-4.22.10/libicq2000/src/UserInfoBlock.h0000644000175000001440000000442111461606612015621 00000000000000/* * UserInfoBlock * * Copyright (C) 2001 Barnaby Gray . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef USERINFOBLOCK_H #define USERINFOBLOCK_H #include #include "buffer.h" #include "Capabilities.h" namespace ICQ2000 { /* the user information block of screenname and then TLVs * of user info appears in several different SNACs so * encapsulate it here */ class UserInfoBlock { protected: std::string m_screenname; unsigned short m_warninglevel, m_userClass; unsigned char m_allowDirect, m_webAware; unsigned short m_status; bool m_birthday; unsigned int m_timeOnline; unsigned int m_signupDate, m_signonDate; unsigned int m_lan_ip, m_ext_ip; unsigned int m_dc_cookie; unsigned short m_lan_port, m_ext_port, m_firewall; unsigned char m_tcp_version; bool m_contains_capabilities; Capabilities m_capabilities; public: UserInfoBlock(); std::string getScreenName() const; unsigned int getUIN() const; unsigned int getTimeOnline() const; unsigned int getSignupDate() const; unsigned int getSignonDate() const; unsigned int getLanIP() const; unsigned int getExtIP() const; unsigned short getLanPort() const; unsigned short getExtPort() const; unsigned short getFirewall() const; unsigned int getDCCookie() const; unsigned char getTCPVersion() const; unsigned short getStatus() const; bool getBirthday() const; bool contains_capabilities() const; Capabilities get_capabilities() const; void Parse(Buffer& b); }; } #endif centerim-4.22.10/libicq2000/src/events.cpp0000644000175000001440000012042311461606612014754 00000000000000/* * Events * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "events.h" #include "Contact.h" using std::string; namespace ICQ2000 { // ============================================================================ // Event base class // ============================================================================ /** * Base constructor for events, timestamp set to now. */ Event::Event() { m_time = time(NULL); } /** * Base constructor for events, with a set timestamp. */ Event::Event(time_t t) : m_time(t) { } /** * get the time when the event occurred. * * @return the time */ time_t Event::getTime() const { return m_time; } /** * set the time of the event. This is used by the library only, and * is of no interest to the client. * * @param t the time */ void Event::setTime(time_t t) { m_time = t; } // ============================================================================ // Socket Event // ============================================================================ /** * Base constructor for socket events. * * @param fd socket file descriptor */ SocketEvent::SocketEvent(int fd) : m_fd(fd) { } /** * Destructor for SocketEvent */ SocketEvent::~SocketEvent() { } /** * get the socket file descriptor * * @return socket file descriptor */ int SocketEvent::getSocketHandle() const { return m_fd; } /** * Constructor for an add socket event. * * @param fd socket file descriptor * @param m mode of selection */ AddSocketHandleEvent::AddSocketHandleEvent(int fd, Mode m) : SocketEvent(fd), m_mode(m) { } /** * Determine if READ selection is required. * * @return whether READ is set */ bool AddSocketHandleEvent::isRead() const { return m_mode & READ; } /** * Determine if WRITE selection is required. * * @return whether WRITE is set */ bool AddSocketHandleEvent::isWrite() const { return m_mode & WRITE; } /** * Determine if EXCEPTION selection is required. * * @return whether EXCEPTION is set */ bool AddSocketHandleEvent::isException() const { return m_mode & EXCEPTION; } /** * Get the mode of the socket handle. * A client should preferably use the is... methods * @see isRead, isWrite, isException * * @return bitmask of modes */ SocketEvent::Mode AddSocketHandleEvent::getMode() const { return m_mode; } /** * Constructor for a remove socket event. */ RemoveSocketHandleEvent::RemoveSocketHandleEvent(int fd) : SocketEvent(fd) { } // ============================================================================ // Connecting Event // ============================================================================ /** * Simple constructor for a ConnectingEvent. */ ConnectingEvent::ConnectingEvent() { } // ============================================================================ // Connected Event // ============================================================================ /** * Simple constructor for a ConnectedEvent. */ ConnectedEvent::ConnectedEvent() { } // ============================================================================ // Disconnected Event // ============================================================================ /** * Constructor for a DisconnectedEvent. */ DisconnectedEvent::DisconnectedEvent(Reason r) : m_reason(r) { } /** * get the reason for disconnection. * * @return reason for disconnection */ DisconnectedEvent::Reason DisconnectedEvent::getReason() const { return m_reason; } // ============================================================================ // Log Event // ============================================================================ /** * Constructor for a LogEvent. * * @param type type of log messages * @param msg the log message */ LogEvent::LogEvent(LogType type, const string& msg) : m_type(type), m_msg(msg) { } /** * get the type of the log message * * @return type of the log message */ LogEvent::LogType LogEvent::getType() const { return m_type; } /** * get the log message * * @return log message */ string LogEvent::getMessage() const { return m_msg; } // ============================================================================ // Contact List Event // ============================================================================ /** * Base constructor for contact list events. */ ContactListEvent::ContactListEvent() { } /** * Destructor for ContactListEvent */ ContactListEvent::~ContactListEvent() { } // ============================================================================ // User Contact List Event // ============================================================================ /** * Base constructor for user contact list events. * * @param c the contact * @param gp the group */ UserContactListEvent::UserContactListEvent(const ContactRef& c, ContactTree::Group& gp) : m_contact(c), m_group(gp) { } /** * get the contact * * @return the contact */ ContactRef UserContactListEvent::getContact() const { return m_contact; } /** * get the group of the contact * * @return the group */ ContactTree::Group& UserContactListEvent::get_group() { return m_group; } /** * get the uin of the contact. This could be done just as easily, * with getContact()->getUIN(), provided for convenience. * * @return uin of the contact */ unsigned int UserContactListEvent::getUIN() const { return m_contact->getUIN(); } // ============================================================================ // UserAdded Event // ============================================================================ /** * Constructor for UserAddedEvent * * @param contact the contact that has just been added * @param gp the group */ UserAddedEvent::UserAddedEvent(const ContactRef& contact, ContactTree::Group& gp) : UserContactListEvent(contact, gp) { } ContactListEvent::EventType UserAddedEvent::getType() const { return UserAdded; } // ============================================================================ // UserRemoved Event // ============================================================================ /** * Constructor for UserRemovedEvent * * @param contact the contact that is about to be removed * @param gp the group */ UserRemovedEvent::UserRemovedEvent(const ContactRef& contact, ContactTree::Group& gp) : UserContactListEvent(contact, gp) { } ContactListEvent::EventType UserRemovedEvent::getType() const { return UserRemoved; } // ============================================================================ // UserRelocated Event // ============================================================================ /** * Constructor for UserRelocatedEvent * * @param contact the contact that is about to be removed * @param new_gp the new group * @param old_gp the old group */ UserRelocatedEvent::UserRelocatedEvent(const ContactRef& contact, ContactTree::Group& new_gp, ContactTree::Group& old_gp) : UserContactListEvent(contact, new_gp), m_old_group(old_gp) { } ContactListEvent::EventType UserRelocatedEvent::getType() const { return UserRelocated; } /** * get the old group of the contact * * @return the old group */ ContactTree::Group& UserRelocatedEvent::get_old_group() { return m_old_group; } // ============================================================================ // GroupContactList Event // ============================================================================ /** * Constructor for base class GroupContactListEvent * * @param gp the group being added */ GroupContactListEvent::GroupContactListEvent(const ContactTree::Group& gp) : m_group(gp) { } /** * get the group * * @return reference to the group */ const ContactTree::Group& GroupContactListEvent::get_group() const { return m_group; } // ============================================================================ // GroupAdded Event // ============================================================================ /** * Constructor for GroupAddedEvent * * @param gp the group being added */ GroupAddedEvent::GroupAddedEvent(const ContactTree::Group& gp) : GroupContactListEvent(gp) { } ContactListEvent::EventType GroupAddedEvent::getType() const { return GroupAdded; } // ============================================================================ // GroupRemoved Event // ============================================================================ /** * Constructor for GroupRemovedEvent * * @param gp the group being removed */ GroupRemovedEvent::GroupRemovedEvent(const ContactTree::Group& gp) : GroupContactListEvent(gp) { } ContactListEvent::EventType GroupRemovedEvent::getType() const { return GroupRemoved; } // ============================================================================ // GroupChange Event // ============================================================================ /** * Constructor for GroupChangeEvent * * @param gp the group changed */ GroupChangeEvent::GroupChangeEvent(const ContactTree::Group& gp) : GroupContactListEvent(gp) { } ContactListEvent::EventType GroupChangeEvent::getType() const { return GroupChange; } // ============================================================================ // CompleteUpdate Event // ============================================================================ /** * Constructor for CompleteUpdateEvent */ CompleteUpdateEvent::CompleteUpdateEvent() { } ContactListEvent::EventType CompleteUpdateEvent::getType() const { return CompleteUpdate; } // ============================================================================ // ServerBasedContactEvent // ============================================================================ /* ServerBasedContactEvent::ServerBasedContactEvent(const ContactList& l) : m_clist(l) { } ContactList& ServerBasedContactEvent::getContactList() { return m_clist; } */ // ============================================================================ // Contact Event // ============================================================================ /** * Base constructor for contact list events. * * @param c the contact */ ContactEvent::ContactEvent(ContactRef c) { m_contact = c; } /** * get the contact * * @return the contact */ ContactRef ContactEvent::getContact() const { return m_contact; } /** * get the uin of the contact. This could be done just as easily, * with getContact()->getUIN(), provided for convenience. * * @return */ unsigned int ContactEvent::getUIN() const { return m_contact->getUIN(); } /** * Destructor for ContactEvent */ ContactEvent::~ContactEvent() { } // ============================================================================ // Status Change Event // ============================================================================ /** * Constructor for StatusChangeEvent * * @param contact the contact whose status has changed * @param st the new status * @param old_st the old status */ StatusChangeEvent::StatusChangeEvent(ContactRef contact, Status st, Status old_st) : ContactEvent(contact), m_status(st), m_old_status(old_st) { } ContactEvent::EventType StatusChangeEvent::getType() const { return StatusChange; } /** * get the new status of the contact * * @return the new status */ Status StatusChangeEvent::getStatus() const { return m_status; } /** * get the old status of the contact * * @return the old status */ Status StatusChangeEvent::getOldStatus() const { return m_old_status; } // ============================================================================ // Typing Notification Event // ============================================================================ UserTypingNotificationEvent::UserTypingNotificationEvent(ContactRef contact, bool isTyping) : ContactEvent(contact), m_typing(isTyping) { } ContactEvent::EventType UserTypingNotificationEvent::getType() const { return TypingNotification; } bool UserTypingNotificationEvent::isTyping() const { return m_typing; } // ============================================================================ // User Info Change Event // ============================================================================ /** * Constructor for UserInfoChangeEvent * * @param contact the contact whose information has changed */ UserInfoChangeEvent::UserInfoChangeEvent(ContactRef contact, bool is_transient_detail) : ContactEvent(contact), m_is_transient_detail(is_transient_detail) { } ContactEvent::EventType UserInfoChangeEvent::getType() const { return UserInfoChange; } bool UserInfoChangeEvent::isTransientDetail() const { return m_is_transient_detail; } // ============================================================================ // Search Result Event // ============================================================================ /** * Constructor for a SearchResultEvent */ SearchResultEvent::SearchResultEvent(SearchResultEvent::SearchType t) : m_finished(false), m_expired(false), m_searchtype(t), m_last_contact(NULL), m_more_results(0) { } ContactRef SearchResultEvent::getLastContactAdded() const { return m_last_contact; } ContactList& SearchResultEvent::getContactList() { return m_clist; } void SearchResultEvent::setLastContactAdded(ContactRef c) { m_last_contact = c; } SearchResultEvent::SearchType SearchResultEvent::getSearchType() const { return m_searchtype; } bool SearchResultEvent::isFinished() const { return m_finished; } void SearchResultEvent::setFinished(bool b) { m_finished = b; } bool SearchResultEvent::isExpired() const { return m_expired; } void SearchResultEvent::setExpired(bool b) { m_expired = b; } unsigned int SearchResultEvent::getNumberMoreResults() const { return m_more_results; } void SearchResultEvent::setNumberMoreResults(unsigned int m) { m_more_results = m; } // ============================================================================ // Message Event // ============================================================================ /** * Constructor for a MessageEvent * * @param c the contact related to this event */ MessageEvent::MessageEvent(ContactRef c) : m_contact(c) { } /** * Destructor for MessageEvent */ MessageEvent::~MessageEvent() { } /** * get the contact related to the event * * @return the contact related to the event */ ContactRef MessageEvent::getContact() { return m_contact; } /** * get if a message event is finished. This is used in the message * ack'ing system. * * @return if message is finished */ bool MessageEvent::isFinished() const { return m_finished; } /** * get if a message event was delivered. This is used in the * message ack'ing system. * * @return if message was delivered */ bool MessageEvent::isDelivered() const { return m_delivered; } /** * get if a message event was sent direct. * This is used in the message ack'ing system. * * @return if message was sent direct */ bool MessageEvent::isDirect() const { return m_direct; } /** * set whether the message has been finished. This is used * internally by the library and is of no interest to the client. * * @param f if message was finished */ void MessageEvent::setFinished(bool f) { m_finished = f; } /** * set whether the message has been delivered. * @param f if message was delivered */ void MessageEvent::setDelivered(bool f) { m_delivered = f; } /** * set whether the message has been sent direct. This is used * internally by the library and is of no interest to the client. * * @param f if message was sent direct */ void MessageEvent::setDirect(bool f) { m_direct = f; } /** * set the reason for delivery failure. Used to indicate the * failure reason when a client marks a message as not accepted (by * setDeliverd(false) in the messaged callback). * * @param d delivery failure reason */ void MessageEvent::setDeliveryFailureReason(DeliveryFailureReason d) { m_failure_reason = d; } /** * get the reason for delivery failure. Defined when getFinished == * false and getDelivered == false too. This is used in the * message ack'ing system. * * @return reason for delivery failing */ MessageEvent::DeliveryFailureReason MessageEvent::getDeliveryFailureReason() const { return m_failure_reason; } // ============================================================================ // ICQ Message Event // ============================================================================ /** * Constructor for a ICQMessageEvent * * @param c the contact related to this event */ ICQMessageEvent::ICQMessageEvent(ContactRef c) : MessageEvent(c), m_urgent(false), m_tocontactlist(false), m_offline(false) { } /** * get whether the message was sent marked as urgent * * @return the urgency */ bool ICQMessageEvent::isUrgent() const { return m_urgent; } /** * set whether the message shall be marked as urgent * @param b urgent */ void ICQMessageEvent::setUrgent(bool b) { m_urgent = b; } /** * get whether the message was sent 'to contact list' * * @return whether message was to contact list */ bool ICQMessageEvent::isToContactList() const { return m_tocontactlist; } /** * set whether the message shall be marked as urgent */ void ICQMessageEvent::setToContactList(bool b) { m_tocontactlist = b; } /** * get if this was an offline message * * @return if this was an offline message */ bool ICQMessageEvent::isOfflineMessage() const { return m_offline; } /** * set whether this was an offline message */ void ICQMessageEvent::setOfflineMessage(bool b) { m_offline = b; } /** * get the uin of the sender. This is really miss-named, if you * were sending the message, this would be the UIN of the recipient. * * @return the uin */ unsigned int ICQMessageEvent::getSenderUIN() const { return m_contact->getUIN(); } /** * get the away message * * @return the away message */ string ICQMessageEvent::getAwayMessage() const { return m_away_message; } /** * set the away message * * @param msg the away message */ void ICQMessageEvent::setAwayMessage(const string& msg) { m_away_message = msg; } // ============================================================================ // Normal Message // ============================================================================ /** * Construct a NormalMessageEvent. * * @param c the contact related to the event * @param msg the message * @param multi tag message as a multireceipt message */ NormalMessageEvent::NormalMessageEvent(ContactRef c, const string& msg, bool multi) : ICQMessageEvent(c), m_message(msg), m_multi(multi), m_foreground(0x00000000), m_background(0x00ffffff) { setDirect(false); } /** * Construct a NormalMessageEvent. This constructor is only used by the library. * * @param c the contact related to the event * @param msg the message * @param multi tag message as a multireceipt message * @param t the time the message was sent */ NormalMessageEvent::NormalMessageEvent(ContactRef c, const string& msg, time_t t, bool multi) : ICQMessageEvent(c), m_message(msg), m_multi(multi), m_foreground(0x00000000), m_background(0x00ffffff) { setDirect(false); setOfflineMessage(true); m_time = t; } /** * Construct a NormalMessageEvent. * * @param c the contact related to the event * @param msg the message * @param fg foreground colour for the message * @param bg background colour for the message */ NormalMessageEvent::NormalMessageEvent(ContactRef c, const string& msg, unsigned int fg, unsigned int bg) : ICQMessageEvent(c), m_message(msg), m_multi(false) /* todo */, m_foreground(fg), m_background(bg) { setDirect(true); } MessageEvent::MessageType NormalMessageEvent::getType() const { return MessageEvent::Normal; } /** * get the message * * @return the message */ string NormalMessageEvent::getMessage() const { return m_message; } /** * get message encoding * * @return message encoding */ unsigned short NormalMessageEvent::getEncoding() const { return m_encoding; } /** * set message encoding * * @param encoding message encoding */ void NormalMessageEvent::setEncoding(const unsigned short encoding) { m_encoding = encoding; } /** * get if the message is a multiparty message * * @return if the message is a multiparty message */ bool NormalMessageEvent::isMultiParty() const { return m_multi; } /** * get the foreground colour of the message * * @return foreground colour of the message */ unsigned int NormalMessageEvent::getForeground() const { return m_foreground; } /** * get the background colour of the message * * @return background colour of the message */ unsigned int NormalMessageEvent::getBackground() const { return m_background; } /** * set the foreground colour of the message * * @param f foreground colour of the message */ void NormalMessageEvent::setForeground(unsigned int f) { m_foreground = f; } /** * set the background colour of the message * * @param b background colour of the message */ void NormalMessageEvent::setBackground(unsigned int b) { m_background = b; } ICQMessageEvent* NormalMessageEvent::copy() const { return new NormalMessageEvent(*this); } // ============================================================================ // URL Message // ============================================================================ /** * Construct an URLMessageEvent * * @param c the contact related to the event * @param msg the message * @param url the url */ URLMessageEvent::URLMessageEvent(ContactRef c, const string& msg, const string& url) : ICQMessageEvent(c), m_message(msg), m_url(url) { } /** * Construct an URLMessageEvent. This constructor is only used by the library. * * @param c the contact related to the event * @param msg the message * @param url the url * @param t time of sending */ URLMessageEvent::URLMessageEvent(ContactRef c, const string& msg, const string& url, time_t t) : ICQMessageEvent(c), m_message(msg), m_url(url) { setOfflineMessage(true); m_time = t; } MessageEvent::MessageType URLMessageEvent::getType() const { return MessageEvent::URL; } /** * get the message * * @return the message */ string URLMessageEvent::getMessage() const { return m_message; } /** * get the url * * @return the url */ string URLMessageEvent::getURL() const { return m_url; } ICQMessageEvent* URLMessageEvent::copy() const { return new URLMessageEvent(*this); } // ============================================================================ // SMS Message // ============================================================================ /** * Construct an SMSMessageEvent. * * @param c the source contact * @param msg the message * @param source the source (service) * @param senders_network the senders network * @param time the time of sending * * @todo fix parsing of time */ SMSMessageEvent::SMSMessageEvent(ContactRef c, const string& msg, const string& source, const string& senders_network, const string& time) : MessageEvent(c), m_message(msg), m_source(source), m_senders_network(senders_network) { // fix: m_time = time; } /** * Construct an SMSMessageEvent * * @param c the destination contact * @param msg the message * @param rcpt whether to request a delivery receipt */ SMSMessageEvent::SMSMessageEvent(ContactRef c, const string& msg, bool rcpt) : MessageEvent(c), m_message(msg), m_rcpt(rcpt) { } MessageEvent::MessageType SMSMessageEvent::getType() const { return MessageEvent::SMS; } /** * get the message * * @return the message */ string SMSMessageEvent::getMessage() const { return m_message; } /** * get the source * * @return the source */ string SMSMessageEvent::getSource() const { return m_source; } /** * get the sender (mobile no) * * @return the sender */ string SMSMessageEvent::getSender() const { return m_contact->getMobileNo(); } /** * get the senders network * * @return the senders network */ string SMSMessageEvent::getSenders_network() const { return m_senders_network; } /** * get if a receipt was requested * * @return if a receipt was requested */ bool SMSMessageEvent::getRcpt() const { return m_rcpt; } void SMSMessageEvent::setSMTPFrom(const string& from) { m_smtp_from = from; } string SMSMessageEvent::getSMTPFrom() const { return m_smtp_from; } void SMSMessageEvent::setSMTPTo(const string& to) { m_smtp_to = to; } string SMSMessageEvent::getSMTPTo() const { return m_smtp_to; } void SMSMessageEvent::setSMTPSubject(const string& subj) { m_smtp_subject = subj; } string SMSMessageEvent::getSMTPSubject() const { return m_smtp_subject; } // ============================================================================ // SMS Receipt Event // ============================================================================ /** * Construct an SMSReceiptEvent * * @param c the source contact * @param msg the message * @param message_id the message id * @param submission_time time of submission * @param delivery_time time of delivery * @param del if the message was delivered */ SMSReceiptEvent::SMSReceiptEvent(ContactRef c, const string& msg, const string& message_id, const string& submission_time, const string& delivery_time, bool del) : MessageEvent(c), m_message(msg), m_message_id(message_id), m_submission_time(submission_time), m_delivery_time(delivery_time), m_delivered(del) { } MessageEvent::MessageType SMSReceiptEvent::getType() const { return MessageEvent::SMS_Receipt; } /** * get the message * * @return the message */ string SMSReceiptEvent::getMessage() const { return m_message; } /** * get the message id * * @return the message id */ string SMSReceiptEvent::getMessageId() const { return m_message_id; } /** * get the destination mobile no * * @return the destination mobile no */ string SMSReceiptEvent::getDestination() const { return m_contact->getMobileNo(); } /** * get the submission time * * @return the submission time */ string SMSReceiptEvent::getSubmissionTime() const { return m_submission_time; } /** * get the delivery time * * @return the delivery time */ string SMSReceiptEvent::getDeliveryTime() const { return m_delivery_time; } /** * get if the message was delivered * * @return if the message was delivered */ bool SMSReceiptEvent::delivered() const { return m_delivered; } // ============================================================================ // Away Message // ============================================================================ /** * Construct an Away message * * @param c the contact */ AwayMessageEvent::AwayMessageEvent(ContactRef c) : ICQMessageEvent(c) { } MessageEvent::MessageType AwayMessageEvent::getType() const { return MessageEvent::AwayMessage; } ICQMessageEvent* AwayMessageEvent::copy() const { return new AwayMessageEvent(*this); } // ============================================================================ // Authorisation Request // ============================================================================ /** * Constructor for the Authorisation Request * * @param c the contact * @param msg authorisation message */ AuthReqEvent::AuthReqEvent(ContactRef c, const string& msg) : ICQMessageEvent(c), m_message(msg) {} /** * Constructor for the Authorisation Request * * @param c the contact * @param msg authorisation message */ AuthReqEvent::AuthReqEvent(ContactRef c, const string& msg, time_t t) : ICQMessageEvent(c), m_message(msg) { setOfflineMessage(true); m_time = t; } MessageEvent::MessageType AuthReqEvent::getType() const { return MessageEvent::AuthReq; } /** * get the authorisation message * * @return authorisation message */ string AuthReqEvent::getMessage() const { return m_message; } ICQMessageEvent* AuthReqEvent::copy() const { return new AuthReqEvent(*this); } // ============================================================================ // Authorisation Acknowledgement // ============================================================================ /** * Constructor for the Authorisation Acknowledgement * * @param c the contact * @param granted if authorisation was granted */ AuthAckEvent::AuthAckEvent(ContactRef c, bool granted) : ICQMessageEvent(c), m_granted(granted) {} /** * Constructor for the Authorisation Acknowledgement * * @param c the contact * @param msg the authorisation message * @param granted if authorisation was granted */ AuthAckEvent::AuthAckEvent(ContactRef c, const string& msg, bool granted) : ICQMessageEvent(c), m_message(msg), m_granted(granted) {} /** * Constructor for the Authorisation Acknowledgement * * @param c the contact * @param granted if authorisation was granted * @param t time the message was sent */ AuthAckEvent::AuthAckEvent(ContactRef c, bool granted, time_t t) : ICQMessageEvent(c), m_granted(granted) { setOfflineMessage(true); m_time = t; } /** * Constructor for the Authorisation Acknowledgement * * @param c the contact * @param msg the authorisation message * @param granted if authorisation was granted * @param t time the message was sent */ AuthAckEvent::AuthAckEvent(ContactRef c, const string& msg, bool granted, time_t t) : ICQMessageEvent(c), m_message(msg), m_granted(granted) { setOfflineMessage(true); m_time = t; } MessageEvent::MessageType AuthAckEvent::getType() const { return MessageEvent::AuthAck; } /** * get if the authorisation was granted * * @return if the authorisation was granted */ bool AuthAckEvent::isGranted() const { return m_granted; } /** * get the authorisation message * * @return the authorisation message */ string AuthAckEvent::getMessage() const { return m_message; } ICQMessageEvent* AuthAckEvent::copy() const { return new AuthAckEvent(*this); } // ============================================================================ // E-mail Express message // ============================================================================ EmailExEvent::EmailExEvent(ContactRef c, const string &email, const string &sender, const string &msg) : MessageEvent(c), m_sender(sender), m_email(email), m_message(msg) { } string EmailExEvent::getMessage() const { return m_message; } string EmailExEvent::getEmail() const { return m_email; } string EmailExEvent::getSender() const { return m_sender; } MessageEvent::MessageType EmailExEvent::getType() const { return MessageEvent::EmailEx; } // ============================================================================ // Web Pager message // ============================================================================ WebPagerEvent::WebPagerEvent(ContactRef c, const string& email, const string& sender, const string& msg) : MessageEvent(c), m_sender(sender), m_email(email), m_message(msg) { } string WebPagerEvent::getMessage() const { return m_message; } string WebPagerEvent::getEmail() const { return m_email; } string WebPagerEvent::getSender() const { return m_sender; } MessageEvent::MessageType WebPagerEvent::getType() const { return MessageEvent::WebPager; } // ============================================================================ // "You were added" message // ============================================================================ UserAddEvent::UserAddEvent(ContactRef c) : ICQMessageEvent(c) { } MessageEvent::MessageType UserAddEvent::getType() const { return MessageEvent::UserAdd; } unsigned int UserAddEvent::getSenderUIN() const { return m_contact->getUIN(); } ICQMessageEvent* UserAddEvent::copy() const { return new UserAddEvent(*this); } // ============================================================================ // Email Message // ============================================================================ EmailMessageEvent::EmailMessageEvent(ContactRef c, const string &msg) : MessageEvent(c), m_message(msg) { } string EmailMessageEvent::getMessage() const { return m_message; } EmailMessageEvent::MessageType EmailMessageEvent::getType() const { return MessageEvent::Email; } // ============================================================================ // File Transfer // ============================================================================ FileTransferEvent::FileTransferEvent(ContactRef c, const string& msg, const string& desc, unsigned int size, unsigned short seqnum) : ICQMessageEvent(c), m_message(msg), m_description(desc), m_totsize(size), m_seqnum(seqnum), m_state(NOT_CONNECTED), m_speed(100), m_pos(0), m_totpos(0) { } void FileTransferEvent::setState(FileTransferEvent::State st) { m_state = st; } FileTransferEvent::State FileTransferEvent::getState() { return m_state; } void FileTransferEvent::setError(const std::string& str) { m_error = str; } std::string FileTransferEvent::getError() { return m_error; } void FileTransferEvent::addFile(const std::string& file) { m_files.push_back(file); } std::string FileTransferEvent::getFile() { if (m_files.empty()) { return ""; } else { std::string str = m_files.front(); m_files.pop_front(); return str; } } unsigned int FileTransferEvent::getFilesInQueue() { return m_files.size(); } void FileTransferEvent::setSpeed(const unsigned int speed) { m_speed = speed; } unsigned int FileTransferEvent::getSpeed() { return m_speed; } std::string FileTransferEvent::getMessage() const { return m_message; } std::string FileTransferEvent::getDescription() const { return m_description; } void FileTransferEvent::setDescription(const std::string& str) { m_description = str; } string FileTransferEvent::getSavePath() const { return m_save_path; } void FileTransferEvent::setSavePath(const std::string& str) { m_save_path = str; } unsigned int FileTransferEvent::getSize() const { return m_size; } void FileTransferEvent::setTotalSize(unsigned int t_size) { m_totsize = t_size; } void FileTransferEvent::setTotalPos(unsigned int t_pos) { m_totpos = t_pos; } void FileTransferEvent::setSize(unsigned int size) { m_size = size; } unsigned int FileTransferEvent::getTotalSize() const { return m_totsize; } unsigned int FileTransferEvent::getTotalPos() const { return m_totpos; } unsigned int FileTransferEvent::getPos() const { return m_pos; } unsigned int FileTransferEvent::getTotalFiles() const { return m_totfiles; } unsigned int FileTransferEvent::getCurrFile() const { return m_currfile; } void FileTransferEvent::setPos(unsigned int pos) { m_pos = pos; } void FileTransferEvent::setTotalFiles(unsigned int nr) { m_totfiles = nr; } void FileTransferEvent::setCurrFile(unsigned int pos) { m_currfile = pos; } unsigned short FileTransferEvent::getPort() const { return m_port; } void FileTransferEvent::setPort(unsigned short port) { m_port = port; } FileTransferEvent::MessageType FileTransferEvent::getType() const { return MessageEvent::FileTransfer; } ICQMessageEvent* FileTransferEvent::copy() const { return new FileTransferEvent(*this); } string FileTransferEvent::getRefusalMessage() const { return m_refusal_message; } void FileTransferEvent::setRefusalMessage(const std::string& s) { m_refusal_message = s; } unsigned short FileTransferEvent::getSeqNum() const { return m_seqnum; } void FileTransferEvent::setSeqNum(unsigned short seqnum) { m_seqnum = seqnum; } // ============================================================================ // Contact(s) message // ============================================================================ ContactMessageEvent::ContactMessageEvent(ContactRef c, std::list content) : ICQMessageEvent(c), m_content(content) { } MessageEvent::MessageType ContactMessageEvent::getType() const { return MessageEvent::Contacts; } unsigned int ContactMessageEvent::getSenderUIN() const { return m_contact->getUIN(); } std::list ContactMessageEvent::getContacts() const { return m_content; } ICQMessageEvent* ContactMessageEvent::copy() const { return new ContactMessageEvent(*this); } // ============================================================================ // New UIN // ============================================================================ /** * Constructor for a NewUINEvent * * @param uin your new uin * @param success if registration was successful */ NewUINEvent::NewUINEvent(unsigned int uin, bool success) : m_uin(uin), m_success(success) { } /** * get your new uin * * @return the new uin */ unsigned int NewUINEvent::getUIN() const { return m_uin; } /** * get if registration was a success * * @return if registration was a success */ bool NewUINEvent::isSuccess() const { return m_success; } // ============================================================================ // Rate Info Change // ============================================================================ /** * Constructor for a RateInfoChangeEvent * * @param code the code * @param rateclass the rateclass * @param windowsize the size of the window * @param clear clear (?) * @param alert alert (?) * @param limit the limit * @param disconnect disconnect (?) * @param currentavg the current average * @param maxavg the maximum average */ RateInfoChangeEvent::RateInfoChangeEvent(unsigned short code, unsigned short rateclass, unsigned int windowsize, unsigned int clear, unsigned int alert, unsigned int limit, unsigned int disconnect, unsigned int currentavg, unsigned int maxavg) : m_code(code), m_rateclass(rateclass), m_windowsize(windowsize), m_clear(clear), m_alert(alert), m_limit(limit), m_disconnect(disconnect), m_currentavg(currentavg), m_maxavg(maxavg) { } } centerim-4.22.10/libicq2000/src/SNAC-base.cpp0000644000175000001440000001026211461606612015103 00000000000000/* * SNAC base classes * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SNAC-base.h" #include "TLV.h" #include "buffer.h" namespace ICQ2000 { // ------------------ Abstract SNACs --------------- SNAC::SNAC() : m_flags(0x0000), m_requestID(0x00000000) { } unsigned short SNAC::Flags() const { return m_flags; } unsigned int SNAC::RequestID() const { return m_requestID; } void SNAC::setRequestID(unsigned int id) { m_requestID = id; } void SNAC::setFlags(unsigned short fl) { m_flags = fl; } unsigned short InSNAC::Version() const { return m_version; } void InSNAC::Parse(Buffer& b) { b >> m_flags >> m_requestID; m_version = 0; if (m_flags & 0x8000) { // contains version TLV unsigned short dataLen = 0; b >> dataLen; unsigned int pos = b.pos(); if (dataLen >= 2) { unsigned short tlvType = 0; b >> tlvType; if (tlvType == 1) { unsigned short tlvLen = 0; b >> tlvLen; if (tlvLen >= 2) { b >> m_version; } } } b.setPos(pos + dataLen); } ParseBody(b); } void OutSNAC::Output(Buffer& b) const { OutputHeader(b); OutputBody(b); } void OutSNAC::OutputHeader(Buffer& b) const { b << Family(); b << Subtype(); b << Flags(); b << RequestID(); } // --------------- Raw SNAC --------------------------- RawSNAC::RawSNAC(unsigned short f, unsigned short t) : m_family(f), m_subtype(t) { } void RawSNAC::ParseBody(Buffer& b) { b.advance(b.size()); } void ErrorSNAC::initCodeDescriptions() { codeDescriptions[0x01] = "Invalid SNAC header"; codeDescriptions[0x02] = "Server rate limit exceeded"; codeDescriptions[0x03] = "Client rate limit exceeded"; codeDescriptions[0x04] = "Recipient is not logged in"; codeDescriptions[0x05] = "Requested service unavailable"; codeDescriptions[0x06] = "Requested service not defined"; codeDescriptions[0x07] = "You sent obsolete SNAC"; codeDescriptions[0x08] = "Not supported by server"; codeDescriptions[0x09] = "Not supported by client"; codeDescriptions[0x0A] = "Refused by client"; codeDescriptions[0x0B] = "Reply too big"; codeDescriptions[0x0C] = "Responses lost"; codeDescriptions[0x0D] = "Request denied"; codeDescriptions[0x0E] = "Incorrect SNAC format"; codeDescriptions[0x0F] = "Insufficient rights"; codeDescriptions[0x10] = "In local permit/deny (recipient blocked)"; codeDescriptions[0x11] = "Sender too evil"; codeDescriptions[0x12] = "Receiver too evil"; codeDescriptions[0x13] = "User temporarily unavailable"; codeDescriptions[0x14] = "No match"; codeDescriptions[0x15] = "List overflow"; codeDescriptions[0x16] = "Request ambiguous"; codeDescriptions[0x17] = "Server queue full"; codeDescriptions[0x18] = "Not while on AOL"; } ErrorInSNAC::ErrorInSNAC(unsigned short f, unsigned short t) : m_family(f), m_subtype(t) { } std::string ErrorSNAC::getErrorDescription() { if( codeDescriptions.empty() ) { initCodeDescriptions(); } std::string desc; if( codeDescriptions.count(m_error_code) == 0 ) { desc = "Unknown error"; } else { desc = codeDescriptions[m_error_code]; } return desc; } void ErrorInSNAC::ParseBody(Buffer& b) { b >> m_error_code; TLVList list; list.Parse(b, TLV_ParseMode_Channel02, 1); } Buffer& operator<<(Buffer& b, const ICQ2000::OutSNAC& snac) { snac.Output(b); return b; } } centerim-4.22.10/libicq2000/src/buffer.cpp0000644000175000001440000002052511461606612014723 00000000000000/* * Buffer class * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "buffer.h" #include #include using std::string; using std::endl; using std::ostream; namespace ICQ2000 { Buffer::Buffer() : m_data(), m_endn(BIG), m_out_pos(0) { } Buffer::Buffer(const unsigned char* d, unsigned int size) : m_data(d, d+size), m_endn(BIG), m_out_pos(0) { } Buffer::Buffer(Buffer& b, unsigned int start, unsigned int data_len) : m_data(b.m_data.begin()+start, b.m_data.begin()+start+data_len), m_endn(BIG), m_out_pos(0) { } unsigned char& Buffer::operator[](unsigned int p) { return m_data[p]; } void Buffer::clear() { m_data.clear(); m_out_pos = 0; } bool Buffer::empty() { return m_data.empty(); } void Buffer::chopOffBuffer(Buffer& b, unsigned int sz) { copy( m_data.begin(), m_data.begin()+sz, back_inserter(b.m_data) ); m_data.erase( m_data.begin(), m_data.begin()+sz ); m_out_pos = 0; } void Buffer::Pack(const unsigned char *d, unsigned int size) { copy(d, d+size, back_inserter(m_data)); } void Buffer::PackUint16StringNull(const string& s) { (*this) << (unsigned short)(s.size()+1); Pack(s); (*this) << (unsigned char)0x00; } void Buffer::PackByteString(const string& s) { (*this) << (unsigned char)(s.size()); Pack(s); } void Buffer::UnpackCRLFString(string& s) { iterator i; i = find(m_data.begin()+m_out_pos, m_data.end(), '\n'); if (i != m_data.end() ) { Unpack(s, i-m_data.begin()-m_out_pos+1); } } void Buffer::Pack(const string& s) { copy(s.begin(), s.end(), back_inserter(m_data)); } unsigned char Buffer::UnpackChar() { if (m_out_pos + 1 > m_data.size()) return 0; else return m_data[m_out_pos++]; } void Buffer::UnpackUint32String(string& s) { unsigned int l; (*this) >> l; Unpack(s, l); } void Buffer::UnpackUint16StringNull(string& s) { unsigned short sh; (*this) >> sh; if (sh > 0) { Unpack(s, sh-1); (*this).advance(1); } } void Buffer::UnpackByteString(string& s) { unsigned char c; (*this) >> c; Unpack(s, c); } void Buffer::Unpack(string& s, unsigned int size) { if (m_out_pos >= m_data.size()) return; if (m_out_pos+size > m_data.size()) size = m_data.size()-m_out_pos; iterator i = m_data.begin()+m_out_pos; iterator end = m_data.begin()+m_out_pos+size; while (i != end) { s += *i; ++i; } m_out_pos += size; } void Buffer::Unpack(unsigned char *const d, unsigned int size) { if (m_out_pos+size > m_data.size()) size = m_data.size()-m_out_pos; copy(m_data.begin()+m_out_pos, m_data.begin()+m_out_pos+size, d); m_out_pos += size; } Buffer::marker Buffer::getAutoSizeShortMarker() { // reserve a short (*this) << (unsigned short)0; marker m; m.position = size(); m.endianness = m_endn; m.size = 2; return m; } Buffer::marker Buffer::getAutoSizeIntMarker() { // reserve an int (*this) << (unsigned int)0; marker m; m.position = size(); m.endianness = m_endn; m.size = 4; return m; } void Buffer::setAutoSizeMarker(const marker& m) { unsigned int autosize = size() - m.position; if (m.size == 2) { if (m.endianness == BIG) { m_data[ m.position - 2 ] = ((autosize >> 8) & 0xff); m_data[ m.position - 1 ] = ((autosize >> 0) & 0xff); } else { m_data[ m.position - 2 ] = ((autosize >> 0) & 0xff); m_data[ m.position - 1 ] = ((autosize >> 8) & 0xff); } } else if (m.size == 4) { if (m.endianness == BIG) { m_data[ m.position - 4 ] = ((autosize >> 24) & 0xff); m_data[ m.position - 3 ] = ((autosize >> 16) & 0xff); m_data[ m.position - 2 ] = ((autosize >> 8) & 0xff); m_data[ m.position - 1 ] = ((autosize >> 0) & 0xff); } else { m_data[ m.position - 4 ] = ((autosize >> 0) & 0xff); m_data[ m.position - 3 ] = ((autosize >> 8) & 0xff); m_data[ m.position - 2 ] = ((autosize >> 16) & 0xff); m_data[ m.position - 1 ] = ((autosize >> 24) & 0xff); } } } // -- Input stream methods -- Buffer& Buffer::operator<<(unsigned char l) { m_data.push_back(l); return (*this); } Buffer& Buffer::operator<<(unsigned short l) { if (m_endn == BIG) { m_data.push_back((l>>8) & 0xFF); m_data.push_back(l & 0xFF); } else { m_data.push_back(l & 0xFF); m_data.push_back((l>>8) & 0xFF); } return (*this); } Buffer& Buffer::operator<<(unsigned int l) { if (m_endn == BIG) { m_data.push_back((l >> 24) & 0xFF); m_data.push_back((l >> 16) & 0xFF); m_data.push_back((l >> 8) & 0xFF); m_data.push_back(l & 0xFF); } else { m_data.push_back(l & 0xFF); m_data.push_back((l >> 8) & 0xFF); m_data.push_back((l >> 16) & 0xFF); m_data.push_back((l >> 24) & 0xFF); } return (*this); } // strings stored as length (2 bytes), string m_data, _not_ null-terminated Buffer& Buffer::operator<<(const string& s) { (*this) << (unsigned short)s.size(); Pack(s); return (*this); } // -- Output stream methods -- Buffer& Buffer::operator>>(unsigned char& l) { if (m_out_pos + 1 > m_data.size()) l = 0; else l = m_data[m_out_pos++]; return (*this); } Buffer& Buffer::operator>>(unsigned short& l) { if (m_out_pos + 2 > m_data.size()) { l = 0; m_out_pos += 2; } else { if (m_endn == BIG) { l = ((unsigned short)m_data[m_out_pos++] << 8) + ((unsigned short)m_data[m_out_pos++]); } else { l = ((unsigned short)m_data[m_out_pos++]) + ((unsigned short)m_data[m_out_pos++] << 8); } } return (*this); } Buffer& Buffer::operator>>(unsigned int& l) { if (m_out_pos + 4 > m_data.size()) { l = 0; m_out_pos += 4; } else { if (m_endn == BIG) { l = ((unsigned int)m_data[m_out_pos++] << 24) + ((unsigned int)m_data[m_out_pos++] << 16) + ((unsigned int)m_data[m_out_pos++] << 8) + ((unsigned int)m_data[m_out_pos++]); } else { l = ((unsigned int)m_data[m_out_pos++]) + ((unsigned int)m_data[m_out_pos++] << 8) + ((unsigned int)m_data[m_out_pos++] << 16) + ((unsigned int)m_data[m_out_pos++] << 24); } } return (*this); } // strings stored as length (2 bytes), string data, _not_ null-terminated Buffer& Buffer::operator>>(string& s) { if (m_out_pos + 2 > m_data.size()) { s = ""; // clear() method doesn't seem to exist! m_out_pos += 2; } else { unsigned short sz; (*this) >> sz; Unpack(s, sz); } return (*this); } void Buffer::setEndianness(endian e) { m_endn = e; } void Buffer::setBigEndian() { m_endn = BIG; } void Buffer::setLittleEndian() { m_endn = LITTLE; } void Buffer::dump(ostream& out) { char d[] = "123456789abcdef0"; out << std::hex << std::setfill('0'); unsigned int m = ((m_data.size()+15)/16)*16; for (unsigned int a = 0; a < m; a++) { if (a % 16 == 0) out << std::setw(4) << a << " "; if (a < m_data.size()) { out << std::setw(2) << (int)m_data[a] << " "; d[a%16] = isprint(m_data[a]) ? (m_data[a] < 0x80 ? m_data[a] : '.') : '.'; // restrict output to a definitely non UTF-8 character set } else { out << " "; d[a%16] = ' '; } if (a % 16 == 15) out << " " << d << endl; } } ostream& operator<<(ostream& out, Buffer& b) { b.dump(out); return out; } } centerim-4.22.10/libicq2000/src/RateLimits.h0000644000175000001440000000511411461606612015171 00000000000000/* * RateLimits - Limitation of rate of messages between server and client * * Copyright (C) 2007 Stéphane Bisinger * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef __LIBICQ2000_RATE_LIMITS_H #define __LIBICQ2000_RATE_LIMITS_H #include "buffer.h" #include namespace ICQ2000 { class RateClass { public: RateClass(); RateClass(unsigned int win, unsigned int clr, unsigned int alrt, unsigned int lim, unsigned int disc, unsigned int cur, unsigned int max, unsigned int last, unsigned char cur_st); ~RateClass() {} unsigned int getWindow() const { return window; } unsigned int getClearLevel() const { return clear_l; } unsigned int getAlertLevel() const { return alert_l; } unsigned int getLimitedLevel() const { return limited_l; } unsigned int getDisconnectedLevel() const { return disconnected_l; } unsigned int getCurrentLevel() const { return current_l; } unsigned int getMaxLevel() const { return max_l; } unsigned int getLastTime() const { return last_time; } unsigned int getCurrentState() const { return current_state; } void setMembers( unsigned short n, Buffer& b ); std::multimap getMembers() const { return members; } RateClass& operator<<(Buffer& b); private: unsigned int window; unsigned int clear_l; unsigned int alert_l; unsigned int limited_l; unsigned int disconnected_l; unsigned int current_l; unsigned int max_l; unsigned int last_time; unsigned char current_state; std::multimap members; }; } #endif centerim-4.22.10/libicq2000/src/Xml.h0000644000175000001440000000516211461606612013657 00000000000000/* * XML Parser/Generator * Simple XML parser/generator sufficient to * send+receive the XML in ICQ SMS messages * * Copyright (C) 2001 Barnaby Gray . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef XML_H #define XML_H #include #include #include class XmlLeaf; class XmlNode { private: static std::string parseTag(std::string::iterator& curr, std::string::iterator end); static void skipWS(std::string::iterator& curr, std::string::iterator end); void parseAttr(const std::string &t); protected: std::string tag; std::list > attributes; XmlNode(const std::string& t); public: virtual ~XmlNode(); virtual bool isBranch() = 0; bool isLeaf(); std::string getTag(); std::string getAttrib(const std::string &aname) const; bool existsAttrib(const std::string& attrib) const; static XmlNode *parse(std::string::iterator& start, std::string::iterator end); static std::string quote(const std::string& s); static std::string unquote(const std::string& s); static std::string replace_all(const std::string& s, const std::string& r1, const std::string& r2); virtual std::string toString(int n) = 0; }; class XmlLeaf : public XmlNode { private: std::string name, value; public: XmlLeaf(const std::string& t, const std::string& v); virtual ~XmlLeaf(); bool isBranch(); std::string getValue(); virtual std::string toString(int n); }; class XmlBranch : public XmlNode { private: std::list children; public: XmlBranch(const std::string& t); virtual ~XmlBranch(); bool isBranch(); bool exists(const std::string& tag); XmlNode *getNode(const std::string& tag, int n = 0); XmlBranch *getBranch(const std::string& tag, int n = 0); XmlLeaf *getLeaf(const std::string& tag); std::list getChildren() const; void pushnode(XmlNode *c); std::string toString(int n); }; #endif centerim-4.22.10/libicq2000/src/SNAC-LOC.cpp0000644000175000001440000000207411461606612014610 00000000000000/* * SNAC - Location services * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "SNAC-LOC.h" #include "TLV.h" namespace ICQ2000 { // --------------- Location (Family 0x0002) SNACs ---------------- void SetUserInfoSNAC::OutputBody(Buffer& b) const { UserInfoCapabilitiesTLV ctlv; b << ctlv; } } centerim-4.22.10/libicq2000/src/SeqNumCache.h0000644000175000001440000000250211461606612015246 00000000000000/* * SeqNumCache * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef SEQNUMCACHE_H #define SEQNUMCACHE_H #include "Cache.h" #include "events.h" #include "libicq2000/sigslot.h" namespace ICQ2000 { class SeqNumCache : public Cache { public: SeqNumCache() { } ~SeqNumCache() { removeAll(); } void expireItem(const SeqNumCache::literator& l) { expired.emit( (*l).getValue() ); Cache::expireItem(l); } sigslot::signal1 expired; }; } #endif centerim-4.22.10/libicq2000/libicq2000/0000755000175000001440000000000011473011456013777 500000000000000centerim-4.22.10/libicq2000/libicq2000/ref_ptr.h0000644000175000001440000000475611461606612015546 00000000000000// -*- mode: C++ -*- /* * ref_ptr. A reference counted template class. Similar to the STL * auto_ptr, but generalised for reference counting. * * Copyright (C) 2002 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef REF_PTR_H #define REF_PTR_H namespace ICQ2000 { template class ref_ptr { protected: Object *m_instance; /* note: the actual reference count is controlled on the object - it turned out problematic having it stored in the ref_ptr, for reasons I won't go into here ;-) */ public: ref_ptr() : m_instance(NULL) { } ref_ptr(const ref_ptr& that) : m_instance(that.m_instance) { if (m_instance != NULL) ++(m_instance->count); } ref_ptr(Object *o) : m_instance(o) { if (m_instance != NULL) ++(m_instance->count); /* zeroed inside Contact now */ } ~ref_ptr() { if (m_instance != NULL && --(m_instance->count) == 0) delete m_instance; } Object* get() { return m_instance; } const Object* get() const { return m_instance; } Object* operator->() { return m_instance; } const Object* operator->() const { return m_instance; } Object& operator*() { return *m_instance; } const Object& operator*() const { return *m_instance; } // for debugging unsigned int count() const { return m_instance->count; } ref_ptr& operator=(const ref_ptr& that) { if (m_instance != NULL && --(m_instance->count) == 0) { delete m_instance; } m_instance = that.m_instance; if (m_instance != NULL) ++(m_instance->count); return *this; } }; } #endif centerim-4.22.10/libicq2000/libicq2000/Client.h0000644000175000001440000004353711461606612015323 00000000000000/** * libICQ2000 Client header * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef CLIENT_H #define CLIENT_H #include #include #include #include #include #include #include #include #include #include #include #include namespace ICQ2000 { /* predeclare classes */ class MessageSNAC; class MessageACKSNAC; class MessageOfflineUserSNAC; class MessageTypingNotificationSNAC; class SrvResponseSNAC; class UINResponseSNAC; class RateInfoChangeSNAC; class BuddyOnlineSNAC; class BuddyOfflineSNAC; class UserInfoSNAC; class OutSNAC; class DirectClient; class DCCache; class MessageHandler; class RequestIDCache; class RequestIDCacheValue; class ICBMCookieCache; class SMTPClient; class SocketClient; class Buffer; class TCPSocket; class TCPServer; class Translator; class FileTransferClient; class FTCache; class SBLListSNAC; /** * The main library object. This is the object the user interface * instantiates for a connection, hooks up to signal on and has the * methods to connect, disconnect and send events from. */ class Client : public sigslot::has_slots<> { private: enum State { NOT_CONNECTED, AUTH_AWAITING_CONN_ACK, AUTH_AWAITING_AUTH_REPLY, BOS_AWAITING_CONN_ACK, BOS_AWAITING_LOGIN_REPLY, BOS_LOGGED_IN, UIN_AWAITING_CONN_ACK, UIN_AWAITING_UIN_REPLY } m_state; enum Sbl_op { USER_ADD, USER_REMOVE, GROUP_ADD, GROUP_REMOVE }; struct Sbl_edit { Sbl_op operation; Sbl_item item; }; unsigned short get_random_buddy_id(); void processSblEdits(); std::deque m_sbl_edits; // edits on m_sbl_* std::map m_sbl_map; // uin:info std::map m_sbl_groups; // name:info std::map m_sbl_groupnames; // group_id::group_name std::set m_sbl_tags; // used tag ids bool m_sbl_canedit; // local SBL is ready, I can do edits on it unsigned short m_sbl_privacy_id; // privacy buddy ID ContactRef m_self; std::string m_password; Status m_status_wanted; bool m_invisible_wanted; bool m_web_aware; unsigned short m_random_group; std::string m_authorizerHostname; unsigned short m_authorizerPort; std::string m_bosHostname; unsigned short m_bosPort; bool m_bosOverridePort; std::string m_client_bind_host; bool m_in_dc, m_out_dc; unsigned short m_client_seq_num; unsigned int m_requestid; Translator * m_translator; ContactTree m_contact_tree; ContactList m_visible_list; ContactList m_invisible_list; bool m_fetch_sbl; bool m_sbl_inedit; std::deque sblSNACs; MessageHandler * m_message_handler; unsigned char *m_cookie_data; unsigned short m_cookie_length; unsigned int m_ext_ip; bool m_use_portrange; bool m_use_typing_notif; unsigned short m_upper_port, m_lower_port; TCPSocket * m_serverSocket; TCPServer * m_listenServer; SMTPClient * m_smtp; DCCache * m_dccache; FTCache * m_ftcache; time_t m_last_server_ping; RequestIDCache * m_reqidcache; ICBMCookieCache * m_cookiecache; Buffer * m_recv; void Init(); unsigned short NextSeqNum(); unsigned int NextRequestID(); void ConnectAuthorizer(State state); void DisconnectAuthorizer(); void ConnectBOS(); void DisconnectBOS(); // -- Ping server -- void PingServer(); DirectClient* ConnectDirect(const ContactRef& c); void DisconnectDirectConns(); void DisconnectDirectConn(int fd); // ------------------ Signal dispatchers ----------------- void SignalConnect(); void SignalDisconnect(DisconnectedEvent::Reason r); void SignalMessage(MessageSNAC *snac); void SignalMessageACK(MessageACKSNAC *snac); void SignalMessageOfflineUser(MessageOfflineUserSNAC *snac); void SignalTypingNotification(MessageTypingNotificationSNAC *snac); void SignalSrvResponse(SrvResponseSNAC *snac); void SignalUINResponse(UINResponseSNAC *snac); void SignalUINRequestError(); void SignalRateInfoChange(RateInfoChangeSNAC *snac); void SignalLog(LogEvent::LogType type, const std::string& msg); void SignalUserOnline(BuddyOnlineSNAC *snac); void SignalUserOffline(BuddyOfflineSNAC *snac); void SignalAddSocket(int fd, SocketEvent::Mode m); void SignalRemoveSocket(int fd); // ------------------ Outgoing packets ------------------- // -------------- Callbacks from ContactList ------------- void contactlist_cb(ContactListEvent *ev); // ------- Callbacks from visible, invisible lists ------- void visiblelist_cb(ContactListEvent *ev); void invisiblelist_cb(ContactListEvent *ev); // -------------- Callbacks from Contacts ---------------- void SendAuthReq(); void SendNewUINReq(); void SendCookie(); void SendCapabilities(); void SendRateInfoRequest(); void SendRateInfoAck(); void SendPersonalInfoRequest(); void SendAddICBMParameter(); void SendSetUserInfo(); void SendLogin(); void SendRequestSBL(); void SendSBLReceivedACK(); void SendOfflineMessagesACK(); void SendAdvancedACK(MessageSNAC *snac); void Send(Buffer& b); void HandleUserInfoSNAC(UserInfoSNAC *snac); void FLAPwrapSNAC(Buffer& b, const OutSNAC& snac); void FLAPwrapSNACandSend(const OutSNAC& snac); // ------------------ Incoming packets ------------------- /** * non-blocking receives all waiting packets from server * and parses and handles them */ void RecvFromServer(); void Parse(); void ParseCh1(Buffer& b, unsigned short seq_num); void ParseCh2(Buffer& b, unsigned short seq_num); void ParseCh3(Buffer& b, unsigned short seq_num); void ParseCh4(Buffer& b, unsigned short seq_num); // ------------------------------------------------------- ContactRef getUserInfoCacheContact(unsigned int reqid); void fillSBLMap(SBLListSNAC *sbl); void mergeSBL(ContactTree& tree); void SendSBLAuthReq(AuthReqEvent *ev); void SendSBLAuthReply(AuthAckEvent *ev); void ICBMCookieCache_expired_cb(MessageEvent *ev); void dccache_expired_cb(DirectClient *dc); void ftcache_expired_cb(FileTransferClient *ftc); void reqidcache_expired_cb( RequestIDCacheValue *v ); void dc_connected_cb(SocketClient *dc); void dc_log_cb(LogEvent *ev); void dc_socket_cb(SocketEvent *ev); void dc_messageack_cb(MessageEvent *ev); void ftc_messageack_cb(MessageEvent *ev); bool SendDirect(MessageEvent *ev); void SendViaServer(MessageEvent *ev); void SendViaServerAdvanced(MessageEvent *ev); void SendViaServerNormal(MessageEvent *ev); void Disconnect(DisconnectedEvent::Reason r = DisconnectedEvent::REQUESTED); public: Client(); Client(const unsigned int uin, const std::string& password); ~Client(); void setUIN(unsigned int uin); unsigned int getUIN() const; void setPassword(const std::string& password); std::string getPassword() const; ContactRef getSelfContact(); bool setTranslationMap(const std::string& szMapFileName); const std::string& getTranslationMapFileName() const; const std::string& getTranslationMapName() const; bool usingDefaultMap() const; // -- Signals -- /** * The signal to connect to for listening to ConnectingEvent's. * A ConnectingEvent is signalled when the client is trying to go online. * @see connected, ConnectingEvent */ sigslot::signal1 connecting; /** * The signal to connect to for listening to ConnectedEvent's. * A ConnectedEvent is signalled when the client is online proper. * @see disconnected, ConnectedEvent */ sigslot::signal1 connected; sigslot::signal1 sbl_received; /** * The signal to connect to for listening to DisconnectedEvent's. * A DisconnectedEvent is signalled when you were disconnected * from the server. This could have been because it was * requested, or the server might have chucked you off. More * information can be in the DisconnectedEvent. * * DisconnectedEvent's don't necessarily match a ConnectedEvent, * if you try connecting with an incorrect password, you will * never get a ConnectedEvent before the DisconnectedEvent * signalling incorrect password. * @see connected, DisconnectedEvent */ sigslot::signal1 disconnected; /** * The signal to connect to for listening to incoming * MessageEvent. This includes far more than just messages. * @see MessageEvent */ sigslot::signal1 messaged; /** * The signal to connect to for listening to the acknowledgements * that the library will generate for when the remote client * sends back a message ack. Additionally it will it is used for * signalling to the Client message delivery failures and when * messages are being reattempted to be send through the server. * @see messaged, MessageEvent */ sigslot::signal1 messageack; /** * The signal to connect to for listening to Contact list events. * @see ContactListEvent */ sigslot::signal1 contactlist; /** * The signal to connect to for listening for Contact Userinfo events. * @see UserInfoChangeEvent */ sigslot::signal1 contact_userinfo_change_signal; /** * The signal to connect to for listening for Contact Status change events. * @see StatusChangeEvent */ sigslot::signal1 contact_status_change_signal; /** * The signal to connect to for listening for Contact Typing Notification events. * @see UserTypingNotificationEvent */ sigslot::signal1 contact_typing_signal; /** * The signal for when registering a new UIN has succeeded or * failed after a call to RegisterUIN(). * @see NewUINEvent, RegisterUIN */ sigslot::signal1 newuin; /** * The signal for when the server signals the rate at which the client * is sending has been changed. * @see RateInfoChangeEvent */ sigslot::signal1 rate; /** * The signal for all logging messages that are passed back to * the client. This leads to a very flexible logging system, as * the user interface may decide where to write the log message * to (stdout, a dialog box, etc..) and also may pick which type * of log messages to display and which to ignore. * @see LogEvent */ sigslot::signal1 logger; /** * The signal for socket events. All clients must listen to this * and implement their particular scheme of blocking on multiple * sockets for read/write/exception, usually the select system * call in someway. Often toolkits will hide all the details of * select inside them, such as the way gtk or gtkmm do. * * @see SocketEvent */ sigslot::signal1 socket; /** * The signal to connect to for listening for Self Contact Userinfo events. * @see UserInfoChangeEvent */ sigslot::signal1 self_contact_userinfo_change_signal; /** * The signal to connect to for listening for Self Contact Status change events. * @see StatusChangeEvent */ sigslot::signal1 self_contact_status_change_signal; /** * Signal when someone requests your away message. The client * should setMessage in the AutoMessageEvent to what your away * message is. This allows dynamic away messages for different * people. */ sigslot::signal1 want_auto_resp; /** * Signal when a Search Result has been updated. The last signal * on a search result will be with * SearchResultEvent::isFinished() set to true. After this the * event is finished and deleted from memory by the library. */ sigslot::signal1 search_result; /** * Signal when an incoming file transfer request is received. */ sigslot::signal1 filetransfer_incoming_signal; /** * Signal when a FileTransferEvent object is updated. */ sigslot::signal1 filetransfer_update_signal; // ------------- // -- Send calls -- void SendEvent(MessageEvent *ev); // -- File Transfer methods -- void SendFileTransfer(FileTransferEvent *ev); void SendFileTransferACK(FileTransferEvent *ev); void CancelFileTransfer(FileTransferEvent *ev); // -- Set Status -- void setStatus(const Status st); void setStatus(const Status st, bool inv); void setInvisible(bool inv); void setWebAware(bool wa); void setRandomChatGroup(unsigned short group); Status getStatus() const; bool getInvisible() const; Status getStatusWanted() const; bool getInvisibleWanted() const; bool getWebAware() const; void uploadSelfDetails(); void uploadServerBasedContact(const ContactRef& c); void uploadServerBasedGroup(const ContactTree::Group& gp); void uploadServerBasedContactList(); void updateServerBasedContact(const ContactRef& c); void removeServerBasedContact(const ContactRef& c); void removeServerBasedGroup(const ContactTree::Group& gp); void removeServerBasedContactList(); // -- Contact List -- void addVisible(ContactRef c); void removeVisible(const unsigned int uin); void addInvisible(ContactRef c); void removeInvisible(const unsigned int uin); ContactRef getContact(const unsigned int uin); ContactTree& getContactTree(); void fetchSimpleContactInfo(ContactRef c); void fetchDetailContactInfo(ContactRef c); void fetchServerBasedContactList(); void fetchServerBasedContactList(int); // the conditional form - TODO! void fetchSelfSimpleContactInfo(); void fetchSelfDetailContactInfo(); void SendSBLSNAC(OutSNAC *sn); // send SBL SNAC void upgradeToSBL(); // save local contact to SBL // -- Whitepage searches -- SearchResultEvent* searchForContacts(const std::string& nickname, const std::string& firstname, const std::string& lastname); SearchResultEvent* searchForContacts(const std::string& nickname, const std::string& firstname, const std::string& lastname, const std::string& email, AgeRange age, Sex sex, unsigned char language, const std::string& city, const std::string& state, unsigned short country, const std::string& company_name, const std::string& department, const std::string& position, bool only_online); SearchResultEvent* searchForContacts(unsigned int uin); SearchResultEvent* searchForContacts(const std::string& keyword); SearchResultEvent* searchForContacts(RandomChatGroup group); /* * Poll must be called regularly (at least every 60 seconds) * but I recommended 5 seconds, so timeouts work with good * granularity. * It is not related to the socket callback - the client using * this library must select() on the sockets it gets signalled * and call socket_cb when select returns a status flag on one * of the sockets. ickle simply uses the gtk-- built in signal handlers * to do all this. */ // -- Network settings -- void setLoginServerHost(const std::string& host); std::string getLoginServerHost() const; void setLoginServerPort(const unsigned short& port); unsigned short getLoginServerPort() const; void setBOSServerOverridePort(const bool& b); bool getBOSServerOverridePort() const; void setBOSServerPort(const unsigned short& port); unsigned short getBOSServerPort() const; void setSMTPServerHost(const std::string& host); std::string getSMTPServerHost() const; void setSMTPServerPort(unsigned short port); unsigned short getSMTPServerPort() const; void setAcceptInDC(bool d); bool getAcceptInDC() const; void setUseOutDC(bool d); bool getUseOutDC() const; void setPortRangeLowerBound(unsigned short lower); void setPortRangeUpperBound(unsigned short upper); unsigned short getPortRangeLowerBound() const; unsigned short getPortRangeUpperBound() const; void setUsePortRange(bool b); bool getUsePortRange() const; void setClientBindHost(const std::string& host); std::string getClientBindHost() const; void setTypingNotifications(bool b); void Poll(); void socket_cb(int fd, SocketEvent::Mode m); void RegisterUIN(); /* isConnected() is a convenience for the * client, it should correspond exactly to ConnectedEvents * & DisconnectedEvents the client gets */ bool isConnected() const; void set_translator(Translator * t); }; } #endif centerim-4.22.10/libicq2000/libicq2000/userinfoconstants.h0000644000175000001440000004711211461606612017665 00000000000000/* * User Info Constants * External constants that clients will use * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef USERINFOCONSTANTS_H #define USERINFOCONSTANTS_H namespace ICQ2000 { /* * Enums for user info constants * Whilst they're all basically just binary compatible with the underlying * ICQ binary values, the idea is your client shouldn't be exposed raw * numbers, heavens the thought! */ enum Sex { SEX_UNKNOWN = 0, SEX_FEMALE = 1, SEX_MALE = 2 }; enum Timezone { TIMEZONE_UNKNOWN = -100, TIMEZONE_PLUS_12H00M = -24, TIMEZONE_PLUS_11H30M = -23, TIMEZONE_PLUS_11H00M = -22, TIMEZONE_PLUS_10H30M = -21, TIMEZONE_PLUS_10H00M = -20, TIMEZONE_PLUS_09H30M = -19, TIMEZONE_PLUS_09H00M = -18, TIMEZONE_PLUS_08H30M = -17, TIMEZONE_PLUS_08H00M = -16, TIMEZONE_PLUS_07H30M = -15, TIMEZONE_PLUS_07H00M = -14, TIMEZONE_PLUS_06H30M = -13, TIMEZONE_PLUS_06H00M = -12, TIMEZONE_PLUS_05H30M = -11, TIMEZONE_PLUS_05H00M = -10, TIMEZONE_PLUS_04H30M = -9, TIMEZONE_PLUS_04H00M = -8, TIMEZONE_PLUS_03H30M = -7, TIMEZONE_PLUS_03H00M = -6, TIMEZONE_PLUS_02H30M = -5, TIMEZONE_PLUS_02H00M = -4, TIMEZONE_PLUS_01H30M = -3, TIMEZONE_PLUS_01H00M = -2, TIMEZONE_PLUS_00H30M = -1, TIMEZONE_GMT = 0, TIMEZONE_MINUS_00H30M = 1, TIMEZONE_MINUS_01H00M = 2, TIMEZONE_MINUS_01H30M = 3, TIMEZONE_MINUS_02H00M = 4, TIMEZONE_MINUS_02H30M = 5, TIMEZONE_MINUS_03H00M = 6, TIMEZONE_MINUS_03H30M = 7, TIMEZONE_MINUS_04H00M = 8, TIMEZONE_MINUS_04H30M = 9, TIMEZONE_MINUS_05H00M = 10, TIMEZONE_MINUS_05H30M = 11, TIMEZONE_MINUS_06H00M = 12, TIMEZONE_MINUS_06H30M = 13, TIMEZONE_MINUS_07H00M = 14, TIMEZONE_MINUS_07H30M = 15, TIMEZONE_MINUS_08H00M = 16, TIMEZONE_MINUS_08H30M = 17, TIMEZONE_MINUS_09H00M = 18, TIMEZONE_MINUS_09H30M = 19, TIMEZONE_MINUS_10H00M = 20, TIMEZONE_MINUS_10H30M = 21, TIMEZONE_MINUS_11H00M = 22, TIMEZONE_MINUS_11H30M = 23, TIMEZONE_MINUS_12H00M = 24 }; enum Language { LANGUAGE_UNKNOWN = 0, LANGUAGE_ARABIC = 1, LANGUAGE_BHOJPURI = 2, LANGUAGE_BULGARIAN = 3, LANGUAGE_BURMESE = 4, LANGUAGE_CANTONESE = 5, LANGUAGE_CATALAN = 6, LANGUAGE_CHINESE = 7, LANGUAGE_CROATIAN = 8, LANGUAGE_CZECH = 9, LANGUAGE_DANISH = 10, LANGUAGE_DUTCH = 11, LANGUAGE_ENGLISH = 12, LANGUAGE_ESPERANTO = 13, LANGUAGE_ESTONIAN = 14, LANGUAGE_FARSI = 15, LANGUAGE_FINNISH = 16, LANGUAGE_FRENCH = 17, LANGUAGE_GAELIC = 18, LANGUAGE_GERMAN = 19, LANGUAGE_GREEK = 20, LANGUAGE_HEBREW = 21, LANGUAGE_HINDI = 22, LANGUAGE_HUNGARIAN = 23, LANGUAGE_ICELANDIC = 24, LANGUAGE_INDONESIAN = 25, LANGUAGE_ITALIAN = 26, LANGUAGE_JAPANESE = 27, LANGUAGE_KHMER = 28, LANGUAGE_KOREAN = 29, LANGUAGE_LAO = 30, LANGUAGE_LATVIAN = 31, LANGUAGE_LITHUANIAN = 32, LANGUAGE_MALAY = 33, LANGUAGE_NORWEGIAN = 34, LANGUAGE_POLISH = 35, LANGUAGE_PORTUGUESE = 36, LANGUAGE_ROMANIAN = 37, LANGUAGE_RUSSIAN = 38, LANGUAGE_SERBIAN = 39, LANGUAGE_SLOVAK = 40, LANGUAGE_SLOVENIAN = 41, LANGUAGE_SOMALI = 42, LANGUAGE_SPANISH = 43, LANGUAGE_SWAHILI = 44, LANGUAGE_SWEDISH = 45, LANGUAGE_TAGALOG = 46, LANGUAGE_TATAR = 47, LANGUAGE_THAI = 48, LANGUAGE_TURKISH = 49, LANGUAGE_UKRAINIAN = 50, LANGUAGE_URDU = 51, LANGUAGE_VIETNAMESE = 52, LANGUAGE_YIDDISH = 53, LANGUAGE_YORUBA = 54, LANGUAGE_TAIWANESE = 55, LANGUAGE_AFRIKAANS = 56, LANGUAGE_PERSIAN = 57, LANGUAGE_ALBANIAN = 58, LANGUAGE_ARMENIAN = 59 }; enum Country { COUNTRY_UNKNOWN = 0, COUNTRY_AFGHANISTAN = 93, COUNTRY_ALBANIA = 355, COUNTRY_ALGERIA = 213, COUNTRY_AMERICAN_SAMOA = 684, COUNTRY_ANDORRA = 376, COUNTRY_ANGOLA = 244, COUNTRY_ANGUILLA = 101, COUNTRY_ANTIGUA = 102, COUNTRY_ARGENTINA = 54, COUNTRY_ARMENIA = 374, COUNTRY_ARUBA = 297, COUNTRY_ASCENSION_ISLAND = 247, COUNTRY_AUSTRALIA = 61, COUNTRY_AUSTRALIAN_ANTARCTIC_TERRITORY = 6721, COUNTRY_AUSTRIA = 43, COUNTRY_AZERBAIJAN = 994, COUNTRY_BAHAMAS = 103, COUNTRY_BAHRAIN = 973, COUNTRY_BANGLADESH = 880, COUNTRY_BARBADOS = 104, COUNTRY_BARBUDA = 120, COUNTRY_BELARUS = 375, COUNTRY_BELGIUM = 32, COUNTRY_BELIZE = 501, COUNTRY_BENIN = 229, COUNTRY_BERMUDA = 105, COUNTRY_BHUTAN = 975, COUNTRY_BOLIVIA = 591, COUNTRY_BOSNIA_AND_HERZEGOVINA = 387, COUNTRY_BOTSWANA = 267, COUNTRY_BRAZIL = 55, COUNTRY_BRITISH_VIRGIN_ISLANDS = 106, COUNTRY_BRUNEI = 673, COUNTRY_BULGARIA = 359, COUNTRY_BURKINA_FASO = 226, COUNTRY_BURUNDI = 257, COUNTRY_CAMBODIA = 855, COUNTRY_CAMEROON = 237, COUNTRY_CANADA = 107, COUNTRY_CAPE_VERDE_ISLANDS = 238, COUNTRY_CAYMAN_ISLANDS = 108, COUNTRY_CENTRAL_AFRICAN_REPUBLIC = 236, COUNTRY_CHAD = 235, COUNTRY_CHILE = 56, COUNTRY_CHINA = 86, COUNTRY_CHRISTMAS_ISLAND = 672, COUNTRY_COCOS_KEELING_ISLANDS = 6101, COUNTRY_COLOMBIA = 57, COUNTRY_COMOROS = 2691, COUNTRY_CONGO = 242, COUNTRY_COOK_ISLANDS = 682, COUNTRY_COSTA_RICA = 506, COUNTRY_CROATIA = 385, COUNTRY_CUBA = 53, COUNTRY_CYPRUS = 357, COUNTRY_CZECH_REPUBLIC = 42, COUNTRY_DENMARK = 45, COUNTRY_DIEGO_GARCIA = 246, COUNTRY_DJIBOUTI = 253, COUNTRY_DOMINICA = 109, COUNTRY_DOMINICAN_REPUBLIC = 110, COUNTRY_ECUADOR = 593, COUNTRY_EGYPT = 20, COUNTRY_EL_SALVADOR = 503, COUNTRY_EQUATORIAL_GUINEA = 240, COUNTRY_ERITREA = 291, COUNTRY_ESTONIA = 372, COUNTRY_ETHIOPIA = 251, COUNTRY_FAEROE_ISLANDS = 298, COUNTRY_FALKLAND_ISLANDS = 500, COUNTRY_FIJI_ISLANDS = 679, COUNTRY_FINLAND = 358, COUNTRY_FRANCE = 33, COUNTRY_FRENCH_ANTILLES = 5901, COUNTRY_FRENCH_GUIANA = 594, COUNTRY_FRENCH_POLYNESIA = 689, COUNTRY_GABON = 241, COUNTRY_GAMBIA = 220, COUNTRY_GEORGIA = 995, COUNTRY_GERMANY = 49, COUNTRY_GHANA = 233, COUNTRY_GIBRALTAR = 350, COUNTRY_GREECE = 30, COUNTRY_GREENLAND = 299, COUNTRY_GRENADA = 111, COUNTRY_GUADELOUPE = 590, COUNTRY_GUAM = 671, COUNTRY_GUANTANAMO_BAY = 5399, COUNTRY_GUATEMALA = 502, COUNTRY_GUINEA = 224, COUNTRY_GUINEA_BISSAU = 245, COUNTRY_GUYANA = 592, COUNTRY_HAITI = 509, COUNTRY_HONDURAS = 504, COUNTRY_HONG_KONG = 852, COUNTRY_HUNGARY = 36, COUNTRY_INMARSAT_ATLANTIC_EAST = 871, COUNTRY_INMARSAT_ATLANTIC_WEST = 874, COUNTRY_INMARSAT_INDIAN = 873, COUNTRY_INMARSAT_PACIFIC = 872, COUNTRY_INMARSAT = 870, COUNTRY_ICELAND = 354, COUNTRY_INDIA = 91, COUNTRY_INDONESIA = 62, COUNTRY_INTERNATIONAL_FREEPHONE_SERVICE = 800, COUNTRY_IRAN = 98, COUNTRY_IRAQ = 964, COUNTRY_IRELAND = 353, COUNTRY_ISRAEL = 972, COUNTRY_ITALY = 39, COUNTRY_IVORY_COAST = 225, COUNTRY_JAMAICA = 112, COUNTRY_JAPAN = 81, COUNTRY_JORDAN = 962, COUNTRY_KAZAKHSTAN = 705, COUNTRY_KENYA = 254, COUNTRY_KIRIBATI_REPUBLIC = 686, COUNTRY_KOREA_NORTH = 850, COUNTRY_KOREA_REPUBLIC_OF = 82, COUNTRY_KUWAIT = 965, COUNTRY_KYRGYZ_REPUBLIC = 706, COUNTRY_LAOS = 856, COUNTRY_LATVIA = 371, COUNTRY_LEBANON = 961, COUNTRY_LESOTHO = 266, COUNTRY_LIBERIA = 231, COUNTRY_LIBYA = 218, COUNTRY_LIECHTENSTEIN = 4101, COUNTRY_LITHUANIA = 370, COUNTRY_LUXEMBOURG = 352, COUNTRY_MACAU = 853, COUNTRY_MADAGASCAR = 261, COUNTRY_MALAWI = 265, COUNTRY_MALAYSIA = 60, COUNTRY_MALDIVES = 960, COUNTRY_MALI = 223, COUNTRY_MALTA = 356, COUNTRY_MARSHALL_ISLANDS = 692, COUNTRY_MARTINIQUE = 596, COUNTRY_MAURITANIA = 222, COUNTRY_MAURITIUS = 230, COUNTRY_MAYOTTE_ISLAND = 269, COUNTRY_MEXICO = 52, COUNTRY_MICRONESIA_FEDERATED_STATES_OF = 691, COUNTRY_MOLDOVA = 373, COUNTRY_MONACO = 377, COUNTRY_MONGOLIA = 976, COUNTRY_MONTSERRAT = 113, COUNTRY_MOROCCO = 212, COUNTRY_MOZAMBIQUE = 258, COUNTRY_MYANMAR = 95, COUNTRY_NAMIBIA = 264, COUNTRY_NAURU = 674, COUNTRY_NEPAL = 977, COUNTRY_NETHERLANDS_ANTILLES = 599, COUNTRY_NETHERLANDS = 31, COUNTRY_NEVIS = 114, COUNTRY_NEW_CALEDONIA = 687, COUNTRY_NEW_ZEALAND = 64, COUNTRY_NICARAGUA = 505, COUNTRY_NIGER = 227, COUNTRY_NIGERIA = 234, COUNTRY_NIUE = 683, COUNTRY_NORFOLK_ISLAND = 6722, COUNTRY_NORWAY = 47, COUNTRY_OMAN = 968, COUNTRY_PAKISTAN = 92, COUNTRY_PALAU = 680, COUNTRY_PANAMA = 507, COUNTRY_PAPUA_NEW_GUINEA = 675, COUNTRY_PARAGUAY = 595, COUNTRY_PERU = 51, COUNTRY_PHILIPPINES = 63, COUNTRY_POLAND = 48, COUNTRY_PORTUGAL = 351, COUNTRY_PUERTO_RICO = 121, COUNTRY_QATAR = 974, COUNTRY_REPUBLIC_OF_MACEDONIA = 389, COUNTRY_REUNION_ISLAND = 262, COUNTRY_ROMANIA = 40, COUNTRY_ROTA_ISLAND = 6701, COUNTRY_RUSSIA = 7, COUNTRY_RWANDA = 250, COUNTRY_SAINT_LUCIA = 122, COUNTRY_SAIPAN_ISLAND = 670, COUNTRY_SAN_MARINO = 378, COUNTRY_SAO_TOME_AND_PRINCIPE = 239, COUNTRY_SAUDI_ARABIA = 966, COUNTRY_SENEGAL_REPUBLIC = 221, COUNTRY_SEYCHELLE_ISLANDS = 248, COUNTRY_SIERRA_LEONE = 232, COUNTRY_SINGAPORE = 65, COUNTRY_SLOVAK_REPUBLIC = 4201, COUNTRY_SLOVENIA = 386, COUNTRY_SOLOMON_ISLANDS = 677, COUNTRY_SOMALIA = 252, COUNTRY_SOUTH_AFRICA = 27, COUNTRY_SPAIN = 34, COUNTRY_SRI_LANKA = 94, COUNTRY_ST_HELENA = 290, COUNTRY_ST_KITTS = 115, COUNTRY_ST_PIERRE_AND_MIQUELON = 508, COUNTRY_ST_VINCENT_AND_THE_GRENADINES = 116, COUNTRY_SUDAN = 249, COUNTRY_SURINAME = 597, COUNTRY_SWAZILAND = 268, COUNTRY_SWEDEN = 46, COUNTRY_SWITZERLAND = 41, COUNTRY_SYRIA = 963, COUNTRY_TAIWAN_REPUBLIC_OF_CHINA = 886, COUNTRY_TAJIKISTAN = 708, COUNTRY_TANZANIA = 255, COUNTRY_THAILAND = 66, COUNTRY_TINIAN_ISLAND = 6702, COUNTRY_TOGO = 228, COUNTRY_TOKELAU = 690, COUNTRY_TONGA = 676, COUNTRY_TRINIDAD_AND_TOBAGO = 117, COUNTRY_TUNISIA = 216, COUNTRY_TURKEY = 90, COUNTRY_TURKMENISTAN = 709, COUNTRY_TURKS_AND_CAICOS_ISLANDS = 118, COUNTRY_TUVALU = 688, COUNTRY_USA = 1, COUNTRY_UGANDA = 256, COUNTRY_UKRAINE = 380, COUNTRY_UNITED_ARAB_EMIRATES = 971, COUNTRY_UNITED_KINGDOM = 44, COUNTRY_UNITED_STATES_VIRGIN_ISLANDS = 123, COUNTRY_URUGUAY = 598, COUNTRY_UZBEKISTAN = 711, COUNTRY_VANUATU = 678, COUNTRY_VATICAN_CITY = 379, COUNTRY_VENEZUELA = 58, COUNTRY_VIETNAM = 84, COUNTRY_WALLIS_AND_FUTUNA_ISLANDS = 681, COUNTRY_WESTERN_SAMOA = 685, COUNTRY_YEMEN = 967, COUNTRY_YUGOSLAVIA = 381, COUNTRY_ZAIRE = 243, COUNTRY_ZAMBIA = 260, COUNTRY_ZIMBABWE = 263 }; enum Interest { INTEREST_ART = 100, INTEREST_CARS = 101, INTEREST_CELEBRITY_FANS = 102, INTEREST_COLLECTIONS = 103, INTEREST_COMPUTERS = 104, INTEREST_CULTURE = 105, INTEREST_FITNESS = 106, INTEREST_GAMES = 107, INTEREST_HOBBIES = 108, INTEREST_ICQ___HELP = 109, INTEREST_INTERNET = 110, INTEREST_LIFESTYLE = 111, INTEREST_MOVIES_AND_TV = 112, INTEREST_MUSIC = 113, INTEREST_OUTDOORS = 114, INTEREST_PARENTING = 115, INTEREST_PETS_AND_ANIMALS = 116, INTEREST_RELIGION = 117, INTEREST_SCIENCE = 118, INTEREST_SKILLS = 119, INTEREST_SPORTS = 120, INTEREST_WEB_DESIGN = 121, INTEREST_ECOLOGY = 122, INTEREST_NEWS_AND_MEDIA = 123, INTEREST_GOVERNMENT = 124, INTEREST_BUSINESS = 125, INTEREST_MYSTICS = 126, INTEREST_TRAVEL = 127, INTEREST_ASTRONOMY = 128, INTEREST_SPACE = 129, INTEREST_CLOTHING = 130, INTEREST_PARTIES = 131, INTEREST_WOMEN = 132, INTEREST_SOCIAL_SCIENCE = 133, INTEREST_60S = 134, INTEREST_70S = 135, INTEREST_80S = 136, INTEREST_50S = 137, INTEREST_FINANCE_AND_CORPORATE = 138, INTEREST_ENTERTAINMENT = 139, INTEREST_CONSUMER_ELECTRONICS = 140, INTEREST_RETAIL_STORES = 141, INTEREST_HEALTH_AND_BEAUTY = 142, INTEREST_MEDIA = 143, INTEREST_HOUSEHOLD_PRODUCTS = 144, INTEREST_MAIL_ORDER_CATALOG = 145, INTEREST_BUSINESS_SERVICES = 146, INTEREST_AUDIO_AND_VISUAL = 147, INTEREST_SPORTING_AND_ATHLETICS = 148, INTEREST_PUBLISHING = 149, INTEREST_HOME_AUTOMATION = 150 }; enum Background { BACKGROUND_ELEMENTARY_SCHOOL = 300, BACKGROUND_HIGH_SCHOOL = 301, BACKGROUND_COLLEGE = 302, BACKGROUND_UNIVERSITY = 303, BACKGROUND_MILITARY = 304, BACKGROUND_PAST_WORK_PLACE = 305, BACKGROUND_PAST_ORGANIZATION = 306, BACKGROUND_OTHER = 399 }; enum AgeRange { RANGE_NORANGE = 0, RANGE_18_22 = 1, RANGE_23_29 = 2, RANGE_30_39 = 3, RANGE_40_49 = 4, RANGE_50_59 = 5, RANGE_60_ABOVE = 6 }; } #endif centerim-4.22.10/libicq2000/libicq2000/Makefile.in0000644000175000001440000002652011473011437015770 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libicq2000/libicq2000 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = Contact.h constants.h Translator.h time_extra.h events.h ref_ptr.h Client.h ContactList.h exceptions.h ContactTree.h userinfoconstants.h version.h sigslot.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libicq2000/libicq2000/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu libicq2000/libicq2000/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/libicq2000/libicq2000/Contact.h0000644000175000001440000002314011461606612015464 00000000000000/* * Contact (model) * A contact on the contact list * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef CONTACT_H #define CONTACT_H #include #include #include #include #include #include namespace ICQ2000 { /* predeclare classes */ class Capabilities; class MessageEvent; class StatusChangeEvent; class UserInfoChangeEvent; // -- Status Codes Flags -- const unsigned short STATUS_FLAG_ONLINE = 0x0000; const unsigned short STATUS_FLAG_AWAY = 0x0001; const unsigned short STATUS_FLAG_DND = 0x0002; const unsigned short STATUS_FLAG_NA = 0x0004; const unsigned short STATUS_FLAG_OCCUPIED = 0x0010; const unsigned short STATUS_FLAG_FREEFORCHAT = 0x0020; const unsigned short STATUS_FLAG_INVISIBLE = 0x0100; class Contact { public: // reference count unsigned int count; // Inner classes for various sections of Contact details class MainHomeInfo { std::string cellular, normalised_cellular; // cellular private - access must be through // get/setMobileNo for consistency void normaliseMobileNo(); public: MainHomeInfo(); std::string alias, firstname, lastname, email, city, state, phone, fax, street, zip; Country country; Timezone timezone; Country getCountry() const; std::string getMobileNo() const; void setMobileNo(const std::string& s); std::string getNormalisedMobileNo() const; }; class HomepageInfo { public: HomepageInfo(); unsigned char age; Sex sex; Language lang1, lang2, lang3; std::string homepage; unsigned short birth_year; unsigned char birth_month, birth_day; std::string getBirthDate() const; Language getLanguage(int l) const; }; class EmailInfo { public: typedef std::list EmailList; EmailList emails; EmailInfo(); void addEmailAddress(const std::string&); }; class WorkInfo { public: WorkInfo(); std::string city, state, street, zip; unsigned short country; std::string company_name, company_dept, company_position, company_web; }; class BackgroundInfo { public: typedef std::pair School; typedef std::list SchoolList; SchoolList schools; // school names BackgroundInfo(); void addSchool(unsigned short cat, const std::string& s); }; class PersonalInterestInfo { public: typedef std::pair Interest; typedef std::list InterestList; InterestList interests; PersonalInterestInfo(); void addInterest(unsigned short cat, const std::string& s); }; private: void Init(); bool m_icqcontact; bool m_virtualcontact; // static fields unsigned int m_uin; // dynamic fields - updated when they come online unsigned char m_tcp_version; unsigned int m_dc_cookie; Status m_status; bool m_invisible; bool m_authreq, m_authawait; bool m_direct; bool m_bday; // Birthday Flag bool m_server_based; unsigned int m_ext_ip, m_lan_ip; unsigned short m_ext_port, m_lan_port, m_group_id, m_tag_id; Capabilities * m_capabilities; unsigned int m_signon_time, m_last_online_time, m_last_status_change_time; unsigned int m_last_message_time, m_last_away_msg_check_time; static unsigned int imag_uin; // other fields unsigned short m_seqnum; // detailed fields MainHomeInfo m_main_home_info; HomepageInfo m_homepage_info; EmailInfo m_email_info; WorkInfo m_work_info; PersonalInterestInfo m_personal_interest_info; BackgroundInfo m_background_info; std::string m_about; public: Contact(); Contact(unsigned int uin); Contact(const std::string& a); ~Contact(); unsigned int getUIN() const; void setUIN(unsigned int uin); std::string getStringUIN() const; std::string getMobileNo() const; std::string getNormalisedMobileNo() const; std::string getAlias() const; std::string getFirstName() const; std::string getLastName() const; std::string getEmail() const; std::string getNameAlias() const; Status getStatus() const; bool isInvisible() const; bool getAuthReq() const; bool getAuthAwait() const; bool getServerBased() const; unsigned int getExtIP() const; unsigned int getLanIP() const; unsigned short getExtPort() const; unsigned short getLanPort() const; unsigned char getTCPVersion() const; unsigned int getDCCookie() const; bool get_accept_adv_msgs() const; Capabilities get_capabilities() const; unsigned int get_signon_time() const; unsigned int get_last_online_time() const; unsigned int get_last_status_change_time() const; unsigned int get_last_message_time() const; unsigned int get_last_away_msg_check_time() const; void setMobileNo(const std::string& mn); void setAlias(const std::string& al); void setFirstName(const std::string& fn); void setLastName(const std::string& ln); void setEmail(const std::string& em); void setAuthReq(bool b); void setAuthAwait(bool b); void setServerBased(bool b); bool getDirect() const; void setDirect(bool b); bool getBirthday() const; void setBirthday(bool b); void setStatus(Status st, bool i); void setStatus(Status st); void setInvisible(bool i); void setExtIP(unsigned int ip); void setLanIP(unsigned int ip); void setExtPort(unsigned short port); void setLanPort(unsigned short port); void setTCPVersion(unsigned char v); void setDCCookie(unsigned int cookie); void set_capabilities(const Capabilities& c); void setServerSideInfo(unsigned short group_id, unsigned short tag_id); unsigned short getServerSideGroupID() const; unsigned short getServerSideID() const; void set_signon_time(unsigned int t); void set_last_online_time(unsigned int t); void set_last_status_change_time(unsigned int t); void set_last_message_time(unsigned int t); void set_last_away_msg_check_time(unsigned int t); void setMainHomeInfo(const MainHomeInfo& m); void setHomepageInfo(const HomepageInfo& s); void setEmailInfo(const EmailInfo &e); void setWorkInfo(const WorkInfo &w); void setInterestInfo(const PersonalInterestInfo& p); void setBackgroundInfo(const BackgroundInfo& b); void setAboutInfo(const std::string& about); MainHomeInfo& getMainHomeInfo(); HomepageInfo& getHomepageInfo(); EmailInfo& getEmailInfo(); WorkInfo& getWorkInfo(); BackgroundInfo& getBackgroundInfo(); PersonalInterestInfo& getPersonalInterestInfo(); const std::string& getAboutInfo() const; bool isICQContact() const; bool isVirtualContact() const; bool isSMSable() const; unsigned short nextSeqNum(); sigslot::signal1 status_change_signal; sigslot::signal1 userinfo_change_signal; void userinfo_change_emit(); void userinfo_change_emit(bool is_transient_detail); static std::string UINtoString(unsigned int uin); static unsigned int StringtoUIN(const std::string& s); static unsigned short MapStatusToICQStatus(Status st, bool inv); static Status MapICQStatusToStatus(unsigned short st); static bool MapICQStatusToInvisible(unsigned short st); static unsigned int nextImaginaryUIN(); }; typedef ref_ptr ContactRef; class Sbl_item { public: Sbl_item() { uin = 0; tag_id = 0; } Sbl_item(ContactRef& cont, unsigned short tag_id, std::string group_name) { this->uin = cont->getUIN(); this->tag_id = tag_id; this->group_name = group_name; this->nickname = cont->getAlias(); this->awaitAuth = cont->getAuthAwait(); if (this->nickname.size() == 0) this->nickname = Contact::UINtoString(this->uin); } Sbl_item(Sbl_item &item, unsigned short tag_id, std::string group_name) { this->uin = item.uin; this->tag_id = tag_id; this->group_name = group_name; this->nickname = item.nickname; this->awaitAuth = item.awaitAuth; } Sbl_item(unsigned short group_id, std::string group_name) { this->tag_id = group_id; this->group_name = group_name; } unsigned int uin; unsigned short tag_id; std::string group_name; unsigned char type; std::string nickname; bool awaitAuth; }; class Sbl_group { public: Sbl_group() { group_id = 0; } Sbl_group(std::string name, unsigned short group_id) { this->name = name; this->group_id = group_id; } std::string name; unsigned short group_id; std::set buddies; }; } #endif centerim-4.22.10/libicq2000/libicq2000/Makefile.am0000644000175000001440000000025211461606612015753 00000000000000EXTRA_DIST = Contact.h constants.h Translator.h time_extra.h events.h ref_ptr.h Client.h ContactList.h exceptions.h ContactTree.h userinfoconstants.h version.h sigslot.h centerim-4.22.10/libicq2000/libicq2000/events.h0000644000175000001440000006147111461606612015406 00000000000000/* * Events * ------ * * The library signals everything that happens to the program through * calling the signal listeners that have been connected to the Signal * dispatchers in Client. * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef EVENTS_H #define EVENTS_H #include #include #include #include #include namespace ICQ2000 { class Contact; // ============================================================================ // Event Base class // ============================================================================ /** * The base class for all events. Basic functionality of all * events is timestamping, so you can tell when an event occurred. */ class Event { protected: /** * the time this event occurred */ time_t m_time; public: Event(); Event(time_t t); time_t getTime() const; void setTime(time_t t); }; // ============================================================================ // SocketEvents // ============================================================================ /** * Base class for socket events. */ class SocketEvent : public Event { private: int m_fd; public: SocketEvent(int fd); virtual ~SocketEvent(); int getSocketHandle() const; /** * enum of the different modes of selecting on the socket */ enum Mode { READ = 1 << 0, WRITE = 1 << 1, EXCEPTION = 1 << 2 }; }; /** * A socket handle add event. This is used by the library to * signal to the client that it should be selecting on this file * descriptor, in the mode(s) described. */ class AddSocketHandleEvent : public SocketEvent { private: Mode m_mode; public: AddSocketHandleEvent(int fd, Mode m); Mode getMode() const; bool isRead() const; bool isWrite() const; bool isException() const; }; /** * A socket handle remove event. This is used by the library to * signal to the client that it should stop selection on this file * descriptor, in any mode. */ class RemoveSocketHandleEvent : public SocketEvent { public: RemoveSocketHandleEvent(int fd); }; // ============================================================================ // ConnectingEvent // ============================================================================ /** * This event is signalled when the client is connecting to the ICQ network */ class ConnectingEvent : public Event { public: ConnectingEvent(); }; // ============================================================================ // ConnectedEvent // ============================================================================ /** * This event is signalled when the client is connected properly to * the ICQ network. */ class ConnectedEvent : public Event { public: ConnectedEvent(); }; // ============================================================================ // DisconnectedEvent // ============================================================================ /** * This event is signalled when the client has been disconnected * from the ICQ network. This may happen even without having a * ConnectedEvent, if for example you password fails at login and you are disconnected. */ class DisconnectedEvent : public Event { public: /** * enum for Reasons for disconnection */ enum Reason { REQUESTED, FAILED_LOWLEVEL, FAILED_BADUSERNAME, FAILED_TURBOING, FAILED_BADPASSWORD, FAILED_MISMATCH_PASSWD, FAILED_DUALLOGIN, FAILED_UNKNOWN }; private: Reason m_reason; public: DisconnectedEvent(Reason r); Reason getReason() const; }; // ============================================================================ // LogEvents // ============================================================================ /** * This event is for any logging messages generated by the library. */ class LogEvent : public Event { public: /** * enum of different types of log messages */ enum LogType { WARN, ERROR, INFO, PACKET, DIRECTPACKET }; private: LogType m_type; std::string m_msg; public: LogEvent(LogType type, const std::string& msg); LogType getType() const; std::string getMessage() const; }; // ============================================================================ // ContactListEvents (user added, user removed, group added, group removed) // ============================================================================ /** * Base class for Contact List related events. */ class ContactListEvent : public Event { public: /** * An enum of the different contact list event types. */ enum EventType { UserAdded, UserRemoved, UserRelocated, GroupAdded, GroupRemoved, GroupChange, CompleteUpdate }; public: ContactListEvent(); virtual ~ContactListEvent(); /** * get the type of ContactListEvent * * @return type of the ContactListEvent */ virtual EventType getType() const = 0; }; class UserContactListEvent : public ContactListEvent { private: ContactRef m_contact; ContactTree::Group& m_group; public: UserContactListEvent(const ContactRef& c, ContactTree::Group& gp); ContactRef getContact() const; ContactTree::Group& get_group(); unsigned int getUIN() const; }; /** * The event signalled when a user is added. */ class UserAddedEvent : public UserContactListEvent { public: UserAddedEvent(const ContactRef& c, ContactTree::Group& gp); EventType getType() const; }; /** * The event signalled when a user is about to be removed. */ class UserRemovedEvent : public UserContactListEvent { public: UserRemovedEvent(const ContactRef& c, ContactTree::Group& gp); EventType getType() const; }; /** * The event signalled when a user is being moved between groups. */ class UserRelocatedEvent : public UserContactListEvent { protected: ContactTree::Group& m_old_group; public: UserRelocatedEvent(const ContactRef& c, ContactTree::Group& new_gp, ContactTree::Group& old_gp); EventType getType() const; ContactTree::Group& get_old_group(); }; /** * Group related ContactList events */ class GroupContactListEvent : public ContactListEvent { private: const ContactTree::Group& m_group; public: GroupContactListEvent(const ContactTree::Group& gp); const ContactTree::Group& get_group() const; }; /** * The event signalled when a group is added. */ class GroupAddedEvent : public GroupContactListEvent { public: GroupAddedEvent(const ContactTree::Group& gp); EventType getType() const; }; /** * The event signalled when a group is removed. */ class GroupRemovedEvent : public GroupContactListEvent { public: GroupRemovedEvent(const ContactTree::Group& gp); EventType getType() const; }; /** * The event signalled when a group is removed. */ class GroupChangeEvent : public GroupContactListEvent { public: GroupChangeEvent(const ContactTree::Group& gp); EventType getType() const; }; /** * The event signalled when the contact list is completely * refreshed (from the server) */ class CompleteUpdateEvent : public ContactListEvent { public: CompleteUpdateEvent(); EventType getType() const; }; /* Konst's temporary SBL hack */ class SBLReceivedEvent : public Event { public: SBLReceivedEvent(const ContactTree &atree): tree(atree) { } ContactTree tree; }; // ============================================================================ // ContactEvents (status change, user info change) // ============================================================================ /** * Base class for Contact events. */ class ContactEvent : public Event { public: /** * An enum of the different contact list event types. */ enum EventType { StatusChange, UserInfoChange, TypingNotification }; protected: /** * The contact this event refers to. */ ContactRef m_contact; public: ContactEvent(ContactRef c); virtual ~ContactEvent(); ContactRef getContact() const; unsigned int getUIN() const; /** * get the type of ContactEvent * * @return type of the ContactEvent */ virtual EventType getType() const = 0; }; /** * The event signalled when user information changes. */ class UserInfoChangeEvent : public ContactEvent { private: bool m_is_transient_detail; public: UserInfoChangeEvent(ContactRef c, bool is_transient_detail); EventType getType() const; bool isTransientDetail() const; }; /** * The event signalled when a user's status changes. */ class StatusChangeEvent : public ContactEvent { private: Status m_status; Status m_old_status; public: StatusChangeEvent(ContactRef contact, Status status, Status old_status); EventType getType() const; Status getStatus() const; Status getOldStatus() const; }; /** * The event signalled when user information changes. */ class UserTypingNotificationEvent : public ContactEvent { private: bool m_typing; public: UserTypingNotificationEvent(ContactRef contact, bool isTyping); EventType getType() const; bool isTyping() const; }; // ============================================================================ // MessageEvents // ============================================================================ /** * A message event. MessageEvents are used for messages, URLs, * SMSs, Authorisation request/responses and away messages. */ class MessageEvent : public Event { public: /** * enum of the type of the message */ enum MessageType { Normal, URL, SMS, SMS_Receipt, AuthReq, AuthAck, AwayMessage, EmailEx, UserAdd, Email, WebPager, FileTransfer, Contacts }; enum DeliveryFailureReason { Failed, // general failure Failed_NotConnected, // you are not connected! Failed_ClientNotCapable, // remote client is not capable (away messages) Failed_Denied, // denied outright Failed_Ignored, // ignore completely - send no ACKs back either Failed_Occupied, // resend as to contactlist/urgent Failed_DND, // resend as to contactlist/urgent Failed_SMTP }; protected: /// the contact related to the MessageEvent ContactRef m_contact; /// whether the event is finished bool m_finished; /// whether the event was delivered bool m_delivered; /// whether the event was sent direct bool m_direct; DeliveryFailureReason m_failure_reason; public: MessageEvent(ContactRef c); virtual ~MessageEvent(); /** * get the type of the MessageEvent * * @return the type of the message */ virtual MessageType getType() const = 0; ContactRef getContact(); bool isFinished() const; bool isDelivered() const; bool isDirect() const; void setFinished(bool f); void setDelivered(bool f); void setDirect(bool f); DeliveryFailureReason getDeliveryFailureReason() const; void setDeliveryFailureReason(DeliveryFailureReason d); }; /** * Base class for ICQ messages (not SMS) */ class ICQMessageEvent : public MessageEvent { private: bool m_urgent, m_tocontactlist, m_offline; std::string m_away_message; public: ICQMessageEvent(ContactRef c); bool isUrgent() const; void setUrgent(bool b); bool isToContactList() const; void setToContactList(bool b); bool isOfflineMessage() const; void setOfflineMessage(bool b); unsigned int getSenderUIN() const; std::string getAwayMessage() const; void setAwayMessage(const std::string& msg); virtual ICQMessageEvent* copy() const = 0; }; /** * A normal message */ class NormalMessageEvent : public ICQMessageEvent { private: std::string m_message; bool m_multi; unsigned int m_foreground, m_background; unsigned short m_encoding; public: NormalMessageEvent(ContactRef c, const std::string& msg, bool multi = false); NormalMessageEvent(ContactRef c, const std::string& msg, time_t t, bool multi); NormalMessageEvent(ContactRef c, const std::string& msg, unsigned int fg, unsigned int bg); std::string getMessage() const; MessageType getType() const; unsigned short getEncoding() const; void setEncoding(const unsigned short encoding); bool isMultiParty() const; unsigned int getForeground() const; unsigned int getBackground() const; void setForeground(unsigned int f); void setBackground(unsigned int b); ICQMessageEvent* copy() const; }; /** * An URL message */ class URLMessageEvent : public ICQMessageEvent { private: std::string m_message, m_url; public: URLMessageEvent(ContactRef c, const std::string& msg, const std::string& url); URLMessageEvent(ContactRef c, const std::string& msg, const std::string& url, time_t t); std::string getMessage() const; std::string getURL() const; MessageType getType() const; ICQMessageEvent* copy() const; }; /** * An SMS message */ class SMSMessageEvent : public MessageEvent { private: std::string m_message, m_source, m_sender, m_senders_network; std::string m_smtp_from, m_smtp_to, m_smtp_subject; bool m_rcpt; public: SMSMessageEvent(ContactRef c, const std::string& msg, bool rcpt); SMSMessageEvent(ContactRef c, const std::string& msg, const std::string& source, const std::string& senders_network, const std::string& time); std::string getMessage() const; MessageType getType() const; std::string getSource() const; std::string getSender() const; std::string getSenders_network() const; bool getRcpt() const; void setSMTPFrom(const std::string& from); std::string getSMTPFrom() const; void setSMTPTo(const std::string& to); std::string getSMTPTo() const; void setSMTPSubject(const std::string& subj); std::string getSMTPSubject() const; }; /** * An SMS (delivery) receipt */ class SMSReceiptEvent : public MessageEvent { private: std::string m_message, m_message_id, m_destination, m_submission_time, m_delivery_time; bool m_delivered; public: SMSReceiptEvent(ContactRef c, const std::string& msg, const std::string& message_id, const std::string& submission_time, const std::string& delivery_time, bool del); MessageType getType() const; std::string getMessage() const; std::string getMessageId() const; std::string getDestination() const; std::string getSubmissionTime() const; std::string getDeliveryTime() const; bool delivered() const; }; /** * An Away message. The way away messages work in ICQ is they are * just sending a special blank message to the other end, and the * away message comes back in the ACK, as it would for other * messages when sent to someone who is away (N/A, etc..). * */ class AwayMessageEvent : public ICQMessageEvent { public: AwayMessageEvent(ContactRef c); MessageType getType() const; ICQMessageEvent* copy() const; }; /** * An Authorisation Request */ class AuthReqEvent : public ICQMessageEvent { private: std::string m_message; public: AuthReqEvent(ContactRef c, const std::string& msg); AuthReqEvent(ContactRef c, const std::string& msg, time_t time); std::string getMessage() const; MessageType getType() const; ICQMessageEvent* copy() const; }; /** * An Authorisation Acknowledge (success/failure) */ class AuthAckEvent : public ICQMessageEvent { private: std::string m_message; bool m_granted; public: AuthAckEvent(ContactRef c, bool granted); AuthAckEvent(ContactRef c, bool granted, time_t time); AuthAckEvent(ContactRef c, const std::string& msg, bool granted); AuthAckEvent(ContactRef c, const std::string& msg, bool granted, time_t time); std::string getMessage() const; MessageType getType() const; bool isGranted() const; ICQMessageEvent* copy() const; }; /** * An E-mail Express message */ class EmailExEvent : public MessageEvent { private: std::string m_sender, m_email, m_message; public: EmailExEvent(ContactRef c, const std::string &email, const std::string &sender, const std::string &msg); std::string getMessage() const; std::string getEmail() const; std::string getSender() const; MessageType getType() const; unsigned int getSenderUIN() const; }; /** * A Web Pager message */ class WebPagerEvent : public MessageEvent { private: std::string m_sender, m_email, m_message; public: WebPagerEvent(ContactRef c, const std::string& email, const std::string& sender, const std::string& msg); std::string getMessage() const; std::string getEmail() const; std::string getSender() const; MessageType getType() const; }; /** * A "You were added" message */ class UserAddEvent : public ICQMessageEvent { public: UserAddEvent(ContactRef c); MessageType getType() const; unsigned int getSenderUIN() const; ICQMessageEvent* copy() const; }; /** * An E-mail message, sent with SMTP */ class EmailMessageEvent : public MessageEvent { private: std::string m_message; public: EmailMessageEvent(ContactRef c, const std::string &msg); std::string getMessage() const; MessageType getType() const; }; /** * A File Transfer */ class FileTransferEvent : public ICQMessageEvent { public: enum State { NOT_CONNECTED, SEND, RECEIVE, WAIT_RESPONS, ACCEPTED, REJECTED, ERROR, COMPLETE, CANCELLED, TIMEOUT, CLOSE }; private: State m_state; std::string m_error; std::string m_message, m_description, m_refusal_message, m_save_path; std::list m_files; unsigned int m_size, m_speed; unsigned int m_totsize, m_totpos; unsigned int m_pos, m_totfiles, m_currfile; unsigned short m_port; unsigned short m_seqnum; public: FileTransferEvent(ContactRef c, const std::string& msg, const std::string& desc, unsigned int size, unsigned short seqnum); void setState(State st); State getState(); void setError(const std::string& str); std::string getError(); void addFile(const std::string& file); std::string getFile(); unsigned int getFilesInQueue(); unsigned int getSpeed(); void setSpeed(const unsigned int speed); std::string getMessage() const; std::string getDescription() const; void setDescription(const std::string& str); std::string getSavePath() const; void setSavePath(const std::string& str); unsigned int getSize() const; unsigned int getTotalSize() const; unsigned int getTotalPos() const; unsigned int getPos() const; unsigned int getTotalFiles() const; unsigned int getCurrFile() const; void setTotalSize(unsigned int t_size); void setSize(unsigned int size); void setPos(unsigned int pos); void setTotalPos(unsigned int pos); void setTotalFiles(unsigned int nr); void setCurrFile(unsigned int pos); unsigned short getPort() const; void setPort(unsigned short port); std::string getRefusalMessage() const; void setRefusalMessage(const std::string& s); unsigned short getSeqNum() const; void setSeqNum(unsigned short seqnum); MessageType getType() const; ICQMessageEvent* copy() const; }; /** * A contacts message */ class ContactMessageEvent : public ICQMessageEvent { private: std::list m_content; public: ContactMessageEvent(ContactRef c, std::list content); MessageType getType() const; unsigned int getSenderUIN() const; std::list getContacts() const; ICQMessageEvent* copy() const; }; // ============================================================================ // Search Events // ============================================================================ /** * The event signalled when a user-search result is received. */ class SearchResultEvent : public Event { public: enum SearchType { ShortWhitepage, FullWhitepage, UIN, Keyword, RandomChat }; private: bool m_finished, m_expired; SearchType m_searchtype; ContactList m_clist; ContactRef m_last_contact; unsigned int m_more_results; public: SearchResultEvent(SearchType t); SearchType getSearchType() const; ContactList& getContactList(); ContactRef getLastContactAdded() const; void setLastContactAdded(ContactRef c); unsigned int getNumberMoreResults() const; bool isFinished() const; void setFinished(bool b); bool isExpired() const; void setExpired(bool b); void setNumberMoreResults(unsigned int m); }; /** * The event signalled when entries from the server-based contact list is received. */ /* class ServerBasedContactEvent : public Event { public: enum SBLType { Fetch, Upload, Remove }; enum UploadResult { Success, Failed, AuthRequired }; private: ContactList m_clist; SBLType m_type; std::vector m_results; public: ServerBasedContactEvent(SBLType t, const ContactList& l); void setUploadResults(const std::vector &v); std::map getUploadResults() const; ContactList& getContactList(); SBLType getType() const { return m_type; } }; */ // ============================================================================ // NewUINEvent // ============================================================================ /** * Registration of a new UIN */ class NewUINEvent : public Event { private: unsigned int m_uin; bool m_success; public: NewUINEvent(unsigned int uin, bool success=true); unsigned int getUIN() const; bool isSuccess() const; }; /** * Rate Information Changed */ class RateInfoChangeEvent : public Event { public: /** * enum of the rate classes */ enum RateClass { RATE_CHANGE=1, RATE_WARNING, RATE_LIMIT, RATE_LIMIT_CLEARED }; private: unsigned short m_code; unsigned short m_rateclass; unsigned int m_windowsize; unsigned int m_clear; unsigned int m_alert; unsigned int m_limit; unsigned int m_disconnect; unsigned int m_currentavg; unsigned int m_maxavg; public: RateInfoChangeEvent(unsigned short code, unsigned short rateclass, unsigned int windowsize,unsigned int clear, unsigned int alert,unsigned int limit, unsigned int disconnect,unsigned int currentavg, unsigned int maxavg); /// get the code unsigned short getCode() const { return m_code; } /// get the rate class unsigned short getRateClass() const { return m_rateclass; } /// get the size of the window unsigned int getWindowSize() const { return m_windowsize; } /// get clear (?) unsigned int getClear() const { return m_clear; } /// get alert (?) unsigned int getAlert() const { return m_alert; } /// get the limit unsigned int getLimit() const { return m_limit; } /// get disconnect (?) unsigned int getDisconnect() const { return m_disconnect; } /// get the current average unsigned int getCurrentAvg() const { return m_currentavg; } /// get the maximum average unsigned int getMaxAvg() const { return m_maxavg; } }; } #endif centerim-4.22.10/libicq2000/libicq2000/time_extra.h0000644000175000001440000000247511461606612016242 00000000000000/* * Extra time functions * (Mainly to make up for deficiencies/quirks in libc implementations) * * Copyright (C) 2002 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef TIME_EXTRA_H #define TIME_EXTRA_H #include namespace ICQ2000 { /* * a function to reliably produce a time_t from a struct tm that is * known to be stored in GMT. The problem lies in that BSDs have * tm_gmtoff member of struct tm, whereas other POSIX systems use * the global timezone instead, and heavens knows for other more bizarre * unixes. */ time_t gmt_mktime(struct tm *tm); } #endif centerim-4.22.10/libicq2000/libicq2000/ContactList.h0000644000175000001440000000667611461606612016337 00000000000000/* * ContactList (model) * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef CONTACTLIST_H #define CONTACTLIST_H #include #include #include #include namespace ICQ2000 { class ContactListEvent; class _ContactList_iterator { private: std::map::iterator iter; public: _ContactList_iterator(std::map::iterator i) : iter(i) { } _ContactList_iterator& operator++() { ++iter; return *this; } _ContactList_iterator operator++(int) { return _ContactList_iterator(iter++); } bool operator==(const _ContactList_iterator& x) const { return iter == x.iter; } bool operator!=(const _ContactList_iterator& x) const { return iter != x.iter; } ContactRef& operator*() { return (*iter).second; } }; class _ContactList_const_iterator { private: std::map::const_iterator iter; public: _ContactList_const_iterator(std::map::const_iterator i) : iter(i) { } _ContactList_const_iterator& operator++() { ++iter; return *this; } _ContactList_const_iterator operator++(int) { return _ContactList_const_iterator(iter++); } bool operator==(const _ContactList_const_iterator& x) const { return iter == x.iter; } bool operator!=(const _ContactList_const_iterator& x) const { return iter != x.iter; } const ContactRef& operator*() { return (*iter).second; } }; class ContactList { private: std::map m_cmap; /* * Mobile contacts are implemented as * Contact's and should still have UINs. * Purely Mobile contacts will have imaginary UINs * (ones counting down from -1), this is the best I could * do to keep this consistent across board. * * It would be nice to have a hash off mobile# to contact * but this was proving tricky to ensure consistency. */ public: typedef _ContactList_iterator iterator; typedef _ContactList_const_iterator const_iterator; ContactList(); ContactList(const ContactList& cl); ContactList(ContactRef ct); ContactRef operator[](unsigned int uin); ContactRef lookup_uin(unsigned int uin); ContactRef lookup_mobile(const std::string& m); ContactRef lookup_email(const std::string& em); ContactRef add(ContactRef ct); void remove(unsigned int uin); unsigned int size() const; bool empty() const; bool exists(unsigned int uin); bool mobile_exists(const std::string& m); bool email_exists(const std::string& em); iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const; }; } #endif centerim-4.22.10/libicq2000/libicq2000/Translator.h0000644000175000001440000000714011461606612016224 00000000000000/* * Translate class * * Copyright (C) 2003 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef TRANSLATOR_H #define TRANSLATOR_H #include #include namespace ICQ2000 { /** * The encoding type the string is expected in. For example - most * messages are in the encoding of the locale on the contact's * computer. However, server-based lists are all stored in * UTF-8. Lastly, email/pager messages from the ICQ website are * sent to you are in ISO-8859-1. It is up to the translator how to * do these conversions to provide a consistent character set to * the client. */ enum Encoding { ENCODING_CONTACT_LOCALE, ENCODING_UTF8, ENCODING_ISO_8859_1 }; /** * Abstract base class for the character set translation which * clients can implement and plug into the library. */ class Translator { public: Translator(); virtual ~Translator(); /** * Translate the string from the client-side encoding to a * server-side encoding. * * @param str the string to translate * @param en the expected encoding on the server-side * @param c the contact relevant to the string * @return the translated string */ virtual std::string client_to_server(const std::string& str, Encoding en, const ICQ2000::ContactRef& c) = 0; /** * Translate the string from the server-side encoding to a client-side encoding. * * @param str the string to translate * @param en the expected encoding from the server-side * @param c the contact relevant to the string * @return the translated string */ virtual std::string server_to_client(const std::string& str, Encoding en, const ICQ2000::ContactRef& c) = 0; virtual void client_to_server_inplace(std::string& str, Encoding en, const ICQ2000::ContactRef& c); virtual void server_to_client_inplace(std::string& str, Encoding en, const ICQ2000::ContactRef& c); }; /** * Null translator - a noop (the default). */ class NULLTranslator : public Translator { public: NULLTranslator(); virtual std::string client_to_server(const std::string& str, Encoding en, const ICQ2000::ContactRef& c); virtual std::string server_to_client(const std::string& str, Encoding en, const ICQ2000::ContactRef& c); }; /** * Simple implementation of a translator that does the standard * unix LF -> windows CRLF format. */ class CRLFTranslator : public Translator { public: CRLFTranslator(); virtual std::string client_to_server(const std::string& str, Encoding en, const ICQ2000::ContactRef& c); virtual std::string server_to_client(const std::string& str, Encoding en, const ICQ2000::ContactRef& c); }; } #endif /* TRANSLATOR_H */ centerim-4.22.10/libicq2000/libicq2000/version.h0000644000175000001440000000062711461606612015563 00000000000000#ifndef _LIBICQ2000_CONFIG_H_ #define _LIBICQ2000_CONFIG_H_ /* version numbers */ #define LIBICQ2000_MAJOR_VERSION 1 #define LIBICQ2000_MINOR_VERSION 1 #define LIBICQ2000_MICRO_VERSION 1 #define LIBICQ2000_VERSION "1.1" extern unsigned int libicq2000_major_version; extern unsigned int libicq2000_minor_version; extern unsigned int libicq2000_micro_version; extern const char *libicq2000_version; #endif centerim-4.22.10/libicq2000/libicq2000/ContactTree.h0000644000175000001440000001302211461606612016302 00000000000000/* * ContactTree * a list of groups, then list of contacts within each group * * Copyright (C) 2002 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef CONTACTTREE_H #define CONTACTTREE_H #include #include #include #include #include #include namespace ICQ2000 { class ContactListEvent; // --------------------------------------------------------------------------- // Group object // (typedef'd into ContactTree::Group) // --------------------------------------------------------------------------- class _ContactTree_Group { private: std::map m_crefs; // unique id, used by server unsigned short m_id; std::string m_label; public: // iterators class iterator { private: std::map::iterator iter; public: iterator(std::map::iterator i) : iter(i) { } iterator& operator++() { ++iter; return *this; } iterator operator++(int) { return iterator(iter++); } bool operator==(const iterator& x) const { return iter == x.iter; } bool operator!=(const iterator& x) const { return iter != x.iter; } ContactRef& operator*() { return (*iter).second; } }; class const_iterator { private: std::map::const_iterator iter; public: const_iterator(std::map::const_iterator i) : iter(i) { } const_iterator& operator++() { ++iter; return *this; } const_iterator operator++(int) { return const_iterator(iter++); } bool operator==(const const_iterator& x) const { return iter == x.iter; } bool operator!=(const const_iterator& x) const { return iter != x.iter; } const ContactRef& operator*() { return (*iter).second; } }; _ContactTree_Group(const std::string& l, unsigned short id); _ContactTree_Group(); _ContactTree_Group(const _ContactTree_Group& gp); unsigned short get_id() const; void set_id(unsigned short i) { m_id = i; } std::string get_label() const; void set_label(const std::string& l); ContactRef operator[](unsigned int uin); ContactRef lookup_uin(unsigned int uin); ContactRef lookup_mobile(const std::string& m); ContactRef lookup_email(const std::string& em); ContactRef add(ContactRef ct); void remove(unsigned int uin); void relocate_from(ContactRef ct); void relocate_to(ContactRef ct); unsigned int size() const; bool empty() const; bool exists(unsigned int uin); bool mobile_exists(const std::string& m); bool email_exists(const std::string& em); iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const; // aggregation of contact's sigslot::signal1 contact_status_change_signal; sigslot::signal1 contact_userinfo_change_signal; sigslot::signal1 contactlist_signal; }; // --------------------------------------------------------------------------- // ContactTree // --------------------------------------------------------------------------- class ContactTree { public: // Group typedef's typedef _ContactTree_Group Group; typedef std::list::iterator iterator; typedef std::list::const_iterator const_iterator; private: // Group list std::list m_groups; unsigned short get_unique_group_id() const; public: ContactTree(); ContactTree(const ContactTree& ct); Group& add_group(const std::string& l); Group& add_group(const std::string& l, unsigned short group_id); void remove_group(Group& gp); void remove_group(unsigned short group_id); bool exists_group(unsigned short group_id); Group& lookup_group(unsigned short group_id); Group& lookup_group_containing_contact(ContactRef ct); void relocate_contact(ContactRef ct, Group& from, Group& to); ContactRef operator[](unsigned int uin); ContactRef lookup_uin(unsigned int uin); ContactRef lookup_mobile(const std::string& m); ContactRef lookup_email(const std::string& em); void remove(unsigned int uin); unsigned int size() const; unsigned int group_size() const; bool empty() const; bool exists(unsigned int uin); bool mobile_exists(const std::string& m); bool email_exists(const std::string& em); iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const; // aggregation of contact's sigslot::signal1 contact_status_change_signal; sigslot::signal1 contact_userinfo_change_signal; sigslot::signal1 contactlist_signal; }; } #endif centerim-4.22.10/libicq2000/libicq2000/constants.h0000644000175000001440000000301011461606612016077 00000000000000/* * Constants * External constants that clients will use * * Copyright (C) 2001 Barnaby Gray . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef CONSTANTS_H #define CONSTANTS_H namespace ICQ2000 { enum Status { STATUS_ONLINE, STATUS_AWAY, STATUS_NA, STATUS_OCCUPIED, STATUS_DND, STATUS_FREEFORCHAT, STATUS_OFFLINE }; static const unsigned int SMS_Max_Length = 160; static const unsigned int String_Limit = 16384; // A sensible limit static const unsigned int Incoming_Packet_Limit = 65535; enum RandomChatGroup { GROUP_GENERALCHAT = 1, GROUP_ROMANCE = 2, GROUP_GAMES = 3, GROUP_STUDENTS = 4, GROUP_20 = 5, GROUP_30 = 6, GROUP_40 = 7, GROUP_50PLUS = 8, GROUP_SEEKINGWOMEN = 9, GROUP_SEEKINGMEN = 10 }; } #endif centerim-4.22.10/libicq2000/libicq2000/sigslot.h0000644000175000001440000007606711461606612015575 00000000000000// sigslot.h: Signal/Slot classes // // Written by Sarah Thompson (sarah@telergy.com) 2002. // Additions by Barnaby Gray (barnaby@pickle.me.uk) 2002. // // License: Public domain. You are free to use this code however you like, with the proviso that // the author takes on no responsibility or liability for any use. // // This file is generated! DO NOT EDIT! // Edit the original sigslot.pl script. // // QUICK DOCUMENTATION // // (see also the full documentation at http://sigslot.sourceforge.net/) // // #define switches // SIGSLOT_PURE_ISO - Define this to force ISO C++ compliance. This also disables // all of the thread safety support on platforms where it is // available. // // SIGSLOT_USE_POSIX_THREADS - Force use of Posix threads when using a C++ compiler other than // gcc on a platform that supports Posix threads. (When using gcc, // this is the default - use SIGSLOT_PURE_ISO to disable this if // necessary) // // SIGSLOT_DEFAULT_MT_POLICY - Where thread support is enabled, this defaults to multi_threaded_global. // Otherwise, the default is single_threaded. #define this yourself to // override the default. In pure ISO mode, anything other than // single_threaded will cause a compiler error. // // PLATFORM NOTES // // Win32 - On Win32, the WIN32 symbol must be #defined. Most mainstream // compilers do this by default, but you may need to define it // yourself if your build environment is less standard. This causes // the Win32 thread support to be compiled in and used automatically. // // Unix/Linux/BSD, etc. - If you're using gcc, it is assumed that you have Posix threads // available, so they are used automatically. You can override this // (as under Windows) with the SIGSLOT_PURE_ISO switch. If you're using // something other than gcc but still want to use Posix threads, you // need to #define SIGSLOT_USE_POSIX_THREADS. // // ISO C++ - If none of the supported platforms are detected, or if // SIGSLOT_PURE_ISO is defined, all multithreading support is turned off, // along with any code that might cause a pure ISO C++ environment to // complain. Before you ask, gcc -ansi -pedantic won't compile this // library, but gcc -ansi is fine. Pedantic mode seems to throw a lot of // errors that aren't really there. If you feel like investigating this, // please contact the author. // // // THREADING MODES // // single_threaded - Your program is assumed to be single threaded from the point of view // of signal/slot usage (i.e. all objects using signals and slots are // created and destroyed from a single thread). Behaviour if objects are // destroyed concurrently is undefined (i.e. you'll get the occasional // segmentation fault/memory exception). // // multi_threaded_global - Your program is assumed to be multi threaded. Objects using signals and // slots can be safely created and destroyed from any thread, even when // connections exist. In multi_threaded_global mode, this is achieved by a // single global mutex (actually a critical section on Windows because they // are faster). This option uses less OS resources, but results in more // opportunities for contention, possibly resulting in more context switches // than are strictly necessary. // // multi_threaded_local - Behaviour in this mode is essentially the same as multi_threaded_global, // except that each signal, and each object that inherits has_slots, all // have their own mutex/critical section. In practice, this means that // mutex collisions (and hence context switches) only happen if they are // absolutely essential. However, on some platforms, creating a lot of // mutexes can slow down the whole OS, so use this option with care. // // USING THE LIBRARY // // See the full documentation at http://sigslot.sourceforge.net/ // // #ifndef SIGSLOT_H__ #define SIGSLOT_H__ #include #include #if defined(SIGSLOT_PURE_ISO) || (!defined(WIN32) && !defined(SIGSLOT_USE_POSIX_THREADS)) # define _SIGSLOT_SINGLE_THREADED #elif defined(WIN32) # define _SIGSLOT_HAS_WIN32_THREADS # include #elif defined(SIGSLOT_USE_POSIX_THREADS) # define _SIGSLOT_HAS_POSIX_THREADS # include #else # define _SIGSLOT_SINGLE_THREADED #endif #ifndef SIGSLOT_DEFAULT_MT_POLICY # ifdef _SIGSLOT_SINGLE_THREADED # define SIGSLOT_DEFAULT_MT_POLICY single_threaded # else # define SIGSLOT_DEFAULT_MT_POLICY multi_threaded_local # endif #endif namespace sigslot { class single_threaded { public: single_threaded() { ; } virtual ~single_threaded() { ; } virtual void lock() { ; } virtual void unlock() { ; } }; #ifdef _SIGSLOT_HAS_WIN32_THREADS // The multi threading policies only get compiled in if they are enabled. class multi_threaded_global { public: multi_threaded_global() { static bool isinitialised = false; if(!isinitialised) { InitializeCriticalSection(get_critsec()); isinitialised = true; } } multi_threaded_global(const multi_threaded_global&) { ; } virtual ~multi_threaded_global() { ; } virtual void lock() { EnterCriticalSection(get_critsec()); } virtual void unlock() { LeaveCriticalSection(get_critsec()); } private: CRITICAL_SECTION* get_critsec() { static CRITICAL_SECTION g_critsec; return &g_critsec; } }; class multi_threaded_local { public: multi_threaded_local() { InitializeCriticalSection(&m_critsec); } multi_threaded_local(const multi_threaded_local&) { InitializeCriticalSection(&m_critsec); } virtual ~multi_threaded_local() { DeleteCriticalSection(&m_critsec); } virtual void lock() { EnterCriticalSection(&m_critsec); } virtual void unlock() { LeaveCriticalSection(&m_critsec); } private: CRITICAL_SECTION m_critsec; }; #endif // _SIGSLOT_HAS_WIN32_THREADS #ifdef _SIGSLOT_HAS_POSIX_THREADS // The multi threading policies only get compiled in if they are enabled. class multi_threaded_global { public: multi_threaded_global() { pthread_mutex_init(get_mutex(), NULL); } multi_threaded_global(const multi_threaded_global&) { ; } virtual ~multi_threaded_global() { ; } virtual void lock() { pthread_mutex_lock(get_mutex()); } virtual void unlock() { pthread_mutex_unlock(get_mutex()); } private: pthread_mutex_t* get_mutex() { static pthread_mutex_t g_mutex; return &g_mutex; } }; class multi_threaded_local { public: multi_threaded_local() { pthread_mutex_init(&m_mutex, NULL); } multi_threaded_local(const multi_threaded_local&) { pthread_mutex_init(&m_mutex, NULL); } virtual ~multi_threaded_local() { pthread_mutex_destroy(&m_mutex); } virtual void lock() { pthread_mutex_lock(&m_mutex); } virtual void unlock() { pthread_mutex_unlock(&m_mutex); } private: pthread_mutex_t m_mutex; }; #endif // _SIGSLOT_HAS_POSIX_THREADS template class lock_block { public: mt_policy *m_mutex; lock_block(mt_policy *mtx) : m_mutex(mtx) { m_mutex->lock(); } ~lock_block() { m_mutex->unlock(); } }; template class has_slots; template class _connection_base0 { public: virtual has_slots* getdest() const = 0; virtual void emit() = 0; virtual _connection_base0* clone() = 0; virtual _connection_base0* duplicate(has_slots* pnewdest) = 0; }; template class _connection_base1 { public: virtual has_slots* getdest() const = 0; virtual void emit(arg1_type) = 0; virtual _connection_base1* clone() = 0; virtual _connection_base1* duplicate(has_slots* pnewdest) = 0; }; template class _connection_base2 { public: virtual has_slots* getdest() const = 0; virtual void emit(arg1_type, arg2_type) = 0; virtual _connection_base2* clone() = 0; virtual _connection_base2* duplicate(has_slots* pnewdest) = 0; }; template class _signal_base : public has_slots { public: virtual void slot_disconnect(has_slots* pslot) = 0; virtual void slot_duplicate(const has_slots* poldslot, has_slots* pnewslot) = 0; }; template class has_slots : public mt_policy { private: typedef std::set<_signal_base *> sender_set; typedef typename sender_set::const_iterator const_iterator; public: has_slots() { ; } has_slots(const has_slots& hs) : mt_policy(hs) { lock_block lock(this); const_iterator it = hs.m_senders.begin(); const_iterator itEnd = hs.m_senders.end(); while(it != itEnd) { (*it)->slot_duplicate(&hs, this); m_senders.insert(*it); ++it; } } void signal_connect(_signal_base* sender) { lock_block lock(this); m_senders.insert(sender); } void signal_disconnect(_signal_base* sender) { lock_block lock(this); m_senders.erase(sender); } virtual ~has_slots() { disconnect_all(); } void disconnect_all() { lock_block lock(this); const_iterator it = m_senders.begin(); const_iterator itEnd = m_senders.end(); while(it != itEnd) { (*it)->slot_disconnect(this); ++it; } m_senders.erase(m_senders.begin(), m_senders.end()); } private: sender_set m_senders; }; template class _signal_base0 : public _signal_base { public: typedef typename std::list<_connection_base0 *> connections_list; _signal_base0() { ; } _signal_base0(const _signal_base0& s) : _signal_base(s) { lock_block lock(this); typename connections_list::const_iterator it = s.m_connected_slots.begin(); typename connections_list::const_iterator itEnd = s.m_connected_slots.end(); while(it != itEnd) { (*it)->getdest()->signal_connect(this); m_connected_slots.push_back((*it)->clone()); ++it; } } void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) { lock_block lock(this); typename connections_list::iterator it = m_connected_slots.begin(); typename connections_list::iterator itEnd = m_connected_slots.end(); while(it != itEnd) { if((*it)->getdest() == oldtarget) { m_connected_slots.push_back((*it)->duplicate(newtarget)); } ++it; } } ~_signal_base0() { disconnect_all(); } void disconnect_all() { lock_block lock(this); typename connections_list::const_iterator it = m_connected_slots.begin(); typename connections_list::const_iterator itEnd = m_connected_slots.end(); while(it != itEnd) { (*it)->getdest()->signal_disconnect(this); delete *it; ++it; } m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); } void disconnect(has_slots* pclass) { lock_block lock(this); typename connections_list::iterator it = m_connected_slots.begin(); typename connections_list::iterator itEnd = m_connected_slots.end(); while(it != itEnd) { typename connections_list::iterator itNext = it; ++itNext; if((*it)->getdest() == pclass) { delete *it; m_connected_slots.erase(it); pclass->signal_disconnect(this); return; } it = itNext; } } void slot_disconnect(has_slots* pslot) { lock_block lock(this); typename connections_list::iterator it = m_connected_slots.begin(); typename connections_list::iterator itEnd = m_connected_slots.end(); while(it != itEnd) { typename connections_list::iterator itNext = it; ++itNext; if((*it)->getdest() == pslot) { delete *it; m_connected_slots.erase(it); } it = itNext; } } protected: connections_list m_connected_slots; }; template class _signal_base1 : public _signal_base { public: typedef typename std::list<_connection_base1 *> connections_list; _signal_base1() { ; } _signal_base1(const _signal_base1& s) : _signal_base(s) { lock_block lock(this); typename connections_list::const_iterator it = s.m_connected_slots.begin(); typename connections_list::const_iterator itEnd = s.m_connected_slots.end(); while(it != itEnd) { (*it)->getdest()->signal_connect(this); m_connected_slots.push_back((*it)->clone()); ++it; } } void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) { lock_block lock(this); typename connections_list::iterator it = m_connected_slots.begin(); typename connections_list::iterator itEnd = m_connected_slots.end(); while(it != itEnd) { if((*it)->getdest() == oldtarget) { m_connected_slots.push_back((*it)->duplicate(newtarget)); } ++it; } } ~_signal_base1() { disconnect_all(); } void disconnect_all() { lock_block lock(this); typename connections_list::const_iterator it = m_connected_slots.begin(); typename connections_list::const_iterator itEnd = m_connected_slots.end(); while(it != itEnd) { (*it)->getdest()->signal_disconnect(this); delete *it; ++it; } m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); } void disconnect(has_slots* pclass) { lock_block lock(this); typename connections_list::iterator it = m_connected_slots.begin(); typename connections_list::iterator itEnd = m_connected_slots.end(); while(it != itEnd) { typename connections_list::iterator itNext = it; ++itNext; if((*it)->getdest() == pclass) { delete *it; m_connected_slots.erase(it); pclass->signal_disconnect(this); return; } it = itNext; } } void slot_disconnect(has_slots* pslot) { lock_block lock(this); typename connections_list::iterator it = m_connected_slots.begin(); typename connections_list::iterator itEnd = m_connected_slots.end(); while(it != itEnd) { typename connections_list::iterator itNext = it; ++itNext; if((*it)->getdest() == pslot) { delete *it; m_connected_slots.erase(it); } it = itNext; } } protected: connections_list m_connected_slots; }; template class _signal_base2 : public _signal_base { public: typedef typename std::list<_connection_base2 *> connections_list; _signal_base2() { ; } _signal_base2(const _signal_base2& s) : _signal_base(s) { lock_block lock(this); typename connections_list::const_iterator it = s.m_connected_slots.begin(); typename connections_list::const_iterator itEnd = s.m_connected_slots.end(); while(it != itEnd) { (*it)->getdest()->signal_connect(this); m_connected_slots.push_back((*it)->clone()); ++it; } } void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) { lock_block lock(this); typename connections_list::iterator it = m_connected_slots.begin(); typename connections_list::iterator itEnd = m_connected_slots.end(); while(it != itEnd) { if((*it)->getdest() == oldtarget) { m_connected_slots.push_back((*it)->duplicate(newtarget)); } ++it; } } ~_signal_base2() { disconnect_all(); } void disconnect_all() { lock_block lock(this); typename connections_list::const_iterator it = m_connected_slots.begin(); typename connections_list::const_iterator itEnd = m_connected_slots.end(); while(it != itEnd) { (*it)->getdest()->signal_disconnect(this); delete *it; ++it; } m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); } void disconnect(has_slots* pclass) { lock_block lock(this); typename connections_list::iterator it = m_connected_slots.begin(); typename connections_list::iterator itEnd = m_connected_slots.end(); while(it != itEnd) { typename connections_list::iterator itNext = it; ++itNext; if((*it)->getdest() == pclass) { delete *it; m_connected_slots.erase(it); pclass->signal_disconnect(this); return; } it = itNext; } } void slot_disconnect(has_slots* pslot) { lock_block lock(this); typename connections_list::iterator it = m_connected_slots.begin(); typename connections_list::iterator itEnd = m_connected_slots.end(); while(it != itEnd) { typename connections_list::iterator itNext = it; ++itNext; if((*it)->getdest() == pslot) { delete *it; m_connected_slots.erase(it); } it = itNext; } } protected: connections_list m_connected_slots; }; template class _connection0 : public _connection_base0 { public: _connection0() { this->pobject = NULL; this->pmemfun = NULL; } _connection0(dest_type* pobject, void (dest_type::*pmemfun)()) { m_pobject = pobject; m_pmemfun = pmemfun; } virtual _connection_base0* clone() { return new _connection0(*this); } virtual _connection_base0* duplicate(has_slots* pnewdest) { return new _connection0((dest_type *)pnewdest, m_pmemfun); } virtual void emit() { (m_pobject->*m_pmemfun)(); } virtual has_slots* getdest() const { return m_pobject; } private: dest_type* m_pobject; void (dest_type::* m_pmemfun)(); }; template class _connection1 : public _connection_base1 { public: _connection1() { this->pobject = NULL; this->pmemfun = NULL; } _connection1(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type)) { m_pobject = pobject; m_pmemfun = pmemfun; } virtual _connection_base1* clone() { return new _connection1(*this); } virtual _connection_base1* duplicate(has_slots* pnewdest) { return new _connection1((dest_type *)pnewdest, m_pmemfun); } virtual void emit(arg1_type a1) { (m_pobject->*m_pmemfun)(a1); } virtual has_slots* getdest() const { return m_pobject; } private: dest_type* m_pobject; void (dest_type::* m_pmemfun)(arg1_type); }; template class _connection2 : public _connection_base2 { public: _connection2() { this->pobject = NULL; this->pmemfun = NULL; } _connection2(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type, arg2_type)) { m_pobject = pobject; m_pmemfun = pmemfun; } virtual _connection_base2* clone() { return new _connection2(*this); } virtual _connection_base2* duplicate(has_slots* pnewdest) { return new _connection2((dest_type *)pnewdest, m_pmemfun); } virtual void emit(arg1_type a1, arg2_type a2) { (m_pobject->*m_pmemfun)(a1, a2); } virtual has_slots* getdest() const { return m_pobject; } private: dest_type* m_pobject; void (dest_type::* m_pmemfun)(arg1_type, arg2_type); }; template class _sig_connection0; template class _sig_connection1; template class _sig_connection2; template class signal0 : public _signal_base0 { public: signal0() { ; } signal0(const signal0& s) : _signal_base0(s) { ; } template void connect(dest_type* pclass, void (dest_type::*pmemfun)()) { lock_block lock(this); _connection0* conn = new _connection0(pclass, pmemfun); this->m_connected_slots.push_back(conn); pclass->signal_connect(this); } void connect(signal0& chainsig) { lock_block lock(this); _sig_connection0* conn = new _sig_connection0(chainsig); this->m_connected_slots.push_back(conn); chainsig.signal_connect(this); } void emit() { lock_block lock(this); typename _signal_base0< mt_policy >::connections_list::const_iterator itNext, it = this->m_connected_slots.begin(); typename _signal_base0< mt_policy >::connections_list::const_iterator itEnd = this->m_connected_slots.end(); while(it != itEnd) { itNext = it; ++itNext; (*it)->emit(); it = itNext; } } void operator()() { lock_block lock(this); typename _signal_base0< mt_policy >::connections_list::connections_list::const_iterator itNext, it = this->m_connected_slots.begin(); typename _signal_base0< mt_policy >::connections_list::connections_list::const_iterator itEnd = this->m_connected_slots.end(); while(it != itEnd) { itNext = it; ++itNext; (*it)->emit(); it = itNext; } } }; template class signal1 : public _signal_base1 { public: signal1() { ; } signal1(const signal1& s) : _signal_base1(s) { ; } template void connect(dest_type* pclass, void (dest_type::*pmemfun)(arg1_type)) { lock_block lock(this); _connection1* conn = new _connection1(pclass, pmemfun); this->m_connected_slots.push_back(conn); pclass->signal_connect(this); } void connect(signal1& chainsig) { lock_block lock(this); _sig_connection1* conn = new _sig_connection1(chainsig); this->m_connected_slots.push_back(conn); chainsig.signal_connect(this); } void emit(arg1_type a1) { lock_block lock(this); typename _signal_base1::connections_list::const_iterator itNext, it = this->m_connected_slots.begin(); typename _signal_base1::connections_list::const_iterator itEnd = this->m_connected_slots.end(); while(it != itEnd) { itNext = it; ++itNext; (*it)->emit(a1); it = itNext; } } void operator()(arg1_type a1) { lock_block lock(this); typename _signal_base1::connections_list::const_iterator itNext, it = this->m_connected_slots.begin(); typename _signal_base1::connections_list::const_iterator itEnd = this->m_connected_slots.end(); while(it != itEnd) { itNext = it; ++itNext; (*it)->emit(a1); it = itNext; } } }; template class signal2 : public _signal_base2 { public: signal2() { ; } signal2(const signal2& s) : _signal_base2(s) { ; } template void connect(dest_type* pclass, void (dest_type::*pmemfun)(arg1_type, arg2_type)) { lock_block lock(this); _connection2* conn = new _connection2(pclass, pmemfun); this->m_connected_slots.push_back(conn); pclass->signal_connect(this); } void connect(signal2& chainsig) { lock_block lock(this); _sig_connection2* conn = new _sig_connection2(chainsig); this->m_connected_slots.push_back(conn); chainsig.signal_connect(this); } void emit(arg1_type a1, arg2_type a2) { lock_block lock(this); typename _signal_base2::connections_list::const_iterator itNext, it = this->m_connected_slots.begin(); typename _signal_base2::connections_list::const_iterator itEnd = this->m_connected_slots.end(); while(it != itEnd) { itNext = it; ++itNext; (*it)->emit(a1, a2); it = itNext; } } void operator()(arg1_type a1, arg2_type a2) { lock_block lock(this); typename _signal_base2::connections_list::const_iterator itNext, it = this->m_connected_slots.begin(); typename _signal_base2::connections_list::const_iterator itEnd = this->m_connected_slots.end(); while(it != itEnd) { itNext = it; ++itNext; (*it)->emit(a1, a2); it = itNext; } } }; // signal chaining connection types added by Barnaby Gray 24/11/2002 template class _sig_connection0 : public _connection_base0 { public: _sig_connection0(signal0& sig) : m_signal(sig) { } _sig_connection0(const _sig_connection0& conn) : m_signal( conn.m_signal ) { } virtual _connection_base0* clone() { return new _sig_connection0(*this); } virtual _connection_base0* duplicate(has_slots* pnewdest) { return new _sig_connection0(m_signal); } virtual void emit() { m_signal.emit(); } virtual has_slots* getdest() const { return &m_signal; } private: signal0& m_signal; }; template class _sig_connection1 : public _connection_base1 { public: _sig_connection1(signal1& sig) : m_signal(sig) { } _sig_connection1(const _sig_connection1& conn) : m_signal( conn.m_signal ) { } virtual _connection_base1* clone() { return new _sig_connection1(*this); } virtual _connection_base1* duplicate(has_slots* pnewdest) { return new _sig_connection1(m_signal); } virtual void emit(arg1_type a1) { m_signal.emit(a1); } virtual has_slots* getdest() const { return &m_signal; } private: signal1& m_signal; }; template class _sig_connection2 : public _connection_base2 { public: _sig_connection2(signal2& sig) : m_signal(sig) { } _sig_connection2(const _sig_connection2& conn) : m_signal( conn.m_signal ) { } virtual _connection_base2* clone() { return new _sig_connection2(*this); } virtual _connection_base2* duplicate(has_slots* pnewdest) { return new _sig_connection2(m_signal); } virtual void emit(arg1_type a1, arg2_type a2) { m_signal.emit(a1, a2); } virtual has_slots* getdest() const { return &m_signal; } private: signal2& m_signal; }; } // namespace sigslot #endif // SIGSLOT_H__ centerim-4.22.10/libicq2000/libicq2000/exceptions.h0000644000175000001440000000222511461606612016253 00000000000000/* * Exceptions * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef EXCEPTIONS_H #define EXCEPTIONS_H #include #include namespace ICQ2000 { class ParseException : public std::exception { private: std::string m_errortext; public: ParseException(const std::string& text); ~ParseException() throw() { } const char* what() const throw(); }; } #endif centerim-4.22.10/intl/0000755000175000001440000000000011473011456011433 500000000000000centerim-4.22.10/intl/printf-args.c0000644000175000001440000000625711473011430013755 00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include "printf-args.h" #ifdef STATIC STATIC #endif int printf_fetchargs (va_list args, arguments *a) { size_t i; argument *ap; for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) switch (ap->type) { case TYPE_SCHAR: ap->a.a_schar = va_arg (args, /*signed char*/ int); break; case TYPE_UCHAR: ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); break; case TYPE_SHORT: ap->a.a_short = va_arg (args, /*short*/ int); break; case TYPE_USHORT: ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); break; case TYPE_INT: ap->a.a_int = va_arg (args, int); break; case TYPE_UINT: ap->a.a_uint = va_arg (args, unsigned int); break; case TYPE_LONGINT: ap->a.a_longint = va_arg (args, long int); break; case TYPE_ULONGINT: ap->a.a_ulongint = va_arg (args, unsigned long int); break; #ifdef HAVE_LONG_LONG case TYPE_LONGLONGINT: ap->a.a_longlongint = va_arg (args, long long int); break; case TYPE_ULONGLONGINT: ap->a.a_ulonglongint = va_arg (args, unsigned long long int); break; #endif case TYPE_DOUBLE: ap->a.a_double = va_arg (args, double); break; #ifdef HAVE_LONG_DOUBLE case TYPE_LONGDOUBLE: ap->a.a_longdouble = va_arg (args, long double); break; #endif case TYPE_CHAR: ap->a.a_char = va_arg (args, int); break; #ifdef HAVE_WINT_T case TYPE_WIDE_CHAR: ap->a.a_wide_char = va_arg (args, wint_t); break; #endif case TYPE_STRING: ap->a.a_string = va_arg (args, const char *); break; #ifdef HAVE_WCHAR_T case TYPE_WIDE_STRING: ap->a.a_wide_string = va_arg (args, const wchar_t *); break; #endif case TYPE_POINTER: ap->a.a_pointer = va_arg (args, void *); break; case TYPE_COUNT_SCHAR_POINTER: ap->a.a_count_schar_pointer = va_arg (args, signed char *); break; case TYPE_COUNT_SHORT_POINTER: ap->a.a_count_short_pointer = va_arg (args, short *); break; case TYPE_COUNT_INT_POINTER: ap->a.a_count_int_pointer = va_arg (args, int *); break; case TYPE_COUNT_LONGINT_POINTER: ap->a.a_count_longint_pointer = va_arg (args, long int *); break; #ifdef HAVE_LONG_LONG case TYPE_COUNT_LONGLONGINT_POINTER: ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); break; #endif default: /* Unknown type. */ return -1; } return 0; } centerim-4.22.10/intl/gettextP.h0000644000175000001440000001501111473011430013316 00000000000000/* Header describing internals of libintl library. Copyright (C) 1995-1999, 2000-2005 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GETTEXTP_H #define _GETTEXTP_H #include /* Get size_t. */ #ifdef _LIBC # include "../iconv/gconv_int.h" #else # if HAVE_ICONV # include # endif #endif #include "loadinfo.h" #include "gmo.h" /* Get nls_uint32. */ /* @@ end of prolog @@ */ #ifndef internal_function # define internal_function #endif #ifndef attribute_hidden # define attribute_hidden #endif /* Tell the compiler when a conditional or integer expression is almost always true or almost always false. */ #ifndef HAVE_BUILTIN_EXPECT # define __builtin_expect(expr, val) (expr) #endif #ifndef W # define W(flag, data) ((flag) ? SWAP (data) : (data)) #endif #ifdef _LIBC # include # define SWAP(i) bswap_32 (i) #else static inline nls_uint32 SWAP (i) nls_uint32 i; { return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); } #endif /* In-memory representation of system dependent string. */ struct sysdep_string_desc { /* Length of addressed string, including the trailing NUL. */ size_t length; /* Pointer to addressed string. */ const char *pointer; }; /* The representation of an opened message catalog. */ struct loaded_domain { /* Pointer to memory containing the .mo file. */ const char *data; /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */ int use_mmap; /* Size of mmap()ed memory. */ size_t mmap_size; /* 1 if the .mo file uses a different endianness than this machine. */ int must_swap; /* Pointer to additional malloc()ed memory. */ void *malloced; /* Number of static strings pairs. */ nls_uint32 nstrings; /* Pointer to descriptors of original strings in the file. */ const struct string_desc *orig_tab; /* Pointer to descriptors of translated strings in the file. */ const struct string_desc *trans_tab; /* Number of system dependent strings pairs. */ nls_uint32 n_sysdep_strings; /* Pointer to descriptors of original sysdep strings. */ const struct sysdep_string_desc *orig_sysdep_tab; /* Pointer to descriptors of translated sysdep strings. */ const struct sysdep_string_desc *trans_sysdep_tab; /* Size of hash table. */ nls_uint32 hash_size; /* Pointer to hash table. */ const nls_uint32 *hash_tab; /* 1 if the hash table uses a different endianness than this machine. */ int must_swap_hash_tab; int codeset_cntr; #ifdef _LIBC __gconv_t conv; #else # if HAVE_ICONV iconv_t conv; # endif #endif char **conv_tab; struct expression *plural; unsigned long int nplurals; }; /* We want to allocate a string at the end of the struct. But ISO C doesn't allow zero sized arrays. */ #ifdef __GNUC__ # define ZERO 0 #else # define ZERO 1 #endif /* A set of settings bound to a message domain. Used to store settings from bindtextdomain() and bind_textdomain_codeset(). */ struct binding { struct binding *next; char *dirname; int codeset_cntr; /* Incremented each time codeset changes. */ char *codeset; char domainname[ZERO]; }; /* A counter which is incremented each time some previous translations become invalid. This variable is part of the external ABI of the GNU libintl. */ extern int _nl_msg_cat_cntr; #ifndef _LIBC const char *_nl_language_preferences_default (void); const char *_nl_locale_name_posix (int category, const char *categoryname); const char *_nl_locale_name_default (void); const char *_nl_locale_name (int category, const char *categoryname); #endif struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale, const char *__domainname, struct binding *__domainbinding) internal_function; void _nl_load_domain (struct loaded_l10nfile *__domain, struct binding *__domainbinding) internal_function; void _nl_unload_domain (struct loaded_domain *__domain) internal_function; const char *_nl_init_domain_conv (struct loaded_l10nfile *__domain_file, struct loaded_domain *__domain, struct binding *__domainbinding) internal_function; void _nl_free_domain_conv (struct loaded_domain *__domain) internal_function; char *_nl_find_msg (struct loaded_l10nfile *domain_file, struct binding *domainbinding, const char *msgid, size_t *lengthp) internal_function; #ifdef _LIBC extern char *__gettext (const char *__msgid); extern char *__dgettext (const char *__domainname, const char *__msgid); extern char *__dcgettext (const char *__domainname, const char *__msgid, int __category); extern char *__ngettext (const char *__msgid1, const char *__msgid2, unsigned long int __n); extern char *__dngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int n); extern char *__dcngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category); extern char *__dcigettext (const char *__domainname, const char *__msgid1, const char *__msgid2, int __plural, unsigned long int __n, int __category); extern char *__textdomain (const char *__domainname); extern char *__bindtextdomain (const char *__domainname, const char *__dirname); extern char *__bind_textdomain_codeset (const char *__domainname, const char *__codeset); #else /* Declare the exported libintl_* functions, in a way that allows us to call them under their real name. */ # undef _INTL_REDIRECT_INLINE # undef _INTL_REDIRECT_MACROS # define _INTL_REDIRECT_MACROS # include "libgnuintl.h" extern char *libintl_dcigettext (const char *__domainname, const char *__msgid1, const char *__msgid2, int __plural, unsigned long int __n, int __category); #endif /* @@ begin of epilog @@ */ #endif /* gettextP.h */ centerim-4.22.10/intl/printf-args.h0000644000175000001440000000550611473011430013756 00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _PRINTF_ARGS_H #define _PRINTF_ARGS_H /* Get size_t. */ #include /* Get wchar_t. */ #ifdef HAVE_WCHAR_T # include #endif /* Get wint_t. */ #ifdef HAVE_WINT_T # include #endif /* Get va_list. */ #include /* Argument types */ typedef enum { TYPE_NONE, TYPE_SCHAR, TYPE_UCHAR, TYPE_SHORT, TYPE_USHORT, TYPE_INT, TYPE_UINT, TYPE_LONGINT, TYPE_ULONGINT, #ifdef HAVE_LONG_LONG TYPE_LONGLONGINT, TYPE_ULONGLONGINT, #endif TYPE_DOUBLE, #ifdef HAVE_LONG_DOUBLE TYPE_LONGDOUBLE, #endif TYPE_CHAR, #ifdef HAVE_WINT_T TYPE_WIDE_CHAR, #endif TYPE_STRING, #ifdef HAVE_WCHAR_T TYPE_WIDE_STRING, #endif TYPE_POINTER, TYPE_COUNT_SCHAR_POINTER, TYPE_COUNT_SHORT_POINTER, TYPE_COUNT_INT_POINTER, TYPE_COUNT_LONGINT_POINTER #ifdef HAVE_LONG_LONG , TYPE_COUNT_LONGLONGINT_POINTER #endif } arg_type; /* Polymorphic argument */ typedef struct { arg_type type; union { signed char a_schar; unsigned char a_uchar; short a_short; unsigned short a_ushort; int a_int; unsigned int a_uint; long int a_longint; unsigned long int a_ulongint; #ifdef HAVE_LONG_LONG long long int a_longlongint; unsigned long long int a_ulonglongint; #endif float a_float; double a_double; #ifdef HAVE_LONG_DOUBLE long double a_longdouble; #endif int a_char; #ifdef HAVE_WINT_T wint_t a_wide_char; #endif const char* a_string; #ifdef HAVE_WCHAR_T const wchar_t* a_wide_string; #endif void* a_pointer; signed char * a_count_schar_pointer; short * a_count_short_pointer; int * a_count_int_pointer; long int * a_count_longint_pointer; #ifdef HAVE_LONG_LONG long long int * a_count_longlongint_pointer; #endif } a; } argument; typedef struct { size_t count; argument *arg; } arguments; /* Fetch the arguments, putting them into a. */ #ifdef STATIC STATIC #else extern #endif int printf_fetchargs (va_list args, arguments *a); #endif /* _PRINTF_ARGS_H */ centerim-4.22.10/intl/dngettext.c0000644000175000001440000000354611473011430013525 00000000000000/* Implementation of the dngettext(3) function. Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DNGETTEXT __dngettext # define DCNGETTEXT __dcngettext #else # define DNGETTEXT libintl_dngettext # define DCNGETTEXT libintl_dcngettext #endif /* Look up MSGID in the DOMAINNAME message catalog of the current LC_MESSAGES locale and skip message according to the plural form. */ char * DNGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n) { return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dngettext, dngettext); #endif centerim-4.22.10/intl/bindtextdom.c0000644000175000001440000002312411473011427014040 00000000000000/* Implementation of the bindtextdomain(3) function Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include "gettextP.h" #ifdef _LIBC /* We have to handle multi-threaded applications. */ # include #else /* Provide dummy implementation if this is outside glibc. */ # define __libc_rwlock_define(CLASS, NAME) # define __libc_rwlock_wrlock(NAME) # define __libc_rwlock_unlock(NAME) #endif /* The internal variables in the standalone libintl.a must have different names than the internal variables in GNU libc, otherwise programs using libintl.a cannot be linked statically. */ #if !defined _LIBC # define _nl_default_dirname libintl_nl_default_dirname # define _nl_domain_bindings libintl_nl_domain_bindings #endif /* Some compilers, like SunOS4 cc, don't have offsetof in . */ #ifndef offsetof # define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) #endif /* @@ end of prolog @@ */ /* Contains the default location of the message catalogs. */ extern const char _nl_default_dirname[]; #ifdef _LIBC extern const char _nl_default_dirname_internal[] attribute_hidden; #else # define INTUSE(name) name #endif /* List with bindings of specific domains. */ extern struct binding *_nl_domain_bindings; /* Lock variable to protect the global data in the gettext implementation. */ __libc_rwlock_define (extern, _nl_state_lock attribute_hidden) /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define BINDTEXTDOMAIN __bindtextdomain # define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset # ifndef strdup # define strdup(str) __strdup (str) # endif #else # define BINDTEXTDOMAIN libintl_bindtextdomain # define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset #endif /* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP to be used for the DOMAINNAME message catalog. If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not modified, only the current value is returned. If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither modified nor returned. */ static void set_binding_values (const char *domainname, const char **dirnamep, const char **codesetp) { struct binding *binding; int modified; /* Some sanity checks. */ if (domainname == NULL || domainname[0] == '\0') { if (dirnamep) *dirnamep = NULL; if (codesetp) *codesetp = NULL; return; } __libc_rwlock_wrlock (_nl_state_lock); modified = 0; for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) { int compare = strcmp (domainname, binding->domainname); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It is not in the list. */ binding = NULL; break; } } if (binding != NULL) { if (dirnamep) { const char *dirname = *dirnamep; if (dirname == NULL) /* The current binding has be to returned. */ *dirnamep = binding->dirname; else { /* The domain is already bound. If the new value and the old one are equal we simply do nothing. Otherwise replace the old binding. */ char *result = binding->dirname; if (strcmp (dirname, result) != 0) { if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0) result = (char *) INTUSE(_nl_default_dirname); else { #if defined _LIBC || defined HAVE_STRDUP result = strdup (dirname); #else size_t len = strlen (dirname) + 1; result = (char *) malloc (len); if (__builtin_expect (result != NULL, 1)) memcpy (result, dirname, len); #endif } if (__builtin_expect (result != NULL, 1)) { if (binding->dirname != INTUSE(_nl_default_dirname)) free (binding->dirname); binding->dirname = result; modified = 1; } } *dirnamep = result; } } if (codesetp) { const char *codeset = *codesetp; if (codeset == NULL) /* The current binding has be to returned. */ *codesetp = binding->codeset; else { /* The domain is already bound. If the new value and the old one are equal we simply do nothing. Otherwise replace the old binding. */ char *result = binding->codeset; if (result == NULL || strcmp (codeset, result) != 0) { #if defined _LIBC || defined HAVE_STRDUP result = strdup (codeset); #else size_t len = strlen (codeset) + 1; result = (char *) malloc (len); if (__builtin_expect (result != NULL, 1)) memcpy (result, codeset, len); #endif if (__builtin_expect (result != NULL, 1)) { if (binding->codeset != NULL) free (binding->codeset); binding->codeset = result; binding->codeset_cntr++; modified = 1; } } *codesetp = result; } } } else if ((dirnamep == NULL || *dirnamep == NULL) && (codesetp == NULL || *codesetp == NULL)) { /* Simply return the default values. */ if (dirnamep) *dirnamep = INTUSE(_nl_default_dirname); if (codesetp) *codesetp = NULL; } else { /* We have to create a new binding. */ size_t len = strlen (domainname) + 1; struct binding *new_binding = (struct binding *) malloc (offsetof (struct binding, domainname) + len); if (__builtin_expect (new_binding == NULL, 0)) goto failed; memcpy (new_binding->domainname, domainname, len); if (dirnamep) { const char *dirname = *dirnamep; if (dirname == NULL) /* The default value. */ dirname = INTUSE(_nl_default_dirname); else { if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0) dirname = INTUSE(_nl_default_dirname); else { char *result; #if defined _LIBC || defined HAVE_STRDUP result = strdup (dirname); if (__builtin_expect (result == NULL, 0)) goto failed_dirname; #else size_t len = strlen (dirname) + 1; result = (char *) malloc (len); if (__builtin_expect (result == NULL, 0)) goto failed_dirname; memcpy (result, dirname, len); #endif dirname = result; } } *dirnamep = dirname; new_binding->dirname = (char *) dirname; } else /* The default value. */ new_binding->dirname = (char *) INTUSE(_nl_default_dirname); new_binding->codeset_cntr = 0; if (codesetp) { const char *codeset = *codesetp; if (codeset != NULL) { char *result; #if defined _LIBC || defined HAVE_STRDUP result = strdup (codeset); if (__builtin_expect (result == NULL, 0)) goto failed_codeset; #else size_t len = strlen (codeset) + 1; result = (char *) malloc (len); if (__builtin_expect (result == NULL, 0)) goto failed_codeset; memcpy (result, codeset, len); #endif codeset = result; new_binding->codeset_cntr++; } *codesetp = codeset; new_binding->codeset = (char *) codeset; } else new_binding->codeset = NULL; /* Now enqueue it. */ if (_nl_domain_bindings == NULL || strcmp (domainname, _nl_domain_bindings->domainname) < 0) { new_binding->next = _nl_domain_bindings; _nl_domain_bindings = new_binding; } else { binding = _nl_domain_bindings; while (binding->next != NULL && strcmp (domainname, binding->next->domainname) > 0) binding = binding->next; new_binding->next = binding->next; binding->next = new_binding; } modified = 1; /* Here we deal with memory allocation failures. */ if (0) { failed_codeset: if (new_binding->dirname != INTUSE(_nl_default_dirname)) free (new_binding->dirname); failed_dirname: free (new_binding); failed: if (dirnamep) *dirnamep = NULL; if (codesetp) *codesetp = NULL; } } /* If we modified any binding, we flush the caches. */ if (modified) ++_nl_msg_cat_cntr; __libc_rwlock_unlock (_nl_state_lock); } /* Specify that the DOMAINNAME message catalog will be found in DIRNAME rather than in the system locale data base. */ char * BINDTEXTDOMAIN (const char *domainname, const char *dirname) { set_binding_values (domainname, &dirname, NULL); return (char *) dirname; } /* Specify the character encoding in which the messages from the DOMAINNAME message catalog will be returned. */ char * BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset) { set_binding_values (domainname, NULL, &codeset); return (char *) codeset; } #ifdef _LIBC /* Aliases for function names in GNU C Library. */ weak_alias (__bindtextdomain, bindtextdomain); weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset); #endif centerim-4.22.10/intl/gmo.h0000644000175000001440000001135111473011430012277 00000000000000/* Description of GNU message catalog format: general file layout. Copyright (C) 1995, 1997, 2000-2002, 2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GETTEXT_H #define _GETTEXT_H 1 #include /* @@ end of prolog @@ */ /* The magic number of the GNU message catalog format. */ #define _MAGIC 0x950412de #define _MAGIC_SWAPPED 0xde120495 /* Revision number of the currently used .mo (binary) file format. */ #define MO_REVISION_NUMBER 0 #define MO_REVISION_NUMBER_WITH_SYSDEP_I 1 /* The following contortions are an attempt to use the C preprocessor to determine an unsigned integral type that is 32 bits wide. An alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work when cross-compiling. */ #if __STDC__ # define UINT_MAX_32_BITS 4294967295U #else # define UINT_MAX_32_BITS 0xFFFFFFFF #endif /* If UINT_MAX isn't defined, assume it's a 32-bit type. This should be valid for all systems GNU cares about because that doesn't include 16-bit systems, and only modern systems (that certainly have ) have 64+-bit integral types. */ #ifndef UINT_MAX # define UINT_MAX UINT_MAX_32_BITS #endif #if UINT_MAX == UINT_MAX_32_BITS typedef unsigned nls_uint32; #else # if USHRT_MAX == UINT_MAX_32_BITS typedef unsigned short nls_uint32; # else # if ULONG_MAX == UINT_MAX_32_BITS typedef unsigned long nls_uint32; # else /* The following line is intended to throw an error. Using #error is not portable enough. */ "Cannot determine unsigned 32-bit data type." # endif # endif #endif /* Header for binary .mo file format. */ struct mo_file_header { /* The magic number. */ nls_uint32 magic; /* The revision number of the file format. */ nls_uint32 revision; /* The following are only used in .mo files with major revision 0 or 1. */ /* The number of strings pairs. */ nls_uint32 nstrings; /* Offset of table with start offsets of original strings. */ nls_uint32 orig_tab_offset; /* Offset of table with start offsets of translated strings. */ nls_uint32 trans_tab_offset; /* Size of hash table. */ nls_uint32 hash_tab_size; /* Offset of first hash table entry. */ nls_uint32 hash_tab_offset; /* The following are only used in .mo files with minor revision >= 1. */ /* The number of system dependent segments. */ nls_uint32 n_sysdep_segments; /* Offset of table describing system dependent segments. */ nls_uint32 sysdep_segments_offset; /* The number of system dependent strings pairs. */ nls_uint32 n_sysdep_strings; /* Offset of table with start offsets of original sysdep strings. */ nls_uint32 orig_sysdep_tab_offset; /* Offset of table with start offsets of translated sysdep strings. */ nls_uint32 trans_sysdep_tab_offset; }; /* Descriptor for static string contained in the binary .mo file. */ struct string_desc { /* Length of addressed string, not including the trailing NUL. */ nls_uint32 length; /* Offset of string in file. */ nls_uint32 offset; }; /* The following are only used in .mo files with minor revision >= 1. */ /* Descriptor for system dependent string segment. */ struct sysdep_segment { /* Length of addressed string, including the trailing NUL. */ nls_uint32 length; /* Offset of string in file. */ nls_uint32 offset; }; /* Descriptor for system dependent string. */ struct sysdep_string { /* Offset of static string segments in file. */ nls_uint32 offset; /* Alternating sequence of static and system dependent segments. The last segment is a static segment, including the trailing NUL. */ struct segment_pair { /* Size of static segment. */ nls_uint32 segsize; /* Reference to system dependent string segment, or ~0 at the end. */ nls_uint32 sysdepref; } segments[1]; }; /* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF, regardless whether 'int' is 16 bit, 32 bit, or 64 bit. */ #define SEGMENTS_END ((nls_uint32) ~0) /* @@ begin of epilog @@ */ #endif /* gettext.h */ centerim-4.22.10/intl/wprintf-parse.h0000644000175000001440000000426311473011430014322 00000000000000/* Parse printf format string. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _WPRINTF_PARSE_H #define _WPRINTF_PARSE_H #include "printf-args.h" /* Flags */ #define FLAG_GROUP 1 /* ' flag */ #define FLAG_LEFT 2 /* - flag */ #define FLAG_SHOWSIGN 4 /* + flag */ #define FLAG_SPACE 8 /* space flag */ #define FLAG_ALT 16 /* # flag */ #define FLAG_ZERO 32 /* arg_index value indicating that no argument is consumed. */ #define ARG_NONE (~(size_t)0) /* A parsed directive. */ typedef struct { const wchar_t* dir_start; const wchar_t* dir_end; int flags; const wchar_t* width_start; const wchar_t* width_end; size_t width_arg_index; const wchar_t* precision_start; const wchar_t* precision_end; size_t precision_arg_index; wchar_t conversion; /* d i o u x X f e E g G c s p n U % but not C S */ size_t arg_index; } wchar_t_directive; /* A parsed format string. */ typedef struct { size_t count; wchar_t_directive *dir; size_t max_width_length; size_t max_precision_length; } wchar_t_directives; /* Parses the format string. Fills in the number N of directives, and fills in directives[0], ..., directives[N-1], and sets directives[N].dir_start to the end of the format string. Also fills in the arg_type fields of the arguments and the needed count of arguments. */ #ifdef STATIC STATIC #else extern #endif int wprintf_parse (const wchar_t *format, wchar_t_directives *d, arguments *a); #endif /* _WPRINTF_PARSE_H */ centerim-4.22.10/intl/gettext.c0000644000175000001440000000355411473011430013202 00000000000000/* Implementation of gettext(3) function. Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef _LIBC # define __need_NULL # include #else # include /* Just for NULL. */ #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define GETTEXT __gettext # define DCGETTEXT INTUSE(__dcgettext) #else # define GETTEXT libintl_gettext # define DCGETTEXT libintl_dcgettext #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ char * GETTEXT (const char *msgid) { return DCGETTEXT (NULL, msgid, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__gettext, gettext); #endif centerim-4.22.10/intl/vasnprintf.c0000644000175000001440000005376211473011430013716 00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 1999, 2002-2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Tell glibc's to provide a prototype for snprintf(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #ifndef IN_LIBINTL # include #endif /* Specification. */ #if WIDE_CHAR_VERSION # include "vasnwprintf.h" #else # include "vasnprintf.h" #endif #include /* snprintf(), sprintf() */ #include /* abort(), malloc(), realloc(), free() */ #include /* memcpy(), strlen() */ #include /* errno */ #include /* CHAR_BIT, INT_MAX */ #include /* DBL_MAX_EXP, LDBL_MAX_EXP */ #if WIDE_CHAR_VERSION # include "wprintf-parse.h" #else # include "printf-parse.h" #endif /* Checked size_t computations. */ #include "xsize.h" /* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */ #ifndef EOVERFLOW # define EOVERFLOW E2BIG #endif #ifdef HAVE_WCHAR_T # ifdef HAVE_WCSLEN # define local_wcslen wcslen # else /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid a dependency towards this library, here is a local substitute. Define this substitute only once, even if this file is included twice in the same compilation unit. */ # ifndef local_wcslen_defined # define local_wcslen_defined 1 static size_t local_wcslen (const wchar_t *s) { const wchar_t *ptr; for (ptr = s; *ptr != (wchar_t) 0; ptr++) ; return ptr - s; } # endif # endif #endif #if WIDE_CHAR_VERSION # define VASNPRINTF vasnwprintf # define CHAR_T wchar_t # define DIRECTIVE wchar_t_directive # define DIRECTIVES wchar_t_directives # define PRINTF_PARSE wprintf_parse # define USE_SNPRINTF 1 # if HAVE_DECL__SNWPRINTF /* On Windows, the function swprintf() has a different signature than on Unix; we use the _snwprintf() function instead. */ # define SNPRINTF _snwprintf # else /* Unix. */ # define SNPRINTF swprintf # endif #else # define VASNPRINTF vasnprintf # define CHAR_T char # define DIRECTIVE char_directive # define DIRECTIVES char_directives # define PRINTF_PARSE printf_parse # define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) # if HAVE_DECL__SNPRINTF /* Windows. */ # define SNPRINTF _snprintf # else /* Unix. */ # define SNPRINTF snprintf # endif #endif CHAR_T * VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args) { DIRECTIVES d; arguments a; if (PRINTF_PARSE (format, &d, &a) < 0) { errno = EINVAL; return NULL; } #define CLEANUP() \ free (d.dir); \ if (a.arg) \ free (a.arg); if (printf_fetchargs (args, &a) < 0) { CLEANUP (); errno = EINVAL; return NULL; } { size_t buf_neededlength; CHAR_T *buf; CHAR_T *buf_malloced; const CHAR_T *cp; size_t i; DIRECTIVE *dp; /* Output string accumulator. */ CHAR_T *result; size_t allocated; size_t length; /* Allocate a small buffer that will hold a directive passed to sprintf or snprintf. */ buf_neededlength = xsum4 (7, d.max_width_length, d.max_precision_length, 6); #if HAVE_ALLOCA if (buf_neededlength < 4000 / sizeof (CHAR_T)) { buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T)); buf_malloced = NULL; } else #endif { size_t buf_memsize = xtimes (buf_neededlength, sizeof (CHAR_T)); if (size_overflow_p (buf_memsize)) goto out_of_memory_1; buf = (CHAR_T *) malloc (buf_memsize); if (buf == NULL) goto out_of_memory_1; buf_malloced = buf; } if (resultbuf != NULL) { result = resultbuf; allocated = *lengthp; } else { result = NULL; allocated = 0; } length = 0; /* Invariants: result is either == resultbuf or == NULL or malloc-allocated. If length > 0, then result != NULL. */ /* Ensures that allocated >= needed. Aborts through a jump to out_of_memory if needed is SIZE_MAX or otherwise too big. */ #define ENSURE_ALLOCATION(needed) \ if ((needed) > allocated) \ { \ size_t memory_size; \ CHAR_T *memory; \ \ allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ if ((needed) > allocated) \ allocated = (needed); \ memory_size = xtimes (allocated, sizeof (CHAR_T)); \ if (size_overflow_p (memory_size)) \ goto out_of_memory; \ if (result == resultbuf || result == NULL) \ memory = (CHAR_T *) malloc (memory_size); \ else \ memory = (CHAR_T *) realloc (result, memory_size); \ if (memory == NULL) \ goto out_of_memory; \ if (result == resultbuf && length > 0) \ memcpy (memory, result, length * sizeof (CHAR_T)); \ result = memory; \ } for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) { if (cp != dp->dir_start) { size_t n = dp->dir_start - cp; size_t augmented_length = xsum (length, n); ENSURE_ALLOCATION (augmented_length); memcpy (result + length, cp, n * sizeof (CHAR_T)); length = augmented_length; } if (i == d.count) break; /* Execute a single directive. */ if (dp->conversion == '%') { size_t augmented_length; if (!(dp->arg_index == ARG_NONE)) abort (); augmented_length = xsum (length, 1); ENSURE_ALLOCATION (augmented_length); result[length] = '%'; length = augmented_length; } else { if (!(dp->arg_index != ARG_NONE)) abort (); if (dp->conversion == 'n') { switch (a.arg[dp->arg_index].type) { case TYPE_COUNT_SCHAR_POINTER: *a.arg[dp->arg_index].a.a_count_schar_pointer = length; break; case TYPE_COUNT_SHORT_POINTER: *a.arg[dp->arg_index].a.a_count_short_pointer = length; break; case TYPE_COUNT_INT_POINTER: *a.arg[dp->arg_index].a.a_count_int_pointer = length; break; case TYPE_COUNT_LONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longint_pointer = length; break; #ifdef HAVE_LONG_LONG case TYPE_COUNT_LONGLONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; break; #endif default: abort (); } } else { arg_type type = a.arg[dp->arg_index].type; CHAR_T *p; unsigned int prefix_count; int prefixes[2]; #if !USE_SNPRINTF size_t tmp_length; CHAR_T tmpbuf[700]; CHAR_T *tmp; /* Allocate a temporary buffer of sufficient size for calling sprintf. */ { size_t width; size_t precision; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = (arg < 0 ? (unsigned int) (-arg) : arg); } else { const CHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } } precision = 6; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; precision = (arg < 0 ? 0 : arg); } else { const CHAR_T *digitp = dp->precision_start + 1; precision = 0; while (digitp != dp->precision_end) precision = xsum (xtimes (precision, 10), *digitp++ - '0'); } } switch (dp->conversion) { case 'd': case 'i': case 'u': # ifdef HAVE_LONG_LONG if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ break; case 'o': # ifdef HAVE_LONG_LONG if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ break; case 'x': case 'X': # ifdef HAVE_LONG_LONG if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ break; case 'f': case 'F': # ifdef HAVE_LONG_DOUBLE if (type == TYPE_LONGDOUBLE) tmp_length = (unsigned int) (LDBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 10; /* sign, decimal point etc. */ else # endif tmp_length = (unsigned int) (DBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 10; /* sign, decimal point etc. */ tmp_length = xsum (tmp_length, precision); break; case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': tmp_length = 12; /* sign, decimal point, exponent etc. */ tmp_length = xsum (tmp_length, precision); break; case 'c': # if defined HAVE_WINT_T && !WIDE_CHAR_VERSION if (type == TYPE_WIDE_CHAR) tmp_length = MB_CUR_MAX; else # endif tmp_length = 1; break; case 's': # ifdef HAVE_WCHAR_T if (type == TYPE_WIDE_STRING) { tmp_length = local_wcslen (a.arg[dp->arg_index].a.a_wide_string); # if !WIDE_CHAR_VERSION tmp_length = xtimes (tmp_length, MB_CUR_MAX); # endif } else # endif tmp_length = strlen (a.arg[dp->arg_index].a.a_string); break; case 'p': tmp_length = (unsigned int) (sizeof (void *) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading 0x */ break; default: abort (); } if (tmp_length < width) tmp_length = width; tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ } if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T)) tmp = tmpbuf; else { size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T)); if (size_overflow_p (tmp_memsize)) /* Overflow, would lead to out of memory. */ goto out_of_memory; tmp = (CHAR_T *) malloc (tmp_memsize); if (tmp == NULL) /* Out of memory. */ goto out_of_memory; } #endif /* Construct the format string for calling snprintf or sprintf. */ p = buf; *p++ = '%'; if (dp->flags & FLAG_GROUP) *p++ = '\''; if (dp->flags & FLAG_LEFT) *p++ = '-'; if (dp->flags & FLAG_SHOWSIGN) *p++ = '+'; if (dp->flags & FLAG_SPACE) *p++ = ' '; if (dp->flags & FLAG_ALT) *p++ = '#'; if (dp->flags & FLAG_ZERO) *p++ = '0'; if (dp->width_start != dp->width_end) { size_t n = dp->width_end - dp->width_start; memcpy (p, dp->width_start, n * sizeof (CHAR_T)); p += n; } if (dp->precision_start != dp->precision_end) { size_t n = dp->precision_end - dp->precision_start; memcpy (p, dp->precision_start, n * sizeof (CHAR_T)); p += n; } switch (type) { #ifdef HAVE_LONG_LONG case TYPE_LONGLONGINT: case TYPE_ULONGLONGINT: *p++ = 'l'; /*FALLTHROUGH*/ #endif case TYPE_LONGINT: case TYPE_ULONGINT: #ifdef HAVE_WINT_T case TYPE_WIDE_CHAR: #endif #ifdef HAVE_WCHAR_T case TYPE_WIDE_STRING: #endif *p++ = 'l'; break; #ifdef HAVE_LONG_DOUBLE case TYPE_LONGDOUBLE: *p++ = 'L'; break; #endif default: break; } *p = dp->conversion; #if USE_SNPRINTF p[1] = '%'; p[2] = 'n'; p[3] = '\0'; #else p[1] = '\0'; #endif /* Construct the arguments for calling snprintf or sprintf. */ prefix_count = 0; if (dp->width_arg_index != ARG_NONE) { if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; } if (dp->precision_arg_index != ARG_NONE) { if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; } #if USE_SNPRINTF /* Prepare checking whether snprintf returns the count via %n. */ ENSURE_ALLOCATION (xsum (length, 1)); result[length] = '\0'; #endif for (;;) { size_t maxlen; int count; int retcount; maxlen = allocated - length; count = -1; retcount = 0; #if USE_SNPRINTF # define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ retcount = SNPRINTF (result + length, maxlen, buf, \ arg, &count); \ break; \ case 1: \ retcount = SNPRINTF (result + length, maxlen, buf, \ prefixes[0], arg, &count); \ break; \ case 2: \ retcount = SNPRINTF (result + length, maxlen, buf, \ prefixes[0], prefixes[1], arg, \ &count); \ break; \ default: \ abort (); \ } #else # define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ count = sprintf (tmp, buf, arg); \ break; \ case 1: \ count = sprintf (tmp, buf, prefixes[0], arg); \ break; \ case 2: \ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ arg); \ break; \ default: \ abort (); \ } #endif switch (type) { case TYPE_SCHAR: { int arg = a.arg[dp->arg_index].a.a_schar; SNPRINTF_BUF (arg); } break; case TYPE_UCHAR: { unsigned int arg = a.arg[dp->arg_index].a.a_uchar; SNPRINTF_BUF (arg); } break; case TYPE_SHORT: { int arg = a.arg[dp->arg_index].a.a_short; SNPRINTF_BUF (arg); } break; case TYPE_USHORT: { unsigned int arg = a.arg[dp->arg_index].a.a_ushort; SNPRINTF_BUF (arg); } break; case TYPE_INT: { int arg = a.arg[dp->arg_index].a.a_int; SNPRINTF_BUF (arg); } break; case TYPE_UINT: { unsigned int arg = a.arg[dp->arg_index].a.a_uint; SNPRINTF_BUF (arg); } break; case TYPE_LONGINT: { long int arg = a.arg[dp->arg_index].a.a_longint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGINT: { unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; SNPRINTF_BUF (arg); } break; #ifdef HAVE_LONG_LONG case TYPE_LONGLONGINT: { long long int arg = a.arg[dp->arg_index].a.a_longlongint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGLONGINT: { unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; SNPRINTF_BUF (arg); } break; #endif case TYPE_DOUBLE: { double arg = a.arg[dp->arg_index].a.a_double; SNPRINTF_BUF (arg); } break; #ifdef HAVE_LONG_DOUBLE case TYPE_LONGDOUBLE: { long double arg = a.arg[dp->arg_index].a.a_longdouble; SNPRINTF_BUF (arg); } break; #endif case TYPE_CHAR: { int arg = a.arg[dp->arg_index].a.a_char; SNPRINTF_BUF (arg); } break; #ifdef HAVE_WINT_T case TYPE_WIDE_CHAR: { wint_t arg = a.arg[dp->arg_index].a.a_wide_char; SNPRINTF_BUF (arg); } break; #endif case TYPE_STRING: { const char *arg = a.arg[dp->arg_index].a.a_string; SNPRINTF_BUF (arg); } break; #ifdef HAVE_WCHAR_T case TYPE_WIDE_STRING: { const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; SNPRINTF_BUF (arg); } break; #endif case TYPE_POINTER: { void *arg = a.arg[dp->arg_index].a.a_pointer; SNPRINTF_BUF (arg); } break; default: abort (); } #if USE_SNPRINTF /* Portability: Not all implementations of snprintf() are ISO C 99 compliant. Determine the number of bytes that snprintf() has produced or would have produced. */ if (count >= 0) { /* Verify that snprintf() has NUL-terminated its result. */ if (count < maxlen && result[length + count] != '\0') abort (); /* Portability hack. */ if (retcount > count) count = retcount; } else { /* snprintf() doesn't understand the '%n' directive. */ if (p[1] != '\0') { /* Don't use the '%n' directive; instead, look at the snprintf() return value. */ p[1] = '\0'; continue; } else { /* Look at the snprintf() return value. */ if (retcount < 0) { /* HP-UX 10.20 snprintf() is doubly deficient: It doesn't understand the '%n' directive, *and* it returns -1 (rather than the length that would have been required) when the buffer is too small. */ size_t bigger_need = xsum (xtimes (allocated, 2), 12); ENSURE_ALLOCATION (bigger_need); continue; } else count = retcount; } } #endif /* Attempt to handle failure. */ if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EINVAL; return NULL; } #if !USE_SNPRINTF if (count >= tmp_length) /* tmp_length was incorrectly calculated - fix the code above! */ abort (); #endif /* Make room for the result. */ if (count >= maxlen) { /* Need at least count bytes. But allocate proportionally, to avoid looping eternally if snprintf() reports a too small count. */ size_t n = xmax (xsum (length, count), xtimes (allocated, 2)); ENSURE_ALLOCATION (n); #if USE_SNPRINTF continue; #endif } #if USE_SNPRINTF /* The snprintf() result did fit. */ #else /* Append the sprintf() result. */ memcpy (result + length, tmp, count * sizeof (CHAR_T)); if (tmp != tmpbuf) free (tmp); #endif length += count; break; } } } } /* Add the final NUL. */ ENSURE_ALLOCATION (xsum (length, 1)); result[length] = '\0'; if (result != resultbuf && length + 1 < allocated) { /* Shrink the allocated memory if possible. */ CHAR_T *memory; memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T)); if (memory != NULL) result = memory; } if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); *lengthp = length; if (length > INT_MAX) goto length_overflow; return result; length_overflow: /* We could produce such a big string, but its length doesn't fit into an 'int'. POSIX says that snprintf() fails with errno = EOVERFLOW in this case. */ if (result != resultbuf) free (result); errno = EOVERFLOW; return NULL; out_of_memory: if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); out_of_memory_1: CLEANUP (); errno = ENOMEM; return NULL; } } #undef SNPRINTF #undef USE_SNPRINTF #undef PRINTF_PARSE #undef DIRECTIVES #undef DIRECTIVE #undef CHAR_T #undef VASNPRINTF centerim-4.22.10/intl/config.charset0000755000175000001440000004653411473011427014210 00000000000000#! /bin/sh # Output a system dependent table of character encoding aliases. # # Copyright (C) 2000-2004 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # # The table consists of lines of the form # ALIAS CANONICAL # # ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". # ALIAS is compared in a case sensitive way. # # CANONICAL is the GNU canonical name for this character encoding. # It must be an encoding supported by libiconv. Support by GNU libc is # also desirable. CANONICAL is case insensitive. Usually an upper case # MIME charset name is preferred. # The current list of GNU canonical charset names is as follows. # # name MIME? used by which systems # ASCII, ANSI_X3.4-1968 glibc solaris freebsd darwin # ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd darwin # ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd darwin # ISO-8859-3 Y glibc solaris # ISO-8859-4 Y osf solaris freebsd darwin # ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd darwin # ISO-8859-6 Y glibc aix hpux solaris # ISO-8859-7 Y glibc aix hpux irix osf solaris darwin # ISO-8859-8 Y glibc aix hpux osf solaris # ISO-8859-9 Y glibc aix hpux irix osf solaris darwin # ISO-8859-13 glibc darwin # ISO-8859-14 glibc # ISO-8859-15 glibc aix osf solaris freebsd darwin # KOI8-R Y glibc solaris freebsd darwin # KOI8-U Y glibc freebsd darwin # KOI8-T glibc # CP437 dos # CP775 dos # CP850 aix osf dos # CP852 dos # CP855 dos # CP856 aix # CP857 dos # CP861 dos # CP862 dos # CP864 dos # CP865 dos # CP866 freebsd darwin dos # CP869 dos # CP874 woe32 dos # CP922 aix # CP932 aix woe32 dos # CP943 aix # CP949 osf woe32 dos # CP950 woe32 dos # CP1046 aix # CP1124 aix # CP1125 dos # CP1129 aix # CP1250 woe32 # CP1251 glibc solaris darwin woe32 # CP1252 aix woe32 # CP1253 woe32 # CP1254 woe32 # CP1255 glibc woe32 # CP1256 woe32 # CP1257 woe32 # GB2312 Y glibc aix hpux irix solaris freebsd darwin # EUC-JP Y glibc aix hpux irix osf solaris freebsd darwin # EUC-KR Y glibc aix hpux irix osf solaris freebsd darwin # EUC-TW glibc aix hpux irix osf solaris # BIG5 Y glibc aix hpux osf solaris freebsd darwin # BIG5-HKSCS glibc solaris # GBK glibc aix osf solaris woe32 dos # GB18030 glibc solaris # SHIFT_JIS Y hpux osf solaris freebsd darwin # JOHAB glibc solaris woe32 # TIS-620 glibc aix hpux osf solaris # VISCII Y glibc # TCVN5712-1 glibc # GEORGIAN-PS glibc # HP-ROMAN8 hpux # HP-ARABIC8 hpux # HP-GREEK8 hpux # HP-HEBREW8 hpux # HP-TURKISH8 hpux # HP-KANA8 hpux # DEC-KANJI osf # DEC-HANYU osf # UTF-8 Y glibc aix hpux osf solaris darwin # # Note: Names which are not marked as being a MIME name should not be used in # Internet protocols for information interchange (mail, news, etc.). # # Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications # must understand both names and treat them as equivalent. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM host="$1" os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` echo "# This file contains a table of character encoding aliases," echo "# suitable for operating system '${os}'." echo "# It was automatically generated from config.charset." # List of references, updated during installation: echo "# Packages using this file: " case "$os" in linux-gnulibc1*) # Linux libc5 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "C ASCII" echo "POSIX ASCII" for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \ en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \ en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \ es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \ et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \ fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \ it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \ sv_FI sv_SE; do echo "$l ISO-8859-1" echo "$l.iso-8859-1 ISO-8859-1" echo "$l.iso-8859-15 ISO-8859-15" echo "$l.iso-8859-15@euro ISO-8859-15" echo "$l@euro ISO-8859-15" echo "$l.cp-437 CP437" echo "$l.cp-850 CP850" echo "$l.cp-1252 CP1252" echo "$l.cp-1252@euro CP1252" #echo "$l.atari-st ATARI-ST" # not a commonly used encoding echo "$l.utf-8 UTF-8" echo "$l.utf-8@euro UTF-8" done for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \ sl_SI sr sr_CS sr_YU; do echo "$l ISO-8859-2" echo "$l.iso-8859-2 ISO-8859-2" echo "$l.cp-852 CP852" echo "$l.cp-1250 CP1250" echo "$l.utf-8 UTF-8" done for l in mk mk_MK ru ru_RU; do echo "$l ISO-8859-5" echo "$l.iso-8859-5 ISO-8859-5" echo "$l.koi8-r KOI8-R" echo "$l.cp-866 CP866" echo "$l.cp-1251 CP1251" echo "$l.utf-8 UTF-8" done for l in ar ar_SA; do echo "$l ISO-8859-6" echo "$l.iso-8859-6 ISO-8859-6" echo "$l.cp-864 CP864" #echo "$l.cp-868 CP868" # not a commonly used encoding echo "$l.cp-1256 CP1256" echo "$l.utf-8 UTF-8" done for l in el el_GR gr gr_GR; do echo "$l ISO-8859-7" echo "$l.iso-8859-7 ISO-8859-7" echo "$l.cp-869 CP869" echo "$l.cp-1253 CP1253" echo "$l.cp-1253@euro CP1253" echo "$l.utf-8 UTF-8" echo "$l.utf-8@euro UTF-8" done for l in he he_IL iw iw_IL; do echo "$l ISO-8859-8" echo "$l.iso-8859-8 ISO-8859-8" echo "$l.cp-862 CP862" echo "$l.cp-1255 CP1255" echo "$l.utf-8 UTF-8" done for l in tr tr_TR; do echo "$l ISO-8859-9" echo "$l.iso-8859-9 ISO-8859-9" echo "$l.cp-857 CP857" echo "$l.cp-1254 CP1254" echo "$l.utf-8 UTF-8" done for l in lt lt_LT lv lv_LV; do #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name echo "$l ISO-8859-13" done for l in ru_UA uk uk_UA; do echo "$l KOI8-U" done for l in zh zh_CN; do #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name echo "$l GB2312" done for l in ja ja_JP ja_JP.EUC; do echo "$l EUC-JP" done for l in ko ko_KR; do echo "$l EUC-KR" done for l in th th_TH; do echo "$l TIS-620" done for l in fa fa_IR; do #echo "$l ISIRI-3342" # a broken encoding echo "$l.utf-8 UTF-8" done ;; linux* | *-gnu*) # With glibc-2.1 or newer, we don't need any canonicalization, # because glibc has iconv and both glibc and libiconv support all # GNU canonical names directly. Therefore, the Makefile does not # need to install the alias file at all. # The following applies only to glibc-2.0.x and older libcs. echo "ISO_646.IRV:1983 ASCII" ;; aix*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-6 ISO-8859-6" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "IBM-850 CP850" echo "IBM-856 CP856" echo "IBM-921 ISO-8859-13" echo "IBM-922 CP922" echo "IBM-932 CP932" echo "IBM-943 CP943" echo "IBM-1046 CP1046" echo "IBM-1124 CP1124" echo "IBM-1129 CP1129" echo "IBM-1252 CP1252" echo "IBM-eucCN GB2312" echo "IBM-eucJP EUC-JP" echo "IBM-eucKR EUC-KR" echo "IBM-eucTW EUC-TW" echo "big5 BIG5" echo "GBK GBK" echo "TIS-620 TIS-620" echo "UTF-8 UTF-8" ;; hpux*) echo "iso88591 ISO-8859-1" echo "iso88592 ISO-8859-2" echo "iso88595 ISO-8859-5" echo "iso88596 ISO-8859-6" echo "iso88597 ISO-8859-7" echo "iso88598 ISO-8859-8" echo "iso88599 ISO-8859-9" echo "iso885915 ISO-8859-15" echo "roman8 HP-ROMAN8" echo "arabic8 HP-ARABIC8" echo "greek8 HP-GREEK8" echo "hebrew8 HP-HEBREW8" echo "turkish8 HP-TURKISH8" echo "kana8 HP-KANA8" echo "tis620 TIS-620" echo "big5 BIG5" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "hp15CN GB2312" #echo "ccdc ?" # what is this? echo "SJIS SHIFT_JIS" echo "utf8 UTF-8" ;; irix*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-9 ISO-8859-9" echo "eucCN GB2312" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" ;; osf*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "cp850 CP850" echo "big5 BIG5" echo "dechanyu DEC-HANYU" echo "dechanzi GB2312" echo "deckanji DEC-KANJI" echo "deckorean EUC-KR" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "GBK GBK" echo "KSC5601 CP949" echo "sdeckanji EUC-JP" echo "SJIS SHIFT_JIS" echo "TACTIS TIS-620" echo "UTF-8 UTF-8" ;; solaris*) echo "646 ASCII" echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-3 ISO-8859-3" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-6 ISO-8859-6" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "koi8-r KOI8-R" echo "ansi-1251 CP1251" echo "BIG5 BIG5" echo "Big5-HKSCS BIG5-HKSCS" echo "gb2312 GB2312" echo "GBK GBK" echo "GB18030 GB18030" echo "cns11643 EUC-TW" echo "5601 EUC-KR" echo "ko_KR.johap92 JOHAB" echo "eucJP EUC-JP" echo "PCK SHIFT_JIS" echo "TIS620.2533 TIS-620" #echo "sun_eu_greek ?" # what is this? echo "UTF-8 UTF-8" ;; freebsd* | os2*) # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just # reuse FreeBSD's locale data for OS/2. echo "C ASCII" echo "US-ASCII ASCII" for l in la_LN lt_LN; do echo "$l.ASCII ASCII" done for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do echo "$l.ISO_8859-1 ISO-8859-1" echo "$l.DIS_8859-15 ISO-8859-15" done for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do echo "$l.ISO_8859-2 ISO-8859-2" done for l in la_LN lt_LT; do echo "$l.ISO_8859-4 ISO-8859-4" done for l in ru_RU ru_SU; do echo "$l.KOI8-R KOI8-R" echo "$l.ISO_8859-5 ISO-8859-5" echo "$l.CP866 CP866" done echo "uk_UA.KOI8-U KOI8-U" echo "zh_TW.BIG5 BIG5" echo "zh_TW.Big5 BIG5" echo "zh_CN.EUC GB2312" echo "ja_JP.EUC EUC-JP" echo "ja_JP.SJIS SHIFT_JIS" echo "ja_JP.Shift_JIS SHIFT_JIS" echo "ko_KR.EUC EUC-KR" ;; netbsd*) echo "646 ASCII" echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-15 ISO-8859-15" echo "eucCN GB2312" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "BIG5 BIG5" echo "SJIS SHIFT_JIS" ;; darwin[56]*) # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "C ASCII" for l in en_AU en_CA en_GB en_US la_LN; do echo "$l.US-ASCII ASCII" done for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \ nl_NL no_NO pt_PT sv_SE; do echo "$l ISO-8859-1" echo "$l.ISO8859-1 ISO-8859-1" echo "$l.ISO8859-15 ISO-8859-15" done for l in la_LN; do echo "$l.ISO8859-1 ISO-8859-1" echo "$l.ISO8859-15 ISO-8859-15" done for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do echo "$l.ISO8859-2 ISO-8859-2" done for l in la_LN lt_LT; do echo "$l.ISO8859-4 ISO-8859-4" done for l in ru_RU; do echo "$l.KOI8-R KOI8-R" echo "$l.ISO8859-5 ISO-8859-5" echo "$l.CP866 CP866" done for l in bg_BG; do echo "$l.CP1251 CP1251" done echo "uk_UA.KOI8-U KOI8-U" echo "zh_TW.BIG5 BIG5" echo "zh_TW.Big5 BIG5" echo "zh_CN.EUC GB2312" echo "ja_JP.EUC EUC-JP" echo "ja_JP.SJIS SHIFT_JIS" echo "ko_KR.EUC EUC-KR" ;; darwin*) # Darwin 7.5 has nl_langinfo(CODESET), but it is useless: # - It returns the empty string when LANG is set to a locale of the # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8 # LC_CTYPE file. # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case. # - The documentation says: # "... all code that calls BSD system routines should ensure # that the const *char parameters of these routines are in UTF-8 # encoding. All BSD system functions expect their string # parameters to be in UTF-8 encoding and nothing else." # It also says # "An additional caveat is that string parameters for files, # paths, and other file-system entities must be in canonical # UTF-8. In a canonical UTF-8 Unicode string, all decomposable # characters are decomposed ..." # but this is not true: You can pass non-decomposed UTF-8 strings # to file system functions, and it is the OS which will convert # them to decomposed UTF-8 before accessing the file system. # - The Apple Terminal application displays UTF-8 by default. # - However, other applications are free to use different encodings: # - xterm uses ISO-8859-1 by default. # - TextEdit uses MacRoman by default. # We prefer UTF-8 over decomposed UTF-8-MAC because one should # minimize the use of decomposed Unicode. Unfortunately, through the # Darwin file system, decomposed UTF-8 strings are leaked into user # space nevertheless. echo "* UTF-8" ;; beos*) # BeOS has a single locale, and it has UTF-8 encoding. echo "* UTF-8" ;; msdosdjgpp*) # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "#" echo "# The encodings given here may not all be correct." echo "# If you find that the encoding given for your language and" echo "# country is not the one your DOS machine actually uses, just" echo "# correct it in this file, and send a mail to" echo "# Juan Manuel Guerrero " echo "# and Bruno Haible ." echo "#" echo "C ASCII" # ISO-8859-1 languages echo "ca CP850" echo "ca_ES CP850" echo "da CP865" # not CP850 ?? echo "da_DK CP865" # not CP850 ?? echo "de CP850" echo "de_AT CP850" echo "de_CH CP850" echo "de_DE CP850" echo "en CP850" echo "en_AU CP850" # not CP437 ?? echo "en_CA CP850" echo "en_GB CP850" echo "en_NZ CP437" echo "en_US CP437" echo "en_ZA CP850" # not CP437 ?? echo "es CP850" echo "es_AR CP850" echo "es_BO CP850" echo "es_CL CP850" echo "es_CO CP850" echo "es_CR CP850" echo "es_CU CP850" echo "es_DO CP850" echo "es_EC CP850" echo "es_ES CP850" echo "es_GT CP850" echo "es_HN CP850" echo "es_MX CP850" echo "es_NI CP850" echo "es_PA CP850" echo "es_PY CP850" echo "es_PE CP850" echo "es_SV CP850" echo "es_UY CP850" echo "es_VE CP850" echo "et CP850" echo "et_EE CP850" echo "eu CP850" echo "eu_ES CP850" echo "fi CP850" echo "fi_FI CP850" echo "fr CP850" echo "fr_BE CP850" echo "fr_CA CP850" echo "fr_CH CP850" echo "fr_FR CP850" echo "ga CP850" echo "ga_IE CP850" echo "gd CP850" echo "gd_GB CP850" echo "gl CP850" echo "gl_ES CP850" echo "id CP850" # not CP437 ?? echo "id_ID CP850" # not CP437 ?? echo "is CP861" # not CP850 ?? echo "is_IS CP861" # not CP850 ?? echo "it CP850" echo "it_CH CP850" echo "it_IT CP850" echo "lt CP775" echo "lt_LT CP775" echo "lv CP775" echo "lv_LV CP775" echo "nb CP865" # not CP850 ?? echo "nb_NO CP865" # not CP850 ?? echo "nl CP850" echo "nl_BE CP850" echo "nl_NL CP850" echo "nn CP865" # not CP850 ?? echo "nn_NO CP865" # not CP850 ?? echo "no CP865" # not CP850 ?? echo "no_NO CP865" # not CP850 ?? echo "pt CP850" echo "pt_BR CP850" echo "pt_PT CP850" echo "sv CP850" echo "sv_SE CP850" # ISO-8859-2 languages echo "cs CP852" echo "cs_CZ CP852" echo "hr CP852" echo "hr_HR CP852" echo "hu CP852" echo "hu_HU CP852" echo "pl CP852" echo "pl_PL CP852" echo "ro CP852" echo "ro_RO CP852" echo "sk CP852" echo "sk_SK CP852" echo "sl CP852" echo "sl_SI CP852" echo "sq CP852" echo "sq_AL CP852" echo "sr CP852" # CP852 or CP866 or CP855 ?? echo "sr_CS CP852" # CP852 or CP866 or CP855 ?? echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? # ISO-8859-3 languages echo "mt CP850" echo "mt_MT CP850" # ISO-8859-5 languages echo "be CP866" echo "be_BE CP866" echo "bg CP866" # not CP855 ?? echo "bg_BG CP866" # not CP855 ?? echo "mk CP866" # not CP855 ?? echo "mk_MK CP866" # not CP855 ?? echo "ru CP866" echo "ru_RU CP866" echo "uk CP1125" echo "uk_UA CP1125" # ISO-8859-6 languages echo "ar CP864" echo "ar_AE CP864" echo "ar_DZ CP864" echo "ar_EG CP864" echo "ar_IQ CP864" echo "ar_IR CP864" echo "ar_JO CP864" echo "ar_KW CP864" echo "ar_MA CP864" echo "ar_OM CP864" echo "ar_QA CP864" echo "ar_SA CP864" echo "ar_SY CP864" # ISO-8859-7 languages echo "el CP869" echo "el_GR CP869" # ISO-8859-8 languages echo "he CP862" echo "he_IL CP862" # ISO-8859-9 languages echo "tr CP857" echo "tr_TR CP857" # Japanese echo "ja CP932" echo "ja_JP CP932" # Chinese echo "zh_CN GBK" echo "zh_TW CP950" # not CP938 ?? # Korean echo "kr CP949" # not CP934 ?? echo "kr_KR CP949" # not CP934 ?? # Thai echo "th CP874" echo "th_TH CP874" # Other echo "eo CP850" echo "eo_EO CP850" ;; esac centerim-4.22.10/intl/VERSION0000644000175000001440000000005011473011427012414 00000000000000GNU gettext library from gettext-0.14.6 centerim-4.22.10/intl/intl-compat.c0000644000175000001440000000644711473011430013751 00000000000000/* intl-compat.c - Stub functions to call gettext functions from GNU gettext Library. Copyright (C) 1995, 2000-2003 Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" /* @@ end of prolog @@ */ /* This file redirects the gettext functions (without prefix) to those defined in the included GNU libintl library (with "libintl_" prefix). It is compiled into libintl in order to make the AM_GNU_GETTEXT test of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which has the redirections primarily in the include file. It is also compiled into libgnuintl so that libgnuintl.so can be used as LD_PRELOADable library on glibc systems, to provide the extra features that the functions in the libc don't have (namely, logging). */ #undef gettext #undef dgettext #undef dcgettext #undef ngettext #undef dngettext #undef dcngettext #undef textdomain #undef bindtextdomain #undef bind_textdomain_codeset /* When building a DLL, we must export some functions. Note that because the functions are only defined for binary backward compatibility, we don't need to use __declspec(dllimport) in any case. */ #if defined _MSC_VER && BUILDING_DLL # define DLL_EXPORTED __declspec(dllexport) #else # define DLL_EXPORTED #endif DLL_EXPORTED char * gettext (const char *msgid) { return libintl_gettext (msgid); } DLL_EXPORTED char * dgettext (const char *domainname, const char *msgid) { return libintl_dgettext (domainname, msgid); } DLL_EXPORTED char * dcgettext (const char *domainname, const char *msgid, int category) { return libintl_dcgettext (domainname, msgid, category); } DLL_EXPORTED char * ngettext (const char *msgid1, const char *msgid2, unsigned long int n) { return libintl_ngettext (msgid1, msgid2, n); } DLL_EXPORTED char * dngettext (const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n) { return libintl_dngettext (domainname, msgid1, msgid2, n); } DLL_EXPORTED char * dcngettext (const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n, int category) { return libintl_dcngettext (domainname, msgid1, msgid2, n, category); } DLL_EXPORTED char * textdomain (const char *domainname) { return libintl_textdomain (domainname); } DLL_EXPORTED char * bindtextdomain (const char *domainname, const char *dirname) { return libintl_bindtextdomain (domainname, dirname); } DLL_EXPORTED char * bind_textdomain_codeset (const char *domainname, const char *codeset) { return libintl_bind_textdomain_codeset (domainname, codeset); } centerim-4.22.10/intl/plural-exp.h0000644000175000001440000000773711473011430013623 00000000000000/* Expression parsing and evaluation for plural form selection. Copyright (C) 2000-2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _PLURAL_EXP_H #define _PLURAL_EXP_H #ifndef internal_function # define internal_function #endif #ifndef attribute_hidden # define attribute_hidden #endif /* This is the representation of the expressions to determine the plural form. */ struct expression { int nargs; /* Number of arguments. */ enum operator { /* Without arguments: */ var, /* The variable "n". */ num, /* Decimal number. */ /* Unary operators: */ lnot, /* Logical NOT. */ /* Binary operators: */ mult, /* Multiplication. */ divide, /* Division. */ module, /* Modulo operation. */ plus, /* Addition. */ minus, /* Subtraction. */ less_than, /* Comparison. */ greater_than, /* Comparison. */ less_or_equal, /* Comparison. */ greater_or_equal, /* Comparison. */ equal, /* Comparison for equality. */ not_equal, /* Comparison for inequality. */ land, /* Logical AND. */ lor, /* Logical OR. */ /* Ternary operators: */ qmop /* Question mark operator. */ } operation; union { unsigned long int num; /* Number value for `num'. */ struct expression *args[3]; /* Up to three arguments. */ } val; }; /* This is the data structure to pass information to the parser and get the result in a thread-safe way. */ struct parse_args { const char *cp; struct expression *res; }; /* Names for the libintl functions are a problem. This source code is used 1. in the GNU C Library library, 2. in the GNU libintl library, 3. in the GNU gettext tools. The function names in each situation must be different, to allow for binary incompatible changes in 'struct expression'. Furthermore, 1. in the GNU C Library library, the names have a __ prefix, 2.+3. in the GNU libintl library and in the GNU gettext tools, the names must follow ANSI C and not start with __. So we have to distinguish the three cases. */ #ifdef _LIBC # define FREE_EXPRESSION __gettext_free_exp # define PLURAL_PARSE __gettextparse # define GERMANIC_PLURAL __gettext_germanic_plural # define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural #elif defined (IN_LIBINTL) # define FREE_EXPRESSION libintl_gettext_free_exp # define PLURAL_PARSE libintl_gettextparse # define GERMANIC_PLURAL libintl_gettext_germanic_plural # define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural #else # define FREE_EXPRESSION free_plural_expression # define PLURAL_PARSE parse_plural_expression # define GERMANIC_PLURAL germanic_plural # define EXTRACT_PLURAL_EXPRESSION extract_plural_expression #endif extern void FREE_EXPRESSION (struct expression *exp) internal_function; extern int PLURAL_PARSE (void *arg); extern struct expression GERMANIC_PLURAL attribute_hidden; extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry, struct expression **pluralp, unsigned long int *npluralsp) internal_function; #if !defined (_LIBC) && !defined (IN_LIBINTL) extern unsigned long int plural_eval (struct expression *pexp, unsigned long int n); #endif #endif /* _PLURAL_EXP_H */ centerim-4.22.10/intl/dcgettext.c0000644000175000001440000000342111473011427013510 00000000000000/* Implementation of the dcgettext(3) function. Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCGETTEXT __dcgettext # define DCIGETTEXT __dcigettext #else # define DCGETTEXT libintl_dcgettext # define DCIGETTEXT libintl_dcigettext #endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ char * DCGETTEXT (const char *domainname, const char *msgid, int category) { return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ INTDEF(__dcgettext) weak_alias (__dcgettext, dcgettext); #endif centerim-4.22.10/intl/log.c0000644000175000001440000000530711473011430012275 00000000000000/* Log file output. Copyright (C) 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Bruno Haible . */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include /* Print an ASCII string with quotes and escape sequences where needed. */ static void print_escaped (FILE *stream, const char *str) { putc ('"', stream); for (; *str != '\0'; str++) if (*str == '\n') { fputs ("\\n\"", stream); if (str[1] == '\0') return; fputs ("\n\"", stream); } else { if (*str == '"' || *str == '\\') putc ('\\', stream); putc (*str, stream); } putc ('"', stream); } /* Add to the log file an entry denoting a failed translation. */ void _nl_log_untranslated (const char *logfilename, const char *domainname, const char *msgid1, const char *msgid2, int plural) { static char *last_logfilename = NULL; static FILE *last_logfile = NULL; FILE *logfile; /* Can we reuse the last opened logfile? */ if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0) { /* Close the last used logfile. */ if (last_logfilename != NULL) { if (last_logfile != NULL) { fclose (last_logfile); last_logfile = NULL; } free (last_logfilename); last_logfilename = NULL; } /* Open the logfile. */ last_logfilename = (char *) malloc (strlen (logfilename) + 1); if (last_logfilename == NULL) return; strcpy (last_logfilename, logfilename); last_logfile = fopen (logfilename, "a"); if (last_logfile == NULL) return; } logfile = last_logfile; fprintf (logfile, "domain "); print_escaped (logfile, domainname); fprintf (logfile, "\nmsgid "); print_escaped (logfile, msgid1); if (plural) { fprintf (logfile, "\nmsgid_plural "); print_escaped (logfile, msgid2); fprintf (logfile, "\nmsgstr[0] \"\"\n"); } else fprintf (logfile, "\nmsgstr \"\"\n"); putc ('\n', logfile); } centerim-4.22.10/intl/relocatable.h0000644000175000001440000000524111473011430013773 00000000000000/* Provide relocatable packages. Copyright (C) 2003 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _RELOCATABLE_H #define _RELOCATABLE_H #ifdef __cplusplus extern "C" { #endif /* This can be enabled through the configure --enable-relocatable option. */ #if ENABLE_RELOCATABLE /* When building a DLL, we must export some functions. Note that because this is a private .h file, we don't need to use __declspec(dllimport) in any case. */ #if defined _MSC_VER && BUILDING_DLL # define RELOCATABLE_DLL_EXPORTED __declspec(dllexport) #else # define RELOCATABLE_DLL_EXPORTED #endif /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ extern RELOCATABLE_DLL_EXPORTED void set_relocation_prefix (const char *orig_prefix, const char *curr_prefix); /* Returns the pathname, relocated according to the current installation directory. */ extern const char * relocate (const char *pathname); /* Memory management: relocate() leaks memory, because it has to construct a fresh pathname. If this is a problem because your program calls relocate() frequently, think about caching the result. */ /* Convenience function: Computes the current installation prefix, based on the original installation prefix, the original installation directory of a particular file, and the current pathname of this file. Returns NULL upon failure. */ extern const char * compute_curr_prefix (const char *orig_installprefix, const char *orig_installdir, const char *curr_pathname); #else /* By default, we use the hardwired pathnames. */ #define relocate(pathname) (pathname) #endif #ifdef __cplusplus } #endif #endif /* _RELOCATABLE_H */ centerim-4.22.10/intl/Makefile.in0000644000175000001440000004025511473011427013424 00000000000000# Makefile for directory with message catalog handling library of GNU gettext # Copyright (C) 1995-1998, 2000-2005 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = .. VPATH = $(srcdir) prefix = @prefix@ exec_prefix = @exec_prefix@ transform = @program_transform_name@ libdir = @libdir@ includedir = @includedir@ datadir = @datadir@ localedir = $(datadir)/locale gettextsrcdir = $(datadir)/gettext/intl aliaspath = $(localedir) subdir = intl INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @MKINSTALLDIRS@ mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) l = @INTL_LIBTOOL_SUFFIX_PREFIX@ AR = ar CC = @CC@ LIBTOOL = @LIBTOOL@ RANLIB = @RANLIB@ YACC = @INTLBISON@ -y -d YFLAGS = --name-prefix=__gettext DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \ -DLIBDIR=\"$(libdir)\" -DIN_LIBINTL \ -DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \ -Dset_relocation_prefix=libintl_set_relocation_prefix \ -Drelocate=libintl_relocate \ -DDEPENDS_ON_LIBICONV=1 @DEFS@ CPPFLAGS = @CPPFLAGS@ CFLAGS = @CFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) HEADERS = \ gmo.h \ gettextP.h \ hash-string.h \ loadinfo.h \ plural-exp.h \ eval-plural.h \ localcharset.h \ relocatable.h \ xsize.h \ printf-args.h printf-args.c \ printf-parse.h wprintf-parse.h printf-parse.c \ vasnprintf.h vasnwprintf.h vasnprintf.c \ os2compat.h \ libgnuintl.h.in SOURCES = \ bindtextdom.c \ dcgettext.c \ dgettext.c \ gettext.c \ finddomain.c \ loadmsgcat.c \ localealias.c \ textdomain.c \ l10nflist.c \ explodename.c \ dcigettext.c \ dcngettext.c \ dngettext.c \ ngettext.c \ plural.y \ plural-exp.c \ localcharset.c \ relocatable.c \ langprefs.c \ localename.c \ log.c \ printf.c \ osdep.c \ os2compat.c \ intl-compat.c OBJECTS = \ bindtextdom.$lo \ dcgettext.$lo \ dgettext.$lo \ gettext.$lo \ finddomain.$lo \ loadmsgcat.$lo \ localealias.$lo \ textdomain.$lo \ l10nflist.$lo \ explodename.$lo \ dcigettext.$lo \ dcngettext.$lo \ dngettext.$lo \ ngettext.$lo \ plural.$lo \ plural-exp.$lo \ localcharset.$lo \ relocatable.$lo \ langprefs.$lo \ localename.$lo \ log.$lo \ printf.$lo \ osdep.$lo \ intl-compat.$lo DISTFILES.common = Makefile.in \ config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES) DISTFILES.generated = plural.c DISTFILES.normal = VERSION DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc \ libgnuintl.h_vms Makefile.vms \ libgnuintl.h.msvc-static libgnuintl.h.msvc-shared README.woe32 Makefile.msvc DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \ COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h all: all-@USE_INCLUDED_LIBINTL@ all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed all-no: all-no-@BUILD_INCLUDED_LIBINTL@ all-no-yes: libgnuintl.$la all-no-no: libintl.a libgnuintl.a: $(OBJECTS) rm -f $@ $(AR) cru $@ $(OBJECTS) $(RANLIB) $@ libintl.la libgnuintl.la: $(OBJECTS) $(LIBTOOL) --mode=link \ $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ $(OBJECTS) @LTLIBICONV@ @INTL_MACOSX_LIBS@ $(LIBS) -lc \ -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ -rpath $(libdir) \ -no-undefined # Libtool's library version information for libintl. # Before making a gettext release, the gettext maintainer must change this # according to the libtool documentation, section "Library interface versions". # Maintainers of other packages that include the intl directory must *not* # change these values. LTV_CURRENT=7 LTV_REVISION=3 LTV_AGE=4 .SUFFIXES: .SUFFIXES: .c .y .o .lo .sin .sed .c.o: $(COMPILE) $< .y.c: $(YACC) $(YFLAGS) --output $@ $< rm -f $*.h bindtextdom.lo: $(srcdir)/bindtextdom.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c dcgettext.lo: $(srcdir)/dcgettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c dgettext.lo: $(srcdir)/dgettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c gettext.lo: $(srcdir)/gettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c finddomain.lo: $(srcdir)/finddomain.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c loadmsgcat.lo: $(srcdir)/loadmsgcat.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c localealias.lo: $(srcdir)/localealias.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c textdomain.lo: $(srcdir)/textdomain.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c l10nflist.lo: $(srcdir)/l10nflist.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c explodename.lo: $(srcdir)/explodename.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c dcigettext.lo: $(srcdir)/dcigettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c dcngettext.lo: $(srcdir)/dcngettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c dngettext.lo: $(srcdir)/dngettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c ngettext.lo: $(srcdir)/ngettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c plural.lo: $(srcdir)/plural.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c plural-exp.lo: $(srcdir)/plural-exp.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c localcharset.lo: $(srcdir)/localcharset.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c relocatable.lo: $(srcdir)/relocatable.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c langprefs.lo: $(srcdir)/langprefs.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/langprefs.c localename.lo: $(srcdir)/localename.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c log.lo: $(srcdir)/log.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c printf.lo: $(srcdir)/printf.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/printf.c osdep.lo: $(srcdir)/osdep.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c intl-compat.lo: $(srcdir)/intl-compat.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c ref-add.sed: $(srcdir)/ref-add.sin sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed mv t-ref-add.sed ref-add.sed ref-del.sed: $(srcdir)/ref-del.sin sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin > t-ref-del.sed mv t-ref-del.sed ref-del.sed INCLUDES = -I. -I$(srcdir) -I.. libgnuintl.h: $(srcdir)/libgnuintl.h.in sed -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \ -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ < $(srcdir)/libgnuintl.h.in > libgnuintl.h libintl.h: libgnuintl.h cp libgnuintl.h libintl.h charset.alias: $(srcdir)/config.charset $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ mv t-$@ $@ check: all # We must not install the libintl.h/libintl.a files if we are on a # system which has the GNU gettext() function in its C library or in a # separate library. # If you want to use the one which comes with this version of the # package, you have to use `configure --with-included-gettext'. install: install-exec install-data install-exec: all if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ && test '@USE_INCLUDED_LIBINTL@' = yes; then \ $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \ $(LIBTOOL) --mode=install \ $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \ if test "@RELOCATABLE@" = yes; then \ dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTDIR)$(libdir)/libintl.la | sed -e "s,^',," -e "s,'\$$,,"`; \ if test -n "$$dependencies"; then \ rm -f $(DESTDIR)$(libdir)/libintl.la; \ fi; \ fi; \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools" \ && test '@USE_INCLUDED_LIBINTL@' = no \ && test @GLIBC2@ != no; then \ $(mkinstalldirs) $(DESTDIR)$(libdir); \ $(LIBTOOL) --mode=install \ $(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la; \ rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ $(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir)/preloadable_libintl.so; \ $(LIBTOOL) --mode=uninstall \ rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \ else \ : ; \ fi if test '@USE_INCLUDED_LIBINTL@' = yes; then \ test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ temp=$(DESTDIR)$(libdir)/t-charset.alias; \ dest=$(DESTDIR)$(libdir)/charset.alias; \ if test -f $(DESTDIR)$(libdir)/charset.alias; then \ orig=$(DESTDIR)$(libdir)/charset.alias; \ sed -f ref-add.sed $$orig > $$temp; \ $(INSTALL_DATA) $$temp $$dest; \ rm -f $$temp; \ else \ if test @GLIBC21@ = no; then \ orig=charset.alias; \ sed -f ref-add.sed $$orig > $$temp; \ $(INSTALL_DATA) $$temp $$dest; \ rm -f $$temp; \ fi; \ fi; \ $(mkinstalldirs) $(DESTDIR)$(localedir); \ test -f $(DESTDIR)$(localedir)/locale.alias \ && orig=$(DESTDIR)$(localedir)/locale.alias \ || orig=$(srcdir)/locale.alias; \ temp=$(DESTDIR)$(localedir)/t-locale.alias; \ dest=$(DESTDIR)$(localedir)/locale.alias; \ sed -f ref-add.sed $$orig > $$temp; \ $(INSTALL_DATA) $$temp $$dest; \ rm -f $$temp; \ else \ : ; \ fi install-data: all if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \ dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \ for file in $$dists; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \ dists="$(DISTFILES.generated)"; \ for file in $$dists; do \ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ $(INSTALL_DATA) $$dir/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ dists="$(DISTFILES.obsolete)"; \ for file in $$dists; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-strip: install installdirs: if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ && test '@USE_INCLUDED_LIBINTL@' = yes; then \ $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools" \ && test '@USE_INCLUDED_LIBINTL@' = no \ && test @GLIBC2@ != no; then \ $(mkinstalldirs) $(DESTDIR)$(libdir); \ else \ : ; \ fi if test '@USE_INCLUDED_LIBINTL@' = yes; then \ test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ $(mkinstalldirs) $(DESTDIR)$(localedir); \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi # Define this as empty until I found a useful application. installcheck: uninstall: if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ && test '@USE_INCLUDED_LIBINTL@' = yes; then \ rm -f $(DESTDIR)$(includedir)/libintl.h; \ $(LIBTOOL) --mode=uninstall \ rm -f $(DESTDIR)$(libdir)/libintl.$la; \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools" \ && test '@USE_INCLUDED_LIBINTL@' = no \ && test @GLIBC2@ != no; then \ rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ else \ : ; \ fi if test '@USE_INCLUDED_LIBINTL@' = yes; then \ if test -f $(DESTDIR)$(libdir)/charset.alias; then \ temp=$(DESTDIR)$(libdir)/t-charset.alias; \ dest=$(DESTDIR)$(libdir)/charset.alias; \ sed -f ref-del.sed $$dest > $$temp; \ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ rm -f $$dest; \ else \ $(INSTALL_DATA) $$temp $$dest; \ fi; \ rm -f $$temp; \ fi; \ if test -f $(DESTDIR)$(localedir)/locale.alias; then \ temp=$(DESTDIR)$(localedir)/t-locale.alias; \ dest=$(DESTDIR)$(localedir)/locale.alias; \ sed -f ref-del.sed $$dest > $$temp; \ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ rm -f $$dest; \ else \ $(INSTALL_DATA) $$temp $$dest; \ fi; \ rm -f $$temp; \ fi; \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools"; then \ for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi info dvi ps pdf html: $(OBJECTS): ../config.h libgnuintl.h bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h dcigettext.$lo: $(srcdir)/eval-plural.h localcharset.$lo: $(srcdir)/localcharset.h localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h printf.$lo: $(srcdir)/printf-args.h $(srcdir)/printf-args.c $(srcdir)/printf-parse.h $(srcdir)/wprintf-parse.h $(srcdir)/xsize.h $(srcdir)/printf-parse.c $(srcdir)/vasnprintf.h $(srcdir)/vasnwprintf.h $(srcdir)/vasnprintf.c tags: TAGS TAGS: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES) id: ID ID: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) mostlyclean: rm -f *.a *.la *.o *.obj *.lo core core.* rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed rm -f -r .libs _libs clean: mostlyclean distclean: clean rm -f Makefile ID TAGS if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \ rm -f ChangeLog.inst $(DISTFILES.normal); \ else \ : ; \ fi maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." # GNU gettext needs not contain the file `VERSION' but contains some # other files which should not be distributed in other packages. distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: Makefile if test "$(PACKAGE)" = "gettext-tools"; then \ : ; \ else \ if test "$(PACKAGE)" = "gettext-runtime"; then \ additional="$(DISTFILES.gettext)"; \ else \ additional="$(DISTFILES.normal)"; \ fi; \ $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ cp -p $$dir/$$file $(distdir) || test $$file = Makefile.in || exit 1; \ done; \ fi Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status # This would be more efficient, but doesn't work any more with autoconf-2.57, # when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used. # cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/intl/vasnwprintf.h0000644000175000001440000000330611473011430014077 00000000000000/* vswprintf with automatic memory allocation. Copyright (C) 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _VASNWPRINTF_H #define _VASNWPRINTF_H /* Get va_list. */ #include /* Get wchar_t, size_t. */ #include #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(). You can pass a preallocated buffer for the result in RESULTBUF and its size in *LENGTHP; otherwise you pass RESULTBUF = NULL. If successful, return the address of the string (this may be = RESULTBUF if no dynamic memory allocation was necessary) and set *LENGTHP to the number of resulting bytes, excluding the trailing NUL. Upon error, set errno and return NULL. */ extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...); extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args); #ifdef __cplusplus } #endif #endif /* _VASNWPRINTF_H */ centerim-4.22.10/intl/loadmsgcat.c0000644000175000001440000010724311473011430013634 00000000000000/* Load needed message catalogs. Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Tell glibc's to provide a prototype for mempcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #ifdef __GNUC__ # undef alloca # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # ifdef _MSC_VER # include # define alloca _alloca # else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif # endif #endif #include #include #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #ifdef _LIBC # include # include #endif #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || (defined _LIBC && defined _POSIX_MAPPED_FILES) # include # undef HAVE_MMAP # define HAVE_MMAP 1 #else # undef HAVE_MMAP #endif #if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC # include #endif #if defined HAVE_INTTYPES_H || defined _LIBC # include #endif #include "gmo.h" #include "gettextP.h" #include "hash-string.h" #include "plural-exp.h" #ifdef _LIBC # include "../locale/localeinfo.h" #endif /* Provide fallback values for macros that ought to be defined in . Note that our fallback values need not be literal strings, because we don't use them with preprocessor string concatenation. */ #if !defined PRId8 || PRI_MACROS_BROKEN # undef PRId8 # define PRId8 "d" #endif #if !defined PRIi8 || PRI_MACROS_BROKEN # undef PRIi8 # define PRIi8 "i" #endif #if !defined PRIo8 || PRI_MACROS_BROKEN # undef PRIo8 # define PRIo8 "o" #endif #if !defined PRIu8 || PRI_MACROS_BROKEN # undef PRIu8 # define PRIu8 "u" #endif #if !defined PRIx8 || PRI_MACROS_BROKEN # undef PRIx8 # define PRIx8 "x" #endif #if !defined PRIX8 || PRI_MACROS_BROKEN # undef PRIX8 # define PRIX8 "X" #endif #if !defined PRId16 || PRI_MACROS_BROKEN # undef PRId16 # define PRId16 "d" #endif #if !defined PRIi16 || PRI_MACROS_BROKEN # undef PRIi16 # define PRIi16 "i" #endif #if !defined PRIo16 || PRI_MACROS_BROKEN # undef PRIo16 # define PRIo16 "o" #endif #if !defined PRIu16 || PRI_MACROS_BROKEN # undef PRIu16 # define PRIu16 "u" #endif #if !defined PRIx16 || PRI_MACROS_BROKEN # undef PRIx16 # define PRIx16 "x" #endif #if !defined PRIX16 || PRI_MACROS_BROKEN # undef PRIX16 # define PRIX16 "X" #endif #if !defined PRId32 || PRI_MACROS_BROKEN # undef PRId32 # define PRId32 "d" #endif #if !defined PRIi32 || PRI_MACROS_BROKEN # undef PRIi32 # define PRIi32 "i" #endif #if !defined PRIo32 || PRI_MACROS_BROKEN # undef PRIo32 # define PRIo32 "o" #endif #if !defined PRIu32 || PRI_MACROS_BROKEN # undef PRIu32 # define PRIu32 "u" #endif #if !defined PRIx32 || PRI_MACROS_BROKEN # undef PRIx32 # define PRIx32 "x" #endif #if !defined PRIX32 || PRI_MACROS_BROKEN # undef PRIX32 # define PRIX32 "X" #endif #if !defined PRId64 || PRI_MACROS_BROKEN # undef PRId64 # define PRId64 (sizeof (long) == 8 ? "ld" : "lld") #endif #if !defined PRIi64 || PRI_MACROS_BROKEN # undef PRIi64 # define PRIi64 (sizeof (long) == 8 ? "li" : "lli") #endif #if !defined PRIo64 || PRI_MACROS_BROKEN # undef PRIo64 # define PRIo64 (sizeof (long) == 8 ? "lo" : "llo") #endif #if !defined PRIu64 || PRI_MACROS_BROKEN # undef PRIu64 # define PRIu64 (sizeof (long) == 8 ? "lu" : "llu") #endif #if !defined PRIx64 || PRI_MACROS_BROKEN # undef PRIx64 # define PRIx64 (sizeof (long) == 8 ? "lx" : "llx") #endif #if !defined PRIX64 || PRI_MACROS_BROKEN # undef PRIX64 # define PRIX64 (sizeof (long) == 8 ? "lX" : "llX") #endif #if !defined PRIdLEAST8 || PRI_MACROS_BROKEN # undef PRIdLEAST8 # define PRIdLEAST8 "d" #endif #if !defined PRIiLEAST8 || PRI_MACROS_BROKEN # undef PRIiLEAST8 # define PRIiLEAST8 "i" #endif #if !defined PRIoLEAST8 || PRI_MACROS_BROKEN # undef PRIoLEAST8 # define PRIoLEAST8 "o" #endif #if !defined PRIuLEAST8 || PRI_MACROS_BROKEN # undef PRIuLEAST8 # define PRIuLEAST8 "u" #endif #if !defined PRIxLEAST8 || PRI_MACROS_BROKEN # undef PRIxLEAST8 # define PRIxLEAST8 "x" #endif #if !defined PRIXLEAST8 || PRI_MACROS_BROKEN # undef PRIXLEAST8 # define PRIXLEAST8 "X" #endif #if !defined PRIdLEAST16 || PRI_MACROS_BROKEN # undef PRIdLEAST16 # define PRIdLEAST16 "d" #endif #if !defined PRIiLEAST16 || PRI_MACROS_BROKEN # undef PRIiLEAST16 # define PRIiLEAST16 "i" #endif #if !defined PRIoLEAST16 || PRI_MACROS_BROKEN # undef PRIoLEAST16 # define PRIoLEAST16 "o" #endif #if !defined PRIuLEAST16 || PRI_MACROS_BROKEN # undef PRIuLEAST16 # define PRIuLEAST16 "u" #endif #if !defined PRIxLEAST16 || PRI_MACROS_BROKEN # undef PRIxLEAST16 # define PRIxLEAST16 "x" #endif #if !defined PRIXLEAST16 || PRI_MACROS_BROKEN # undef PRIXLEAST16 # define PRIXLEAST16 "X" #endif #if !defined PRIdLEAST32 || PRI_MACROS_BROKEN # undef PRIdLEAST32 # define PRIdLEAST32 "d" #endif #if !defined PRIiLEAST32 || PRI_MACROS_BROKEN # undef PRIiLEAST32 # define PRIiLEAST32 "i" #endif #if !defined PRIoLEAST32 || PRI_MACROS_BROKEN # undef PRIoLEAST32 # define PRIoLEAST32 "o" #endif #if !defined PRIuLEAST32 || PRI_MACROS_BROKEN # undef PRIuLEAST32 # define PRIuLEAST32 "u" #endif #if !defined PRIxLEAST32 || PRI_MACROS_BROKEN # undef PRIxLEAST32 # define PRIxLEAST32 "x" #endif #if !defined PRIXLEAST32 || PRI_MACROS_BROKEN # undef PRIXLEAST32 # define PRIXLEAST32 "X" #endif #if !defined PRIdLEAST64 || PRI_MACROS_BROKEN # undef PRIdLEAST64 # define PRIdLEAST64 PRId64 #endif #if !defined PRIiLEAST64 || PRI_MACROS_BROKEN # undef PRIiLEAST64 # define PRIiLEAST64 PRIi64 #endif #if !defined PRIoLEAST64 || PRI_MACROS_BROKEN # undef PRIoLEAST64 # define PRIoLEAST64 PRIo64 #endif #if !defined PRIuLEAST64 || PRI_MACROS_BROKEN # undef PRIuLEAST64 # define PRIuLEAST64 PRIu64 #endif #if !defined PRIxLEAST64 || PRI_MACROS_BROKEN # undef PRIxLEAST64 # define PRIxLEAST64 PRIx64 #endif #if !defined PRIXLEAST64 || PRI_MACROS_BROKEN # undef PRIXLEAST64 # define PRIXLEAST64 PRIX64 #endif #if !defined PRIdFAST8 || PRI_MACROS_BROKEN # undef PRIdFAST8 # define PRIdFAST8 "d" #endif #if !defined PRIiFAST8 || PRI_MACROS_BROKEN # undef PRIiFAST8 # define PRIiFAST8 "i" #endif #if !defined PRIoFAST8 || PRI_MACROS_BROKEN # undef PRIoFAST8 # define PRIoFAST8 "o" #endif #if !defined PRIuFAST8 || PRI_MACROS_BROKEN # undef PRIuFAST8 # define PRIuFAST8 "u" #endif #if !defined PRIxFAST8 || PRI_MACROS_BROKEN # undef PRIxFAST8 # define PRIxFAST8 "x" #endif #if !defined PRIXFAST8 || PRI_MACROS_BROKEN # undef PRIXFAST8 # define PRIXFAST8 "X" #endif #if !defined PRIdFAST16 || PRI_MACROS_BROKEN # undef PRIdFAST16 # define PRIdFAST16 "d" #endif #if !defined PRIiFAST16 || PRI_MACROS_BROKEN # undef PRIiFAST16 # define PRIiFAST16 "i" #endif #if !defined PRIoFAST16 || PRI_MACROS_BROKEN # undef PRIoFAST16 # define PRIoFAST16 "o" #endif #if !defined PRIuFAST16 || PRI_MACROS_BROKEN # undef PRIuFAST16 # define PRIuFAST16 "u" #endif #if !defined PRIxFAST16 || PRI_MACROS_BROKEN # undef PRIxFAST16 # define PRIxFAST16 "x" #endif #if !defined PRIXFAST16 || PRI_MACROS_BROKEN # undef PRIXFAST16 # define PRIXFAST16 "X" #endif #if !defined PRIdFAST32 || PRI_MACROS_BROKEN # undef PRIdFAST32 # define PRIdFAST32 "d" #endif #if !defined PRIiFAST32 || PRI_MACROS_BROKEN # undef PRIiFAST32 # define PRIiFAST32 "i" #endif #if !defined PRIoFAST32 || PRI_MACROS_BROKEN # undef PRIoFAST32 # define PRIoFAST32 "o" #endif #if !defined PRIuFAST32 || PRI_MACROS_BROKEN # undef PRIuFAST32 # define PRIuFAST32 "u" #endif #if !defined PRIxFAST32 || PRI_MACROS_BROKEN # undef PRIxFAST32 # define PRIxFAST32 "x" #endif #if !defined PRIXFAST32 || PRI_MACROS_BROKEN # undef PRIXFAST32 # define PRIXFAST32 "X" #endif #if !defined PRIdFAST64 || PRI_MACROS_BROKEN # undef PRIdFAST64 # define PRIdFAST64 PRId64 #endif #if !defined PRIiFAST64 || PRI_MACROS_BROKEN # undef PRIiFAST64 # define PRIiFAST64 PRIi64 #endif #if !defined PRIoFAST64 || PRI_MACROS_BROKEN # undef PRIoFAST64 # define PRIoFAST64 PRIo64 #endif #if !defined PRIuFAST64 || PRI_MACROS_BROKEN # undef PRIuFAST64 # define PRIuFAST64 PRIu64 #endif #if !defined PRIxFAST64 || PRI_MACROS_BROKEN # undef PRIxFAST64 # define PRIxFAST64 PRIx64 #endif #if !defined PRIXFAST64 || PRI_MACROS_BROKEN # undef PRIXFAST64 # define PRIXFAST64 PRIX64 #endif #if !defined PRIdMAX || PRI_MACROS_BROKEN # undef PRIdMAX # define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld") #endif #if !defined PRIiMAX || PRI_MACROS_BROKEN # undef PRIiMAX # define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli") #endif #if !defined PRIoMAX || PRI_MACROS_BROKEN # undef PRIoMAX # define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo") #endif #if !defined PRIuMAX || PRI_MACROS_BROKEN # undef PRIuMAX # define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu") #endif #if !defined PRIxMAX || PRI_MACROS_BROKEN # undef PRIxMAX # define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx") #endif #if !defined PRIXMAX || PRI_MACROS_BROKEN # undef PRIXMAX # define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX") #endif #if !defined PRIdPTR || PRI_MACROS_BROKEN # undef PRIdPTR # define PRIdPTR \ (sizeof (void *) == sizeof (long) ? "ld" : \ sizeof (void *) == sizeof (int) ? "d" : \ "lld") #endif #if !defined PRIiPTR || PRI_MACROS_BROKEN # undef PRIiPTR # define PRIiPTR \ (sizeof (void *) == sizeof (long) ? "li" : \ sizeof (void *) == sizeof (int) ? "i" : \ "lli") #endif #if !defined PRIoPTR || PRI_MACROS_BROKEN # undef PRIoPTR # define PRIoPTR \ (sizeof (void *) == sizeof (long) ? "lo" : \ sizeof (void *) == sizeof (int) ? "o" : \ "llo") #endif #if !defined PRIuPTR || PRI_MACROS_BROKEN # undef PRIuPTR # define PRIuPTR \ (sizeof (void *) == sizeof (long) ? "lu" : \ sizeof (void *) == sizeof (int) ? "u" : \ "llu") #endif #if !defined PRIxPTR || PRI_MACROS_BROKEN # undef PRIxPTR # define PRIxPTR \ (sizeof (void *) == sizeof (long) ? "lx" : \ sizeof (void *) == sizeof (int) ? "x" : \ "llx") #endif #if !defined PRIXPTR || PRI_MACROS_BROKEN # undef PRIXPTR # define PRIXPTR \ (sizeof (void *) == sizeof (long) ? "lX" : \ sizeof (void *) == sizeof (int) ? "X" : \ "llX") #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ISO C functions. This is required by the standard because some ISO C functions will require linking with this object file and the name space must not be polluted. */ # define open __open # define close __close # define read __read # define mmap __mmap # define munmap __munmap #endif /* For those losing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA # define freea(p) /* nothing */ #else # define alloca(n) malloc (n) # define freea(p) free (p) #endif /* For systems that distinguish between text and binary I/O. O_BINARY is usually declared in . */ #if !defined O_BINARY && defined _O_BINARY /* For MSC-compatible compilers. */ # define O_BINARY _O_BINARY # define O_TEXT _O_TEXT #endif #ifdef __BEOS__ /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ # undef O_BINARY # undef O_TEXT #endif /* On reasonable systems, binary I/O is the default. */ #ifndef O_BINARY # define O_BINARY 0 #endif /* We need a sign, whether a new catalog was loaded, which can be associated with all translations. This is important if the translations are cached by one of GCC's features. */ int _nl_msg_cat_cntr; /* Expand a system dependent string segment. Return NULL if unsupported. */ static const char * get_sysdep_segment_value (const char *name) { /* Test for an ISO C 99 section 7.8.1 format string directive. Syntax: P R I { d | i | o | u | x | X } { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR } */ /* We don't use a table of 14 times 6 'const char *' strings here, because data relocations cost startup time. */ if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I') { if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u' || name[3] == 'x' || name[3] == 'X') { if (name[4] == '8' && name[5] == '\0') { if (name[3] == 'd') return PRId8; if (name[3] == 'i') return PRIi8; if (name[3] == 'o') return PRIo8; if (name[3] == 'u') return PRIu8; if (name[3] == 'x') return PRIx8; if (name[3] == 'X') return PRIX8; abort (); } if (name[4] == '1' && name[5] == '6' && name[6] == '\0') { if (name[3] == 'd') return PRId16; if (name[3] == 'i') return PRIi16; if (name[3] == 'o') return PRIo16; if (name[3] == 'u') return PRIu16; if (name[3] == 'x') return PRIx16; if (name[3] == 'X') return PRIX16; abort (); } if (name[4] == '3' && name[5] == '2' && name[6] == '\0') { if (name[3] == 'd') return PRId32; if (name[3] == 'i') return PRIi32; if (name[3] == 'o') return PRIo32; if (name[3] == 'u') return PRIu32; if (name[3] == 'x') return PRIx32; if (name[3] == 'X') return PRIX32; abort (); } if (name[4] == '6' && name[5] == '4' && name[6] == '\0') { if (name[3] == 'd') return PRId64; if (name[3] == 'i') return PRIi64; if (name[3] == 'o') return PRIo64; if (name[3] == 'u') return PRIu64; if (name[3] == 'x') return PRIx64; if (name[3] == 'X') return PRIX64; abort (); } if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A' && name[7] == 'S' && name[8] == 'T') { if (name[9] == '8' && name[10] == '\0') { if (name[3] == 'd') return PRIdLEAST8; if (name[3] == 'i') return PRIiLEAST8; if (name[3] == 'o') return PRIoLEAST8; if (name[3] == 'u') return PRIuLEAST8; if (name[3] == 'x') return PRIxLEAST8; if (name[3] == 'X') return PRIXLEAST8; abort (); } if (name[9] == '1' && name[10] == '6' && name[11] == '\0') { if (name[3] == 'd') return PRIdLEAST16; if (name[3] == 'i') return PRIiLEAST16; if (name[3] == 'o') return PRIoLEAST16; if (name[3] == 'u') return PRIuLEAST16; if (name[3] == 'x') return PRIxLEAST16; if (name[3] == 'X') return PRIXLEAST16; abort (); } if (name[9] == '3' && name[10] == '2' && name[11] == '\0') { if (name[3] == 'd') return PRIdLEAST32; if (name[3] == 'i') return PRIiLEAST32; if (name[3] == 'o') return PRIoLEAST32; if (name[3] == 'u') return PRIuLEAST32; if (name[3] == 'x') return PRIxLEAST32; if (name[3] == 'X') return PRIXLEAST32; abort (); } if (name[9] == '6' && name[10] == '4' && name[11] == '\0') { if (name[3] == 'd') return PRIdLEAST64; if (name[3] == 'i') return PRIiLEAST64; if (name[3] == 'o') return PRIoLEAST64; if (name[3] == 'u') return PRIuLEAST64; if (name[3] == 'x') return PRIxLEAST64; if (name[3] == 'X') return PRIXLEAST64; abort (); } } if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S' && name[7] == 'T') { if (name[8] == '8' && name[9] == '\0') { if (name[3] == 'd') return PRIdFAST8; if (name[3] == 'i') return PRIiFAST8; if (name[3] == 'o') return PRIoFAST8; if (name[3] == 'u') return PRIuFAST8; if (name[3] == 'x') return PRIxFAST8; if (name[3] == 'X') return PRIXFAST8; abort (); } if (name[8] == '1' && name[9] == '6' && name[10] == '\0') { if (name[3] == 'd') return PRIdFAST16; if (name[3] == 'i') return PRIiFAST16; if (name[3] == 'o') return PRIoFAST16; if (name[3] == 'u') return PRIuFAST16; if (name[3] == 'x') return PRIxFAST16; if (name[3] == 'X') return PRIXFAST16; abort (); } if (name[8] == '3' && name[9] == '2' && name[10] == '\0') { if (name[3] == 'd') return PRIdFAST32; if (name[3] == 'i') return PRIiFAST32; if (name[3] == 'o') return PRIoFAST32; if (name[3] == 'u') return PRIuFAST32; if (name[3] == 'x') return PRIxFAST32; if (name[3] == 'X') return PRIXFAST32; abort (); } if (name[8] == '6' && name[9] == '4' && name[10] == '\0') { if (name[3] == 'd') return PRIdFAST64; if (name[3] == 'i') return PRIiFAST64; if (name[3] == 'o') return PRIoFAST64; if (name[3] == 'u') return PRIuFAST64; if (name[3] == 'x') return PRIxFAST64; if (name[3] == 'X') return PRIXFAST64; abort (); } } if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X' && name[7] == '\0') { if (name[3] == 'd') return PRIdMAX; if (name[3] == 'i') return PRIiMAX; if (name[3] == 'o') return PRIoMAX; if (name[3] == 'u') return PRIuMAX; if (name[3] == 'x') return PRIxMAX; if (name[3] == 'X') return PRIXMAX; abort (); } if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R' && name[7] == '\0') { if (name[3] == 'd') return PRIdPTR; if (name[3] == 'i') return PRIiPTR; if (name[3] == 'o') return PRIoPTR; if (name[3] == 'u') return PRIuPTR; if (name[3] == 'x') return PRIxPTR; if (name[3] == 'X') return PRIXPTR; abort (); } } } /* Test for a glibc specific printf() format directive flag. */ if (name[0] == 'I' && name[1] == '\0') { #if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) /* The 'I' flag, in numeric format directives, replaces ASCII digits with the 'outdigits' defined in the LC_CTYPE locale facet. This is used for Farsi (Persian) and maybe Arabic. */ return "I"; #else return ""; #endif } /* Other system dependent strings are not valid. */ return NULL; } /* Initialize the codeset dependent parts of an opened message catalog. Return the header entry. */ const char * internal_function _nl_init_domain_conv (struct loaded_l10nfile *domain_file, struct loaded_domain *domain, struct binding *domainbinding) { /* Find out about the character set the file is encoded with. This can be found (in textual form) in the entry "". If this entry does not exist or if this does not contain the `charset=' information, we will assume the charset matches the one the current locale and we don't have to perform any conversion. */ char *nullentry; size_t nullentrylen; /* Preinitialize fields, to avoid recursion during _nl_find_msg. */ domain->codeset_cntr = (domainbinding != NULL ? domainbinding->codeset_cntr : 0); #ifdef _LIBC domain->conv = (__gconv_t) -1; #else # if HAVE_ICONV domain->conv = (iconv_t) -1; # endif #endif domain->conv_tab = NULL; /* Get the header entry. */ nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen); if (nullentry != NULL) { #if defined _LIBC || HAVE_ICONV const char *charsetstr; charsetstr = strstr (nullentry, "charset="); if (charsetstr != NULL) { size_t len; char *charset; const char *outcharset; charsetstr += strlen ("charset="); len = strcspn (charsetstr, " \t\n"); charset = (char *) alloca (len + 1); # if defined _LIBC || HAVE_MEMPCPY *((char *) mempcpy (charset, charsetstr, len)) = '\0'; # else memcpy (charset, charsetstr, len); charset[len] = '\0'; # endif /* The output charset should normally be determined by the locale. But sometimes the locale is not used or not correctly set up, so we provide a possibility for the user to override this. Moreover, the value specified through bind_textdomain_codeset overrides both. */ if (domainbinding != NULL && domainbinding->codeset != NULL) outcharset = domainbinding->codeset; else { outcharset = getenv ("OUTPUT_CHARSET"); if (outcharset == NULL || outcharset[0] == '\0') { # ifdef _LIBC outcharset = _NL_CURRENT (LC_CTYPE, CODESET); # else # if HAVE_ICONV extern const char *locale_charset (void); outcharset = locale_charset (); # endif # endif } } # ifdef _LIBC /* We always want to use transliteration. */ outcharset = norm_add_slashes (outcharset, "TRANSLIT"); charset = norm_add_slashes (charset, NULL); if (__gconv_open (outcharset, charset, &domain->conv, GCONV_AVOID_NOCONV) != __GCONV_OK) domain->conv = (__gconv_t) -1; # else # if HAVE_ICONV /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5, we want to use transliteration. */ # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ || _LIBICONV_VERSION >= 0x0105 if (strchr (outcharset, '/') == NULL) { char *tmp; len = strlen (outcharset); tmp = (char *) alloca (len + 10 + 1); memcpy (tmp, outcharset, len); memcpy (tmp + len, "//TRANSLIT", 10 + 1); outcharset = tmp; domain->conv = iconv_open (outcharset, charset); freea (outcharset); } else # endif domain->conv = iconv_open (outcharset, charset); # endif # endif freea (charset); } #endif /* _LIBC || HAVE_ICONV */ } return nullentry; } /* Frees the codeset dependent parts of an opened message catalog. */ void internal_function _nl_free_domain_conv (struct loaded_domain *domain) { if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) free (domain->conv_tab); #ifdef _LIBC if (domain->conv != (__gconv_t) -1) __gconv_close (domain->conv); #else # if HAVE_ICONV if (domain->conv != (iconv_t) -1) iconv_close (domain->conv); # endif #endif } /* Load the message catalogs specified by FILENAME. If it is no valid message catalog do nothing. */ void internal_function _nl_load_domain (struct loaded_l10nfile *domain_file, struct binding *domainbinding) { int fd; size_t size; #ifdef _LIBC struct stat64 st; #else struct stat st; #endif struct mo_file_header *data = (struct mo_file_header *) -1; int use_mmap = 0; struct loaded_domain *domain; int revision; const char *nullentry; domain_file->decided = 1; domain_file->data = NULL; /* Note that it would be useless to store domainbinding in domain_file because domainbinding might be == NULL now but != NULL later (after a call to bind_textdomain_codeset). */ /* If the record does not represent a valid locale the FILENAME might be NULL. This can happen when according to the given specification the locale file name is different for XPG and CEN syntax. */ if (domain_file->filename == NULL) return; /* Try to open the addressed file. */ fd = open (domain_file->filename, O_RDONLY | O_BINARY); if (fd == -1) return; /* We must know about the size of the file. */ if ( #ifdef _LIBC __builtin_expect (fstat64 (fd, &st) != 0, 0) #else __builtin_expect (fstat (fd, &st) != 0, 0) #endif || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0) || __builtin_expect (size < sizeof (struct mo_file_header), 0)) { /* Something went wrong. */ close (fd); return; } #ifdef HAVE_MMAP /* Now we are ready to load the file. If mmap() is available we try this first. If not available or it failed we try to load it. */ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); if (__builtin_expect (data != (struct mo_file_header *) -1, 1)) { /* mmap() call was successful. */ close (fd); use_mmap = 1; } #endif /* If the data is not yet available (i.e. mmap'ed) we try to load it manually. */ if (data == (struct mo_file_header *) -1) { size_t to_read; char *read_ptr; data = (struct mo_file_header *) malloc (size); if (data == NULL) return; to_read = size; read_ptr = (char *) data; do { long int nb = (long int) read (fd, read_ptr, to_read); if (nb <= 0) { #ifdef EINTR if (nb == -1 && errno == EINTR) continue; #endif close (fd); return; } read_ptr += nb; to_read -= nb; } while (to_read > 0); close (fd); } /* Using the magic number we can test whether it really is a message catalog file. */ if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED, 0)) { /* The magic number is wrong: not a message catalog file. */ #ifdef HAVE_MMAP if (use_mmap) munmap ((caddr_t) data, size); else #endif free (data); return; } domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); if (domain == NULL) return; domain_file->data = domain; domain->data = (char *) data; domain->use_mmap = use_mmap; domain->mmap_size = size; domain->must_swap = data->magic != _MAGIC; domain->malloced = NULL; /* Fill in the information about the available tables. */ revision = W (domain->must_swap, data->revision); /* We support only the major revisions 0 and 1. */ switch (revision >> 16) { case 0: case 1: domain->nstrings = W (domain->must_swap, data->nstrings); domain->orig_tab = (const struct string_desc *) ((char *) data + W (domain->must_swap, data->orig_tab_offset)); domain->trans_tab = (const struct string_desc *) ((char *) data + W (domain->must_swap, data->trans_tab_offset)); domain->hash_size = W (domain->must_swap, data->hash_tab_size); domain->hash_tab = (domain->hash_size > 2 ? (const nls_uint32 *) ((char *) data + W (domain->must_swap, data->hash_tab_offset)) : NULL); domain->must_swap_hash_tab = domain->must_swap; /* Now dispatch on the minor revision. */ switch (revision & 0xffff) { case 0: domain->n_sysdep_strings = 0; domain->orig_sysdep_tab = NULL; domain->trans_sysdep_tab = NULL; break; case 1: default: { nls_uint32 n_sysdep_strings; if (domain->hash_tab == NULL) /* This is invalid. These minor revisions need a hash table. */ goto invalid; n_sysdep_strings = W (domain->must_swap, data->n_sysdep_strings); if (n_sysdep_strings > 0) { nls_uint32 n_sysdep_segments; const struct sysdep_segment *sysdep_segments; const char **sysdep_segment_values; const nls_uint32 *orig_sysdep_tab; const nls_uint32 *trans_sysdep_tab; nls_uint32 n_inmem_sysdep_strings; size_t memneed; char *mem; struct sysdep_string_desc *inmem_orig_sysdep_tab; struct sysdep_string_desc *inmem_trans_sysdep_tab; nls_uint32 *inmem_hash_tab; unsigned int i, j; /* Get the values of the system dependent segments. */ n_sysdep_segments = W (domain->must_swap, data->n_sysdep_segments); sysdep_segments = (const struct sysdep_segment *) ((char *) data + W (domain->must_swap, data->sysdep_segments_offset)); sysdep_segment_values = alloca (n_sysdep_segments * sizeof (const char *)); for (i = 0; i < n_sysdep_segments; i++) { const char *name = (char *) data + W (domain->must_swap, sysdep_segments[i].offset); nls_uint32 namelen = W (domain->must_swap, sysdep_segments[i].length); if (!(namelen > 0 && name[namelen - 1] == '\0')) { freea (sysdep_segment_values); goto invalid; } sysdep_segment_values[i] = get_sysdep_segment_value (name); } orig_sysdep_tab = (const nls_uint32 *) ((char *) data + W (domain->must_swap, data->orig_sysdep_tab_offset)); trans_sysdep_tab = (const nls_uint32 *) ((char *) data + W (domain->must_swap, data->trans_sysdep_tab_offset)); /* Compute the amount of additional memory needed for the system dependent strings and the augmented hash table. At the same time, also drop string pairs which refer to an undefined system dependent segment. */ n_inmem_sysdep_strings = 0; memneed = domain->hash_size * sizeof (nls_uint32); for (i = 0; i < n_sysdep_strings; i++) { int valid = 1; size_t needs[2]; for (j = 0; j < 2; j++) { const struct sysdep_string *sysdep_string = (const struct sysdep_string *) ((char *) data + W (domain->must_swap, j == 0 ? orig_sysdep_tab[i] : trans_sysdep_tab[i])); size_t need = 0; const struct segment_pair *p = sysdep_string->segments; if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END) for (p = sysdep_string->segments;; p++) { nls_uint32 sysdepref; need += W (domain->must_swap, p->segsize); sysdepref = W (domain->must_swap, p->sysdepref); if (sysdepref == SEGMENTS_END) break; if (sysdepref >= n_sysdep_segments) { /* Invalid. */ freea (sysdep_segment_values); goto invalid; } if (sysdep_segment_values[sysdepref] == NULL) { /* This particular string pair is invalid. */ valid = 0; break; } need += strlen (sysdep_segment_values[sysdepref]); } needs[j] = need; if (!valid) break; } if (valid) { n_inmem_sysdep_strings++; memneed += needs[0] + needs[1]; } } memneed += 2 * n_inmem_sysdep_strings * sizeof (struct sysdep_string_desc); if (n_inmem_sysdep_strings > 0) { unsigned int k; /* Allocate additional memory. */ mem = (char *) malloc (memneed); if (mem == NULL) goto invalid; domain->malloced = mem; inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem; mem += n_inmem_sysdep_strings * sizeof (struct sysdep_string_desc); inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem; mem += n_inmem_sysdep_strings * sizeof (struct sysdep_string_desc); inmem_hash_tab = (nls_uint32 *) mem; mem += domain->hash_size * sizeof (nls_uint32); /* Compute the system dependent strings. */ k = 0; for (i = 0; i < n_sysdep_strings; i++) { int valid = 1; for (j = 0; j < 2; j++) { const struct sysdep_string *sysdep_string = (const struct sysdep_string *) ((char *) data + W (domain->must_swap, j == 0 ? orig_sysdep_tab[i] : trans_sysdep_tab[i])); const struct segment_pair *p = sysdep_string->segments; if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END) for (p = sysdep_string->segments;; p++) { nls_uint32 sysdepref; sysdepref = W (domain->must_swap, p->sysdepref); if (sysdepref == SEGMENTS_END) break; if (sysdep_segment_values[sysdepref] == NULL) { /* This particular string pair is invalid. */ valid = 0; break; } } if (!valid) break; } if (valid) { for (j = 0; j < 2; j++) { const struct sysdep_string *sysdep_string = (const struct sysdep_string *) ((char *) data + W (domain->must_swap, j == 0 ? orig_sysdep_tab[i] : trans_sysdep_tab[i])); const char *static_segments = (char *) data + W (domain->must_swap, sysdep_string->offset); const struct segment_pair *p = sysdep_string->segments; /* Concatenate the segments, and fill inmem_orig_sysdep_tab[k] (for j == 0) and inmem_trans_sysdep_tab[k] (for j == 1). */ struct sysdep_string_desc *inmem_tab_entry = (j == 0 ? inmem_orig_sysdep_tab : inmem_trans_sysdep_tab) + k; if (W (domain->must_swap, p->sysdepref) == SEGMENTS_END) { /* Only one static segment. */ inmem_tab_entry->length = W (domain->must_swap, p->segsize); inmem_tab_entry->pointer = static_segments; } else { inmem_tab_entry->pointer = mem; for (p = sysdep_string->segments;; p++) { nls_uint32 segsize = W (domain->must_swap, p->segsize); nls_uint32 sysdepref = W (domain->must_swap, p->sysdepref); size_t n; if (segsize > 0) { memcpy (mem, static_segments, segsize); mem += segsize; static_segments += segsize; } if (sysdepref == SEGMENTS_END) break; n = strlen (sysdep_segment_values[sysdepref]); memcpy (mem, sysdep_segment_values[sysdepref], n); mem += n; } inmem_tab_entry->length = mem - inmem_tab_entry->pointer; } } k++; } } if (k != n_inmem_sysdep_strings) abort (); /* Compute the augmented hash table. */ for (i = 0; i < domain->hash_size; i++) inmem_hash_tab[i] = W (domain->must_swap_hash_tab, domain->hash_tab[i]); for (i = 0; i < n_inmem_sysdep_strings; i++) { const char *msgid = inmem_orig_sysdep_tab[i].pointer; nls_uint32 hash_val = hash_string (msgid); nls_uint32 idx = hash_val % domain->hash_size; nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); for (;;) { if (inmem_hash_tab[idx] == 0) { /* Hash table entry is empty. Use it. */ inmem_hash_tab[idx] = 1 + domain->nstrings + i; break; } if (idx >= domain->hash_size - incr) idx -= domain->hash_size - incr; else idx += incr; } } domain->n_sysdep_strings = n_inmem_sysdep_strings; domain->orig_sysdep_tab = inmem_orig_sysdep_tab; domain->trans_sysdep_tab = inmem_trans_sysdep_tab; domain->hash_tab = inmem_hash_tab; domain->must_swap_hash_tab = 0; } else { domain->n_sysdep_strings = 0; domain->orig_sysdep_tab = NULL; domain->trans_sysdep_tab = NULL; } freea (sysdep_segment_values); } else { domain->n_sysdep_strings = 0; domain->orig_sysdep_tab = NULL; domain->trans_sysdep_tab = NULL; } } break; } break; default: /* This is an invalid revision. */ invalid: /* This is an invalid .mo file. */ if (domain->malloced) free (domain->malloced); #ifdef HAVE_MMAP if (use_mmap) munmap ((caddr_t) data, size); else #endif free (data); free (domain); domain_file->data = NULL; return; } /* Now initialize the character set converter from the character set the file is encoded with (found in the header entry) to the domain's specified character set or the locale's character set. */ nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding); /* Also look for a plural specification. */ EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals); } #ifdef _LIBC void internal_function _nl_unload_domain (struct loaded_domain *domain) { if (domain->plural != &__gettext_germanic_plural) __gettext_free_exp (domain->plural); _nl_free_domain_conv (domain); if (domain->malloced) free (domain->malloced); # ifdef _POSIX_MAPPED_FILES if (domain->use_mmap) munmap ((caddr_t) domain->data, domain->mmap_size); else # endif /* _POSIX_MAPPED_FILES */ free ((void *) domain->data); free (domain); } #endif centerim-4.22.10/intl/loadinfo.h0000644000175000001440000001332611473011430013314 00000000000000/* Copyright (C) 1996-1999, 2000-2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LOADINFO_H #define _LOADINFO_H 1 /* Declarations of locale dependent catalog lookup functions. Implemented in localealias.c Possibly replace a locale name by another. explodename.c Split a locale name into its various fields. l10nflist.c Generate a list of filenames of possible message catalogs. finddomain.c Find and open the relevant message catalogs. The main function _nl_find_domain() in finddomain.c is declared in gettextP.h. */ #ifndef internal_function # define internal_function #endif /* Tell the compiler when a conditional or integer expression is almost always true or almost always false. */ #ifndef HAVE_BUILTIN_EXPECT # define __builtin_expect(expr, val) (expr) #endif /* Separator in PATH like lists of pathnames. */ #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define PATH_SEPARATOR ';' #else /* Unix */ # define PATH_SEPARATOR ':' #endif /* Encoding of locale name parts. */ #define CEN_REVISION 1 #define CEN_SPONSOR 2 #define CEN_SPECIAL 4 #define XPG_NORM_CODESET 8 #define XPG_CODESET 16 #define TERRITORY 32 #define CEN_AUDIENCE 64 #define XPG_MODIFIER 128 #define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) #define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) struct loaded_l10nfile { const char *filename; int decided; const void *data; struct loaded_l10nfile *next; struct loaded_l10nfile *successor[1]; }; /* Normalize codeset name. There is no standard for the codeset names. Normalization allows the user to use any of the common names. The return value is dynamically allocated and has to be freed by the caller. */ extern const char *_nl_normalize_codeset (const char *codeset, size_t name_len); /* Lookup a locale dependent file. *L10NFILE_LIST denotes a pool of lookup results of locale dependent files of the same kind, sorted in decreasing order of ->filename. DIRLIST and DIRLIST_LEN are an argz list of directories in which to look, containing at least one directory (i.e. DIRLIST_LEN > 0). MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER, SPECIAL, SPONSOR, REVISION are the pieces of the locale name, as produced by _nl_explode_name(). FILENAME is the filename suffix. The return value is the lookup result, either found in *L10NFILE_LIST, or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL. If the return value is non-NULL, it is added to *L10NFILE_LIST, and its ->next field denotes the chaining inside *L10NFILE_LIST, and furthermore its ->successor[] field contains a list of other lookup results from which this lookup result inherits. */ extern struct loaded_l10nfile * _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list, const char *dirlist, size_t dirlist_len, int mask, const char *language, const char *territory, const char *codeset, const char *normalized_codeset, const char *modifier, const char *special, const char *sponsor, const char *revision, const char *filename, int do_allocate); /* Lookup the real locale name for a locale alias NAME, or NULL if NAME is not a locale alias (but possibly a real locale name). The return value is statically allocated and must not be freed. */ extern const char *_nl_expand_alias (const char *name); /* Split a locale name NAME into its pieces: language, modifier, territory, codeset, special, sponsor, revision. NAME gets destructively modified: NUL bytes are inserted here and there. *LANGUAGE gets assigned NAME. Each of *MODIFIER, *TERRITORY, *CODESET, *SPECIAL, *SPONSOR, *REVISION gets assigned either a pointer into the old NAME string, or NULL. *NORMALIZED_CODESET gets assigned the expanded *CODESET, if it is different from *CODESET; this one is dynamically allocated and has to be freed by the caller. The return value is a bitmask, where each bit corresponds to one filled-in value: XPG_MODIFIER, CEN_AUDIENCE for *MODIFIER, TERRITORY for *TERRITORY, XPG_CODESET for *CODESET, XPG_NORM_CODESET for *NORMALIZED_CODESET, CEN_SPECIAL for *SPECIAL, CEN_SPONSOR for *SPONSOR, CEN_REVISION for *REVISION. */ extern int _nl_explode_name (char *name, const char **language, const char **modifier, const char **territory, const char **codeset, const char **normalized_codeset, const char **special, const char **sponsor, const char **revision); /* Split a locale name NAME into a leading language part and all the rest. Return a pointer to the first character after the language, i.e. to the first byte of the rest. */ extern char *_nl_find_language (const char *name); #endif /* loadinfo.h */ centerim-4.22.10/intl/plural-exp.c0000644000175000001440000000765511473011430013615 00000000000000/* Expression parsing for plural form selection. Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "plural-exp.h" #if (defined __GNUC__ && !defined __APPLE_CC__) \ || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) /* These structs are the constant expression for the germanic plural form determination. It represents the expression "n != 1". */ static const struct expression plvar = { .nargs = 0, .operation = var, }; static const struct expression plone = { .nargs = 0, .operation = num, .val = { .num = 1 } }; struct expression GERMANIC_PLURAL = { .nargs = 2, .operation = not_equal, .val = { .args = { [0] = (struct expression *) &plvar, [1] = (struct expression *) &plone } } }; # define INIT_GERMANIC_PLURAL() #else /* For compilers without support for ISO C 99 struct/union initializers: Initialization at run-time. */ static struct expression plvar; static struct expression plone; struct expression GERMANIC_PLURAL; static void init_germanic_plural () { if (plone.val.num == 0) { plvar.nargs = 0; plvar.operation = var; plone.nargs = 0; plone.operation = num; plone.val.num = 1; GERMANIC_PLURAL.nargs = 2; GERMANIC_PLURAL.operation = not_equal; GERMANIC_PLURAL.val.args[0] = &plvar; GERMANIC_PLURAL.val.args[1] = &plone; } } # define INIT_GERMANIC_PLURAL() init_germanic_plural () #endif void internal_function EXTRACT_PLURAL_EXPRESSION (const char *nullentry, struct expression **pluralp, unsigned long int *npluralsp) { if (nullentry != NULL) { const char *plural; const char *nplurals; plural = strstr (nullentry, "plural="); nplurals = strstr (nullentry, "nplurals="); if (plural == NULL || nplurals == NULL) goto no_plural; else { char *endp; unsigned long int n; struct parse_args args; /* First get the number. */ nplurals += 9; while (*nplurals != '\0' && isspace ((unsigned char) *nplurals)) ++nplurals; if (!(*nplurals >= '0' && *nplurals <= '9')) goto no_plural; #if defined HAVE_STRTOUL || defined _LIBC n = strtoul (nplurals, &endp, 10); #else for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++) n = n * 10 + (*endp - '0'); #endif if (nplurals == endp) goto no_plural; *npluralsp = n; /* Due to the restrictions bison imposes onto the interface of the scanner function we have to put the input string and the result passed up from the parser into the same structure which address is passed down to the parser. */ plural += 7; args.cp = plural; if (PLURAL_PARSE (&args) != 0) goto no_plural; *pluralp = args.res; } } else { /* By default we are using the Germanic form: singular form only for `one', the plural form otherwise. Yes, this is also what English is using since English is a Germanic language. */ no_plural: INIT_GERMANIC_PLURAL (); *pluralp = &GERMANIC_PLURAL; *npluralsp = 2; } } centerim-4.22.10/intl/dgettext.c0000644000175000001440000000337111473011430013343 00000000000000/* Implementation of the dgettext(3) function. Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DGETTEXT __dgettext # define DCGETTEXT INTUSE(__dcgettext) #else # define DGETTEXT libintl_dgettext # define DCGETTEXT libintl_dcgettext #endif /* Look up MSGID in the DOMAINNAME message catalog of the current LC_MESSAGES locale. */ char * DGETTEXT (const char *domainname, const char *msgid) { return DCGETTEXT (domainname, msgid, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dgettext, dgettext); #endif centerim-4.22.10/intl/printf-parse.c0000644000175000001440000002733711473011430014135 00000000000000/* Formatted output to strings. Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #if WIDE_CHAR_VERSION # include "wprintf-parse.h" #else # include "printf-parse.h" #endif /* Get size_t, NULL. */ #include /* Get intmax_t. */ #if HAVE_STDINT_H_WITH_UINTMAX # include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX # include #endif /* malloc(), realloc(), free(). */ #include /* Checked size_t computations. */ #include "xsize.h" #if WIDE_CHAR_VERSION # define PRINTF_PARSE wprintf_parse # define CHAR_T wchar_t # define DIRECTIVE wchar_t_directive # define DIRECTIVES wchar_t_directives #else # define PRINTF_PARSE printf_parse # define CHAR_T char # define DIRECTIVE char_directive # define DIRECTIVES char_directives #endif #ifdef STATIC STATIC #endif int PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) { const CHAR_T *cp = format; /* pointer into format */ size_t arg_posn = 0; /* number of regular arguments consumed */ size_t d_allocated; /* allocated elements of d->dir */ size_t a_allocated; /* allocated elements of a->arg */ size_t max_width_length = 0; size_t max_precision_length = 0; d->count = 0; d_allocated = 1; d->dir = malloc (d_allocated * sizeof (DIRECTIVE)); if (d->dir == NULL) /* Out of memory. */ return -1; a->count = 0; a_allocated = 0; a->arg = NULL; #define REGISTER_ARG(_index_,_type_) \ { \ size_t n = (_index_); \ if (n >= a_allocated) \ { \ size_t memory_size; \ argument *memory; \ \ a_allocated = xtimes (a_allocated, 2); \ if (a_allocated <= n) \ a_allocated = xsum (n, 1); \ memory_size = xtimes (a_allocated, sizeof (argument)); \ if (size_overflow_p (memory_size)) \ /* Overflow, would lead to out of memory. */ \ goto error; \ memory = (a->arg \ ? realloc (a->arg, memory_size) \ : malloc (memory_size)); \ if (memory == NULL) \ /* Out of memory. */ \ goto error; \ a->arg = memory; \ } \ while (a->count <= n) \ a->arg[a->count++].type = TYPE_NONE; \ if (a->arg[n].type == TYPE_NONE) \ a->arg[n].type = (_type_); \ else if (a->arg[n].type != (_type_)) \ /* Ambiguous type for positional argument. */ \ goto error; \ } while (*cp != '\0') { CHAR_T c = *cp++; if (c == '%') { size_t arg_index = ARG_NONE; DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */ /* Initialize the next directive. */ dp->dir_start = cp - 1; dp->flags = 0; dp->width_start = NULL; dp->width_end = NULL; dp->width_arg_index = ARG_NONE; dp->precision_start = NULL; dp->precision_end = NULL; dp->precision_arg_index = ARG_NONE; dp->arg_index = ARG_NONE; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; arg_index = n - 1; cp = np + 1; } } /* Read the flags. */ for (;;) { if (*cp == '\'') { dp->flags |= FLAG_GROUP; cp++; } else if (*cp == '-') { dp->flags |= FLAG_LEFT; cp++; } else if (*cp == '+') { dp->flags |= FLAG_SHOWSIGN; cp++; } else if (*cp == ' ') { dp->flags |= FLAG_SPACE; cp++; } else if (*cp == '#') { dp->flags |= FLAG_ALT; cp++; } else if (*cp == '0') { dp->flags |= FLAG_ZERO; cp++; } else break; } /* Parse the field width. */ if (*cp == '*') { dp->width_start = cp; cp++; dp->width_end = cp; if (max_width_length < 1) max_width_length = 1; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; dp->width_arg_index = n - 1; cp = np + 1; } } if (dp->width_arg_index == ARG_NONE) { dp->width_arg_index = arg_posn++; if (dp->width_arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->width_arg_index, TYPE_INT); } else if (*cp >= '0' && *cp <= '9') { size_t width_length; dp->width_start = cp; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->width_end = cp; width_length = dp->width_end - dp->width_start; if (max_width_length < width_length) max_width_length = width_length; } /* Parse the precision. */ if (*cp == '.') { cp++; if (*cp == '*') { dp->precision_start = cp - 1; cp++; dp->precision_end = cp; if (max_precision_length < 2) max_precision_length = 2; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; dp->precision_arg_index = n - 1; cp = np + 1; } } if (dp->precision_arg_index == ARG_NONE) { dp->precision_arg_index = arg_posn++; if (dp->precision_arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->precision_arg_index, TYPE_INT); } else { size_t precision_length; dp->precision_start = cp - 1; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->precision_end = cp; precision_length = dp->precision_end - dp->precision_start; if (max_precision_length < precision_length) max_precision_length = precision_length; } } { arg_type type; /* Parse argument type/size specifiers. */ { int flags = 0; for (;;) { if (*cp == 'h') { flags |= (1 << (flags & 1)); cp++; } else if (*cp == 'L') { flags |= 4; cp++; } else if (*cp == 'l') { flags += 8; cp++; } #ifdef HAVE_INTMAX_T else if (*cp == 'j') { if (sizeof (intmax_t) > sizeof (long)) { /* intmax_t = long long */ flags += 16; } else if (sizeof (intmax_t) > sizeof (int)) { /* intmax_t = long */ flags += 8; } cp++; } #endif else if (*cp == 'z' || *cp == 'Z') { /* 'z' is standardized in ISO C 99, but glibc uses 'Z' because the warning facility in gcc-2.95.2 understands only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ if (sizeof (size_t) > sizeof (long)) { /* size_t = long long */ flags += 16; } else if (sizeof (size_t) > sizeof (int)) { /* size_t = long */ flags += 8; } cp++; } else if (*cp == 't') { if (sizeof (ptrdiff_t) > sizeof (long)) { /* ptrdiff_t = long long */ flags += 16; } else if (sizeof (ptrdiff_t) > sizeof (int)) { /* ptrdiff_t = long */ flags += 8; } cp++; } else break; } /* Read the conversion character. */ c = *cp++; switch (c) { case 'd': case 'i': #ifdef HAVE_LONG_LONG if (flags >= 16 || (flags & 4)) type = TYPE_LONGLONGINT; else #endif if (flags >= 8) type = TYPE_LONGINT; else if (flags & 2) type = TYPE_SCHAR; else if (flags & 1) type = TYPE_SHORT; else type = TYPE_INT; break; case 'o': case 'u': case 'x': case 'X': #ifdef HAVE_LONG_LONG if (flags >= 16 || (flags & 4)) type = TYPE_ULONGLONGINT; else #endif if (flags >= 8) type = TYPE_ULONGINT; else if (flags & 2) type = TYPE_UCHAR; else if (flags & 1) type = TYPE_USHORT; else type = TYPE_UINT; break; case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': #ifdef HAVE_LONG_DOUBLE if (flags >= 16 || (flags & 4)) type = TYPE_LONGDOUBLE; else #endif type = TYPE_DOUBLE; break; case 'c': if (flags >= 8) #ifdef HAVE_WINT_T type = TYPE_WIDE_CHAR; #else goto error; #endif else type = TYPE_CHAR; break; #ifdef HAVE_WINT_T case 'C': type = TYPE_WIDE_CHAR; c = 'c'; break; #endif case 's': if (flags >= 8) #ifdef HAVE_WCHAR_T type = TYPE_WIDE_STRING; #else goto error; #endif else type = TYPE_STRING; break; #ifdef HAVE_WCHAR_T case 'S': type = TYPE_WIDE_STRING; c = 's'; break; #endif case 'p': type = TYPE_POINTER; break; case 'n': #ifdef HAVE_LONG_LONG if (flags >= 16 || (flags & 4)) type = TYPE_COUNT_LONGLONGINT_POINTER; else #endif if (flags >= 8) type = TYPE_COUNT_LONGINT_POINTER; else if (flags & 2) type = TYPE_COUNT_SCHAR_POINTER; else if (flags & 1) type = TYPE_COUNT_SHORT_POINTER; else type = TYPE_COUNT_INT_POINTER; break; case '%': type = TYPE_NONE; break; default: /* Unknown conversion character. */ goto error; } } if (type != TYPE_NONE) { dp->arg_index = arg_index; if (dp->arg_index == ARG_NONE) { dp->arg_index = arg_posn++; if (dp->arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->arg_index, type); } dp->conversion = c; dp->dir_end = cp; } d->count++; if (d->count >= d_allocated) { size_t memory_size; DIRECTIVE *memory; d_allocated = xtimes (d_allocated, 2); memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); if (size_overflow_p (memory_size)) /* Overflow, would lead to out of memory. */ goto error; memory = realloc (d->dir, memory_size); if (memory == NULL) /* Out of memory. */ goto error; d->dir = memory; } } } d->dir[d->count].dir_start = cp; d->max_width_length = max_width_length; d->max_precision_length = max_precision_length; return 0; error: if (a->arg) free (a->arg); if (d->dir) free (d->dir); return -1; } #undef DIRECTIVES #undef DIRECTIVE #undef CHAR_T #undef PRINTF_PARSE centerim-4.22.10/intl/os2compat.c0000644000175000001440000000550711473011430013425 00000000000000/* OS/2 compatibility functions. Copyright (C) 2001-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define OS2_AWARE #ifdef HAVE_CONFIG_H #include #endif #include #include #include /* A version of getenv() that works from DLLs */ extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue); char * _nl_getenv (const char *name) { unsigned char *value; if (DosScanEnv (name, &value)) return NULL; else return value; } /* A fixed size buffer. */ char libintl_nl_default_dirname[MAXPATHLEN+1]; char *_nlos2_libdir = NULL; char *_nlos2_localealiaspath = NULL; char *_nlos2_localedir = NULL; static __attribute__((constructor)) void nlos2_initialize () { char *root = getenv ("UNIXROOT"); char *gnulocaledir = getenv ("GNULOCALEDIR"); _nlos2_libdir = gnulocaledir; if (!_nlos2_libdir) { if (root) { size_t sl = strlen (root); _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1); memcpy (_nlos2_libdir, root, sl); memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1); } else _nlos2_libdir = LIBDIR; } _nlos2_localealiaspath = gnulocaledir; if (!_nlos2_localealiaspath) { if (root) { size_t sl = strlen (root); _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1); memcpy (_nlos2_localealiaspath, root, sl); memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1); } else _nlos2_localealiaspath = LOCALE_ALIAS_PATH; } _nlos2_localedir = gnulocaledir; if (!_nlos2_localedir) { if (root) { size_t sl = strlen (root); _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1); memcpy (_nlos2_localedir, root, sl); memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1); } else _nlos2_localedir = LOCALEDIR; } if (strlen (_nlos2_localedir) <= MAXPATHLEN) strcpy (libintl_nl_default_dirname, _nlos2_localedir); } centerim-4.22.10/intl/relocatable.c0000644000175000001440000003147111473011430013772 00000000000000/* Provide relocatable packages. Copyright (C) 2003-2004 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Tell glibc's to provide a prototype for getline(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif /* Specification. */ #include "relocatable.h" #if ENABLE_RELOCATABLE #include #include #include #include #ifdef NO_XMALLOC # define xmalloc malloc #else # include "xalloc.h" #endif #if defined _WIN32 || defined __WIN32__ # define WIN32_LEAN_AND_MEAN # include #endif #if DEPENDS_ON_LIBCHARSET # include #endif #if DEPENDS_ON_LIBICONV && HAVE_ICONV # include #endif #if DEPENDS_ON_LIBINTL && ENABLE_NLS # include #endif /* Faked cheap 'bool'. */ #undef bool #undef false #undef true #define bool int #define false 0 #define true 1 /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. */ #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Win32, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_PATH_WITH_DIR(P) \ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) # define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) # define FILE_SYSTEM_PREFIX_LEN(P) 0 #endif /* Original installation prefix. */ static char *orig_prefix; static size_t orig_prefix_len; /* Current installation prefix. */ static char *curr_prefix; static size_t curr_prefix_len; /* These prefixes do not end in a slash. Anything that will be concatenated to them must start with a slash. */ /* Sets the original and the current installation prefix of this module. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ static void set_this_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) { if (orig_prefix_arg != NULL && curr_prefix_arg != NULL /* Optimization: if orig_prefix and curr_prefix are equal, the relocation is a nop. */ && strcmp (orig_prefix_arg, curr_prefix_arg) != 0) { /* Duplicate the argument strings. */ char *memory; orig_prefix_len = strlen (orig_prefix_arg); curr_prefix_len = strlen (curr_prefix_arg); memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1); #ifdef NO_XMALLOC if (memory != NULL) #endif { memcpy (memory, orig_prefix_arg, orig_prefix_len + 1); orig_prefix = memory; memory += orig_prefix_len + 1; memcpy (memory, curr_prefix_arg, curr_prefix_len + 1); curr_prefix = memory; return; } } orig_prefix = NULL; curr_prefix = NULL; /* Don't worry about wasted memory here - this function is usually only called once. */ } /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ void set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) { set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg); /* Now notify all dependent libraries. */ #if DEPENDS_ON_LIBCHARSET libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif #if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109 libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif #if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif } #if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR) /* Convenience function: Computes the current installation prefix, based on the original installation prefix, the original installation directory of a particular file, and the current pathname of this file. Returns NULL upon failure. */ #ifdef IN_LIBRARY #define compute_curr_prefix local_compute_curr_prefix static #endif const char * compute_curr_prefix (const char *orig_installprefix, const char *orig_installdir, const char *curr_pathname) { const char *curr_installdir; const char *rel_installdir; if (curr_pathname == NULL) return NULL; /* Determine the relative installation directory, relative to the prefix. This is simply the difference between orig_installprefix and orig_installdir. */ if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix)) != 0) /* Shouldn't happen - nothing should be installed outside $(prefix). */ return NULL; rel_installdir = orig_installdir + strlen (orig_installprefix); /* Determine the current installation directory. */ { const char *p_base = curr_pathname + FILE_SYSTEM_PREFIX_LEN (curr_pathname); const char *p = curr_pathname + strlen (curr_pathname); char *q; while (p > p_base) { p--; if (ISSLASH (*p)) break; } q = (char *) xmalloc (p - curr_pathname + 1); #ifdef NO_XMALLOC if (q == NULL) return NULL; #endif memcpy (q, curr_pathname, p - curr_pathname); q[p - curr_pathname] = '\0'; curr_installdir = q; } /* Compute the current installation prefix by removing the trailing rel_installdir from it. */ { const char *rp = rel_installdir + strlen (rel_installdir); const char *cp = curr_installdir + strlen (curr_installdir); const char *cp_base = curr_installdir + FILE_SYSTEM_PREFIX_LEN (curr_installdir); while (rp > rel_installdir && cp > cp_base) { bool same = false; const char *rpi = rp; const char *cpi = cp; while (rpi > rel_installdir && cpi > cp_base) { rpi--; cpi--; if (ISSLASH (*rpi) || ISSLASH (*cpi)) { if (ISSLASH (*rpi) && ISSLASH (*cpi)) same = true; break; } #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Win32, Cygwin, OS/2, DOS - case insignificant filesystem */ if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi) != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi)) break; #else if (*rpi != *cpi) break; #endif } if (!same) break; /* The last pathname component was the same. opi and cpi now point to the slash before it. */ rp = rpi; cp = cpi; } if (rp > rel_installdir) /* Unexpected: The curr_installdir does not end with rel_installdir. */ return NULL; { size_t curr_prefix_len = cp - curr_installdir; char *curr_prefix; curr_prefix = (char *) xmalloc (curr_prefix_len + 1); #ifdef NO_XMALLOC if (curr_prefix == NULL) return NULL; #endif memcpy (curr_prefix, curr_installdir, curr_prefix_len); curr_prefix[curr_prefix_len] = '\0'; return curr_prefix; } } } #endif /* !IN_LIBRARY || PIC */ #if defined PIC && defined INSTALLDIR /* Full pathname of shared library, or NULL. */ static char *shared_library_fullname; #if defined _WIN32 || defined __WIN32__ /* Determine the full pathname of the shared library when it is loaded. */ BOOL WINAPI DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved) { (void) reserved; if (event == DLL_PROCESS_ATTACH) { /* The DLL is being loaded into an application's address range. */ static char location[MAX_PATH]; if (!GetModuleFileName (module_handle, location, sizeof (location))) /* Shouldn't happen. */ return FALSE; if (!IS_PATH_WITH_DIR (location)) /* Shouldn't happen. */ return FALSE; shared_library_fullname = strdup (location); } return TRUE; } #else /* Unix */ static void find_shared_library_fullname () { #if defined __linux__ && __GLIBC__ >= 2 /* Linux has /proc/self/maps. glibc 2 has the getline() function. */ FILE *fp; /* Open the current process' maps file. It describes one VMA per line. */ fp = fopen ("/proc/self/maps", "r"); if (fp) { unsigned long address = (unsigned long) &find_shared_library_fullname; for (;;) { unsigned long start, end; int c; if (fscanf (fp, "%lx-%lx", &start, &end) != 2) break; if (address >= start && address <= end - 1) { /* Found it. Now see if this line contains a filename. */ while (c = getc (fp), c != EOF && c != '\n' && c != '/') continue; if (c == '/') { size_t size; int len; ungetc (c, fp); shared_library_fullname = NULL; size = 0; len = getline (&shared_library_fullname, &size, fp); if (len >= 0) { /* Success: filled shared_library_fullname. */ if (len > 0 && shared_library_fullname[len - 1] == '\n') shared_library_fullname[len - 1] = '\0'; } } break; } while (c = getc (fp), c != EOF && c != '\n') continue; } fclose (fp); } #endif } #endif /* WIN32 / Unix */ /* Return the full pathname of the current shared library. Return NULL if unknown. Guaranteed to work only on Linux and Woe32. */ static char * get_shared_library_fullname () { #if !(defined _WIN32 || defined __WIN32__) static bool tried_find_shared_library_fullname; if (!tried_find_shared_library_fullname) { find_shared_library_fullname (); tried_find_shared_library_fullname = true; } #endif return shared_library_fullname; } #endif /* PIC */ /* Returns the pathname, relocated according to the current installation directory. */ const char * relocate (const char *pathname) { #if defined PIC && defined INSTALLDIR static int initialized; /* Initialization code for a shared library. */ if (!initialized) { /* At this point, orig_prefix and curr_prefix likely have already been set through the main program's set_program_name_and_installdir function. This is sufficient in the case that the library has initially been installed in the same orig_prefix. But we can do better, to also cover the cases that 1. it has been installed in a different prefix before being moved to orig_prefix and (later) to curr_prefix, 2. unlike the program, it has not moved away from orig_prefix. */ const char *orig_installprefix = INSTALLPREFIX; const char *orig_installdir = INSTALLDIR; const char *curr_prefix_better; curr_prefix_better = compute_curr_prefix (orig_installprefix, orig_installdir, get_shared_library_fullname ()); if (curr_prefix_better == NULL) curr_prefix_better = curr_prefix; set_relocation_prefix (orig_installprefix, curr_prefix_better); initialized = 1; } #endif /* Note: It is not necessary to perform case insensitive comparison here, even for DOS-like filesystems, because the pathname argument was typically created from the same Makefile variable as orig_prefix came from. */ if (orig_prefix != NULL && curr_prefix != NULL && strncmp (pathname, orig_prefix, orig_prefix_len) == 0) { if (pathname[orig_prefix_len] == '\0') /* pathname equals orig_prefix. */ return curr_prefix; if (ISSLASH (pathname[orig_prefix_len])) { /* pathname starts with orig_prefix. */ const char *pathname_tail = &pathname[orig_prefix_len]; char *result = (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1); #ifdef NO_XMALLOC if (result != NULL) #endif { memcpy (result, curr_prefix, curr_prefix_len); strcpy (result + curr_prefix_len, pathname_tail); return result; } } } /* Nothing to relocate. */ return pathname; } #endif centerim-4.22.10/intl/explodename.c0000644000175000001440000001064711473011430014020 00000000000000/* Copyright (C) 1995-1998, 2000-2001, 2003 Free Software Foundation, Inc. Contributed by Ulrich Drepper , 1995. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "loadinfo.h" /* On some strange systems still no definition of NULL is found. Sigh! */ #ifndef NULL # if defined __STDC__ && __STDC__ # define NULL ((void *) 0) # else # define NULL 0 # endif #endif /* @@ end of prolog @@ */ char * _nl_find_language (const char *name) { while (name[0] != '\0' && name[0] != '_' && name[0] != '@' && name[0] != '+' && name[0] != ',') ++name; return (char *) name; } int _nl_explode_name (char *name, const char **language, const char **modifier, const char **territory, const char **codeset, const char **normalized_codeset, const char **special, const char **sponsor, const char **revision) { enum { undecided, xpg, cen } syntax; char *cp; int mask; *modifier = NULL; *territory = NULL; *codeset = NULL; *normalized_codeset = NULL; *special = NULL; *sponsor = NULL; *revision = NULL; /* Now we determine the single parts of the locale name. First look for the language. Termination symbols are `_' and `@' if we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ mask = 0; syntax = undecided; *language = cp = name; cp = _nl_find_language (*language); if (*language == cp) /* This does not make sense: language has to be specified. Use this entry as it is without exploding. Perhaps it is an alias. */ cp = strchr (*language, '\0'); else if (cp[0] == '_') { /* Next is the territory. */ cp[0] = '\0'; *territory = ++cp; while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= TERRITORY; if (cp[0] == '.') { /* Next is the codeset. */ syntax = xpg; cp[0] = '\0'; *codeset = ++cp; while (cp[0] != '\0' && cp[0] != '@') ++cp; mask |= XPG_CODESET; if (*codeset != cp && (*codeset)[0] != '\0') { *normalized_codeset = _nl_normalize_codeset (*codeset, cp - *codeset); if (strcmp (*codeset, *normalized_codeset) == 0) free ((char *) *normalized_codeset); else mask |= XPG_NORM_CODESET; } } } if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) { /* Next is the modifier. */ syntax = cp[0] == '@' ? xpg : cen; cp[0] = '\0'; *modifier = ++cp; while (syntax == cen && cp[0] != '\0' && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= XPG_MODIFIER | CEN_AUDIENCE; } if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) { syntax = cen; if (cp[0] == '+') { /* Next is special application (CEN syntax). */ cp[0] = '\0'; *special = ++cp; while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= CEN_SPECIAL; } if (cp[0] == ',') { /* Next is sponsor (CEN syntax). */ cp[0] = '\0'; *sponsor = ++cp; while (cp[0] != '\0' && cp[0] != '_') ++cp; mask |= CEN_SPONSOR; } if (cp[0] == '_') { /* Next is revision (CEN syntax). */ cp[0] = '\0'; *revision = ++cp; mask |= CEN_REVISION; } } /* For CEN syntax values it might be important to have the separator character in the file name, not for XPG syntax. */ if (syntax == xpg) { if (*territory != NULL && (*territory)[0] == '\0') mask &= ~TERRITORY; if (*codeset != NULL && (*codeset)[0] == '\0') mask &= ~XPG_CODESET; if (*modifier != NULL && (*modifier)[0] == '\0') mask &= ~XPG_MODIFIER; } return mask; } centerim-4.22.10/intl/localcharset.c0000644000175000001440000002516511473011430014164 00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Bruno Haible . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include "localcharset.h" #if HAVE_STDDEF_H # include #endif #include #if HAVE_STRING_H # include #else # include #endif #if HAVE_STDLIB_H # include #endif #if defined _WIN32 || defined __WIN32__ # undef WIN32 /* avoid warning on mingw32 */ # define WIN32 #endif #if defined __EMX__ /* Assume EMX program runs on OS/2, even if compiled under DOS. */ # define OS2 #endif #if !defined WIN32 # if HAVE_LANGINFO_CODESET # include # else # if HAVE_SETLOCALE # include # endif # endif #elif defined WIN32 # define WIN32_LEAN_AND_MEAN # include #endif #if defined OS2 # define INCL_DOS # include #endif #if ENABLE_RELOCATABLE # include "relocatable.h" #else # define relocate(pathname) (pathname) #endif #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Win32, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') #endif #ifndef DIRECTORY_SEPARATOR # define DIRECTORY_SEPARATOR '/' #endif #ifndef ISSLASH # define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) #endif #if HAVE_DECL_GETC_UNLOCKED # undef getc # define getc getc_unlocked #endif /* The following static variable is declared 'volatile' to avoid a possible multithread problem in the function get_charset_aliases. If we are running in a threaded environment, and if two threads initialize 'charset_aliases' simultaneously, both will produce the same value, and everything will be ok if the two assignments to 'charset_aliases' are atomic. But I don't know what will happen if the two assignments mix. */ #if __STDC__ != 1 # define volatile /* empty */ #endif /* Pointer to the contents of the charset.alias file, if it has already been read, else NULL. Its format is: ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ static const char * volatile charset_aliases; /* Return a pointer to the contents of the charset.alias file. */ static const char * get_charset_aliases () { const char *cp; cp = charset_aliases; if (cp == NULL) { #if !(defined VMS || defined WIN32) FILE *fp; const char *dir; const char *base = "charset.alias"; char *file_name; /* Make it possible to override the charset.alias location. This is necessary for running the testsuite before "make install". */ dir = getenv ("CHARSETALIASDIR"); if (dir == NULL || dir[0] == '\0') dir = relocate (LIBDIR); /* Concatenate dir and base into freshly allocated file_name. */ { size_t dir_len = strlen (dir); size_t base_len = strlen (base); int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); file_name = (char *) malloc (dir_len + add_slash + base_len + 1); if (file_name != NULL) { memcpy (file_name, dir, dir_len); if (add_slash) file_name[dir_len] = DIRECTORY_SEPARATOR; memcpy (file_name + dir_len + add_slash, base, base_len + 1); } } if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) /* Out of memory or file not found, treat it as empty. */ cp = ""; else { /* Parse the file's contents. */ char *res_ptr = NULL; size_t res_size = 0; for (;;) { int c; char buf1[50+1]; char buf2[50+1]; size_t l1, l2; char *old_res_ptr; c = getc (fp); if (c == EOF) break; if (c == '\n' || c == ' ' || c == '\t') continue; if (c == '#') { /* Skip comment, to end of line. */ do c = getc (fp); while (!(c == EOF || c == '\n')); if (c == EOF) break; continue; } ungetc (c, fp); if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) break; l1 = strlen (buf1); l2 = strlen (buf2); old_res_ptr = res_ptr; if (res_size == 0) { res_size = l1 + 1 + l2 + 1; res_ptr = (char *) malloc (res_size + 1); } else { res_size += l1 + 1 + l2 + 1; res_ptr = (char *) realloc (res_ptr, res_size + 1); } if (res_ptr == NULL) { /* Out of memory. */ res_size = 0; if (old_res_ptr != NULL) free (old_res_ptr); break; } strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); strcpy (res_ptr + res_size - (l2 + 1), buf2); } fclose (fp); if (res_size == 0) cp = ""; else { *(res_ptr + res_size) = '\0'; cp = res_ptr; } } if (file_name != NULL) free (file_name); #else # if defined VMS /* To avoid the troubles of an extra file charset.alias_vms in the sources of many GNU packages, simply inline the aliases here. */ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation "Compaq C Run-Time Library Reference Manual for OpenVMS systems" section 10.7 "Handling Different Character Sets". */ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" "ISO8859-2" "\0" "ISO-8859-2" "\0" "ISO8859-5" "\0" "ISO-8859-5" "\0" "ISO8859-7" "\0" "ISO-8859-7" "\0" "ISO8859-8" "\0" "ISO-8859-8" "\0" "ISO8859-9" "\0" "ISO-8859-9" "\0" /* Japanese */ "eucJP" "\0" "EUC-JP" "\0" "SJIS" "\0" "SHIFT_JIS" "\0" "DECKANJI" "\0" "DEC-KANJI" "\0" "SDECKANJI" "\0" "EUC-JP" "\0" /* Chinese */ "eucTW" "\0" "EUC-TW" "\0" "DECHANYU" "\0" "DEC-HANYU" "\0" "DECHANZI" "\0" "GB2312" "\0" /* Korean */ "DECKOREAN" "\0" "EUC-KR" "\0"; # endif # if defined WIN32 /* To avoid the troubles of installing a separate file in the same directory as the DLL and of retrieving the DLL's directory at runtime, simply inline the aliases here. */ cp = "CP936" "\0" "GBK" "\0" "CP1361" "\0" "JOHAB" "\0" "CP20127" "\0" "ASCII" "\0" "CP20866" "\0" "KOI8-R" "\0" "CP21866" "\0" "KOI8-RU" "\0" "CP28591" "\0" "ISO-8859-1" "\0" "CP28592" "\0" "ISO-8859-2" "\0" "CP28593" "\0" "ISO-8859-3" "\0" "CP28594" "\0" "ISO-8859-4" "\0" "CP28595" "\0" "ISO-8859-5" "\0" "CP28596" "\0" "ISO-8859-6" "\0" "CP28597" "\0" "ISO-8859-7" "\0" "CP28598" "\0" "ISO-8859-8" "\0" "CP28599" "\0" "ISO-8859-9" "\0" "CP28605" "\0" "ISO-8859-15" "\0"; # endif #endif charset_aliases = cp; } return cp; } /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ #ifdef STATIC STATIC #endif const char * locale_charset () { const char *codeset; const char *aliases; #if !(defined WIN32 || defined OS2) # if HAVE_LANGINFO_CODESET /* Most systems support nl_langinfo (CODESET) nowadays. */ codeset = nl_langinfo (CODESET); # else /* On old systems which lack it, use setlocale or getenv. */ const char *locale = NULL; /* But most old systems don't have a complete set of locales. Some (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't use setlocale here; it would return "C" when it doesn't support the locale name the user has set. */ # if HAVE_SETLOCALE && 0 locale = setlocale (LC_CTYPE, NULL); # endif if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } } /* On some old systems, one used to set locale = "iso8859_1". On others, you set it to "language_COUNTRY.charset". In any case, we resolve it through the charset.alias file. */ codeset = locale; # endif #elif defined WIN32 static char buf[2 + 10 + 1]; /* Woe32 has a function returning the locale's codepage as a number. */ sprintf (buf, "CP%u", GetACP ()); codeset = buf; #elif defined OS2 const char *locale; static char buf[2 + 10 + 1]; ULONG cp[3]; ULONG cplen; /* Allow user to override the codeset, as set in the operating system, with standard language environment variables. */ locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } if (locale != NULL && locale[0] != '\0') { /* If the locale name contains an encoding after the dot, return it. */ const char *dot = strchr (locale, '.'); if (dot != NULL) { const char *modifier; dot++; /* Look for the possible @... trailer and remove it, if any. */ modifier = strchr (dot, '@'); if (modifier == NULL) return dot; if (modifier - dot < sizeof (buf)) { memcpy (buf, dot, modifier - dot); buf [modifier - dot] = '\0'; return buf; } } /* Resolve through the charset.alias file. */ codeset = locale; } else { /* OS/2 has a function returning the locale's codepage as a number. */ if (DosQueryCp (sizeof (cp), cp, &cplen)) codeset = ""; else { sprintf (buf, "CP%u", cp[0]); codeset = buf; } } #endif if (codeset == NULL) /* The canonical name cannot be determined. */ codeset = ""; /* Resolve alias. */ for (aliases = get_charset_aliases (); *aliases != '\0'; aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) if (strcmp (codeset, aliases) == 0 || (aliases[0] == '*' && aliases[1] == '\0')) { codeset = aliases + strlen (aliases) + 1; break; } /* Don't return an empty string. GNU libc and GNU libiconv interpret the empty string as denoting "the locale's character encoding", thus GNU libiconv would call this function a second time. */ if (codeset[0] == '\0') codeset = "ASCII"; return codeset; } centerim-4.22.10/intl/osdep.c0000644000175000001440000000164711473011430012631 00000000000000/* OS dependent parts of libintl. Copyright (C) 2001-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #if defined __EMX__ # include "os2compat.c" #else /* Avoid AIX compiler warning. */ typedef int dummy; #endif centerim-4.22.10/intl/eval-plural.h0000644000175000001440000000532611473011430013746 00000000000000/* Plural expression evaluation. Copyright (C) 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef STATIC #define STATIC static #endif /* Evaluate the plural expression and return an index value. */ STATIC unsigned long int internal_function plural_eval (struct expression *pexp, unsigned long int n) { switch (pexp->nargs) { case 0: switch (pexp->operation) { case var: return n; case num: return pexp->val.num; default: break; } /* NOTREACHED */ break; case 1: { /* pexp->operation must be lnot. */ unsigned long int arg = plural_eval (pexp->val.args[0], n); return ! arg; } case 2: { unsigned long int leftarg = plural_eval (pexp->val.args[0], n); if (pexp->operation == lor) return leftarg || plural_eval (pexp->val.args[1], n); else if (pexp->operation == land) return leftarg && plural_eval (pexp->val.args[1], n); else { unsigned long int rightarg = plural_eval (pexp->val.args[1], n); switch (pexp->operation) { case mult: return leftarg * rightarg; case divide: #if !INTDIV0_RAISES_SIGFPE if (rightarg == 0) raise (SIGFPE); #endif return leftarg / rightarg; case module: #if !INTDIV0_RAISES_SIGFPE if (rightarg == 0) raise (SIGFPE); #endif return leftarg % rightarg; case plus: return leftarg + rightarg; case minus: return leftarg - rightarg; case less_than: return leftarg < rightarg; case greater_than: return leftarg > rightarg; case less_or_equal: return leftarg <= rightarg; case greater_or_equal: return leftarg >= rightarg; case equal: return leftarg == rightarg; case not_equal: return leftarg != rightarg; default: break; } } /* NOTREACHED */ break; } case 3: { /* pexp->operation must be qmop. */ unsigned long int boolarg = plural_eval (pexp->val.args[0], n); return plural_eval (pexp->val.args[boolarg ? 1 : 2], n); } } /* NOTREACHED */ return 0; } centerim-4.22.10/intl/ChangeLog0000644000175000001440000000011111473011427013114 000000000000002006-06-21 GNU * Version 0.14.6 released. centerim-4.22.10/intl/plural.y0000644000175000001440000001627511473011430013047 00000000000000%{ /* Expression parsing for plural form selection. Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* The bison generated parser uses alloca. AIX 3 forces us to put this declaration at the beginning of the file. The declaration in bison's skeleton file comes too late. This must come before because may include arbitrary system headers. */ #if defined _AIX && !defined __GNUC__ #pragma alloca #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #include "plural-exp.h" /* The main function generated by the parser is called __gettextparse, but we want it to be called PLURAL_PARSE. */ #ifndef _LIBC # define __gettextparse PLURAL_PARSE #endif #define YYLEX_PARAM &((struct parse_args *) arg)->cp #define YYPARSE_PARAM arg %} %pure_parser %expect 7 %union { unsigned long int num; enum operator op; struct expression *exp; } %{ /* Prototypes for local functions. */ static int yylex (YYSTYPE *lval, const char **pexp); static void yyerror (const char *str); /* Allocation of expressions. */ static struct expression * new_exp (int nargs, enum operator op, struct expression * const *args) { int i; struct expression *newp; /* If any of the argument could not be malloc'ed, just return NULL. */ for (i = nargs - 1; i >= 0; i--) if (args[i] == NULL) goto fail; /* Allocate a new expression. */ newp = (struct expression *) malloc (sizeof (*newp)); if (newp != NULL) { newp->nargs = nargs; newp->operation = op; for (i = nargs - 1; i >= 0; i--) newp->val.args[i] = args[i]; return newp; } fail: for (i = nargs - 1; i >= 0; i--) FREE_EXPRESSION (args[i]); return NULL; } static inline struct expression * new_exp_0 (enum operator op) { return new_exp (0, op, NULL); } static inline struct expression * new_exp_1 (enum operator op, struct expression *right) { struct expression *args[1]; args[0] = right; return new_exp (1, op, args); } static struct expression * new_exp_2 (enum operator op, struct expression *left, struct expression *right) { struct expression *args[2]; args[0] = left; args[1] = right; return new_exp (2, op, args); } static inline struct expression * new_exp_3 (enum operator op, struct expression *bexp, struct expression *tbranch, struct expression *fbranch) { struct expression *args[3]; args[0] = bexp; args[1] = tbranch; args[2] = fbranch; return new_exp (3, op, args); } %} /* This declares that all operators have the same associativity and the precedence order as in C. See [Harbison, Steele: C, A Reference Manual]. There is no unary minus and no bitwise operators. Operators with the same syntactic behaviour have been merged into a single token, to save space in the array generated by bison. */ %right '?' /* ? */ %left '|' /* || */ %left '&' /* && */ %left EQUOP2 /* == != */ %left CMPOP2 /* < > <= >= */ %left ADDOP2 /* + - */ %left MULOP2 /* * / % */ %right '!' /* ! */ %token EQUOP2 CMPOP2 ADDOP2 MULOP2 %token NUMBER %type exp %% start: exp { if ($1 == NULL) YYABORT; ((struct parse_args *) arg)->res = $1; } ; exp: exp '?' exp ':' exp { $$ = new_exp_3 (qmop, $1, $3, $5); } | exp '|' exp { $$ = new_exp_2 (lor, $1, $3); } | exp '&' exp { $$ = new_exp_2 (land, $1, $3); } | exp EQUOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | exp CMPOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | exp ADDOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | exp MULOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | '!' exp { $$ = new_exp_1 (lnot, $2); } | 'n' { $$ = new_exp_0 (var); } | NUMBER { if (($$ = new_exp_0 (num)) != NULL) $$->val.num = $1; } | '(' exp ')' { $$ = $2; } ; %% void internal_function FREE_EXPRESSION (struct expression *exp) { if (exp == NULL) return; /* Handle the recursive case. */ switch (exp->nargs) { case 3: FREE_EXPRESSION (exp->val.args[2]); /* FALLTHROUGH */ case 2: FREE_EXPRESSION (exp->val.args[1]); /* FALLTHROUGH */ case 1: FREE_EXPRESSION (exp->val.args[0]); /* FALLTHROUGH */ default: break; } free (exp); } static int yylex (YYSTYPE *lval, const char **pexp) { const char *exp = *pexp; int result; while (1) { if (exp[0] == '\0') { *pexp = exp; return YYEOF; } if (exp[0] != ' ' && exp[0] != '\t') break; ++exp; } result = *exp++; switch (result) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { unsigned long int n = result - '0'; while (exp[0] >= '0' && exp[0] <= '9') { n *= 10; n += exp[0] - '0'; ++exp; } lval->num = n; result = NUMBER; } break; case '=': if (exp[0] == '=') { ++exp; lval->op = equal; result = EQUOP2; } else result = YYERRCODE; break; case '!': if (exp[0] == '=') { ++exp; lval->op = not_equal; result = EQUOP2; } break; case '&': case '|': if (exp[0] == result) ++exp; else result = YYERRCODE; break; case '<': if (exp[0] == '=') { ++exp; lval->op = less_or_equal; } else lval->op = less_than; result = CMPOP2; break; case '>': if (exp[0] == '=') { ++exp; lval->op = greater_or_equal; } else lval->op = greater_than; result = CMPOP2; break; case '*': lval->op = mult; result = MULOP2; break; case '/': lval->op = divide; result = MULOP2; break; case '%': lval->op = module; result = MULOP2; break; case '+': lval->op = plus; result = ADDOP2; break; case '-': lval->op = minus; result = ADDOP2; break; case 'n': case '?': case ':': case '(': case ')': /* Nothing, just return the character. */ break; case ';': case '\n': case '\0': /* Be safe and let the user call this function again. */ --exp; result = YYEOF; break; default: result = YYERRCODE; #if YYDEBUG != 0 --exp; #endif break; } *pexp = exp; return result; } static void yyerror (const char *str) { /* Do nothing. We don't print error messages here. */ } centerim-4.22.10/intl/ref-del.sin0000644000175000001440000000203011473011430013367 00000000000000# Remove this package from a list of references stored in a text file. # # Copyright (C) 2000 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # # Written by Bruno Haible . # /^# Packages using this file: / { s/# Packages using this file:// s/ @PACKAGE@ / / s/^/# Packages using this file:/ } centerim-4.22.10/intl/printf.c0000644000175000001440000001720311473011430013014 00000000000000/* Formatted output to strings, using POSIX/XSI format strings with positions. Copyright (C) 2003 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # ifdef _MSC_VER # include # define alloca _alloca # else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif # endif #endif #include #if !HAVE_POSIX_PRINTF #include #include /* When building a DLL, we must export some functions. Note that because the functions are only defined for binary backward compatibility, we don't need to use __declspec(dllimport) in any case. */ #if defined _MSC_VER && BUILDING_DLL # define DLL_EXPORTED __declspec(dllexport) #else # define DLL_EXPORTED #endif #define STATIC static /* Define auxiliary functions declared in "printf-args.h". */ #include "printf-args.c" /* Define auxiliary functions declared in "printf-parse.h". */ #include "printf-parse.c" /* Define functions declared in "vasnprintf.h". */ #define vasnprintf libintl_vasnprintf #include "vasnprintf.c" #if 0 /* not needed */ #define asnprintf libintl_asnprintf #include "asnprintf.c" #endif DLL_EXPORTED int libintl_vfprintf (FILE *stream, const char *format, va_list args) { if (strchr (format, '$') == NULL) return vfprintf (stream, format, args); else { size_t length; char *result = libintl_vasnprintf (NULL, &length, format, args); int retval = -1; if (result != NULL) { if (fwrite (result, 1, length, stream) == length) retval = length; free (result); } return retval; } } DLL_EXPORTED int libintl_fprintf (FILE *stream, const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vfprintf (stream, format, args); va_end (args); return retval; } DLL_EXPORTED int libintl_vprintf (const char *format, va_list args) { return libintl_vfprintf (stdout, format, args); } DLL_EXPORTED int libintl_printf (const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vprintf (format, args); va_end (args); return retval; } DLL_EXPORTED int libintl_vsprintf (char *resultbuf, const char *format, va_list args) { if (strchr (format, '$') == NULL) return vsprintf (resultbuf, format, args); else { size_t length = (size_t) ~0 / (4 * sizeof (char)); char *result = libintl_vasnprintf (resultbuf, &length, format, args); if (result != resultbuf) { free (result); return -1; } else return length; } } DLL_EXPORTED int libintl_sprintf (char *resultbuf, const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vsprintf (resultbuf, format, args); va_end (args); return retval; } #if HAVE_SNPRINTF # if HAVE_DECL__SNPRINTF /* Windows. */ # define system_vsnprintf _vsnprintf # else /* Unix. */ # define system_vsnprintf vsnprintf # endif DLL_EXPORTED int libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args) { if (strchr (format, '$') == NULL) return system_vsnprintf (resultbuf, length, format, args); else { size_t maxlength = length; char *result = libintl_vasnprintf (resultbuf, &length, format, args); if (result != resultbuf) { if (maxlength > 0) { if (length < maxlength) abort (); memcpy (resultbuf, result, maxlength - 1); resultbuf[maxlength - 1] = '\0'; } free (result); return -1; } else return length; } } DLL_EXPORTED int libintl_snprintf (char *resultbuf, size_t length, const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vsnprintf (resultbuf, length, format, args); va_end (args); return retval; } #endif #if HAVE_ASPRINTF DLL_EXPORTED int libintl_vasprintf (char **resultp, const char *format, va_list args) { size_t length; char *result = libintl_vasnprintf (NULL, &length, format, args); if (result == NULL) return -1; *resultp = result; return length; } DLL_EXPORTED int libintl_asprintf (char **resultp, const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vasprintf (resultp, format, args); va_end (args); return retval; } #endif #if HAVE_FWPRINTF #include #define WIDE_CHAR_VERSION 1 /* Define auxiliary functions declared in "wprintf-parse.h". */ #include "printf-parse.c" /* Define functions declared in "vasnprintf.h". */ #define vasnwprintf libintl_vasnwprintf #include "vasnprintf.c" #if 0 /* not needed */ #define asnwprintf libintl_asnwprintf #include "asnprintf.c" #endif # if HAVE_DECL__SNWPRINTF /* Windows. */ # define system_vswprintf _vsnwprintf # else /* Unix. */ # define system_vswprintf vswprintf # endif DLL_EXPORTED int libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args) { if (wcschr (format, '$') == NULL) return vfwprintf (stream, format, args); else { size_t length; wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args); int retval = -1; if (result != NULL) { size_t i; for (i = 0; i < length; i++) if (fputwc (result[i], stream) == WEOF) break; if (i == length) retval = length; free (result); } return retval; } } DLL_EXPORTED int libintl_fwprintf (FILE *stream, const wchar_t *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vfwprintf (stream, format, args); va_end (args); return retval; } DLL_EXPORTED int libintl_vwprintf (const wchar_t *format, va_list args) { return libintl_vfwprintf (stdout, format, args); } DLL_EXPORTED int libintl_wprintf (const wchar_t *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vwprintf (format, args); va_end (args); return retval; } DLL_EXPORTED int libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args) { if (wcschr (format, '$') == NULL) return system_vswprintf (resultbuf, length, format, args); else { size_t maxlength = length; wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args); if (result != resultbuf) { if (maxlength > 0) { if (length < maxlength) abort (); memcpy (resultbuf, result, (maxlength - 1) * sizeof (wchar_t)); resultbuf[maxlength - 1] = 0; } free (result); return -1; } else return length; } } DLL_EXPORTED int libintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vswprintf (resultbuf, length, format, args); va_end (args); return retval; } #endif #endif centerim-4.22.10/intl/xsize.h0000644000175000001440000000672611473011430012671 00000000000000/* xsize.h -- Checked size_t computations. Copyright (C) 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _XSIZE_H #define _XSIZE_H /* Get size_t. */ #include /* Get SIZE_MAX. */ #include #if HAVE_STDINT_H # include #endif /* The size of memory objects is often computed through expressions of type size_t. Example: void* p = malloc (header_size + n * element_size). These computations can lead to overflow. When this happens, malloc() returns a piece of memory that is way too small, and the program then crashes while attempting to fill the memory. To avoid this, the functions and macros in this file check for overflow. The convention is that SIZE_MAX represents overflow. malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc implementation that uses mmap --, it's recommended to use size_overflow_p() or size_in_bounds_p() before invoking malloc(). The example thus becomes: size_t size = xsum (header_size, xtimes (n, element_size)); void *p = (size_in_bounds_p (size) ? malloc (size) : NULL); */ /* Convert an arbitrary value >= 0 to type size_t. */ #define xcast_size_t(N) \ ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX) /* Sum of two sizes, with overflow check. */ static inline size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xsum (size_t size1, size_t size2) { size_t sum = size1 + size2; return (sum >= size1 ? sum : SIZE_MAX); } /* Sum of three sizes, with overflow check. */ static inline size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xsum3 (size_t size1, size_t size2, size_t size3) { return xsum (xsum (size1, size2), size3); } /* Sum of four sizes, with overflow check. */ static inline size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xsum4 (size_t size1, size_t size2, size_t size3, size_t size4) { return xsum (xsum (xsum (size1, size2), size3), size4); } /* Maximum of two sizes, with overflow check. */ static inline size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xmax (size_t size1, size_t size2) { /* No explicit check is needed here, because for any n: max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */ return (size1 >= size2 ? size1 : size2); } /* Multiplication of a count with an element size, with overflow check. The count must be >= 0 and the element size must be > 0. This is a macro, not an inline function, so that it works correctly even when N is of a wider tupe and N > SIZE_MAX. */ #define xtimes(N, ELSIZE) \ ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) /* Check for overflow. */ #define size_overflow_p(SIZE) \ ((SIZE) == SIZE_MAX) /* Check against overflow. */ #define size_in_bounds_p(SIZE) \ ((SIZE) != SIZE_MAX) #endif /* _XSIZE_H */ centerim-4.22.10/intl/vasnprintf.h0000644000175000001440000000544311473011430013714 00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 2002-2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _VASNPRINTF_H #define _VASNPRINTF_H /* Get va_list. */ #include /* Get size_t. */ #include #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ # define __attribute__(Spec) /* empty */ # endif /* The __-protected variants of `format' and `printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) # define __format__ format # define __printf__ printf # endif #endif #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(). You can pass a preallocated buffer for the result in RESULTBUF and its size in *LENGTHP; otherwise you pass RESULTBUF = NULL. If successful, return the address of the string (this may be = RESULTBUF if no dynamic memory allocation was necessary) and set *LENGTHP to the number of resulting bytes, excluding the trailing NUL. Upon error, set errno and return NULL. When dynamic memory allocation occurs, the preallocated buffer is left alone (with possibly modified contents). This makes it possible to use a statically allocated or stack-allocated buffer, like this: char buf[100]; size_t len = sizeof (buf); char *output = vasnprintf (buf, &len, format, args); if (output == NULL) ... error handling ...; else { ... use the output string ...; if (output != buf) free (output); } */ extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) __attribute__ ((__format__ (__printf__, 3, 0))); #ifdef __cplusplus } #endif #endif /* _VASNPRINTF_H */ centerim-4.22.10/intl/ref-add.sin0000644000175000001440000000210511473011430013356 00000000000000# Add this package to a list of references stored in a text file. # # Copyright (C) 2000 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # # Written by Bruno Haible . # /^# Packages using this file: / { s/# Packages using this file:// ta :a s/ @PACKAGE@ / @PACKAGE@ / tb s/ $/ @PACKAGE@ / :b s/^/# Packages using this file:/ } centerim-4.22.10/intl/locale.alias0000644000175000001440000000512611473011430013621 00000000000000# Locale name alias data base. # Copyright (C) 1996-2001,2003 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. # The format of this file is the same as for the corresponding file of # the X Window System, which normally can be found in # /usr/lib/X11/locale/locale.alias # A single line contains two fields: an alias and a substitution value. # All entries are case independent. # Note: This file is far from being complete. If you have a value for # your own site which you think might be useful for others too, share # it with the rest of us. Send it using the `glibcbug' script to # bugs@gnu.org. # Packages using this file: bokmal nb_NO.ISO-8859-1 bokmål nb_NO.ISO-8859-1 catalan ca_ES.ISO-8859-1 croatian hr_HR.ISO-8859-2 czech cs_CZ.ISO-8859-2 danish da_DK.ISO-8859-1 dansk da_DK.ISO-8859-1 deutsch de_DE.ISO-8859-1 dutch nl_NL.ISO-8859-1 eesti et_EE.ISO-8859-1 estonian et_EE.ISO-8859-1 finnish fi_FI.ISO-8859-1 français fr_FR.ISO-8859-1 french fr_FR.ISO-8859-1 galego gl_ES.ISO-8859-1 galician gl_ES.ISO-8859-1 german de_DE.ISO-8859-1 greek el_GR.ISO-8859-7 hebrew he_IL.ISO-8859-8 hrvatski hr_HR.ISO-8859-2 hungarian hu_HU.ISO-8859-2 icelandic is_IS.ISO-8859-1 italian it_IT.ISO-8859-1 japanese ja_JP.eucJP japanese.euc ja_JP.eucJP ja_JP ja_JP.eucJP ja_JP.ujis ja_JP.eucJP japanese.sjis ja_JP.SJIS korean ko_KR.eucKR korean.euc ko_KR.eucKR ko_KR ko_KR.eucKR lithuanian lt_LT.ISO-8859-13 no_NO nb_NO.ISO-8859-1 no_NO.ISO-8859-1 nb_NO.ISO-8859-1 norwegian nb_NO.ISO-8859-1 nynorsk nn_NO.ISO-8859-1 polish pl_PL.ISO-8859-2 portuguese pt_PT.ISO-8859-1 romanian ro_RO.ISO-8859-2 russian ru_RU.ISO-8859-5 slovak sk_SK.ISO-8859-2 slovene sl_SI.ISO-8859-2 slovenian sl_SI.ISO-8859-2 spanish es_ES.ISO-8859-1 swedish sv_SE.ISO-8859-1 thai th_TH.TIS-620 turkish tr_TR.ISO-8859-9 centerim-4.22.10/intl/hash-string.h0000644000175000001440000000314511473011430013746 00000000000000/* Description of GNU message catalog format: string hashing function. Copyright (C) 1995, 1997-1998, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* @@ end of prolog @@ */ /* We assume to have `unsigned long int' value with at least 32 bits. */ #define HASHWORDBITS 32 /* Defines the so called `hashpjw' function by P.J. Weinberger [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, 1986, 1987 Bell Telephone Laboratories, Inc.] */ static inline unsigned long int hash_string (const char *str_param) { unsigned long int hval, g; const char *str = str_param; /* Compute the hash value for the given string. */ hval = 0; while (*str != '\0') { hval <<= 4; hval += (unsigned char) *str++; g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4)); if (g != 0) { hval ^= g >> (HASHWORDBITS - 8); hval ^= g; } } return hval; } centerim-4.22.10/intl/dcngettext.c0000644000175000001440000000347411473011430013670 00000000000000/* Implementation of the dcngettext(3) function. Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCNGETTEXT __dcngettext # define DCIGETTEXT __dcigettext #else # define DCNGETTEXT libintl_dcngettext # define DCIGETTEXT libintl_dcigettext #endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ char * DCNGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n, int category) { return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dcngettext, dcngettext); #endif centerim-4.22.10/intl/printf-parse.h0000644000175000001440000000421311473011430014126 00000000000000/* Parse printf format string. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _PRINTF_PARSE_H #define _PRINTF_PARSE_H #include "printf-args.h" /* Flags */ #define FLAG_GROUP 1 /* ' flag */ #define FLAG_LEFT 2 /* - flag */ #define FLAG_SHOWSIGN 4 /* + flag */ #define FLAG_SPACE 8 /* space flag */ #define FLAG_ALT 16 /* # flag */ #define FLAG_ZERO 32 /* arg_index value indicating that no argument is consumed. */ #define ARG_NONE (~(size_t)0) /* A parsed directive. */ typedef struct { const char* dir_start; const char* dir_end; int flags; const char* width_start; const char* width_end; size_t width_arg_index; const char* precision_start; const char* precision_end; size_t precision_arg_index; char conversion; /* d i o u x X f e E g G c s p n U % but not C S */ size_t arg_index; } char_directive; /* A parsed format string. */ typedef struct { size_t count; char_directive *dir; size_t max_width_length; size_t max_precision_length; } char_directives; /* Parses the format string. Fills in the number N of directives, and fills in directives[0], ..., directives[N-1], and sets directives[N].dir_start to the end of the format string. Also fills in the arg_type fields of the arguments and the needed count of arguments. */ #ifdef STATIC STATIC #else extern #endif int printf_parse (const char *format, char_directives *d, arguments *a); #endif /* _PRINTF_PARSE_H */ centerim-4.22.10/intl/localename.c0000644000175000001440000012430011473011430013607 00000000000000/* Determine the current selected locale. Copyright (C) 1995-1999, 2000-2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Ulrich Drepper , 1995. */ /* Win32 code written by Tor Lillqvist . */ /* MacOS X code written by Bruno Haible . */ #ifdef HAVE_CONFIG_H # include #endif #include #include #if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE # include # include # if HAVE_CFLOCALECOPYCURRENT # include # elif HAVE_CFPREFERENCESCOPYAPPVALUE # include # endif #endif #if defined _WIN32 || defined __WIN32__ # undef WIN32 /* avoid warning on mingw32 */ # define WIN32 #endif #ifdef WIN32 # define WIN32_LEAN_AND_MEAN # include /* List of language codes, sorted by value: 0x01 LANG_ARABIC 0x02 LANG_BULGARIAN 0x03 LANG_CATALAN 0x04 LANG_CHINESE 0x05 LANG_CZECH 0x06 LANG_DANISH 0x07 LANG_GERMAN 0x08 LANG_GREEK 0x09 LANG_ENGLISH 0x0a LANG_SPANISH 0x0b LANG_FINNISH 0x0c LANG_FRENCH 0x0d LANG_HEBREW 0x0e LANG_HUNGARIAN 0x0f LANG_ICELANDIC 0x10 LANG_ITALIAN 0x11 LANG_JAPANESE 0x12 LANG_KOREAN 0x13 LANG_DUTCH 0x14 LANG_NORWEGIAN 0x15 LANG_POLISH 0x16 LANG_PORTUGUESE 0x17 LANG_RHAETO_ROMANCE 0x18 LANG_ROMANIAN 0x19 LANG_RUSSIAN 0x1a LANG_CROATIAN == LANG_SERBIAN 0x1b LANG_SLOVAK 0x1c LANG_ALBANIAN 0x1d LANG_SWEDISH 0x1e LANG_THAI 0x1f LANG_TURKISH 0x20 LANG_URDU 0x21 LANG_INDONESIAN 0x22 LANG_UKRAINIAN 0x23 LANG_BELARUSIAN 0x24 LANG_SLOVENIAN 0x25 LANG_ESTONIAN 0x26 LANG_LATVIAN 0x27 LANG_LITHUANIAN 0x28 LANG_TAJIK 0x29 LANG_FARSI 0x2a LANG_VIETNAMESE 0x2b LANG_ARMENIAN 0x2c LANG_AZERI 0x2d LANG_BASQUE 0x2e LANG_SORBIAN 0x2f LANG_MACEDONIAN 0x30 LANG_SUTU 0x31 LANG_TSONGA 0x32 LANG_TSWANA 0x33 LANG_VENDA 0x34 LANG_XHOSA 0x35 LANG_ZULU 0x36 LANG_AFRIKAANS 0x37 LANG_GEORGIAN 0x38 LANG_FAEROESE 0x39 LANG_HINDI 0x3a LANG_MALTESE 0x3b LANG_SAAMI 0x3c LANG_GAELIC 0x3d LANG_YIDDISH 0x3e LANG_MALAY 0x3f LANG_KAZAK 0x40 LANG_KYRGYZ 0x41 LANG_SWAHILI 0x42 LANG_TURKMEN 0x43 LANG_UZBEK 0x44 LANG_TATAR 0x45 LANG_BENGALI 0x46 LANG_PUNJABI 0x47 LANG_GUJARATI 0x48 LANG_ORIYA 0x49 LANG_TAMIL 0x4a LANG_TELUGU 0x4b LANG_KANNADA 0x4c LANG_MALAYALAM 0x4d LANG_ASSAMESE 0x4e LANG_MARATHI 0x4f LANG_SANSKRIT 0x50 LANG_MONGOLIAN 0x51 LANG_TIBETAN 0x52 LANG_WELSH 0x53 LANG_CAMBODIAN 0x54 LANG_LAO 0x55 LANG_BURMESE 0x56 LANG_GALICIAN 0x57 LANG_KONKANI 0x58 LANG_MANIPURI 0x59 LANG_SINDHI 0x5a LANG_SYRIAC 0x5b LANG_SINHALESE 0x5c LANG_CHEROKEE 0x5d LANG_INUKTITUT 0x5e LANG_AMHARIC 0x5f LANG_TAMAZIGHT 0x60 LANG_KASHMIRI 0x61 LANG_NEPALI 0x62 LANG_FRISIAN 0x63 LANG_PASHTO 0x64 LANG_TAGALOG 0x65 LANG_DIVEHI 0x66 LANG_EDO 0x67 LANG_FULFULDE 0x68 LANG_HAUSA 0x69 LANG_IBIBIO 0x6a LANG_YORUBA 0x70 LANG_IGBO 0x71 LANG_KANURI 0x72 LANG_OROMO 0x73 LANG_TIGRINYA 0x74 LANG_GUARANI 0x75 LANG_HAWAIIAN 0x76 LANG_LATIN 0x77 LANG_SOMALI 0x78 LANG_YI 0x79 LANG_PAPIAMENTU */ /* Mingw headers don't have latest language and sublanguage codes. */ # ifndef LANG_AFRIKAANS # define LANG_AFRIKAANS 0x36 # endif # ifndef LANG_ALBANIAN # define LANG_ALBANIAN 0x1c # endif # ifndef LANG_AMHARIC # define LANG_AMHARIC 0x5e # endif # ifndef LANG_ARABIC # define LANG_ARABIC 0x01 # endif # ifndef LANG_ARMENIAN # define LANG_ARMENIAN 0x2b # endif # ifndef LANG_ASSAMESE # define LANG_ASSAMESE 0x4d # endif # ifndef LANG_AZERI # define LANG_AZERI 0x2c # endif # ifndef LANG_BASQUE # define LANG_BASQUE 0x2d # endif # ifndef LANG_BELARUSIAN # define LANG_BELARUSIAN 0x23 # endif # ifndef LANG_BENGALI # define LANG_BENGALI 0x45 # endif # ifndef LANG_BURMESE # define LANG_BURMESE 0x55 # endif # ifndef LANG_CAMBODIAN # define LANG_CAMBODIAN 0x53 # endif # ifndef LANG_CATALAN # define LANG_CATALAN 0x03 # endif # ifndef LANG_CHEROKEE # define LANG_CHEROKEE 0x5c # endif # ifndef LANG_DIVEHI # define LANG_DIVEHI 0x65 # endif # ifndef LANG_EDO # define LANG_EDO 0x66 # endif # ifndef LANG_ESTONIAN # define LANG_ESTONIAN 0x25 # endif # ifndef LANG_FAEROESE # define LANG_FAEROESE 0x38 # endif # ifndef LANG_FARSI # define LANG_FARSI 0x29 # endif # ifndef LANG_FRISIAN # define LANG_FRISIAN 0x62 # endif # ifndef LANG_FULFULDE # define LANG_FULFULDE 0x67 # endif # ifndef LANG_GAELIC # define LANG_GAELIC 0x3c # endif # ifndef LANG_GALICIAN # define LANG_GALICIAN 0x56 # endif # ifndef LANG_GEORGIAN # define LANG_GEORGIAN 0x37 # endif # ifndef LANG_GUARANI # define LANG_GUARANI 0x74 # endif # ifndef LANG_GUJARATI # define LANG_GUJARATI 0x47 # endif # ifndef LANG_HAUSA # define LANG_HAUSA 0x68 # endif # ifndef LANG_HAWAIIAN # define LANG_HAWAIIAN 0x75 # endif # ifndef LANG_HEBREW # define LANG_HEBREW 0x0d # endif # ifndef LANG_HINDI # define LANG_HINDI 0x39 # endif # ifndef LANG_IBIBIO # define LANG_IBIBIO 0x69 # endif # ifndef LANG_IGBO # define LANG_IGBO 0x70 # endif # ifndef LANG_INDONESIAN # define LANG_INDONESIAN 0x21 # endif # ifndef LANG_INUKTITUT # define LANG_INUKTITUT 0x5d # endif # ifndef LANG_KANNADA # define LANG_KANNADA 0x4b # endif # ifndef LANG_KANURI # define LANG_KANURI 0x71 # endif # ifndef LANG_KASHMIRI # define LANG_KASHMIRI 0x60 # endif # ifndef LANG_KAZAK # define LANG_KAZAK 0x3f # endif # ifndef LANG_KONKANI # define LANG_KONKANI 0x57 # endif # ifndef LANG_KYRGYZ # define LANG_KYRGYZ 0x40 # endif # ifndef LANG_LAO # define LANG_LAO 0x54 # endif # ifndef LANG_LATIN # define LANG_LATIN 0x76 # endif # ifndef LANG_LATVIAN # define LANG_LATVIAN 0x26 # endif # ifndef LANG_LITHUANIAN # define LANG_LITHUANIAN 0x27 # endif # ifndef LANG_MACEDONIAN # define LANG_MACEDONIAN 0x2f # endif # ifndef LANG_MALAY # define LANG_MALAY 0x3e # endif # ifndef LANG_MALAYALAM # define LANG_MALAYALAM 0x4c # endif # ifndef LANG_MALTESE # define LANG_MALTESE 0x3a # endif # ifndef LANG_MANIPURI # define LANG_MANIPURI 0x58 # endif # ifndef LANG_MARATHI # define LANG_MARATHI 0x4e # endif # ifndef LANG_MONGOLIAN # define LANG_MONGOLIAN 0x50 # endif # ifndef LANG_NEPALI # define LANG_NEPALI 0x61 # endif # ifndef LANG_ORIYA # define LANG_ORIYA 0x48 # endif # ifndef LANG_OROMO # define LANG_OROMO 0x72 # endif # ifndef LANG_PAPIAMENTU # define LANG_PAPIAMENTU 0x79 # endif # ifndef LANG_PASHTO # define LANG_PASHTO 0x63 # endif # ifndef LANG_PUNJABI # define LANG_PUNJABI 0x46 # endif # ifndef LANG_RHAETO_ROMANCE # define LANG_RHAETO_ROMANCE 0x17 # endif # ifndef LANG_SAAMI # define LANG_SAAMI 0x3b # endif # ifndef LANG_SANSKRIT # define LANG_SANSKRIT 0x4f # endif # ifndef LANG_SERBIAN # define LANG_SERBIAN 0x1a # endif # ifndef LANG_SINDHI # define LANG_SINDHI 0x59 # endif # ifndef LANG_SINHALESE # define LANG_SINHALESE 0x5b # endif # ifndef LANG_SLOVAK # define LANG_SLOVAK 0x1b # endif # ifndef LANG_SOMALI # define LANG_SOMALI 0x77 # endif # ifndef LANG_SORBIAN # define LANG_SORBIAN 0x2e # endif # ifndef LANG_SUTU # define LANG_SUTU 0x30 # endif # ifndef LANG_SWAHILI # define LANG_SWAHILI 0x41 # endif # ifndef LANG_SYRIAC # define LANG_SYRIAC 0x5a # endif # ifndef LANG_TAGALOG # define LANG_TAGALOG 0x64 # endif # ifndef LANG_TAJIK # define LANG_TAJIK 0x28 # endif # ifndef LANG_TAMAZIGHT # define LANG_TAMAZIGHT 0x5f # endif # ifndef LANG_TAMIL # define LANG_TAMIL 0x49 # endif # ifndef LANG_TATAR # define LANG_TATAR 0x44 # endif # ifndef LANG_TELUGU # define LANG_TELUGU 0x4a # endif # ifndef LANG_THAI # define LANG_THAI 0x1e # endif # ifndef LANG_TIBETAN # define LANG_TIBETAN 0x51 # endif # ifndef LANG_TIGRINYA # define LANG_TIGRINYA 0x73 # endif # ifndef LANG_TSONGA # define LANG_TSONGA 0x31 # endif # ifndef LANG_TSWANA # define LANG_TSWANA 0x32 # endif # ifndef LANG_TURKMEN # define LANG_TURKMEN 0x42 # endif # ifndef LANG_UKRAINIAN # define LANG_UKRAINIAN 0x22 # endif # ifndef LANG_URDU # define LANG_URDU 0x20 # endif # ifndef LANG_UZBEK # define LANG_UZBEK 0x43 # endif # ifndef LANG_VENDA # define LANG_VENDA 0x33 # endif # ifndef LANG_VIETNAMESE # define LANG_VIETNAMESE 0x2a # endif # ifndef LANG_WELSH # define LANG_WELSH 0x52 # endif # ifndef LANG_XHOSA # define LANG_XHOSA 0x34 # endif # ifndef LANG_YI # define LANG_YI 0x78 # endif # ifndef LANG_YIDDISH # define LANG_YIDDISH 0x3d # endif # ifndef LANG_YORUBA # define LANG_YORUBA 0x6a # endif # ifndef LANG_ZULU # define LANG_ZULU 0x35 # endif # ifndef SUBLANG_ARABIC_SAUDI_ARABIA # define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 # endif # ifndef SUBLANG_ARABIC_IRAQ # define SUBLANG_ARABIC_IRAQ 0x02 # endif # ifndef SUBLANG_ARABIC_EGYPT # define SUBLANG_ARABIC_EGYPT 0x03 # endif # ifndef SUBLANG_ARABIC_LIBYA # define SUBLANG_ARABIC_LIBYA 0x04 # endif # ifndef SUBLANG_ARABIC_ALGERIA # define SUBLANG_ARABIC_ALGERIA 0x05 # endif # ifndef SUBLANG_ARABIC_MOROCCO # define SUBLANG_ARABIC_MOROCCO 0x06 # endif # ifndef SUBLANG_ARABIC_TUNISIA # define SUBLANG_ARABIC_TUNISIA 0x07 # endif # ifndef SUBLANG_ARABIC_OMAN # define SUBLANG_ARABIC_OMAN 0x08 # endif # ifndef SUBLANG_ARABIC_YEMEN # define SUBLANG_ARABIC_YEMEN 0x09 # endif # ifndef SUBLANG_ARABIC_SYRIA # define SUBLANG_ARABIC_SYRIA 0x0a # endif # ifndef SUBLANG_ARABIC_JORDAN # define SUBLANG_ARABIC_JORDAN 0x0b # endif # ifndef SUBLANG_ARABIC_LEBANON # define SUBLANG_ARABIC_LEBANON 0x0c # endif # ifndef SUBLANG_ARABIC_KUWAIT # define SUBLANG_ARABIC_KUWAIT 0x0d # endif # ifndef SUBLANG_ARABIC_UAE # define SUBLANG_ARABIC_UAE 0x0e # endif # ifndef SUBLANG_ARABIC_BAHRAIN # define SUBLANG_ARABIC_BAHRAIN 0x0f # endif # ifndef SUBLANG_ARABIC_QATAR # define SUBLANG_ARABIC_QATAR 0x10 # endif # ifndef SUBLANG_AZERI_LATIN # define SUBLANG_AZERI_LATIN 0x01 # endif # ifndef SUBLANG_AZERI_CYRILLIC # define SUBLANG_AZERI_CYRILLIC 0x02 # endif # ifndef SUBLANG_BENGALI_INDIA # define SUBLANG_BENGALI_INDIA 0x00 # endif # ifndef SUBLANG_BENGALI_BANGLADESH # define SUBLANG_BENGALI_BANGLADESH 0x01 # endif # ifndef SUBLANG_CHINESE_MACAU # define SUBLANG_CHINESE_MACAU 0x05 # endif # ifndef SUBLANG_ENGLISH_SOUTH_AFRICA # define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 # endif # ifndef SUBLANG_ENGLISH_JAMAICA # define SUBLANG_ENGLISH_JAMAICA 0x08 # endif # ifndef SUBLANG_ENGLISH_CARIBBEAN # define SUBLANG_ENGLISH_CARIBBEAN 0x09 # endif # ifndef SUBLANG_ENGLISH_BELIZE # define SUBLANG_ENGLISH_BELIZE 0x0a # endif # ifndef SUBLANG_ENGLISH_TRINIDAD # define SUBLANG_ENGLISH_TRINIDAD 0x0b # endif # ifndef SUBLANG_ENGLISH_ZIMBABWE # define SUBLANG_ENGLISH_ZIMBABWE 0x0c # endif # ifndef SUBLANG_ENGLISH_PHILIPPINES # define SUBLANG_ENGLISH_PHILIPPINES 0x0d # endif # ifndef SUBLANG_ENGLISH_INDONESIA # define SUBLANG_ENGLISH_INDONESIA 0x0e # endif # ifndef SUBLANG_ENGLISH_HONGKONG # define SUBLANG_ENGLISH_HONGKONG 0x0f # endif # ifndef SUBLANG_ENGLISH_INDIA # define SUBLANG_ENGLISH_INDIA 0x10 # endif # ifndef SUBLANG_ENGLISH_MALAYSIA # define SUBLANG_ENGLISH_MALAYSIA 0x11 # endif # ifndef SUBLANG_ENGLISH_SINGAPORE # define SUBLANG_ENGLISH_SINGAPORE 0x12 # endif # ifndef SUBLANG_FRENCH_LUXEMBOURG # define SUBLANG_FRENCH_LUXEMBOURG 0x05 # endif # ifndef SUBLANG_FRENCH_MONACO # define SUBLANG_FRENCH_MONACO 0x06 # endif # ifndef SUBLANG_FRENCH_WESTINDIES # define SUBLANG_FRENCH_WESTINDIES 0x07 # endif # ifndef SUBLANG_FRENCH_REUNION # define SUBLANG_FRENCH_REUNION 0x08 # endif # ifndef SUBLANG_FRENCH_CONGO # define SUBLANG_FRENCH_CONGO 0x09 # endif # ifndef SUBLANG_FRENCH_SENEGAL # define SUBLANG_FRENCH_SENEGAL 0x0a # endif # ifndef SUBLANG_FRENCH_CAMEROON # define SUBLANG_FRENCH_CAMEROON 0x0b # endif # ifndef SUBLANG_FRENCH_COTEDIVOIRE # define SUBLANG_FRENCH_COTEDIVOIRE 0x0c # endif # ifndef SUBLANG_FRENCH_MALI # define SUBLANG_FRENCH_MALI 0x0d # endif # ifndef SUBLANG_FRENCH_MOROCCO # define SUBLANG_FRENCH_MOROCCO 0x0e # endif # ifndef SUBLANG_FRENCH_HAITI # define SUBLANG_FRENCH_HAITI 0x0f # endif # ifndef SUBLANG_GERMAN_LUXEMBOURG # define SUBLANG_GERMAN_LUXEMBOURG 0x04 # endif # ifndef SUBLANG_GERMAN_LIECHTENSTEIN # define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 # endif # ifndef SUBLANG_KASHMIRI_INDIA # define SUBLANG_KASHMIRI_INDIA 0x02 # endif # ifndef SUBLANG_MALAY_MALAYSIA # define SUBLANG_MALAY_MALAYSIA 0x01 # endif # ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM # define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 # endif # ifndef SUBLANG_NEPALI_INDIA # define SUBLANG_NEPALI_INDIA 0x02 # endif # ifndef SUBLANG_PUNJABI_INDIA # define SUBLANG_PUNJABI_INDIA 0x00 # endif # ifndef SUBLANG_PUNJABI_PAKISTAN # define SUBLANG_PUNJABI_PAKISTAN 0x01 # endif # ifndef SUBLANG_ROMANIAN_ROMANIA # define SUBLANG_ROMANIAN_ROMANIA 0x00 # endif # ifndef SUBLANG_ROMANIAN_MOLDOVA # define SUBLANG_ROMANIAN_MOLDOVA 0x01 # endif # ifndef SUBLANG_SERBIAN_LATIN # define SUBLANG_SERBIAN_LATIN 0x02 # endif # ifndef SUBLANG_SERBIAN_CYRILLIC # define SUBLANG_SERBIAN_CYRILLIC 0x03 # endif # ifndef SUBLANG_SINDHI_INDIA # define SUBLANG_SINDHI_INDIA 0x00 # endif # ifndef SUBLANG_SINDHI_PAKISTAN # define SUBLANG_SINDHI_PAKISTAN 0x01 # endif # ifndef SUBLANG_SPANISH_GUATEMALA # define SUBLANG_SPANISH_GUATEMALA 0x04 # endif # ifndef SUBLANG_SPANISH_COSTA_RICA # define SUBLANG_SPANISH_COSTA_RICA 0x05 # endif # ifndef SUBLANG_SPANISH_PANAMA # define SUBLANG_SPANISH_PANAMA 0x06 # endif # ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC # define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 # endif # ifndef SUBLANG_SPANISH_VENEZUELA # define SUBLANG_SPANISH_VENEZUELA 0x08 # endif # ifndef SUBLANG_SPANISH_COLOMBIA # define SUBLANG_SPANISH_COLOMBIA 0x09 # endif # ifndef SUBLANG_SPANISH_PERU # define SUBLANG_SPANISH_PERU 0x0a # endif # ifndef SUBLANG_SPANISH_ARGENTINA # define SUBLANG_SPANISH_ARGENTINA 0x0b # endif # ifndef SUBLANG_SPANISH_ECUADOR # define SUBLANG_SPANISH_ECUADOR 0x0c # endif # ifndef SUBLANG_SPANISH_CHILE # define SUBLANG_SPANISH_CHILE 0x0d # endif # ifndef SUBLANG_SPANISH_URUGUAY # define SUBLANG_SPANISH_URUGUAY 0x0e # endif # ifndef SUBLANG_SPANISH_PARAGUAY # define SUBLANG_SPANISH_PARAGUAY 0x0f # endif # ifndef SUBLANG_SPANISH_BOLIVIA # define SUBLANG_SPANISH_BOLIVIA 0x10 # endif # ifndef SUBLANG_SPANISH_EL_SALVADOR # define SUBLANG_SPANISH_EL_SALVADOR 0x11 # endif # ifndef SUBLANG_SPANISH_HONDURAS # define SUBLANG_SPANISH_HONDURAS 0x12 # endif # ifndef SUBLANG_SPANISH_NICARAGUA # define SUBLANG_SPANISH_NICARAGUA 0x13 # endif # ifndef SUBLANG_SPANISH_PUERTO_RICO # define SUBLANG_SPANISH_PUERTO_RICO 0x14 # endif # ifndef SUBLANG_SWEDISH_FINLAND # define SUBLANG_SWEDISH_FINLAND 0x02 # endif # ifndef SUBLANG_TAMAZIGHT_ARABIC # define SUBLANG_TAMAZIGHT_ARABIC 0x01 # endif # ifndef SUBLANG_TAMAZIGHT_LATIN # define SUBLANG_TAMAZIGHT_LATIN 0x02 # endif # ifndef SUBLANG_TIGRINYA_ETHIOPIA # define SUBLANG_TIGRINYA_ETHIOPIA 0x00 # endif # ifndef SUBLANG_TIGRINYA_ERITREA # define SUBLANG_TIGRINYA_ERITREA 0x01 # endif # ifndef SUBLANG_URDU_PAKISTAN # define SUBLANG_URDU_PAKISTAN 0x01 # endif # ifndef SUBLANG_URDU_INDIA # define SUBLANG_URDU_INDIA 0x02 # endif # ifndef SUBLANG_UZBEK_LATIN # define SUBLANG_UZBEK_LATIN 0x01 # endif # ifndef SUBLANG_UZBEK_CYRILLIC # define SUBLANG_UZBEK_CYRILLIC 0x02 # endif #endif # if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */ /* Canonicalize a MacOS X locale name to a Unix locale name. NAME is a sufficiently large buffer. On input, it contains the MacOS X locale name. On output, it contains the Unix locale name. */ void _nl_locale_name_canonicalize (char *name) { /* This conversion is based on a posting by Deborah GoldSmith on 2005-03-08, http://lists.apple.com/archives/carbon-dev/2005/Mar/msg00293.html */ /* Convert legacy (NeXTstep inherited) English names to Unix (ISO 639 and ISO 3166) names. Prior to MacOS X 10.3, there is no API for doing this. Therefore we do it ourselves, using a table based on the results of the MacOS X 10.3.8 function CFLocaleCreateCanonicalLocaleIdentifierFromString(). */ typedef struct { const char legacy[21+1]; const char unixy[5+1]; } legacy_entry; static const legacy_entry legacy_table[] = { { "Afrikaans", "af" }, { "Albanian", "sq" }, { "Amharic", "am" }, { "Arabic", "ar" }, { "Armenian", "hy" }, { "Assamese", "as" }, { "Aymara", "ay" }, { "Azerbaijani", "az" }, { "Basque", "eu" }, { "Belarusian", "be" }, { "Belorussian", "be" }, { "Bengali", "bn" }, { "Brazilian Portugese", "pt_BR" }, { "Brazilian Portuguese", "pt_BR" }, { "Breton", "br" }, { "Bulgarian", "bg" }, { "Burmese", "my" }, { "Byelorussian", "be" }, { "Catalan", "ca" }, { "Chewa", "ny" }, { "Chichewa", "ny" }, { "Chinese", "zh" }, { "Chinese, Simplified", "zh_CN" }, { "Chinese, Traditional", "zh_TW" }, { "Chinese, Tradtional", "zh_TW" }, { "Croatian", "hr" }, { "Czech", "cs" }, { "Danish", "da" }, { "Dutch", "nl" }, { "Dzongkha", "dz" }, { "English", "en" }, { "Esperanto", "eo" }, { "Estonian", "et" }, { "Faroese", "fo" }, { "Farsi", "fa" }, { "Finnish", "fi" }, { "Flemish", "nl_BE" }, { "French", "fr" }, { "Galician", "gl" }, { "Gallegan", "gl" }, { "Georgian", "ka" }, { "German", "de" }, { "Greek", "el" }, { "Greenlandic", "kl" }, { "Guarani", "gn" }, { "Gujarati", "gu" }, { "Hawaiian", "haw" }, /* Yes, "haw", not "cpe". */ { "Hebrew", "he" }, { "Hindi", "hi" }, { "Hungarian", "hu" }, { "Icelandic", "is" }, { "Indonesian", "id" }, { "Inuktitut", "iu" }, { "Irish", "ga" }, { "Italian", "it" }, { "Japanese", "ja" }, { "Javanese", "jv" }, { "Kalaallisut", "kl" }, { "Kannada", "kn" }, { "Kashmiri", "ks" }, { "Kazakh", "kk" }, { "Khmer", "km" }, { "Kinyarwanda", "rw" }, { "Kirghiz", "ky" }, { "Korean", "ko" }, { "Kurdish", "ku" }, { "Latin", "la" }, { "Latvian", "lv" }, { "Lithuanian", "lt" }, { "Macedonian", "mk" }, { "Malagasy", "mg" }, { "Malay", "ms" }, { "Malayalam", "ml" }, { "Maltese", "mt" }, { "Manx", "gv" }, { "Marathi", "mr" }, { "Moldavian", "mo" }, { "Mongolian", "mn" }, { "Nepali", "ne" }, { "Norwegian", "nb" }, /* Yes, "nb", not the obsolete "no". */ { "Nyanja", "ny" }, { "Nynorsk", "nn" }, { "Oriya", "or" }, { "Oromo", "om" }, { "Panjabi", "pa" }, { "Pashto", "ps" }, { "Persian", "fa" }, { "Polish", "pl" }, { "Portuguese", "pt" }, { "Portuguese, Brazilian", "pt_BR" }, { "Punjabi", "pa" }, { "Pushto", "ps" }, { "Quechua", "qu" }, { "Romanian", "ro" }, { "Ruanda", "rw" }, { "Rundi", "rn" }, { "Russian", "ru" }, { "Sami", "se_NO" }, /* Not just "se". */ { "Sanskrit", "sa" }, { "Scottish", "gd" }, { "Serbian", "sr" }, { "Simplified Chinese", "zh_CN" }, { "Sindhi", "sd" }, { "Sinhalese", "si" }, { "Slovak", "sk" }, { "Slovenian", "sl" }, { "Somali", "so" }, { "Spanish", "es" }, { "Sundanese", "su" }, { "Swahili", "sw" }, { "Swedish", "sv" }, { "Tagalog", "tl" }, { "Tajik", "tg" }, { "Tajiki", "tg" }, { "Tamil", "ta" }, { "Tatar", "tt" }, { "Telugu", "te" }, { "Thai", "th" }, { "Tibetan", "bo" }, { "Tigrinya", "ti" }, { "Tongan", "to" }, { "Traditional Chinese", "zh_TW" }, { "Turkish", "tr" }, { "Turkmen", "tk" }, { "Uighur", "ug" }, { "Ukrainian", "uk" }, { "Urdu", "ur" }, { "Uzbek", "uz" }, { "Vietnamese", "vi" }, { "Welsh", "cy" }, { "Yiddish", "yi" } }; /* Convert new-style locale names with language tags (ISO 639 and ISO 15924) to Unix (ISO 639 and ISO 3166) names. */ typedef struct { const char langtag[7+1]; const char unixy[12+1]; } langtag_entry; static const langtag_entry langtag_table[] = { /* MacOS X has "az-Arab", "az-Cyrl", "az-Latn". The default script for az on Unix is Latin. */ { "az-Latn", "az" }, /* MacOS X has "ga-dots". Does not yet exist on Unix. */ { "ga-dots", "ga" }, /* MacOS X has "kk-Cyrl". Does not yet exist on Unix. */ /* MacOS X has "mn-Cyrl", "mn-Mong". The default script for mn on Unix is Cyrillic. */ { "mn-Cyrl", "mn" }, /* MacOS X has "ms-Arab", "ms-Latn". The default script for ms on Unix is Latin. */ { "ms-Latn", "ms" }, /* MacOS X has "tg-Cyrl". The default script for tg on Unix is Cyrillic. */ { "tg-Cyrl", "tg" }, /* MacOS X has "tk-Cyrl". Does not yet exist on Unix. */ /* MacOS X has "tt-Cyrl". The default script for tt on Unix is Cyrillic. */ { "tt-Cyrl", "tt" }, /* MacOS X has "zh-Hans", "zh-Hant". Country codes are used to distinguish these on Unix. */ { "zh-Hans", "zh_CN" }, { "zh-Hant", "zh_TW" } }; /* Convert script names (ISO 15924) to Unix conventions. See http://www.unicode.org/iso15924/iso15924-codes.html */ typedef struct { const char script[4+1]; const char unixy[9+1]; } script_entry; static const script_entry script_table[] = { { "Arab", "arabic" }, { "Cyrl", "cyrillic" }, { "Mong", "mongolian" } }; /* Step 1: Convert using legacy_table. */ if (name[0] >= 'A' && name[0] <= 'Z') { unsigned int i1, i2; i1 = 0; i2 = sizeof (legacy_table) / sizeof (legacy_entry); while (i2 - i1 > 1) { /* At this point we know that if name occurs in legacy_table, its index must be >= i1 and < i2. */ unsigned int i = (i1 + i2) >> 1; const legacy_entry *p = &legacy_table[i]; if (strcmp (name, p->legacy) < 0) i2 = i; else i1 = i; } if (strcmp (name, legacy_table[i1].legacy) == 0) { strcpy (name, legacy_table[i1].unixy); return; } } /* Step 2: Convert using langtag_table and script_table. */ if (strlen (name) == 7 && name[2] == '-') { unsigned int i1, i2; i1 = 0; i2 = sizeof (langtag_table) / sizeof (langtag_entry); while (i2 - i1 > 1) { /* At this point we know that if name occurs in langtag_table, its index must be >= i1 and < i2. */ unsigned int i = (i1 + i2) >> 1; const langtag_entry *p = &langtag_table[i]; if (strcmp (name, p->langtag) < 0) i2 = i; else i1 = i; } if (strcmp (name, langtag_table[i1].langtag) == 0) { strcpy (name, langtag_table[i1].unixy); return; } i1 = 0; i2 = sizeof (script_table) / sizeof (script_entry); while (i2 - i1 > 1) { /* At this point we know that if (name + 3) occurs in script_table, its index must be >= i1 and < i2. */ unsigned int i = (i1 + i2) >> 1; const script_entry *p = &script_table[i]; if (strcmp (name + 3, p->script) < 0) i2 = i; else i1 = i; } if (strcmp (name + 3, script_table[i1].script) == 0) { name[2] = '@'; strcpy (name + 3, script_table[i1].unixy); return; } } /* Step 3: Convert new-style dash to Unix underscore. */ { char *p; for (p = name; *p != '\0'; p++) if (*p == '-') *p = '_'; } } #endif /* XPG3 defines the result of 'setlocale (category, NULL)' as: "Directs 'setlocale()' to query 'category' and return the current setting of 'local'." However it does not specify the exact format. Neither do SUSV2 and ISO C 99. So we can use this feature only on selected systems (e.g. those using GNU C Library). */ #if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2) # define HAVE_LOCALE_NULL #endif /* Determine the current locale's name, and canonicalize it into XPG syntax language[_territory[.codeset]][@modifier] The codeset part in the result is not reliable; the locale_charset() should be used for codeset information instead. The result must not be freed; it is statically allocated. */ const char * _nl_locale_name_posix (int category, const char *categoryname) { /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. On some systems this can be done by the 'setlocale' function itself. */ #if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL return setlocale (category, NULL); #else const char *retval; /* Setting of LC_ALL overrides all other. */ retval = getenv ("LC_ALL"); if (retval != NULL && retval[0] != '\0') return retval; /* Next comes the name of the desired category. */ retval = getenv (categoryname); if (retval != NULL && retval[0] != '\0') return retval; /* Last possibility is the LANG environment variable. */ retval = getenv ("LANG"); if (retval != NULL && retval[0] != '\0') return retval; return NULL; #endif } const char * _nl_locale_name_default (void) { /* POSIX:2001 says: "All implementations shall define a locale as the default locale, to be invoked when no environment variables are set, or set to the empty string. This default locale can be the POSIX locale or any other implementation-defined locale. Some implementations may provide facilities for local installation administrators to set the default locale, customizing it for each location. POSIX:2001 does not require such a facility. */ #if !(HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE || defined(WIN32)) /* The system does not have a way of setting the locale, other than the POSIX specified environment variables. We use C as default locale. */ return "C"; #else /* Return an XPG style locale name language[_territory][@modifier]. Don't even bother determining the codeset; it's not useful in this context, because message catalogs are not specific to a single codeset. */ # if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */ { /* Cache the locale name, since CoreFoundation calls are expensive. */ static const char *cached_localename; if (cached_localename == NULL) { char namebuf[256]; # if HAVE_CFLOCALECOPYCURRENT /* MacOS X 10.3 or newer */ CFLocaleRef locale = CFLocaleCopyCurrent (); CFStringRef name = CFLocaleGetIdentifier (locale); if (CFStringGetCString (name, namebuf, sizeof(namebuf), kCFStringEncodingASCII)) { _nl_locale_name_canonicalize (namebuf); cached_localename = strdup (namebuf); } CFRelease (locale); # elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */ CFTypeRef value = CFPreferencesCopyAppValue (CFSTR ("AppleLocale"), kCFPreferencesCurrentApplication); if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID () && CFStringGetCString ((CFStringRef)value, namebuf, sizeof(namebuf), kCFStringEncodingASCII)) { _nl_locale_name_canonicalize (namebuf); cached_localename = strdup (namebuf); } # endif if (cached_localename == NULL) cached_localename = "C"; } return cached_localename; } # endif # if defined(WIN32) /* WIN32 */ { LCID lcid; LANGID langid; int primary, sub; /* Use native Win32 API locale ID. */ lcid = GetThreadLocale (); /* Strip off the sorting rules, keep only the language part. */ langid = LANGIDFROMLCID (lcid); /* Split into language and territory part. */ primary = PRIMARYLANGID (langid); sub = SUBLANGID (langid); /* Dispatch on language. See also http://www.unicode.org/unicode/onlinedat/languages.html . For details about languages, see http://www.ethnologue.com/ . */ switch (primary) { case LANG_AFRIKAANS: return "af_ZA"; case LANG_ALBANIAN: return "sq_AL"; case LANG_AMHARIC: return "am_ET"; case LANG_ARABIC: switch (sub) { case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA"; case SUBLANG_ARABIC_IRAQ: return "ar_IQ"; case SUBLANG_ARABIC_EGYPT: return "ar_EG"; case SUBLANG_ARABIC_LIBYA: return "ar_LY"; case SUBLANG_ARABIC_ALGERIA: return "ar_DZ"; case SUBLANG_ARABIC_MOROCCO: return "ar_MA"; case SUBLANG_ARABIC_TUNISIA: return "ar_TN"; case SUBLANG_ARABIC_OMAN: return "ar_OM"; case SUBLANG_ARABIC_YEMEN: return "ar_YE"; case SUBLANG_ARABIC_SYRIA: return "ar_SY"; case SUBLANG_ARABIC_JORDAN: return "ar_JO"; case SUBLANG_ARABIC_LEBANON: return "ar_LB"; case SUBLANG_ARABIC_KUWAIT: return "ar_KW"; case SUBLANG_ARABIC_UAE: return "ar_AE"; case SUBLANG_ARABIC_BAHRAIN: return "ar_BH"; case SUBLANG_ARABIC_QATAR: return "ar_QA"; } return "ar"; case LANG_ARMENIAN: return "hy_AM"; case LANG_ASSAMESE: return "as_IN"; case LANG_AZERI: switch (sub) { /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */ case SUBLANG_AZERI_LATIN: return "az_AZ@latin"; case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic"; } return "az"; case LANG_BASQUE: switch (sub) { case SUBLANG_DEFAULT: return "eu_ES"; } return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */ case LANG_BELARUSIAN: return "be_BY"; case LANG_BENGALI: switch (sub) { case SUBLANG_BENGALI_INDIA: return "bn_IN"; case SUBLANG_BENGALI_BANGLADESH: return "bn_BD"; } return "bn"; case LANG_BULGARIAN: return "bg_BG"; case LANG_BURMESE: return "my_MM"; case LANG_CAMBODIAN: return "km_KH"; case LANG_CATALAN: return "ca_ES"; case LANG_CHEROKEE: return "chr_US"; case LANG_CHINESE: switch (sub) { case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW"; case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN"; case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; case SUBLANG_CHINESE_MACAU: return "zh_MO"; } return "zh"; case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN * What used to be called Serbo-Croatian * should really now be two separate * languages because of political reasons. * (Says tml, who knows nothing about Serbian * or Croatian.) * (I can feel those flames coming already.) */ switch (sub) { case SUBLANG_DEFAULT: return "hr_HR"; case SUBLANG_SERBIAN_LATIN: return "sr_CS"; case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic"; } return "hr"; case LANG_CZECH: return "cs_CZ"; case LANG_DANISH: return "da_DK"; case LANG_DIVEHI: return "dv_MV"; case LANG_DUTCH: switch (sub) { case SUBLANG_DUTCH: return "nl_NL"; case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE"; } return "nl"; case LANG_EDO: return "bin_NG"; case LANG_ENGLISH: switch (sub) { /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought * English was the language spoken in England. * Oh well. */ case SUBLANG_ENGLISH_US: return "en_US"; case SUBLANG_ENGLISH_UK: return "en_GB"; case SUBLANG_ENGLISH_AUS: return "en_AU"; case SUBLANG_ENGLISH_CAN: return "en_CA"; case SUBLANG_ENGLISH_NZ: return "en_NZ"; case SUBLANG_ENGLISH_EIRE: return "en_IE"; case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA"; case SUBLANG_ENGLISH_JAMAICA: return "en_JM"; case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */ case SUBLANG_ENGLISH_BELIZE: return "en_BZ"; case SUBLANG_ENGLISH_TRINIDAD: return "en_TT"; case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW"; case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH"; case SUBLANG_ENGLISH_INDONESIA: return "en_ID"; case SUBLANG_ENGLISH_HONGKONG: return "en_HK"; case SUBLANG_ENGLISH_INDIA: return "en_IN"; case SUBLANG_ENGLISH_MALAYSIA: return "en_MY"; case SUBLANG_ENGLISH_SINGAPORE: return "en_SG"; } return "en"; case LANG_ESTONIAN: return "et_EE"; case LANG_FAEROESE: return "fo_FO"; case LANG_FARSI: return "fa_IR"; case LANG_FINNISH: return "fi_FI"; case LANG_FRENCH: switch (sub) { case SUBLANG_FRENCH: return "fr_FR"; case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE"; case SUBLANG_FRENCH_CANADIAN: return "fr_CA"; case SUBLANG_FRENCH_SWISS: return "fr_CH"; case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU"; case SUBLANG_FRENCH_MONACO: return "fr_MC"; case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */ case SUBLANG_FRENCH_REUNION: return "fr_RE"; case SUBLANG_FRENCH_CONGO: return "fr_CG"; case SUBLANG_FRENCH_SENEGAL: return "fr_SN"; case SUBLANG_FRENCH_CAMEROON: return "fr_CM"; case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI"; case SUBLANG_FRENCH_MALI: return "fr_ML"; case SUBLANG_FRENCH_MOROCCO: return "fr_MA"; case SUBLANG_FRENCH_HAITI: return "fr_HT"; } return "fr"; case LANG_FRISIAN: return "fy_NL"; case LANG_FULFULDE: /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */ return "ff_NG"; case LANG_GAELIC: switch (sub) { case 0x01: /* SCOTTISH */ return "gd_GB"; case 0x02: /* IRISH */ return "ga_IE"; } return "C"; case LANG_GALICIAN: return "gl_ES"; case LANG_GEORGIAN: return "ka_GE"; case LANG_GERMAN: switch (sub) { case SUBLANG_GERMAN: return "de_DE"; case SUBLANG_GERMAN_SWISS: return "de_CH"; case SUBLANG_GERMAN_AUSTRIAN: return "de_AT"; case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU"; case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI"; } return "de"; case LANG_GREEK: return "el_GR"; case LANG_GUARANI: return "gn_PY"; case LANG_GUJARATI: return "gu_IN"; case LANG_HAUSA: return "ha_NG"; case LANG_HAWAIIAN: /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers) or Hawaii Creole English ("cpe_US", 600000 speakers)? */ return "cpe_US"; case LANG_HEBREW: return "he_IL"; case LANG_HINDI: return "hi_IN"; case LANG_HUNGARIAN: return "hu_HU"; case LANG_IBIBIO: return "nic_NG"; case LANG_ICELANDIC: return "is_IS"; case LANG_IGBO: return "ig_NG"; case LANG_INDONESIAN: return "id_ID"; case LANG_INUKTITUT: return "iu_CA"; case LANG_ITALIAN: switch (sub) { case SUBLANG_ITALIAN: return "it_IT"; case SUBLANG_ITALIAN_SWISS: return "it_CH"; } return "it"; case LANG_JAPANESE: return "ja_JP"; case LANG_KANNADA: return "kn_IN"; case LANG_KANURI: return "kr_NG"; case LANG_KASHMIRI: switch (sub) { case SUBLANG_DEFAULT: return "ks_PK"; case SUBLANG_KASHMIRI_INDIA: return "ks_IN"; } return "ks"; case LANG_KAZAK: return "kk_KZ"; case LANG_KONKANI: /* FIXME: Adjust this when such locales appear on Unix. */ return "kok_IN"; case LANG_KOREAN: return "ko_KR"; case LANG_KYRGYZ: return "ky_KG"; case LANG_LAO: return "lo_LA"; case LANG_LATIN: return "la_VA"; case LANG_LATVIAN: return "lv_LV"; case LANG_LITHUANIAN: return "lt_LT"; case LANG_MACEDONIAN: return "mk_MK"; case LANG_MALAY: switch (sub) { case SUBLANG_MALAY_MALAYSIA: return "ms_MY"; case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN"; } return "ms"; case LANG_MALAYALAM: return "ml_IN"; case LANG_MALTESE: return "mt_MT"; case LANG_MANIPURI: /* FIXME: Adjust this when such locales appear on Unix. */ return "mni_IN"; case LANG_MARATHI: return "mr_IN"; case LANG_MONGOLIAN: switch (sub) { case SUBLANG_DEFAULT: return "mn_MN"; } return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */ case LANG_NEPALI: switch (sub) { case SUBLANG_DEFAULT: return "ne_NP"; case SUBLANG_NEPALI_INDIA: return "ne_IN"; } return "ne"; case LANG_NORWEGIAN: switch (sub) { case SUBLANG_NORWEGIAN_BOKMAL: return "nb_NO"; case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO"; } return "no"; case LANG_ORIYA: return "or_IN"; case LANG_OROMO: return "om_ET"; case LANG_PAPIAMENTU: return "pap_AN"; case LANG_PASHTO: return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */ case LANG_POLISH: return "pl_PL"; case LANG_PORTUGUESE: switch (sub) { case SUBLANG_PORTUGUESE: return "pt_PT"; /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT. Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */ case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR"; } return "pt"; case LANG_PUNJABI: switch (sub) { case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */ case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */ } return "pa"; case LANG_RHAETO_ROMANCE: return "rm_CH"; case LANG_ROMANIAN: switch (sub) { case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO"; case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD"; } return "ro"; case LANG_RUSSIAN: switch (sub) { case SUBLANG_DEFAULT: return "ru_RU"; } return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */ case LANG_SAAMI: /* actually Northern Sami */ return "se_NO"; case LANG_SANSKRIT: return "sa_IN"; case LANG_SINDHI: switch (sub) { case SUBLANG_SINDHI_INDIA: return "sd_IN"; case SUBLANG_SINDHI_PAKISTAN: return "sd_PK"; } return "sd"; case LANG_SINHALESE: return "si_LK"; case LANG_SLOVAK: return "sk_SK"; case LANG_SLOVENIAN: return "sl_SI"; case LANG_SOMALI: return "so_SO"; case LANG_SORBIAN: /* FIXME: Adjust this when such locales appear on Unix. */ return "wen_DE"; case LANG_SPANISH: switch (sub) { case SUBLANG_SPANISH: return "es_ES"; case SUBLANG_SPANISH_MEXICAN: return "es_MX"; case SUBLANG_SPANISH_MODERN: return "es_ES@modern"; /* not seen on Unix */ case SUBLANG_SPANISH_GUATEMALA: return "es_GT"; case SUBLANG_SPANISH_COSTA_RICA: return "es_CR"; case SUBLANG_SPANISH_PANAMA: return "es_PA"; case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO"; case SUBLANG_SPANISH_VENEZUELA: return "es_VE"; case SUBLANG_SPANISH_COLOMBIA: return "es_CO"; case SUBLANG_SPANISH_PERU: return "es_PE"; case SUBLANG_SPANISH_ARGENTINA: return "es_AR"; case SUBLANG_SPANISH_ECUADOR: return "es_EC"; case SUBLANG_SPANISH_CHILE: return "es_CL"; case SUBLANG_SPANISH_URUGUAY: return "es_UY"; case SUBLANG_SPANISH_PARAGUAY: return "es_PY"; case SUBLANG_SPANISH_BOLIVIA: return "es_BO"; case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV"; case SUBLANG_SPANISH_HONDURAS: return "es_HN"; case SUBLANG_SPANISH_NICARAGUA: return "es_NI"; case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR"; } return "es"; case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */ case LANG_SWAHILI: return "sw_KE"; case LANG_SWEDISH: switch (sub) { case SUBLANG_DEFAULT: return "sv_SE"; case SUBLANG_SWEDISH_FINLAND: return "sv_FI"; } return "sv"; case LANG_SYRIAC: return "syr_TR"; /* An extinct language. */ case LANG_TAGALOG: return "tl_PH"; case LANG_TAJIK: return "tg_TJ"; case LANG_TAMAZIGHT: switch (sub) { /* FIXME: Adjust this when Tamazight locales appear on Unix. */ case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic"; case SUBLANG_TAMAZIGHT_LATIN: return "ber_MA@latin"; } return "ber_MA"; case LANG_TAMIL: switch (sub) { case SUBLANG_DEFAULT: return "ta_IN"; } return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */ case LANG_TATAR: return "tt_RU"; case LANG_TELUGU: return "te_IN"; case LANG_THAI: return "th_TH"; case LANG_TIBETAN: return "bo_CN"; case LANG_TIGRINYA: switch (sub) { case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET"; case SUBLANG_TIGRINYA_ERITREA: return "ti_ER"; } return "ti"; case LANG_TSONGA: return "ts_ZA"; case LANG_TSWANA: return "tn_BW"; case LANG_TURKISH: return "tr_TR"; case LANG_TURKMEN: return "tk_TM"; case LANG_UKRAINIAN: return "uk_UA"; case LANG_URDU: switch (sub) { case SUBLANG_URDU_PAKISTAN: return "ur_PK"; case SUBLANG_URDU_INDIA: return "ur_IN"; } return "ur"; case LANG_UZBEK: switch (sub) { case SUBLANG_UZBEK_LATIN: return "uz_UZ"; case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic"; } return "uz"; case LANG_VENDA: return "ve_ZA"; case LANG_VIETNAMESE: return "vi_VN"; case LANG_WELSH: return "cy_GB"; case LANG_XHOSA: return "xh_ZA"; case LANG_YI: return "sit_CN"; case LANG_YIDDISH: return "yi_IL"; case LANG_YORUBA: return "yo_NG"; case LANG_ZULU: return "zu_ZA"; default: return "C"; } } # endif #endif } const char * _nl_locale_name (int category, const char *categoryname) { const char *retval; retval = _nl_locale_name_posix (category, categoryname); if (retval != NULL) return retval; return _nl_locale_name_default (); } centerim-4.22.10/intl/langprefs.c0000644000175000001440000000730111473011430013471 00000000000000/* Determine the user's language preferences. Copyright (C) 2004-2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Bruno Haible . */ #ifdef HAVE_CONFIG_H # include #endif #include #if HAVE_CFPREFERENCESCOPYAPPVALUE # include # include # include # include # include extern void _nl_locale_name_canonicalize (char *name); #endif /* Determine the user's language preferences, as a colon separated list of locale names in XPG syntax language[_territory[.codeset]][@modifier] The result must not be freed; it is statically allocated. The LANGUAGE environment variable does not need to be considered; it is already taken into account by the caller. */ const char * _nl_language_preferences_default (void) { #if HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */ { /* Cache the preferences list, since CoreFoundation calls are expensive. */ static const char *cached_languages; static int cache_initialized; if (!cache_initialized) { CFTypeRef preferences = CFPreferencesCopyAppValue (CFSTR ("AppleLanguages"), kCFPreferencesCurrentApplication); if (preferences != NULL && CFGetTypeID (preferences) == CFArrayGetTypeID ()) { CFArrayRef prefArray = (CFArrayRef)preferences; int n = CFArrayGetCount (prefArray); char buf[256]; size_t size = 0; int i; for (i = 0; i < n; i++) { CFTypeRef element = CFArrayGetValueAtIndex (prefArray, i); if (element != NULL && CFGetTypeID (element) == CFStringGetTypeID () && CFStringGetCString ((CFStringRef)element, buf, sizeof (buf), kCFStringEncodingASCII)) { _nl_locale_name_canonicalize (buf); size += strlen (buf) + 1; /* Most GNU programs use msgids in English and don't ship an en.mo message catalog. Therefore when we see "en" in the preferences list, arrange for gettext() to return the msgid, and ignore all further elements of the preferences list. */ if (strcmp (buf, "en") == 0) break; } else break; } if (size > 0) { char *languages = (char *) malloc (size); if (languages != NULL) { char *p = languages; for (i = 0; i < n; i++) { CFTypeRef element = CFArrayGetValueAtIndex (prefArray, i); if (element != NULL && CFGetTypeID (element) == CFStringGetTypeID () && CFStringGetCString ((CFStringRef)element, buf, sizeof (buf), kCFStringEncodingASCII)) { _nl_locale_name_canonicalize (buf); strcpy (p, buf); p += strlen (buf); *p++ = ':'; if (strcmp (buf, "en") == 0) break; } else break; } *--p = '\0'; cached_languages = languages; } } } cache_initialized = 1; } if (cached_languages != NULL) return cached_languages; } #endif return NULL; } centerim-4.22.10/intl/finddomain.c0000644000175000001440000001274711473011430013632 00000000000000/* Handle list of needed message catalogs Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* List of already loaded domains. */ static struct loaded_l10nfile *_nl_loaded_domains; /* Return a data structure describing the message catalog described by the DOMAINNAME and CATEGORY parameters with respect to the currently established bindings. */ struct loaded_l10nfile * internal_function _nl_find_domain (const char *dirname, char *locale, const char *domainname, struct binding *domainbinding) { struct loaded_l10nfile *retval; const char *language; const char *modifier; const char *territory; const char *codeset; const char *normalized_codeset; const char *special; const char *sponsor; const char *revision; const char *alias_value; int mask; /* LOCALE can consist of up to four recognized parts for the XPG syntax: language[_territory[.codeset]][@modifier] and six parts for the CEN syntax: language[_territory][+audience][+special][,[sponsor][_revision]] Beside the first part all of them are allowed to be missing. If the full specified locale is not found, the less specific one are looked for. The various parts will be stripped off according to the following order: (1) revision (2) sponsor (3) special (4) codeset (5) normalized codeset (6) territory (7) audience/modifier */ /* If we have already tested for this locale entry there has to be one data set in the list of loaded domains. */ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, strlen (dirname) + 1, 0, locale, NULL, NULL, NULL, NULL, NULL, NULL, NULL, domainname, 0); if (retval != NULL) { /* We know something about this locale. */ int cnt; if (retval->decided == 0) _nl_load_domain (retval, domainbinding); if (retval->data != NULL) return retval; for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) { if (retval->successor[cnt]->decided == 0) _nl_load_domain (retval->successor[cnt], domainbinding); if (retval->successor[cnt]->data != NULL) break; } return cnt >= 0 ? retval : NULL; /* NOTREACHED */ } /* See whether the locale value is an alias. If yes its value *overwrites* the alias name. No test for the original value is done. */ alias_value = _nl_expand_alias (locale); if (alias_value != NULL) { #if defined _LIBC || defined HAVE_STRDUP locale = strdup (alias_value); if (locale == NULL) return NULL; #else size_t len = strlen (alias_value) + 1; locale = (char *) malloc (len); if (locale == NULL) return NULL; memcpy (locale, alias_value, len); #endif } /* Now we determine the single parts of the locale name. First look for the language. Termination symbols are `_' and `@' if we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ mask = _nl_explode_name (locale, &language, &modifier, &territory, &codeset, &normalized_codeset, &special, &sponsor, &revision); /* Create all possible locale entries which might be interested in generalization. */ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, strlen (dirname) + 1, mask, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, domainname, 1); if (retval == NULL) /* This means we are out of core. */ return NULL; if (retval->decided == 0) _nl_load_domain (retval, domainbinding); if (retval->data == NULL) { int cnt; for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) { if (retval->successor[cnt]->decided == 0) _nl_load_domain (retval->successor[cnt], domainbinding); if (retval->successor[cnt]->data != NULL) break; } } /* The room for an alias was dynamically allocated. Free it now. */ if (alias_value != NULL) free (locale); /* The space for normalized_codeset is dynamically allocated. Free it. */ if (mask & XPG_NORM_CODESET) free ((void *) normalized_codeset); return retval; } #ifdef _LIBC libc_freeres_fn (free_mem) { struct loaded_l10nfile *runp = _nl_loaded_domains; while (runp != NULL) { struct loaded_l10nfile *here = runp; if (runp->data != NULL) _nl_unload_domain ((struct loaded_domain *) runp->data); runp = runp->next; free ((char *) here->filename); free (here); } } #endif centerim-4.22.10/intl/l10nflist.c0000644000175000001440000002737211473011430013336 00000000000000/* Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc. Contributed by Ulrich Drepper , 1995. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Tell glibc's to provide a prototype for stpcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #if defined _LIBC || defined HAVE_ARGZ_H # include #endif #include #include #include #include "loadinfo.h" /* On some strange systems still no definition of NULL is found. Sigh! */ #ifndef NULL # if defined __STDC__ && __STDC__ # define NULL ((void *) 0) # else # define NULL 0 # endif #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # ifndef stpcpy # define stpcpy(dest, src) __stpcpy(dest, src) # endif #else # ifndef HAVE_STPCPY static char *stpcpy (char *dest, const char *src); # endif #endif /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, it may be concatenated to a directory pathname. */ #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Win32, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) #endif /* Define function which are usually not available. */ #if !defined _LIBC && !defined HAVE___ARGZ_COUNT /* Returns the number of strings in ARGZ. */ static size_t argz_count__ (const char *argz, size_t len) { size_t count = 0; while (len > 0) { size_t part_len = strlen (argz); argz += part_len + 1; len -= part_len + 1; count++; } return count; } # undef __argz_count # define __argz_count(argz, len) argz_count__ (argz, len) #else # ifdef _LIBC # define __argz_count(argz, len) INTUSE(__argz_count) (argz, len) # endif #endif /* !_LIBC && !HAVE___ARGZ_COUNT */ #if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY /* Make '\0' separated arg vector ARGZ printable by converting all the '\0's except the last into the character SEP. */ static void argz_stringify__ (char *argz, size_t len, int sep) { while (len > 0) { size_t part_len = strlen (argz); argz += part_len; len -= part_len + 1; if (len > 0) *argz++ = sep; } } # undef __argz_stringify # define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) #else # ifdef _LIBC # define __argz_stringify(argz, len, sep) \ INTUSE(__argz_stringify) (argz, len, sep) # endif #endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ #if !defined _LIBC && !defined HAVE___ARGZ_NEXT static char * argz_next__ (char *argz, size_t argz_len, const char *entry) { if (entry) { if (entry < argz + argz_len) entry = strchr (entry, '\0') + 1; return entry >= argz + argz_len ? NULL : (char *) entry; } else if (argz_len > 0) return argz; else return 0; } # undef __argz_next # define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) #endif /* !_LIBC && !HAVE___ARGZ_NEXT */ /* Return number of bits set in X. */ static inline int pop (int x) { /* We assume that no more than 16 bits are used. */ x = ((x & ~0x5555) >> 1) + (x & 0x5555); x = ((x & ~0x3333) >> 2) + (x & 0x3333); x = ((x >> 4) + x) & 0x0f0f; x = ((x >> 8) + x) & 0xff; return x; } struct loaded_l10nfile * _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list, const char *dirlist, size_t dirlist_len, int mask, const char *language, const char *territory, const char *codeset, const char *normalized_codeset, const char *modifier, const char *special, const char *sponsor, const char *revision, const char *filename, int do_allocate) { char *abs_filename; struct loaded_l10nfile **lastp; struct loaded_l10nfile *retval; char *cp; size_t dirlist_count; size_t entries; int cnt; /* If LANGUAGE contains an absolute directory specification, we ignore DIRLIST. */ if (IS_ABSOLUTE_PATH (language)) dirlist_len = 0; /* Allocate room for the full file name. */ abs_filename = (char *) malloc (dirlist_len + strlen (language) + ((mask & TERRITORY) != 0 ? strlen (territory) + 1 : 0) + ((mask & XPG_CODESET) != 0 ? strlen (codeset) + 1 : 0) + ((mask & XPG_NORM_CODESET) != 0 ? strlen (normalized_codeset) + 1 : 0) + (((mask & XPG_MODIFIER) != 0 || (mask & CEN_AUDIENCE) != 0) ? strlen (modifier) + 1 : 0) + ((mask & CEN_SPECIAL) != 0 ? strlen (special) + 1 : 0) + (((mask & CEN_SPONSOR) != 0 || (mask & CEN_REVISION) != 0) ? (1 + ((mask & CEN_SPONSOR) != 0 ? strlen (sponsor) : 0) + ((mask & CEN_REVISION) != 0 ? strlen (revision) + 1 : 0)) : 0) + 1 + strlen (filename) + 1); if (abs_filename == NULL) return NULL; /* Construct file name. */ cp = abs_filename; if (dirlist_len > 0) { memcpy (cp, dirlist, dirlist_len); __argz_stringify (cp, dirlist_len, PATH_SEPARATOR); cp += dirlist_len; cp[-1] = '/'; } cp = stpcpy (cp, language); if ((mask & TERRITORY) != 0) { *cp++ = '_'; cp = stpcpy (cp, territory); } if ((mask & XPG_CODESET) != 0) { *cp++ = '.'; cp = stpcpy (cp, codeset); } if ((mask & XPG_NORM_CODESET) != 0) { *cp++ = '.'; cp = stpcpy (cp, normalized_codeset); } if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) { /* This component can be part of both syntaces but has different leading characters. For CEN we use `+', else `@'. */ *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; cp = stpcpy (cp, modifier); } if ((mask & CEN_SPECIAL) != 0) { *cp++ = '+'; cp = stpcpy (cp, special); } if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) { *cp++ = ','; if ((mask & CEN_SPONSOR) != 0) cp = stpcpy (cp, sponsor); if ((mask & CEN_REVISION) != 0) { *cp++ = '_'; cp = stpcpy (cp, revision); } } *cp++ = '/'; stpcpy (cp, filename); /* Look in list of already loaded domains whether it is already available. */ lastp = l10nfile_list; for (retval = *l10nfile_list; retval != NULL; retval = retval->next) if (retval->filename != NULL) { int compare = strcmp (retval->filename, abs_filename); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It's not in the list. */ retval = NULL; break; } lastp = &retval->next; } if (retval != NULL || do_allocate == 0) { free (abs_filename); return retval; } dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1); /* Allocate a new loaded_l10nfile. */ retval = (struct loaded_l10nfile *) malloc (sizeof (*retval) + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0)) * sizeof (struct loaded_l10nfile *))); if (retval == NULL) return NULL; retval->filename = abs_filename; /* We set retval->data to NULL here; it is filled in later. Setting retval->decided to 1 here means that retval does not correspond to a real file (dirlist_count > 1) or is not worth looking up (if an unnormalized codeset was specified). */ retval->decided = (dirlist_count > 1 || ((mask & XPG_CODESET) != 0 && (mask & XPG_NORM_CODESET) != 0)); retval->data = NULL; retval->next = *lastp; *lastp = retval; entries = 0; /* Recurse to fill the inheritance list of RETVAL. If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL entry does not correspond to a real file; retval->filename contains colons. In this case we loop across all elements of DIRLIST and across all bit patterns dominated by MASK. If the DIRLIST is a single directory or entirely redundant (i.e. DIRLIST_COUNT == 1), we loop across all bit patterns dominated by MASK, excluding MASK itself. In either case, we loop down from MASK to 0. This has the effect that the extra bits in the locale name are dropped in this order: first the modifier, then the territory, then the codeset, then the normalized_codeset. */ for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt) if ((cnt & ~mask) == 0 && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) { if (dirlist_count > 1) { /* Iterate over all elements of the DIRLIST. */ char *dir = NULL; while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) != NULL) retval->successor[entries++] = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, filename, 1); } else retval->successor[entries++] = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, cnt, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, filename, 1); } retval->successor[entries] = NULL; return retval; } /* Normalize codeset name. There is no standard for the codeset names. Normalization allows the user to use any of the common names. The return value is dynamically allocated and has to be freed by the caller. */ const char * _nl_normalize_codeset (const char *codeset, size_t name_len) { int len = 0; int only_digit = 1; char *retval; char *wp; size_t cnt; for (cnt = 0; cnt < name_len; ++cnt) if (isalnum ((unsigned char) codeset[cnt])) { ++len; if (isalpha ((unsigned char) codeset[cnt])) only_digit = 0; } retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); if (retval != NULL) { if (only_digit) wp = stpcpy (retval, "iso"); else wp = retval; for (cnt = 0; cnt < name_len; ++cnt) if (isalpha ((unsigned char) codeset[cnt])) *wp++ = tolower ((unsigned char) codeset[cnt]); else if (isdigit ((unsigned char) codeset[cnt])) *wp++ = codeset[cnt]; *wp = '\0'; } return (const char *) retval; } /* @@ begin of epilog @@ */ /* We don't want libintl.a to depend on any other library. So we avoid the non-standard function stpcpy. In GNU C Library this function is available, though. Also allow the symbol HAVE_STPCPY to be defined. */ #if !_LIBC && !HAVE_STPCPY static char * stpcpy (char *dest, const char *src) { while ((*dest++ = *src++) != '\0') /* Do nothing. */ ; return dest - 1; } #endif centerim-4.22.10/intl/os2compat.h0000644000175000001440000000302611473011430013424 00000000000000/* OS/2 compatibility defines. This file is intended to be included from config.h Copyright (C) 2001-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* When included from os2compat.h we need all the original definitions */ #ifndef OS2_AWARE #undef LIBDIR #define LIBDIR _nlos2_libdir extern char *_nlos2_libdir; #undef LOCALEDIR #define LOCALEDIR _nlos2_localedir extern char *_nlos2_localedir; #undef LOCALE_ALIAS_PATH #define LOCALE_ALIAS_PATH _nlos2_localealiaspath extern char *_nlos2_localealiaspath; #endif #undef HAVE_STRCASECMP #define HAVE_STRCASECMP 1 #define strcasecmp stricmp #define strncasecmp strnicmp /* We have our own getenv() which works even if library is compiled as DLL */ #define getenv _nl_getenv /* Older versions of gettext used -1 as the value of LC_MESSAGES */ #define LC_MESSAGES_COMPAT (-1) centerim-4.22.10/intl/ngettext.c0000644000175000001440000000367411473011430013363 00000000000000/* Implementation of ngettext(3) function. Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef _LIBC # define __need_NULL # include #else # include /* Just for NULL. */ #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define NGETTEXT __ngettext # define DCNGETTEXT __dcngettext #else # define NGETTEXT libintl_ngettext # define DCNGETTEXT libintl_dcngettext #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ char * NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n) { return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__ngettext, ngettext); #endif centerim-4.22.10/intl/dcigettext.c0000644000175000001440000010415611473011430013662 00000000000000/* Implementation of the internal dcigettext function. Copyright (C) 1995-1999, 2000-2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Tell glibc's to provide a prototype for mempcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # ifdef _MSC_VER # include # define alloca _alloca # else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif # endif #endif #include #ifndef errno extern int errno; #endif #ifndef __set_errno # define __set_errno(val) errno = (val) #endif #include #include #include #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #include #ifdef _LIBC /* Guess whether integer division by zero raises signal SIGFPE. Set to 1 only if you know for sure. In case of doubt, set to 0. */ # if defined __alpha__ || defined __arm__ || defined __i386__ \ || defined __m68k__ || defined __s390__ # define INTDIV0_RAISES_SIGFPE 1 # else # define INTDIV0_RAISES_SIGFPE 0 # endif #endif #if !INTDIV0_RAISES_SIGFPE # include #endif #if defined HAVE_SYS_PARAM_H || defined _LIBC # include #endif #include "gettextP.h" #include "plural-exp.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include "hash-string.h" /* Thread safetyness. */ #ifdef _LIBC # include #else /* Provide dummy implementation if this is outside glibc. */ # define __libc_lock_define_initialized(CLASS, NAME) # define __libc_lock_lock(NAME) # define __libc_lock_unlock(NAME) # define __libc_rwlock_define_initialized(CLASS, NAME) # define __libc_rwlock_rdlock(NAME) # define __libc_rwlock_unlock(NAME) #endif /* Alignment of types. */ #if defined __GNUC__ && __GNUC__ >= 2 # define alignof(TYPE) __alignof__ (TYPE) #else # define alignof(TYPE) \ ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) #endif /* The internal variables in the standalone libintl.a must have different names than the internal variables in GNU libc, otherwise programs using libintl.a cannot be linked statically. */ #if !defined _LIBC # define _nl_default_default_domain libintl_nl_default_default_domain # define _nl_current_default_domain libintl_nl_current_default_domain # define _nl_default_dirname libintl_nl_default_dirname # define _nl_domain_bindings libintl_nl_domain_bindings #endif /* Some compilers, like SunOS4 cc, don't have offsetof in . */ #ifndef offsetof # define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # define getcwd __getcwd # ifndef stpcpy # define stpcpy __stpcpy # endif # define tfind __tfind #else # if !defined HAVE_GETCWD char *getwd (); # define getcwd(buf, max) getwd (buf) # else # if VMS # define getcwd(buf, max) (getcwd) (buf, max, 0) # else char *getcwd (); # endif # endif # ifndef HAVE_STPCPY static char *stpcpy (char *dest, const char *src); # endif # ifndef HAVE_MEMPCPY static void *mempcpy (void *dest, const void *src, size_t n); # endif #endif /* Amount to increase buffer size by in each try. */ #define PATH_INCR 32 /* The following is from pathmax.h. */ /* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define PATH_MAX but might cause redefinition warnings when sys/param.h is later included (as on MORE/BSD 4.3). */ #if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__) # include #endif #ifndef _POSIX_PATH_MAX # define _POSIX_PATH_MAX 255 #endif #if !defined PATH_MAX && defined _PC_PATH_MAX # define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) #endif /* Don't include sys/param.h if it already has been. */ #if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include #endif #if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN #endif #ifndef PATH_MAX # define PATH_MAX _POSIX_PATH_MAX #endif /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, it may be concatenated to a directory pathname. IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. */ #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Win32, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) # define IS_PATH_WITH_DIR(P) \ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) # define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) #endif /* This is the type used for the search tree where known translations are stored. */ struct known_translation_t { /* Domain in which to search. */ char *domainname; /* The category. */ int category; /* State of the catalog counter at the point the string was found. */ int counter; /* Catalog where the string was found. */ struct loaded_l10nfile *domain; /* And finally the translation. */ const char *translation; size_t translation_length; /* Pointer to the string in question. */ char msgid[ZERO]; }; /* Root of the search tree with known translations. We can use this only if the system provides the `tsearch' function family. */ #if defined HAVE_TSEARCH || defined _LIBC # include static void *root; # ifdef _LIBC # define tsearch __tsearch # endif /* Function to compare two entries in the table of known translations. */ static int transcmp (const void *p1, const void *p2) { const struct known_translation_t *s1; const struct known_translation_t *s2; int result; s1 = (const struct known_translation_t *) p1; s2 = (const struct known_translation_t *) p2; result = strcmp (s1->msgid, s2->msgid); if (result == 0) { result = strcmp (s1->domainname, s2->domainname); if (result == 0) /* We compare the category last (though this is the cheapest operation) since it is hopefully always the same (namely LC_MESSAGES). */ result = s1->category - s2->category; } return result; } #endif #ifndef INTVARDEF # define INTVARDEF(name) #endif #ifndef INTUSE # define INTUSE(name) name #endif /* Name of the default domain used for gettext(3) prior any call to textdomain(3). The default value for this is "messages". */ const char _nl_default_default_domain[] attribute_hidden = "messages"; /* Value used as the default domain for gettext(3). */ const char *_nl_current_default_domain attribute_hidden = _nl_default_default_domain; /* Contains the default location of the message catalogs. */ #if defined __EMX__ extern const char _nl_default_dirname[]; #else const char _nl_default_dirname[] = LOCALEDIR; INTVARDEF (_nl_default_dirname) #endif /* List with bindings of specific domains created by bindtextdomain() calls. */ struct binding *_nl_domain_bindings; /* Prototypes for local functions. */ static char *plural_lookup (struct loaded_l10nfile *domain, unsigned long int n, const char *translation, size_t translation_len) internal_function; static const char *guess_category_value (int category, const char *categoryname) internal_function; #ifdef _LIBC # include "../locale/localeinfo.h" # define category_to_name(category) _nl_category_names[category] #else static const char *category_to_name (int category) internal_function; #endif /* For those loosing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA /* Nothing has to be done. */ # define freea(p) /* nothing */ # define ADD_BLOCK(list, address) /* nothing */ # define FREE_BLOCKS(list) /* nothing */ #else struct block_list { void *address; struct block_list *next; }; # define ADD_BLOCK(list, addr) \ do { \ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ /* If we cannot get a free block we cannot add the new element to \ the list. */ \ if (newp != NULL) { \ newp->address = (addr); \ newp->next = (list); \ (list) = newp; \ } \ } while (0) # define FREE_BLOCKS(list) \ do { \ while (list != NULL) { \ struct block_list *old = list; \ list = list->next; \ free (old->address); \ free (old); \ } \ } while (0) # undef alloca # define alloca(size) (malloc (size)) # define freea(p) free (p) #endif /* have alloca */ #ifdef _LIBC /* List of blocks allocated for translations. */ typedef struct transmem_list { struct transmem_list *next; char data[ZERO]; } transmem_block_t; static struct transmem_list *transmem_list; #else typedef unsigned char transmem_block_t; #endif /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCIGETTEXT __dcigettext #else # define DCIGETTEXT libintl_dcigettext #endif /* Lock variable to protect the global data in the gettext implementation. */ #ifdef _LIBC __libc_rwlock_define_initialized (, _nl_state_lock attribute_hidden) #endif /* Checking whether the binaries runs SUID must be done and glibc provides easier methods therefore we make a difference here. */ #ifdef _LIBC # define ENABLE_SECURE __libc_enable_secure # define DETERMINE_SECURE #else # ifndef HAVE_GETUID # define getuid() 0 # endif # ifndef HAVE_GETGID # define getgid() 0 # endif # ifndef HAVE_GETEUID # define geteuid() getuid() # endif # ifndef HAVE_GETEGID # define getegid() getgid() # endif static int enable_secure; # define ENABLE_SECURE (enable_secure == 1) # define DETERMINE_SECURE \ if (enable_secure == 0) \ { \ if (getuid () != geteuid () || getgid () != getegid ()) \ enable_secure = 1; \ else \ enable_secure = -1; \ } #endif /* Get the function to evaluate the plural expression. */ #include "eval-plural.h" /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale and, if PLURAL is nonzero, search over string depending on the plural form determined by N. */ char * DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, int plural, unsigned long int n, int category) { #ifndef HAVE_ALLOCA struct block_list *block_list = NULL; #endif struct loaded_l10nfile *domain; struct binding *binding; const char *categoryname; const char *categoryvalue; char *dirname, *xdomainname; char *single_locale; char *retval; size_t retlen; int saved_errno; #if defined HAVE_TSEARCH || defined _LIBC struct known_translation_t *search; struct known_translation_t **foundp = NULL; size_t msgid_len; #endif size_t domainname_len; /* If no real MSGID is given return NULL. */ if (msgid1 == NULL) return NULL; #ifdef _LIBC if (category < 0 || category >= __LC_LAST || category == LC_ALL) /* Bogus. */ return (plural == 0 ? (char *) msgid1 /* Use the Germanic plural rule. */ : n == 1 ? (char *) msgid1 : (char *) msgid2); #endif __libc_rwlock_rdlock (_nl_state_lock); /* If DOMAINNAME is NULL, we are interested in the default domain. If CATEGORY is not LC_MESSAGES this might not make much sense but the definition left this undefined. */ if (domainname == NULL) domainname = _nl_current_default_domain; /* OS/2 specific: backward compatibility with older libintl versions */ #ifdef LC_MESSAGES_COMPAT if (category == LC_MESSAGES_COMPAT) category = LC_MESSAGES; #endif #if defined HAVE_TSEARCH || defined _LIBC msgid_len = strlen (msgid1) + 1; /* Try to find the translation among those which we found at some time. */ search = (struct known_translation_t *) alloca (offsetof (struct known_translation_t, msgid) + msgid_len); memcpy (search->msgid, msgid1, msgid_len); search->domainname = (char *) domainname; search->category = category; foundp = (struct known_translation_t **) tfind (search, &root, transcmp); freea (search); if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr) { /* Now deal with plural. */ if (plural) retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation, (*foundp)->translation_length); else retval = (char *) (*foundp)->translation; __libc_rwlock_unlock (_nl_state_lock); return retval; } #endif /* Preserve the `errno' value. */ saved_errno = errno; /* See whether this is a SUID binary or not. */ DETERMINE_SECURE; /* First find matching binding. */ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) { int compare = strcmp (domainname, binding->domainname); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It is not in the list. */ binding = NULL; break; } } if (binding == NULL) dirname = (char *) INTUSE(_nl_default_dirname); else if (IS_ABSOLUTE_PATH (binding->dirname)) dirname = binding->dirname; else { /* We have a relative path. Make it absolute now. */ size_t dirname_len = strlen (binding->dirname) + 1; size_t path_max; char *ret; path_max = (unsigned int) PATH_MAX; path_max += 2; /* The getcwd docs say to do this. */ for (;;) { dirname = (char *) alloca (path_max + dirname_len); ADD_BLOCK (block_list, dirname); __set_errno (0); ret = getcwd (dirname, path_max); if (ret != NULL || errno != ERANGE) break; path_max += path_max / 2; path_max += PATH_INCR; } if (ret == NULL) /* We cannot get the current working directory. Don't signal an error but simply return the default string. */ goto return_untranslated; stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); } /* Now determine the symbolic name of CATEGORY and its value. */ categoryname = category_to_name (category); categoryvalue = guess_category_value (category, categoryname); domainname_len = strlen (domainname); xdomainname = (char *) alloca (strlen (categoryname) + domainname_len + 5); ADD_BLOCK (block_list, xdomainname); stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), domainname, domainname_len), ".mo"); /* Creating working area. */ single_locale = (char *) alloca (strlen (categoryvalue) + 1); ADD_BLOCK (block_list, single_locale); /* Search for the given string. This is a loop because we perhaps got an ordered list of languages to consider for the translation. */ while (1) { /* Make CATEGORYVALUE point to the next element of the list. */ while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') ++categoryvalue; if (categoryvalue[0] == '\0') { /* The whole contents of CATEGORYVALUE has been searched but no valid entry has been found. We solve this situation by implicitly appending a "C" entry, i.e. no translation will take place. */ single_locale[0] = 'C'; single_locale[1] = '\0'; } else { char *cp = single_locale; while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') *cp++ = *categoryvalue++; *cp = '\0'; /* When this is a SUID binary we must not allow accessing files outside the dedicated directories. */ if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale)) /* Ingore this entry. */ continue; } /* If the current locale value is C (or POSIX) we don't load a domain. Return the MSGID. */ if (strcmp (single_locale, "C") == 0 || strcmp (single_locale, "POSIX") == 0) break; /* Find structure describing the message catalog matching the DOMAINNAME and CATEGORY. */ domain = _nl_find_domain (dirname, single_locale, xdomainname, binding); if (domain != NULL) { retval = _nl_find_msg (domain, binding, msgid1, &retlen); if (retval == NULL) { int cnt; for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) { retval = _nl_find_msg (domain->successor[cnt], binding, msgid1, &retlen); if (retval != NULL) { domain = domain->successor[cnt]; break; } } } if (retval != NULL) { /* Found the translation of MSGID1 in domain DOMAIN: starting at RETVAL, RETLEN bytes. */ FREE_BLOCKS (block_list); #if defined HAVE_TSEARCH || defined _LIBC if (foundp == NULL) { /* Create a new entry and add it to the search tree. */ struct known_translation_t *newp; newp = (struct known_translation_t *) malloc (offsetof (struct known_translation_t, msgid) + msgid_len + domainname_len + 1); if (newp != NULL) { newp->domainname = mempcpy (newp->msgid, msgid1, msgid_len); memcpy (newp->domainname, domainname, domainname_len + 1); newp->category = category; newp->counter = _nl_msg_cat_cntr; newp->domain = domain; newp->translation = retval; newp->translation_length = retlen; /* Insert the entry in the search tree. */ foundp = (struct known_translation_t **) tsearch (newp, &root, transcmp); if (foundp == NULL || __builtin_expect (*foundp != newp, 0)) /* The insert failed. */ free (newp); } } else { /* We can update the existing entry. */ (*foundp)->counter = _nl_msg_cat_cntr; (*foundp)->domain = domain; (*foundp)->translation = retval; (*foundp)->translation_length = retlen; } #endif __set_errno (saved_errno); /* Now deal with plural. */ if (plural) retval = plural_lookup (domain, n, retval, retlen); __libc_rwlock_unlock (_nl_state_lock); return retval; } } } return_untranslated: /* Return the untranslated MSGID. */ FREE_BLOCKS (block_list); __libc_rwlock_unlock (_nl_state_lock); #ifndef _LIBC if (!ENABLE_SECURE) { extern void _nl_log_untranslated (const char *logfilename, const char *domainname, const char *msgid1, const char *msgid2, int plural); const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED"); if (logfilename != NULL && logfilename[0] != '\0') _nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural); } #endif __set_errno (saved_errno); return (plural == 0 ? (char *) msgid1 /* Use the Germanic plural rule. */ : n == 1 ? (char *) msgid1 : (char *) msgid2); } char * internal_function _nl_find_msg (struct loaded_l10nfile *domain_file, struct binding *domainbinding, const char *msgid, size_t *lengthp) { struct loaded_domain *domain; nls_uint32 nstrings; size_t act; char *result; size_t resultlen; if (domain_file->decided == 0) _nl_load_domain (domain_file, domainbinding); if (domain_file->data == NULL) return NULL; domain = (struct loaded_domain *) domain_file->data; nstrings = domain->nstrings; /* Locate the MSGID and its translation. */ if (domain->hash_tab != NULL) { /* Use the hashing table. */ nls_uint32 len = strlen (msgid); nls_uint32 hash_val = hash_string (msgid); nls_uint32 idx = hash_val % domain->hash_size; nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); while (1) { nls_uint32 nstr = W (domain->must_swap_hash_tab, domain->hash_tab[idx]); if (nstr == 0) /* Hash table entry is empty. */ return NULL; nstr--; /* Compare msgid with the original string at index nstr. We compare the lengths with >=, not ==, because plural entries are represented by strings with an embedded NUL. */ if (nstr < nstrings ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len && (strcmp (msgid, domain->data + W (domain->must_swap, domain->orig_tab[nstr].offset)) == 0) : domain->orig_sysdep_tab[nstr - nstrings].length > len && (strcmp (msgid, domain->orig_sysdep_tab[nstr - nstrings].pointer) == 0)) { act = nstr; goto found; } if (idx >= domain->hash_size - incr) idx -= domain->hash_size - incr; else idx += incr; } /* NOTREACHED */ } else { /* Try the default method: binary search in the sorted array of messages. */ size_t top, bottom; bottom = 0; top = nstrings; while (bottom < top) { int cmp_val; act = (bottom + top) / 2; cmp_val = strcmp (msgid, (domain->data + W (domain->must_swap, domain->orig_tab[act].offset))); if (cmp_val < 0) top = act; else if (cmp_val > 0) bottom = act + 1; else goto found; } /* No translation was found. */ return NULL; } found: /* The translation was found at index ACT. If we have to convert the string to use a different character set, this is the time. */ if (act < nstrings) { result = (char *) (domain->data + W (domain->must_swap, domain->trans_tab[act].offset)); resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; } else { result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer; resultlen = domain->trans_sysdep_tab[act - nstrings].length; } #if defined _LIBC || HAVE_ICONV if (domain->codeset_cntr != (domainbinding != NULL ? domainbinding->codeset_cntr : 0)) { /* The domain's codeset has changed through bind_textdomain_codeset() since the message catalog was initialized or last accessed. We have to reinitialize the converter. */ _nl_free_domain_conv (domain); _nl_init_domain_conv (domain_file, domain, domainbinding); } if ( # ifdef _LIBC domain->conv != (__gconv_t) -1 # else # if HAVE_ICONV domain->conv != (iconv_t) -1 # endif # endif ) { /* We are supposed to do a conversion. First allocate an appropriate table with the same structure as the table of translations in the file, where we can put the pointers to the converted strings in. There is a slight complication with plural entries. They are represented by consecutive NUL terminated strings. We handle this case by converting RESULTLEN bytes, including NULs. */ if (domain->conv_tab == NULL && ((domain->conv_tab = (char **) calloc (nstrings + domain->n_sysdep_strings, sizeof (char *))) == NULL)) /* Mark that we didn't succeed allocating a table. */ domain->conv_tab = (char **) -1; if (__builtin_expect (domain->conv_tab == (char **) -1, 0)) /* Nothing we can do, no more memory. */ goto converted; if (domain->conv_tab[act] == NULL) { /* We haven't used this string so far, so it is not translated yet. Do this now. */ /* We use a bit more efficient memory handling. We allocate always larger blocks which get used over time. This is faster than many small allocations. */ __libc_lock_define_initialized (static, lock) # define INITIAL_BLOCK_SIZE 4080 static unsigned char *freemem; static size_t freemem_size; const unsigned char *inbuf; unsigned char *outbuf; int malloc_count; # ifndef _LIBC transmem_block_t *transmem_list = NULL; # endif __libc_lock_lock (lock); inbuf = (const unsigned char *) result; outbuf = freemem + sizeof (size_t); malloc_count = 0; while (1) { transmem_block_t *newmem; # ifdef _LIBC size_t non_reversible; int res; if (freemem_size < sizeof (size_t)) goto resize_freemem; res = __gconv (domain->conv, &inbuf, inbuf + resultlen, &outbuf, outbuf + freemem_size - sizeof (size_t), &non_reversible); if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT) break; if (res != __GCONV_FULL_OUTPUT) { __libc_lock_unlock (lock); goto converted; } inbuf = result; # else # if HAVE_ICONV const char *inptr = (const char *) inbuf; size_t inleft = resultlen; char *outptr = (char *) outbuf; size_t outleft; if (freemem_size < sizeof (size_t)) goto resize_freemem; outleft = freemem_size - sizeof (size_t); if (iconv (domain->conv, (ICONV_CONST char **) &inptr, &inleft, &outptr, &outleft) != (size_t) (-1)) { outbuf = (unsigned char *) outptr; break; } if (errno != E2BIG) { __libc_lock_unlock (lock); goto converted; } # endif # endif resize_freemem: /* We must allocate a new buffer or resize the old one. */ if (malloc_count > 0) { ++malloc_count; freemem_size = malloc_count * INITIAL_BLOCK_SIZE; newmem = (transmem_block_t *) realloc (transmem_list, freemem_size); # ifdef _LIBC if (newmem != NULL) transmem_list = transmem_list->next; else { struct transmem_list *old = transmem_list; transmem_list = transmem_list->next; free (old); } # endif } else { malloc_count = 1; freemem_size = INITIAL_BLOCK_SIZE; newmem = (transmem_block_t *) malloc (freemem_size); } if (__builtin_expect (newmem == NULL, 0)) { freemem = NULL; freemem_size = 0; __libc_lock_unlock (lock); goto converted; } # ifdef _LIBC /* Add the block to the list of blocks we have to free at some point. */ newmem->next = transmem_list; transmem_list = newmem; freemem = newmem->data; freemem_size -= offsetof (struct transmem_list, data); # else transmem_list = newmem; freemem = newmem; # endif outbuf = freemem + sizeof (size_t); } /* We have now in our buffer a converted string. Put this into the table of conversions. */ *(size_t *) freemem = outbuf - freemem - sizeof (size_t); domain->conv_tab[act] = (char *) freemem; /* Shrink freemem, but keep it aligned. */ freemem_size -= outbuf - freemem; freemem = outbuf; freemem += freemem_size & (alignof (size_t) - 1); freemem_size = freemem_size & ~ (alignof (size_t) - 1); __libc_lock_unlock (lock); } /* Now domain->conv_tab[act] contains the translation of all the plural variants. */ result = domain->conv_tab[act] + sizeof (size_t); resultlen = *(size_t *) domain->conv_tab[act]; } converted: /* The result string is converted. */ #endif /* _LIBC || HAVE_ICONV */ *lengthp = resultlen; return result; } /* Look up a plural variant. */ static char * internal_function plural_lookup (struct loaded_l10nfile *domain, unsigned long int n, const char *translation, size_t translation_len) { struct loaded_domain *domaindata = (struct loaded_domain *) domain->data; unsigned long int index; const char *p; index = plural_eval (domaindata->plural, n); if (index >= domaindata->nplurals) /* This should never happen. It means the plural expression and the given maximum value do not match. */ index = 0; /* Skip INDEX strings at TRANSLATION. */ p = translation; while (index-- > 0) { #ifdef _LIBC p = __rawmemchr (p, '\0'); #else p = strchr (p, '\0'); #endif /* And skip over the NUL byte. */ p++; if (p >= translation + translation_len) /* This should never happen. It means the plural expression evaluated to a value larger than the number of variants available for MSGID1. */ return (char *) translation; } return (char *) p; } #ifndef _LIBC /* Return string representation of locale CATEGORY. */ static const char * internal_function category_to_name (int category) { const char *retval; switch (category) { #ifdef LC_COLLATE case LC_COLLATE: retval = "LC_COLLATE"; break; #endif #ifdef LC_CTYPE case LC_CTYPE: retval = "LC_CTYPE"; break; #endif #ifdef LC_MONETARY case LC_MONETARY: retval = "LC_MONETARY"; break; #endif #ifdef LC_NUMERIC case LC_NUMERIC: retval = "LC_NUMERIC"; break; #endif #ifdef LC_TIME case LC_TIME: retval = "LC_TIME"; break; #endif #ifdef LC_MESSAGES case LC_MESSAGES: retval = "LC_MESSAGES"; break; #endif #ifdef LC_RESPONSE case LC_RESPONSE: retval = "LC_RESPONSE"; break; #endif #ifdef LC_ALL case LC_ALL: /* This might not make sense but is perhaps better than any other value. */ retval = "LC_ALL"; break; #endif default: /* If you have a better idea for a default value let me know. */ retval = "LC_XXX"; } return retval; } #endif /* Guess value of current locale from value of the environment variables or system-dependent defaults. */ static const char * internal_function guess_category_value (int category, const char *categoryname) { const char *language; const char *locale; #ifndef _LIBC const char *language_default; int locale_defaulted; #endif /* We use the settings in the following order: 1. The value of the environment variable 'LANGUAGE'. This is a GNU extension. Its value can be a colon-separated list of locale names. 2. The value of the environment variable 'LC_ALL', 'LC_xxx', or 'LANG'. More precisely, the first among these that is set to a non-empty value. This is how POSIX specifies it. The value is a single locale name. 3. A system-dependent preference list of languages. Its value can be a colon-separated list of locale names. 4. A system-dependent default locale name. This way: - System-dependent settings can be overridden by environment variables. - If the system provides both a list of languages and a default locale, the former is used. */ /* Fetch the locale name, through the POSIX method of looking to `LC_ALL', `LC_xxx', and `LANG'. On some systems this can be done by the `setlocale' function itself. */ #ifdef _LIBC locale = __current_locale_name (category); #else locale = _nl_locale_name_posix (category, categoryname); locale_defaulted = 0; if (locale == NULL) { locale = _nl_locale_name_default (); locale_defaulted = 1; } #endif /* Ignore LANGUAGE and its system-dependent analogon if the locale is set to "C" because 1. "C" locale usually uses the ASCII encoding, and most international messages use non-ASCII characters. These characters get displayed as question marks (if using glibc's iconv()) or as invalid 8-bit characters (because other iconv()s refuse to convert most non-ASCII characters to ASCII). In any case, the output is ugly. 2. The precise output of some programs in the "C" locale is specified by POSIX and should not depend on environment variables like "LANGUAGE" or system-dependent information. We allow such programs to use gettext(). */ if (strcmp (locale, "C") == 0) return locale; /* The highest priority value is the value of the 'LANGUAGE' environment variable. */ language = getenv ("LANGUAGE"); if (language != NULL && language[0] != '\0') return language; #ifndef _LIBC /* The next priority value is the locale name, if not defaulted. */ if (locale_defaulted) { /* The next priority value is the default language preferences list. */ language_default = _nl_language_preferences_default (); if (language_default != NULL) return language_default; } /* The least priority value is the locale name, if defaulted. */ #endif return locale; } /* @@ begin of epilog @@ */ /* We don't want libintl.a to depend on any other library. So we avoid the non-standard function stpcpy. In GNU C Library this function is available, though. Also allow the symbol HAVE_STPCPY to be defined. */ #if !_LIBC && !HAVE_STPCPY static char * stpcpy (char *dest, const char *src) { while ((*dest++ = *src++) != '\0') /* Do nothing. */ ; return dest - 1; } #endif #if !_LIBC && !HAVE_MEMPCPY static void * mempcpy (void *dest, const void *src, size_t n) { return (void *) ((char *) memcpy (dest, src, n) + n); } #endif #ifdef _LIBC /* If we want to free all resources we have to do some work at program's end. */ libc_freeres_fn (free_mem) { void *old; while (_nl_domain_bindings != NULL) { struct binding *oldp = _nl_domain_bindings; _nl_domain_bindings = _nl_domain_bindings->next; if (oldp->dirname != INTUSE(_nl_default_dirname)) /* Yes, this is a pointer comparison. */ free (oldp->dirname); free (oldp->codeset); free (oldp); } if (_nl_current_default_domain != _nl_default_default_domain) /* Yes, again a pointer comparison. */ free ((char *) _nl_current_default_domain); /* Remove the search tree with the known translations. */ __tdestroy (root, free); root = NULL; while (transmem_list != NULL) { old = transmem_list; transmem_list = transmem_list->next; free (old); } } #endif centerim-4.22.10/intl/localcharset.h0000644000175000001440000000256311473011430014166 00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2003 Free Software Foundation, Inc. This file is part of the GNU CHARSET Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LOCALCHARSET_H #define _LOCALCHARSET_H #ifdef __cplusplus extern "C" { #endif /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ extern const char * locale_charset (void); #ifdef __cplusplus } #endif #endif /* _LOCALCHARSET_H */ centerim-4.22.10/intl/textdomain.c0000644000175000001440000001066411473011430013672 00000000000000/* Implementation of the textdomain(3) function. Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include "gettextP.h" #ifdef _LIBC /* We have to handle multi-threaded applications. */ # include #else /* Provide dummy implementation if this is outside glibc. */ # define __libc_rwlock_define(CLASS, NAME) # define __libc_rwlock_wrlock(NAME) # define __libc_rwlock_unlock(NAME) #endif /* The internal variables in the standalone libintl.a must have different names than the internal variables in GNU libc, otherwise programs using libintl.a cannot be linked statically. */ #if !defined _LIBC # define _nl_default_default_domain libintl_nl_default_default_domain # define _nl_current_default_domain libintl_nl_current_default_domain #endif /* @@ end of prolog @@ */ /* Name of the default text domain. */ extern const char _nl_default_default_domain[] attribute_hidden; /* Default text domain in which entries for gettext(3) are to be found. */ extern const char *_nl_current_default_domain attribute_hidden; /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define TEXTDOMAIN __textdomain # ifndef strdup # define strdup(str) __strdup (str) # endif #else # define TEXTDOMAIN libintl_textdomain #endif /* Lock variable to protect the global data in the gettext implementation. */ __libc_rwlock_define (extern, _nl_state_lock attribute_hidden) /* Set the current default message catalog to DOMAINNAME. If DOMAINNAME is null, return the current default. If DOMAINNAME is "", reset to the default of "messages". */ char * TEXTDOMAIN (const char *domainname) { char *new_domain; char *old_domain; /* A NULL pointer requests the current setting. */ if (domainname == NULL) return (char *) _nl_current_default_domain; __libc_rwlock_wrlock (_nl_state_lock); old_domain = (char *) _nl_current_default_domain; /* If domain name is the null string set to default domain "messages". */ if (domainname[0] == '\0' || strcmp (domainname, _nl_default_default_domain) == 0) { _nl_current_default_domain = _nl_default_default_domain; new_domain = (char *) _nl_current_default_domain; } else if (strcmp (domainname, old_domain) == 0) /* This can happen and people will use it to signal that some environment variable changed. */ new_domain = old_domain; else { /* If the following malloc fails `_nl_current_default_domain' will be NULL. This value will be returned and so signals we are out of core. */ #if defined _LIBC || defined HAVE_STRDUP new_domain = strdup (domainname); #else size_t len = strlen (domainname) + 1; new_domain = (char *) malloc (len); if (new_domain != NULL) memcpy (new_domain, domainname, len); #endif if (new_domain != NULL) _nl_current_default_domain = new_domain; } /* We use this possibility to signal a change of the loaded catalogs since this is most likely the case and there is no other easy we to do it. Do it only when the call was successful. */ if (new_domain != NULL) { ++_nl_msg_cat_cntr; if (old_domain != new_domain && old_domain != _nl_default_default_domain) free (old_domain); } __libc_rwlock_unlock (_nl_state_lock); return new_domain; } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__textdomain, textdomain); #endif centerim-4.22.10/intl/libgnuintl.h.in0000644000175000001440000003117211473011430014274 00000000000000/* Message catalogs for internationalization. Copyright (C) 1995-1997, 2000-2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LIBINTL_H #define _LIBINTL_H 1 #include /* The LC_MESSAGES locale category is the category used by the functions gettext() and dgettext(). It is specified in POSIX, but not in ANSI C. On systems that don't define it, use an arbitrary value instead. On Solaris, defines __LOCALE_H (or _LOCALE_H in Solaris 2.5) then includes (i.e. this file!) and then only defines LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES in this case. */ #if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun)) # define LC_MESSAGES 1729 #endif /* We define an additional symbol to signal that we use the GNU implementation of gettext. */ #define __USE_GNU_GETTEXT 1 /* Provide information about the supported file formats. Returns the maximum minor revision number supported for a given major revision. */ #define __GNU_GETTEXT_SUPPORTED_REVISION(major) \ ((major) == 0 || (major) == 1 ? 1 : -1) /* Resolve a platform specific conflict on DJGPP. GNU gettext takes precedence over _conio_gettext. */ #ifdef __DJGPP__ # undef gettext #endif #ifdef __cplusplus extern "C" { #endif /* We redirect the functions to those prefixed with "libintl_". This is necessary, because some systems define gettext/textdomain/... in the C library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer). If we used the unprefixed names, there would be cases where the definition in the C library would override the one in the libintl.so shared library. Recall that on ELF systems, the symbols are looked up in the following order: 1. in the executable, 2. in the shared libraries specified on the link command line, in order, 3. in the dependencies of the shared libraries specified on the link command line, 4. in the dlopen()ed shared libraries, in the order in which they were dlopen()ed. The definition in the C library would override the one in libintl.so if either * -lc is given on the link command line and -lintl isn't, or * -lc is given on the link command line before -lintl, or * libintl.so is a dependency of a dlopen()ed shared library but not linked to the executable at link time. Since Solaris gettext() behaves differently than GNU gettext(), this would be unacceptable. The redirection happens by default through macros in C, so that &gettext is independent of the compilation unit, but through inline functions in C++, in order not to interfere with the name mangling of class fields or class methods called 'gettext'. */ /* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS. If he doesn't, we choose the method. A third possible method is _INTL_REDIRECT_ASM, supported only by GCC. */ #if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS) # if __GNUC__ >= 2 && !defined __APPLE_CC__ && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus) # define _INTL_REDIRECT_ASM # else # ifdef __cplusplus # define _INTL_REDIRECT_INLINE # else # define _INTL_REDIRECT_MACROS # endif # endif #endif /* Auxiliary macros. */ #ifdef _INTL_REDIRECT_ASM # define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname)) # define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring # define _INTL_STRINGIFY(prefix) #prefix #else # define _INTL_ASM(cname) #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_gettext (const char *__msgid); static inline char *gettext (const char *__msgid) { return libintl_gettext (__msgid); } #else #ifdef _INTL_REDIRECT_MACROS # define gettext libintl_gettext #endif extern char *gettext (const char *__msgid) _INTL_ASM (libintl_gettext); #endif /* Look up MSGID in the DOMAINNAME message catalog for the current LC_MESSAGES locale. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_dgettext (const char *__domainname, const char *__msgid); static inline char *dgettext (const char *__domainname, const char *__msgid) { return libintl_dgettext (__domainname, __msgid); } #else #ifdef _INTL_REDIRECT_MACROS # define dgettext libintl_dgettext #endif extern char *dgettext (const char *__domainname, const char *__msgid) _INTL_ASM (libintl_dgettext); #endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_dcgettext (const char *__domainname, const char *__msgid, int __category); static inline char *dcgettext (const char *__domainname, const char *__msgid, int __category) { return libintl_dcgettext (__domainname, __msgid, __category); } #else #ifdef _INTL_REDIRECT_MACROS # define dcgettext libintl_dcgettext #endif extern char *dcgettext (const char *__domainname, const char *__msgid, int __category) _INTL_ASM (libintl_dcgettext); #endif /* Similar to `gettext' but select the plural form corresponding to the number N. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2, unsigned long int __n); static inline char *ngettext (const char *__msgid1, const char *__msgid2, unsigned long int __n) { return libintl_ngettext (__msgid1, __msgid2, __n); } #else #ifdef _INTL_REDIRECT_MACROS # define ngettext libintl_ngettext #endif extern char *ngettext (const char *__msgid1, const char *__msgid2, unsigned long int __n) _INTL_ASM (libintl_ngettext); #endif /* Similar to `dgettext' but select the plural form corresponding to the number N. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_dngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n); static inline char *dngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n) { return libintl_dngettext (__domainname, __msgid1, __msgid2, __n); } #else #ifdef _INTL_REDIRECT_MACROS # define dngettext libintl_dngettext #endif extern char *dngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n) _INTL_ASM (libintl_dngettext); #endif /* Similar to `dcgettext' but select the plural form corresponding to the number N. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_dcngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category); static inline char *dcngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category) { return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category); } #else #ifdef _INTL_REDIRECT_MACROS # define dcngettext libintl_dcngettext #endif extern char *dcngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category) _INTL_ASM (libintl_dcngettext); #endif /* Set the current default message catalog to DOMAINNAME. If DOMAINNAME is null, return the current default. If DOMAINNAME is "", reset to the default of "messages". */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_textdomain (const char *__domainname); static inline char *textdomain (const char *__domainname) { return libintl_textdomain (__domainname); } #else #ifdef _INTL_REDIRECT_MACROS # define textdomain libintl_textdomain #endif extern char *textdomain (const char *__domainname) _INTL_ASM (libintl_textdomain); #endif /* Specify that the DOMAINNAME message catalog will be found in DIRNAME rather than in the system locale data base. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_bindtextdomain (const char *__domainname, const char *__dirname); static inline char *bindtextdomain (const char *__domainname, const char *__dirname) { return libintl_bindtextdomain (__domainname, __dirname); } #else #ifdef _INTL_REDIRECT_MACROS # define bindtextdomain libintl_bindtextdomain #endif extern char *bindtextdomain (const char *__domainname, const char *__dirname) _INTL_ASM (libintl_bindtextdomain); #endif /* Specify the character encoding in which the messages from the DOMAINNAME message catalog will be returned. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_bind_textdomain_codeset (const char *__domainname, const char *__codeset); static inline char *bind_textdomain_codeset (const char *__domainname, const char *__codeset) { return libintl_bind_textdomain_codeset (__domainname, __codeset); } #else #ifdef _INTL_REDIRECT_MACROS # define bind_textdomain_codeset libintl_bind_textdomain_codeset #endif extern char *bind_textdomain_codeset (const char *__domainname, const char *__codeset) _INTL_ASM (libintl_bind_textdomain_codeset); #endif /* Support for format strings with positions in *printf(), following the POSIX/XSI specification. Note: These replacements for the *printf() functions are visible only in source files that #include or #include "gettext.h". Packages that use *printf() in source files that don't refer to _() or gettext() but for which the format string could be the return value of _() or gettext() need to add this #include. Oh well. */ #if !@HAVE_POSIX_PRINTF@ #include #include /* Get va_list. */ #if __STDC__ || defined __cplusplus || defined _MSC_VER # include #else # include #endif #undef fprintf #define fprintf libintl_fprintf extern int fprintf (FILE *, const char *, ...); #undef vfprintf #define vfprintf libintl_vfprintf extern int vfprintf (FILE *, const char *, va_list); #undef printf #define printf libintl_printf extern int printf (const char *, ...); #undef vprintf #define vprintf libintl_vprintf extern int vprintf (const char *, va_list); #undef sprintf #define sprintf libintl_sprintf extern int sprintf (char *, const char *, ...); #undef vsprintf #define vsprintf libintl_vsprintf extern int vsprintf (char *, const char *, va_list); #if @HAVE_SNPRINTF@ #undef snprintf #define snprintf libintl_snprintf extern int snprintf (char *, size_t, const char *, ...); #undef vsnprintf #define vsnprintf libintl_vsnprintf extern int vsnprintf (char *, size_t, const char *, va_list); #endif #if @HAVE_ASPRINTF@ #undef asprintf #define asprintf libintl_asprintf extern int asprintf (char **, const char *, ...); #undef vasprintf #define vasprintf libintl_vasprintf extern int vasprintf (char **, const char *, va_list); #endif #if @HAVE_WPRINTF@ #undef fwprintf #define fwprintf libintl_fwprintf extern int fwprintf (FILE *, const wchar_t *, ...); #undef vfwprintf #define vfwprintf libintl_vfwprintf extern int vfwprintf (FILE *, const wchar_t *, va_list); #undef wprintf #define wprintf libintl_wprintf extern int wprintf (const wchar_t *, ...); #undef vwprintf #define vwprintf libintl_vwprintf extern int vwprintf (const wchar_t *, va_list); #undef swprintf #define swprintf libintl_swprintf extern int swprintf (wchar_t *, size_t, const wchar_t *, ...); #undef vswprintf #define vswprintf libintl_vswprintf extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list); #endif #endif /* Support for relocatable packages. */ /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ #define libintl_set_relocation_prefix libintl_set_relocation_prefix extern void libintl_set_relocation_prefix (const char *orig_prefix, const char *curr_prefix); #ifdef __cplusplus } #endif #endif /* libintl.h */ centerim-4.22.10/intl/localealias.c0000644000175000001440000002334411473011430013766 00000000000000/* Handle aliases for locale names. Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Tell glibc's to provide a prototype for mempcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #if defined _LIBC || defined HAVE___FSETLOCKING # include #endif #include #ifdef __GNUC__ # undef alloca # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # ifdef _MSC_VER # include # define alloca _alloca # else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif # endif #endif #include #include #include "gettextP.h" #if ENABLE_RELOCATABLE # include "relocatable.h" #else # define relocate(pathname) (pathname) #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # define strcasecmp __strcasecmp # ifndef mempcpy # define mempcpy __mempcpy # endif # define HAVE_MEMPCPY 1 # define HAVE___FSETLOCKING 1 /* We need locking here since we can be called from different places. */ # include __libc_lock_define_initialized (static, lock); #endif #ifndef internal_function # define internal_function #endif /* Some optimizations for glibc. */ #ifdef _LIBC # define FEOF(fp) feof_unlocked (fp) # define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp) #else # define FEOF(fp) feof (fp) # define FGETS(buf, n, fp) fgets (buf, n, fp) #endif /* For those losing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA # define freea(p) /* nothing */ #else # define alloca(n) malloc (n) # define freea(p) free (p) #endif #if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED # undef fgets # define fgets(buf, len, s) fgets_unlocked (buf, len, s) #endif #if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED # undef feof # define feof(s) feof_unlocked (s) #endif struct alias_map { const char *alias; const char *value; }; #ifndef _LIBC # define libc_freeres_ptr(decl) decl #endif libc_freeres_ptr (static char *string_space); static size_t string_space_act; static size_t string_space_max; libc_freeres_ptr (static struct alias_map *map); static size_t nmap; static size_t maxmap; /* Prototypes for local functions. */ static size_t read_alias_file (const char *fname, int fname_len) internal_function; static int extend_alias_table (void); static int alias_compare (const struct alias_map *map1, const struct alias_map *map2); const char * _nl_expand_alias (const char *name) { static const char *locale_alias_path; struct alias_map *retval; const char *result = NULL; size_t added; #ifdef _LIBC __libc_lock_lock (lock); #endif if (locale_alias_path == NULL) locale_alias_path = LOCALE_ALIAS_PATH; do { struct alias_map item; item.alias = name; if (nmap > 0) retval = (struct alias_map *) bsearch (&item, map, nmap, sizeof (struct alias_map), (int (*) (const void *, const void *) ) alias_compare); else retval = NULL; /* We really found an alias. Return the value. */ if (retval != NULL) { result = retval->value; break; } /* Perhaps we can find another alias file. */ added = 0; while (added == 0 && locale_alias_path[0] != '\0') { const char *start; while (locale_alias_path[0] == PATH_SEPARATOR) ++locale_alias_path; start = locale_alias_path; while (locale_alias_path[0] != '\0' && locale_alias_path[0] != PATH_SEPARATOR) ++locale_alias_path; if (start < locale_alias_path) added = read_alias_file (start, locale_alias_path - start); } } while (added != 0); #ifdef _LIBC __libc_lock_unlock (lock); #endif return result; } static size_t internal_function read_alias_file (const char *fname, int fname_len) { FILE *fp; char *full_fname; size_t added; static const char aliasfile[] = "/locale.alias"; full_fname = (char *) alloca (fname_len + sizeof aliasfile); #ifdef HAVE_MEMPCPY mempcpy (mempcpy (full_fname, fname, fname_len), aliasfile, sizeof aliasfile); #else memcpy (full_fname, fname, fname_len); memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); #endif fp = fopen (relocate (full_fname), "r"); freea (full_fname); if (fp == NULL) return 0; #ifdef HAVE___FSETLOCKING /* No threads present. */ __fsetlocking (fp, FSETLOCKING_BYCALLER); #endif added = 0; while (!FEOF (fp)) { /* It is a reasonable approach to use a fix buffer here because a) we are only interested in the first two fields b) these fields must be usable as file names and so must not be that long We avoid a multi-kilobyte buffer here since this would use up stack space which we might not have if the program ran out of memory. */ char buf[400]; char *alias; char *value; char *cp; if (FGETS (buf, sizeof buf, fp) == NULL) /* EOF reached. */ break; cp = buf; /* Ignore leading white space. */ while (isspace ((unsigned char) cp[0])) ++cp; /* A leading '#' signals a comment line. */ if (cp[0] != '\0' && cp[0] != '#') { alias = cp++; while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) ++cp; /* Terminate alias name. */ if (cp[0] != '\0') *cp++ = '\0'; /* Now look for the beginning of the value. */ while (isspace ((unsigned char) cp[0])) ++cp; if (cp[0] != '\0') { size_t alias_len; size_t value_len; value = cp++; while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) ++cp; /* Terminate value. */ if (cp[0] == '\n') { /* This has to be done to make the following test for the end of line possible. We are looking for the terminating '\n' which do not overwrite here. */ *cp++ = '\0'; *cp = '\n'; } else if (cp[0] != '\0') *cp++ = '\0'; if (nmap >= maxmap) if (__builtin_expect (extend_alias_table (), 0)) return added; alias_len = strlen (alias) + 1; value_len = strlen (value) + 1; if (string_space_act + alias_len + value_len > string_space_max) { /* Increase size of memory pool. */ size_t new_size = (string_space_max + (alias_len + value_len > 1024 ? alias_len + value_len : 1024)); char *new_pool = (char *) realloc (string_space, new_size); if (new_pool == NULL) return added; if (__builtin_expect (string_space != new_pool, 0)) { size_t i; for (i = 0; i < nmap; i++) { map[i].alias += new_pool - string_space; map[i].value += new_pool - string_space; } } string_space = new_pool; string_space_max = new_size; } map[nmap].alias = memcpy (&string_space[string_space_act], alias, alias_len); string_space_act += alias_len; map[nmap].value = memcpy (&string_space[string_space_act], value, value_len); string_space_act += value_len; ++nmap; ++added; } } /* Possibly not the whole line fits into the buffer. Ignore the rest of the line. */ while (strchr (buf, '\n') == NULL) if (FGETS (buf, sizeof buf, fp) == NULL) /* Make sure the inner loop will be left. The outer loop will exit at the `feof' test. */ break; } /* Should we test for ferror()? I think we have to silently ignore errors. --drepper */ fclose (fp); if (added > 0) qsort (map, nmap, sizeof (struct alias_map), (int (*) (const void *, const void *)) alias_compare); return added; } static int extend_alias_table () { size_t new_size; struct alias_map *new_map; new_size = maxmap == 0 ? 100 : 2 * maxmap; new_map = (struct alias_map *) realloc (map, (new_size * sizeof (struct alias_map))); if (new_map == NULL) /* Simply don't extend: we don't have any more core. */ return -1; map = new_map; maxmap = new_size; return 0; } static int alias_compare (const struct alias_map *map1, const struct alias_map *map2) { #if defined _LIBC || defined HAVE_STRCASECMP return strcasecmp (map1->alias, map2->alias); #else const unsigned char *p1 = (const unsigned char *) map1->alias; const unsigned char *p2 = (const unsigned char *) map2->alias; unsigned char c1, c2; if (p1 == p2) return 0; do { /* I know this seems to be odd but the tolower() function in some systems libc cannot handle nonalpha characters. */ c1 = isupper (*p1) ? tolower (*p1) : *p1; c2 = isupper (*p2) ? tolower (*p2) : *p2; if (c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); return c1 - c2; #endif } centerim-4.22.10/intl/plural.c0000644000175000001440000011055011473011430013010 00000000000000/* A Bison parser, made from plural.y by GNU bison 1.35. */ #define YYBISON 1 /* Identify Bison output. */ #define yyparse __gettextparse #define yylex __gettextlex #define yyerror __gettexterror #define yylval __gettextlval #define yychar __gettextchar #define yydebug __gettextdebug #define yynerrs __gettextnerrs # define EQUOP2 257 # define CMPOP2 258 # define ADDOP2 259 # define MULOP2 260 # define NUMBER 261 #line 1 "plural.y" /* Expression parsing for plural form selection. Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* The bison generated parser uses alloca. AIX 3 forces us to put this declaration at the beginning of the file. The declaration in bison's skeleton file comes too late. This must come before because may include arbitrary system headers. */ #if defined _AIX && !defined __GNUC__ #pragma alloca #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #include "plural-exp.h" /* The main function generated by the parser is called __gettextparse, but we want it to be called PLURAL_PARSE. */ #ifndef _LIBC # define __gettextparse PLURAL_PARSE #endif #define YYLEX_PARAM &((struct parse_args *) arg)->cp #define YYPARSE_PARAM arg #line 49 "plural.y" #ifndef YYSTYPE typedef union { unsigned long int num; enum operator op; struct expression *exp; } yystype; # define YYSTYPE yystype # define YYSTYPE_IS_TRIVIAL 1 #endif #line 55 "plural.y" /* Prototypes for local functions. */ static int yylex (YYSTYPE *lval, const char **pexp); static void yyerror (const char *str); /* Allocation of expressions. */ static struct expression * new_exp (int nargs, enum operator op, struct expression * const *args) { int i; struct expression *newp; /* If any of the argument could not be malloc'ed, just return NULL. */ for (i = nargs - 1; i >= 0; i--) if (args[i] == NULL) goto fail; /* Allocate a new expression. */ newp = (struct expression *) malloc (sizeof (*newp)); if (newp != NULL) { newp->nargs = nargs; newp->operation = op; for (i = nargs - 1; i >= 0; i--) newp->val.args[i] = args[i]; return newp; } fail: for (i = nargs - 1; i >= 0; i--) FREE_EXPRESSION (args[i]); return NULL; } static inline struct expression * new_exp_0 (enum operator op) { return new_exp (0, op, NULL); } static inline struct expression * new_exp_1 (enum operator op, struct expression *right) { struct expression *args[1]; args[0] = right; return new_exp (1, op, args); } static struct expression * new_exp_2 (enum operator op, struct expression *left, struct expression *right) { struct expression *args[2]; args[0] = left; args[1] = right; return new_exp (2, op, args); } static inline struct expression * new_exp_3 (enum operator op, struct expression *bexp, struct expression *tbranch, struct expression *fbranch) { struct expression *args[3]; args[0] = bexp; args[1] = tbranch; args[2] = fbranch; return new_exp (3, op, args); } #ifndef YYDEBUG # define YYDEBUG 0 #endif #define YYFINAL 27 #define YYFLAG -32768 #define YYNTBASE 16 /* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */ #define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18) /* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */ static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 5, 2, 14, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 6, 7, 8, 9, 11 }; #if YYDEBUG static const short yyprhs[] = { 0, 0, 2, 8, 12, 16, 20, 24, 28, 32, 35, 37, 39 }; static const short yyrhs[] = { 17, 0, 17, 3, 17, 12, 17, 0, 17, 4, 17, 0, 17, 5, 17, 0, 17, 6, 17, 0, 17, 7, 17, 0, 17, 8, 17, 0, 17, 9, 17, 0, 10, 17, 0, 13, 0, 11, 0, 14, 17, 15, 0 }; #endif #if YYDEBUG /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const short yyrline[] = { 0, 150, 158, 162, 166, 170, 174, 178, 182, 186, 190, 194, 199 }; #endif #if (YYDEBUG) || defined YYERROR_VERBOSE /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */ static const char *const yytname[] = { "$", "error", "$undefined.", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2", "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'", "start", "exp", 0 }; #endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const short yyr1[] = { 0, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const short yyr2[] = { 0, 1, 5, 3, 3, 3, 3, 3, 3, 2, 1, 1, 3 }; /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const short yydefact[] = { 0, 0, 11, 10, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 3, 4, 5, 6, 7, 8, 0, 2, 0, 0, 0 }; static const short yydefgoto[] = { 25, 5 }; static const short yypact[] = { -9, -9,-32768,-32768, -9, 34,-32768, 11, -9, -9, -9, -9, -9, -9, -9,-32768, 24, 39, 43, 16, 26, -3,-32768, -9, 34, 21, 53,-32768 }; static const short yypgoto[] = { -32768, -1 }; #define YYLAST 53 static const short yytable[] = { 6, 1, 2, 7, 3, 4, 14, 16, 17, 18, 19, 20, 21, 22, 8, 9, 10, 11, 12, 13, 14, 26, 24, 12, 13, 14, 15, 8, 9, 10, 11, 12, 13, 14, 13, 14, 23, 8, 9, 10, 11, 12, 13, 14, 10, 11, 12, 13, 14, 11, 12, 13, 14, 27 }; static const short yycheck[] = { 1, 10, 11, 4, 13, 14, 9, 8, 9, 10, 11, 12, 13, 14, 3, 4, 5, 6, 7, 8, 9, 0, 23, 7, 8, 9, 15, 3, 4, 5, 6, 7, 8, 9, 8, 9, 12, 3, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 6, 7, 8, 9, 0 }; #define YYPURE 1 /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "bison.simple" /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. 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, 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. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ #if ! defined (yyoverflow) || defined (YYERROR_VERBOSE) /* The parser invokes alloca or malloc; define the necessary symbols. */ # if YYSTACK_USE_ALLOCA # define YYSTACK_ALLOC alloca # else # ifndef YYSTACK_USE_ALLOCA # if defined (alloca) || defined (_ALLOCA_H) # define YYSTACK_ALLOC alloca # else # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # else # if defined (__STDC__) || defined (__cplusplus) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # endif # define YYSTACK_ALLOC malloc # define YYSTACK_FREE free # endif #endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */ #if (! defined (yyoverflow) \ && (! defined (__cplusplus) \ || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { short yyss; YYSTYPE yyvs; # if YYLSP_NEEDED YYLTYPE yyls; # endif }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # if YYLSP_NEEDED # define YYSTACK_BYTES(N) \ ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + 2 * YYSTACK_GAP_MAX) # else # define YYSTACK_BYTES(N) \ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAX) # endif /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ register YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (0) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (0) #endif #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) # define YYSIZE_T __SIZE_TYPE__ #endif #if ! defined (YYSIZE_T) && defined (size_t) # define YYSIZE_T size_t #endif #if ! defined (YYSIZE_T) # if defined (__STDC__) || defined (__cplusplus) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # endif #endif #if ! defined (YYSIZE_T) # define YYSIZE_T unsigned int #endif #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ { \ yyerror ("syntax error: cannot back up"); \ YYERROR; \ } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Compute the default location (before the actions are run). When YYLLOC_DEFAULT is run, CURRENT is set the location of the first token. By default, to implement support for ranges, extend its range to the last symbol. */ #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ Current.last_line = Rhs[N].last_line; \ Current.last_column = Rhs[N].last_column; #endif /* YYLEX -- calling `yylex' with the right arguments. */ #if YYPURE # if YYLSP_NEEDED # ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM) # else # define YYLEX yylex (&yylval, &yylloc) # endif # else /* !YYLSP_NEEDED */ # ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) # else # define YYLEX yylex (&yylval) # endif # endif /* !YYLSP_NEEDED */ #else /* !YYPURE */ # define YYLEX yylex () #endif /* !YYPURE */ /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #if YYMAXDEPTH == 0 # undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #ifdef YYERROR_VERBOSE # ifndef yystrlen # if defined (__GLIBC__) && defined (_STRING_H) # define yystrlen strlen # else /* Return the length of YYSTR. */ static YYSIZE_T # if defined (__STDC__) || defined (__cplusplus) yystrlen (const char *yystr) # else yystrlen (yystr) const char *yystr; # endif { register const char *yys = yystr; while (*yys++ != '\0') continue; return yys - yystr - 1; } # endif # endif # ifndef yystpcpy # if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * # if defined (__STDC__) || defined (__cplusplus) yystpcpy (char *yydest, const char *yysrc) # else yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; # endif { register char *yyd = yydest; register const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif #endif #line 315 "bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. It should actually point to an object. Grammar actions can access the variable by casting it to the proper pointer type. */ #ifdef YYPARSE_PARAM # if defined (__STDC__) || defined (__cplusplus) # define YYPARSE_PARAM_ARG void *YYPARSE_PARAM # define YYPARSE_PARAM_DECL # else # define YYPARSE_PARAM_ARG YYPARSE_PARAM # define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; # endif #else /* !YYPARSE_PARAM */ # define YYPARSE_PARAM_ARG # define YYPARSE_PARAM_DECL #endif /* !YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ # ifdef YYPARSE_PARAM int yyparse (void *); # else int yyparse (void); # endif #endif /* YY_DECL_VARIABLES -- depending whether we use a pure parser, variables are global, or local to YYPARSE. */ #define YY_DECL_NON_LSP_VARIABLES \ /* The lookahead symbol. */ \ int yychar; \ \ /* The semantic value of the lookahead symbol. */ \ YYSTYPE yylval; \ \ /* Number of parse errors so far. */ \ int yynerrs; #if YYLSP_NEEDED # define YY_DECL_VARIABLES \ YY_DECL_NON_LSP_VARIABLES \ \ /* Location data for the lookahead symbol. */ \ YYLTYPE yylloc; #else # define YY_DECL_VARIABLES \ YY_DECL_NON_LSP_VARIABLES #endif /* If nonreentrant, generate the variables here. */ #if !YYPURE YY_DECL_VARIABLES #endif /* !YYPURE */ int yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { /* If reentrant, generate the variables here. */ #if YYPURE YY_DECL_VARIABLES #endif /* !YYPURE */ register int yystate; register int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Lookahead token as an internal (translated) token number. */ int yychar1 = 0; /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ short yyssa[YYINITDEPTH]; short *yyss = yyssa; register short *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; register YYSTYPE *yyvsp; #if YYLSP_NEEDED /* The location stack. */ YYLTYPE yylsa[YYINITDEPTH]; YYLTYPE *yyls = yylsa; YYLTYPE *yylsp; #endif #if YYLSP_NEEDED # define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) #else # define YYPOPSTACK (yyvsp--, yyssp--) #endif YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYLSP_NEEDED YYLTYPE yyloc; #endif /* When reducing, the number of symbols on the RHS of the reduced rule. */ int yylen; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; #if YYLSP_NEEDED yylsp = yyls; #endif goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; short *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ # if YYLSP_NEEDED YYLTYPE *yyls1 = yyls; /* This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow ("parser stack overflow", &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yyls1, yysize * sizeof (*yylsp), &yystacksize); yyls = yyls1; # else yyoverflow ("parser stack overflow", &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); # endif yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyoverflowlab; # else /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) goto yyoverflowlab; yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; { short *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyoverflowlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # if YYLSP_NEEDED YYSTACK_RELOCATE (yyls); # endif # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; #if YYLSP_NEEDED yylsp = yyls + yysize - 1; #endif YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyssp >= yyss + yystacksize - 1) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* yyresume: */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yyn == YYFLAG) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } /* Convert token to internal form (in yychar1) for indexing tables with */ if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; yychar = YYEOF; /* Don't call YYLEX any more */ YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yychar1 = YYTRANSLATE (yychar); #if YYDEBUG /* We have to keep this `#if YYDEBUG', since we use variables which are defined only if `YYDEBUG' is set. */ if (yydebug) { YYFPRINTF (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ # ifdef YYPRINT YYPRINT (stderr, yychar, yylval); # endif YYFPRINTF (stderr, ")\n"); } #endif } yyn += yychar1; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) goto yydefault; yyn = yytable[yyn]; /* yyn is what to do for this token type in this state. Negative => reduce, -yyn is rule number. Positive => shift, yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (yyn < 0) { if (yyn == YYFLAG) goto yyerrlab; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ YYDPRINTF ((stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1])); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; #if YYLSP_NEEDED *++yylsp = yylloc; #endif /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; yystate = yyn; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to the semantic value of the lookahead token. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; #if YYLSP_NEEDED /* Similarly for the default location. Let the user run additional commands if for instance locations are ranges. */ yyloc = yylsp[1-yylen]; YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); #endif #if YYDEBUG /* We have to keep this `#if YYDEBUG', since we use variables which are defined only if `YYDEBUG' is set. */ if (yydebug) { int yyi; YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++) YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif switch (yyn) { case 1: #line 151 "plural.y" { if (yyvsp[0].exp == NULL) YYABORT; ((struct parse_args *) arg)->res = yyvsp[0].exp; } break; case 2: #line 159 "plural.y" { yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp); } break; case 3: #line 163 "plural.y" { yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp); } break; case 4: #line 167 "plural.y" { yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp); } break; case 5: #line 171 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); } break; case 6: #line 175 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); } break; case 7: #line 179 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); } break; case 8: #line 183 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); } break; case 9: #line 187 "plural.y" { yyval.exp = new_exp_1 (lnot, yyvsp[0].exp); } break; case 10: #line 191 "plural.y" { yyval.exp = new_exp_0 (var); } break; case 11: #line 195 "plural.y" { if ((yyval.exp = new_exp_0 (num)) != NULL) yyval.exp->val.num = yyvsp[0].num; } break; case 12: #line 200 "plural.y" { yyval.exp = yyvsp[-1].exp; } break; } #line 705 "bison.simple" yyvsp -= yylen; yyssp -= yylen; #if YYLSP_NEEDED yylsp -= yylen; #endif #if YYDEBUG if (yydebug) { short *yyssp1 = yyss - 1; YYFPRINTF (stderr, "state stack now"); while (yyssp1 != yyssp) YYFPRINTF (stderr, " %d", *++yyssp1); YYFPRINTF (stderr, "\n"); } #endif *++yyvsp = yyval; #if YYLSP_NEEDED *++yylsp = yyloc; #endif /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #ifdef YYERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { YYSIZE_T yysize = 0; char *yymsg; int yyx, yycount; yycount = 0; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ for (yyx = yyn < 0 ? -yyn : 0; yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) if (yycheck[yyx + yyn] == yyx) yysize += yystrlen (yytname[yyx]) + 15, yycount++; yysize += yystrlen ("parse error, unexpected ") + 1; yysize += yystrlen (yytname[YYTRANSLATE (yychar)]); yymsg = (char *) YYSTACK_ALLOC (yysize); if (yymsg != 0) { char *yyp = yystpcpy (yymsg, "parse error, unexpected "); yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]); if (yycount < 5) { yycount = 0; for (yyx = yyn < 0 ? -yyn : 0; yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) if (yycheck[yyx + yyn] == yyx) { const char *yyq = ! yycount ? ", expecting " : " or "; yyp = yystpcpy (yyp, yyq); yyp = yystpcpy (yyp, yytname[yyx]); yycount++; } } yyerror (yymsg); YYSTACK_FREE (yymsg); } else yyerror ("parse error; also virtual memory exhausted"); } else #endif /* defined (YYERROR_VERBOSE) */ yyerror ("parse error"); } goto yyerrlab1; /*--------------------------------------------------. | yyerrlab1 -- error raised explicitly by an action | `--------------------------------------------------*/ yyerrlab1: if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (yychar == YYEOF) YYABORT; YYDPRINTF ((stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1])); yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ goto yyerrhandle; /*-------------------------------------------------------------------. | yyerrdefault -- current state does not do anything special for the | | error token. | `-------------------------------------------------------------------*/ yyerrdefault: #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ /* If its default is to accept any token, ok. Otherwise pop it. */ yyn = yydefact[yystate]; if (yyn) goto yydefault; #endif /*---------------------------------------------------------------. | yyerrpop -- pop the current state because it cannot handle the | | error token | `---------------------------------------------------------------*/ yyerrpop: if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp; #if YYLSP_NEEDED yylsp--; #endif #if YYDEBUG if (yydebug) { short *yyssp1 = yyss - 1; YYFPRINTF (stderr, "Error: state stack now"); while (yyssp1 != yyssp) YYFPRINTF (stderr, " %d", *++yyssp1); YYFPRINTF (stderr, "\n"); } #endif /*--------------. | yyerrhandle. | `--------------*/ yyerrhandle: yyn = yypact[yystate]; if (yyn == YYFLAG) goto yyerrdefault; yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) goto yyerrdefault; yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) goto yyerrpop; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; #if YYLSP_NEEDED *++yylsp = yylloc; #endif yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; /*---------------------------------------------. | yyoverflowab -- parser overflow comes here. | `---------------------------------------------*/ yyoverflowlab: yyerror ("parser stack overflow"); yyresult = 2; /* Fall through. */ yyreturn: #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif return yyresult; } #line 205 "plural.y" void internal_function FREE_EXPRESSION (struct expression *exp) { if (exp == NULL) return; /* Handle the recursive case. */ switch (exp->nargs) { case 3: FREE_EXPRESSION (exp->val.args[2]); /* FALLTHROUGH */ case 2: FREE_EXPRESSION (exp->val.args[1]); /* FALLTHROUGH */ case 1: FREE_EXPRESSION (exp->val.args[0]); /* FALLTHROUGH */ default: break; } free (exp); } static int yylex (YYSTYPE *lval, const char **pexp) { const char *exp = *pexp; int result; while (1) { if (exp[0] == '\0') { *pexp = exp; return YYEOF; } if (exp[0] != ' ' && exp[0] != '\t') break; ++exp; } result = *exp++; switch (result) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { unsigned long int n = result - '0'; while (exp[0] >= '0' && exp[0] <= '9') { n *= 10; n += exp[0] - '0'; ++exp; } lval->num = n; result = NUMBER; } break; case '=': if (exp[0] == '=') { ++exp; lval->op = equal; result = EQUOP2; } else result = YYERRCODE; break; case '!': if (exp[0] == '=') { ++exp; lval->op = not_equal; result = EQUOP2; } break; case '&': case '|': if (exp[0] == result) ++exp; else result = YYERRCODE; break; case '<': if (exp[0] == '=') { ++exp; lval->op = less_or_equal; } else lval->op = less_than; result = CMPOP2; break; case '>': if (exp[0] == '=') { ++exp; lval->op = greater_or_equal; } else lval->op = greater_than; result = CMPOP2; break; case '*': lval->op = mult; result = MULOP2; break; case '/': lval->op = divide; result = MULOP2; break; case '%': lval->op = module; result = MULOP2; break; case '+': lval->op = plus; result = ADDOP2; break; case '-': lval->op = minus; result = ADDOP2; break; case 'n': case '?': case ':': case '(': case ')': /* Nothing, just return the character. */ break; case ';': case '\n': case '\0': /* Be safe and let the user call this function again. */ --exp; result = YYEOF; break; default: result = YYERRCODE; #if YYDEBUG != 0 --exp; #endif break; } *pexp = exp; return result; } static void yyerror (const char *str) { /* Do nothing. We don't print error messages here. */ } centerim-4.22.10/config.rpath0000755000175000001440000003502511473011427012720 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2005 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` cc_basename=`echo "$CC" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case "$cc_basename" in xlc*) wl='-Wl,' ;; esac ;; mingw* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux*) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; sco3.2v5*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) wl='-Wl,' ;; sysv4*MP*) ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sunos4*) hardcode_direct=yes ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case "$cc_basename" in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | kfreebsd*-gnu | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10* | hpux11*) if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=no ;; ia64*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; *) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; sco3.2v5*) ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4.2uw2*) hardcode_direct=yes hardcode_minus_L=no ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) ;; sysv5*) hardcode_libdir_flag_spec= ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. libname_spec='lib$name' case "$host_os" in aix3*) ;; aix4* | aix5*) ;; amigaos*) ;; beos*) ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) shrext=.dll ;; darwin* | rhapsody*) shrext=.dylib ;; dgux*) ;; freebsd1*) ;; kfreebsd*-gnu) ;; freebsd*) ;; gnu*) ;; hpux9* | hpux10* | hpux11*) case "$host_cpu" in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac ;; irix5* | irix6* | nonstopux*) case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux*) ;; knetbsd*-gnu) ;; netbsd*) ;; newsos6) ;; nto-qnx*) ;; openbsd*) ;; os2*) libname_spec='$name' shrext=.dll ;; osf3* | osf4* | osf5*) ;; sco3.2v5*) ;; solaris*) ;; sunos4*) ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ;; sysv4*MP*) ;; uts4*) ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://bugzilla.centerim.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='centerim' PACKAGE_TARNAME='centerim' PACKAGE_VERSION='4.22.10' PACKAGE_STRING='centerim 4.22.10' PACKAGE_BUGREPORT='http://bugzilla.centerim.org' PACKAGE_URL='' ac_unique_file="config.h.in" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS ORDER_ONLY JPEG_LIBS CURL_CXXFLAGS CURL_CFLAGS CURL_LIBS GNUTLS_CXXFLAGS GNUTLS_CFLAGS GNUTLS_LIBS GPGME_CXXFLAGS FRIBIDI_PC FRIBIDI_CFLAGS FRIBIDI_LIBS CXXCPP HAVE_FRIBIDI_FALSE HAVE_FRIBIDI_TRUE HAVE_LIBOTR_FALSE HAVE_LIBOTR_TRUE HAVE_THREAD_FALSE HAVE_THREAD_TRUE BUILD_LJ_FALSE BUILD_LJ_TRUE BUILD_RSS_FALSE BUILD_RSS_TRUE BUILD_MSN_FALSE BUILD_MSN_TRUE BUILD_GADU_FALSE BUILD_GADU_TRUE BUILD_JABBER_FALSE BUILD_JABBER_TRUE BUILD_FIRETALK_FALSE BUILD_FIRETALK_TRUE BUILD_IRC_FALSE BUILD_IRC_TRUE BUILD_AIM_FALSE BUILD_AIM_TRUE BUILD_YAHOO_FALSE BUILD_YAHOO_TRUE BUILD_ICQ_FALSE BUILD_ICQ_TRUE NSS_LIBS NSS_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG LIBCURL LIBCURL_CPPFLAGS _libcurl_config GPGME_LIBS GPGME_CFLAGS GPGME_CONFIG POSUB LTLIBINTL LIBINTL INTLLIBS INTL_LIBTOOL_SUFFIX_PREFIX INTLOBJS GENCAT INSTOBJEXT DATADIRNAME CATOBJEXT USE_INCLUDED_LIBINTL BUILD_INCLUDED_LIBINTL INTLBISON LTLIBICONV LIBICONV HAVE_WPRINTF HAVE_SNPRINTF HAVE_ASPRINTF HAVE_POSIX_PRINTF INTL_MACOSX_LIBS GLIBC21 ALLOCA GLIBC2 MSGMERGE XGETTEXT GMSGFMT MSGFMT USE_NLS MKINSTALLDIRS RANLIB am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX EGREP GREP CPP host_os host_vendor host_cpu host build_os build_vendor build_cpu build am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_nls with_gnu_ld enable_rpath with_libiconv_prefix with_included_gettext with_libintl_prefix enable_icq enable_yahoo enable_aim enable_irc enable_jabber enable_gg enable_msn enable_rss enable_lj enable_locales_fix with_fribidi with_ssl with_openssl with_nss_compat with_gpgme_prefix with_libcurl with_libjpeg with_libotr with_libXss enable_largefile with_ncurses with_ncursesw ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR NSS_CFLAGS NSS_LIBS CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures centerim 4.22.10 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/centerim] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of centerim 4.22.10:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --disable-icq Build without ICQ --disable-yahoo Build without Yahoo! --disable-aim Build without AIM --disable-irc Build without IRC --disable-jabber Build without Jabber --disable-gg Build without Gadu-Gadu --disable-msn Build without MSN --disable-rss Build without RSS reader --disable-lj Build without LiveJournal client --enable-locales-fix enables workaround for broken locales. use this option if some of characters in your texts in Chinese or Japanese disappear --disable-largefile omit support for large files Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-included-gettext use the GNU gettext library included here --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-fribidi=DIR enable Hebrew and Arabic support using fribidi library in DIR --with-ssl enable SSL secured connections using either OpenSSL or GnuTLS (auto) --with-openssl=DIR enable SSL secured connections using the OpenSSL library in DIR (optional) --with-nss_compat=DIR enable SSL secured connections using the NSS compat library in DIR (optional) --with-gpgme=PATH path to gpgme-config (auto) --with-libcurl=DIR look for the curl library in DIR --without-libjpeg Compile without JPEG token support (for Gadu-Gadu registration) --with-libotr enable Off-the-Record Messaging (libotr) WARNING: use at your own risk, not supported yet --with-libXss enable Xss --with-ncurses Force the use of ncurses over curses --without-ncursesw Don't use ncursesw (wide character support) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path NSS_CFLAGS C compiler flags for NSS, overriding pkg-config NSS_LIBS linker flags for NSS, overriding pkg-config CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF centerim configure 4.22.10 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to http://bugzilla.centerim.org ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to http://bugzilla.centerim.org ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by centerim $as_me 4.22.10, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='centerim' VERSION='4.22.10' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strerror in -lcposix" >&5 $as_echo_n "checking for strerror in -lcposix... " >&6; } if ${ac_cv_lib_cposix_strerror+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strerror (); int main () { return strerror (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cposix_strerror=yes else ac_cv_lib_cposix_strerror=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cposix_strerror" >&5 $as_echo "$ac_cv_lib_cposix_strerror" >&6; } if test "x$ac_cv_lib_cposix_strerror" = xyes; then : LIBS="$LIBS -lcposix" fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h ######################## # Checks for programs. # ######################## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then case "$ac_aux_dir" in /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; esac fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GMSGFMT" != ":"; then if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 $as_echo "found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; } GMSGFMT=":" fi fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi rm -f messages.po fi ac_config_commands="$ac_config_commands default-1" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library 2 or newer" >&5 $as_echo_n "checking whether we are using the GNU C Library 2 or newer... " >&6; } if ${ac_cv_gnu_library_2+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1; then : ac_cv_gnu_library_2=yes else ac_cv_gnu_library_2=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2" >&5 $as_echo "$ac_cv_gnu_library_2" >&6; } GLIBC2="$ac_cv_gnu_library_2" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed" >&5 $as_echo_n "checking for signed... " >&6; } if ${bh_cv_c_signed+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { signed char x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bh_cv_c_signed=yes else bh_cv_c_signed=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bh_cv_c_signed" >&5 $as_echo "$bh_cv_c_signed" >&6; } if test $bh_cv_c_signed = no; then $as_echo "#define signed /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 $as_echo_n "checking for long long... " >&6; } if ${ac_cv_type_long_long+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ long long ll = 1LL; int i = 63; int main () { long long llmax = (long long) -1; return ll << i | ll >> i | llmax / ll | llmax % ll; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_type_long_long=yes else ac_cv_type_long_long=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long" >&5 $as_echo "$ac_cv_type_long_long" >&6; } if test $ac_cv_type_long_long = yes; then $as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double" >&5 $as_echo_n "checking for long double... " >&6; } if ${gt_cv_c_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if test "$GCC" = yes; then gt_cv_c_long_double=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* The Stardent Vistra knows sizeof(long double), but does not support it. */ long double foo = 0.0; /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ int array [2*(sizeof(long double) >= sizeof(double)) - 1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_long_double=yes else gt_cv_c_long_double=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_long_double" >&5 $as_echo "$gt_cv_c_long_double" >&6; } if test $gt_cv_c_long_double = yes; then $as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 $as_echo_n "checking for wchar_t... " >&6; } if ${gt_cv_c_wchar_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wchar_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wchar_t=yes else gt_cv_c_wchar_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 $as_echo "$gt_cv_c_wchar_t" >&6; } if test $gt_cv_c_wchar_t = yes; then $as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 $as_echo_n "checking for wint_t... " >&6; } if ${gt_cv_c_wint_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wint_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wint_t=yes else gt_cv_c_wint_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 $as_echo "$gt_cv_c_wint_t" >&6; } if test $gt_cv_c_wint_t = yes; then $as_echo "#define HAVE_WINT_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 $as_echo_n "checking for inttypes.h... " >&6; } if ${gl_cv_header_inttypes_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_inttypes_h=yes else gl_cv_header_inttypes_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5 $as_echo "$gl_cv_header_inttypes_h" >&6; } if test $gl_cv_header_inttypes_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_INTTYPES_H_WITH_UINTMAX 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 $as_echo_n "checking for stdint.h... " >&6; } if ${gl_cv_header_stdint_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_header_stdint_h=yes else gl_cv_header_stdint_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5 $as_echo "$gl_cv_header_stdint_h" >&6; } if test $gl_cv_header_stdint_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H_WITH_UINTMAX 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5 $as_echo_n "checking for intmax_t... " >&6; } if ${gt_cv_c_intmax_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif int main () { intmax_t x = -1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_intmax_t=yes else gt_cv_c_intmax_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5 $as_echo "$gt_cv_c_intmax_t" >&6; } if test $gt_cv_c_intmax_t = yes; then $as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf() supports POSIX/XSI format strings" >&5 $as_echo_n "checking whether printf() supports POSIX/XSI format strings... " >&6; } if ${gt_cv_func_printf_posix+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ notposix #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "notposix" >/dev/null 2>&1; then : gt_cv_func_printf_posix="guessing no" else gt_cv_func_printf_posix="guessing yes" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gt_cv_func_printf_posix=yes else gt_cv_func_printf_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_printf_posix" >&5 $as_echo "$gt_cv_func_printf_posix" >&6; } case $gt_cv_func_printf_posix in *yes) $as_echo "#define HAVE_POSIX_PRINTF 1" >>confdefs.h ;; esac # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction () { static char *addr = 0; auto char dummy; if (addr == 0) { addr = &dummy; return find_stack_direction (); } else return (&dummy > addr) ? 1 : -1; } int main () { return find_stack_direction () < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library 2.1 or newer" >&5 $as_echo_n "checking whether we are using the GNU C Library 2.1 or newer... " >&6; } if ${ac_cv_gnu_library_2_1+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1; then : ac_cv_gnu_library_2_1=yes else ac_cv_gnu_library_2_1=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 $as_echo "$ac_cv_gnu_library_2_1" >&6; } GLIBC21="$ac_cv_gnu_library_2_1" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether integer division by zero raises SIGFPE" >&5 $as_echo_n "checking whether integer division by zero raises SIGFPE... " >&6; } if ${gt_cv_int_divbyzero_sigfpe+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : # Guess based on the CPU. case "$host_cpu" in alpha* | i3456786 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static void #ifdef __cplusplus sigfpe_handler (int sig) #else sigfpe_handler (sig) int sig; #endif { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (1); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gt_cv_int_divbyzero_sigfpe=yes else gt_cv_int_divbyzero_sigfpe=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_int_divbyzero_sigfpe" >&5 $as_echo "$gt_cv_int_divbyzero_sigfpe" >&6; } case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac cat >>confdefs.h <<_ACEOF #define INTDIV0_RAISES_SIGFPE $value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long" >&5 $as_echo_n "checking for unsigned long long... " >&6; } if ${ac_cv_type_unsigned_long_long+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ unsigned long long ull = 1ULL; int i = 63; int main () { unsigned long long ullmax = (unsigned long long) -1; return ull << i | ull >> i | ullmax / ull | ullmax % ull; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_type_unsigned_long_long=yes else ac_cv_type_unsigned_long_long=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long" >&5 $as_echo "$ac_cv_type_unsigned_long_long" >&6; } if test $ac_cv_type_unsigned_long_long = yes; then $as_echo "#define HAVE_UNSIGNED_LONG_LONG 1" >>confdefs.h fi if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then test $ac_cv_type_unsigned_long_long = yes \ && ac_type='unsigned long long' \ || ac_type='unsigned long' cat >>confdefs.h <<_ACEOF #define uintmax_t $ac_type _ACEOF else $as_echo "#define HAVE_UINTMAX_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 $as_echo_n "checking for inttypes.h... " >&6; } if ${gt_cv_header_inttypes_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_header_inttypes_h=yes else gt_cv_header_inttypes_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_header_inttypes_h" >&5 $as_echo "$gt_cv_header_inttypes_h" >&6; } if test $gt_cv_header_inttypes_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_INTTYPES_H 1 _ACEOF fi if test $gt_cv_header_inttypes_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the inttypes.h PRIxNN macros are broken" >&5 $as_echo_n "checking whether the inttypes.h PRIxNN macros are broken... " >&6; } if ${gt_cv_inttypes_pri_broken+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef PRId32 char *p = PRId32; #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_inttypes_pri_broken=no else gt_cv_inttypes_pri_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_inttypes_pri_broken" >&5 $as_echo "$gt_cv_inttypes_pri_broken" >&6; } fi if test "$gt_cv_inttypes_pri_broken" = yes; then cat >>confdefs.h <<_ACEOF #define PRI_MACROS_BROKEN 1 _ACEOF fi for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5 $as_echo_n "checking for SIZE_MAX... " >&6; } result= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Found it" >/dev/null 2>&1; then : result=yes fi rm -f conftest* if test -z "$result"; then if ac_fn_c_compute_int "$LINENO" "~(size_t)0 / 10" "res_hi" "#include "; then : else result=? fi if ac_fn_c_compute_int "$LINENO" "~(size_t)0 % 10" "res_lo" "#include "; then : else result=? fi if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include "; then : else result=? fi if test "$fits_in_uint" = 1; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern size_t foo; extern unsigned long foo; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : fits_in_uint=0 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test -z "$result"; then if test "$fits_in_uint" = 1; then result="$res_hi$res_lo"U else result="$res_hi$res_lo"UL fi else result='~(size_t)0' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 $as_echo "$result" >&6; } if test "$result" != yes; then cat >>confdefs.h <<_ACEOF #define SIZE_MAX $result _ACEOF fi for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers" gt_save_LIBS="$LIBS" LIBS="$LIBS -framework CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers" gt_save_LIBS="$LIBS" LIBS="$LIBS -framework CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi fi LIBICONV= LTLIBICONV= INCICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in asprintf fwprintf getcwd getegid geteuid getgid getuid \ mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \ strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \ __fsetlocking do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _snprintf is declared" >&5 $as_echo_n "checking whether _snprintf is declared... " >&6; } if ${ac_cv_have_decl__snprintf+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _snprintf char *p = (char *) _snprintf; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl__snprintf=yes else ac_cv_have_decl__snprintf=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl__snprintf" >&5 $as_echo "$ac_cv_have_decl__snprintf" >&6; } if test $ac_cv_have_decl__snprintf = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL__SNPRINTF $gt_value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _snwprintf is declared" >&5 $as_echo_n "checking whether _snwprintf is declared... " >&6; } if ${ac_cv_have_decl__snwprintf+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _snwprintf char *p = (char *) _snwprintf; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl__snwprintf=yes else ac_cv_have_decl__snwprintf=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl__snwprintf" >&5 $as_echo "$ac_cv_have_decl__snwprintf" >&6; } if test $ac_cv_have_decl__snwprintf = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL__SNWPRINTF $gt_value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether feof_unlocked is declared" >&5 $as_echo_n "checking whether feof_unlocked is declared... " >&6; } if ${ac_cv_have_decl_feof_unlocked+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef feof_unlocked char *p = (char *) feof_unlocked; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl_feof_unlocked=yes else ac_cv_have_decl_feof_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_feof_unlocked" >&5 $as_echo "$ac_cv_have_decl_feof_unlocked" >&6; } if test $ac_cv_have_decl_feof_unlocked = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FEOF_UNLOCKED $gt_value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fgets_unlocked is declared" >&5 $as_echo_n "checking whether fgets_unlocked is declared... " >&6; } if ${ac_cv_have_decl_fgets_unlocked+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef fgets_unlocked char *p = (char *) fgets_unlocked; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl_fgets_unlocked=yes else ac_cv_have_decl_fgets_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_fgets_unlocked" >&5 $as_echo "$ac_cv_have_decl_fgets_unlocked" >&6; } if test $ac_cv_have_decl_fgets_unlocked = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FGETS_UNLOCKED $gt_value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getc_unlocked is declared" >&5 $as_echo_n "checking whether getc_unlocked is declared... " >&6; } if ${ac_cv_have_decl_getc_unlocked+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef getc_unlocked char *p = (char *) getc_unlocked; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl_getc_unlocked=yes else ac_cv_have_decl_getc_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_getc_unlocked" >&5 $as_echo "$ac_cv_have_decl_getc_unlocked" >&6; } if test $ac_cv_have_decl_getc_unlocked = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETC_UNLOCKED $gt_value _ACEOF case $gt_cv_func_printf_posix in *yes) HAVE_POSIX_PRINTF=1 ;; *) HAVE_POSIX_PRINTF=0 ;; esac if test "$ac_cv_func_asprintf" = yes; then HAVE_ASPRINTF=1 else HAVE_ASPRINTF=0 fi if test "$ac_cv_func_snprintf" = yes; then HAVE_SNPRINTF=1 else HAVE_SNPRINTF=0 fi if test "$ac_cv_func_wprintf" = yes; then HAVE_WPRINTF=1 else HAVE_WPRINTF=0 fi am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } if ${am_cv_proto_iconv+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_cv_proto_iconv_arg1="" else am_cv_proto_iconv_arg1="const" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:- }$am_cv_proto_iconv" >&5 $as_echo "${ac_t:- }$am_cv_proto_iconv" >&6; } cat >>confdefs.h <<_ACEOF #define ICONV_CONST $am_cv_proto_iconv_arg1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 $as_echo_n "checking for nl_langinfo and CODESET... " >&6; } if ${am_cv_langinfo_codeset+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char* cs = nl_langinfo(CODESET); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_langinfo_codeset=yes else am_cv_langinfo_codeset=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 $as_echo "$am_cv_langinfo_codeset" >&6; } if test $am_cv_langinfo_codeset = yes; then $as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h fi if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${gt_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_val_LC_MESSAGES=yes else gt_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_val_LC_MESSAGES" >&5 $as_echo "$gt_cv_val_LC_MESSAGES" >&6; } if test $gt_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi if test -n "$INTL_MACOSX_LIBS"; then CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers" fi for ac_prog in bison do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_INTLBISON+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$INTLBISON"; then ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_INTLBISON="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi INTLBISON=$ac_cv_prog_INTLBISON if test -n "$INTLBISON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLBISON" >&5 $as_echo "$INTLBISON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$INTLBISON" && break done if test -z "$INTLBISON"; then ac_verc_fail=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of bison" >&5 $as_echo_n "checking version of bison... " >&6; } ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5 $as_echo "$ac_prog_version" >&6; } fi if test $ac_verc_fail = yes; then INTLBISON=: fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers" gt_save_LIBS="$LIBS" LIBS="$LIBS -framework CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/CoreFoundation.framework/Headers" gt_save_LIBS="$LIBS" LIBS="$LIBS -framework CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no LIBINTL= LTLIBINTL= POSUB= if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether included gettext is requested" >&5 $as_echo_n "checking whether included gettext is requested... " >&6; } # Check whether --with-included-gettext was given. if test "${with_included_gettext+set}" = set; then : withval=$with_included_gettext; nls_cv_force_use_gnu_gettext=$withval else nls_cv_force_use_gnu_gettext=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nls_cv_force_use_gnu_gettext" >&5 $as_echo "$nls_cv_force_use_gnu_gettext" >&6; } nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if ${gt_cv_func_gnugettext1_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_gnugettext1_libc=yes else gt_cv_func_gnugettext1_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libc" >&5 $as_echo "$gt_cv_func_gnugettext1_libc" >&6; } if test "$gt_cv_func_gnugettext1_libc" != "yes"; then use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi fi LIBINTL= LTLIBINTL= INCINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if ${gt_cv_func_gnugettext1_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_gnugettext1_libintl=yes else gt_cv_func_gnugettext1_libintl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext1_libintl=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libintl" >&5 $as_echo "$gt_cv_func_gnugettext1_libintl" >&6; } fi if test "$gt_cv_func_gnugettext1_libc" = "yes" \ || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test "$gt_use_preinstalled_gnugettext" != "yes"; then nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="\${top_builddir}/intl/libintl.a $LIBICONV" LTLIBINTL="\${top_builddir}/intl/libintl.a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then CATOBJEXT=.gmo fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi nls_cv_header_intl= nls_cv_header_libgt= DATADIRNAME=share INSTOBJEXT=.mo GENCAT=gencat INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi INTL_LIBTOOL_SUFFIX_PREFIX= INTLLIBS="$LIBINTL" ######################### # Checks for libraries. # ######################### # Check whether --enable-icq was given. if test "${enable_icq+set}" = set; then : enableval=$enable_icq; build_icq="$enableval" else build_icq="yes" fi # Check whether --enable-yahoo was given. if test "${enable_yahoo+set}" = set; then : enableval=$enable_yahoo; build_yahoo="$enableval" else build_yahoo="yes" fi # Check whether --enable-aim was given. if test "${enable_aim+set}" = set; then : enableval=$enable_aim; build_aim="$enableval" else build_aim="yes" fi # Check whether --enable-irc was given. if test "${enable_irc+set}" = set; then : enableval=$enable_irc; build_irc="$enableval" else build_irc="yes" fi # Check whether --enable-jabber was given. if test "${enable_jabber+set}" = set; then : enableval=$enable_jabber; build_jabber="$enableval" else build_jabber="yes" fi # Check whether --enable-gg was given. if test "${enable_gg+set}" = set; then : enableval=$enable_gg; build_gg="$enableval" else build_gg="yes" fi # Check whether --enable-msn was given. if test "${enable_msn+set}" = set; then : enableval=$enable_msn; build_msn="$enableval" else build_msn="yes" fi # Check whether --enable-rss was given. if test "${enable_rss+set}" = set; then : enableval=$enable_rss; build_rss="$enableval" else build_rss="yes" fi # Check whether --enable-lj was given. if test "${enable_lj+set}" = set; then : enableval=$enable_lj; build_lj="$enableval" else build_lj="yes" fi # Check whether --enable-locales-fix was given. if test "${enable_locales_fix+set}" = set; then : enableval=$enable_locales_fix; locales_fix="$enableval" else locales_fix="yes" fi # Check whether --with-fribidi was given. if test "${with_fribidi+set}" = set; then : withval=$with_fribidi; with_fribidi=$withval else with_fribidi=no fi # Check whether --with-ssl was given. if test "${with_ssl+set}" = set; then : withval=$with_ssl; with_ssl=$withval fi # Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; with_openssl=$withval fi # Check whether --with-nss_compat was given. if test "${with_nss_compat+set}" = set; then : withval=$with_nss_compat; with_nss_compat=$withval fi # Check whether --with-gpgme-prefix was given. if test "${with_gpgme_prefix+set}" = set; then : withval=$with_gpgme_prefix; gpgme_config_prefix="$withval" else gpgme_config_prefix="" fi if test "x$gpgme_config_prefix" != x ; then GPGME_CONFIG="$gpgme_config_prefix/bin/gpgme-config" fi # Extract the first word of "gpgme-config", so it can be a program name with args. set dummy gpgme-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GPGME_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GPGME_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GPGME_CONFIG="$GPGME_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GPGME_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GPGME_CONFIG" && ac_cv_path_GPGME_CONFIG="no" ;; esac fi GPGME_CONFIG=$ac_cv_path_GPGME_CONFIG if test -n "$GPGME_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GPGME_CONFIG" >&5 $as_echo "$GPGME_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GPGME_CONFIG" != "no" ; then gpgme_version=`$GPGME_CONFIG --version` fi gpgme_version_major=`echo $gpgme_version | \ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'` gpgme_version_minor=`echo $gpgme_version | \ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'` gpgme_version_micro=`echo $gpgme_version | \ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'` tmp=0.4.2 if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` else req_gpgme_api=0 min_gpgme_version="$tmp" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GPGME - version >= $min_gpgme_version" >&5 $as_echo_n "checking for GPGME - version >= $min_gpgme_version... " >&6; } ok=no if test "$GPGME_CONFIG" != "no" ; then req_major=`echo $min_gpgme_version | \ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'` req_minor=`echo $min_gpgme_version | \ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'` req_micro=`echo $min_gpgme_version | \ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'` if test "$gpgme_version_major" -gt "$req_major"; then ok=yes else if test "$gpgme_version_major" -eq "$req_major"; then if test "$gpgme_version_minor" -gt "$req_minor"; then ok=yes else if test "$gpgme_version_minor" -eq "$req_minor"; then if test "$gpgme_version_micro" -ge "$req_micro"; then ok=yes fi fi fi fi fi fi if test $ok = yes; then # If we have a recent GPGME, we should also check that the # API is compatible. if test "$req_gpgme_api" -gt 0 ; then tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0` if test "$tmp" -gt 0 ; then if test "$req_gpgme_api" -ne "$tmp" ; then ok=no fi fi fi fi if test $ok = yes; then GPGME_CFLAGS=`$GPGME_CONFIG --cflags` GPGME_LIBS=`$GPGME_CONFIG --libs` { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_gpgme=yes else GPGME_CFLAGS="" GPGME_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_gpgme=no fi # Check whether --with-libcurl was given. if test "${with_libcurl+set}" = set; then : withval=$with_libcurl; _libcurl_with=$withval else _libcurl_with=yes fi if test "$_libcurl_with" != "no" ; then for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[1]+256*A[2]+A[3]; print X;}'" _libcurl_try_link=yes if test -d "$_libcurl_with" ; then LIBCURL_CPPFLAGS="-I$withval/include" _libcurl_ldflags="-L$withval/lib" # Extract the first word of "curl-config", so it can be a program name with args. set dummy curl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path__libcurl_config+:} false; then : $as_echo_n "(cached) " >&6 else case $_libcurl_config in [\\/]* | ?:[\\/]*) ac_cv_path__libcurl_config="$_libcurl_config" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in "$withval/bin" do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path__libcurl_config="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path__libcurl_config" && ac_cv_path__libcurl_config=""$withval/bin"" ;; esac fi _libcurl_config=$ac_cv_path__libcurl_config if test -n "$_libcurl_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_libcurl_config" >&5 $as_echo "$_libcurl_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else # Extract the first word of "curl-config", so it can be a program name with args. set dummy curl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path__libcurl_config+:} false; then : $as_echo_n "(cached) " >&6 else case $_libcurl_config in [\\/]* | ?:[\\/]*) ac_cv_path__libcurl_config="$_libcurl_config" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path__libcurl_config="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi _libcurl_config=$ac_cv_path__libcurl_config if test -n "$_libcurl_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_libcurl_config" >&5 $as_echo "$_libcurl_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$_libcurl_config != "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the version of libcurl" >&5 $as_echo_n "checking for the version of libcurl... " >&6; } if ${libcurl_cv_lib_curl_version+:} false; then : $as_echo_n "(cached) " >&6 else libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $2}'` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libcurl_cv_lib_curl_version" >&5 $as_echo "$libcurl_cv_lib_curl_version" >&6; } _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse` _libcurl_wanted=`echo 4.12.0 | $_libcurl_version_parse` if test $_libcurl_wanted -gt 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcurl >= version 4.12.0" >&5 $as_echo_n "checking for libcurl >= version 4.12.0... " >&6; } if ${libcurl_cv_lib_version_ok+:} false; then : $as_echo_n "(cached) " >&6 else if test $_libcurl_version -ge $_libcurl_wanted ; then libcurl_cv_lib_version_ok=yes else libcurl_cv_lib_version_ok=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libcurl_cv_lib_version_ok" >&5 $as_echo "$libcurl_cv_lib_version_ok" >&6; } fi if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then if test x"$LIBCURL_CPPFLAGS" = "x" ; then LIBCURL_CPPFLAGS=`$_libcurl_config --cflags` fi if test x"$LIBCURL" = "x" ; then LIBCURL=`$_libcurl_config --libs` # This is so silly, but Apple actually has a bug in their # curl-config script. Fixed in Tiger, but there are still # lots of Panther installs around. case "${host}" in powerpc-apple-darwin7*) LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'` ;; esac fi # All curl-config scripts support --feature _libcurl_features=`$_libcurl_config --feature` # Is it modern enough to have --protocols? (7.12.4) if test $_libcurl_version -ge 461828 ; then _libcurl_protocols=`$_libcurl_config --protocols` fi else _libcurl_try_link=no fi unset _libcurl_wanted fi if test $_libcurl_try_link = yes ; then # we didn't find curl-config, so let's see if the user-supplied # link line (or failing that, "-lcurl") is enough. LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libcurl is usable" >&5 $as_echo_n "checking whether libcurl is usable... " >&6; } if ${libcurl_cv_lib_curl_usable+:} false; then : $as_echo_n "(cached) " >&6 else _libcurl_save_cppflags=$CPPFLAGS CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS" _libcurl_save_libs=$LIBS LIBS="$LIBCURL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { /* Try and use a few common options to force a failure if we are missing symbols or can't link. */ int x; curl_easy_setopt(NULL,CURLOPT_URL,NULL); x=CURL_ERROR_SIZE; x=CURLOPT_WRITEFUNCTION; x=CURLOPT_FILE; x=CURLOPT_ERRORBUFFER; x=CURLOPT_STDERR; x=CURLOPT_VERBOSE; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : libcurl_cv_lib_curl_usable=yes else libcurl_cv_lib_curl_usable=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS=$_libcurl_save_cppflags LIBS=$_libcurl_save_libs unset _libcurl_save_cppflags unset _libcurl_save_libs fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libcurl_cv_lib_curl_usable" >&5 $as_echo "$libcurl_cv_lib_curl_usable" >&6; } if test $libcurl_cv_lib_curl_usable = yes ; then # Does curl_free() exist in this version of libcurl? # If not, fake it with free() _libcurl_save_cppflags=$CPPFLAGS CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" _libcurl_save_libs=$LIBS LIBS="$LIBS $LIBCURL" ac_fn_c_check_func "$LINENO" "curl_free" "ac_cv_func_curl_free" if test "x$ac_cv_func_curl_free" = xyes; then : else $as_echo "#define curl_free free" >>confdefs.h fi CPPFLAGS=$_libcurl_save_cppflags LIBS=$_libcurl_save_libs unset _libcurl_save_cppflags unset _libcurl_save_libs $as_echo "#define HAVE_LIBCURL 1" >>confdefs.h for _libcurl_feature in $_libcurl_features ; do cat >>confdefs.h <<_ACEOF #define `$as_echo "libcurl_feature_$_libcurl_feature" | $as_tr_cpp` 1 _ACEOF eval `$as_echo "libcurl_feature_$_libcurl_feature" | $as_tr_sh`=yes done if test "x$_libcurl_protocols" = "x" ; then # We don't have --protocols, so just assume that all # protocols are available _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT" if test x$libcurl_feature_SSL = xyes ; then _libcurl_protocols="$_libcurl_protocols HTTPS" # FTPS wasn't standards-compliant until version # 7.11.0 if test $_libcurl_version -ge 461568; then _libcurl_protocols="$_libcurl_protocols FTPS" fi fi fi for _libcurl_protocol in $_libcurl_protocols ; do cat >>confdefs.h <<_ACEOF #define `$as_echo "libcurl_protocol_$_libcurl_protocol" | $as_tr_cpp` 1 _ACEOF eval `$as_echo "libcurl_protocol_$_libcurl_protocol" | $as_tr_sh`=yes done else unset LIBCURL unset LIBCURL_CPPFLAGS fi fi unset _libcurl_try_link unset _libcurl_version_parse unset _libcurl_config unset _libcurl_feature unset _libcurl_features unset _libcurl_protocol unset _libcurl_protocols unset _libcurl_version unset _libcurl_ldflags fi if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then # This is the IF-NO path have_libcurl=no else # This is the IF-YES path have_libcurl=yes fi unset _libcurl_with # Check whether --with-libjpeg was given. if test "${with_libjpeg+set}" = set; then : withval=$with_libjpeg; fi # Check whether --with-libotr was given. if test "${with_libotr+set}" = set; then : withval=$with_libotr; with_libotr=$withval else with_libotr=no fi # Check whether --with-libXss was given. if test "${with_libXss+set}" = set; then : withval=$with_libXss; with_libXss=$withval else with_libXss=no fi ##################### # Check for fribidi # ##################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use fribidi" >&5 $as_echo_n "checking whether to use fribidi... " >&6; } FRIBIDI_LIBS="" FRIBIDI_CFLAGS="" FRIBIDI_PC="" have_fribidi=no if test "x$with_fribidi" = "xyes"; then if ! pkg-config fribidi; then as_fn_error $? "*** fribidi.pc not found" "$LINENO" 5 fi FRIBIDI_CFLAGS=`pkg-config --cflags fribidi` CFLAGS="$CFLAGS $FRIBIDI_CFLAGS" FRIBIDI_LIBS=`pkg-config --libs fribidi` FRIBIDI_PC="fribidi," { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fribidi_get_mirror_char in -lfribidi" >&5 $as_echo_n "checking for fribidi_get_mirror_char in -lfribidi... " >&6; } if ${ac_cv_lib_fribidi_fribidi_get_mirror_char+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfribidi $FRIBIDI_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char fribidi_get_mirror_char (); int main () { return fribidi_get_mirror_char (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_fribidi_fribidi_get_mirror_char=yes else ac_cv_lib_fribidi_fribidi_get_mirror_char=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fribidi_fribidi_get_mirror_char" >&5 $as_echo "$ac_cv_lib_fribidi_fribidi_get_mirror_char" >&6; } if test "x$ac_cv_lib_fribidi_fribidi_get_mirror_char" = xyes; then : : else as_fn_error $? "*** libfribidi not found." "$LINENO" 5 fi $as_echo "#define HAVE_FRIBIDI 1" >>confdefs.h $as_echo "#define KTOOL_USE_FRIBIDI 1" >>confdefs.h have_fribidi=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_fribidi" >&5 $as_echo "$have_fribidi" >&6; } ################# # Check for SSL # ################# if test "x$with_ssl" != "xno"; then with_ssl="no" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenSSL" >&5 $as_echo_n "checking for OpenSSL... " >&6; } if test -z "$with_openssl" -o "x$with_openssl" = "xyes"; then for ac_dir in $with_openssl /usr/local /usr; do if test -f "$ac_dir/include/openssl/ssl.h"; then with_openssl=$ac_dir break; fi done fi if test -n "$with_openssl" -a "x$with_openssl" != "xno" -a -z "$with_nss_compat"; then CFLAGS="$CFLAGS -I${with_openssl}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found in $with_openssl" >&5 $as_echo "found in $with_openssl" >&6; } $as_echo "#define HAVE_OPENSSL 1" >>confdefs.h with_ssl="yes" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcrypto" >&5 $as_echo_n "checking for main in -lcrypto... " >&6; } if ${ac_cv_lib_crypto_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcrypto $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_crypto_main=yes else ac_cv_lib_crypto_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_main" >&5 $as_echo "$ac_cv_lib_crypto_main" >&6; } if test "x$ac_cv_lib_crypto_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBCRYPTO 1 _ACEOF LIBS="-lcrypto $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lssl" >&5 $as_echo_n "checking for main in -lssl... " >&6; } if ${ac_cv_lib_ssl_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lssl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ssl_main=yes else ac_cv_lib_ssl_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_main" >&5 $as_echo "$ac_cv_lib_ssl_main" >&6; } if test "x$ac_cv_lib_ssl_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSSL 1 _ACEOF LIBS="-lssl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSLeay_add_all_algorithms in -lcrypto" >&5 $as_echo_n "checking for SSLeay_add_all_algorithms in -lcrypto... " >&6; } if ${ac_cv_lib_crypto_SSLeay_add_all_algorithms+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcrypto $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char SSLeay_add_all_algorithms (); int main () { return SSLeay_add_all_algorithms (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_crypto_SSLeay_add_all_algorithms=yes else ac_cv_lib_crypto_SSLeay_add_all_algorithms=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_SSLeay_add_all_algorithms" >&5 $as_echo "$ac_cv_lib_crypto_SSLeay_add_all_algorithms" >&6; } if test "x$ac_cv_lib_crypto_SSLeay_add_all_algorithms" = xyes; then : $as_echo "#define HAVE_SSLEAY 1" >>confdefs.h fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found or disabled" >&5 $as_echo "not found or disabled" >&6; } fi if test "x$with_ssl" = "xno" -a -z "$with_nss_compat"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gnutls_global_init_extra in -lgnutls-extra" >&5 $as_echo_n "checking for gnutls_global_init_extra in -lgnutls-extra... " >&6; } if ${ac_cv_lib_gnutls_extra_gnutls_global_init_extra+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgnutls-extra $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gnutls_global_init_extra (); int main () { return gnutls_global_init_extra (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gnutls_extra_gnutls_global_init_extra=yes else ac_cv_lib_gnutls_extra_gnutls_global_init_extra=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gnutls_extra_gnutls_global_init_extra" >&5 $as_echo "$ac_cv_lib_gnutls_extra_gnutls_global_init_extra" >&6; } if test "x$ac_cv_lib_gnutls_extra_gnutls_global_init_extra" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzo1x_1_compress in -llzo" >&5 $as_echo_n "checking for lzo1x_1_compress in -llzo... " >&6; } if ${ac_cv_lib_lzo_lzo1x_1_compress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-llzo $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lzo1x_1_compress (); int main () { return lzo1x_1_compress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lzo_lzo1x_1_compress=yes else ac_cv_lib_lzo_lzo1x_1_compress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzo_lzo1x_1_compress" >&5 $as_echo "$ac_cv_lib_lzo_lzo1x_1_compress" >&6; } if test "x$ac_cv_lib_lzo_lzo1x_1_compress" = xyes; then : LZO_LIBS=-llzo fi if test -z "$LZO_LIBS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzo1x_1_compress in -llzo2" >&5 $as_echo_n "checking for lzo1x_1_compress in -llzo2... " >&6; } if ${ac_cv_lib_lzo2_lzo1x_1_compress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-llzo2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lzo1x_1_compress (); int main () { return lzo1x_1_compress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lzo2_lzo1x_1_compress=yes else ac_cv_lib_lzo2_lzo1x_1_compress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzo2_lzo1x_1_compress" >&5 $as_echo "$ac_cv_lib_lzo2_lzo1x_1_compress" >&6; } if test "x$ac_cv_lib_lzo2_lzo1x_1_compress" = xyes; then : LZO_LIBS=-llzo2 else as_fn_error $? "*** *** Could not find liblzo or liblzo2. " "$LINENO" 5 fi fi CXXFLAGS="$CXXFLAGS $LIBGNUTLS_CFLAGS" LIBS="$LIBS $LIBGNUTLS_LIBS -lgnutls-extra -lgnutls" $as_echo "#define HAVE_GNUTLS 1" >>confdefs.h with_ssl="yes" else as_fn_error $? "Could not find gnutls-extra. Stopping. " "$LINENO" 5 fi fi if test "x$with_ssl" = "xno"; then if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # NSS is essential for OpenSSL compatibility layer # drags in NSPR as well pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NSS" >&5 $as_echo_n "checking for NSS... " >&6; } if test -n "$NSS_CFLAGS"; then pkg_cv_NSS_CFLAGS="$NSS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nss >= 3\""; } >&5 ($PKG_CONFIG --exists --print-errors "nss >= 3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NSS_CFLAGS=`$PKG_CONFIG --cflags "nss >= 3" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$NSS_LIBS"; then pkg_cv_NSS_LIBS="$NSS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nss >= 3\""; } >&5 ($PKG_CONFIG --exists --print-errors "nss >= 3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NSS_LIBS=`$PKG_CONFIG --libs "nss >= 3" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then NSS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "nss >= 3" 2>&1` else NSS_PKG_ERRORS=`$PKG_CONFIG --print-errors "nss >= 3" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$NSS_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (nss >= 3) were not met: $NSS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables NSS_CFLAGS and NSS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables NSS_CFLAGS and NSS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else NSS_CFLAGS=$pkg_cv_NSS_CFLAGS NSS_LIBS=$pkg_cv_NSS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi CFLAGS="$CFLAGS $NSS_CFLAGS" CXXFLAGS="$CXXFLAGS $NSS_CFLAGS" LIBS="$LIBS $NSS_LIBS" # The compatibility layer { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NSS compat" >&5 $as_echo_n "checking for NSS compat... " >&6; } if test -n "$with_nss_compat" -a "x$with_nss_compat" != "xno"; then if test -f "${with_nss_compat}"; then CFLAGS="$CFLAGS -I${with_nss_compat} -I/usr/include/nspr4" CXXFLAGS="$CXXFLAGS -I${with_nss_compat} -I/usr/include/nspr4" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_CTX_new in -lnss_compat_ossl" >&5 $as_echo_n "checking for SSL_CTX_new in -lnss_compat_ossl... " >&6; } if ${ac_cv_lib_nss_compat_ossl_SSL_CTX_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnss_compat_ossl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char SSL_CTX_new (); int main () { return SSL_CTX_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nss_compat_ossl_SSL_CTX_new=yes else ac_cv_lib_nss_compat_ossl_SSL_CTX_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nss_compat_ossl_SSL_CTX_new" >&5 $as_echo "$ac_cv_lib_nss_compat_ossl_SSL_CTX_new" >&6; } if test "x$ac_cv_lib_nss_compat_ossl_SSL_CTX_new" = xyes; then : $as_echo "#define HAVE_NSS_COMPAT 1" >>confdefs.h LIBS="$LIBS -lnss_compat_ossl" with_ssl="yes" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not enabled, sadly" >&5 $as_echo "Not enabled, sadly" >&6; } fi fi if test x"$with_ssl" != x"no"; then $as_echo "#define HAVE_SSL 1" >>confdefs.h else as_fn_error $? "Karamba! SSL library not found." "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled (use --with-ssl=DIR to enable)" >&5 $as_echo "disabled (use --with-ssl=DIR to enable)" >&6; } fi ################### # Check for gpgme # ################### if test "x$have_gpgme" = "xyes"; then $as_echo "#define HAVE_GPGME 1" >>confdefs.h GPGME_CXXFLAGS="$GPGME_CFLAGS" CFLAGS="$CFLAGS $GPGME_CFLAGS" CXXFLAGS="$CXXFLAGS $GPGME_CXXFLAGS" LIBS="$LIBS $GPGME_LIBS" fi ############################### # Check for Largefile support # ############################### # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ############################# # Check for pthread library # ############################# original_LIBS="$LIBS" LIBS="-lpthread $original_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_create((void *)0, (void *)0, (void *)0, (void *)0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : pthread=yes else pthread=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test x${pthread} = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_THREAD 1" >>confdefs.h else LIBS="$original_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi for ac_header in sys/utsname.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default" if test "x$ac_cv_header_sys_utsname_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_UTSNAME_H 1 _ACEOF ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname" if test "x$ac_cv_func_uname" = xyes; then : $as_echo "#define HAVE_UNAME 1" >>confdefs.h fi fi done ##################### # Check for libcurl # ##################### CURL_CFLAGS="$LIBCURL_CPPFLAGS" CURL_CXXFLAGS="$LIBCURL_CPPFLAGS" CURL_LIBS="$LIBCURL" CFLAGS="$CFLAGS $CURL_CFLAGS" CXXFLAGS="$CXXFLAGS $CURL_CXXFLAGS" LIBS="$LIBS $CURL_LIBS" ##################### # Check for libjpeg # ##################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libjpeg (for Gadu-Gadu registration)" >&5 $as_echo_n "checking for libjpeg (for Gadu-Gadu registration)... " >&6; } JPEG_LIBS="" have_libjpeg=no if test "x$with_libjpeg" != "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_decompress in -ljpeg" >&5 $as_echo_n "checking for jpeg_start_decompress in -ljpeg... " >&6; } if ${ac_cv_lib_jpeg_jpeg_start_decompress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jpeg_start_decompress (); int main () { return jpeg_start_decompress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jpeg_jpeg_start_decompress=yes else ac_cv_lib_jpeg_jpeg_start_decompress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_decompress" >&5 $as_echo "$ac_cv_lib_jpeg_jpeg_start_decompress" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_start_decompress" = xyes; then : for ac_header in jpeglib.h do : ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_JPEGLIB_H 1 _ACEOF $as_echo "#define HAVE_LIBJPEG 1" >>confdefs.h JPEG_LIBS="-ljpeg $LIBS" LIBS="$LIBS $JPEG_LIBS" have_libjpeg=yes fi done fi fi ##################### # Check for libotr # ##################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libotr" >&5 $as_echo_n "checking for libotr... " >&6; } have_libotr=no if test "x$with_libotr" != "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for otrl_init in -lotr" >&5 $as_echo_n "checking for otrl_init in -lotr... " >&6; } if ${ac_cv_lib_otr_otrl_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lotr $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char otrl_init (); int main () { return otrl_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_otr_otrl_init=yes else ac_cv_lib_otr_otrl_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_otr_otrl_init" >&5 $as_echo "$ac_cv_lib_otr_otrl_init" >&6; } if test "x$ac_cv_lib_otr_otrl_init" = xyes; then : for ac_header in libotr/context.h libotr/userstate.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF $as_echo "#define HAVE_LIBOTR 1" >>confdefs.h OTR_LIBS="-lotr $LIBS" LIBS="$LIBS $OTR_LIBS" have_libotr=yes fi done fi fi ##################### # Check for Xss # ##################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use Xss" >&5 $as_echo_n "checking whether to use Xss... " >&6; } have_libXss=no if test "x$with_libXss" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XScreenSaverQueryInfo in -lXss" >&5 $as_echo_n "checking for XScreenSaverQueryInfo in -lXss... " >&6; } if ${ac_cv_lib_Xss_XScreenSaverQueryInfo+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXss $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XScreenSaverQueryInfo (); int main () { return XScreenSaverQueryInfo (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xss_XScreenSaverQueryInfo=yes else ac_cv_lib_Xss_XScreenSaverQueryInfo=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xss_XScreenSaverQueryInfo" >&5 $as_echo "$ac_cv_lib_Xss_XScreenSaverQueryInfo" >&6; } if test "x$ac_cv_lib_Xss_XScreenSaverQueryInfo" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "X11/extensions/scrnsaver.h" "ac_cv_header_X11_extensions_scrnsaver_h" "$ac_includes_default" if test "x$ac_cv_header_X11_extensions_scrnsaver_h" = xyes; then : $as_echo "#define HAVE_LIBXSS 1" >>confdefs.h XSS_LIBS="-lX11 -lXss" LIBS="$LIBS $XSS_LIBS" have_libXss=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi fi #################### # Check for others # #################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi LIBS="$LIBS $LIBICONV" # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 $as_echo_n "checking size of short... " >&6; } if ${ac_cv_sizeof_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : else if test "$ac_cv_type_short" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 $as_echo "$ac_cv_sizeof_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 $as_echo_n "checking for socket in -lsocket... " >&6; } if ${ac_cv_lib_socket_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_socket=yes else ac_cv_lib_socket_socket=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 $as_echo "$ac_cv_lib_socket_socket" >&6; } if test "x$ac_cv_lib_socket_socket" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSOCKET 1 _ACEOF LIBS="-lsocket $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNSL 1 _ACEOF LIBS="-lnsl $LIBS" fi # Check whether --with-ncurses was given. if test "${with_ncurses+set}" = set; then : withval=$with_ncurses; fi ax_save_LIBS="$LIBS" # Check whether --with-ncursesw was given. if test "${with_ncursesw+set}" = set; then : withval=$with_ncursesw; fi if test ! "$CURSES_LIB" -a "$with_ncurses" != no -a "$with_ncursesw" != "no" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncursesw" >&5 $as_echo_n "checking for working ncursesw... " >&6; } if ${ax_cv_ncursesw+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$ax_save_LIBS -lncursesw" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_ncursesw=yes else ax_cv_ncursesw=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_ncursesw" >&5 $as_echo "$ax_cv_ncursesw" >&6; } if test "$ax_cv_ncursesw" = yes then ac_fn_c_check_header_mongrel "$LINENO" "ncursesw/cursesw.h" "ac_cv_header_ncursesw_cursesw_h" "$ac_includes_default" if test "x$ac_cv_header_ncursesw_cursesw_h" = xyes; then : $as_echo "#define HAVE_NCURSESW_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "ncursesw/curses.h" "ac_cv_header_ncursesw_curses_h" "$ac_includes_default" if test "x$ac_cv_header_ncursesw_curses_h" = xyes; then : $as_echo "#define HAVE_NCURSES_H 1" >>confdefs.h fi $as_echo "#define HAVE_NCURSESW 1" >>confdefs.h CURSES_LIB="-lncursesw" ax_cv_ncurses=yes ax_cv_curses=yes fi fi if test ! "$CURSES_LIB" -a "$with_ncurses" != no -a "$with_ncursesw" != yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses" >&5 $as_echo_n "checking for working ncurses... " >&6; } if ${ax_cv_ncurses+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$ax_save_LIBS -lncurses" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_ncurses=yes else ax_cv_ncurses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_ncurses" >&5 $as_echo "$ax_cv_ncurses" >&6; } if test "$ax_cv_ncurses" = yes then $as_echo "#define HAVE_NCURSES_H 1" >>confdefs.h CURSES_LIB="-lncurses" ax_cv_curses=yes fi fi if test "$ax_cv_curses" != yes -a "$with_ncurses" != yes -a "$with_ncursesw" != yes then if test ! "$CURSES_LIB" then CURSES_LIB="-lcurses" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working curses" >&5 $as_echo_n "checking for working curses... " >&6; } if ${ax_cv_curses+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$ax_save_LIBS $CURSES_LIB" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_curses=yes else ax_cv_curses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_curses" >&5 $as_echo "$ax_cv_curses" >&6; } if test "$ax_cv_curses" = yes then $as_echo "#define HAVE_CURSES_H 1" >>confdefs.h fi fi LIBS="$ax_save_LIBS" if test "x$ax_cv_ncurses" = "xyes" then LIBS="$LIBS $CURSES_LIB" else as_fn_error $? "You need ncurses/ncursesw library and header files." "$LINENO" 5 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { socklen_t foo; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_socklen_t=yes else ac_cv_c_socklen_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "x$ac_cv_c_socklen_t" = "xno"; then $as_echo "#define socklen_t int" >>confdefs.h fi case "$host_os" in darwin*) LIBS="$LIBS -flat_namespace" CXXFLAGS="$CXXFLAGS -I/sw/include" ;; esac if test "x$build_icq" = "xyes"; then BUILD_ICQ_TRUE= BUILD_ICQ_FALSE='#' else BUILD_ICQ_TRUE='#' BUILD_ICQ_FALSE= fi if test "x$build_yahoo" = "xyes"; then BUILD_YAHOO_TRUE= BUILD_YAHOO_FALSE='#' else BUILD_YAHOO_TRUE='#' BUILD_YAHOO_FALSE= fi if test "x$build_aim" = "xyes"; then BUILD_AIM_TRUE= BUILD_AIM_FALSE='#' else BUILD_AIM_TRUE='#' BUILD_AIM_FALSE= fi if test "x$build_irc" = "xyes"; then BUILD_IRC_TRUE= BUILD_IRC_FALSE='#' else BUILD_IRC_TRUE='#' BUILD_IRC_FALSE= fi if test "x$build_irc" = "xyes" -o "x$build_aim" = "xyes"; then BUILD_FIRETALK_TRUE= BUILD_FIRETALK_FALSE='#' else BUILD_FIRETALK_TRUE='#' BUILD_FIRETALK_FALSE= fi if test "x$build_jabber" = "xyes"; then BUILD_JABBER_TRUE= BUILD_JABBER_FALSE='#' else BUILD_JABBER_TRUE='#' BUILD_JABBER_FALSE= fi if test "x$build_gg" = "xyes"; then BUILD_GADU_TRUE= BUILD_GADU_FALSE='#' else BUILD_GADU_TRUE='#' BUILD_GADU_FALSE= fi if test "x$build_msn" = "xyes"; then BUILD_MSN_TRUE= BUILD_MSN_FALSE='#' else BUILD_MSN_TRUE='#' BUILD_MSN_FALSE= fi if test "x$build_rss" = "xyes" -o "x$build_lj" = "xyes"; then BUILD_RSS_TRUE= BUILD_RSS_FALSE='#' else BUILD_RSS_TRUE='#' BUILD_RSS_FALSE= fi if test "x$build_lj" = "xyes"; then BUILD_LJ_TRUE= BUILD_LJ_FALSE='#' else BUILD_LJ_TRUE='#' BUILD_LJ_FALSE= fi if test "x$pthread" = "xyes"; then HAVE_THREAD_TRUE= HAVE_THREAD_FALSE='#' else HAVE_THREAD_TRUE='#' HAVE_THREAD_FALSE= fi if test "x$have_libotr" = "xyes"; then HAVE_LIBOTR_TRUE= HAVE_LIBOTR_FALSE='#' else HAVE_LIBOTR_TRUE='#' HAVE_LIBOTR_FALSE= fi if test "x$have_fribidi" = "xyes"; then HAVE_FRIBIDI_TRUE= HAVE_FRIBIDI_FALSE='#' else HAVE_FRIBIDI_TRUE='#' HAVE_FRIBIDI_FALSE= fi if test "x$build_icq" = "xyes"; then $as_echo "#define BUILD_ICQ 1" >>confdefs.h fi if test "x$build_yahoo" = "xyes"; then if test "x$have_curl" = "xno"; then as_fn_error $? "Yahoo cannot be built without the curl library." "$LINENO" 5 fi if test -z "$libcurl_feature_SSL" -o "x$libcurl_feature_SSL" = "xno"; then as_fn_error $? "Yahoo requires libcurl built with SSL support." "$LINENO" 5 fi $as_echo "#define BUILD_YAHOO 1" >>confdefs.h fi if test "x$build_aim" = "xyes"; then $as_echo "#define BUILD_AIM 1" >>confdefs.h fi if test "x$build_irc" = "xyes"; then $as_echo "#define BUILD_IRC 1" >>confdefs.h fi if test "x$build_jabber" = "xyes"; then if test "x$have_gpgme" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No GPG support in Jabber, since GPGME library not found or its setup not ok" >&5 $as_echo "$as_me: WARNING: No GPG support in Jabber, since GPGME library not found or its setup not ok" >&2;} fi $as_echo "#define BUILD_JABBER 1" >>confdefs.h fi if test "x$build_gg" = "xyes"; then if test "x$have_libjpeg" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No jpeg support in Gadu-Gadu, you will not be able to register??????????" >&5 $as_echo "$as_me: WARNING: No jpeg support in Gadu-Gadu, you will not be able to register??????????" >&2;} fi $as_echo "#define BUILD_GADU 1" >>confdefs.h fi if test "x$build_msn" = "xyes"; then if test "x$have_curl" = "xno"; then as_fn_error $? "MSN cannot be built without the curl library." "$LINENO" 5 fi if test -z "$libcurl_feature_SSL" -o "x$libcurl_feature_SSL" = "xno"; then as_fn_error $? "MSN requires libcurl built with SSL support." "$LINENO" 5 fi $as_echo "#define BUILD_MSN 1" >>confdefs.h fi if test "x$build_rss" = "xyes" -o "x$build_lj" = "xyes"; then $as_echo "#define BUILD_RSS 1" >>confdefs.h fi if test "x$build_lj" = "xyes"; then $as_echo "#define BUILD_LJ 1" >>confdefs.h fi if test "x$locales_fx" != "xno"; then $as_echo "#define LOCALES_HACK 1" >>confdefs.h fi ############################ # Checks for header files. # ############################ # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction () { static char *addr = 0; auto char dummy; if (addr == 0) { addr = &dummy; return find_stack_direction (); } else return (&dummy > addr) ? 1 : -1; } int main () { return find_stack_direction () < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi for ac_header in argz.h do : ac_fn_c_check_header_mongrel "$LINENO" "argz.h" "ac_cv_header_argz_h" "$ac_includes_default" if test "x$ac_cv_header_argz_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ARGZ_H 1 _ACEOF fi done for ac_header in arpa/inet.h do : ac_fn_c_check_header_mongrel "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default" if test "x$ac_cv_header_arpa_inet_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ARPA_INET_H 1 _ACEOF fi done for ac_header in fcntl.h do : ac_fn_c_check_header_mongrel "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" if test "x$ac_cv_header_fcntl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FCNTL_H 1 _ACEOF fi done for ac_header in float.h do : ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FLOAT_H 1 _ACEOF fi done for ac_header in ftw.h do : ac_fn_c_check_header_mongrel "$LINENO" "ftw.h" "ac_cv_header_ftw_h" "$ac_includes_default" if test "x$ac_cv_header_ftw_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FTW_H 1 _ACEOF fi done for ac_header in inttypes.h do : ac_fn_c_check_header_mongrel "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default" if test "x$ac_cv_header_inttypes_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INTTYPES_H 1 _ACEOF fi done for ac_header in langinfo.h do : ac_fn_c_check_header_mongrel "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" if test "x$ac_cv_header_langinfo_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LANGINFO_H 1 _ACEOF fi done for ac_header in libintl.h do : ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBINTL_H 1 _ACEOF fi done for ac_header in limits.h do : ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIMITS_H 1 _ACEOF fi done for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done for ac_header in malloc.h do : ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MALLOC_H 1 _ACEOF fi done for ac_header in netdb.h do : ac_fn_c_check_header_mongrel "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default" if test "x$ac_cv_header_netdb_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NETDB_H 1 _ACEOF fi done for ac_header in netinet/in.h do : ac_fn_c_check_header_mongrel "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default" if test "x$ac_cv_header_netinet_in_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NETINET_IN_H 1 _ACEOF fi done for ac_header in stddef.h do : ac_fn_c_check_header_mongrel "$LINENO" "stddef.h" "ac_cv_header_stddef_h" "$ac_includes_default" if test "x$ac_cv_header_stddef_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDDEF_H 1 _ACEOF fi done for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done for ac_header in stdio_ext.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdio_ext.h" "ac_cv_header_stdio_ext_h" "$ac_includes_default" if test "x$ac_cv_header_stdio_ext_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDIO_EXT_H 1 _ACEOF fi done for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done for ac_header in string.h do : ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRING_H 1 _ACEOF fi done for ac_header in strings.h do : ac_fn_c_check_header_mongrel "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" if test "x$ac_cv_header_strings_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRINGS_H 1 _ACEOF fi done for ac_header in sys/ioctl.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" if test "x$ac_cv_header_sys_ioctl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_IOCTL_H 1 _ACEOF fi done for ac_header in sys/mount.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mount_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_MOUNT_H 1 _ACEOF fi done for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done for ac_header in sys/socket.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" if test "x$ac_cv_header_sys_socket_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SOCKET_H 1 _ACEOF fi done for ac_header in sys/statvfs.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/statvfs.h" "ac_cv_header_sys_statvfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_statvfs_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_STATVFS_H 1 _ACEOF fi done for ac_header in sys/time.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" if test "x$ac_cv_header_sys_time_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_TIME_H 1 _ACEOF fi done for ac_header in sys/vfs.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/vfs.h" "ac_cv_header_sys_vfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_vfs_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_VFS_H 1 _ACEOF fi done for ac_header in syslog.h do : ac_fn_c_check_header_mongrel "$LINENO" "syslog.h" "ac_cv_header_syslog_h" "$ac_includes_default" if test "x$ac_cv_header_syslog_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSLOG_H 1 _ACEOF fi done for ac_header in unistd.h do : ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNISTD_H 1 _ACEOF fi done for ac_header in utmp.h do : ac_fn_c_check_header_mongrel "$LINENO" "utmp.h" "ac_cv_header_utmp_h" "$ac_includes_default" if test "x$ac_cv_header_utmp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UTMP_H 1 _ACEOF fi done for ac_header in wchar.h do : ac_fn_c_check_header_mongrel "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default" if test "x$ac_cv_header_wchar_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WCHAR_H 1 _ACEOF fi done for ac_header in sys/types.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" if test "x$ac_cv_header_sys_types_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_TYPES_H 1 _ACEOF fi done for ac_header in _G_config.h do : ac_fn_c_check_header_mongrel "$LINENO" "_G_config.h" "ac_cv_header__G_config_h" "$ac_includes_default" if test "x$ac_cv_header__G_config_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__G_CONFIG_H 1 _ACEOF fi done ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu for ac_header in vector iostream fstream string algorithm list memory iterator exception utility do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else as_fn_error $? "You need to have the libstdc++ headers installed" "$LINENO" 5 fi done for ac_header in hash_map strstream ext/hash_map sstream do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ################################################## # check whether make supports order-only targets # ################################################## { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports order-only targets" >&5 $as_echo_n "checking whether ${MAKE-make} supports order-only targets... " >&6; } if ${centerim_cv_make_order_only+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: | say say: echo say .PHONY: all say _ACEOF centerim_cv_make_order_only=no ${MAKE-make} -f conftest.make >/dev/null 2>&1 && centerim_cv_make_order_only=yes rm -f conftest.make fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $centerim_cv_make_order_only" >&5 $as_echo "$centerim_cv_make_order_only" >&6; } if test x$centerim_cv_make_order_only = xyes; then ORDER_ONLY="|" fi ################################################################## # Checks for typedefs, structures, and compiler characteristics. # ################################################################## { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_zone" "ac_cv_member_struct_tm_tm_zone" "#include #include <$ac_cv_struct_tm> " if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_ZONE 1 _ACEOF fi if test "$ac_cv_member_struct_tm_tm_zone" = yes; then $as_echo "#define HAVE_TM_ZONE 1" >>confdefs.h else ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include " if test "x$ac_cv_have_decl_tzname" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_TZNAME $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5 $as_echo_n "checking for tzname... " >&6; } if ${ac_cv_var_tzname+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if !HAVE_DECL_TZNAME extern char *tzname[]; #endif int main () { return tzname[0][0]; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_var_tzname=yes else ac_cv_var_tzname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tzname" >&5 $as_echo "$ac_cv_var_tzname" >&6; } if test $ac_cv_var_tzname = yes; then $as_echo "#define HAVE_TZNAME 1" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int main () { int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if ${ac_cv_c_volatile+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "#define volatile /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTRDIFF_T 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF ################# # Substitutions # ################# ################################# # Checks for library functions. # ################################# for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* for ac_func in gethostbyname do : ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETHOSTBYNAME 1 _ACEOF fi done for ac_func in gethostname do : ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname" if test "x$ac_cv_func_gethostname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETHOSTNAME 1 _ACEOF fi done for ac_func in getpass do : ac_fn_c_check_func "$LINENO" "getpass" "ac_cv_func_getpass" if test "x$ac_cv_func_getpass" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPASS 1 _ACEOF fi done for ac_func in inet_aton do : ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton" if test "x$ac_cv_func_inet_aton" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INET_ATON 1 _ACEOF fi done for ac_func in inet_ntoa do : ac_fn_c_check_func "$LINENO" "inet_ntoa" "ac_cv_func_inet_ntoa" if test "x$ac_cv_func_inet_ntoa" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INET_NTOA 1 _ACEOF fi done for ac_func in memset do : ac_fn_c_check_func "$LINENO" "memset" "ac_cv_func_memset" if test "x$ac_cv_func_memset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MEMSET 1 _ACEOF fi done for ac_func in select do : ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" if test "x$ac_cv_func_select" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SELECT 1 _ACEOF fi done for ac_func in setenv do : ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" if test "x$ac_cv_func_setenv" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETENV 1 _ACEOF fi done for ac_func in socket do : ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" if test "x$ac_cv_func_socket" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SOCKET 1 _ACEOF fi done for ac_func in strerror do : ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" if test "x$ac_cv_func_strerror" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRERROR 1 _ACEOF fi done for ac_func in strtol do : ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol" if test "x$ac_cv_func_strtol" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRTOL 1 _ACEOF fi done ######################## # Create output files. # ######################## ALL_LINGUAS="zh_TW zh_CN uk sv ru ro pt_BR pl nl ms it hu fr es de cs bg" ac_config_files="$ac_config_files Makefile connwrap/Makefile firetalk/Makefile kkconsui/Makefile kkconsui/include/Makefile kkconsui/src/Makefile kkstrtext/Makefile kksystr/Makefile kksystr/include/Makefile kksystr/src/Makefile libgadu/Makefile libicq2000/Makefile libicq2000/libicq2000/Makefile libicq2000/src/Makefile libjabber/Makefile libmsn/Makefile libmsn/msn/Makefile libyahoo2/Makefile misc/Makefile share/Makefile src/Makefile src/hooks/Makefile intl/Makefile po/Makefile.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_ICQ_TRUE}" && test -z "${BUILD_ICQ_FALSE}"; then as_fn_error $? "conditional \"BUILD_ICQ\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_YAHOO_TRUE}" && test -z "${BUILD_YAHOO_FALSE}"; then as_fn_error $? "conditional \"BUILD_YAHOO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_AIM_TRUE}" && test -z "${BUILD_AIM_FALSE}"; then as_fn_error $? "conditional \"BUILD_AIM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_IRC_TRUE}" && test -z "${BUILD_IRC_FALSE}"; then as_fn_error $? "conditional \"BUILD_IRC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_FIRETALK_TRUE}" && test -z "${BUILD_FIRETALK_FALSE}"; then as_fn_error $? "conditional \"BUILD_FIRETALK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_JABBER_TRUE}" && test -z "${BUILD_JABBER_FALSE}"; then as_fn_error $? "conditional \"BUILD_JABBER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_GADU_TRUE}" && test -z "${BUILD_GADU_FALSE}"; then as_fn_error $? "conditional \"BUILD_GADU\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_MSN_TRUE}" && test -z "${BUILD_MSN_FALSE}"; then as_fn_error $? "conditional \"BUILD_MSN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_RSS_TRUE}" && test -z "${BUILD_RSS_FALSE}"; then as_fn_error $? "conditional \"BUILD_RSS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_LJ_TRUE}" && test -z "${BUILD_LJ_FALSE}"; then as_fn_error $? "conditional \"BUILD_LJ\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_THREAD_TRUE}" && test -z "${HAVE_THREAD_FALSE}"; then as_fn_error $? "conditional \"HAVE_THREAD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIBOTR_TRUE}" && test -z "${HAVE_LIBOTR_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBOTR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_FRIBIDI_TRUE}" && test -z "${HAVE_FRIBIDI_FALSE}"; then as_fn_error $? "conditional \"HAVE_FRIBIDI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by centerim $as_me 4.22.10, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ centerim config.status 4.22.10 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "connwrap/Makefile") CONFIG_FILES="$CONFIG_FILES connwrap/Makefile" ;; "firetalk/Makefile") CONFIG_FILES="$CONFIG_FILES firetalk/Makefile" ;; "kkconsui/Makefile") CONFIG_FILES="$CONFIG_FILES kkconsui/Makefile" ;; "kkconsui/include/Makefile") CONFIG_FILES="$CONFIG_FILES kkconsui/include/Makefile" ;; "kkconsui/src/Makefile") CONFIG_FILES="$CONFIG_FILES kkconsui/src/Makefile" ;; "kkstrtext/Makefile") CONFIG_FILES="$CONFIG_FILES kkstrtext/Makefile" ;; "kksystr/Makefile") CONFIG_FILES="$CONFIG_FILES kksystr/Makefile" ;; "kksystr/include/Makefile") CONFIG_FILES="$CONFIG_FILES kksystr/include/Makefile" ;; "kksystr/src/Makefile") CONFIG_FILES="$CONFIG_FILES kksystr/src/Makefile" ;; "libgadu/Makefile") CONFIG_FILES="$CONFIG_FILES libgadu/Makefile" ;; "libicq2000/Makefile") CONFIG_FILES="$CONFIG_FILES libicq2000/Makefile" ;; "libicq2000/libicq2000/Makefile") CONFIG_FILES="$CONFIG_FILES libicq2000/libicq2000/Makefile" ;; "libicq2000/src/Makefile") CONFIG_FILES="$CONFIG_FILES libicq2000/src/Makefile" ;; "libjabber/Makefile") CONFIG_FILES="$CONFIG_FILES libjabber/Makefile" ;; "libmsn/Makefile") CONFIG_FILES="$CONFIG_FILES libmsn/Makefile" ;; "libmsn/msn/Makefile") CONFIG_FILES="$CONFIG_FILES libmsn/msn/Makefile" ;; "libyahoo2/Makefile") CONFIG_FILES="$CONFIG_FILES libyahoo2/Makefile" ;; "misc/Makefile") CONFIG_FILES="$CONFIG_FILES misc/Makefile" ;; "share/Makefile") CONFIG_FILES="$CONFIG_FILES share/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/hooks/Makefile") CONFIG_FILES="$CONFIG_FILES src/hooks/Makefile" ;; "intl/Makefile") CONFIG_FILES="$CONFIG_FILES intl/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "default-1":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Build options: Version $VERSION Install prefix $prefix CFLAGS $CFLAGS CXXFLAGS $CXXFLAGS Protocols and Clients:" >&5 $as_echo " Build options: Version $VERSION Install prefix $prefix CFLAGS $CFLAGS CXXFLAGS $CXXFLAGS Protocols and Clients:" >&6; } if test "x$build_icq" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ICQ" >&5 $as_echo " ICQ" >&6; }; fi if test "x$build_yahoo" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Yahoo" >&5 $as_echo " Yahoo" >&6; }; fi if test "x$build_aim" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: AIM" >&5 $as_echo " AIM" >&6; }; fi if test "x$build_jabber" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: jabber" >&5 $as_echo " jabber" >&6; }; fi if test "x$build_gg" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Gadu-Gadu" >&5 $as_echo " Gadu-Gadu" >&6; }; fi if test "x$build_msn" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: MSN Messenger" >&5 $as_echo " MSN Messenger" >&6; }; fi if test "x$build_rss" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: RSS Reader" >&5 $as_echo " RSS Reader" >&6; }; fi if test "x$build_lj" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: LiveJournal client" >&5 $as_echo " LiveJournal client" >&6; }; fi if test "x$have_fribidi" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: LiveJournal client" >&5 $as_echo " LiveJournal client" >&6; }; fi if test "x$with_ssl" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: WARNING: SSL disabled (This means no Google Talk) " >&5 $as_echo " WARNING: SSL disabled (This means no Google Talk) " >&6; }; else if test "x$have_gpgme" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: WARNING: GPGME disabled (This means no encrypted messages between users) " >&5 $as_echo " WARNING: GPGME disabled (This means no encrypted messages between users) " >&6; }; fi if test "x$have_libotr" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: WARNING: libotr enabled (OTR is not supported yet, use at your own risk) " >&5 $as_echo " WARNING: libotr enabled (OTR is not supported yet, use at your own risk) " >&6; }; fi if test "x$pthread" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: WARNING: pthreads disabled (No file-transfers in jabber) " >&5 $as_echo " WARNING: pthreads disabled (No file-transfers in jabber) " >&6; }; fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Enjoy!" >&5 $as_echo " Enjoy!" >&6; } centerim-4.22.10/kksystr/0000755000175000001440000000000011473011456012177 500000000000000centerim-4.22.10/kksystr/Makefile.in0000644000175000001440000004657711473011437014206 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = kksystr DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libkksystr_a_AR = $(AR) $(ARFLAGS) libkksystr_a_DEPENDENCIES = src/kkfsys.o src/kkiproc.o am_libkksystr_a_OBJECTS = libkksystr_a_OBJECTS = $(am_libkksystr_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libkksystr_a_SOURCES) DIST_SOURCES = $(libkksystr_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/kksystr/include -I$(top_srcdir)/kkstrtext noinst_LIBRARIES = libkksystr.a libkksystr_a_SOURCES = libkksystr_a_LIBADD = src/kkfsys.o src/kkiproc.o SUBDIRS = include src all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kksystr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu kksystr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libkksystr.a: $(libkksystr_a_OBJECTS) $(libkksystr_a_DEPENDENCIES) -rm -f libkksystr.a $(libkksystr_a_AR) libkksystr.a $(libkksystr_a_OBJECTS) $(libkksystr_a_LIBADD) $(RANLIB) libkksystr.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/kksystr/include/0000755000175000001440000000000011473011456013622 500000000000000centerim-4.22.10/kksystr/include/Makefile.in0000644000175000001440000003176411473011437015621 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = kksystr/include DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_HEADERS = conf.h kkfsys.h kkiproc.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kksystr/include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu kksystr/include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ctags distclean distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/kksystr/include/kkiproc.h0000644000175000001440000000110011473007750015347 00000000000000#ifndef __KONST_PROCESS_H_ #define __KONST_PROCESS_H_ #include #include #include #include #include #include #include #include #include #include #include "conf.h" #include "kkfsys.h" #include "kkstrtext.h" __KTOOL_BEGIN_C int dataready(int fd, int dowait); time_t lastkeypress(); void detach(char *logfile); char *getprocentry(char *fname); __KTOOL_END_C #ifdef __sun__ void setenv(const string &name, const string &value, int replace); #endif #endif centerim-4.22.10/kksystr/include/Makefile.am0000644000175000001440000000005311461606612015575 00000000000000noinst_HEADERS = conf.h kkfsys.h kkiproc.h centerim-4.22.10/kksystr/include/kkfsys.h0000644000175000001440000000242611461606612015232 00000000000000#ifndef __KONST_FS_H_ #define __KONST_FS_H_ #include #include #include #include #include #include #include #include #include #include #include "conf.h" #include "kkstrtext.h" #ifndef HAVE_FTW_H #define FTW_F 1 #define FTW_D 2 #define FTW_DNR 3 #define FTW_SL 4 #define FTW_NS 5 #define FTW_CHDIR 1 #define nftw(d, f, de, fl) stubnftw(d, f, de, fl) #define ftw(d, f, de) stubnftw(d, f, de, 0) #else #include #endif #define FFIND_FILE 1 #define FFIND_LINK 2 #define FFIND_DIR 4 vector filefind(const string &mask, const string &aroot, int mode = FFIND_FILE); string readlink(const string &fname); string pathfind(const string &name, const string &path, int amode = F_OK); bool mksubdirs(string dir); bool samefile(const string &fname1, const string &fname2); __KTOOL_BEGIN_C unsigned long kfilesize(char *fname); void freads(FILE *f, char *s, int maxlen); int fcopy(const char *source, const char *dest); int fmove(const char *source, const char *dest); int stubnftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth, int flags); __KTOOL_END_C #endif centerim-4.22.10/kksystr/include/conf.h0000644000175000001440000000132411461606612014641 00000000000000#ifndef __KONST_CONF_H__ #define __KONST_CONF_H__ #if defined(__sgi) && !defined(__GNUC__) && (_COMPILER_VERSION >= 721) && defined(_NAMESPACES) #define __KTOOL_USE_NAMESPACES #endif #if defined(__COMO__) #define __KTOOL_USE_NAMESPACES #endif #ifdef __GNUC__ #ifdef HAVE__G_CONFIG_H #include <_G_config.h> #endif #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 9) #else #define __KTOOL_USE_NAMESPACES #endif #endif #ifdef __KTOOL_USE_NAMESPACES #define __KTOOL_BEGIN_NAMESPACE namespace ktool { #define __KTOOL_END_NAMESPACE } using namespace std; #else #define __KTOOL_BEGIN_NAMESPACE #define __KTOOL_END_NAMESPACE #endif #define __KTOOL_BEGIN_C extern "C" { #define __KTOOL_END_C } #endif centerim-4.22.10/kksystr/Makefile.am0000644000175000001440000000031011461606612014146 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/kksystr/include -I$(top_srcdir)/kkstrtext noinst_LIBRARIES = libkksystr.a libkksystr_a_SOURCES = libkksystr_a_LIBADD = src/kkfsys.o src/kkiproc.o SUBDIRS = include src centerim-4.22.10/kksystr/src/0000755000175000001440000000000011473011456012766 500000000000000centerim-4.22.10/kksystr/src/kkiproc.cc0000644000175000001440000001010511473007750014656 00000000000000/* * * kkiproc inter-process communications related routines * $Id: kkiproc.cc,v 1.11 2003/04/02 09:54:47 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "kkiproc.h" #include #include #include #include #ifdef __sun__ #include #include #endif #ifdef __CYGWIN__ #include #endif #ifdef __linux__ /* utmp functionallity is only used for gnu/linux. * Anyone know why ? */ #include #endif using namespace std; void detach(char *logfile) { if(logfile) freopen(logfile, "w", stdout); if(!fork()) { setsid(); chdir("/"); } else { _exit(0); } } time_t lastkeypress() { time_t t = 0; struct stat s; #ifdef __linux__ struct utmp *u; char tname[32]; int tlen; if((tlen = readlink("/proc/self/fd/0", tname, 12)) != -1) { tname[tlen] = 0; if(!strncmp(tname, "/dev/tty", 8) && isdigit(tname[8])) { setutent(); while((u = getutent())) { switch(u->ut_type) { case USER_PROCESS: case LOGIN_PROCESS: if(strlen(u->ut_line) > 3) if(!strncmp(u->ut_line, "tty", 3)) if(isdigit(u->ut_line[3])) { stringstream ss; ss << "/proc/" << u->ut_pid; if(*u->ut_user && !access(ss.str().c_str(), F_OK)) { stringstream ss; ss << "/dev/" << u->ut_line; if(!stat(ss.str().c_str(), &s)) if(s.st_atime > t) t = s.st_atime; } } break; } } endutent(); } else { if(!stat(tname, &s)) { t = s.st_atime; } else { time(&t); } } } else { time(&t); } #else char *p; if((p = ttyname(0)) != NULL) { if(!stat(p, &s) && s.st_atime > t) t = s.st_atime; else time(&t); } else { time(&t); } #endif return t; } int dataready(int fd, int dowait) { struct timeval tv; fd_set fds; int rc; tv.tv_sec = tv.tv_usec = 0; FD_ZERO(&fds); FD_SET(fd, &fds); if(select(fd+1, &fds, 0, 0, dowait ? 0 : &tv) != -1) { if(rc = FD_ISSET(fd, &fds)) { ioctl(fd, FIONREAD, &rc); } } else { rc = 0; } return rc; } char *getprocentry(char *fname) { FILE *f = fopen(fname, "r"); static char *p = 0; int fsize = kfilesize(fname); if(f) { p = (char *) realloc(p, fsize+1); fread(p, fsize, 1, f); fclose(f); } else { p = 0; } return p; } char *gethostname() { return getprocentry("/proc/kernel/hostname"); } char *getdomainname() { return getprocentry("/proc/kernel/domainname"); } #ifdef __sun__ void setenv(const string &name, const string &value, int replace) { if(getenv(name.c_str()) && replace) { auto_ptr stuff(new char[name.size() + value.size() + 2]); sprintf(stuff.get(), "%s=%s", name.c_str(), value.c_str()); putenv(stuff.get()); } } #endif centerim-4.22.10/kksystr/src/Makefile.in0000644000175000001440000003610511473011437014757 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = kksystr/src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libsrc_a_AR = $(AR) $(ARFLAGS) libsrc_a_LIBADD = am_libsrc_a_OBJECTS = kkfsys.$(OBJEXT) kkiproc.$(OBJEXT) libsrc_a_OBJECTS = $(am_libsrc_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libsrc_a_SOURCES) DIST_SOURCES = $(libsrc_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CXXFLAGS = -Wno-write-strings AM_CPPFLAGS = -I$(top_srcdir)/kksystr/include -I$(top_srcdir)//kkstrtext noinst_LIBRARIES = libsrc.a libsrc_a_SOURCES = kkfsys.cc kkiproc.cc all: all-am .SUFFIXES: .SUFFIXES: .cc .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kksystr/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu kksystr/src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libsrc.a: $(libsrc_a_OBJECTS) $(libsrc_a_DEPENDENCIES) -rm -f libsrc.a $(libsrc_a_AR) libsrc.a $(libsrc_a_OBJECTS) $(libsrc_a_LIBADD) $(RANLIB) libsrc.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kkfsys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kkiproc.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/kksystr/src/Makefile.am0000644000175000001440000000026011461606612014741 00000000000000AM_CXXFLAGS = -Wno-write-strings AM_CPPFLAGS = -I$(top_srcdir)/kksystr/include -I$(top_srcdir)//kkstrtext noinst_LIBRARIES = libsrc.a libsrc_a_SOURCES = kkfsys.cc kkiproc.cc centerim-4.22.10/kksystr/src/kkfsys.cc0000644000175000001440000001227611461606612014540 00000000000000/* * * kkfsys file system related routines * $Id: kkfsys.cc,v 1.7 2002/07/03 14:38:58 konst Exp $ * * Copyright (C) 1999-2001 by Konstantin Klyagin * * 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 "kkfsys.h" unsigned long kfilesize(char *fname) { struct stat buf; if(!stat(fname, &buf)) return buf.st_size; else return 0; } void freads(FILE *f, char *s, int maxlen) { s[0] = 0; fgets(s, maxlen, f); for(int i = strlen(s)-1; ; i--) if(i >= 0 && strchr("\r\n", s[i])) s[i] = 0; else break; } int fcopy(const char *source, const char *dest) { FILE *inpf, *outf; int ret = -1, bc; char buf[8192]; if(inpf = fopen(source, "r")) { if(outf = fopen(dest, "w")) { ret = bc = 0; while((bc = fread(buf, 1, 8192, inpf))) { fwrite(buf, bc, 1, outf); ret += bc; if(bc < 8192) break; } fclose(inpf); } fclose(outf); } return ret; } int fmove(const char *source, const char *dest) { int ret = fcopy(source, dest); if(ret != -1) unlink(source); return ret; } void stepftw(const char *fname, int *stopwalk, int (*fn)(const char *file, const struct stat *sb, int flag)) { struct stat st; int flag; flag = FTW_F; if(lstat(fname, &st)) { #ifdef FTW_NS flag = FTW_NS; #endif } else { if(S_ISLNK(st.st_mode)) { #ifdef FTW_SL flag = FTW_SL; #endif } else if(S_ISREG(st.st_mode)) flag = FTW_F; else if(S_ISDIR(st.st_mode)) { flag = FTW_D; #ifdef FTW_DNR if(access(fname, R_OK)) flag = FTW_DNR; #endif } } if(fn) { if((*fn)(fname, &st, flag)) { *stopwalk = 1; } else if(flag == FTW_D) { if(stubnftw(fname, fn, 0, 1)) *stopwalk = 1; } } } int stubnftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth, int flags) { DIR *dr; struct dirent *ent; char *fname; int stopwalk = 0; if(!flags) { stepftw(dir, &stopwalk, fn); } else if(dr = opendir(dir)) { while((ent = readdir(dr)) && !stopwalk) { if( !strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; fname = (char *) malloc(strlen(dir) + strlen(ent->d_name) + 2); strcpy(fname, dir); if(fname[strlen(fname)] != '/') strcat(fname, "/"); strcat(fname, ent->d_name); stepftw(fname, &stopwalk, fn); free(fname); } closedir(dr); } return stopwalk; } string pathfind(const string &name, const string &path, int amode) { string token, current, buf = path; while(!(token = getword(buf, ":")).empty()) { current = token + "/" + name; if(!access(current.c_str(), amode)) return current; } return ""; } bool mksubdirs(string dir) { string subname, created; bool errhappen = false; if(!dir.empty()) if(dir[0] == '/') created = "/"; while(!dir.empty() && !errhappen) { subname = getword(dir, "/"); if(!created.empty()) if(*(created.end()-1) != '/') created += "/"; created += subname; if(access(created.c_str(), F_OK)) errhappen = mkdir(created.c_str(), S_IRWXU); } return !errhappen; } string readlink(const string &fname) { char rfname[1024]; int n; if((n = ::readlink(fname.c_str(), rfname, 1024)) != -1) { rfname[n] = 0; return rfname; } else { return ""; } } bool samefile(const string &fname1, const string &fname2) { bool r; struct stat st1, st2; if(r = !stat(fname1.c_str(), &st1) && !stat(fname2.c_str(), &st2)) { r = st1.st_ino == st2.st_ino; } else { r = fname1 == fname2; } return r; } #define FINDFILE_PUSH(m) \ if((mode & m) && !regexec(&r, fname.c_str(), 0, 0, 0)) \ lst.push_back(fname); vector filefind(const string &mask, const string &aroot, int mode) { vector lst, rlst; vector::iterator is; regex_t r; DIR *d; string fname, root; struct dirent *de; struct stat st; root = aroot; if(root.substr(root.size()-1) != "/") root += "/"; if(!regcomp(&r, mask.c_str(), REG_EXTENDED)) { if(d = opendir(root.c_str())) { while(de = readdir(d)) { fname = de->d_name; if((fname != ".") && (fname != "..")) { fname = root + fname; if(!stat(fname.c_str(), &st)) { if(S_ISREG(st.st_mode)) { FINDFILE_PUSH(FFIND_FILE); } else if(S_ISDIR(st.st_mode)) { FINDFILE_PUSH(FFIND_DIR); rlst = filefind(mask, fname, mode); for(is = rlst.begin(); is != rlst.end(); is++) { lst.push_back(*is); } } else if(S_ISLNK(st.st_mode)) { FINDFILE_PUSH(FFIND_LINK); } } } } closedir(d); } regfree(&r); } return lst; } centerim-4.22.10/libjabber/0000755000175000001440000000000011473011456012401 500000000000000centerim-4.22.10/libjabber/snprintf.c0000644000175000001440000006450311461606612014341 00000000000000/* ==================================================================== * Copyright (c) 1995-1998 The Apache Group. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the Apache Group * for use in the Apache HTTP server project (http://www.apache.org/)." * * 4. The names "Apache Server" and "Apache Group" must not be used to * endorse or promote products derived from this software without * prior written permission. * * 5. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the Apache Group * for use in the Apache HTTP server project (http://www.apache.org/)." * * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Group and was originally based * on public domain software written at the National Center for * Supercomputing Applications, University of Illinois, Urbana-Champaign. * For more information on the Apache Group and the Apache HTTP server * project, please see . * * This code is based on, and used with the permission of, the * SIO stdio-replacement strx_* functions by Panos Tsirigotis * for xinetd. */ #include #if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) #include #include #include #include #include #include #include #ifdef HAVE_GCVT #define ap_ecvt ecvt #define ap_fcvt fcvt #define ap_gcvt gcvt #else /* * cvt.c - IEEE floating point formatting routines for FreeBSD * from GNU libc-4.6.27 */ /* * ap_ecvt converts to decimal * the number of digits is specified by ndigit * decpt is set to the position of the decimal point * sign is set to 0 for positive, 1 for negative */ #define NDIG 80 static char * ap_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag) { register int r2; double fi, fj; register char *p, *p1; static char buf[NDIG]; if (ndigits >= NDIG - 1) ndigits = NDIG - 2; r2 = 0; *sign = 0; p = &buf[0]; if (arg < 0) { *sign = 1; arg = -arg; } arg = modf(arg, &fi); p1 = &buf[NDIG]; /* * Do integer part */ if (fi != 0) { p1 = &buf[NDIG]; while (fi != 0) { fj = modf(fi / 10, &fi); *--p1 = (int) ((fj + .03) * 10) + '0'; r2++; } while (p1 < &buf[NDIG]) *p++ = *p1++; } else if (arg > 0) { while ((fj = arg * 10) < 1) { arg = fj; r2--; } } p1 = &buf[ndigits]; if (eflag == 0) p1 += r2; *decpt = r2; if (p1 < &buf[0]) { buf[0] = '\0'; return (buf); } while (p <= p1 && p < &buf[NDIG]) { arg *= 10; arg = modf(arg, &fj); *p++ = (int) fj + '0'; } if (p1 >= &buf[NDIG]) { buf[NDIG - 1] = '\0'; return (buf); } p = p1; *p1 += 5; while (*p1 > '9') { *p1 = '0'; if (p1 > buf) ++ * --p1; else { *p1 = '1'; (*decpt)++; if (eflag == 0) { if (p > buf) *p = '0'; p++; } } } *p = '\0'; return (buf); } static char * ap_ecvt(double arg, int ndigits, int *decpt, int *sign) { return (ap_cvt(arg, ndigits, decpt, sign, 1)); } static char * ap_fcvt(double arg, int ndigits, int *decpt, int *sign) { return (ap_cvt(arg, ndigits, decpt, sign, 0)); } /* * ap_gcvt - Floating output conversion to * minimal length string */ static char * ap_gcvt(double number, int ndigit, char *buf) { int sign, decpt; register char *p1, *p2; int i; p1 = ap_ecvt(number, ndigit, &decpt, &sign); p2 = buf; if (sign) *p2++ = '-'; for (i = ndigit - 1; i > 0 && p1[i] == '0'; i--) ndigit--; if ((decpt >= 0 && decpt - ndigit > 4) || (decpt < 0 && decpt < -3)) { /* use E-style */ decpt--; *p2++ = *p1++; *p2++ = '.'; for (i = 1; i < ndigit; i++) *p2++ = *p1++; *p2++ = 'e'; if (decpt < 0) { decpt = -decpt; *p2++ = '-'; } else *p2++ = '+'; if (decpt / 100 > 0) *p2++ = decpt / 100 + '0'; if (decpt / 10 > 0) *p2++ = (decpt % 100) / 10 + '0'; *p2++ = decpt % 10 + '0'; } else { if (decpt <= 0) { if (*p1 != '0') *p2++ = '.'; while (decpt < 0) { decpt++; *p2++ = '0'; } } for (i = 1; i <= ndigit; i++) { *p2++ = *p1++; if (i == decpt) *p2++ = '.'; } if (ndigit < decpt) { while (ndigit++ < decpt) *p2++ = '0'; *p2++ = '.'; } } if (p2[-1] == '.') p2--; *p2 = '\0'; return (buf); } #endif /* HAVE_CVT */ typedef enum { NO = 0, YES = 1 } boolean_e; #define FALSE 0 #define TRUE 1 #define NUL '\0' #define INT_NULL ((int *)0) #define WIDE_INT long typedef WIDE_INT wide_int; typedef unsigned WIDE_INT u_wide_int; typedef int bool_int; #define S_NULL "(null)" #define S_NULL_LEN 6 #define FLOAT_DIGITS 6 #define EXPONENT_LENGTH 10 /* * NUM_BUF_SIZE is the size of the buffer used for arithmetic conversions * * XXX: this is a magic number; do not decrease it */ #define NUM_BUF_SIZE 512 /* * Descriptor for buffer area */ struct buf_area { char *buf_end; char *nextb; /* pointer to next byte to read/write */ }; typedef struct buf_area buffy; /* * The INS_CHAR macro inserts a character in the buffer and writes * the buffer back to disk if necessary * It uses the char pointers sp and bep: * sp points to the next available character in the buffer * bep points to the end-of-buffer+1 * While using this macro, note that the nextb pointer is NOT updated. * * NOTE: Evaluation of the c argument should not have any side-effects */ #define INS_CHAR( c, sp, bep, cc ) \ { \ if ( sp < bep ) \ { \ *sp++ = c ; \ cc++ ; \ } \ } #define NUM( c ) ( c - '0' ) #define STR_TO_DEC( str, num ) \ num = NUM( *str++ ) ; \ while ( isdigit((int)*str ) ) \ { \ num *= 10 ; \ num += NUM( *str++ ) ; \ } /* * This macro does zero padding so that the precision * requirement is satisfied. The padding is done by * adding '0's to the left of the string that is going * to be printed. */ #define FIX_PRECISION( adjust, precision, s, s_len ) \ if ( adjust ) \ while ( s_len < precision ) \ { \ *--s = '0' ; \ s_len++ ; \ } /* * Macro that does padding. The padding is done by printing * the character ch. */ #define PAD( width, len, ch ) do \ { \ INS_CHAR( ch, sp, bep, cc ) ; \ width-- ; \ } \ while ( width > len ) /* * Prefix the character ch to the string str * Increase length * Set the has_prefix flag */ #define PREFIX( str, length, ch ) *--str = ch ; length++ ; has_prefix = YES /* * Convert num to its decimal format. * Return value: * - a pointer to a string containing the number (no sign) * - len contains the length of the string * - is_negative is set to TRUE or FALSE depending on the sign * of the number (always set to FALSE if is_unsigned is TRUE) * * The caller provides a buffer for the string: that is the buf_end argument * which is a pointer to the END of the buffer + 1 (i.e. if the buffer * is declared as buf[ 100 ], buf_end should be &buf[ 100 ]) */ static char * conv_10(register wide_int num, register bool_int is_unsigned, register bool_int * is_negative, char *buf_end, register int *len) { register char *p = buf_end; register u_wide_int magnitude; if (is_unsigned) { magnitude = (u_wide_int) num; *is_negative = FALSE; } else { *is_negative = (num < 0); /* * On a 2's complement machine, negating the most negative integer * results in a number that cannot be represented as a signed integer. * Here is what we do to obtain the number's magnitude: * a. add 1 to the number * b. negate it (becomes positive) * c. convert it to unsigned * d. add 1 */ if (*is_negative) { wide_int t = num + 1; magnitude = ((u_wide_int) - t) + 1; } else magnitude = (u_wide_int) num; } /* * We use a do-while loop so that we write at least 1 digit */ do { register u_wide_int new_magnitude = magnitude / 10; *--p = magnitude - new_magnitude * 10 + '0'; magnitude = new_magnitude; } while (magnitude); *len = buf_end - p; return (p); } /* * Convert a floating point number to a string formats 'f', 'e' or 'E'. * The result is placed in buf, and len denotes the length of the string * The sign is returned in the is_negative argument (and is not placed * in buf). */ static char * conv_fp(register char format, register double num, boolean_e add_dp, int precision, bool_int * is_negative, char *buf, int *len) { register char *s = buf; register char *p; int decimal_point; if (format == 'f') p = ap_fcvt(num, precision, &decimal_point, is_negative); else /* either e or E format */ p = ap_ecvt(num, precision + 1, &decimal_point, is_negative); /* * Check for Infinity and NaN */ if (isalpha((int)*p)) { *len = strlen(strcpy(buf, p)); *is_negative = FALSE; return (buf); } if (format == 'f') { if (decimal_point <= 0) { *s++ = '0'; if (precision > 0) { *s++ = '.'; while (decimal_point++ < 0) *s++ = '0'; } else if (add_dp) { *s++ = '.'; } } else { while (decimal_point-- > 0) { *s++ = *p++; } if (precision > 0 || add_dp) { *s++ = '.'; } } } else { *s++ = *p++; if (precision > 0 || add_dp) *s++ = '.'; } /* * copy the rest of p, the NUL is NOT copied */ while (*p) *s++ = *p++; if (format != 'f') { char temp[EXPONENT_LENGTH]; /* for exponent conversion */ int t_len; bool_int exponent_is_negative; *s++ = format; /* either e or E */ decimal_point--; if (decimal_point != 0) { p = conv_10((wide_int) decimal_point, FALSE, &exponent_is_negative, &temp[EXPONENT_LENGTH], &t_len); *s++ = exponent_is_negative ? '-' : '+'; /* * Make sure the exponent has at least 2 digits */ if (t_len == 1) *s++ = '0'; while (t_len--) *s++ = *p++; } else { *s++ = '+'; *s++ = '0'; *s++ = '0'; } } *len = s - buf; return (buf); } /* * Convert num to a base X number where X is a power of 2. nbits determines X. * For example, if nbits is 3, we do base 8 conversion * Return value: * a pointer to a string containing the number * * The caller provides a buffer for the string: that is the buf_end argument * which is a pointer to the END of the buffer + 1 (i.e. if the buffer * is declared as buf[ 100 ], buf_end should be &buf[ 100 ]) */ static char * conv_p2(register u_wide_int num, register int nbits, char format, char *buf_end, register int *len) { register int mask = (1 << nbits) - 1; register char *p = buf_end; static char low_digits[] = "0123456789abcdef"; static char upper_digits[] = "0123456789ABCDEF"; register char *digits = (format == 'X') ? upper_digits : low_digits; do { *--p = digits[num & mask]; num >>= nbits; } while (num); *len = buf_end - p; return (p); } /* * Do format conversion placing the output in buffer */ static int format_converter(register buffy * odp, const char *fmt, va_list ap) { register char *sp; register char *bep; register int cc = 0; register int i; register char *s = NULL; char *q; int s_len; register int min_width = 0; int precision = 0; enum { LEFT, RIGHT } adjust; char pad_char; char prefix_char; double fp_num; wide_int i_num = (wide_int) 0; u_wide_int ui_num; char num_buf[NUM_BUF_SIZE]; char char_buf[2]; /* for printing %% and % */ /* * Flag variables */ boolean_e is_long; boolean_e alternate_form; boolean_e print_sign; boolean_e print_blank; boolean_e adjust_precision; boolean_e adjust_width; bool_int is_negative; sp = odp->nextb; bep = odp->buf_end; while (*fmt) { if (*fmt != '%') { INS_CHAR(*fmt, sp, bep, cc); } else { /* * Default variable settings */ adjust = RIGHT; alternate_form = print_sign = print_blank = NO; pad_char = ' '; prefix_char = NUL; fmt++; /* * Try to avoid checking for flags, width or precision */ if (isascii((int)*fmt) && !islower((int)*fmt)) { /* * Recognize flags: -, #, BLANK, + */ for (;; fmt++) { if (*fmt == '-') adjust = LEFT; else if (*fmt == '+') print_sign = YES; else if (*fmt == '#') alternate_form = YES; else if (*fmt == ' ') print_blank = YES; else if (*fmt == '0') pad_char = '0'; else break; } /* * Check if a width was specified */ if (isdigit((int)*fmt)) { STR_TO_DEC(fmt, min_width); adjust_width = YES; } else if (*fmt == '*') { min_width = va_arg(ap, int); fmt++; adjust_width = YES; if (min_width < 0) { adjust = LEFT; min_width = -min_width; } } else adjust_width = NO; /* * Check if a precision was specified * * XXX: an unreasonable amount of precision may be specified * resulting in overflow of num_buf. Currently we * ignore this possibility. */ if (*fmt == '.') { adjust_precision = YES; fmt++; if (isdigit((int)*fmt)) { STR_TO_DEC(fmt, precision); } else if (*fmt == '*') { precision = va_arg(ap, int); fmt++; if (precision < 0) precision = 0; } else precision = 0; } else adjust_precision = NO; } else adjust_precision = adjust_width = NO; /* * Modifier check */ if (*fmt == 'l') { is_long = YES; fmt++; } else is_long = NO; /* * Argument extraction and printing. * First we determine the argument type. * Then, we convert the argument to a string. * On exit from the switch, s points to the string that * must be printed, s_len has the length of the string * The precision requirements, if any, are reflected in s_len. * * NOTE: pad_char may be set to '0' because of the 0 flag. * It is reset to ' ' by non-numeric formats */ switch (*fmt) { case 'u': if (is_long) i_num = va_arg(ap, u_wide_int); else i_num = (wide_int) va_arg(ap, unsigned int); /* * The rest also applies to other integer formats, so fall * into that case. */ case 'd': case 'i': /* * Get the arg if we haven't already. */ if ((*fmt) != 'u') { if (is_long) i_num = va_arg(ap, wide_int); else i_num = (wide_int) va_arg(ap, int); }; s = conv_10(i_num, (*fmt) == 'u', &is_negative, &num_buf[NUM_BUF_SIZE], &s_len); FIX_PRECISION(adjust_precision, precision, s, s_len); if (*fmt != 'u') { if (is_negative) prefix_char = '-'; else if (print_sign) prefix_char = '+'; else if (print_blank) prefix_char = ' '; } break; case 'o': if (is_long) ui_num = va_arg(ap, u_wide_int); else ui_num = (u_wide_int) va_arg(ap, unsigned int); s = conv_p2(ui_num, 3, *fmt, &num_buf[NUM_BUF_SIZE], &s_len); FIX_PRECISION(adjust_precision, precision, s, s_len); if (alternate_form && *s != '0') { *--s = '0'; s_len++; } break; case 'x': case 'X': if (is_long) ui_num = (u_wide_int) va_arg(ap, u_wide_int); else ui_num = (u_wide_int) va_arg(ap, unsigned int); s = conv_p2(ui_num, 4, *fmt, &num_buf[NUM_BUF_SIZE], &s_len); FIX_PRECISION(adjust_precision, precision, s, s_len); if (alternate_form && i_num != 0) { *--s = *fmt; /* 'x' or 'X' */ *--s = '0'; s_len += 2; } break; case 's': s = va_arg(ap, char *); if (s != NULL) { s_len = strlen(s); if (adjust_precision && precision < s_len) s_len = precision; } else { s = S_NULL; s_len = S_NULL_LEN; } pad_char = ' '; break; case 'f': case 'e': case 'E': fp_num = va_arg(ap, double); s = conv_fp(*fmt, fp_num, alternate_form, (adjust_precision == NO) ? FLOAT_DIGITS : precision, &is_negative, &num_buf[1], &s_len); if (is_negative) prefix_char = '-'; else if (print_sign) prefix_char = '+'; else if (print_blank) prefix_char = ' '; break; case 'g': case 'G': if (adjust_precision == NO) precision = FLOAT_DIGITS; else if (precision == 0) precision = 1; /* * * We use &num_buf[ 1 ], so that we have room for the sign */ s = ap_gcvt(va_arg(ap, double), precision, &num_buf[1]); if (*s == '-') prefix_char = *s++; else if (print_sign) prefix_char = '+'; else if (print_blank) prefix_char = ' '; s_len = strlen(s); if (alternate_form && (q = strchr(s, '.')) == NULL) s[s_len++] = '.'; if (*fmt == 'G' && (q = strchr(s, 'e')) != NULL) *q = 'E'; break; case 'c': char_buf[0] = (char) (va_arg(ap, int)); s = &char_buf[0]; s_len = 1; pad_char = ' '; break; case '%': char_buf[0] = '%'; s = &char_buf[0]; s_len = 1; pad_char = ' '; break; case 'n': *(va_arg(ap, int *)) = cc; break; /* * Always extract the argument as a "char *" pointer. We * should be using "void *" but there are still machines * that don't understand it. * If the pointer size is equal to the size of an unsigned * integer we convert the pointer to a hex number, otherwise * we print "%p" to indicate that we don't handle "%p". */ case 'p': ui_num = (u_wide_int) va_arg(ap, char *); if (sizeof(char *) <= sizeof(u_wide_int)) s = conv_p2(ui_num, 4, 'x', &num_buf[NUM_BUF_SIZE], &s_len); else { s = "%p"; s_len = 2; } pad_char = ' '; break; case NUL: /* * The last character of the format string was %. * We ignore it. */ continue; /* * The default case is for unrecognized %'s. * We print % to help the user identify what * option is not understood. * This is also useful in case the user wants to pass * the output of format_converter to another function * that understands some other % (like syslog). * Note that we can't point s inside fmt because the * unknown could be preceded by width etc. */ default: char_buf[0] = '%'; char_buf[1] = *fmt; s = char_buf; s_len = 2; pad_char = ' '; break; } if (prefix_char != NUL) { *--s = prefix_char; s_len++; } if (adjust_width && adjust == RIGHT && min_width > s_len) { if (pad_char == '0' && prefix_char != NUL) { INS_CHAR(*s, sp, bep, cc) s++; s_len--; min_width--; } PAD(min_width, s_len, pad_char); } /* * Print the string s. */ for (i = s_len; i != 0; i--) { INS_CHAR(*s, sp, bep, cc); s++; } if (adjust_width && adjust == LEFT && min_width > s_len) PAD(min_width, s_len, pad_char); } fmt++; } odp->nextb = sp; return (cc); } /* * This is the general purpose conversion function. */ static void strx_printv(int *ccp, char *buf, size_t len, const char *format, va_list ap) { buffy od; int cc; /* * First initialize the descriptor * Notice that if no length is given, we initialize buf_end to the * highest possible address. */ od.buf_end = len ? &buf[len] : (char *) ~0; od.nextb = buf; /* * Do the conversion */ cc = format_converter(&od, format, ap); if (len == 0 || od.nextb <= od.buf_end) *(od.nextb) = '\0'; if (ccp) *ccp = cc; } int ap_snprintf(char *buf, size_t len, const char *format,...) { int cc; va_list ap; va_start(ap, format); strx_printv(&cc, buf, (len - 1), format, ap); va_end(ap); return (cc); } int ap_vsnprintf(char *buf, size_t len, const char *format, va_list ap) { int cc; strx_printv(&cc, buf, (len - 1), format, ap); return (cc); } #endif /* HAVE_SNPRINTF */ centerim-4.22.10/libjabber/jid.c0000644000175000001440000001417311461606612013242 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include "jabber.h" jid jid_safe(jid id) { char *str; if(strlen(id->server) == 0 || strlen(id->server) > 255) return NULL; /* lowercase the hostname, make sure it's valid characters */ for(str = id->server; *str != '\0'; str++) { *str = tolower(*str); if(!(isalnum(*str) || *str == '.' || *str == '-' || *str == '_')) return NULL; } /* cut off the user */ if(id->user != NULL && strlen(id->user) > 64) id->user[64] = '\0'; /* check for low and invalid ascii characters in the username */ if(id->user != NULL) for(str = id->user; *str != '\0'; str++) if(*str <= 32 || *str == ':' || *str == '@' || *str == '<' || *str == '>' || *str == '\'' || *str == '"' || *str == '&') return NULL; return id; } jid jid_new(pool p, char *idstr) { char *server, *resource, *type, *str; jid id; if(p == NULL || idstr == NULL || strlen(idstr) == 0) return NULL; /* user@server/resource */ str = pstrdup(p, idstr); id = pmalloc(p,sizeof(struct jid_struct)); id->full = id->server = id->user = id->resource = NULL; id->p = p; id->next = NULL; resource = strstr(str,"/"); if(resource != NULL) { *resource = '\0'; ++resource; if(strlen(resource) > 0) id->resource = resource; }else{ resource = str + strlen(str); /* point to end */ } type = strstr(str,":"); if(type != NULL && type < resource) { *type = '\0'; ++type; str = type; /* ignore the type: prefix */ } server = strstr(str,"@"); if(server == NULL || server > resource) { /* if there's no @, it's just the server address */ id->server = str; }else{ *server = '\0'; ++server; id->server = server; if(strlen(str) > 0) id->user = str; } return jid_safe(id); } void jid_set(jid id, char *str, int item) { char *old; if(id == NULL) return; /* invalidate the cached copy */ id->full = NULL; switch(item) { case JID_RESOURCE: if(str != NULL && strlen(str) != 0) id->resource = pstrdup(id->p, str); else id->resource = NULL; break; case JID_USER: old = id->user; if(str != NULL && strlen(str) != 0) id->user = pstrdup(id->p, str); else id->user = NULL; if(jid_safe(id) == NULL) id->user = old; /* revert if invalid */ break; case JID_SERVER: old = id->server; id->server = pstrdup(id->p, str); if(jid_safe(id) == NULL) id->server = old; /* revert if invalid */ break; } } char *jid_full(jid id) { spool s; if(id == NULL) return NULL; /* use cached copy */ if(id->full != NULL) return id->full; s = spool_new(id->p); if(id->user != NULL) spooler(s, id->user,"@",s); spool_add(s, id->server); if(id->resource != NULL) spooler(s, "/",id->resource,s); id->full = spool_print(s); return id->full; } /* parses a /resource?name=value&foo=bar into an xmlnode representing */ xmlnode jid_xres(jid id) { char *cur, *qmark, *amp, *eq; xmlnode x; if(id == NULL || id->resource == NULL) return NULL; cur = pstrdup(id->p, id->resource); qmark = strstr(cur, "?"); if(qmark == NULL) return NULL; *qmark = '\0'; qmark++; x = _xmlnode_new(id->p, cur, NTYPE_TAG); cur = qmark; while(cur != '\0') { eq = strstr(cur, "="); if(eq == NULL) break; *eq = '\0'; eq++; amp = strstr(eq, "&"); if(amp != NULL) { *amp = '\0'; amp++; } xmlnode_put_attrib(x,cur,eq); if(amp != NULL) cur = amp; else break; } return x; } /* local utils */ int _jid_nullstrcmp(char *a, char *b) { if(a == NULL && b == NULL) return 0; if(a == NULL || b == NULL) return -1; return strcmp(a,b); } int _jid_nullstrcasecmp(char *a, char *b) { if(a == NULL && b == NULL) return 0; if(a == NULL || b == NULL) return -1; return strcasecmp(a,b); } int jid_cmp(jid a, jid b) { if(a == NULL || b == NULL) return -1; if(_jid_nullstrcmp(a->resource, b->resource) != 0) return -1; if(_jid_nullstrcasecmp(a->user, b->user) != 0) return -1; if(_jid_nullstrcmp(a->server, b->server) != 0) return -1; return 0; } /* suggested by Anders Qvist */ int jid_cmpx(jid a, jid b, int parts) { if(a == NULL || b == NULL) return -1; if(parts & JID_RESOURCE && _jid_nullstrcmp(a->resource, b->resource) != 0) return -1; if(parts & JID_USER && _jid_nullstrcasecmp(a->user, b->user) != 0) return -1; if(parts & JID_SERVER && _jid_nullstrcmp(a->server, b->server) != 0) return -1; return 0; } /* makes a copy of b in a's pool, requires a valid a first! */ jid jid_append(jid a, jid b) { jid next; if(a == NULL) return NULL; if(b == NULL) return a; next = a; while(next != NULL) { /* check for dups */ if(jid_cmp(next,b) == 0) break; if(next->next == NULL) next->next = jid_new(a->p,jid_full(b)); next = next->next; } return a; } xmlnode jid_nodescan(jid id, xmlnode x) { xmlnode cur; pool p; jid tmp; if(id == NULL || xmlnode_get_firstchild(x) == NULL) return NULL; p = pool_new(); for(cur = xmlnode_get_firstchild(x); cur != NULL; cur = xmlnode_get_nextsibling(cur)) { if(xmlnode_get_type(cur) != NTYPE_TAG) continue; tmp = jid_new(p,xmlnode_get_attrib(cur,"jid")); if(tmp == NULL) continue; if(jid_cmp(tmp,id) == 0) break; } pool_free(p); return cur; } centerim-4.22.10/libjabber/xmlnode.c0000644000175000001440000004555311461606612014150 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include "libxode.h" /* Internal routines */ xmlnode _xmlnode_new(pool p, const char* name, unsigned int type) { xmlnode result = NULL; if (type > NTYPE_LAST) return NULL; if (type != NTYPE_CDATA && name == NULL) return NULL; if (p == NULL) { p = pool_heap(1*1024); } /* Allocate & zero memory */ result = (xmlnode)pmalloc(p, sizeof(_xmlnode)); memset(result, '\0', sizeof(_xmlnode)); /* Initialize fields */ if (type != NTYPE_CDATA) result->name = pstrdup(p,name); result->type = type; result->p = p; return result; } static xmlnode _xmlnode_append_sibling(xmlnode lastsibling, const char* name, unsigned int type) { xmlnode result; result = _xmlnode_new(xmlnode_pool(lastsibling), name, type); if (result != NULL) { /* Setup sibling pointers */ result->prev = lastsibling; lastsibling->next = result; } return result; } static xmlnode _xmlnode_insert(xmlnode parent, const char* name, unsigned int type) { xmlnode result; if(parent == NULL || name == NULL) return NULL; /* If parent->firstchild is NULL, simply create a new node for the first child */ if (parent->firstchild == NULL) { result = _xmlnode_new(parent->p, name, type); parent->firstchild = result; } /* Otherwise, append this to the lastchild */ else { result= _xmlnode_append_sibling(parent->lastchild, name, type); } result->parent = parent; parent->lastchild = result; return result; } static xmlnode _xmlnode_search(xmlnode firstsibling, const char* name, unsigned int type) { xmlnode current; /* Walk the sibling list, looking for a NTYPE_TAG xmlnode with the specified name */ current = firstsibling; while (current != NULL) { if ((current->type == type) && (j_strcmp(current->name, name) == 0)) return current; else current = current->next; } return NULL; } static char* _xmlnode_merge(pool p, char* dest, unsigned int destsize, const char* src, unsigned int srcsize) { char* result; result = (char*)pmalloc(p, destsize + srcsize + 1); memcpy(result, dest, destsize); memcpy(result+destsize, src, srcsize); result[destsize + srcsize] = '\0'; /* WARNING: major ugly hack: since we're throwing the old data away, let's jump in the pool and subtract it from the size, this is for xmlstream's big-node checking */ p->size -= destsize; return result; } static void _xmlnode_hide_sibling(xmlnode child) { if(child == NULL) return; if(child->prev != NULL) child->prev->next = child->next; if(child->next != NULL) child->next->prev = child->prev; } void _xmlnode_tag2str(spool s, xmlnode node, int flag) { xmlnode tmp; if(flag==0 || flag==1) { spooler(s,"<",xmlnode_get_name(node),s); tmp = xmlnode_get_firstattrib(node); while(tmp) { spooler(s," ",xmlnode_get_name(tmp),"='",strescape(xmlnode_pool(node),xmlnode_get_data(tmp)),"'",s); tmp = xmlnode_get_nextsibling(tmp); } if(flag==0) spool_add(s,"/>"); else spool_add(s,">"); } else { spooler(s,"",s); } } spool _xmlnode2spool(xmlnode node) { spool s; int level=0,dir=0; xmlnode tmp; if(!node || xmlnode_get_type(node)!=NTYPE_TAG) return NULL; s = spool_new(xmlnode_pool(node)); if(!s) return(NULL); while(1) { if(dir==0) { if(xmlnode_get_type(node) == NTYPE_TAG) { if(xmlnode_has_children(node)) { _xmlnode_tag2str(s,node,1); node = xmlnode_get_firstchild(node); level++; continue; } else { _xmlnode_tag2str(s,node,0); } } else { spool_add(s,strescape(xmlnode_pool(node),xmlnode_get_data(node))); } } tmp = xmlnode_get_nextsibling(node); if(!tmp) { node = xmlnode_get_parent(node); level--; if(level>=0) _xmlnode_tag2str(s,node,2); if(level<1) break; dir = 1; } else { node = tmp; dir = 0; } } return s; } /* External routines */ /* * xmlnode_new_tag -- create a tag node * Automatically creates a memory pool for the node. * * parameters * name -- name of the tag * * returns * a pointer to the tag node * or NULL if it was unsuccessfull */ xmlnode xmlnode_new_tag(const char* name) { return _xmlnode_new(NULL, name, NTYPE_TAG); } /* * xmlnode_new_tag_pool -- create a tag node within given pool * * parameters * p -- previously created memory pool * name -- name of the tag * * returns * a pointer to the tag node * or NULL if it was unsuccessfull */ xmlnode xmlnode_new_tag_pool(pool p, const char* name) { return _xmlnode_new(p, name, NTYPE_TAG); } /* * xmlnode_insert_tag -- append a child tag to a tag * * parameters * parent -- pointer to the parent tag * name -- name of the child tag * * returns * a pointer to the child tag node * or NULL if it was unsuccessfull */ xmlnode xmlnode_insert_tag(xmlnode parent, const char* name) { return _xmlnode_insert(parent, name, NTYPE_TAG); } /* * xmlnode_insert_cdata -- append character data to a tag * If last child of the parent is CDATA, merges CDATA nodes. Otherwise * creates a CDATA node, and appends it to the parent's child list. * * parameters * parent -- parent tag * CDATA -- character data * size -- size of CDATA * or -1 for null-terminated CDATA strings * * returns * a pointer to the child CDATA node * or NULL if it was unsuccessfull */ xmlnode xmlnode_insert_cdata(xmlnode parent, const char* CDATA, unsigned int size) { xmlnode result; if(CDATA == NULL || parent == NULL) return NULL; if(size == -1) size = strlen(CDATA); if ((parent->lastchild != NULL) && (parent->lastchild->type == NTYPE_CDATA)) { result = parent->lastchild; result->data = _xmlnode_merge(result->p, result->data, result->data_sz, CDATA, size); result->data_sz = result->data_sz + size; } else { result = _xmlnode_insert(parent, "", NTYPE_CDATA); if (result != NULL) { result->data = (char*)pmalloc(result->p, size + 1); memcpy(result->data, CDATA, size); result->data[size] = '\0'; result->data_sz = size; } } return result; } /* * xmlnode_get_tag -- find given tag in an xmlnode tree * * parameters * parent -- pointer to the parent tag * name -- "name" for the child tag of that name * "name/name" for a sub child (recurses) * "?attrib" to match the first tag with that attrib defined * "?attrib=value" to match the first tag with that attrib and value * or any combination: "name/name/?attrib", etc * * results * a pointer to the tag matching search criteria * or NULL if search was unsuccessfull */ xmlnode xmlnode_get_tag(xmlnode parent, const char* name) { char *str, *slash, *qmark, *equals; xmlnode step, ret; if(parent == NULL || parent->firstchild == NULL || name == NULL || name == '\0') return NULL; if(strstr(name, "/") == NULL && strstr(name,"?") == NULL) return _xmlnode_search(parent->firstchild, name, NTYPE_TAG); /* jer's note: why can't I modify the name directly, why do I have to strdup it? damn c grrr! */ str = strdup(name); slash = strstr(str, "/"); qmark = strstr(str, "?"); equals = strstr(str, "="); if(qmark != NULL && (slash == NULL || qmark < slash)) { /* of type ?attrib */ *qmark = '\0'; qmark++; if(equals != NULL) { *equals = '\0'; equals++; } for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step)) { if(xmlnode_get_type(step) != NTYPE_TAG) continue; if(*str != '\0') if(j_strcmp(xmlnode_get_name(step),str) != 0) continue; if(xmlnode_get_attrib(step,qmark) == NULL) continue; if(equals != NULL && j_strcmp(xmlnode_get_attrib(step,qmark),equals) != 0) continue; break; } free(str); return step; } *slash = '\0'; ++slash; for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step)) { if(xmlnode_get_type(step) != NTYPE_TAG) continue; if(j_strcmp(xmlnode_get_name(step),str) != 0) continue; ret = xmlnode_get_tag(step, slash); if(ret != NULL) { free(str); return ret; } } free(str); return NULL; } /* return the cdata from any tag */ char *xmlnode_get_tag_data(xmlnode parent, const char *name) { xmlnode tag; tag = xmlnode_get_tag(parent, name); if(tag == NULL) return NULL; return xmlnode_get_data(tag); } void xmlnode_put_attrib(xmlnode owner, const char* name, const char* value) { xmlnode attrib; if(owner == NULL || name == NULL || value == NULL) return; /* If there are no existing attributs, allocate a new one to start the list */ if (owner->firstattrib == NULL) { attrib = _xmlnode_new(owner->p, name, NTYPE_ATTRIB); owner->firstattrib = attrib; owner->lastattrib = attrib; } else { attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB); if(attrib == NULL) { attrib = _xmlnode_append_sibling(owner->lastattrib, name, NTYPE_ATTRIB); owner->lastattrib = attrib; } } /* Update the value of the attribute */ attrib->data_sz = strlen(value); attrib->data = pstrdup(owner->p, value); } char* xmlnode_get_attrib(xmlnode owner, const char* name) { xmlnode attrib; if (owner != NULL && owner->firstattrib != NULL) { attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB); if (attrib != NULL) return (char*)attrib->data; } return NULL; } void xmlnode_put_vattrib(xmlnode owner, const char* name, void *value) { xmlnode attrib; if (owner != NULL) { attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB); if (attrib == NULL) { xmlnode_put_attrib(owner, name, ""); attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB); } if (attrib != NULL) attrib->firstchild = (xmlnode)value; } } void* xmlnode_get_vattrib(xmlnode owner, const char* name) { xmlnode attrib; if (owner != NULL && owner->firstattrib != NULL) { attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB); if (attrib != NULL) return (void*)attrib->firstchild; } return NULL; } xmlnode xmlnode_get_firstattrib(xmlnode parent) { if (parent != NULL) return parent->firstattrib; return NULL; } xmlnode xmlnode_get_firstchild(xmlnode parent) { if (parent != NULL) return parent->firstchild; return NULL; } xmlnode xmlnode_get_lastchild(xmlnode parent) { if (parent != NULL) return parent->lastchild; return NULL; } xmlnode xmlnode_get_nextsibling(xmlnode sibling) { if (sibling != NULL) return sibling->next; return NULL; } xmlnode xmlnode_get_prevsibling(xmlnode sibling) { if (sibling != NULL) return sibling->prev; return NULL; } xmlnode xmlnode_get_parent(xmlnode node) { if (node != NULL) return node->parent; return NULL; } char* xmlnode_get_name(xmlnode node) { if (node != NULL) return node->name; return NULL; } char* xmlnode_get_data(xmlnode node) { xmlnode cur; if(node == NULL) return NULL; if(xmlnode_get_type(node) == NTYPE_TAG) /* loop till we find a CDATA */ { for(cur = xmlnode_get_firstchild(node); cur != NULL; cur = xmlnode_get_nextsibling(cur)) if(xmlnode_get_type(cur) == NTYPE_CDATA) return cur->data; }else{ return node->data; } return NULL; } int xmlnode_get_datasz(xmlnode node) { if (node != NULL) return node->data_sz; return (int)NULL; } int xmlnode_get_type(xmlnode node) { if (node != NULL) return node->type; return (int)NULL; } int xmlnode_has_children(xmlnode node) { if ((node != NULL) && (node->firstchild != NULL)) return 1; return 0; } int xmlnode_has_attribs(xmlnode node) { if ((node != NULL) && (node->firstattrib != NULL)) return 1; return 0; } pool xmlnode_pool(xmlnode node) { if (node != NULL) return node->p; return (pool)NULL; } void xmlnode_hide(xmlnode child) { xmlnode parent; if(child == NULL || child->parent == NULL) return; parent = child->parent; /* first fix up at the child level */ _xmlnode_hide_sibling(child); /* next fix up at the parent level */ if(parent->firstchild == child) parent->firstchild = child->next; if(parent->lastchild == child) parent->lastchild = child->prev; } void xmlnode_hide_attrib(xmlnode parent, const char *name) { xmlnode attrib; if(parent == NULL || parent->firstattrib == NULL || name == NULL) return; attrib = _xmlnode_search(parent->firstattrib, name, NTYPE_ATTRIB); if(attrib == NULL) return; /* first fix up at the child level */ _xmlnode_hide_sibling(attrib); /* next fix up at the parent level */ if(parent->firstattrib == attrib) parent->firstattrib = attrib->next; if(parent->lastattrib == attrib) parent->lastattrib = attrib->prev; } /* * xmlnode2str -- convert given xmlnode tree into a string * * parameters * node -- pointer to the xmlnode structure * * results * a pointer to the created string * or NULL if it was unsuccessfull */ char *xmlnode2str(xmlnode node) { return spool_print(_xmlnode2spool(node)); } /* * xmlnode2tstr -- convert given xmlnode tree into a newline terminated string * * parameters * node -- pointer to the xmlnode structure * * results * a pointer to the created string * or NULL if it was unsuccessfull */ char* xmlnode2tstr(xmlnode node) { spool s = _xmlnode2spool(node); if (s != NULL) spool_add(s, "\n"); return spool_print(s); } /* loop through both a and b comparing everything, attribs, cdata, children, etc */ int xmlnode_cmp(xmlnode a, xmlnode b) { int ret = 0; while(1) { if(a == NULL && b == NULL) return 0; if(a == NULL || b == NULL) return -1; if(xmlnode_get_type(a) != xmlnode_get_type(b)) return -1; switch(xmlnode_get_type(a)) { case NTYPE_ATTRIB: ret = j_strcmp(xmlnode_get_name(a), xmlnode_get_name(b)); if(ret != 0) return -1; ret = j_strcmp(xmlnode_get_data(a), xmlnode_get_data(b)); if(ret != 0) return -1; break; case NTYPE_TAG: ret = j_strcmp(xmlnode_get_name(a), xmlnode_get_name(b)); if(ret != 0) return -1; ret = xmlnode_cmp(xmlnode_get_firstattrib(a), xmlnode_get_firstattrib(b)); if(ret != 0) return -1; ret = xmlnode_cmp(xmlnode_get_firstchild(a), xmlnode_get_firstchild(b)); if(ret != 0) return -1; break; case NTYPE_CDATA: ret = j_strcmp(xmlnode_get_data(a), xmlnode_get_data(b)); if(ret != 0) return -1; } a = xmlnode_get_nextsibling(a); b = xmlnode_get_nextsibling(b); } } xmlnode xmlnode_insert_tag_node(xmlnode parent, xmlnode node) { xmlnode child; child = xmlnode_insert_tag(parent, xmlnode_get_name(node)); if (xmlnode_has_attribs(node)) xmlnode_insert_node(child, xmlnode_get_firstattrib(node)); if (xmlnode_has_children(node)) xmlnode_insert_node(child, xmlnode_get_firstchild(node)); return child; } /* places copy of node and node's siblings in parent */ void xmlnode_insert_node(xmlnode parent, xmlnode node) { if(node == NULL || parent == NULL) return; while(node != NULL) { switch(xmlnode_get_type(node)) { case NTYPE_ATTRIB: xmlnode_put_attrib(parent, xmlnode_get_name(node), xmlnode_get_data(node)); break; case NTYPE_TAG: xmlnode_insert_tag_node(parent, node); break; case NTYPE_CDATA: xmlnode_insert_cdata(parent, xmlnode_get_data(node), xmlnode_get_datasz(node)); } node = xmlnode_get_nextsibling(node); } } /* produce full duplicate of x with a new pool, x must be a tag! */ xmlnode xmlnode_dup(xmlnode x) { xmlnode x2; if(x == NULL) return NULL; x2 = xmlnode_new_tag(xmlnode_get_name(x)); if (xmlnode_has_attribs(x)) xmlnode_insert_node(x2, xmlnode_get_firstattrib(x)); if (xmlnode_has_children(x)) xmlnode_insert_node(x2, xmlnode_get_firstchild(x)); return x2; } xmlnode xmlnode_dup_pool(pool p, xmlnode x) { xmlnode x2; if(x == NULL) return NULL; x2 = xmlnode_new_tag_pool(p, xmlnode_get_name(x)); if (xmlnode_has_attribs(x)) xmlnode_insert_node(x2, xmlnode_get_firstattrib(x)); if (xmlnode_has_children(x)) xmlnode_insert_node(x2, xmlnode_get_firstchild(x)); return x2; } xmlnode xmlnode_wrap(xmlnode x,const char *wrapper) { xmlnode wrap; if(x==NULL||wrapper==NULL) return NULL; wrap=xmlnode_new_tag_pool(xmlnode_pool(x),wrapper); if(wrap==NULL) return NULL; wrap->firstchild=x; wrap->lastchild=x; x->parent=wrap; return wrap; } void xmlnode_free(xmlnode node) { if(node == NULL) return; pool_free(node->p); } centerim-4.22.10/libjabber/hashtable.c0000644000175000001440000000774411461606612014435 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in csompliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #include "xmldef.h" #ifdef XML_UNICODE_WCHAR_T #ifndef XML_UNICODE #define XML_UNICODE #endif #endif #include "hashtable.h" #define INIT_SIZE 64 static int keyeq(KEY s1, KEY s2) { for (; *s1 == *s2; s1++, s2++) if (*s1 == 0) return 1; return 0; } static unsigned long hash(KEY s) { unsigned long h = 0; while (*s) h = (h << 5) + h + (unsigned char)*s++; return h; } NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize) { size_t i; if (table->size == 0) { if (!createSize) return 0; table->v = calloc(INIT_SIZE, sizeof(NAMED *)); if (!table->v) return 0; table->size = INIT_SIZE; table->usedLim = INIT_SIZE / 2; i = hash(name) & (table->size - 1); } else { unsigned long h = hash(name); for (i = h & (table->size - 1); table->v[i]; i == 0 ? i = table->size - 1 : --i) { if (keyeq(name, table->v[i]->name)) return table->v[i]; } if (!createSize) return 0; if (table->used == table->usedLim) { /* check for overflow */ size_t newSize = table->size * 2; NAMED **newV = calloc(newSize, sizeof(NAMED *)); if (!newV) return 0; for (i = 0; i < table->size; i++) if (table->v[i]) { size_t j; for (j = hash(table->v[i]->name) & (newSize - 1); newV[j]; j == 0 ? j = newSize - 1 : --j) ; newV[j] = table->v[i]; } free(table->v); table->v = newV; table->size = newSize; table->usedLim = newSize/2; for (i = h & (table->size - 1); table->v[i]; i == 0 ? i = table->size - 1 : --i) ; } } table->v[i] = calloc(1, createSize); if (!table->v[i]) return 0; table->v[i]->name = name; (table->used)++; return table->v[i]; } void hashTableDestroy(HASH_TABLE *table) { size_t i; for (i = 0; i < table->size; i++) { NAMED *p = table->v[i]; if (p) free(p); } free(table->v); } void hashTableInit(HASH_TABLE *p) { p->size = 0; p->usedLim = 0; p->used = 0; p->v = 0; } void hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) { iter->p = table->v; iter->end = iter->p + table->size; } NAMED *hashTableIterNext(HASH_TABLE_ITER *iter) { while (iter->p != iter->end) { NAMED *tem = *(iter->p)++; if (tem) return tem; } return 0; } centerim-4.22.10/libjabber/jabber.h0000644000175000001440000003452711461606612013733 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include "libxode.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_UNAME #include //uname function #endif #ifdef HAVE_THREAD #include #endif #include "connwrap.h" #ifndef INCL_JABBER_H #define INCL_JABBER_H #ifdef __cplusplus extern "C" { #endif //buffer for file-transfer #define SEND_BUF 2048 /* --------------------------------------------------------- */ /* */ /* JID structures & constants */ /* */ /* --------------------------------------------------------- */ #define JID_RESOURCE 1 #define JID_USER 2 #define JID_SERVER 4 typedef struct jid_struct { pool p; char* resource; char* user; char* server; char* full; struct jid_struct *next; /* for lists of jids */ } *jid; struct send_file { char *full_jid_name; char *id; #ifdef HAVE_THREAD pthread_t thread; #endif int transfer_type; char *host; char *url; char *sid_from_to; int port; }; struct pargs_r { int sock; int fd_file; char *hash; long int size; void *rfile; char *url; void (*callback)(void *, long int, long int, int, int); }; jid jid_new(pool p, char *idstr); /* Creates a jabber id from the idstr */ void jid_set(jid id, char *str, int item); /* Individually sets jid components */ char* jid_full(jid id); /* Builds a string type=user/resource@server from the jid data */ int jid_cmp(jid a, jid b); /* Compares two jid's, returns 0 for perfect match */ int jid_cmpx(jid a, jid b, int parts); /* Compares just the parts specified as JID_|JID_ */ jid jid_append(jid a, jid b); /* Appending b to a (list), no dups */ xmlnode jid_xres(jid id); /* Returns xmlnode representation of the resource?query=string */ xmlnode jid_nodescan(jid id, xmlnode x); /* Scans the children of the node for a matching jid attribute */ /* --------------------------------------------------------- */ /* */ /* JPacket structures & constants */ /* */ /* --------------------------------------------------------- */ #define JPACKET_UNKNOWN 0x00 #define JPACKET_MESSAGE 0x01 #define JPACKET_PRESENCE 0x02 #define JPACKET_IQ 0x04 #define JPACKET_S10N 0x08 #define JPACKET__UNKNOWN 0 #define JPACKET__NONE 1 #define JPACKET__ERROR 2 #define JPACKET__CHAT 3 #define JPACKET__GROUPCHAT 4 #define JPACKET__GET 5 #define JPACKET__SET 6 #define JPACKET__RESULT 7 #define JPACKET__SUBSCRIBE 8 #define JPACKET__SUBSCRIBED 9 #define JPACKET__UNSUBSCRIBE 10 #define JPACKET__UNSUBSCRIBED 11 #define JPACKET__AVAILABLE 12 #define JPACKET__UNAVAILABLE 13 #define JPACKET__PROBE 14 #define JPACKET__HEADLINE 15 typedef struct jpacket_struct { unsigned char type; int subtype; int flag; void* aux1; xmlnode x; jid to; jid from; char* iqns; xmlnode iq; pool p; } *jpacket, _jpacket; jpacket jpacket_new(xmlnode x); /* Creates a jabber packet from the xmlnode */ jpacket jpacket_reset(jpacket p); /* Resets the jpacket values based on the xmlnode */ int jpacket_subtype(jpacket p); /* Returns the subtype value (looks at xmlnode for it) */ /* --------------------------------------------------------- */ /* */ /* Presence Proxy DB structures & constants */ /* */ /* --------------------------------------------------------- */ typedef struct ppdb_struct { jid id; /* entry data */ int pri; xmlnode x; struct ppdb_struct* user; /* linked list for user@server */ pool p; /* db-level data */ struct ppdb_struct* next; } _ppdb, *ppdb; ppdb ppdb_insert(ppdb db, jid id, xmlnode x); /* Inserts presence into the proxy */ xmlnode ppdb_primary(ppdb db, jid id); /* Fetches the matching primary presence for the id */ void ppdb_free(ppdb db); /* Frees the db and all entries */ xmlnode ppdb_get(ppdb db, jid id); /* Called successively to return each presence xmlnode */ /* for the id and children, returns NULL at the end */ /* --------------------------------------------------------- */ /* */ /* Simple Jabber Rate limit functions */ /* */ /* --------------------------------------------------------- */ typedef struct jlimit_struct { char *key; int start; int points; int maxt, maxp; pool p; } *jlimit, _jlimit; jlimit jlimit_new(int maxt, int maxp); void jlimit_free(jlimit r); int jlimit_check(jlimit r, char *key, int points); /* --------------------------------------------------------- */ /* */ /* Error structures & constants */ /* */ /* --------------------------------------------------------- */ typedef struct terror_struct { int code; char msg[64]; } terror; #define TERROR_BAD (terror){400,"Bad Request"} #define TERROR_AUTH (terror){401,"Unauthorized"} #define TERROR_PAY (terror){402,"Payment Required"} #define TERROR_FORBIDDEN (terror){403,"Forbidden"} #define TERROR_NOTFOUND (terror){404,"Not Found"} #define TERROR_NOTALLOWED (terror){405,"Not Allowed"} #define TERROR_NOTACCEPTABLE (terror){406,"Not Acceptable"} #define TERROR_REGISTER (terror){407,"Registration Required"} #define TERROR_REQTIMEOUT (terror){408,"Request Timeout"} #define TERROR_CONFLICT (terror){409,"Conflict"} #define TERROR_INTERNAL (terror){500,"Internal Server Error"} #define TERROR_NOTIMPL (terror){501,"Not Implemented"} #define TERROR_EXTERNAL (terror){502,"Remote Server Error"} #define TERROR_UNAVAIL (terror){503,"Service Unavailable"} #define TERROR_EXTTIMEOUT (terror){504,"Remote Server Timeout"} #define TERROR_DISCONNECTED (terror){510,"Disconnected"} /* --------------------------------------------------------- */ /* */ /* Namespace constants */ /* */ /* --------------------------------------------------------- */ #define NSCHECK(x,n) (j_strcmp(xmlnode_get_attrib(x,"xmlns"),n) == 0) #define NS_CLIENT "jabber:client" #define NS_SERVER "jabber:server" #define NS_AUTH "jabber:iq:auth" #define NS_REGISTER "jabber:iq:register" #define NS_ROSTER "jabber:iq:roster" #define NS_OFFLINE "jabber:x:offline" #define NS_AGENT "jabber:iq:agent" #define NS_AGENTS "jabber:iq:agents" #define NS_DELAY "jabber:x:delay" #define NS_DATA "jabber:x:data" #define NS_VERSION "jabber:iq:version" #define NS_TIME "jabber:iq:time" #define NS_VCARD "vcard-temp" #define NS_VCARDUP "vcard-temp:x:update" #define NS_PRIVATE "jabber:iq:private" #define NS_SEARCH "jabber:iq:search" #define NS_OOB "jabber:iq:oob" #define NS_XOOB "jabber:x:oob" #define NS_ADMIN "jabber:iq:admin" #define NS_FILTER "jabber:iq:filter" #define NS_AUTH_0K "jabber:iq:auth:0k" #define NS_RECEIPTS "urn:xmpp:receipts" #define NS_DISCOINFO "http://jabber.org/protocol/disco#info" #define NS_DISCOITEMS "http://jabber.org/protocol/disco#items" #define NS_BYTESTREAMS "http://jabber.org/protocol/bytestreams" #define NS_SI "http://jabber.org/protocol/si" #define NS_SIFILE "http://jabber.org/protocol/si/profile/file-transfer" #define NS_NEG "http://jabber.org/protocol/feature-neg" /* --------------------------------------------------------- */ /* */ /* Message Types */ /* */ /* --------------------------------------------------------- */ #define TMSG_NORMAL "normal" #define TMSG_ERROR "error" #define TMSG_CHAT "chat" #define TMSG_GROUPCHAT "groupchat" #define TMSG_HEADLINE "headline" /* --------------------------------------------------------- */ /* */ /* JUtil functions */ /* */ /* --------------------------------------------------------- */ xmlnode jutil_presnew(int type, char *to, char *status); /* Create a skeleton presence packet */ xmlnode jutil_iqnew(int type, char *ns); /* Create a skeleton iq packet */ xmlnode jutil_iqnew2(int type); /* Create a skeleton iq packet w/o query tag*/ xmlnode jutil_msgnew(char *type, char *to, char *subj, char *body); /* Create a skeleton message packet */ xmlnode jutil_receiptnew(const char *to, const char *id);/* Create a skeleton message receipt packet */ xmlnode jutil_header(char* xmlns, char* server); /* Create a skeleton stream packet */ int jutil_priority(xmlnode x); /* Determine priority of this packet */ void jutil_tofrom(xmlnode x); /* Swaps to/from fields on a packet */ xmlnode jutil_iqresult(xmlnode x); /* Generate a skeleton iq/result, given a iq/query */ char* jutil_timestamp(void); /* Get stringified timestamp */ void jutil_error(xmlnode x, terror E); /* Append an node to x */ void jutil_delay(xmlnode msg, char *reason); /* Append a delay packet to msg */ char* jutil_regkey(char *key, char *seed); /* pass a seed to generate a key, pass the key again to validate (returns it) */ /* --------------------------------------------------------- */ /* */ /* JConn structures & functions */ /* */ /* --------------------------------------------------------- */ #define JCONN_STATE_OFF 0 #define JCONN_STATE_CONNECTED 1 #define JCONN_STATE_ON 2 #define JCONN_STATE_AUTH 3 #define JCONN_STATE_CONNECTING 4 typedef struct jconn_struct { /* Core structure */ pool p; /* Memory allocation pool */ int state; /* Connection state flag */ int cw_state; /* Low level connection state flag */ int fd; /* Connection file descriptor */ char* server; /* The server we'll connect too */ int port; int ssl; jid user; /* User info */ char *pass; /* User passwd */ /* Stream stuff */ int id; /* id counter for jab_getid() function */ char idbuf[9]; /* temporary storage for jab_getid() */ char *sid; /* stream id from server, for digest auth */ XML_Parser parser; /* Parser instance */ xmlnode current; /* Current node in parsing instance.. */ /* Event callback ptrs */ void (*on_state)(struct jconn_struct *j, int state); void (*on_packet)(struct jconn_struct *j, jpacket p); void (*logger)(struct jconn_struct *j, int inout, const char *p); } *jconn, jconn_struct; typedef void (*jconn_state_h)(jconn j, int state); typedef void (*jconn_packet_h)(jconn j, jpacket p); typedef void (*jconn_logger)(jconn j, int inout, const char *p); jconn jab_new(char *user, char *pass, char *server, int port, int ssl); void jab_delete(jconn j); void jab_state_handler(jconn j, jconn_state_h h); void jab_packet_handler(jconn j, jconn_packet_h h); void jab_logger(jconn j, jconn_logger h); void jab_start(jconn j); void jab_stop(jconn j); int jab_getfd(jconn j); jid jab_getjid(jconn j); char *jab_getsid(jconn j); char *jab_getid(jconn j); void jab_send(jconn j, xmlnode x); void jab_send_raw(jconn j, const char *str); void jab_recv(jconn j); void jab_poll(jconn j, int timeout); char *jab_auth(jconn j); char *jab_reg(jconn j); void jabber_send_file(jconn j, const char *filename, long int size, struct send_file *file, void *rfile, void (*function)(void *file, long int bytes, long int size, int status, int conn_type), int start_port, int end_port); //returning ip address and port after binding void *jabber_send_file_fd(void *arg); void *jabber_recieve_file_fd(void *arg); void *jabber_recieve_file_fd_http(void *arg); void jabber_get_file(jconn j, const char *filename, long int size, struct send_file *file, void *rfile, void (*function)(void *file, long int bytes, long int size, int status, int conn_type) ); //returning ip address and port after binding int next_random( int start_port, int end_port ); //generate random number between two digits #ifdef __cplusplus } #endif #endif /* INCL_JABBER_H */ centerim-4.22.10/libjabber/xmltok_impl_c.h0000644000175000001440000014275111473007750015347 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #ifndef IS_INVALID_CHAR #define IS_INVALID_CHAR(enc, ptr, n) (0) #endif #define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (IS_INVALID_CHAR(enc, ptr, n)) { \ *(nextTokPtr) = (ptr); \ return XML_TOK_INVALID; \ } \ ptr += n; \ break; #define INVALID_CASES(ptr, nextTokPtr) \ INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ case BT_NONXML: \ case BT_MALFORM: \ case BT_TRAIL: \ *(nextTokPtr) = (ptr); \ return XML_TOK_INVALID; #define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (!IS_NAME_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ ptr += n; \ break; #define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ case BT_NONASCII: \ if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ case BT_NMSTRT: \ case BT_HEX: \ case BT_DIGIT: \ case BT_NAME: \ case BT_MINUS: \ ptr += MINBPC(enc); \ break; \ CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) #define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ ptr += n; \ break; #define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ case BT_NONASCII: \ if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ case BT_NMSTRT: \ case BT_HEX: \ ptr += MINBPC(enc); \ break; \ CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) #ifndef PREFIX #define PREFIX(ident) ident #endif /* ptr points to character following "')) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_COMMENT; } break; default: ptr += MINBPC(enc); break; } } } return XML_TOK_PARTIAL; } /* ptr points to character following " */ switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: *nextTokPtr = ptr; return XML_TOK_INVALID; } /* fall through */ case BT_S: case BT_CR: case BT_LF: *nextTokPtr = ptr; return XML_TOK_DECL_OPEN; case BT_NMSTRT: case BT_HEX: ptr += MINBPC(enc); break; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end, int *tokPtr) { int upper = 0; *tokPtr = XML_TOK_PI; if (end - ptr != MINBPC(enc)*3) return 1; switch (BYTE_TO_ASCII(enc, ptr)) { case 'x': break; case 'X': upper = 1; break; default: return 1; } ptr += MINBPC(enc); switch (BYTE_TO_ASCII(enc, ptr)) { case 'm': break; case 'M': upper = 1; break; default: return 1; } ptr += MINBPC(enc); switch (BYTE_TO_ASCII(enc, ptr)) { case 'l': break; case 'L': upper = 1; break; default: return 1; } if (upper) return 0; *tokPtr = XML_TOK_XML_DECL; return 1; } /* ptr points to character following "')) { *nextTokPtr = ptr + MINBPC(enc); return tok; } break; default: ptr += MINBPC(enc); break; } } return XML_TOK_PARTIAL; case BT_QUEST: if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { *nextTokPtr = ptr; return XML_TOK_INVALID; } ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr, '>')) { *nextTokPtr = ptr + MINBPC(enc); return tok; } /* fall through */ default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { int i; /* CDATA[ */ if (end - ptr < 6 * MINBPC(enc)) return XML_TOK_PARTIAL; for (i = 0; i < 6; i++, ptr += MINBPC(enc)) { if (!CHAR_MATCHES(enc, ptr, "CDATA["[i])) { *nextTokPtr = ptr; return XML_TOK_INVALID; } } *nextTokPtr = ptr; return XML_TOK_CDATA_SECT_OPEN; } static int PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_NONE; if (MINBPC(enc) > 1) { size_t n = end - ptr; if (n & (MINBPC(enc) - 1)) { n &= ~(MINBPC(enc) - 1); if (n == 0) return XML_TOK_PARTIAL; end = ptr + n; } } switch (BYTE_TYPE(enc, ptr)) { case BT_RSQB: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; if (!CHAR_MATCHES(enc, ptr, ']')) break; ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; if (!CHAR_MATCHES(enc, ptr, '>')) { ptr -= MINBPC(enc); break; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_CDATA_SECT_CLOSE; case BT_CR: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; case BT_LF: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DATA_NEWLINE; INVALID_CASES(ptr, nextTokPtr) default: ptr += MINBPC(enc); break; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_DATA_CHARS; \ } \ ptr += n; \ break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NONXML: case BT_MALFORM: case BT_TRAIL: case BT_CR: case BT_LF: case BT_RSQB: *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC(enc); break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } /* ptr points to character following "')) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_EMPTY_ELEMENT_WITH_ATTS; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } break; } break; } default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } /* ptr points to character following "<" */ static int PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { #ifdef XML_NS int hadColon; #endif if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) case BT_EXCL: if ((ptr += MINBPC(enc)) == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { case BT_MINUS: return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_LSQB: return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr); } *nextTokPtr = ptr; return XML_TOK_INVALID; case BT_QUEST: return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_SOL: return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr); default: *nextTokPtr = ptr; return XML_TOK_INVALID; } #ifdef XML_NS hadColon = 0; #endif /* we have a start-tag */ while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) #ifdef XML_NS case BT_COLON: if (hadColon) { *nextTokPtr = ptr; return XML_TOK_INVALID; } hadColon = 1; ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) default: *nextTokPtr = ptr; return XML_TOK_INVALID; } break; #endif case BT_S: case BT_CR: case BT_LF: { ptr += MINBPC(enc); while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) case BT_GT: goto gt; case BT_SOL: goto sol; case BT_S: case BT_CR: case BT_LF: ptr += MINBPC(enc); continue; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr); } return XML_TOK_PARTIAL; } case BT_GT: gt: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_START_TAG_NO_ATTS; case BT_SOL: sol: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; if (!CHAR_MATCHES(enc, ptr, '>')) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_EMPTY_ELEMENT_NO_ATTS; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_NONE; if (MINBPC(enc) > 1) { size_t n = end - ptr; if (n & (MINBPC(enc) - 1)) { n &= ~(MINBPC(enc) - 1); if (n == 0) return XML_TOK_PARTIAL; end = ptr + n; } } switch (BYTE_TYPE(enc, ptr)) { case BT_LT: return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_AMP: return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_CR: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_CR; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; case BT_LF: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DATA_NEWLINE; case BT_RSQB: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_RSQB; if (!CHAR_MATCHES(enc, ptr, ']')) break; ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_RSQB; if (!CHAR_MATCHES(enc, ptr, '>')) { ptr -= MINBPC(enc); break; } *nextTokPtr = ptr; return XML_TOK_INVALID; INVALID_CASES(ptr, nextTokPtr) default: ptr += MINBPC(enc); break; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_DATA_CHARS; \ } \ ptr += n; \ break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_RSQB: if (ptr + MINBPC(enc) != end) { if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ']')) { ptr += MINBPC(enc); break; } if (ptr + 2*MINBPC(enc) != end) { if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), '>')) { ptr += MINBPC(enc); break; } *nextTokPtr = ptr + 2*MINBPC(enc); return XML_TOK_INVALID; } } /* fall through */ case BT_AMP: case BT_LT: case BT_NONXML: case BT_MALFORM: case BT_TRAIL: case BT_CR: case BT_LF: *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC(enc); break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } /* ptr points to character following "%" */ static int PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: *nextTokPtr = ptr; return XML_TOK_PERCENT; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_SEMI: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_PARAM_ENTITY_REF; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_CR: case BT_LF: case BT_S: case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: *nextTokPtr = ptr; return XML_TOK_POUND_NAME; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { while (ptr != end) { int t = BYTE_TYPE(enc, ptr); switch (t) { INVALID_CASES(ptr, nextTokPtr) case BT_QUOT: case BT_APOS: ptr += MINBPC(enc); if (t != open) break; if (ptr == end) return XML_TOK_PARTIAL; *nextTokPtr = ptr; switch (BYTE_TYPE(enc, ptr)) { case BT_S: case BT_CR: case BT_LF: case BT_GT: case BT_PERCNT: case BT_LSQB: return XML_TOK_LITERAL; default: return XML_TOK_INVALID; } default: ptr += MINBPC(enc); break; } } return XML_TOK_PARTIAL; } static int PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { int tok; if (ptr == end) return XML_TOK_NONE; if (MINBPC(enc) > 1) { size_t n = end - ptr; if (n & (MINBPC(enc) - 1)) { n &= ~(MINBPC(enc) - 1); if (n == 0) return XML_TOK_PARTIAL; end = ptr + n; } } switch (BYTE_TYPE(enc, ptr)) { case BT_QUOT: return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_APOS: return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_LT: { ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { case BT_EXCL: return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_QUEST: return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_NMSTRT: case BT_HEX: case BT_NONASCII: case BT_LEAD2: case BT_LEAD3: case BT_LEAD4: *nextTokPtr = ptr - MINBPC(enc); return XML_TOK_INSTANCE_START; } *nextTokPtr = ptr; return XML_TOK_INVALID; } case BT_CR: if (ptr + MINBPC(enc) == end) return XML_TOK_TRAILING_CR; /* fall through */ case BT_S: case BT_LF: for (;;) { ptr += MINBPC(enc); if (ptr == end) break; switch (BYTE_TYPE(enc, ptr)) { case BT_S: case BT_LF: break; case BT_CR: /* don't split CR/LF pair */ if (ptr + MINBPC(enc) != end) break; /* fall through */ default: *nextTokPtr = ptr; return XML_TOK_PROLOG_S; } } *nextTokPtr = ptr; return XML_TOK_PROLOG_S; case BT_PERCNT: return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_COMMA: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_COMMA; case BT_LSQB: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_OPEN_BRACKET; case BT_RSQB: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr, ']')) { if (ptr + MINBPC(enc) == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr + MINBPC(enc), '>')) { *nextTokPtr = ptr + 2*MINBPC(enc); return XML_TOK_COND_SECT_CLOSE; } } *nextTokPtr = ptr; return XML_TOK_CLOSE_BRACKET; case BT_LPAR: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_OPEN_PAREN; case BT_RPAR: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { case BT_AST: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_CLOSE_PAREN_ASTERISK; case BT_QUEST: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_CLOSE_PAREN_QUESTION; case BT_PLUS: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_CLOSE_PAREN_PLUS; case BT_CR: case BT_LF: case BT_S: case BT_GT: case BT_COMMA: case BT_VERBAR: case BT_RPAR: *nextTokPtr = ptr; return XML_TOK_CLOSE_PAREN; } *nextTokPtr = ptr; return XML_TOK_INVALID; case BT_VERBAR: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_OR; case BT_GT: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DECL_CLOSE; case BT_NUM: return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ ptr += n; \ tok = XML_TOK_NAME; \ break; \ } \ if (IS_NAME_CHAR(enc, ptr, n)) { \ ptr += n; \ tok = XML_TOK_NMTOKEN; \ break; \ } \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NMSTRT: case BT_HEX: tok = XML_TOK_NAME; ptr += MINBPC(enc); break; case BT_DIGIT: case BT_NAME: case BT_MINUS: #ifdef XML_NS case BT_COLON: #endif tok = XML_TOK_NMTOKEN; ptr += MINBPC(enc); break; case BT_NONASCII: if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { ptr += MINBPC(enc); tok = XML_TOK_NAME; break; } if (IS_NAME_CHAR_MINBPC(enc, ptr)) { ptr += MINBPC(enc); tok = XML_TOK_NMTOKEN; break; } /* fall through */ default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_GT: case BT_RPAR: case BT_COMMA: case BT_VERBAR: case BT_LSQB: case BT_PERCNT: case BT_S: case BT_CR: case BT_LF: *nextTokPtr = ptr; return tok; #ifdef XML_NS case BT_COLON: ptr += MINBPC(enc); switch (tok) { case XML_TOK_NAME: if (ptr == end) return XML_TOK_PARTIAL; tok = XML_TOK_PREFIXED_NAME; switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) default: tok = XML_TOK_NMTOKEN; break; } break; case XML_TOK_PREFIXED_NAME: tok = XML_TOK_NMTOKEN; break; } break; #endif case BT_PLUS: if (tok == XML_TOK_NMTOKEN) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_NAME_PLUS; case BT_AST: if (tok == XML_TOK_NMTOKEN) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_NAME_ASTERISK; case BT_QUEST: if (tok == XML_TOK_NMTOKEN) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_NAME_QUESTION; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { const char *start; if (ptr == end) return XML_TOK_NONE; start = ptr; while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: ptr += n; break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_AMP: if (ptr == start) return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_LT: /* this is for inside entity references */ *nextTokPtr = ptr; return XML_TOK_INVALID; case BT_LF: if (ptr == start) { *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_CR: if (ptr == start) { ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_CR; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_S: if (ptr == start) { *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_ATTRIBUTE_VALUE_S; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC(enc); break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } static int PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { const char *start; if (ptr == end) return XML_TOK_NONE; start = ptr; while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: ptr += n; break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_AMP: if (ptr == start) return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_PERCNT: if (ptr == start) return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_LF: if (ptr == start) { *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_CR: if (ptr == start) { ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_CR; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC(enc); break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } static int PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, const char **badPtr) { ptr += MINBPC(enc); end -= MINBPC(enc); for (; ptr != end; ptr += MINBPC(enc)) { switch (BYTE_TYPE(enc, ptr)) { case BT_DIGIT: case BT_HEX: case BT_MINUS: case BT_APOS: case BT_LPAR: case BT_RPAR: case BT_PLUS: case BT_COMMA: case BT_SOL: case BT_EQUALS: case BT_QUEST: case BT_CR: case BT_LF: case BT_SEMI: case BT_EXCL: case BT_AST: case BT_PERCNT: case BT_NUM: #ifdef XML_NS case BT_COLON: #endif break; case BT_S: if (CHAR_MATCHES(enc, ptr, '\t')) { *badPtr = ptr; return 0; } break; case BT_NAME: case BT_NMSTRT: if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) break; default: switch (BYTE_TO_ASCII(enc, ptr)) { case 0x24: /* $ */ case 0x40: /* @ */ break; default: *badPtr = ptr; return 0; } break; } } return 1; } /* This must only be called for a well-formed start-tag or empty element tag. Returns the number of attributes. Pointers to the first attsMax attributes are stored in atts. */ static int PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax, ATTRIBUTE *atts) { enum { other, inName, inValue } state = inName; int nAtts = 0; int open; for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { switch (BYTE_TYPE(enc, ptr)) { #define START_NAME \ if (state == other) { \ if (nAtts < attsMax) { \ atts[nAtts].name = ptr; \ atts[nAtts].normalized = 1; \ } \ state = inName; \ } #define LEAD_CASE(n) \ case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NONASCII: case BT_NMSTRT: case BT_HEX: START_NAME break; #undef START_NAME case BT_QUOT: if (state != inValue) { if (nAtts < attsMax) atts[nAtts].valuePtr = ptr + MINBPC(enc); state = inValue; open = BT_QUOT; } else if (open == BT_QUOT) { state = other; if (nAtts < attsMax) atts[nAtts].valueEnd = ptr; nAtts++; } break; case BT_APOS: if (state != inValue) { if (nAtts < attsMax) atts[nAtts].valuePtr = ptr + MINBPC(enc); state = inValue; open = BT_APOS; } else if (open == BT_APOS) { state = other; if (nAtts < attsMax) atts[nAtts].valueEnd = ptr; nAtts++; } break; case BT_AMP: if (nAtts < attsMax) atts[nAtts].normalized = 0; break; case BT_S: if (state == inName) state = other; else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized && (ptr == atts[nAtts].valuePtr || BYTE_TO_ASCII(enc, ptr) != ' ' || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ' ' || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) atts[nAtts].normalized = 0; break; case BT_CR: case BT_LF: /* This case ensures that the first attribute name is counted Apart from that we could just change state on the quote. */ if (state == inName) state = other; else if (state == inValue && nAtts < attsMax) atts[nAtts].normalized = 0; break; case BT_GT: case BT_SOL: if (state != inValue) return nAtts; break; default: break; } } /* not reached */ } static int PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) { int result = 0; /* skip &# */ ptr += 2*MINBPC(enc); if (CHAR_MATCHES(enc, ptr, 'x')) { for (ptr += MINBPC(enc); !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC(enc)) { int c = BYTE_TO_ASCII(enc, ptr); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': result <<= 4; result |= (c - '0'); break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': result <<= 4; result += 10 + (c - 'A'); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': result <<= 4; result += 10 + (c - 'a'); break; } if (result >= 0x110000) return -1; } } else { for (; !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC(enc)) { int c = BYTE_TO_ASCII(enc, ptr); result *= 10; result += (c - '0'); if (result >= 0x110000) return -1; } } return checkCharRefNumber(result); } static int PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, const char *end) { switch ((end - ptr)/MINBPC(enc)) { case 2: if (CHAR_MATCHES(enc, ptr + MINBPC(enc), 't')) { switch (BYTE_TO_ASCII(enc, ptr)) { case 'l': return '<'; case 'g': return '>'; } } break; case 3: if (CHAR_MATCHES(enc, ptr, 'a')) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, 'm')) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, 'p')) return '&'; } } break; case 4: switch (BYTE_TO_ASCII(enc, ptr)) { case 'q': ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, 'u')) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, 'o')) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, 't')) return '"'; } } break; case 'a': ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, 'p')) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, 'o')) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, 's')) return '\''; } } break; } } return 0; } static int PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) { for (;;) { switch (BYTE_TYPE(enc, ptr1)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (*ptr1++ != *ptr2++) \ return 0; LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) #undef LEAD_CASE /* fall through */ if (*ptr1++ != *ptr2++) return 0; break; case BT_NONASCII: case BT_NMSTRT: #ifdef XML_NS case BT_COLON: #endif case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: if (*ptr2++ != *ptr1++) return 0; if (MINBPC(enc) > 1) { if (*ptr2++ != *ptr1++) return 0; if (MINBPC(enc) > 2) { if (*ptr2++ != *ptr1++) return 0; if (MINBPC(enc) > 3) { if (*ptr2++ != *ptr1++) return 0; } } } break; default: if (MINBPC(enc) == 1 && *ptr1 == *ptr2) return 1; switch (BYTE_TYPE(enc, ptr2)) { case BT_LEAD2: case BT_LEAD3: case BT_LEAD4: case BT_NONASCII: case BT_NMSTRT: #ifdef XML_NS case BT_COLON: #endif case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: return 0; default: return 1; } } } /* not reached */ } static int PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, const char *ptr2) { for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { if (!CHAR_MATCHES(enc, ptr1, *ptr2)) return 0; } switch (BYTE_TYPE(enc, ptr1)) { case BT_LEAD2: case BT_LEAD3: case BT_LEAD4: case BT_NONASCII: case BT_NMSTRT: #ifdef XML_NS case BT_COLON: #endif case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: return 0; default: return 1; } } static int PREFIX(nameLength)(const ENCODING *enc, const char *ptr) { const char *start = ptr; for (;;) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: ptr += n; break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NONASCII: case BT_NMSTRT: #ifdef XML_NS case BT_COLON: #endif case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: ptr += MINBPC(enc); break; default: return ptr - start; } } } static const char *PREFIX(skipS)(const ENCODING *enc, const char *ptr) { for (;;) { switch (BYTE_TYPE(enc, ptr)) { case BT_LF: case BT_CR: case BT_S: ptr += MINBPC(enc); break; default: return ptr; } } } static void PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end, POSITION *pos) { while (ptr < end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ ptr += n; \ break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_LF: pos->columnNumber = (unsigned)-1; pos->lineNumber++; ptr += MINBPC(enc); break; case BT_CR: pos->lineNumber++; ptr += MINBPC(enc); if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); pos->columnNumber = (unsigned)-1; break; default: ptr += MINBPC(enc); break; } pos->columnNumber++; } } #undef DO_LEAD_CASE #undef MULTIBYTE_CASES #undef INVALID_CASES #undef CHECK_NAME_CASE #undef CHECK_NAME_CASES #undef CHECK_NMSTRT_CASE #undef CHECK_NMSTRT_CASES centerim-4.22.10/libjabber/xmltok_ns_c.h0000644000175000001440000000716711461606612015026 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ const ENCODING *NS(XmlGetUtf8InternalEncoding)() { return &ns(internal_utf8_encoding).enc; } const ENCODING *NS(XmlGetUtf16InternalEncoding)() { #if XML_BYTE_ORDER == 12 return &ns(internal_little2_encoding).enc; #elif XML_BYTE_ORDER == 21 return &ns(internal_big2_encoding).enc; #else const short n = 1; return *(const char *)&n ? &ns(internal_little2_encoding).enc : &ns(internal_big2_encoding).enc; #endif } static const ENCODING *NS(encodings)[] = { &ns(latin1_encoding).enc, &ns(ascii_encoding).enc, &ns(utf8_encoding).enc, &ns(big2_encoding).enc, &ns(big2_encoding).enc, &ns(little2_encoding).enc, &ns(utf8_encoding).enc /* NO_ENC */ }; static int NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_PROLOG_STATE, ptr, end, nextTokPtr); } static int NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_CONTENT_STATE, ptr, end, nextTokPtr); } int NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, const char *name) { int i = getEncodingIndex(name); if (i == UNKNOWN_ENC) return 0; INIT_ENC_INDEX(p) = (char)i; p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); p->initEnc.updatePosition = initUpdatePosition; p->encPtr = encPtr; *encPtr = &(p->initEnc); return 1; } static const ENCODING *NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) { #define ENCODING_MAX 128 char buf[ENCODING_MAX]; char *p = buf; int i; XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); if (ptr != end) return 0; *p = 0; if (streqci(buf, "UTF-16") && enc->minBytesPerChar == 2) return enc; i = getEncodingIndex(buf); if (i == UNKNOWN_ENC) return 0; return NS(encodings)[i]; } int NS(XmlParseXmlDecl)(int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingName, const ENCODING **encoding, int *standalone) { return doParseXmlDecl(NS(findEncoding), isGeneralTextEntity, enc, ptr, end, badPtr, versionPtr, encodingName, encoding, standalone); } centerim-4.22.10/libjabber/jutil.c0000644000175000001440000001406211461606612013620 00000000000000#include "jabber.h" /* util for making presence packets */ xmlnode jutil_presnew(int type, char *to, char *status) { xmlnode pres; pres = xmlnode_new_tag("presence"); switch(type) { case JPACKET__SUBSCRIBE: xmlnode_put_attrib(pres,"type","subscribe"); break; case JPACKET__UNSUBSCRIBE: xmlnode_put_attrib(pres,"type","unsubscribe"); break; case JPACKET__SUBSCRIBED: xmlnode_put_attrib(pres,"type","subscribed"); break; case JPACKET__UNSUBSCRIBED: xmlnode_put_attrib(pres,"type","unsubscribed"); break; case JPACKET__PROBE: xmlnode_put_attrib(pres,"type","probe"); break; case JPACKET__UNAVAILABLE: xmlnode_put_attrib(pres,"type","unavailable"); break; } if(to != NULL) xmlnode_put_attrib(pres,"to",to); if(status != NULL) xmlnode_insert_cdata(xmlnode_insert_tag(pres,"status"),status,strlen(status)); return pres; } xmlnode jutil_iqnew2(int type) //create iq packet w/o query tag, required for later patches, such as file transfer, send version and etc. { xmlnode iq; iq = xmlnode_new_tag("iq"); switch(type) { case JPACKET__GET: xmlnode_put_attrib(iq,"type","get"); break; case JPACKET__SET: xmlnode_put_attrib(iq,"type","set"); break; case JPACKET__RESULT: xmlnode_put_attrib(iq,"type","result"); break; case JPACKET__ERROR: xmlnode_put_attrib(iq,"type","error"); break; } return iq; } /* util for making IQ packets */ xmlnode jutil_iqnew(int type, char *ns) { xmlnode iq; iq = xmlnode_new_tag("iq"); switch(type) { case JPACKET__GET: xmlnode_put_attrib(iq,"type","get"); break; case JPACKET__SET: xmlnode_put_attrib(iq,"type","set"); break; case JPACKET__RESULT: xmlnode_put_attrib(iq,"type","result"); break; case JPACKET__ERROR: xmlnode_put_attrib(iq,"type","error"); break; } xmlnode_put_attrib(xmlnode_insert_tag(iq,"query"),"xmlns",ns); return iq; } /* util for making message packets */ xmlnode jutil_msgnew(char *type, char *to, char *subj, char *body) { xmlnode msg; msg = xmlnode_new_tag("message"); xmlnode_put_attrib (msg, "type", type); xmlnode_put_attrib (msg, "to", to); if (subj) { xmlnode_insert_cdata (xmlnode_insert_tag (msg, "subject"), subj, strlen (subj)); } xmlnode_insert_cdata (xmlnode_insert_tag (msg, "body"), body, strlen (body)); return msg; } /* util for making message receipt packets */ xmlnode jutil_receiptnew(const char *to, const char *id) { xmlnode msg; msg = xmlnode_new_tag("message"); xmlnode_put_attrib (msg, "to", to); if(id != NULL) xmlnode_put_attrib (msg, "id", id); xmlnode_put_attrib(xmlnode_insert_tag (msg, "received"), "xmlns", "urn:xmpp:receipts"); return msg; } /* util for making stream packets */ xmlnode jutil_header(char* xmlns, char* server) { xmlnode result; if ((xmlns == NULL)||(server == NULL)) return NULL; result = xmlnode_new_tag("stream:stream"); xmlnode_put_attrib(result, "xmlns:stream", "http://etherx.jabber.org/streams"); xmlnode_put_attrib(result, "xmlns", xmlns); xmlnode_put_attrib(result, "to", server); return result; } /* returns the priority on a presence packet */ int jutil_priority(xmlnode x) { char *str; int p; if(x == NULL) return -1; if(xmlnode_get_attrib(x,"type") != NULL) return -1; x = xmlnode_get_tag(x,"priority"); if(x == NULL) return 0; str = xmlnode_get_data((x)); if(str == NULL) return 0; p = atoi(str); return ((char)p); } void jutil_tofrom(xmlnode x) { char *to, *from; to = xmlnode_get_attrib(x,"to"); from = xmlnode_get_attrib(x,"from"); xmlnode_put_attrib(x,"from",to); xmlnode_put_attrib(x,"to",from); } xmlnode jutil_iqresult(xmlnode x) { xmlnode cur; jutil_tofrom(x); xmlnode_put_attrib(x,"type","result"); /* hide all children of the iq, they go back empty */ for(cur = xmlnode_get_firstchild(x); cur != NULL; cur = xmlnode_get_nextsibling(cur)) xmlnode_hide(cur); return x; } char *jutil_timestamp(void) { time_t t; struct tm *new_time; static char timestamp[18]; int ret; t = time(NULL); if(t == (time_t)-1) return NULL; new_time = gmtime(&t); ret = snprintf(timestamp, 18, "%d%02d%02dT%02d:%02d:%02d", 1900+new_time->tm_year, new_time->tm_mon+1, new_time->tm_mday, new_time->tm_hour, new_time->tm_min, new_time->tm_sec); if(ret == -1) return NULL; return timestamp; } void jutil_error(xmlnode x, terror E) { xmlnode err; char code[4]; xmlnode_put_attrib(x,"type","error"); err = xmlnode_insert_tag(x,"error"); snprintf(code,4,"%d",E.code); xmlnode_put_attrib(err,"code",code); if(E.msg != NULL) xmlnode_insert_cdata(err,E.msg,strlen(E.msg)); jutil_tofrom(x); } void jutil_delay(xmlnode msg, char *reason) { xmlnode delay; delay = xmlnode_insert_tag(msg,"x"); xmlnode_put_attrib(delay,"xmlns",NS_DELAY); xmlnode_put_attrib(delay,"from",xmlnode_get_attrib(msg,"to")); xmlnode_put_attrib(delay,"stamp",jutil_timestamp()); if(reason != NULL) xmlnode_insert_cdata(delay,reason,strlen(reason)); } #define KEYBUF 100 char *jutil_regkey(char *key, char *seed) { static char keydb[KEYBUF][41]; static char seeddb[KEYBUF][41]; static int last = -1; char *str, strint[32]; int i; /* blanket the keydb first time */ if(last == -1) { last = 0; memset(&keydb,0,KEYBUF*41); memset(&seeddb,0,KEYBUF*41); srand(time(NULL)); } /* creation phase */ if(key == NULL && seed != NULL) { /* create a random key hash and store it */ sprintf(strint,"%d",rand()); strcpy(keydb[last],shahash(strint)); /* store a hash for the seed associated w/ this key */ strcpy(seeddb[last],shahash(seed)); /* return it all */ str = keydb[last]; last++; if(last == KEYBUF) last = 0; return str; } /* validation phase */ str = shahash(seed); for(i=0;ikey = NULL; r->start = r->points = 0; r->maxt = maxt; r->maxp = maxp; r->p = p; return r; } void jlimit_free(jlimit r) { if(r != NULL) { if(r->key != NULL) free(r->key); pool_free(r->p); } } int jlimit_check(jlimit r, char *key, int points) { int now = time(NULL); if(r == NULL) return 0; /* make sure we didn't go over the time frame or get a null/new key */ if((now - r->start) > r->maxt || key == NULL || j_strcmp(key,r->key) != 0) { /* start a new key */ free(r->key); if(key != NULL) /* We use strdup instead of pstrdup since r->key needs to be free'd before and more often than the rest of the rlimit structure */ r->key = strdup(key); else r->key = NULL; r->start = now; r->points = 0; } r->points += points; /* if we're within the time frame and over the point limit */ if(r->points > r->maxp && (now - r->start) < r->maxt) { return 1; /* we don't reset the rate here, so that it remains rated until the time runs out */ } return 0; } centerim-4.22.10/libjabber/asciitab.h0000644000175000001440000000554411461606612014262 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ /* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, /* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, /* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, /* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, /* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, /* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, /* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, /* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, /* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, /* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, /* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, centerim-4.22.10/libjabber/xmlrole.c0000644000175000001440000006656511461606612014172 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #include "xmldef.h" #include "xmlrole.h" /* Doesn't check: that ,| are not mixed in a model group content of literals */ #ifndef MIN_BYTES_PER_CHAR #define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) #endif typedef int PROLOG_HANDLER(struct prolog_state *state, int tok, const char *ptr, const char *end, const ENCODING *enc); static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2, entity3, entity4, entity5, entity6, entity7, entity8, entity9, notation0, notation1, notation2, notation3, notation4, attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8, attlist9, element0, element1, element2, element3, element4, element5, element6, element7, declClose, error; static int syntaxError(PROLOG_STATE *); static int prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: state->handler = prolog1; return XML_ROLE_NONE; case XML_TOK_XML_DECL: state->handler = prolog1; return XML_ROLE_XML_DECL; case XML_TOK_PI: state->handler = prolog1; return XML_ROLE_NONE; case XML_TOK_COMMENT: state->handler = prolog1; case XML_TOK_BOM: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: if (!XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "DOCTYPE")) break; state->handler = doctype0; return XML_ROLE_NONE; case XML_TOK_INSTANCE_START: state->handler = error; return XML_ROLE_INSTANCE_START; } return syntaxError(state); } static int prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_PI: case XML_TOK_COMMENT: case XML_TOK_BOM: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: if (!XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "DOCTYPE")) break; state->handler = doctype0; return XML_ROLE_NONE; case XML_TOK_INSTANCE_START: state->handler = error; return XML_ROLE_INSTANCE_START; } return syntaxError(state); } static int prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_PI: case XML_TOK_COMMENT: return XML_ROLE_NONE; case XML_TOK_INSTANCE_START: state->handler = error; return XML_ROLE_INSTANCE_START; } return syntaxError(state); } static int doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = doctype1; return XML_ROLE_DOCTYPE_NAME; } return syntaxError(state); } static int doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_BRACKET: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = prolog2; return XML_ROLE_DOCTYPE_CLOSE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) { state->handler = doctype3; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) { state->handler = doctype2; return XML_ROLE_NONE; } break; } return syntaxError(state); } static int doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = doctype3; return XML_ROLE_DOCTYPE_PUBLIC_ID; } return syntaxError(state); } static int doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = doctype4; return XML_ROLE_DOCTYPE_SYSTEM_ID; } return syntaxError(state); } static int doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_BRACKET: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = prolog2; return XML_ROLE_DOCTYPE_CLOSE; } return syntaxError(state); } static int doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = prolog2; return XML_ROLE_DOCTYPE_CLOSE; } return syntaxError(state); } static int internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "ENTITY")) { state->handler = entity0; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "ATTLIST")) { state->handler = attlist0; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "ELEMENT")) { state->handler = element0; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "NOTATION")) { state->handler = notation0; return XML_ROLE_NONE; } break; case XML_TOK_PI: case XML_TOK_COMMENT: return XML_ROLE_NONE; case XML_TOK_PARAM_ENTITY_REF: return XML_ROLE_PARAM_ENTITY_REF; case XML_TOK_CLOSE_BRACKET: state->handler = doctype5; return XML_ROLE_NONE; } return syntaxError(state); } static int entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_PERCENT: state->handler = entity1; return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = entity2; return XML_ROLE_GENERAL_ENTITY_NAME; } return syntaxError(state); } static int entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = entity7; return XML_ROLE_PARAM_ENTITY_NAME; } return syntaxError(state); } static int entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) { state->handler = entity4; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) { state->handler = entity3; return XML_ROLE_NONE; } break; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_ENTITY_VALUE; } return syntaxError(state); } static int entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = entity4; return XML_ROLE_ENTITY_PUBLIC_ID; } return syntaxError(state); } static int entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = entity5; return XML_ROLE_ENTITY_SYSTEM_ID; } return syntaxError(state); } static int entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "NDATA")) { state->handler = entity6; return XML_ROLE_NONE; } break; } return syntaxError(state); } static int entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = declClose; return XML_ROLE_ENTITY_NOTATION_NAME; } return syntaxError(state); } static int entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) { state->handler = entity9; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) { state->handler = entity8; return XML_ROLE_NONE; } break; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_ENTITY_VALUE; } return syntaxError(state); } static int entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = entity9; return XML_ROLE_ENTITY_PUBLIC_ID; } return syntaxError(state); } static int entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_ENTITY_SYSTEM_ID; } return syntaxError(state); } static int notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = notation1; return XML_ROLE_NOTATION_NAME; } return syntaxError(state); } static int notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) { state->handler = notation3; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) { state->handler = notation2; return XML_ROLE_NONE; } break; } return syntaxError(state); } static int notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = notation4; return XML_ROLE_NOTATION_PUBLIC_ID; } return syntaxError(state); } static int notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_NOTATION_SYSTEM_ID; } return syntaxError(state); } static int notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_NOTATION_SYSTEM_ID; case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return XML_ROLE_NOTATION_NO_SYSTEM_ID; } return syntaxError(state); } static int attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = attlist1; return XML_ROLE_ATTLIST_ELEMENT_NAME; } return syntaxError(state); } static int attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = attlist2; return XML_ROLE_ATTRIBUTE_NAME; } return syntaxError(state); } static int attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: { static const char *types[] = { "CDATA", "ID", "IDREF", "IDREFS", "ENTITY", "ENTITIES", "NMTOKEN", "NMTOKENS", }; int i; for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) if (XmlNameMatchesAscii(enc, ptr, types[i])) { state->handler = attlist8; return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; } } if (XmlNameMatchesAscii(enc, ptr, "NOTATION")) { state->handler = attlist5; return XML_ROLE_NONE; } break; case XML_TOK_OPEN_PAREN: state->handler = attlist3; return XML_ROLE_NONE; } return syntaxError(state); } static int attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NMTOKEN: case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = attlist4; return XML_ROLE_ATTRIBUTE_ENUM_VALUE; } return syntaxError(state); } static int attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: state->handler = attlist8; return XML_ROLE_NONE; case XML_TOK_OR: state->handler = attlist3; return XML_ROLE_NONE; } return syntaxError(state); } static int attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_PAREN: state->handler = attlist6; return XML_ROLE_NONE; } return syntaxError(state); } static int attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = attlist7; return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; } return syntaxError(state); } static int attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: state->handler = attlist8; return XML_ROLE_NONE; case XML_TOK_OR: state->handler = attlist6; return XML_ROLE_NONE; } return syntaxError(state); } /* default value */ static int attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_POUND_NAME: if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), "IMPLIED")) { state->handler = attlist1; return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; } if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), "REQUIRED")) { state->handler = attlist1; return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; } if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), "FIXED")) { state->handler = attlist9; return XML_ROLE_NONE; } break; case XML_TOK_LITERAL: state->handler = attlist1; return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; } return syntaxError(state); } static int attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = attlist1; return XML_ROLE_FIXED_ATTRIBUTE_VALUE; } return syntaxError(state); } static int element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = element1; return XML_ROLE_ELEMENT_NAME; } return syntaxError(state); } static int element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "EMPTY")) { state->handler = declClose; return XML_ROLE_CONTENT_EMPTY; } if (XmlNameMatchesAscii(enc, ptr, "ANY")) { state->handler = declClose; return XML_ROLE_CONTENT_ANY; } break; case XML_TOK_OPEN_PAREN: state->handler = element2; state->level = 1; return XML_ROLE_GROUP_OPEN; } return syntaxError(state); } static int element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_POUND_NAME: if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), "PCDATA")) { state->handler = element3; return XML_ROLE_CONTENT_PCDATA; } break; case XML_TOK_OPEN_PAREN: state->level = 2; state->handler = element6; return XML_ROLE_GROUP_OPEN; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT; case XML_TOK_NAME_QUESTION: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_OPT; case XML_TOK_NAME_ASTERISK: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_REP; case XML_TOK_NAME_PLUS: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_PLUS; } return syntaxError(state); } static int element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: case XML_TOK_CLOSE_PAREN_ASTERISK: state->handler = declClose; return XML_ROLE_GROUP_CLOSE_REP; case XML_TOK_OR: state->handler = element4; return XML_ROLE_NONE; } return syntaxError(state); } static int element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = element5; return XML_ROLE_CONTENT_ELEMENT; } return syntaxError(state); } static int element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN_ASTERISK: state->handler = declClose; return XML_ROLE_GROUP_CLOSE_REP; case XML_TOK_OR: state->handler = element4; return XML_ROLE_NONE; } return syntaxError(state); } static int element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_PAREN: state->level += 1; return XML_ROLE_GROUP_OPEN; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT; case XML_TOK_NAME_QUESTION: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_OPT; case XML_TOK_NAME_ASTERISK: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_REP; case XML_TOK_NAME_PLUS: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_PLUS; } return syntaxError(state); } static int element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE; case XML_TOK_CLOSE_PAREN_ASTERISK: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE_REP; case XML_TOK_CLOSE_PAREN_QUESTION: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE_OPT; case XML_TOK_CLOSE_PAREN_PLUS: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE_PLUS; case XML_TOK_COMMA: state->handler = element6; return XML_ROLE_GROUP_SEQUENCE; case XML_TOK_OR: state->handler = element6; return XML_ROLE_GROUP_CHOICE; } return syntaxError(state); } static int declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return XML_ROLE_NONE; } return syntaxError(state); } #if 0 static int ignore(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return 0; default: return XML_ROLE_NONE; } return syntaxError(state); } #endif static int error(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { return XML_ROLE_NONE; } static int syntaxError(PROLOG_STATE *state) { state->handler = error; return XML_ROLE_ERROR; } void XmlPrologStateInit(PROLOG_STATE *state) { state->handler = prolog0; } centerim-4.22.10/libjabber/log.c0000644000175000001440000000243611461606612013254 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include "jabber.h" #include "log.h" #ifdef DEBUG void jdebug(char *zone, const char *msgfmt, ...) { va_list ap; static char loghdr[LOGSIZE_HDR]; static char logmsg[LOGSIZE_TAIL]; static int size; /* XXX: We may want to check the sizes eventually */ size = snprintf(loghdr, LOGSIZE_HDR, "debug/%s %s\n", zone, msgfmt); va_start(ap, msgfmt); size = vsnprintf(logmsg, LOGSIZE_TAIL, loghdr, ap); fprintf(stderr,"%s",logmsg); return; } #endif /* DEBUG */ centerim-4.22.10/libjabber/latin1tab.h0000644000175000001440000000563111461606612014357 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ /* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, /* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, /* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, /* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, centerim-4.22.10/libjabber/Makefile.in0000644000175000001440000004174111473011437014374 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libjabber DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru liblibjabber_a_AR = $(AR) $(ARFLAGS) liblibjabber_a_LIBADD = am_liblibjabber_a_OBJECTS = jid.$(OBJEXT) log.$(OBJEXT) \ jutil.$(OBJEXT) str.$(OBJEXT) expat.$(OBJEXT) \ hashtable.$(OBJEXT) genhash.$(OBJEXT) pproxy.$(OBJEXT) \ pool.$(OBJEXT) rate.$(OBJEXT) xmlparse.$(OBJEXT) \ xstream.$(OBJEXT) xmltok.$(OBJEXT) xmlnode.$(OBJEXT) \ jconn.$(OBJEXT) xmlrole.$(OBJEXT) jpacket.$(OBJEXT) \ snprintf.$(OBJEXT) socket.$(OBJEXT) sha.$(OBJEXT) liblibjabber_a_OBJECTS = $(am_liblibjabber_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(liblibjabber_a_SOURCES) DIST_SOURCES = $(liblibjabber_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/connwrap noinst_LIBRARIES = liblibjabber.a noinst_HEADERS = xmltok_impl_c.h latin1tab.h log.h asciitab.h libxode.h jabber.h hashtable.h xmlparse.h iasciitab.h xmldef.h xmltok.h utf8tab.h xmltok_impl.h xmlrole.h nametab.h xmltok_ns_c.h liblibjabber_a_SOURCES = jid.c log.c jutil.c str.c expat.c hashtable.c genhash.c pproxy.c pool.c rate.c xmlparse.c xstream.c xmltok.c xmlnode.c jconn.c xmlrole.c jpacket.c snprintf.c socket.c sha.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libjabber/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu libjabber/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) liblibjabber.a: $(liblibjabber_a_OBJECTS) $(liblibjabber_a_DEPENDENCIES) -rm -f liblibjabber.a $(liblibjabber_a_AR) liblibjabber.a $(liblibjabber_a_OBJECTS) $(liblibjabber_a_LIBADD) $(RANLIB) liblibjabber.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genhash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hashtable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jconn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jpacket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jutil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pproxy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlnode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlrole.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmltok.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstream.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/libjabber/xmltok.c0000644000175000001440000010770211461606612014013 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #include "xmldef.h" #include "xmltok.h" #include "nametab.h" #define VTABLE1 \ { PREFIX(prologTok), PREFIX(contentTok), PREFIX(cdataSectionTok) }, \ { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ PREFIX(sameName), \ PREFIX(nameMatchesAscii), \ PREFIX(nameLength), \ PREFIX(skipS), \ PREFIX(getAtts), \ PREFIX(charRefNumber), \ PREFIX(predefinedEntityName), \ PREFIX(updatePosition), \ PREFIX(isPublicId) #define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) #define UCS2_GET_NAMING(pages, hi, lo) \ (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) /* A 2 byte UTF-8 representation splits the characters 11 bits between the bottom 5 and 6 bits of the bytes. We need 8 bits to index into pages, 3 bits to add to that index and 5 bits to generate the mask. */ #define UTF8_GET_NAMING2(pages, byte) \ (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ + ((((byte)[0]) & 3) << 1) \ + ((((byte)[1]) >> 5) & 1)] \ & (1 << (((byte)[1]) & 0x1F))) /* A 3 byte UTF-8 representation splits the characters 16 bits between the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index into pages, 3 bits to add to that index and 5 bits to generate the mask. */ #define UTF8_GET_NAMING3(pages, byte) \ (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ + ((((byte)[1]) >> 2) & 0xF)] \ << 3) \ + ((((byte)[1]) & 3) << 1) \ + ((((byte)[2]) >> 5) & 1)] \ & (1 << (((byte)[2]) & 0x1F))) #define UTF8_GET_NAMING(pages, p, n) \ ((n) == 2 \ ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ : ((n) == 3 \ ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ : 0)) #define UTF8_INVALID3(p) \ ((*p) == 0xED \ ? (((p)[1] & 0x20) != 0) \ : ((*p) == 0xEF \ ? ((p)[1] == 0xBF && ((p)[2] == 0xBF || (p)[2] == 0xBE)) \ : 0)) #define UTF8_INVALID4(p) ((*p) == 0xF4 && ((p)[1] & 0x30) != 0) static int isNever(const ENCODING *enc, const char *p) { return 0; } static int utf8_isName2(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); } static int utf8_isName3(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); } #define utf8_isName4 isNever static int utf8_isNmstrt2(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); } static int utf8_isNmstrt3(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); } #define utf8_isNmstrt4 isNever #define utf8_isInvalid2 isNever static int utf8_isInvalid3(const ENCODING *enc, const char *p) { return UTF8_INVALID3((const unsigned char *)p); } static int utf8_isInvalid4(const ENCODING *enc, const char *p) { return UTF8_INVALID4((const unsigned char *)p); } struct normal_encoding { ENCODING enc; unsigned char type[256]; #ifdef XML_MIN_SIZE int (*byteType)(const ENCODING *, const char *); int (*isNameMin)(const ENCODING *, const char *); int (*isNmstrtMin)(const ENCODING *, const char *); int (*byteToAscii)(const ENCODING *, const char *); int (*charMatches)(const ENCODING *, const char *, int); #endif /* XML_MIN_SIZE */ int (*isName2)(const ENCODING *, const char *); int (*isName3)(const ENCODING *, const char *); int (*isName4)(const ENCODING *, const char *); int (*isNmstrt2)(const ENCODING *, const char *); int (*isNmstrt3)(const ENCODING *, const char *); int (*isNmstrt4)(const ENCODING *, const char *); int (*isInvalid2)(const ENCODING *, const char *); int (*isInvalid3)(const ENCODING *, const char *); int (*isInvalid4)(const ENCODING *, const char *); }; #ifdef XML_MIN_SIZE #define STANDARD_VTABLE(E) \ E ## byteType, \ E ## isNameMin, \ E ## isNmstrtMin, \ E ## byteToAscii, \ E ## charMatches, #else #define STANDARD_VTABLE(E) /* as nothing */ #endif #define NORMAL_VTABLE(E) \ E ## isName2, \ E ## isName3, \ E ## isName4, \ E ## isNmstrt2, \ E ## isNmstrt3, \ E ## isNmstrt4, \ E ## isInvalid2, \ E ## isInvalid3, \ E ## isInvalid4 static int checkCharRefNumber(int); #include "xmltok_impl.h" #ifdef XML_MIN_SIZE #define sb_isNameMin isNever #define sb_isNmstrtMin isNever #endif #ifdef XML_MIN_SIZE #define MINBPC(enc) ((enc)->minBytesPerChar) #else /* minimum bytes per character */ #define MINBPC(enc) 1 #endif #define SB_BYTE_TYPE(enc, p) \ (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) #ifdef XML_MIN_SIZE static int sb_byteType(const ENCODING *enc, const char *p) { return SB_BYTE_TYPE(enc, p); } #define BYTE_TYPE(enc, p) \ (((const struct normal_encoding *)(enc))->byteType(enc, p)) #else #define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) #endif #ifdef XML_MIN_SIZE #define BYTE_TO_ASCII(enc, p) \ (((const struct normal_encoding *)(enc))->byteToAscii(enc, p)) static int sb_byteToAscii(const ENCODING *enc, const char *p) { return *p; } #else #define BYTE_TO_ASCII(enc, p) (*p) #endif #define IS_NAME_CHAR(enc, p, n) \ (((const struct normal_encoding *)(enc))->isName ## n(enc, p)) #define IS_NMSTRT_CHAR(enc, p, n) \ (((const struct normal_encoding *)(enc))->isNmstrt ## n(enc, p)) #define IS_INVALID_CHAR(enc, p, n) \ (((const struct normal_encoding *)(enc))->isInvalid ## n(enc, p)) #ifdef XML_MIN_SIZE #define IS_NAME_CHAR_MINBPC(enc, p) \ (((const struct normal_encoding *)(enc))->isNameMin(enc, p)) #define IS_NMSTRT_CHAR_MINBPC(enc, p) \ (((const struct normal_encoding *)(enc))->isNmstrtMin(enc, p)) #else #define IS_NAME_CHAR_MINBPC(enc, p) (0) #define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) #endif #ifdef XML_MIN_SIZE #define CHAR_MATCHES(enc, p, c) \ (((const struct normal_encoding *)(enc))->charMatches(enc, p, c)) static int sb_charMatches(const ENCODING *enc, const char *p, int c) { return *p == c; } #else /* c is an ASCII character */ #define CHAR_MATCHES(enc, p, c) (*(p) == c) #endif #define PREFIX(ident) normal_ ## ident #include "xmltok_impl_c.h" #undef MINBPC #undef BYTE_TYPE #undef BYTE_TO_ASCII #undef CHAR_MATCHES #undef IS_NAME_CHAR #undef IS_NAME_CHAR_MINBPC #undef IS_NMSTRT_CHAR #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ UTF8_cval1 = 0x00, UTF8_cval2 = 0xc0, UTF8_cval3 = 0xe0, UTF8_cval4 = 0xf0 }; static void utf8_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { char *to; const char *from; if (fromLim - *fromP > toLim - *toP) { /* Avoid copying partial characters. */ for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) break; } for (to = *toP, from = *fromP; from != fromLim; from++, to++) *to = *from; *fromP = from; *toP = to; } static void utf8_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim) { unsigned short *to = *toP; const char *from = *fromP; while (from != fromLim && to != toLim) { switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { case BT_LEAD2: *to++ = ((from[0] & 0x1f) << 6) | (from[1] & 0x3f); from += 2; break; case BT_LEAD3: *to++ = ((from[0] & 0xf) << 12) | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f); from += 3; break; case BT_LEAD4: { unsigned long n; if (to + 1 == toLim) break; n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); n -= 0x10000; to[0] = (unsigned short)((n >> 10) | 0xD800); to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); to += 2; from += 4; } break; default: *to++ = *from++; break; } } *fromP = from; *toP = to; } #ifdef XML_NS static const struct normal_encoding utf8_encoding_ns = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #include "asciitab.h" #include "utf8tab.h" }, STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) }; #endif static const struct normal_encoding utf8_encoding = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "utf8tab.h" }, STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) }; #ifdef XML_NS static const struct normal_encoding internal_utf8_encoding_ns = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #include "iasciitab.h" #include "utf8tab.h" }, STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) }; #endif static const struct normal_encoding internal_utf8_encoding = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #define BT_COLON BT_NMSTRT #include "iasciitab.h" #undef BT_COLON #include "utf8tab.h" }, STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) }; static void latin1_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { for (;;) { unsigned char c; if (*fromP == fromLim) break; c = (unsigned char)**fromP; if (c & 0x80) { if (toLim - *toP < 2) break; *(*toP)++ = ((c >> 6) | UTF8_cval2); *(*toP)++ = ((c & 0x3f) | 0x80); (*fromP)++; } else { if (*toP == toLim) break; *(*toP)++ = *(*fromP)++; } } } static void latin1_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim) { while (*fromP != fromLim && *toP != toLim) *(*toP)++ = (unsigned char)*(*fromP)++; } #ifdef XML_NS static const struct normal_encoding latin1_encoding_ns = { { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, { #include "asciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(sb_) }; #endif static const struct normal_encoding latin1_encoding = { { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(sb_) }; static void ascii_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { while (*fromP != fromLim && *toP != toLim) *(*toP)++ = *(*fromP)++; } #ifdef XML_NS static const struct normal_encoding ascii_encoding_ns = { { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, { #include "asciitab.h" /* BT_NONXML == 0 */ }, STANDARD_VTABLE(sb_) }; #endif static const struct normal_encoding ascii_encoding = { { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON /* BT_NONXML == 0 */ }, STANDARD_VTABLE(sb_) }; static int unicode_byte_type(char hi, char lo) { switch ((unsigned char)hi) { case 0xD8: case 0xD9: case 0xDA: case 0xDB: return BT_LEAD4; case 0xDC: case 0xDD: case 0xDE: case 0xDF: return BT_TRAIL; case 0xFF: switch ((unsigned char)lo) { case 0xFF: case 0xFE: return BT_NONXML; } break; } return BT_NONASCII; } #define DEFINE_UTF16_TO_UTF8(E) \ static \ void E ## toUtf8(const ENCODING *enc, \ const char **fromP, const char *fromLim, \ char **toP, const char *toLim) \ { \ const char *from; \ for (from = *fromP; from != fromLim; from += 2) { \ int plane; \ unsigned char lo2; \ unsigned char lo = GET_LO(from); \ unsigned char hi = GET_HI(from); \ switch (hi) { \ case 0: \ if (lo < 0x80) { \ if (*toP == toLim) { \ *fromP = from; \ return; \ } \ *(*toP)++ = lo; \ break; \ } \ /* fall through */ \ case 0x1: case 0x2: case 0x3: \ case 0x4: case 0x5: case 0x6: case 0x7: \ if (toLim - *toP < 2) { \ *fromP = from; \ return; \ } \ *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ *(*toP)++ = ((lo & 0x3f) | 0x80); \ break; \ default: \ if (toLim - *toP < 3) { \ *fromP = from; \ return; \ } \ /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ *(*toP)++ = ((lo & 0x3f) | 0x80); \ break; \ case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ if (toLim - *toP < 4) { \ *fromP = from; \ return; \ } \ plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ from += 2; \ lo2 = GET_LO(from); \ *(*toP)++ = (((lo & 0x3) << 4) \ | ((GET_HI(from) & 0x3) << 2) \ | (lo2 >> 6) \ | 0x80); \ *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ break; \ } \ } \ *fromP = from; \ } #define DEFINE_UTF16_TO_UTF16(E) \ static \ void E ## toUtf16(const ENCODING *enc, \ const char **fromP, const char *fromLim, \ unsigned short **toP, const unsigned short *toLim) \ { \ /* Avoid copying first half only of surrogate */ \ if (fromLim - *fromP > ((toLim - *toP) << 1) \ && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ fromLim -= 2; \ for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ } #define SET2(ptr, ch) \ (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) #define GET_LO(ptr) ((unsigned char)(ptr)[0]) #define GET_HI(ptr) ((unsigned char)(ptr)[1]) DEFINE_UTF16_TO_UTF8(little2_) DEFINE_UTF16_TO_UTF16(little2_) #undef SET2 #undef GET_LO #undef GET_HI #define SET2(ptr, ch) \ (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) #define GET_LO(ptr) ((unsigned char)(ptr)[1]) #define GET_HI(ptr) ((unsigned char)(ptr)[0]) DEFINE_UTF16_TO_UTF8(big2_) DEFINE_UTF16_TO_UTF16(big2_) #undef SET2 #undef GET_LO #undef GET_HI #define LITTLE2_BYTE_TYPE(enc, p) \ ((p)[1] == 0 \ ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ : unicode_byte_type((p)[1], (p)[0])) #define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) #define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) #define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) #define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) #ifdef XML_MIN_SIZE static int little2_byteType(const ENCODING *enc, const char *p) { return LITTLE2_BYTE_TYPE(enc, p); } static int little2_byteToAscii(const ENCODING *enc, const char *p) { return LITTLE2_BYTE_TO_ASCII(enc, p); } static int little2_charMatches(const ENCODING *enc, const char *p, int c) { return LITTLE2_CHAR_MATCHES(enc, p, c); } static int little2_isNameMin(const ENCODING *enc, const char *p) { return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); } static int little2_isNmstrtMin(const ENCODING *enc, const char *p) { return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); } #undef VTABLE #define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 #else /* not XML_MIN_SIZE */ #undef PREFIX #define PREFIX(ident) little2_ ## ident #define MINBPC(enc) 2 /* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ #define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) #define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) #define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) #define IS_NAME_CHAR(enc, p, n) 0 #define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) #define IS_NMSTRT_CHAR(enc, p, n) (0) #define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) #include "xmltok_impl_c.h" #undef MINBPC #undef BYTE_TYPE #undef BYTE_TO_ASCII #undef CHAR_MATCHES #undef IS_NAME_CHAR #undef IS_NAME_CHAR_MINBPC #undef IS_NMSTRT_CHAR #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR #endif /* not XML_MIN_SIZE */ #ifdef XML_NS static const struct normal_encoding little2_encoding_ns = { { VTABLE, 2, 0, #if XML_BYTE_ORDER == 12 1 #else 0 #endif }, { #include "asciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(little2_) }; #endif static const struct normal_encoding little2_encoding = { { VTABLE, 2, 0, #if XML_BYTE_ORDER == 12 1 #else 0 #endif }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(little2_) }; #if XML_BYTE_ORDER != 21 #ifdef XML_NS static const struct normal_encoding internal_little2_encoding_ns = { { VTABLE, 2, 0, 1 }, { #include "iasciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(little2_) }; #endif static const struct normal_encoding internal_little2_encoding = { { VTABLE, 2, 0, 1 }, { #define BT_COLON BT_NMSTRT #include "iasciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(little2_) }; #endif #define BIG2_BYTE_TYPE(enc, p) \ ((p)[0] == 0 \ ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ : unicode_byte_type((p)[0], (p)[1])) #define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) #define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) #define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) #define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) #ifdef XML_MIN_SIZE static int big2_byteType(const ENCODING *enc, const char *p) { return BIG2_BYTE_TYPE(enc, p); } static int big2_byteToAscii(const ENCODING *enc, const char *p) { return BIG2_BYTE_TO_ASCII(enc, p); } static int big2_charMatches(const ENCODING *enc, const char *p, int c) { return BIG2_CHAR_MATCHES(enc, p, c); } static int big2_isNameMin(const ENCODING *enc, const char *p) { return BIG2_IS_NAME_CHAR_MINBPC(enc, p); } static int big2_isNmstrtMin(const ENCODING *enc, const char *p) { return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); } #undef VTABLE #define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 #else /* not XML_MIN_SIZE */ #undef PREFIX #define PREFIX(ident) big2_ ## ident #define MINBPC(enc) 2 /* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ #define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) #define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) #define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) #define IS_NAME_CHAR(enc, p, n) 0 #define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) #define IS_NMSTRT_CHAR(enc, p, n) (0) #define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) #include "xmltok_impl_c.h" #undef MINBPC #undef BYTE_TYPE #undef BYTE_TO_ASCII #undef CHAR_MATCHES #undef IS_NAME_CHAR #undef IS_NAME_CHAR_MINBPC #undef IS_NMSTRT_CHAR #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR #endif /* not XML_MIN_SIZE */ #ifdef XML_NS static const struct normal_encoding big2_encoding_ns = { { VTABLE, 2, 0, #if XML_BYTE_ORDER == 21 1 #else 0 #endif }, { #include "asciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(big2_) }; #endif static const struct normal_encoding big2_encoding = { { VTABLE, 2, 0, #if XML_BYTE_ORDER == 21 1 #else 0 #endif }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(big2_) }; #if XML_BYTE_ORDER != 12 #ifdef XML_NS static const struct normal_encoding internal_big2_encoding_ns = { { VTABLE, 2, 0, 1 }, { #include "iasciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(big2_) }; #endif static const struct normal_encoding internal_big2_encoding = { { VTABLE, 2, 0, 1 }, { #define BT_COLON BT_NMSTRT #include "iasciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(big2_) }; #endif #undef PREFIX static int streqci(const char *s1, const char *s2) { for (;;) { char c1 = *s1++; char c2 = *s2++; if ('a' <= c1 && c1 <= 'z') c1 += 'A' - 'a'; if ('a' <= c2 && c2 <= 'z') c2 += 'A' - 'a'; if (c1 != c2) return 0; if (!c1) break; } return 1; } static void initUpdatePosition(const ENCODING *enc, const char *ptr, const char *end, POSITION *pos) { normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); } static int toAscii(const ENCODING *enc, const char *ptr, const char *end) { char buf[1]; char *p = buf; XmlUtf8Convert(enc, &ptr, end, &p, p + 1); if (p == buf) return -1; else return buf[0]; } static int isSpace(int c) { switch (c) { case 0x20: case 0xD: case 0xA: case 0x9: return 1; } return 0; } /* Return 1 if there's just optional white space or there's an S followed by name=val. */ static int parsePseudoAttribute(const ENCODING *enc, const char *ptr, const char *end, const char **namePtr, const char **valPtr, const char **nextTokPtr) { int c; char open; if (ptr == end) { *namePtr = 0; return 1; } if (!isSpace(toAscii(enc, ptr, end))) { *nextTokPtr = ptr; return 0; } do { ptr += enc->minBytesPerChar; } while (isSpace(toAscii(enc, ptr, end))); if (ptr == end) { *namePtr = 0; return 1; } *namePtr = ptr; for (;;) { c = toAscii(enc, ptr, end); if (c == -1) { *nextTokPtr = ptr; return 0; } if (c == '=') break; if (isSpace(c)) { do { ptr += enc->minBytesPerChar; } while (isSpace(c = toAscii(enc, ptr, end))); if (c != '=') { *nextTokPtr = ptr; return 0; } break; } ptr += enc->minBytesPerChar; } if (ptr == *namePtr) { *nextTokPtr = ptr; return 0; } ptr += enc->minBytesPerChar; c = toAscii(enc, ptr, end); while (isSpace(c)) { ptr += enc->minBytesPerChar; c = toAscii(enc, ptr, end); } if (c != '"' && c != '\'') { *nextTokPtr = ptr; return 0; } open = c; ptr += enc->minBytesPerChar; *valPtr = ptr; for (;; ptr += enc->minBytesPerChar) { c = toAscii(enc, ptr, end); if (c == open) break; if (!('a' <= c && c <= 'z') && !('A' <= c && c <= 'Z') && !('0' <= c && c <= '9') && c != '.' && c != '-' && c != '_') { *nextTokPtr = ptr; return 0; } } *nextTokPtr = ptr + enc->minBytesPerChar; return 1; } static int doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, const char *, const char *), int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingName, const ENCODING **encoding, int *standalone) { const char *val = 0; const char *name = 0; ptr += 5 * enc->minBytesPerChar; end -= 2 * enc->minBytesPerChar; if (!parsePseudoAttribute(enc, ptr, end, &name, &val, &ptr) || !name) { *badPtr = ptr; return 0; } if (!XmlNameMatchesAscii(enc, name, "version")) { if (!isGeneralTextEntity) { *badPtr = name; return 0; } } else { if (versionPtr) *versionPtr = val; if (!parsePseudoAttribute(enc, ptr, end, &name, &val, &ptr)) { *badPtr = ptr; return 0; } if (!name) { if (isGeneralTextEntity) { /* a TextDecl must have an EncodingDecl */ *badPtr = ptr; return 0; } return 1; } } if (XmlNameMatchesAscii(enc, name, "encoding")) { int c = toAscii(enc, val, end); if (!('a' <= c && c <= 'z') && !('A' <= c && c <= 'Z')) { *badPtr = val; return 0; } if (encodingName) *encodingName = val; if (encoding) *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); if (!parsePseudoAttribute(enc, ptr, end, &name, &val, &ptr)) { *badPtr = ptr; return 0; } if (!name) return 1; } if (!XmlNameMatchesAscii(enc, name, "standalone") || isGeneralTextEntity) { *badPtr = name; return 0; } if (XmlNameMatchesAscii(enc, val, "yes")) { if (standalone) *standalone = 1; } else if (XmlNameMatchesAscii(enc, val, "no")) { if (standalone) *standalone = 0; } else { *badPtr = val; return 0; } while (isSpace(toAscii(enc, ptr, end))) ptr += enc->minBytesPerChar; if (ptr != end) { *badPtr = ptr; return 0; } return 1; } static int checkCharRefNumber(int result) { switch (result >> 8) { case 0xD8: case 0xD9: case 0xDA: case 0xDB: case 0xDC: case 0xDD: case 0xDE: case 0xDF: return -1; case 0: if (latin1_encoding.type[result] == BT_NONXML) return -1; break; case 0xFF: if (result == 0xFFFE || result == 0xFFFF) return -1; break; } return result; } int XmlUtf8Encode(int c, char *buf) { enum { /* minN is minimum legal resulting value for N byte sequence */ min2 = 0x80, min3 = 0x800, min4 = 0x10000 }; if (c < 0) return 0; if (c < min2) { buf[0] = (c | UTF8_cval1); return 1; } if (c < min3) { buf[0] = ((c >> 6) | UTF8_cval2); buf[1] = ((c & 0x3f) | 0x80); return 2; } if (c < min4) { buf[0] = ((c >> 12) | UTF8_cval3); buf[1] = (((c >> 6) & 0x3f) | 0x80); buf[2] = ((c & 0x3f) | 0x80); return 3; } if (c < 0x110000) { buf[0] = ((c >> 18) | UTF8_cval4); buf[1] = (((c >> 12) & 0x3f) | 0x80); buf[2] = (((c >> 6) & 0x3f) | 0x80); buf[3] = ((c & 0x3f) | 0x80); return 4; } return 0; } int XmlUtf16Encode(int charNum, unsigned short *buf) { if (charNum < 0) return 0; if (charNum < 0x10000) { buf[0] = charNum; return 1; } if (charNum < 0x110000) { charNum -= 0x10000; buf[0] = (charNum >> 10) + 0xD800; buf[1] = (charNum & 0x3FF) + 0xDC00; return 2; } return 0; } struct unknown_encoding { struct normal_encoding normal; int (*convert)(void *userData, const char *p); void *userData; unsigned short utf16[256]; char utf8[256][4]; }; int XmlSizeOfUnknownEncoding() { return sizeof(struct unknown_encoding); } static int unknown_isName(const ENCODING *enc, const char *p) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, p); if (c & ~0xFFFF) return 0; return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); } static int unknown_isNmstrt(const ENCODING *enc, const char *p) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, p); if (c & ~0xFFFF) return 0; return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); } static int unknown_isInvalid(const ENCODING *enc, const char *p) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, p); return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; } static void unknown_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { char buf[XML_UTF8_ENCODE_MAX]; for (;;) { const char *utf8; int n; if (*fromP == fromLim) break; utf8 = ((const struct unknown_encoding *)enc)->utf8[(unsigned char)**fromP]; n = *utf8++; if (n == 0) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, *fromP); n = XmlUtf8Encode(c, buf); if (n > toLim - *toP) break; utf8 = buf; *fromP += ((const struct normal_encoding *)enc)->type[(unsigned char)**fromP] - (BT_LEAD2 - 2); } else { if (n > toLim - *toP) break; (*fromP)++; } do { *(*toP)++ = *utf8++; } while (--n != 0); } } static void unknown_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim) { while (*fromP != fromLim && *toP != toLim) { unsigned short c = ((const struct unknown_encoding *)enc)->utf16[(unsigned char)**fromP]; if (c == 0) { c = (unsigned short)((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, *fromP); *fromP += ((const struct normal_encoding *)enc)->type[(unsigned char)**fromP] - (BT_LEAD2 - 2); } else (*fromP)++; *(*toP)++ = c; } } ENCODING * XmlInitUnknownEncoding(void *mem, int *table, int (*convert)(void *userData, const char *p), void *userData) { int i; struct unknown_encoding *e = mem; for (i = 0; i < sizeof(struct normal_encoding); i++) ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; for (i = 0; i < 128; i++) if (latin1_encoding.type[i] != BT_OTHER && latin1_encoding.type[i] != BT_NONXML && table[i] != i) return 0; for (i = 0; i < 256; i++) { int c = table[i]; if (c == -1) { e->normal.type[i] = BT_MALFORM; /* This shouldn't really get used. */ e->utf16[i] = 0xFFFF; e->utf8[i][0] = 1; e->utf8[i][1] = 0; } else if (c < 0) { if (c < -4) return 0; e->normal.type[i] = BT_LEAD2 - (c + 2); e->utf8[i][0] = 0; e->utf16[i] = 0; } else if (c < 0x80) { if (latin1_encoding.type[c] != BT_OTHER && latin1_encoding.type[c] != BT_NONXML && c != i) return 0; e->normal.type[i] = latin1_encoding.type[c]; e->utf8[i][0] = 1; e->utf8[i][1] = (char)c; e->utf16[i] = c == 0 ? 0xFFFF : c; } else if (checkCharRefNumber(c) < 0) { e->normal.type[i] = BT_NONXML; /* This shouldn't really get used. */ e->utf16[i] = 0xFFFF; e->utf8[i][0] = 1; e->utf8[i][1] = 0; } else { if (c > 0xFFFF) return 0; if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) e->normal.type[i] = BT_NMSTRT; else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) e->normal.type[i] = BT_NAME; else e->normal.type[i] = BT_OTHER; e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); e->utf16[i] = c; } } e->userData = userData; e->convert = convert; if (convert) { e->normal.isName2 = unknown_isName; e->normal.isName3 = unknown_isName; e->normal.isName4 = unknown_isName; e->normal.isNmstrt2 = unknown_isNmstrt; e->normal.isNmstrt3 = unknown_isNmstrt; e->normal.isNmstrt4 = unknown_isNmstrt; e->normal.isInvalid2 = unknown_isInvalid; e->normal.isInvalid3 = unknown_isInvalid; e->normal.isInvalid4 = unknown_isInvalid; } e->normal.enc.utf8Convert = unknown_toUtf8; e->normal.enc.utf16Convert = unknown_toUtf16; return &(e->normal.enc); } /* If this enumeration is changed, getEncodingIndex and encodings must also be changed. */ enum { UNKNOWN_ENC = -1, ISO_8859_1_ENC = 0, US_ASCII_ENC, UTF_8_ENC, UTF_16_ENC, UTF_16BE_ENC, UTF_16LE_ENC, /* must match encodingNames up to here */ NO_ENC }; static int getEncodingIndex(const char *name) { static const char *encodingNames[] = { "ISO-8859-1", "US-ASCII", "UTF-8", "UTF-16", "UTF-16BE" "UTF-16LE", }; int i; if (name == 0) return NO_ENC; for (i = 0; i < sizeof(encodingNames)/sizeof(encodingNames[0]); i++) if (streqci(name, encodingNames[i])) return i; return UNKNOWN_ENC; } /* For binary compatibility, we store the index of the encoding specified at initialization in the isUtf16 member. */ #define INIT_ENC_INDEX(enc) ((enc)->initEnc.isUtf16) /* This is what detects the encoding. encodingTable maps from encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of the external (protocol) specified encoding; state is XML_CONTENT_STATE if we're parsing an external text entity, and XML_PROLOG_STATE otherwise. */ static int initScan(const ENCODING **encodingTable, const INIT_ENCODING *enc, int state, const char *ptr, const char *end, const char **nextTokPtr) { const ENCODING **encPtr; if (ptr == end) return XML_TOK_NONE; encPtr = enc->encPtr; if (ptr + 1 == end) { /* only a single byte available for auto-detection */ /* a well-formed document entity must have more than one byte */ if (state != XML_CONTENT_STATE) return XML_TOK_PARTIAL; /* so we're parsing an external text entity... */ /* if UTF-16 was externally specified, then we need at least 2 bytes */ switch (INIT_ENC_INDEX(enc)) { case UTF_16_ENC: case UTF_16LE_ENC: case UTF_16BE_ENC: return XML_TOK_PARTIAL; } switch ((unsigned char)*ptr) { case 0xFE: case 0xFF: case 0xEF: /* possibly first byte of UTF-8 BOM */ if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC && state == XML_CONTENT_STATE) break; /* fall through */ case 0x00: case 0x3C: return XML_TOK_PARTIAL; } } else { switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { case 0xFEFF: if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC && state == XML_CONTENT_STATE) break; *nextTokPtr = ptr + 2; *encPtr = encodingTable[UTF_16BE_ENC]; return XML_TOK_BOM; /* 00 3C is handled in the default case */ case 0x3C00: if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC || INIT_ENC_INDEX(enc) == UTF_16_ENC) && state == XML_CONTENT_STATE) break; *encPtr = encodingTable[UTF_16LE_ENC]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); case 0xFFFE: if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC && state == XML_CONTENT_STATE) break; *nextTokPtr = ptr + 2; *encPtr = encodingTable[UTF_16LE_ENC]; return XML_TOK_BOM; case 0xEFBB: /* Maybe a UTF-8 BOM (EF BB BF) */ /* If there's an explicitly specified (external) encoding of ISO-8859-1 or some flavour of UTF-16 and this is an external text entity, don't look for the BOM, because it might be a legal data. */ if (state == XML_CONTENT_STATE) { int e = INIT_ENC_INDEX(enc); if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC || e == UTF_16LE_ENC || e == UTF_16_ENC) break; } if (ptr + 2 == end) return XML_TOK_PARTIAL; if ((unsigned char)ptr[2] == 0xBF) { *encPtr = encodingTable[UTF_8_ENC]; return XML_TOK_BOM; } break; default: if (ptr[0] == '\0') { /* 0 isn't a legal data character. Furthermore a document entity can only start with ASCII characters. So the only way this can fail to be big-endian UTF-16 if it it's an external parsed general entity that's labelled as UTF-16LE. */ if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) break; *encPtr = encodingTable[UTF_16BE_ENC]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); } else if (ptr[1] == '\0') { /* We could recover here in the case: - parsing an external entity - second byte is 0 - no externally specified encoding - no encoding declaration by assuming UTF-16LE. But we don't, because this would mean when presented just with a single byte, we couldn't reliably determine whether we needed further bytes. */ if (state == XML_CONTENT_STATE) break; *encPtr = encodingTable[UTF_16LE_ENC]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); } break; } } *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); } #define NS(x) x #define ns(x) x #include "xmltok_ns_c.h" #undef NS #undef ns #ifdef XML_NS #define NS(x) x ## NS #define ns(x) x ## _ns #include "xmltok_ns_c.h" #undef NS #undef ns ENCODING * XmlInitUnknownEncodingNS(void *mem, int *table, int (*convert)(void *userData, const char *p), void *userData) { ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); if (enc) ((struct normal_encoding *)enc)->type[':'] = BT_COLON; return enc; } #endif /* XML_NS */ centerim-4.22.10/libjabber/pool.c0000644000175000001440000001545611461606612013452 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ * * 2/27/00:3am, random plans by jer * * ok based on gprof, we really need some innovation here... my thoughs are this: * * most things are strings, so have a string-based true-blue garbage collector * one big global hash containing all the strings created by any pstrdup, returning const char * * a refcount on each string block * when a pool is freed, it moves down the refcount * garbage collector collects pools on the free stack, and runs through the hash for unused strings * j_strcmp can check for == (if they are both from a pstrdup) * * let's see... this would change: * pstrdup: do a hash lookup, success=return, fail=pmalloc & hash put * pool_free: * * * * * */ #include "libxode.h" #ifdef POOL_DEBUG int pool__total = 0; int pool__ltotal = 0; HASHTABLE pool__disturbed = NULL; void *_pool__malloc(size_t size) { pool__total++; return malloc(size); } void _pool__free(void *block) { pool__total--; free(block); } #else #define _pool__malloc malloc #define _pool__free free #endif /* make an empty pool */ pool _pool_new(char *zone) { pool p; while((p = _pool__malloc(sizeof(_pool))) == NULL) sleep(1); p->cleanup = NULL; p->heap = NULL; p->size = 0; #ifdef POOL_DEBUG p->lsize = -1; p->zone[0] = '\0'; strcat(p->zone,zone); sprintf(p->name,"%X",p); if(pool__disturbed == NULL) pool__disturbed = ghash_create(POOL_DEBUG,(KEYHASHFUNC)str_hash_code,(KEYCOMPAREFUNC)j_strcmp); ghash_put(pool__disturbed,p->name,p); #endif return p; } /* free a heap */ void _pool_heap_free(void *arg) { struct pheap *h = (struct pheap *)arg; _pool__free(h->block); _pool__free(h); } /* mem should always be freed last */ void _pool_cleanup_append(pool p, struct pfree *pf) { struct pfree *cur; if(p->cleanup == NULL) { p->cleanup = pf; return; } /* fast forward to end of list */ for(cur = p->cleanup; cur->next != NULL; cur = cur->next); cur->next = pf; } /* create a cleanup tracker */ struct pfree *_pool_free(pool p, pool_cleaner f, void *arg) { struct pfree *ret; /* make the storage for the tracker */ while((ret = _pool__malloc(sizeof(struct pfree))) == NULL) sleep(1); ret->f = f; ret->arg = arg; ret->next = NULL; return ret; } /* create a heap and make sure it get's cleaned up */ struct pheap *_pool_heap(pool p, int size) { struct pheap *ret; struct pfree *clean; /* make the return heap */ while((ret = _pool__malloc(sizeof(struct pheap))) == NULL) sleep(1); while((ret->block = _pool__malloc(size)) == NULL) sleep(1); ret->size = size; p->size += size; ret->used = 0; /* append to the cleanup list */ clean = _pool_free(p, _pool_heap_free, (void *)ret); clean->heap = ret; /* for future use in finding used mem for pstrdup */ _pool_cleanup_append(p, clean); return ret; } pool _pool_new_heap(int size, char *zone) { pool p; p = _pool_new(zone); p->heap = _pool_heap(p,size); return p; } void *pmalloc(pool p, int size) { void *block; if(p == NULL) { fprintf(stderr,"Memory Leak! [pmalloc received NULL pool, unable to track allocation, exiting]\n"); abort(); } /* if there is no heap for this pool or it's a big request, just raw, I like how we clean this :) */ if(p->heap == NULL || size > (p->heap->size / 2)) { while((block = _pool__malloc(size)) == NULL) sleep(1); p->size += size; _pool_cleanup_append(p, _pool_free(p, _pool__free, block)); return block; } /* we have to preserve boundaries, long story :) */ if(size >= 4) while(p->heap->used&7) p->heap->used++; /* if we don't fit in the old heap, replace it */ if(size > (p->heap->size - p->heap->used)) p->heap = _pool_heap(p, p->heap->size); /* the current heap has room */ block = (char *)p->heap->block + p->heap->used; p->heap->used += size; return block; } void *pmalloc_x(pool p, int size, char c) { void* result = pmalloc(p, size); if (result != NULL) memset(result, c, size); return result; } /* easy safety utility (for creating blank mem for structs, etc) */ void *pmalloco(pool p, int size) { void *block = pmalloc(p, size); memset(block, 0, size); return block; } /* XXX efficient: move this to const char * and then loop throug the existing heaps to see if src is within a block in this pool */ char *pstrdup(pool p, const char *src) { char *ret; if(src == NULL) return NULL; ret = pmalloc(p,strlen(src) + 1); strcpy(ret,src); return ret; } /* when move above, this one would actually return a new block */ char *pstrdupx(pool p, const char *src) { return pstrdup(p, src); } int pool_size(pool p) { if(p == NULL) return 0; return p->size; } void pool_free(pool p) { struct pfree *cur, *stub; if(p == NULL) return; cur = p->cleanup; while(cur != NULL) { (*cur->f)(cur->arg); stub = cur->next; _pool__free(cur); cur = stub; } #ifdef POOL_DEBUG ghash_remove(pool__disturbed,p->name); #endif _pool__free(p); } /* public cleanup utils, insert in a way that they are run FIFO, before mem frees */ void pool_cleanup(pool p, pool_cleaner f, void *arg) { struct pfree *clean; clean = _pool_free(p, f, arg); clean->next = p->cleanup; p->cleanup = clean; } #ifdef POOL_DEBUG void debug_log(char *zone, const char *msgfmt, ...); int _pool_stat(void *arg, const void *key, void *data) { pool p = (pool)data; if(p->lsize == -1) debug_log("leak","%s: %X is a new pool",p->zone,p->name); else if(p->size > p->lsize) debug_log("leak","%s: %X grew %d",p->zone,p->name, p->size - p->lsize); else if((int)arg) debug_log("leak","%s: %X exists %d",p->zone,p->name, p->size); p->lsize = p->size; return 1; } void pool_stat(int full) { ghash_walk(pool__disturbed,_pool_stat,(void *)full); if(pool__total != pool__ltotal) debug_log("leak","%d\ttotal missed mallocs",pool__total); pool__ltotal = pool__total; return; } #else void pool_stat(int full) { return; } #endif centerim-4.22.10/libjabber/hashtable.h0000644000175000001440000000372411461606612014434 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #include #ifdef XML_UNICODE #ifdef XML_UNICODE_WCHAR_T typedef const wchar_t *KEY; #else /* not XML_UNICODE_WCHAR_T */ typedef const unsigned short *KEY; #endif /* not XML_UNICODE_WCHAR_T */ #else /* not XML_UNICODE */ typedef const char *KEY; #endif /* not XML_UNICODE */ typedef struct { KEY name; } NAMED; typedef struct { NAMED **v; size_t size; size_t used; size_t usedLim; } HASH_TABLE; NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize); void hashTableInit(HASH_TABLE *); void hashTableDestroy(HASH_TABLE *); typedef struct { NAMED **p; NAMED **end; } HASH_TABLE_ITER; void hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); NAMED *hashTableIterNext(HASH_TABLE_ITER *); centerim-4.22.10/libjabber/sha.c0000644000175000001440000001273011461606612013244 00000000000000/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is SHA 180-1 Reference Implementation (Compact version) * * The Initial Developer of the Original Code is Paul Kocher of * Cryptography Research. Portions created by Paul Kocher are * Copyright (C) 1995-9 by Cryptography Research, Inc. All * Rights Reserved. * * Contributor(s): * * Paul Kocher * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. */ #include "libxode.h" static void shaHashBlock(SHA_CTX *ctx); void shaInit(SHA_CTX *ctx) { int i; ctx->lenW = 0; ctx->sizeHi = ctx->sizeLo = 0; /* Initialize H with the magic constants (see FIPS180 for constants) */ ctx->H[0] = 0x67452301L; ctx->H[1] = 0xefcdab89L; ctx->H[2] = 0x98badcfeL; ctx->H[3] = 0x10325476L; ctx->H[4] = 0xc3d2e1f0L; for (i = 0; i < 80; i++) ctx->W[i] = 0; } void shaUpdate(SHA_CTX *ctx, unsigned char *dataIn, int len) { int i; /* Read the data into W and process blocks as they get full */ for (i = 0; i < len; i++) { ctx->W[ctx->lenW / 4] <<= 8; ctx->W[ctx->lenW / 4] |= (uint32_t)dataIn[i]; if ((++ctx->lenW) % 64 == 0) { shaHashBlock(ctx); ctx->lenW = 0; } ctx->sizeLo += 8; ctx->sizeHi += (ctx->sizeLo < 8); } } void shaFinal(SHA_CTX *ctx, unsigned char hashout[20]) { unsigned char pad0x80 = 0x80; unsigned char pad0x00 = 0x00; unsigned char padlen[8]; int i; /* Pad with a binary 1 (e.g. 0x80), then zeroes, then length */ padlen[0] = (unsigned char)((ctx->sizeHi >> 24) & 255); padlen[1] = (unsigned char)((ctx->sizeHi >> 16) & 255); padlen[2] = (unsigned char)((ctx->sizeHi >> 8) & 255); padlen[3] = (unsigned char)((ctx->sizeHi >> 0) & 255); padlen[4] = (unsigned char)((ctx->sizeLo >> 24) & 255); padlen[5] = (unsigned char)((ctx->sizeLo >> 16) & 255); padlen[6] = (unsigned char)((ctx->sizeLo >> 8) & 255); padlen[7] = (unsigned char)((ctx->sizeLo >> 0) & 255); shaUpdate(ctx, &pad0x80, 1); while (ctx->lenW != 56) shaUpdate(ctx, &pad0x00, 1); shaUpdate(ctx, padlen, 8); /* Output hash */ for (i = 0; i < 20; i++) { hashout[i] = (unsigned char)(ctx->H[i / 4] >> 24); ctx->H[i / 4] <<= 8; } /* * Re-initialize the context (also zeroizes contents) */ shaInit(ctx); } void shaBlock(unsigned char *dataIn, int len, unsigned char hashout[20]) { SHA_CTX ctx; shaInit(&ctx); shaUpdate(&ctx, dataIn, len); shaFinal(&ctx, hashout); } #define SHA_ROTL(X,n) (((X) << (n)) | ((X) >> (32-(n)))) static void shaHashBlock(SHA_CTX *ctx) { int t; uint32_t A,B,C,D,E,TEMP; for (t = 16; t <= 79; t++) ctx->W[t] = SHA_ROTL(ctx->W[t-3] ^ ctx->W[t-8] ^ ctx->W[t-14] ^ ctx->W[t-16], 1); A = ctx->H[0]; B = ctx->H[1]; C = ctx->H[2]; D = ctx->H[3]; E = ctx->H[4]; for (t = 0; t <= 19; t++) { TEMP = SHA_ROTL(A,5) + (((C^D)&B)^D) + E + ctx->W[t] + 0x5a827999L; E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP; } for (t = 20; t <= 39; t++) { TEMP = SHA_ROTL(A,5) + (B^C^D) + E + ctx->W[t] + 0x6ed9eba1L; E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP; } for (t = 40; t <= 59; t++) { TEMP = SHA_ROTL(A,5) + ((B&C)|(D&(B|C))) + E + ctx->W[t] + 0x8f1bbcdcL; E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP; } for (t = 60; t <= 79; t++) { TEMP = SHA_ROTL(A,5) + (B^C^D) + E + ctx->W[t] + 0xca62c1d6L; E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP; } ctx->H[0] += A; ctx->H[1] += B; ctx->H[2] += C; ctx->H[3] += D; ctx->H[4] += E; } /*---------------------------------------------------------------------------- * * This code added by Thomas "temas" Muldowney for Jabber compatability * *---------------------------------------------------------------------------*/ char *shahash(char *str) { static char final[41]; char *pos; unsigned char hashval[20]; int x; if(!str || strlen(str) == 0) return NULL; shaBlock((unsigned char *)str, strlen(str), hashval); pos = final; for(x=0;x<20;x++) { snprintf(pos, 3, "%02x", hashval[x]); pos += 2; } return (char *)final; } void shahash_r(const char* str, char hashbuf[41]) { int x; char *pos; unsigned char hashval[20]; if(!str || strlen(str) == 0) return; shaBlock((unsigned char *)str, strlen(str), hashval); pos = hashbuf; for(x=0;x<20;x++) { snprintf(pos, 3, "%02x", hashval[x]); pos += 2; } return; } centerim-4.22.10/libjabber/Makefile.am0000644000175000001440000000072011461606612014355 00000000000000AM_CPPFLAGS = -I$(top_srcdir)/connwrap noinst_LIBRARIES = liblibjabber.a noinst_HEADERS = xmltok_impl_c.h latin1tab.h log.h asciitab.h libxode.h jabber.h hashtable.h xmlparse.h iasciitab.h xmldef.h xmltok.h utf8tab.h xmltok_impl.h xmlrole.h nametab.h xmltok_ns_c.h liblibjabber_a_SOURCES = jid.c log.c jutil.c str.c expat.c hashtable.c genhash.c pproxy.c pool.c rate.c xmlparse.c xstream.c xmltok.c xmlnode.c jconn.c xmlrole.c jpacket.c snprintf.c socket.c sha.c centerim-4.22.10/libjabber/utf8tab.h0000644000175000001440000000554711461606612014063 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ /* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, /* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, /* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, centerim-4.22.10/libjabber/pproxy.c0000644000175000001440000001016511461606612014032 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include "jabber.h" /* these aren't the most efficient things in the world, a hash optimized for tiny spaces would be far better */ ppdb _ppdb_new(pool p, jid id) { ppdb ret; ret = pmalloc(p,sizeof(_ppdb)); ret->p = p; ret->pri = -1; ret->next = NULL; ret->user = NULL; ret->x = NULL; ret->id = jid_new(p,jid_full(id)); return ret; } ppdb _ppdb_get(ppdb db, jid id) { ppdb cur; if(db == NULL || id == NULL) return NULL; for(cur = db->next; cur != NULL; cur = cur->next) if(jid_cmp(cur->id,id) == 0) return cur; return NULL; } ppdb ppdb_insert(ppdb db, jid id, xmlnode x) { char *res; ppdb cur, curu; pool p; if(id == NULL || id->server == NULL || x == NULL) return db; /* new ppdb list dummy holder */ if(db == NULL) { p = pool_heap(1024); db = _ppdb_new(p,id); } cur = _ppdb_get(db,id); /* just update it */ if(cur != NULL) { xmlnode_free(cur->x); cur->x = xmlnode_dup(x); cur->pri = jutil_priority(x); return db; } /* make an entry for it */ cur = _ppdb_new(db->p,id); cur->x = xmlnode_dup(x); cur->pri = jutil_priority(x); cur->next = db->next; db->next = cur; /* this is a presence from a resource, make an entry for just the user */ if(id->user != NULL && id->resource != NULL) { /* modify the id to just user@host */ res = id->resource; jid_set(id,NULL,JID_RESOURCE); curu = _ppdb_get(db,id); /* no user entry, make one */ if(curu == NULL) { curu = _ppdb_new(db->p,id); curu->next = db->next; db->next = curu; } /* restore the id */ jid_set(id,res,JID_RESOURCE); /* insert this resource into the user list */ cur->user = curu->user; curu->user = cur; } return db; } xmlnode ppdb_primary(ppdb db, jid id) { ppdb cur, top; if(db == NULL || id == NULL) return NULL; cur = _ppdb_get(db,id); if(cur == NULL) return NULL; /* not user@host check, just return */ if(id->user == NULL || id->resource != NULL) return cur->x; top = cur; for(cur = cur->user; cur != NULL; cur = cur->user) if(cur->pri >= top->pri) top = cur; if(top != NULL && top->pri >= 0) return top->x; return NULL; } /* return the presence for the id, successive calls return all of the known resources for a user@host address */ xmlnode ppdb_get(ppdb db, jid id) { static ppdb last = NULL; ppdb cur; if(db == NULL || id == NULL) return NULL; /* MODE: if this is NOT just user@host addy, return just the single entry */ if(id->user == NULL || id->resource != NULL) { /* we were just here, return now */ if(last != NULL) { last = NULL; return NULL; } last = _ppdb_get(db,id); if(last != NULL) return last->x; else return NULL; } /* handle looping for user@host */ /* we're already in the loop */ if(last != NULL) { /* this is the last entry in the list */ if(last->user == NULL) { last = NULL; return NULL; } last = last->user; return last->x; } /* start a new loop */ cur = _ppdb_get(db,id); if(cur == NULL) return NULL; last = cur->user; if(last != NULL) return last->x; else return NULL; } void ppdb_free(ppdb db) { ppdb cur; if(db == NULL) return; for(cur = db; cur != NULL; cur = cur->next) xmlnode_free(cur->x); pool_free(db->p); } centerim-4.22.10/libjabber/xmlparse.h0000644000175000001440000004317611461606612014341 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #ifndef XmlParse_INCLUDED #define XmlParse_INCLUDED 1 #ifdef __cplusplus extern "C" { #endif #ifndef XMLPARSEAPI #define XMLPARSEAPI /* as nothing */ #endif typedef void *XML_Parser; #ifdef XML_UNICODE_WCHAR_T /* XML_UNICODE_WCHAR_T will work only if sizeof(wchar_t) == 2 and wchar_t uses Unicode. */ /* Information is UTF-16 encoded as wchar_ts */ #ifndef XML_UNICODE #define XML_UNICODE #endif #include typedef wchar_t XML_Char; typedef wchar_t XML_LChar; #else /* not XML_UNICODE_WCHAR_T */ #ifdef XML_UNICODE /* Information is UTF-16 encoded as unsigned shorts */ typedef unsigned short XML_Char; typedef char XML_LChar; #else /* not XML_UNICODE */ /* Information is UTF-8 encoded. */ typedef char XML_Char; typedef char XML_LChar; #endif /* not XML_UNICODE */ #endif /* not XML_UNICODE_WCHAR_T */ /* Constructs a new parser; encoding is the encoding specified by the external protocol or null if there is none specified. */ XML_Parser XMLPARSEAPI XML_ParserCreate(const XML_Char *encoding); /* Constructs a new parser and namespace processor. Element type names and attribute names that belong to a namespace will be expanded; unprefixed attribute names are never expanded; unprefixed element type names are expanded only if there is a default namespace. The expanded name is the concatenation of the namespace URI, the namespace separator character, and the local part of the name. If the namespace separator is '\0' then the namespace URI and the local part will be concatenated without any separator. When a namespace is not declared, the name and prefix will be passed through without expansion. */ XML_Parser XMLPARSEAPI XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); /* atts is array of name/value pairs, terminated by 0; names and values are 0 terminated. */ typedef void (*XML_StartElementHandler)(void *userData, const XML_Char *name, const XML_Char **atts); typedef void (*XML_EndElementHandler)(void *userData, const XML_Char *name); /* s is not 0 terminated. */ typedef void (*XML_CharacterDataHandler)(void *userData, const XML_Char *s, int len); /* target and data are 0 terminated */ typedef void (*XML_ProcessingInstructionHandler)(void *userData, const XML_Char *target, const XML_Char *data); /* data is 0 terminated */ typedef void (*XML_CommentHandler)(void *userData, const XML_Char *data); typedef void (*XML_StartCdataSectionHandler)(void *userData); typedef void (*XML_EndCdataSectionHandler)(void *userData); /* This is called for any characters in the XML document for which there is no applicable handler. This includes both characters that are part of markup which is of a kind that is not reported (comments, markup declarations), or characters that are part of a construct which could be reported but for which no handler has been supplied. The characters are passed exactly as they were in the XML document except that they will be encoded in UTF-8. Line boundaries are not normalized. Note that a byte order mark character is not passed to the default handler. There are no guarantees about how characters are divided between calls to the default handler: for example, a comment might be split between multiple calls. */ typedef void (*XML_DefaultHandler)(void *userData, const XML_Char *s, int len); /* This is called for a declaration of an unparsed (NDATA) entity. The base argument is whatever was set by XML_SetBase. The entityName, systemId and notationName arguments will never be null. The other arguments may be. */ typedef void (*XML_UnparsedEntityDeclHandler)(void *userData, const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName); /* This is called for a declaration of notation. The base argument is whatever was set by XML_SetBase. The notationName will never be null. The other arguments can be. */ typedef void (*XML_NotationDeclHandler)(void *userData, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId); /* When namespace processing is enabled, these are called once for each namespace declaration. The call to the start and end element handlers occur between the calls to the start and end namespace declaration handlers. For an xmlns attribute, prefix will be null. For an xmlns="" attribute, uri will be null. */ typedef void (*XML_StartNamespaceDeclHandler)(void *userData, const XML_Char *prefix, const XML_Char *uri); typedef void (*XML_EndNamespaceDeclHandler)(void *userData, const XML_Char *prefix); /* This is called if the document is not standalone (it has an external subset or a reference to a parameter entity, but does not have standalone="yes"). If this handler returns 0, then processing will not continue, and the parser will return a XML_ERROR_NOT_STANDALONE error. */ typedef int (*XML_NotStandaloneHandler)(void *userData); /* This is called for a reference to an external parsed general entity. The referenced entity is not automatically parsed. The application can parse it immediately or later using XML_ExternalEntityParserCreate. The parser argument is the parser parsing the entity containing the reference; it can be passed as the parser argument to XML_ExternalEntityParserCreate. The systemId argument is the system identifier as specified in the entity declaration; it will not be null. The base argument is the system identifier that should be used as the base for resolving systemId if systemId was relative; this is set by XML_SetBase; it may be null. The publicId argument is the public identifier as specified in the entity declaration, or null if none was specified; the whitespace in the public identifier will have been normalized as required by the XML spec. The context argument specifies the parsing context in the format expected by the context argument to XML_ExternalEntityParserCreate; context is valid only until the handler returns, so if the referenced entity is to be parsed later, it must be copied. The handler should return 0 if processing should not continue because of a fatal error in the handling of the external entity. In this case the calling parser will return an XML_ERROR_EXTERNAL_ENTITY_HANDLING error. Note that unlike other handlers the first argument is the parser, not userData. */ typedef int (*XML_ExternalEntityRefHandler)(XML_Parser parser, const XML_Char *context, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId); /* This structure is filled in by the XML_UnknownEncodingHandler to provide information to the parser about encodings that are unknown to the parser. The map[b] member gives information about byte sequences whose first byte is b. If map[b] is c where c is >= 0, then b by itself encodes the Unicode scalar value c. If map[b] is -1, then the byte sequence is malformed. If map[b] is -n, where n >= 2, then b is the first byte of an n-byte sequence that encodes a single Unicode scalar value. The data member will be passed as the first argument to the convert function. The convert function is used to convert multibyte sequences; s will point to a n-byte sequence where map[(unsigned char)*s] == -n. The convert function must return the Unicode scalar value represented by this byte sequence or -1 if the byte sequence is malformed. The convert function may be null if the encoding is a single-byte encoding, that is if map[b] >= -1 for all bytes b. When the parser is finished with the encoding, then if release is not null, it will call release passing it the data member; once release has been called, the convert function will not be called again. Expat places certain restrictions on the encodings that are supported using this mechanism. 1. Every ASCII character that can appear in a well-formed XML document, other than the characters $@\^`{}~ must be represented by a single byte, and that byte must be the same byte that represents that character in ASCII. 2. No character may require more than 4 bytes to encode. 3. All characters encoded must have Unicode scalar values <= 0xFFFF, (ie characters that would be encoded by surrogates in UTF-16 are not allowed). Note that this restriction doesn't apply to the built-in support for UTF-8 and UTF-16. 4. No Unicode character may be encoded by more than one distinct sequence of bytes. */ typedef struct { int map[256]; void *data; int (*convert)(void *data, const char *s); void (*release)(void *data); } XML_Encoding; /* This is called for an encoding that is unknown to the parser. The encodingHandlerData argument is that which was passed as the second argument to XML_SetUnknownEncodingHandler. The name argument gives the name of the encoding as specified in the encoding declaration. If the callback can provide information about the encoding, it must fill in the XML_Encoding structure, and return 1. Otherwise it must return 0. If info does not describe a suitable encoding, then the parser will return an XML_UNKNOWN_ENCODING error. */ typedef int (*XML_UnknownEncodingHandler)(void *encodingHandlerData, const XML_Char *name, XML_Encoding *info); void XMLPARSEAPI XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end); void XMLPARSEAPI XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler); void XMLPARSEAPI XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler); void XMLPARSEAPI XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler); void XMLPARSEAPI XML_SetCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start, XML_EndCdataSectionHandler end); /* This sets the default handler and also inhibits expansion of internal entities. The entity reference will be passed to the default handler. */ void XMLPARSEAPI XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler); /* This sets the default handler but does not inhibit expansion of internal entities. The entity reference will not be passed to the default handler. */ void XMLPARSEAPI XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler); void XMLPARSEAPI XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler); void XMLPARSEAPI XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler); void XMLPARSEAPI XML_SetNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end); void XMLPARSEAPI XML_SetNotStandaloneHandler(XML_Parser parser, XML_NotStandaloneHandler handler); void XMLPARSEAPI XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler handler); /* If a non-null value for arg is specified here, then it will be passed as the first argument to the external entity ref handler instead of the parser object. */ void XMLPARSEAPI XML_SetExternalEntityRefHandlerArg(XML_Parser, void *arg); void XMLPARSEAPI XML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *encodingHandlerData); /* This can be called within a handler for a start element, end element, processing instruction or character data. It causes the corresponding markup to be passed to the default handler. */ void XMLPARSEAPI XML_DefaultCurrent(XML_Parser parser); /* This value is passed as the userData argument to callbacks. */ void XMLPARSEAPI XML_SetUserData(XML_Parser parser, void *userData); /* Returns the last value set by XML_SetUserData or null. */ #define XML_GetUserData(parser) (*(void **)(parser)) /* This is equivalent to supplying an encoding argument to XML_CreateParser. It must not be called after XML_Parse or XML_ParseBuffer. */ int XMLPARSEAPI XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); /* If this function is called, then the parser will be passed as the first argument to callbacks instead of userData. The userData will still be accessible using XML_GetUserData. */ void XMLPARSEAPI XML_UseParserAsHandlerArg(XML_Parser parser); /* Sets the base to be used for resolving relative URIs in system identifiers in declarations. Resolving relative identifiers is left to the application: this value will be passed through as the base argument to the XML_ExternalEntityRefHandler, XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base argument will be copied. Returns zero if out of memory, non-zero otherwise. */ int XMLPARSEAPI XML_SetBase(XML_Parser parser, const XML_Char *base); const XML_Char XMLPARSEAPI * XML_GetBase(XML_Parser parser); /* Returns the number of the attributes passed in last call to the XML_StartElementHandler that were specified in the start-tag rather than defaulted. */ int XMLPARSEAPI XML_GetSpecifiedAttributeCount(XML_Parser parser); /* Parses some input. Returns 0 if a fatal error is detected. The last call to XML_Parse must have isFinal true; len may be zero for this call (or any other). */ int XMLPARSEAPI XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); void XMLPARSEAPI * XML_GetBuffer(XML_Parser parser, int len); int XMLPARSEAPI XML_ParseBuffer(XML_Parser parser, int len, int isFinal); /* Creates an XML_Parser object that can parse an external general entity; context is a '\0'-terminated string specifying the parse context; encoding is a '\0'-terminated string giving the name of the externally specified encoding, or null if there is no externally specified encoding. The context string consists of a sequence of tokens separated by formfeeds (\f); a token consisting of a name specifies that the general entity of the name is open; a token of the form prefix=uri specifies the namespace for a particular prefix; a token of the form =uri specifies the default namespace. This can be called at any point after the first call to an ExternalEntityRefHandler so longer as the parser has not yet been freed. The new parser is completely independent and may safely be used in a separate thread. The handlers and userData are initialized from the parser argument. Returns 0 if out of memory. Otherwise returns a new XML_Parser object. */ XML_Parser XMLPARSEAPI XML_ExternalEntityParserCreate(XML_Parser parser, const XML_Char *context, const XML_Char *encoding); enum XML_Error { XML_ERROR_NONE, XML_ERROR_NO_MEMORY, XML_ERROR_SYNTAX, XML_ERROR_NO_ELEMENTS, XML_ERROR_INVALID_TOKEN, XML_ERROR_UNCLOSED_TOKEN, XML_ERROR_PARTIAL_CHAR, XML_ERROR_TAG_MISMATCH, XML_ERROR_DUPLICATE_ATTRIBUTE, XML_ERROR_JUNK_AFTER_DOC_ELEMENT, XML_ERROR_PARAM_ENTITY_REF, XML_ERROR_UNDEFINED_ENTITY, XML_ERROR_RECURSIVE_ENTITY_REF, XML_ERROR_ASYNC_ENTITY, XML_ERROR_BAD_CHAR_REF, XML_ERROR_BINARY_ENTITY_REF, XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, XML_ERROR_MISPLACED_XML_PI, XML_ERROR_UNKNOWN_ENCODING, XML_ERROR_INCORRECT_ENCODING, XML_ERROR_UNCLOSED_CDATA_SECTION, XML_ERROR_EXTERNAL_ENTITY_HANDLING, XML_ERROR_NOT_STANDALONE }; /* If XML_Parse or XML_ParseBuffer have returned 0, then XML_GetErrorCode returns information about the error. */ enum XML_Error XMLPARSEAPI XML_GetErrorCode(XML_Parser parser); /* These functions return information about the current parse location. They may be called when XML_Parse or XML_ParseBuffer return 0; in this case the location is the location of the character at which the error was detected. They may also be called from any other callback called to report some parse event; in this the location is the location of the first of the sequence of characters that generated the event. */ int XMLPARSEAPI XML_GetCurrentLineNumber(XML_Parser parser); int XMLPARSEAPI XML_GetCurrentColumnNumber(XML_Parser parser); long XMLPARSEAPI XML_GetCurrentByteIndex(XML_Parser parser); /* Return the number of bytes in the current event. Returns 0 if the event is in an internal entity. */ int XMLPARSEAPI XML_GetCurrentByteCount(XML_Parser parser); /* For backwards compatibility with previous versions. */ #define XML_GetErrorLineNumber XML_GetCurrentLineNumber #define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber #define XML_GetErrorByteIndex XML_GetCurrentByteIndex /* Frees memory used by the parser. */ void XMLPARSEAPI XML_ParserFree(XML_Parser parser); /* Returns a string describing the error. */ const XML_LChar XMLPARSEAPI *XML_ErrorString(int code); #ifdef __cplusplus } #endif #endif /* not XmlParse_INCLUDED */ centerim-4.22.10/libjabber/jconn.c0000644000175000001440000004553711461606612013613 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include "jabber.h" #include "connwrap.h" #ifdef HAVE_THREAD #include #endif /* local macros for launching event handlers */ #define STATE_EVT(arg) if(j->on_state) { (j->on_state)(j, (arg) ); } /* prototypes of the local functions */ static void startElement(void *userdata, const char *name, const char **attribs); static void endElement(void *userdata, const char *name); static void charData(void *userdata, const char *s, int slen); /* * jab_new -- initialize a new jabber connection * * parameters * user -- jabber id of the user * pass -- password of the user * * results * a pointer to the connection structure * or NULL if allocations failed */ jconn jab_new(char *user, char *pass, char *server, int port, int ssl) { pool p; jconn j; if(!user) return(NULL); p = pool_new(); if(!p) return(NULL); j = pmalloc_x(p, sizeof(jconn_struct), 0); if(!j) return(NULL); j->p = p; j->user = jid_new(p, user); j->pass = pstrdup(p, pass); j->port = port; j->server = server; j->state = JCONN_STATE_OFF; j->cw_state = 0; j->id = 1; j->fd = -1; j->ssl = ssl; return j; } /* * jab_delete -- free a jabber connection * * parameters * j -- connection * */ void jab_delete(jconn j) { if(!j) return; jab_stop(j); pool_free(j->p); } /* * jab_state_handler -- set callback handler for state change * * parameters * j -- connection * h -- name of the handler function */ void jab_state_handler(jconn j, jconn_state_h h) { if(!j) return; j->on_state = h; } /* * jab_packet_handler -- set callback handler for incoming packets * * parameters * j -- connection * h -- name of the handler function */ void jab_packet_handler(jconn j, jconn_packet_h h) { if(!j) return; j->on_packet = h; } void jab_logger(jconn j, jconn_logger h) { if(!j) return; j->logger = h; } /* * jab_start -- start connection * * parameters * j -- connection * */ void jab_start(jconn j) { xmlnode x; char *t,*t2; if(!j || (j->state != JCONN_STATE_OFF && j->state != JCONN_STATE_CONNECTING) ) return; if (!(j->cw_state & CW_CONNECT_WANT_SOMETHING)) { /* same as state != JCONN_STATE_CONNECTING */ j->parser = XML_ParserCreate(NULL); XML_SetUserData(j->parser, (void *)j); XML_SetElementHandler(j->parser, startElement, endElement); XML_SetCharacterDataHandler(j->parser, charData); if (j->cw_state & CW_CONNECT_BLOCKING) j->fd = make_netsocket(j->port, j->server, NETSOCKET_CLIENT, j->ssl); else j->fd = make_nb_netsocket(j->port, j->server, NETSOCKET_CLIENT, j->ssl, &j->cw_state); if(j->fd < 0) { STATE_EVT(JCONN_STATE_OFF); return; } } else { /* subsequent calls to cw_nb_connect until it finishes negociation */ if (cw_nb_connect(j->fd, 0, 0, j->ssl, &j->cw_state)) { STATE_EVT(JCONN_STATE_OFF); return; } } if (j->cw_state & CW_CONNECT_WANT_SOMETHING){ /* check if it finished negociation */ j->state = JCONN_STATE_CONNECTING; STATE_EVT(JCONN_STATE_CONNECTING); return; } change_socket_to_blocking(j->fd); j->state = JCONN_STATE_CONNECTED; STATE_EVT(JCONN_STATE_CONNECTED) /* start stream */ x = jutil_header(NS_CLIENT, j->user->server); t = xmlnode2str(x); /* this is ugly, we can create the string here instead of jutil_header */ /* what do you think about it? -madcat */ t2 = strstr(t,"/>"); if (t2 != NULL) { *t2++ = '>'; *t2 = '\0'; } jab_send_raw(j,""); jab_send_raw(j,t); xmlnode_free(x); j->state = JCONN_STATE_ON; STATE_EVT(JCONN_STATE_ON) } /* * jab_stop -- stop connection * * parameters * j -- connection */ void jab_stop(jconn j) { if(!j || j->state == JCONN_STATE_OFF) return; j->state = JCONN_STATE_OFF; cw_close(j->fd); j->fd = -1; XML_ParserFree(j->parser); } /* * jab_getfd -- get file descriptor of connection socket * * parameters * j -- connection * * returns * fd of the socket or -1 if socket was not connected */ int jab_getfd(jconn j) { if(j) return j->fd; else return -1; } /* * jab_getjid -- get jid structure of user * * parameters * j -- connection */ jid jab_getjid(jconn j) { if(j) return(j->user); else return NULL; } /* jab_getsid -- get stream id * This is the id of server's tag and used for * digest authorization. * * parameters * j -- connection */ char *jab_getsid(jconn j) { if(j) return(j->sid); else return NULL; } /* * jab_getid -- get a unique id * * parameters * j -- connection */ char *jab_getid(jconn j) { snprintf(j->idbuf, 8, "%d", j->id++); return &j->idbuf[0]; } /* * jab_send -- send xml data * * parameters * j -- connection * x -- xmlnode structure */ void jab_send(jconn j, xmlnode x) { if (j && j->state != JCONN_STATE_OFF) { char *buf = xmlnode2str(x); if (buf) { cw_write(j->fd, buf, strlen(buf), j->ssl); if (j->logger) (j->logger)(j, 0, buf); } #ifdef JDEBUG printf ("out: %s\n", buf); #endif } } /* * jab_send_raw -- send a string * * parameters * j -- connection * str -- xml string */ void jab_send_raw(jconn j, const char *str) { if (j && j->state != JCONN_STATE_OFF) { cw_write(j->fd, str, strlen(str), j->ssl); if (j->logger) (j->logger)(j, 0, str); } #ifdef JDEBUG printf ("out: %s\n", str); #endif } /* * jab_recv -- read and parse incoming data * * parameters * j -- connection */ void jab_recv(jconn j) { static char buf[32768]; int len; if(!j || j->state == JCONN_STATE_OFF) return; len = cw_read(j->fd, buf, sizeof(buf)-1, j->ssl); if(len>0) { buf[len] = '\0'; if (j->logger) (j->logger)(j, 1, buf); #ifdef JDEBUG printf (" in: %s\n", buf); #endif XML_Parse(j->parser, buf, len, 0); } else if(len<=0) { STATE_EVT(JCONN_STATE_OFF); jab_stop(j); } } /* * jab_poll -- check socket for incoming data * * parameters * j -- connection * timeout -- poll timeout */ void jab_poll(jconn j, int timeout) { fd_set fds; struct timeval tv; int r; if (!j || j->state == JCONN_STATE_OFF || j->fd == -1) return; FD_ZERO(&fds); FD_SET(j->fd, &fds); if(timeout <= 0) { r = select(j->fd + 1, &fds, NULL, NULL, NULL); } else { tv.tv_sec = 0; tv.tv_usec = timeout; r = select(j->fd + 1, &fds, NULL, NULL, &tv); } if(r > 0) { jab_recv(j); } else if(r) { STATE_EVT(JCONN_STATE_OFF); jab_stop(j); } } /* * jab_auth -- authorize user * * parameters * j -- connection * * returns * id of the iq packet */ char *jab_auth(jconn j) { xmlnode x,y,z; char *hash, *user, *id; if(!j) return(NULL); x = jutil_iqnew(JPACKET__SET, NS_AUTH); id = jab_getid(j); xmlnode_put_attrib(x, "id", id); y = xmlnode_get_tag(x,"query"); user = j->user->user; if (user) { z = xmlnode_insert_tag(y, "username"); xmlnode_insert_cdata(z, user, -1); } z = xmlnode_insert_tag(y, "resource"); xmlnode_insert_cdata(z, j->user->resource, -1); if (j->sid) { z = xmlnode_insert_tag(y, "digest"); hash = pmalloc(x->p, strlen(j->sid)+strlen(j->pass)+1); strcpy(hash, j->sid); strcat(hash, j->pass); hash = shahash(hash); xmlnode_insert_cdata(z, hash, 40); } else { z = xmlnode_insert_tag(y, "password"); xmlnode_insert_cdata(z, j->pass, -1); } jab_send(j, x); xmlnode_free(x); return id; } /* * jab_reg -- register user * * parameters * j -- connection * * returns * id of the iq packet */ char *jab_reg(jconn j) { xmlnode x,y,z; char *hash, *user, *id; if (!j) return(NULL); x = jutil_iqnew(JPACKET__SET, NS_REGISTER); id = jab_getid(j); xmlnode_put_attrib(x, "id", id); y = xmlnode_get_tag(x,"query"); user = j->user->user; if (user) { z = xmlnode_insert_tag(y, "username"); xmlnode_insert_cdata(z, user, -1); } z = xmlnode_insert_tag(y, "resource"); xmlnode_insert_cdata(z, j->user->resource, -1); if (j->pass) { z = xmlnode_insert_tag(y, "password"); xmlnode_insert_cdata(z, j->pass, -1); } jab_send(j, x); xmlnode_free(x); j->state = JCONN_STATE_ON; STATE_EVT(JCONN_STATE_ON) return id; } /* local functions */ static void startElement(void *userdata, const char *name, const char **attribs) { xmlnode x; jconn j = (jconn)userdata; if(j->current) { /* Append the node to the current one */ x = xmlnode_insert_tag(j->current, name); xmlnode_put_expat_attribs(x, attribs); j->current = x; } else { x = xmlnode_new_tag(name); xmlnode_put_expat_attribs(x, attribs); if(strcmp(name, "stream:stream") == 0) { /* special case: name == stream:stream */ /* id attrib of stream is stored for digest auth */ j->sid = xmlnode_get_attrib(x, "id"); /* STATE_EVT(JCONN_STATE_AUTH) */ } else { j->current = x; } } } static void endElement(void *userdata, const char *name) { jconn j = (jconn)userdata; xmlnode x; jpacket p; if(j->current == NULL) { /* we got */ STATE_EVT(JCONN_STATE_OFF) return; } x = xmlnode_get_parent(j->current); if(x == NULL) { /* it is time to fire the event */ p = jpacket_new(j->current); if(j->on_packet) (j->on_packet)(j, p); else xmlnode_free(j->current); } j->current = x; } static void charData(void *userdata, const char *s, int slen) { jconn j = (jconn)userdata; if (j->current) xmlnode_insert_cdata(j->current, s, slen); } void cleanup_thread(void *arg) { struct pargs_r *argument = (struct pargs_r*)arg; if(argument) { close(argument->fd_file); close(argument->sock); if(argument->hash) free(argument->hash); if(argument->rfile) free(argument->rfile); free(argument); } } void jabber_send_file(jconn j, const char *filename, long int size, struct send_file *file, void *rfile, void (*function)(void *file, long int bytes, long int size, int status, int conn_type), int start_port, int end_port) //returning ip address and port after binding { #ifdef HAVE_THREAD int sock; struct sockaddr_in addr; int optval = 1; int fd_file = open(filename, O_RDONLY); if( fd_file < 0 ) return; sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0) { close( fd_file ); return; } addr.sin_family = AF_INET; if( (start_port == 0) || (end_port == 0)) addr.sin_port = htons(0); // else addr.sin_port = htons(next_random(start_port,end_port)); // struct sockaddr_in sa; int sa_len = sizeof( sa ); getsockname( j->fd, (struct sockaddr *) &sa, &sa_len ); //geting address for bind addr.sin_addr.s_addr = sa.sin_addr.s_addr; // addr.sin_addr.s_addr = htonl(INADDR_ANY); if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval , sizeof(int)) < 0) { close( fd_file ); close( sock ); return; } if ( (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr)) ) < 0 ) { do { if( errno == EADDRINUSE ) //select another port addr.sin_port = htons(next_random(start_port, end_port)); //geting another random port else { close( fd_file ); close( sock ); return; } } while(bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr)) < 0); } listen(sock, 5); file->host = strdup(inet_ntoa(sa.sin_addr)); getsockname( sock, (struct sockaddr *) &sa, &sa_len ); file->port = (int) ntohs(sa.sin_port); struct pargs_r *arg; arg = (struct pargs_r *)calloc(1, sizeof(struct pargs_r)); if( arg ) { arg->sock = sock; arg->fd_file = fd_file; arg->size = size; arg->rfile = rfile; arg->hash = NULL; arg->url = NULL; arg->callback = function; if (pthread_create(&file->thread, NULL, jabber_send_file_fd, (void *)arg )) { free( arg ); close( fd_file ); close( sock ); } } else { close( fd_file ); close( sock ); } #endif } void *jabber_send_file_fd(void *arg) { #ifdef HAVE_THREAD struct pargs_r *argument; int sock; int fd_file; struct sockaddr_in *addr; long int size; argument = (struct pargs_r*)arg; sock = argument->sock; fd_file = argument->fd_file; size = argument->size; pthread_cleanup_push(cleanup_thread, argument); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); int client; char buff[SEND_BUF+1]; char sbuf[SEND_BUF+1]; int n; int addr_size = sizeof( addr ); client = accept(sock, (struct sockaddr *) &addr, &addr_size); int counter = 0; if( client > 0 ) { n = recv(client, buff, SEND_BUF, 0); if( strstr( buff, "GET /" ) ) { snprintf( sbuf, SEND_BUF, "%d\r\n\r\n", size ); strncpy( buff, "HTTP/1.0 200 OK\r\nContent-Type: application/data\r\nContent-Length: ", SEND_BUF ); strncat( buff, sbuf, SEND_BUF ); int str_len = strlen( buff ); send( client, buff, str_len, 0); while( ( n = read( fd_file, buff, SEND_BUF )) > 0 ) { counter += n; if( send( client, buff, n, 0) != n ) break; else argument->callback(argument->rfile, counter, size, 0, 1); } } close( client ); } if( counter == size ) argument->callback(argument->rfile, counter, size, 1, 1); else argument->callback(argument->rfile, counter, size, 2, 1); pthread_cleanup_pop(1); pthread_exit(0); #endif } int next_random( int start_port, int end_port ) //generate random number between two digits { srand( time( NULL ) ); return (start_port + rand() % (end_port-start_port+1)); } void jabber_get_file(jconn j, const char *filename, long int size, struct send_file *file, void *rfile, void (*function)(void *file, long int bytes, long int size, int status, int conn_type) ) //returning ip address and port after binding { #ifdef HAVE_THREAD int sock; struct sockaddr_in addr; int optval = 1; char *ip_addr = file->host; char *sid_from_to = file->sid_from_to; int port = file->port; int fd_file = open(filename, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); if( fd_file < 0 ) return; sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0) { close( fd_file ); return; } struct hostent *host = gethostbyname(ip_addr); bcopy(host->h_addr, &addr.sin_addr, host->h_length); addr.sin_family = AF_INET; addr.sin_port = htons( port ); if ( connect(sock, (struct sockaddr *) &addr, sizeof(addr) ) < 0 ) { close( sock ); close( fd_file ); return; } char *hash = NULL; if(sid_from_to) hash = shahash(sid_from_to); struct pargs_r *arg; arg = (struct pargs_r *)calloc(1, sizeof(struct pargs_r)); if( arg ) { arg->sock = sock; arg->fd_file = fd_file; arg->size = size; if( hash ) arg->hash = strdup( hash ); arg->rfile = rfile; arg->url = file->url; arg->callback = function; if(file->transfer_type == 0) { if (pthread_create(&file->thread, NULL, jabber_recieve_file_fd, (void *)arg )) { free( arg ); close( fd_file ); close( sock ); } } else { if (pthread_create(&file->thread, NULL, jabber_recieve_file_fd_http, (void *)arg )) { free( arg ); close( fd_file ); close( sock ); } } } else { close( fd_file ); close( sock ); } #endif } void *jabber_recieve_file_fd(void *arg) { #ifdef HAVE_THREAD struct pargs_r *argument; int sock; int fd_file; long int size; char *hash; argument = (struct pargs_r*)arg; sock = argument->sock; fd_file = argument->fd_file; size = argument->size; hash = argument->hash; pthread_cleanup_push(cleanup_thread, argument); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); char buff[SEND_BUF]; buff[0] = 0x05; buff[1] = 0x01; buff[2] = 0x00; if( send( sock, buff, 3, 0 ) != 3 ) { free(hash); close(sock); close(fd_file); return; } recv( sock, buff, SEND_BUF, 0 ); if( buff[0] != 0x05 || buff[1] != 0x00 ) { free(hash); close(sock); close(fd_file); return; } //socks5 bytestream packet buff[0] = 0x05; buff[1] = 0x01; buff[2] = 0x00; buff[3] = 0x03; buff[4] = 0x28; strncpy( (char*)(buff + 5), hash, 40 ); buff[45] = 0x00; buff[46] = 0x00; if( send( sock, buff, 47, 0 ) != 47 ) { free(hash); close(sock); close(fd_file); return; } recv( sock, buff, 47, 0 ); if( buff[0] != 0x05 || buff[3] != 0x03 ) { free(hash); close(sock); close(fd_file); return; } int bytes = 0; int counter = 0; while(1) { bytes = recv( sock, buff, SEND_BUF, 0 ); if( bytes < 1 ) break; else { write(fd_file, buff, bytes); counter += bytes; argument->callback(argument->rfile, counter, size, 0, 0); } } if( counter == size ) argument->callback(argument->rfile, counter, size, 1, 0); else argument->callback(argument->rfile, counter, size, 2, 0); pthread_cleanup_pop(1); pthread_exit(0); #endif } void *jabber_recieve_file_fd_http(void *arg) { #ifdef HAVE_THREAD struct pargs_r *argument; int sock; int fd_file; long int size; char *url; argument = (struct pargs_r*)arg; sock = argument->sock; fd_file = argument->fd_file; size = argument->size; url = argument->url; pthread_cleanup_push(cleanup_thread, argument); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); char buff[SEND_BUF]; snprintf( buff, SEND_BUF, "GET %s HTTP/1.0\r\n\r\n", url ); send( sock, buff, strlen(buff), 0 ); int but = recv( sock, buff, SEND_BUF, 0 ); if( strstr(buff, "200 OK" ) ) { char *length = strstr( buff, "Content-Length:" ); sscanf( length, "Content-Length: %d", &size ); int i = 0; while(i < but-4) { if(buff[i] == '\r' && buff[i+1] == '\n' && buff[i+2] == '\r' && buff[i+3] == '\n' ) { break; } i++; } i = i + 4; int bytes = 0; int counter = 0; bytes = but-i; write(fd_file, (buff+i), bytes); counter += bytes; while(1) { bytes = recv( sock, buff, SEND_BUF, 0 ); if( bytes < 1 ) break; else { write(fd_file, buff, bytes); counter += bytes; argument->callback(argument->rfile, counter, size, 0, 0); } } if( counter == size ) argument->callback(argument->rfile, counter, size, 1, 0); else argument->callback(argument->rfile, counter, size, 2, 0); } pthread_cleanup_pop(1); pthread_exit(0); #endif } centerim-4.22.10/libjabber/libxode.h0000644000175000001440000003543511461606612014133 00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "xmlparse.h" #ifdef HAVE_CONFIG_H #include #endif /* HAVE_CONFIG_H */ /* ** Arrange to use either varargs or stdargs */ #define MAXSHORTSTR 203 /* max short string length */ #define QUAD_T unsigned long long #ifdef __STDC__ #include # define VA_LOCAL_DECL va_list ap; # define VA_START(f) va_start(ap, f) # define VA_END va_end(ap) #else /* __STDC__ */ # include # define VA_LOCAL_DECL va_list ap; # define VA_START(f) va_start(ap) # define VA_END va_end(ap) #endif /* __STDC__ */ #ifndef INCL_LIBXODE_H #define INCL_LIBXODE_H #ifdef __cplusplus extern "C" { #endif #ifndef HAVE_SNPRINTF extern int ap_snprintf(char *, size_t, const char *, ...); #define snprintf ap_snprintf #endif #ifndef HAVE_VSNPRINTF extern int ap_vsnprintf(char *, size_t, const char *, va_list ap); #define vsnprintf ap_vsnprintf #endif #define ZONE zonestr(__FILE__,__LINE__) char *zonestr(char *file, int line); /* --------------------------------------------------------- */ /* */ /* Pool-based memory management routines */ /* */ /* --------------------------------------------------------- */ #undef POOL_DEBUG /* flip these, this should be a prime number for top # of pools debugging #define POOL_DEBUG 40009 */ /* pheap - singular allocation of memory */ struct pheap { void *block; int size, used; }; /* pool_cleaner - callback type which is associated with a pool entry; invoked when the pool entry is free'd */ typedef void (*pool_cleaner)(void *arg); /* pfree - a linked list node which stores an allocation chunk, plus a callback */ struct pfree { pool_cleaner f; void *arg; struct pheap *heap; struct pfree *next; }; /* pool - base node for a pool. Maintains a linked list of pool entries (pfree) */ typedef struct pool_struct { int size; struct pfree *cleanup; struct pheap *heap; #ifdef POOL_DEBUG char name[8], zone[32]; int lsize; } _pool, *pool; #define pool_new() _pool_new(ZONE) #define pool_heap(i) _pool_new_heap(i,ZONE) #else } _pool, *pool; #define pool_heap(i) _pool_new_heap(i,NULL) #define pool_new() _pool_new(NULL) #endif pool _pool_new(char *zone); /* new pool :) */ pool _pool_new_heap(int size, char *zone); /* creates a new memory pool with an initial heap size */ void *pmalloc(pool p, int size); /* wrapper around malloc, takes from the pool, cleaned up automatically */ void *pmalloc_x(pool p, int size, char c); /* Wrapper around pmalloc which prefils buffer with c */ void *pmalloco(pool p, int size); /* YAPW for zeroing the block */ char *pstrdup(pool p, const char *src); /* wrapper around strdup, gains mem from pool */ void pool_stat(int full); /* print to stderr the changed pools and reset */ char *pstrdupx(pool p, const char *src); /* temp stub */ void pool_cleanup(pool p, pool_cleaner f, void *arg); /* calls f(arg) before the pool is freed during cleanup */ void pool_free(pool p); /* calls the cleanup functions, frees all the data on the pool, and deletes the pool itself */ int pool_size(pool p); /* returns total bytes allocated in this pool */ /* --------------------------------------------------------- */ /* */ /* Socket helper stuff */ /* */ /* --------------------------------------------------------- */ #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 64 #endif #define NETSOCKET_SERVER 0 #define NETSOCKET_CLIENT 1 #define NETSOCKET_UDP 2 #ifndef WIN32 int make_netsocket(u_short port, char *host, int type, int ssl); int make_nb_netsocket(u_short port, char *host, int type, int ssl, int * state); void change_socket_to_blocking(int socket); struct in_addr *make_addr(char *host); int set_fd_close_on_exec(int fd, int flag); #endif /* --------------------------------------------------------- */ /* */ /* String management routines */ /* */ /* --------------------------------------------------------- */ char *j_strdup(const char *str); /* provides NULL safe strdup wrapper */ char *j_strcat(char *dest, char *txt); /* strcpy() clone */ int j_strcmp(const char *a, const char *b); /* provides NULL safe strcmp wrapper */ int j_strcasecmp(const char *a, const char *b); /* provides NULL safe strcasecmp wrapper */ int j_strncmp(const char *a, const char *b, int i); /* provides NULL safe strncmp wrapper */ int j_strncasecmp(const char *a, const char *b, int i); /* provides NULL safe strncasecmp wrapper */ int j_strlen(const char *a); /* provides NULL safe strlen wrapper */ int j_atoi(const char *a, int def); /* checks for NULL and uses default instead, convienence */ void str_b64decode(char *str); /* what it says */ /* --------------------------------------------------------- */ /* */ /* SHA calculations */ /* */ /* --------------------------------------------------------- */ #if (SIZEOF_INT == 4) typedef unsigned int uint32; #elif (SIZEOF_SHORT == 4) typedef unsigned short uint32; #else typedef unsigned int uint32; #endif /* HAVEUINT32 */ int sha_hash(int *data, int *hash); int sha_init(int *hash); char *shahash(char *str); /* NOT THREAD SAFE */ void shahash_r(const char* str, char hashbuf[40]); /* USE ME */ int strprintsha(char *dest, int *hashval); /* --------------------------------------------------------- */ /* */ /* Hashtable functions */ /* */ /* --------------------------------------------------------- */ typedef int (*KEYHASHFUNC)(const void *key); typedef int (*KEYCOMPAREFUNC)(const void *key1, const void *key2); typedef int (*TABLEWALKFUNC)(void *user_data, const void *key, void *data); typedef void *HASHTABLE; HASHTABLE ghash_create(int buckets, KEYHASHFUNC hash, KEYCOMPAREFUNC cmp); void ghash_destroy(HASHTABLE tbl); void *ghash_get(HASHTABLE tbl, const void *key); int ghash_put(HASHTABLE tbl, const void *key, void *value); int ghash_remove(HASHTABLE tbl, const void *key); int ghash_walk(HASHTABLE tbl, TABLEWALKFUNC func, void *user_data); int str_hash_code(const char *s); /* --------------------------------------------------------- */ /* */ /* XML escaping utils */ /* */ /* --------------------------------------------------------- */ char *strescape(pool p, char *buf); /* Escape <>&'" chars */ char *strunescape(pool p, char *buf); /* --------------------------------------------------------- */ /* */ /* String pools (spool) functions */ /* */ /* --------------------------------------------------------- */ struct spool_node { char *c; struct spool_node *next; }; typedef struct spool_struct { pool p; int len; struct spool_node *last; struct spool_node *first; } *spool; spool spool_new(pool p); /* create a string pool */ void spooler(spool s, ...); /* append all the char * args to the pool, terminate args with s again */ char *spool_print(spool s); /* return a big string */ void spool_add(spool s, char *str); /* add a single char to the pool */ char *spools(pool p, ...); /* wrap all the spooler stuff in one function, the happy fun ball! */ /* --------------------------------------------------------- */ /* */ /* xmlnodes - Document Object Model */ /* */ /* --------------------------------------------------------- */ #define NTYPE_TAG 0 #define NTYPE_ATTRIB 1 #define NTYPE_CDATA 2 #define NTYPE_LAST 2 #define NTYPE_UNDEF -1 /* -------------------------------------------------------------------------- Node structure. Do not use directly! Always use accessor macros and methods! -------------------------------------------------------------------------- */ typedef struct xmlnode_t { char* name; unsigned short type; char* data; int data_sz; int complete; pool p; struct xmlnode_t* parent; struct xmlnode_t* firstchild; struct xmlnode_t* lastchild; struct xmlnode_t* prev; struct xmlnode_t* next; struct xmlnode_t* firstattrib; struct xmlnode_t* lastattrib; } _xmlnode, *xmlnode; /* Node creation routines */ xmlnode xmlnode_wrap(xmlnode x,const char* wrapper); xmlnode xmlnode_new_tag(const char* name); xmlnode xmlnode_new_tag_pool(pool p, const char* name); xmlnode xmlnode_insert_tag(xmlnode parent, const char* name); xmlnode xmlnode_insert_cdata(xmlnode parent, const char* CDATA, unsigned int size); xmlnode xmlnode_insert_tag_node(xmlnode parent, xmlnode node); void xmlnode_insert_node(xmlnode parent, xmlnode node); xmlnode xmlnode_str(char *str, int len); xmlnode xmlnode_file(char *file); xmlnode xmlnode_dup(xmlnode x); /* duplicate x */ xmlnode xmlnode_dup_pool(pool p, xmlnode x); /* Node Memory Pool */ pool xmlnode_pool(xmlnode node); xmlnode _xmlnode_new(pool p, const char *name, unsigned int type); /* Node editing */ void xmlnode_hide(xmlnode child); void xmlnode_hide_attrib(xmlnode parent, const char *name); /* Node deletion routine, also frees the node pool! */ void xmlnode_free(xmlnode node); /* Locates a child tag by name and returns it */ xmlnode xmlnode_get_tag(xmlnode parent, const char* name); char* xmlnode_get_tag_data(xmlnode parent, const char* name); /* Attribute accessors */ void xmlnode_put_attrib(xmlnode owner, const char* name, const char* value); char* xmlnode_get_attrib(xmlnode owner, const char* name); void xmlnode_put_expat_attribs(xmlnode owner, const char** atts); /* Bastard am I, but these are fun for internal use ;-) */ void xmlnode_put_vattrib(xmlnode owner, const char* name, void *value); void* xmlnode_get_vattrib(xmlnode owner, const char* name); /* Node traversal routines */ xmlnode xmlnode_get_firstattrib(xmlnode parent); xmlnode xmlnode_get_firstchild(xmlnode parent); xmlnode xmlnode_get_lastchild(xmlnode parent); xmlnode xmlnode_get_nextsibling(xmlnode sibling); xmlnode xmlnode_get_prevsibling(xmlnode sibling); xmlnode xmlnode_get_parent(xmlnode node); /* Node information routines */ char* xmlnode_get_name(xmlnode node); char* xmlnode_get_data(xmlnode node); int xmlnode_get_datasz(xmlnode node); int xmlnode_get_type(xmlnode node); int xmlnode_has_children(xmlnode node); int xmlnode_has_attribs(xmlnode node); /* Node-to-string translation */ char* xmlnode2str(xmlnode node); /* Node-to-terminated-string translation -- useful for interfacing w/ scripting langs */ char* xmlnode2tstr(xmlnode node); int xmlnode_cmp(xmlnode a, xmlnode b); /* compares a and b for equality */ int xmlnode2file(char *file, xmlnode node); /* writes node to file */ /* Expat callbacks */ void expat_startElement(void* userdata, const char* name, const char** atts); void expat_endElement(void* userdata, const char* name); void expat_charData(void* userdata, const char* s, int len); /*********************** * XSTREAM Section ***********************/ #define XSTREAM_MAXNODE 1000000 #define XSTREAM_MAXDEPTH 100 #define XSTREAM_ROOT 0 /* root element */ #define XSTREAM_NODE 1 /* normal node */ #define XSTREAM_CLOSE 2 /* closed */ #define XSTREAM_ERR 4 /* parser error */ typedef void (*xstream_onNode)(int type, xmlnode x, void *arg); /* xstream event handler */ typedef struct xstream_struct { XML_Parser parser; xmlnode node; char *cdata; int cdata_len; pool p; xstream_onNode f; void *arg; int status; int depth; } *xstream, _xstream; xstream xstream_new(pool p, xstream_onNode f, void *arg); /* create a new xstream */ int xstream_eat(xstream xs, char *buff, int len); /* parse new data for this xstream, returns last XSTREAM_* status */ /* convience functions */ xmlnode xstream_header(char *nspace, char *to, char *from); char *xstream_header_char(xmlnode x); /* SHA.H */ /* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is SHA 180-1 Header File * * The Initial Developer of the Original Code is Paul Kocher of * Cryptography Research. Portions created by Paul Kocher are * Copyright (C) 1995-9 by Cryptography Research, Inc. All * Rights Reserved. * * Contributor(s): * * Paul Kocher * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. */ typedef struct { uint32_t H[5]; uint32_t W[80]; int lenW; uint32_t sizeHi,sizeLo; } SHA_CTX; void shaInit(SHA_CTX *ctx); void shaUpdate(SHA_CTX *ctx, unsigned char *dataIn, int len); void shaFinal(SHA_CTX *ctx, unsigned char hashout[20]); void shaBlock(unsigned char *dataIn, int len, unsigned char hashout[20]); /* END SHA.H */ #ifdef __cplusplus } #endif #endif /* INCL_LIBXODE_H */ centerim-4.22.10/libjabber/xmltok_impl.h0000644000175000001440000000343411461606612015036 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ enum { BT_NONXML, BT_MALFORM, BT_LT, BT_AMP, BT_RSQB, BT_LEAD2, BT_LEAD3, BT_LEAD4, BT_TRAIL, BT_CR, BT_LF, BT_GT, BT_QUOT, BT_APOS, BT_EQUALS, BT_QUEST, BT_EXCL, BT_SOL, BT_SEMI, BT_NUM, BT_LSQB, BT_S, BT_NMSTRT, BT_COLON, BT_HEX, BT_DIGIT, BT_NAME, BT_MINUS, BT_OTHER, /* known not to be a name or name start character */ BT_NONASCII, /* might be a name or name start character */ BT_PERCNT, BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, BT_COMMA, BT_VERBAR }; #include centerim-4.22.10/libjabber/log.h0000644000175000001440000000201211461606612013247 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #ifndef INCL_LOG_H #define INCL_LOG_H #define LOGSIZE_HDR 1024 #define LOGSIZE_TAIL 2048 #ifdef DEBUG void jdebug(char *zone, const char *msgfmt, ...); #else #define jdebug if(0) warn #endif #endif /* INCL_LOG_H */ centerim-4.22.10/libjabber/expat.c0000644000175000001440000000772511461606612013622 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include void expat_startElement(void* userdata, const char* name, const char** atts) { /* get the xmlnode pointed to by the userdata */ xmlnode *x = userdata; xmlnode current = *x; if (current == NULL) { /* allocate a base node */ current = xmlnode_new_tag(name); xmlnode_put_expat_attribs(current, atts); *x = current; } else { *x = xmlnode_insert_tag(current, name); xmlnode_put_expat_attribs(*x, atts); } } void expat_endElement(void* userdata, const char* name) { xmlnode *x = userdata; xmlnode current = *x; current->complete = 1; current = xmlnode_get_parent(current); /* if it's NULL we've hit the top folks, otherwise back up a level */ if(current != NULL) *x = current; } void expat_charData(void* userdata, const char* s, int len) { xmlnode *x = userdata; xmlnode current = *x; xmlnode_insert_cdata(current, s, len); } xmlnode xmlnode_str(char *str, int len) { XML_Parser p; xmlnode *x, node; /* pointer to an xmlnode */ if(NULL == str) return NULL; x = malloc(sizeof(void *)); *x = NULL; /* pointer to NULL */ p = XML_ParserCreate(NULL); XML_SetUserData(p, x); XML_SetElementHandler(p, expat_startElement, expat_endElement); XML_SetCharacterDataHandler(p, expat_charData); if(!XML_Parse(p, str, len, 1)) { /* jdebug(ZONE,"xmlnode_str_error: %s",(char *)XML_ErrorString(XML_GetErrorCode(p)));*/ xmlnode_free(*x); *x = NULL; } node = *x; free(x); XML_ParserFree(p); return node; /* return the xmlnode x points to */ } xmlnode xmlnode_file(char *file) { XML_Parser p; xmlnode *x, node; /* pointer to an xmlnode */ char buf[BUFSIZ]; int done, fd, len; if(NULL == file) return NULL; fd = open(file,O_RDONLY); if(fd < 0) return NULL; x = malloc(sizeof(void *)); *x = NULL; /* pointer to NULL */ p = XML_ParserCreate(NULL); XML_SetUserData(p, x); XML_SetElementHandler(p, expat_startElement, expat_endElement); XML_SetCharacterDataHandler(p, expat_charData); do{ len = read(fd, buf, BUFSIZ); done = len < BUFSIZ; if(!XML_Parse(p, buf, len, done)) { /* jdebug(ZONE,"xmlnode_file_parseerror: %s",(char *)XML_ErrorString(XML_GetErrorCode(p)));*/ xmlnode_free(*x); *x = NULL; done = 1; } }while(!done); node = *x; XML_ParserFree(p); free(x); close(fd); return node; /* return the xmlnode x points to */ } int xmlnode2file(char *file, xmlnode node) { char *doc; int fd, i; if(file == NULL || node == NULL) return -1; fd = open(file, O_CREAT | O_WRONLY | O_TRUNC, 0600); if(fd < 0) return -1; doc = xmlnode2str(node); i = write(fd,doc,strlen(doc)); if(i < 0) return -1; close(fd); return 1; } void xmlnode_put_expat_attribs(xmlnode owner, const char** atts) { int i = 0; if (atts == NULL) return; while (atts[i] != '\0') { xmlnode_put_attrib(owner, atts[i], atts[i+1]); i += 2; } } centerim-4.22.10/libjabber/str.c0000644000175000001440000001771711461606612013313 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include "libxode.h" char *j_strdup(const char *str) { if(str == NULL) return NULL; else return strdup(str); } char *j_strcat(char *dest, char *txt) { if(!txt) return(dest); while(*txt) *dest++ = *txt++; *dest = '\0'; return(dest); } int j_strcmp(const char *a, const char *b) { if(a == NULL || b == NULL) return -1; else return strcmp(a, b); } int j_strcasecmp(const char *a, const char *b) { if(a == NULL || b == NULL) return -1; else return strcasecmp(a, b); } int j_strncmp(const char *a, const char *b, int i) { if(a == NULL || b == NULL) return -1; else return strncmp(a, b, i); } int j_strncasecmp(const char *a, const char *b, int i) { if(a == NULL || b == NULL) return -1; else return strncasecmp(a, b, i); } int j_strlen(const char *a) { if(a == NULL) return 0; else return strlen(a); } int j_atoi(const char *a, int def) { if(a == NULL) return def; else return atoi(a); } spool spool_new(pool p) { spool s; s = pmalloc(p, sizeof(struct spool_struct)); s->p = p; s->len = 0; s->last = NULL; s->first = NULL; return s; } void spool_add(spool s, char *str) { struct spool_node *sn; int len; if(str == NULL) return; len = strlen(str); if(len == 0) return; sn = pmalloc(s->p, sizeof(struct spool_node)); sn->c = pstrdup(s->p, str); sn->next = NULL; s->len += len; if(s->last != NULL) s->last->next = sn; s->last = sn; if(s->first == NULL) s->first = sn; } void spooler(spool s, ...) { va_list ap; char *arg = NULL; if(s == NULL) return; va_start(ap, s); /* loop till we hit our end flag, the first arg */ while(1) { arg = va_arg(ap,char *); if((int)arg == (int)s) break; else spool_add(s, arg); } va_end(ap); } char *spool_print(spool s) { char *ret,*tmp; struct spool_node *next; if(s == NULL || s->len == 0 || s->first == NULL) return NULL; ret = pmalloc(s->p, s->len + 1); *ret = '\0'; next = s->first; tmp = ret; while(next != NULL) { tmp = j_strcat(tmp,next->c); next = next->next; } return ret; } /* convenience :) */ char *spools(pool p, ...) { va_list ap; spool s; char *arg = NULL; if(p == NULL) return NULL; s = spool_new(p); va_start(ap, p); /* loop till we hit our end flag, the first arg */ while(1) { arg = va_arg(ap,char *); if((int)arg == (int)p) break; else spool_add(s, arg); } va_end(ap); return spool_print(s); } char *strunescape(pool p, char *buf) { int i,j=0; char *temp; if (p == NULL || buf == NULL) return(NULL); if (strchr(buf,'&') == NULL) return(buf); temp = pmalloc(p,strlen(buf)+1); if (temp == NULL) return(NULL); for(i=0;i': newlen+=4; break; } } if(oldlen == newlen) return buf; temp = pmalloc(p,newlen+1); if (temp==NULL) return(NULL); for(i=j=0;i': memcpy(&temp[j],">",4); j += 4; break; default: temp[j++] = buf[i]; } } temp[j] = '\0'; return temp; } char *zonestr(char *file, int line) { static char buff[64]; int i; i = snprintf(buff,63,"%s:%d",file,line); buff[i] = '\0'; return buff; } void str_b64decode(char* str) { char *cur; int d, dlast, phase; unsigned char c; static int table[256] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 00-0F */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 10-1F */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, /* 20-2F */ 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, /* 30-3F */ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, /* 40-4F */ 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, /* 50-5F */ -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, /* 60-6F */ 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1, /* 70-7F */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 80-8F */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 90-9F */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* A0-AF */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* B0-BF */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* C0-CF */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* D0-DF */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* E0-EF */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 /* F0-FF */ }; phase = 0; for (cur = str; *cur != '\0'; ++cur ) { d = table[(int)*cur]; if(d != -1) { switch(phase) { case 0: ++phase; break; case 1: c = ((dlast << 2) | ((d & 0x30) >> 4)); *str++ = c; ++phase; break; case 2: c = (((dlast & 0xf) << 4) | ((d & 0x3c) >> 2)); *str++ = c; ++phase; break; case 3: c = (((dlast & 0x03 ) << 6) | d); *str++ = c; phase = 0; break; } dlast = d; } } *str = '\0'; } centerim-4.22.10/libjabber/nametab.h0000644000175000001440000001561211461606612014107 00000000000000static const unsigned namingBitmap[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, 0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, 0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, 0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, 0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, 0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, 0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, 0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, 0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, 0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, 0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, 0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, 0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, 0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, 0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, 0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, 0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, 0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, 0x40000000, 0xF580C900, 0x00000007, 0x02010800, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, 0x00000000, 0x00004C40, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, 0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, 0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, 0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, 0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, 0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, 0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, 0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, 0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, 0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, 0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, 0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, 0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, 0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, 0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, 0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, 0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, 0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, 0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, 0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, 0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, 0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, 0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, 0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, }; static const unsigned char nmstrtPages[] = { 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char namePages[] = { 0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, 0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, 0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; centerim-4.22.10/libjabber/xmldef.h0000644000175000001440000000375711461606612013766 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #include #ifdef XML_WINLIB #define WIN32_LEAN_AND_MEAN #define STRICT #include #define malloc(x) HeapAlloc(GetProcessHeap(), 0, (x)) #define calloc(x, y) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (x)*(y)) #define free(x) HeapFree(GetProcessHeap(), 0, (x)) #define realloc(x, y) HeapReAlloc(GetProcessHeap(), 0, x, y) #define abort() /* as nothing */ #else /* not XML_WINLIB */ #include #endif /* not XML_WINLIB */ /* This file can be used for any definitions needed in particular environments. */ #ifdef MOZILLA #include "nspr.h" #define malloc(x) PR_Malloc(x) #define realloc(x, y) PR_Realloc((x), (y)) #define calloc(x, y) PR_Calloc((x),(y)) #define free(x) PR_Free(x) #define int int32 #endif /* MOZILLA */ centerim-4.22.10/libjabber/xmltok.h0000644000175000001440000002501511461606612014014 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #ifndef XmlTok_INCLUDED #define XmlTok_INCLUDED 1 #ifdef __cplusplus extern "C" { #endif #ifndef XMLTOKAPI #define XMLTOKAPI /* as nothing */ #endif /* The following token may be returned by XmlContentTok */ #define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be start of illegal ]]> sequence */ /* The following tokens may be returned by both XmlPrologTok and XmlContentTok */ #define XML_TOK_NONE -4 /* The string to be scanned is empty */ #define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; might be part of CRLF sequence */ #define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ #define XML_TOK_PARTIAL -1 /* only part of a token */ #define XML_TOK_INVALID 0 /* The following tokens are returned by XmlContentTok; some are also returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok */ #define XML_TOK_START_TAG_WITH_ATTS 1 #define XML_TOK_START_TAG_NO_ATTS 2 #define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag */ #define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 #define XML_TOK_END_TAG 5 #define XML_TOK_DATA_CHARS 6 #define XML_TOK_DATA_NEWLINE 7 #define XML_TOK_CDATA_SECT_OPEN 8 #define XML_TOK_ENTITY_REF 9 #define XML_TOK_CHAR_REF 10 /* numeric character reference */ /* The following tokens may be returned by both XmlPrologTok and XmlContentTok */ #define XML_TOK_PI 11 /* processing instruction */ #define XML_TOK_XML_DECL 12 /* XML decl or text decl */ #define XML_TOK_COMMENT 13 #define XML_TOK_BOM 14 /* Byte order mark */ /* The following tokens are returned only by XmlPrologTok */ #define XML_TOK_PROLOG_S 15 #define XML_TOK_DECL_OPEN 16 /* */ #define XML_TOK_NAME 18 #define XML_TOK_NMTOKEN 19 #define XML_TOK_POUND_NAME 20 /* #name */ #define XML_TOK_OR 21 /* | */ #define XML_TOK_PERCENT 22 #define XML_TOK_OPEN_PAREN 23 #define XML_TOK_CLOSE_PAREN 24 #define XML_TOK_OPEN_BRACKET 25 #define XML_TOK_CLOSE_BRACKET 26 #define XML_TOK_LITERAL 27 #define XML_TOK_PARAM_ENTITY_REF 28 #define XML_TOK_INSTANCE_START 29 /* The following occur only in element type declarations */ #define XML_TOK_NAME_QUESTION 30 /* name? */ #define XML_TOK_NAME_ASTERISK 31 /* name* */ #define XML_TOK_NAME_PLUS 32 /* name+ */ #define XML_TOK_COND_SECT_OPEN 33 /* */ #define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ #define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ #define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ #define XML_TOK_COMMA 38 /* The following token is returned only by XmlAttributeValueTok */ #define XML_TOK_ATTRIBUTE_VALUE_S 39 /* The following token is returned only by XmlCdataSectionTok */ #define XML_TOK_CDATA_SECT_CLOSE 40 /* With namespace processing this is returned by XmlPrologTok for a name with a colon. */ #define XML_TOK_PREFIXED_NAME 41 #define XML_N_STATES 3 #define XML_PROLOG_STATE 0 #define XML_CONTENT_STATE 1 #define XML_CDATA_SECTION_STATE 2 #define XML_N_LITERAL_TYPES 2 #define XML_ATTRIBUTE_VALUE_LITERAL 0 #define XML_ENTITY_VALUE_LITERAL 1 /* The size of the buffer passed to XmlUtf8Encode must be at least this. */ #define XML_UTF8_ENCODE_MAX 4 /* The size of the buffer passed to XmlUtf16Encode must be at least this. */ #define XML_UTF16_ENCODE_MAX 2 typedef struct position { /* first line and first column are 0 not 1 */ unsigned long lineNumber; unsigned long columnNumber; } POSITION; typedef struct { const char *name; const char *valuePtr; const char *valueEnd; char normalized; } ATTRIBUTE; struct encoding; typedef struct encoding ENCODING; struct encoding { int (*scanners[XML_N_STATES])(const ENCODING *, const char *, const char *, const char **); int (*literalScanners[XML_N_LITERAL_TYPES])(const ENCODING *, const char *, const char *, const char **); int (*sameName)(const ENCODING *, const char *, const char *); int (*nameMatchesAscii)(const ENCODING *, const char *, const char *); int (*nameLength)(const ENCODING *, const char *); const char *(*skipS)(const ENCODING *, const char *); int (*getAtts)(const ENCODING *enc, const char *ptr, int attsMax, ATTRIBUTE *atts); int (*charRefNumber)(const ENCODING *enc, const char *ptr); int (*predefinedEntityName)(const ENCODING *, const char *, const char *); void (*updatePosition)(const ENCODING *, const char *ptr, const char *end, POSITION *); int (*isPublicId)(const ENCODING *enc, const char *ptr, const char *end, const char **badPtr); void (*utf8Convert)(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim); void (*utf16Convert)(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim); int minBytesPerChar; char isUtf8; char isUtf16; }; /* Scan the string starting at ptr until the end of the next complete token, but do not scan past eptr. Return an integer giving the type of token. Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. Return XML_TOK_PARTIAL when the string does not contain a complete token; nextTokPtr will not be set. Return XML_TOK_INVALID when the string does not start a valid token; nextTokPtr will be set to point to the character which made the token invalid. Otherwise the string starts with a valid token; nextTokPtr will be set to point to the character following the end of that token. Each data character counts as a single token, but adjacent data characters may be returned together. Similarly for characters in the prolog outside literals, comments and processing instructions. */ #define XmlTok(enc, state, ptr, end, nextTokPtr) \ (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) #define XmlPrologTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) #define XmlContentTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) #define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) /* This is used for performing a 2nd-level tokenization on the content of a literal that has already been returned by XmlTok. */ #define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) #define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) #define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) #define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) #define XmlNameMatchesAscii(enc, ptr1, ptr2) \ (((enc)->nameMatchesAscii)(enc, ptr1, ptr2)) #define XmlNameLength(enc, ptr) \ (((enc)->nameLength)(enc, ptr)) #define XmlSkipS(enc, ptr) \ (((enc)->skipS)(enc, ptr)) #define XmlGetAttributes(enc, ptr, attsMax, atts) \ (((enc)->getAtts)(enc, ptr, attsMax, atts)) #define XmlCharRefNumber(enc, ptr) \ (((enc)->charRefNumber)(enc, ptr)) #define XmlPredefinedEntityName(enc, ptr, end) \ (((enc)->predefinedEntityName)(enc, ptr, end)) #define XmlUpdatePosition(enc, ptr, end, pos) \ (((enc)->updatePosition)(enc, ptr, end, pos)) #define XmlIsPublicId(enc, ptr, end, badPtr) \ (((enc)->isPublicId)(enc, ptr, end, badPtr)) #define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) #define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) typedef struct { ENCODING initEnc; const ENCODING **encPtr; } INIT_ENCODING; int XMLTOKAPI XmlParseXmlDecl(int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingNamePtr, const ENCODING **namedEncodingPtr, int *standalonePtr); int XMLTOKAPI XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); const ENCODING XMLTOKAPI *XmlGetUtf8InternalEncoding(); const ENCODING XMLTOKAPI *XmlGetUtf16InternalEncoding(); int XMLTOKAPI XmlUtf8Encode(int charNumber, char *buf); int XMLTOKAPI XmlUtf16Encode(int charNumber, unsigned short *buf); int XMLTOKAPI XmlSizeOfUnknownEncoding(); ENCODING XMLTOKAPI * XmlInitUnknownEncoding(void *mem, int *table, int (*conv)(void *userData, const char *p), void *userData); int XMLTOKAPI XmlParseXmlDeclNS(int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingNamePtr, const ENCODING **namedEncodingPtr, int *standalonePtr); int XMLTOKAPI XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); const ENCODING XMLTOKAPI *XmlGetUtf8InternalEncodingNS(); const ENCODING XMLTOKAPI *XmlGetUtf16InternalEncodingNS(); ENCODING XMLTOKAPI * XmlInitUnknownEncodingNS(void *mem, int *table, int (*conv)(void *userData, const char *p), void *userData); #ifdef __cplusplus } #endif #endif /* not XmlTok_INCLUDED */ centerim-4.22.10/libjabber/iasciitab.h0000644000175000001440000000565211461606612014433 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ /* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ /* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, /* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, /* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, /* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, /* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, /* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, /* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, /* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, /* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, /* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, /* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, centerim-4.22.10/libjabber/socket.c0000644000175000001440000001245011461606612013760 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include "libxode.h" #include "connwrap.h" /* socket.c * * Simple wrapper to make socket creation easy. * type = NETSOCKET_SERVER is local listening socket * type = NETSOCKET_CLIENT is connection socket * type = NETSOCKET_UDP */ int make_netsocket(u_short port, char *host, int type, int ssl) { int s, flag = 1; struct sockaddr_in sa; struct in_addr *saddr; int socket_type; /* is this a UDP socket or a TCP socket? */ socket_type = (type == NETSOCKET_UDP)?SOCK_DGRAM:SOCK_STREAM; bzero((void *)&sa,sizeof(struct sockaddr_in)); if((s = socket(AF_INET,socket_type,0)) < 0) return(-1); if(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(flag)) < 0) return(-1); saddr = make_addr(host); if(saddr == NULL) return(-1); sa.sin_family = AF_INET; sa.sin_port = htons(port); if(type == NETSOCKET_SERVER) { /* bind to specific address if specified */ if(host != NULL) sa.sin_addr.s_addr = saddr->s_addr; if(bind(s,(struct sockaddr*)&sa,sizeof sa) < 0) { close(s); return(-1); } } if(type == NETSOCKET_CLIENT) { sa.sin_addr.s_addr = saddr->s_addr; if(cw_connect(s,(struct sockaddr*)&sa,sizeof sa,ssl) < 0) { close(s); return(-1); } } if(type == NETSOCKET_UDP) { /* bind to all addresses for now */ if(bind(s,(struct sockaddr*)&sa,sizeof sa) < 0) { close(s); return(-1); } /* specify default recipient for read/write */ sa.sin_addr.s_addr = saddr->s_addr; if(cw_connect(s,(struct sockaddr*)&sa,sizeof sa,ssl) < 0) { close(s); return(-1); } } return(s); } void change_socket_to_blocking(int s) /* make socket blocking */ { int val; val = fcntl(s, F_GETFL, 0); fcntl(s, F_SETFL, val & (~O_NONBLOCK)); } void change_socket_to_nonblocking(int s) /* make socket non-blocking */ { int val; val = fcntl(s, F_GETFL, 0); fcntl(s, F_SETFL, val | O_NONBLOCK); } /* socket.c * * Simple wrapper to make non-blocking client socket creation easy. * type = NETSOCKET_SERVER is local listening socket * type = NETSOCKET_CLIENT is connection socket * type = NETSOCKET_UDP */ int make_nb_netsocket(u_short port, char *host, int type, int ssl, int* state) { int s, flag = 1; struct sockaddr_in sa; struct in_addr *saddr; int socket_type; /* is this a UDP socket or a TCP socket? */ socket_type = (type == NETSOCKET_UDP)?SOCK_DGRAM:SOCK_STREAM; bzero((void *)&sa,sizeof(struct sockaddr_in)); if((s = socket(AF_INET,socket_type,0)) < 0) return(-1); if(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(flag)) < 0) return(-1); change_socket_to_nonblocking(s); saddr = make_addr(host); if(saddr == NULL) return(-1); sa.sin_family = AF_INET; sa.sin_port = htons(port); if(type == NETSOCKET_SERVER) { /* bind to specific address if specified */ if(host != NULL) sa.sin_addr.s_addr = saddr->s_addr; if(bind(s,(struct sockaddr*)&sa,sizeof sa) < 0) { close(s); return(-1); } } if(type == NETSOCKET_CLIENT) { int rc; sa.sin_addr.s_addr = saddr->s_addr; rc = cw_nb_connect(s,(struct sockaddr*)&sa,sizeof sa,ssl, state); if (rc == -1 ) { close(s); return(-1); } } if(type == NETSOCKET_UDP) { /* bind to all addresses for now */ if(bind(s,(struct sockaddr*)&sa,sizeof sa) < 0) { close(s); return(-1); } /* specify default recipient for read/write */ sa.sin_addr.s_addr = saddr->s_addr; if(cw_connect(s,(struct sockaddr*)&sa,sizeof sa,ssl) < 0) { close(s); return(-1); } } return(s); } struct in_addr *make_addr(char *host) { struct hostent *hp; static struct in_addr addr; char myname[MAXHOSTNAMELEN + 1]; if(host == NULL || strlen(host) == 0) { gethostname(myname,MAXHOSTNAMELEN); hp = gethostbyname(myname); if(hp != NULL) { return (struct in_addr *) *hp->h_addr_list; } }else{ addr.s_addr = inet_addr(host); if(addr.s_addr != -1) { return &addr; } hp = gethostbyname(host); if(hp != NULL) { return (struct in_addr *) *hp->h_addr_list; } } return NULL; } /* Sets a file descriptor to close on exec. "flag" is 1 to close on exec, 0 to * leave open across exec. * -- EJB 7/31/2000 */ int set_fd_close_on_exec(int fd, int flag) { int oldflags = fcntl(fd,F_GETFL); int newflags; if(flag) newflags = oldflags | FD_CLOEXEC; else newflags = oldflags & (~FD_CLOEXEC); if(newflags==oldflags) return 0; return fcntl(fd,F_SETFL,(long)newflags); } centerim-4.22.10/libjabber/jpacket.c0000644000175000001440000000700111461606612014105 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include "jabber.h" jpacket jpacket_new(xmlnode x) { jpacket p; if(x == NULL) return NULL; p = pmalloc(xmlnode_pool(x),sizeof(_jpacket)); p->x = x; return jpacket_reset(p); } jpacket jpacket_reset(jpacket p) { char *val; xmlnode x; x = p->x; memset(p,0,sizeof(_jpacket)); p->x = x; p->p = xmlnode_pool(x); if(strncmp(xmlnode_get_name(x),"message",7) == 0) { p->type = JPACKET_MESSAGE; }else if(strncmp(xmlnode_get_name(x),"presence",8) == 0) { p->type = JPACKET_PRESENCE; val = xmlnode_get_attrib(x, "type"); if(val == NULL) p->subtype = JPACKET__AVAILABLE; else if(strcmp(val,"unavailable") == 0) p->subtype = JPACKET__UNAVAILABLE; else if(strcmp(val,"probe") == 0) p->subtype = JPACKET__PROBE; else if(*val == 's' || *val == 'u') p->type = JPACKET_S10N; else if(strcmp(val,"available") == 0) { /* someone is using type='available' which is frowned upon */ xmlnode_hide_attrib(x,"type"); p->subtype = JPACKET__AVAILABLE; }else p->type = JPACKET_UNKNOWN; }else if(strncmp(xmlnode_get_name(x),"iq",2) == 0) { p->type = JPACKET_IQ; p->iq = xmlnode_get_tag(x,"?xmlns"); p->iqns = xmlnode_get_attrib(p->iq,"xmlns"); } /* set up the jids if any, flag packet as unknown if they are unparseable */ val = xmlnode_get_attrib(x,"to"); if(val != NULL) if((p->to = jid_new(p->p, val)) == NULL) p->type = JPACKET_UNKNOWN; val = xmlnode_get_attrib(x,"from"); if(val != NULL) if((p->from = jid_new(p->p, val)) == NULL) p->type = JPACKET_UNKNOWN; return p; } int jpacket_subtype(jpacket p) { char *type; int ret = p->subtype; if(ret != JPACKET__UNKNOWN) return ret; ret = JPACKET__NONE; /* default, when no type attrib is specified */ type = xmlnode_get_attrib(p->x, "type"); if(j_strcmp(type,"error") == 0) ret = JPACKET__ERROR; else switch(p->type) { case JPACKET_MESSAGE: if(j_strcmp(type,"chat") == 0) ret = JPACKET__CHAT; else if(j_strcmp(type,"groupchat") == 0) ret = JPACKET__GROUPCHAT; else if(j_strcmp(type,"headline") == 0) ret = JPACKET__HEADLINE; break; case JPACKET_S10N: if(j_strcmp(type,"subscribe") == 0) ret = JPACKET__SUBSCRIBE; else if(j_strcmp(type,"subscribed") == 0) ret = JPACKET__SUBSCRIBED; else if(j_strcmp(type,"unsubscribe") == 0) ret = JPACKET__UNSUBSCRIBE; else if(j_strcmp(type,"unsubscribed") == 0) ret = JPACKET__UNSUBSCRIBED; break; case JPACKET_IQ: if(j_strcmp(type,"get") == 0) ret = JPACKET__GET; else if(j_strcmp(type,"set") == 0) ret = JPACKET__SET; else if(j_strcmp(type,"result") == 0) ret = JPACKET__RESULT; break; } p->subtype = ret; return ret; } centerim-4.22.10/libjabber/genhash.c0000644000175000001440000003312511461606612014107 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include /***************************************************************************** * Internal type definitions */ typedef struct tagHNODE { struct tagHNODE *next; /* next node in list */ const void *key; /* key pointer */ void *value; /* value pointer */ } HNODE; #define SLAB_NUM_NODES 64 /* allocate this many nodes per slab */ typedef struct tagHSLAB { struct tagHSLAB *next; /* next slab pointer */ HNODE nodes[SLAB_NUM_NODES]; /* the actual nodes */ } HSLAB; #define HASH_NUM_BUCKETS 509 /* should be a prime number; see Knuth */ typedef struct tagHASHTABLE_INTERNAL { unsigned long sig1; /* first signature word */ KEYHASHFUNC hash; /* hash function */ KEYCOMPAREFUNC cmp; /* comparison function */ int count; /* table entry count */ int bcount; /* bucket count */ HNODE **buckets; /* the hash buckets */ unsigned long sig2; /* second signature word */ } HASHTABLE_INTERNAL; #define HASH_SIG1 0x68736148UL /* "Hash" */ #define HASH_SIG2 0x6F627245UL /* "Erbo" */ #define do_hash(tb,key) ((*((tb)->hash))(key) % ((tb)->bcount)) static HNODE *s_free_nodes = NULL; /* free nodes list */ static HSLAB *s_slabs = NULL; /* node slabs list */ /***************************************************************************** * Internal functions */ static HNODE *allocate_node( const void *key, /* key pointer for this node */ void *value) /* value pointer for this node */ /* allocate_node allocates a new hash node and fills it. Returns NULL if the node could not be allocated. */ { HNODE *rc; /* return from this function */ if (!s_free_nodes) { /* allocate a new slabful of nodes and chain them to make a new free list */ register int i; /* loop counter */ HSLAB *slab = (HSLAB *)malloc(sizeof(HSLAB)); if (!slab) return NULL; memset(slab,0,sizeof(HSLAB)); slab->next = s_slabs; for (i=0; i<(SLAB_NUM_NODES-1); i++) slab->nodes[i].next = &(slab->nodes[i+1]); s_free_nodes = &(slab->nodes[0]); s_slabs = slab; } /* end if */ /* grab a node off the fron of the free list and fill it */ rc = s_free_nodes; s_free_nodes = rc->next; rc->next = NULL; rc->key = key; rc->value = value; return rc; } /* end allocate_node */ static void free_node( HNODE *node) /* node to be freed */ /* free_node returns a hash node to the list. */ { /* zap the node contents to avoid problems later */ memset(node,0,sizeof(HNODE)); /* chain it onto the free list */ node->next = s_free_nodes; s_free_nodes = node; } /* end free_node */ static HNODE *find_node( HASHTABLE_INTERNAL *tab, /* pointer to hash table */ const void *key, /* key value to look up */ int bucket) /* bucket number (-1 to have function compute it) */ /* find_node walks a hash bucket to find a node whose key matches the named key value. Returns the node pointer, or NULL if it's not found. */ { register HNODE *p; /* search pointer/return from this function */ if (bucket<0) /* compute hash value if we don't know it already */ bucket = do_hash(tab,key); /* search through the bucket contents */ for (p=tab->buckets[bucket]; p; p=p->next) if ((*(tab->cmp))(key,p->key)==0) return p; /* found! */ return NULL; /* not found */ } /* end find_node */ static HASHTABLE_INTERNAL *handle2ptr( HASHTABLE tbl) /* hash table handle */ /* handle2ptr converts a hash table handle into a pointer and checks its signatures to make sure someone's not trying to pull a whizzer on this module. */ { register HASHTABLE_INTERNAL *rc = (HASHTABLE_INTERNAL *)tbl; if ((rc->sig1==HASH_SIG1) && (rc->sig2==HASH_SIG2)) return rc; /* signatures match */ else return NULL; /* yIkes! */ } /***************************************************************************** * External functions */ HASHTABLE ghash_create(int buckets, KEYHASHFUNC hash, KEYCOMPAREFUNC cmp) /* Description: Creates a new hash table. Input: Parameters: buckets - Number of buckets to allocate for the hash table; this value should be a prime number for maximum efficiency. hash - Key hash code function to use. cmp - Key comparison function to use. Output: Returns: NULL - Table could not be allocated. Other - Handle to the new hashtable. */ { HASHTABLE_INTERNAL *tab; /* new table structure */ char *allocated; if (!hash || !cmp) return NULL; /* bogus! */ if (buckets<=0) buckets = HASH_NUM_BUCKETS; /* allocate a hash table structure */ allocated = malloc(sizeof(HASHTABLE_INTERNAL) + (buckets * sizeof(HNODE *))); if (!allocated) return NULL; /* memory error */ /* fill the fields of the hash table */ tab = (HASHTABLE_INTERNAL *)allocated; allocated += sizeof(HASHTABLE_INTERNAL); memset(tab,0,sizeof(HASHTABLE_INTERNAL)); memset(allocated,0,buckets * sizeof(HNODE *)); tab->sig1 = HASH_SIG1; tab->hash = hash; tab->cmp = cmp; tab->bcount = buckets; tab->buckets = (HNODE **)allocated; tab->sig2 = HASH_SIG2; return (HASHTABLE)tab; /* Qa'pla! */ } /* end ghash_create */ void ghash_destroy(HASHTABLE tbl) /* Description: Destroys a hash table. Input: Parameters: tbl - Table to be destroyed. Output: Returns: Nothing. */ { HASHTABLE_INTERNAL *tab; /* new table structure */ int i; /* loop counter */ HNODE *p, *p2; /* temporary pointers */ if (!tbl) return; /* bogus! */ /* Convert the handle to a table pointer. */ tab = handle2ptr(tbl); if (!tab) return; /* Nuke the nodes it contains. */ for (i=0; ibcount; i++) { /* free the contents of each bucket */ p = tab->buckets[i]; while (p) { /* free each node in turn */ p2 = p->next; free_node(p); p = p2; } /* end while */ } /* end for */ free(tab); /* bye bye now! */ } /* end ghash_destroy */ void *ghash_get(HASHTABLE tbl, const void *key) /* Description: Retrieves a value stored in the hash table. Input: Parameters: tbl - The hash table to look in. key - The key value to search on. Output: Returns: NULL - Value not found. Other - Value corresponding to the specified key. */ { HASHTABLE_INTERNAL *tab; /* internal table pointer */ HNODE *node; /* hash node */ void *rc = NULL; /* return from this function */ if (!tbl || !key) return NULL; /* bogus! */ /* Convert the handle to a table pointer. */ tab = handle2ptr(tbl); if (!tab) return NULL; /* error */ /* Attempt to find the node. */ node = find_node(tab,key,-1); if (node) rc = node->value; /* found it! */ return rc; } /* end ghash_get */ int ghash_put(HASHTABLE tbl, const void *key, void *value) /* Description: Associates a key with a value in this hash table. Input: Parameters: tbl - Hash table to add. key - Key to use for the value in the table. value - Value to add for this key. Output: Returns: 1 - Success. 0 - Failure. Notes: If the specified key is already in the hashtable, its value will be replaced. */ { HASHTABLE_INTERNAL *tab; /* internal table pointer */ int bucket; /* bucket value goes into */ HNODE *node; /* hash node */ int rc = 1; /* return from this function */ if (!tbl || !key || !value) return 0; /* bogus! */ /* Convert the handle to a table pointer. */ tab = handle2ptr(tbl); if (!tab) return 0; /* error */ /* Compute the hash bucket and try to find an existing node. */ bucket = do_hash(tab,key); node = find_node(tab,key,bucket); if (!node) { /* OK, try to allocate a new node. */ node = allocate_node(key,value); if (node) { /* Chain the new node into the hash table. */ node->next = tab->buckets[bucket]; tab->buckets[bucket] = node; tab->count++; } /* end if */ else /* allocation error */ rc = 0; } /* end if */ else /* already in table - just reassign value */ node->value = value; return rc; } /* end ghash_put */ int ghash_remove(HASHTABLE tbl, const void *key) /* Description: Removes an entry from a hash table, given its key. Input: Parameters: tbl - Hash table to remove from. key - Key of value to remove. Output: Returns: 1 - Success. 0 - Failure; key not present in hash table. */ { HASHTABLE_INTERNAL *tab; /* internal table pointer */ int bucket; /* bucket value goes into */ HNODE *node; /* hash node */ register HNODE *p; /* removal pointer */ int rc = 1; /* return from this function */ if (!tbl || !key) return 0; /* bogus! */ /* Convert the handle to a table pointer. */ tab = handle2ptr(tbl); if (!tab) return 0; /* error */ /* Compute the hash bucket and try to find an existing node. */ bucket = do_hash(tab,key); node = find_node(tab,key,bucket); if (node) { /* look to unchain it from the bucket it's in */ if (node==tab->buckets[bucket]) tab->buckets[bucket] = node->next; /* unchain at head */ else { /* unchain in middle of list */ for (p=tab->buckets[bucket]; p->next!=node; p=p->next) ; p->next = node->next; } /* end else */ free_node(node); /* bye bye now! */ tab->count--; } /* end if */ else /* node not found */ rc = 0; return rc; } /* end ghash_remove */ int ghash_walk(HASHTABLE tbl, TABLEWALKFUNC func, void *user_data) /* Description: "Walks" through a hash table, calling a callback function for each element stored in it. Input: Parameters: tbl - Hash table to walk. func - Function to be called for each node. It takes three parameters, a user data pointer, a key value pointer, and a data value pointer. It returns 0 to stop the enumeration or 1 to keep it going. user_data - Value to use as the first parameter for the callback function. Output: Returns: 0 - Error occurred. Other - Number of nodes visited up to and including the one for which the callback function returned 0, if it did; ranges from 1 to the number of nodes in the hashtable. */ { HASHTABLE_INTERNAL *tab; /* internal table pointer */ int i; /* loop counter */ int running = 1; /* we're still running */ int count = 0; /* number of nodes visited before stop node */ register HNODE *p, *p2; /* loop pointer */ if (!tbl || !func) return -1; /* bogus values! */ /* Convert the handle to a table pointer. */ tab = handle2ptr(tbl); if (!tab) return -1; /* error */ for (i=0; running && (ibcount); i++) { /* visit the contents of each bucket */ p = tab->buckets[i]; while (running && p) { /* visit each node in turn */ p2 = p->next; count++; running = (*func)(user_data,p->key,p->value); p = p2; } /* end while */ } /* end for */ return count; } /* end ghash_walk */ int str_hash_code(const char *s) /* Description: Generates a hash code for a string. This function uses the ELF hashing algorithm as reprinted in Andrew Binstock, "Hashing Rehashed," _Dr. Dobb's Journal_, April 1996. Input: Parameters: s - The string to be hashed. Output: Returns: A hash code for the string. */ { /* ELF hash uses unsigned chars and unsigned arithmetic for portability */ const unsigned char *name = (const unsigned char *)s; unsigned long h = 0, g; if (!name) return 0; /* anti-NULL guard not in the original */ while (*name) { /* do some fancy bitwanking on the string */ h = (h << 4) + (unsigned long)(*name++); if ((g = (h & 0xF0000000UL))!=0) h ^= (g >> 24); h &= ~g; } /* end while */ return (int)h; } centerim-4.22.10/libjabber/xmlrole.h0000644000175000001440000000633511461606612014164 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #ifndef XmlRole_INCLUDED #define XmlRole_INCLUDED 1 #include "xmltok.h" #ifdef __cplusplus extern "C" { #endif enum { XML_ROLE_ERROR = -1, XML_ROLE_NONE = 0, XML_ROLE_XML_DECL, XML_ROLE_INSTANCE_START, XML_ROLE_DOCTYPE_NAME, XML_ROLE_DOCTYPE_SYSTEM_ID, XML_ROLE_DOCTYPE_PUBLIC_ID, XML_ROLE_DOCTYPE_CLOSE, XML_ROLE_GENERAL_ENTITY_NAME, XML_ROLE_PARAM_ENTITY_NAME, XML_ROLE_ENTITY_VALUE, XML_ROLE_ENTITY_SYSTEM_ID, XML_ROLE_ENTITY_PUBLIC_ID, XML_ROLE_ENTITY_NOTATION_NAME, XML_ROLE_NOTATION_NAME, XML_ROLE_NOTATION_SYSTEM_ID, XML_ROLE_NOTATION_NO_SYSTEM_ID, XML_ROLE_NOTATION_PUBLIC_ID, XML_ROLE_ATTRIBUTE_NAME, XML_ROLE_ATTRIBUTE_TYPE_CDATA, XML_ROLE_ATTRIBUTE_TYPE_ID, XML_ROLE_ATTRIBUTE_TYPE_IDREF, XML_ROLE_ATTRIBUTE_TYPE_IDREFS, XML_ROLE_ATTRIBUTE_TYPE_ENTITY, XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, XML_ROLE_ATTRIBUTE_ENUM_VALUE, XML_ROLE_ATTRIBUTE_NOTATION_VALUE, XML_ROLE_ATTLIST_ELEMENT_NAME, XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, XML_ROLE_FIXED_ATTRIBUTE_VALUE, XML_ROLE_ELEMENT_NAME, XML_ROLE_CONTENT_ANY, XML_ROLE_CONTENT_EMPTY, XML_ROLE_CONTENT_PCDATA, XML_ROLE_GROUP_OPEN, XML_ROLE_GROUP_CLOSE, XML_ROLE_GROUP_CLOSE_REP, XML_ROLE_GROUP_CLOSE_OPT, XML_ROLE_GROUP_CLOSE_PLUS, XML_ROLE_GROUP_CHOICE, XML_ROLE_GROUP_SEQUENCE, XML_ROLE_CONTENT_ELEMENT, XML_ROLE_CONTENT_ELEMENT_REP, XML_ROLE_CONTENT_ELEMENT_OPT, XML_ROLE_CONTENT_ELEMENT_PLUS, XML_ROLE_PARAM_ENTITY_REF }; typedef struct prolog_state { int (*handler)(struct prolog_state *state, int tok, const char *ptr, const char *end, const ENCODING *enc); unsigned level; } PROLOG_STATE; void XMLTOKAPI XmlPrologStateInit(PROLOG_STATE *); #define XmlTokenRole(state, tok, ptr, end, enc) \ (((state)->handler)(state, tok, ptr, end, enc)) #ifdef __cplusplus } #endif #endif /* not XmlRole_INCLUDED */ centerim-4.22.10/libjabber/xstream.c0000644000175000001440000001444111461606612014155 00000000000000/* * 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. * * Jabber * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */ #include /* xstream is a way to have a consistent method of handling incoming XML Stream based events... it doesn't handle the generation of an XML Stream, but provides some facilities to help do that */ /******* internal expat callbacks *********/ void _xstream_startElement(xstream xs, const char* name, const char** atts) { pool p; /* if xstream is bad, get outa here */ if(xs->status > XSTREAM_NODE) return; if(xs->node == NULL) { p = pool_heap(5*1024); /* 5k, typically 1-2k each plus copy of self and workspace */ xs->node = xmlnode_new_tag_pool(p,name); xmlnode_put_expat_attribs(xs->node, atts); if(xs->status == XSTREAM_ROOT) { xs->status = XSTREAM_NODE; /* flag status that we're processing nodes now */ (xs->f)(XSTREAM_ROOT, xs->node, xs->arg); /* send the root, f must free all nodes */ xs->node = NULL; } }else{ xs->node = xmlnode_insert_tag(xs->node, name); xmlnode_put_expat_attribs(xs->node, atts); } /* depth check */ xs->depth++; if(xs->depth > XSTREAM_MAXDEPTH) xs->status = XSTREAM_ERR; } void _xstream_endElement(xstream xs, const char* name) { xmlnode parent; /* if xstream is bad, get outa here */ if(xs->status > XSTREAM_NODE) return; /* if it's already NULL we've received , tell the app and we're outta here */ if(xs->node == NULL) { xs->status = XSTREAM_CLOSE; (xs->f)(XSTREAM_CLOSE, NULL, xs->arg); }else{ parent = xmlnode_get_parent(xs->node); /* we are the top-most node, feed to the app who is responsible to delete it */ if(parent == NULL) (xs->f)(XSTREAM_NODE, xs->node, xs->arg); xs->node = parent; } xs->depth--; } void _xstream_charData(xstream xs, const char *str, int len) { /* if xstream is bad, get outa here */ if(xs->status > XSTREAM_NODE) return; if(xs->node == NULL) { /* we must be in the root of the stream where CDATA is irrelevant */ return; } xmlnode_insert_cdata(xs->node, str, len); } void _xstream_cleanup(void *arg) { xstream xs = (xstream)arg; xmlnode_free(xs->node); /* cleanup anything left over */ XML_ParserFree(xs->parser); } /* creates a new xstream with given pool, xstream will be cleaned up w/ pool */ xstream xstream_new(pool p, xstream_onNode f, void *arg) { xstream newx; if(p == NULL || f == NULL) { fprintf(stderr,"Fatal Programming Error: xstream_new() was improperly called with NULL.\n"); return NULL; } newx = pmalloco(p, sizeof(_xstream)); newx->p = p; newx->f = f; newx->arg = arg; /* create expat parser and ensure cleanup */ newx->parser = XML_ParserCreate(NULL); XML_SetUserData(newx->parser, (void *)newx); XML_SetElementHandler(newx->parser, (void *)_xstream_startElement, (void *)_xstream_endElement); XML_SetCharacterDataHandler(newx->parser, (void *)_xstream_charData); pool_cleanup(p, _xstream_cleanup, (void *)newx); return newx; } /* attempts to parse the buff onto this stream firing events to the handler, returns the last known status */ int xstream_eat(xstream xs, char *buff, int len) { char *err; xmlnode xerr; static char maxerr[] = "maximum node size reached"; static char deeperr[] = "maximum node depth reached"; if(xs == NULL) { fprintf(stderr,"Fatal Programming Error: xstream_eat() was improperly called with NULL.\n"); return XSTREAM_ERR; } if(len == 0 || buff == NULL) return xs->status; if(len == -1) /* easy for hand-fed eat calls */ len = strlen(buff); if(!XML_Parse(xs->parser, buff, len, 0)) { err = (char *)XML_ErrorString(XML_GetErrorCode(xs->parser)); xs->status = XSTREAM_ERR; }else if(pool_size(xmlnode_pool(xs->node)) > XSTREAM_MAXNODE || xs->cdata_len > XSTREAM_MAXNODE){ err = maxerr; xs->status = XSTREAM_ERR; }else if(xs->status == XSTREAM_ERR){ /* set within expat handlers */ err = deeperr; } /* fire parsing error event, make a node containing the error string */ if(xs->status == XSTREAM_ERR) { xerr = xmlnode_new_tag("error"); xmlnode_insert_cdata(xerr,err,-1); (xs->f)(XSTREAM_ERR, xerr, xs->arg); } return xs->status; } /* STREAM CREATION UTILITIES */ /* give a standard template xmlnode to work from */ xmlnode xstream_header(char *namespace, char *to, char *from) { xmlnode x; char id[10]; sprintf(id,"%X",(int)time(NULL)); x = xmlnode_new_tag("stream:stream"); xmlnode_put_attrib(x, "xmlns:stream", "http://etherx.jabber.org/streams"); xmlnode_put_attrib(x, "id", id); if(namespace != NULL) xmlnode_put_attrib(x, "xmlns", namespace); if(to != NULL) xmlnode_put_attrib(x, "to", to); if(from != NULL) xmlnode_put_attrib(x, "from", from); return x; } /* trim the xmlnode to only the opening header :) [NO CHILDREN ALLOWED] */ char *xstream_header_char(xmlnode x) { spool s; char *fixr, *head; if(xmlnode_has_children(x)) { fprintf(stderr,"Fatal Programming Error: xstream_header_char() was sent a header with children!\n"); return NULL; } s = spool_new(xmlnode_pool(x)); spooler(s,"",xmlnode2str(x),s); head = spool_print(s); fixr = strstr(head,"/>"); if (fixr != NULL) { *fixr = '>'; ++fixr; *fixr = '\0'; } return head; } centerim-4.22.10/libjabber/xmlparse.c0000644000175000001440000033257211461606612014335 00000000000000/* The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998, 1999 James Clark. All Rights Reserved. Contributor(s): Alternatively, the contents of this file may be used under the terms of the GNU General Public License (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. */ #include "xmldef.h" #include "xmlparse.h" #ifdef XML_UNICODE #define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX #define XmlConvert XmlUtf16Convert #define XmlGetInternalEncoding XmlGetUtf16InternalEncoding #define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS #define XmlEncode XmlUtf16Encode #define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) typedef unsigned short ICHAR; #else #define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX #define XmlConvert XmlUtf8Convert #define XmlGetInternalEncoding XmlGetUtf8InternalEncoding #define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS #define XmlEncode XmlUtf8Encode #define MUST_CONVERT(enc, s) (!(enc)->isUtf8) typedef char ICHAR; #endif #ifndef XML_NS #define XmlInitEncodingNS XmlInitEncoding #define XmlInitUnknownEncodingNS XmlInitUnknownEncoding #undef XmlGetInternalEncodingNS #define XmlGetInternalEncodingNS XmlGetInternalEncoding #define XmlParseXmlDeclNS XmlParseXmlDecl #endif #ifdef XML_UNICODE_WCHAR_T #define XML_T(x) L ## x #else #define XML_T(x) x #endif /* Round up n to be a multiple of sz, where sz is a power of 2. */ #define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) #include "xmltok.h" #include "xmlrole.h" #include "hashtable.h" #define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ #define INIT_DATA_BUF_SIZE 1024 #define INIT_ATTS_SIZE 16 #define INIT_BLOCK_SIZE 1024 #define INIT_BUFFER_SIZE 1024 #define EXPAND_SPARE 24 typedef struct binding { struct prefix *prefix; struct binding *nextTagBinding; struct binding *prevPrefixBinding; const struct attribute_id *attId; XML_Char *uri; int uriLen; int uriAlloc; } BINDING; typedef struct prefix { const XML_Char *name; BINDING *binding; } PREFIX; typedef struct { const XML_Char *str; const XML_Char *localPart; int uriLen; } TAG_NAME; typedef struct tag { struct tag *parent; const char *rawName; int rawNameLength; TAG_NAME name; char *buf; char *bufEnd; BINDING *bindings; } TAG; typedef struct { const XML_Char *name; const XML_Char *textPtr; int textLen; const XML_Char *systemId; const XML_Char *base; const XML_Char *publicId; const XML_Char *notation; char open; } ENTITY; typedef struct block { struct block *next; int size; XML_Char s[1]; } BLOCK; typedef struct { BLOCK *blocks; BLOCK *freeBlocks; const XML_Char *end; XML_Char *ptr; XML_Char *start; } STRING_POOL; /* The XML_Char before the name is used to determine whether an attribute has been specified. */ typedef struct attribute_id { XML_Char *name; PREFIX *prefix; char maybeTokenized; char xmlns; } ATTRIBUTE_ID; typedef struct { const ATTRIBUTE_ID *id; char isCdata; const XML_Char *value; } DEFAULT_ATTRIBUTE; typedef struct { const XML_Char *name; PREFIX *prefix; int nDefaultAtts; int allocDefaultAtts; DEFAULT_ATTRIBUTE *defaultAtts; } ELEMENT_TYPE; typedef struct { HASH_TABLE generalEntities; HASH_TABLE elementTypes; HASH_TABLE attributeIds; HASH_TABLE prefixes; STRING_POOL pool; int complete; int standalone; const XML_Char *base; PREFIX defaultPrefix; } DTD; typedef struct open_internal_entity { const char *internalEventPtr; const char *internalEventEndPtr; struct open_internal_entity *next; ENTITY *entity; } OPEN_INTERNAL_ENTITY; typedef enum XML_Error Processor(XML_Parser parser, const char *start, const char *end, const char **endPtr); static Processor prologProcessor; static Processor prologInitProcessor; static Processor contentProcessor; static Processor cdataSectionProcessor; static Processor epilogProcessor; static Processor errorProcessor; static Processor externalEntityInitProcessor; static Processor externalEntityInitProcessor2; static Processor externalEntityInitProcessor3; static Processor externalEntityContentProcessor; static enum XML_Error handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); static enum XML_Error processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *, const char *); static enum XML_Error initializeEncoding(XML_Parser parser); static enum XML_Error doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, const char *start, const char *end, const char **endPtr); static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr); static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *, const char *s, TAG_NAME *tagNamePtr, BINDING **bindingsPtr); static int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, const XML_Char *uri, BINDING **bindingsPtr); static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, int isCdata, const XML_Char *dfltValue); static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, STRING_POOL *); static enum XML_Error appendAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, STRING_POOL *); static ATTRIBUTE_ID * getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); static enum XML_Error storeEntityValue(XML_Parser parser, const char *start, const char *end); static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static int reportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static void reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static const XML_Char *getContext(XML_Parser parser); static int setContext(XML_Parser parser, const XML_Char *context); static void normalizePublicId(XML_Char *s); static int dtdInit(DTD *); static void dtdDestroy(DTD *); static int dtdCopy(DTD *newDtd, const DTD *oldDtd); static void poolInit(STRING_POOL *); static void poolClear(STRING_POOL *); static void poolDestroy(STRING_POOL *); static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end); static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end); static int poolGrow(STRING_POOL *pool); static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s); static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); #define poolStart(pool) ((pool)->start) #define poolEnd(pool) ((pool)->ptr) #define poolLength(pool) ((pool)->ptr - (pool)->start) #define poolChop(pool) ((void)--(pool->ptr)) #define poolLastChar(pool) (((pool)->ptr)[-1]) #define poolDiscard(pool) ((pool)->ptr = (pool)->start) #define poolFinish(pool) ((pool)->start = (pool)->ptr) #define poolAppendChar(pool, c) \ (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ ? 0 \ : ((*((pool)->ptr)++ = c), 1)) typedef struct { /* The first member must be userData so that the XML_GetUserData macro works. */ void *m_userData; void *m_handlerArg; char *m_buffer; /* first character to be parsed */ const char *m_bufferPtr; /* past last character to be parsed */ char *m_bufferEnd; /* allocated end of buffer */ const char *m_bufferLim; long m_parseEndByteIndex; const char *m_parseEndPtr; XML_Char *m_dataBuf; XML_Char *m_dataBufEnd; XML_StartElementHandler m_startElementHandler; XML_EndElementHandler m_endElementHandler; XML_CharacterDataHandler m_characterDataHandler; XML_ProcessingInstructionHandler m_processingInstructionHandler; XML_CommentHandler m_commentHandler; XML_StartCdataSectionHandler m_startCdataSectionHandler; XML_EndCdataSectionHandler m_endCdataSectionHandler; XML_DefaultHandler m_defaultHandler; XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; XML_NotationDeclHandler m_notationDeclHandler; XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; XML_NotStandaloneHandler m_notStandaloneHandler; XML_ExternalEntityRefHandler m_externalEntityRefHandler; void *m_externalEntityRefHandlerArg; XML_UnknownEncodingHandler m_unknownEncodingHandler; const ENCODING *m_encoding; INIT_ENCODING m_initEncoding; const XML_Char *m_protocolEncodingName; int m_ns; void *m_unknownEncodingMem; void *m_unknownEncodingData; void *m_unknownEncodingHandlerData; void (*m_unknownEncodingRelease)(void *); PROLOG_STATE m_prologState; Processor *m_processor; enum XML_Error m_errorCode; const char *m_eventPtr; const char *m_eventEndPtr; const char *m_positionPtr; OPEN_INTERNAL_ENTITY *m_openInternalEntities; int m_defaultExpandInternalEntities; int m_tagLevel; ENTITY *m_declEntity; const XML_Char *m_declNotationName; const XML_Char *m_declNotationPublicId; ELEMENT_TYPE *m_declElementType; ATTRIBUTE_ID *m_declAttributeId; char m_declAttributeIsCdata; DTD m_dtd; TAG *m_tagStack; TAG *m_freeTagList; BINDING *m_inheritedBindings; BINDING *m_freeBindingList; int m_attsSize; int m_nSpecifiedAtts; ATTRIBUTE *m_atts; POSITION m_position; STRING_POOL m_tempPool; STRING_POOL m_temp2Pool; char *m_groupConnector; unsigned m_groupSize; int m_hadExternalDoctype; XML_Char m_namespaceSeparator; } Parser; #define userData (((Parser *)parser)->m_userData) #define handlerArg (((Parser *)parser)->m_handlerArg) #define startElementHandler (((Parser *)parser)->m_startElementHandler) #define endElementHandler (((Parser *)parser)->m_endElementHandler) #define characterDataHandler (((Parser *)parser)->m_characterDataHandler) #define processingInstructionHandler (((Parser *)parser)->m_processingInstructionHandler) #define commentHandler (((Parser *)parser)->m_commentHandler) #define startCdataSectionHandler (((Parser *)parser)->m_startCdataSectionHandler) #define endCdataSectionHandler (((Parser *)parser)->m_endCdataSectionHandler) #define defaultHandler (((Parser *)parser)->m_defaultHandler) #define unparsedEntityDeclHandler (((Parser *)parser)->m_unparsedEntityDeclHandler) #define notationDeclHandler (((Parser *)parser)->m_notationDeclHandler) #define startNamespaceDeclHandler (((Parser *)parser)->m_startNamespaceDeclHandler) #define endNamespaceDeclHandler (((Parser *)parser)->m_endNamespaceDeclHandler) #define notStandaloneHandler (((Parser *)parser)->m_notStandaloneHandler) #define externalEntityRefHandler (((Parser *)parser)->m_externalEntityRefHandler) #define externalEntityRefHandlerArg (((Parser *)parser)->m_externalEntityRefHandlerArg) #define unknownEncodingHandler (((Parser *)parser)->m_unknownEncodingHandler) #define encoding (((Parser *)parser)->m_encoding) #define initEncoding (((Parser *)parser)->m_initEncoding) #define unknownEncodingMem (((Parser *)parser)->m_unknownEncodingMem) #define unknownEncodingData (((Parser *)parser)->m_unknownEncodingData) #define unknownEncodingHandlerData \ (((Parser *)parser)->m_unknownEncodingHandlerData) #define unknownEncodingRelease (((Parser *)parser)->m_unknownEncodingRelease) #define protocolEncodingName (((Parser *)parser)->m_protocolEncodingName) #define ns (((Parser *)parser)->m_ns) #define prologState (((Parser *)parser)->m_prologState) #define processor (((Parser *)parser)->m_processor) #define errorCode (((Parser *)parser)->m_errorCode) #define eventPtr (((Parser *)parser)->m_eventPtr) #define eventEndPtr (((Parser *)parser)->m_eventEndPtr) #define positionPtr (((Parser *)parser)->m_positionPtr) #define position (((Parser *)parser)->m_position) #define openInternalEntities (((Parser *)parser)->m_openInternalEntities) #define defaultExpandInternalEntities (((Parser *)parser)->m_defaultExpandInternalEntities) #define tagLevel (((Parser *)parser)->m_tagLevel) #define buffer (((Parser *)parser)->m_buffer) #define bufferPtr (((Parser *)parser)->m_bufferPtr) #define bufferEnd (((Parser *)parser)->m_bufferEnd) #define parseEndByteIndex (((Parser *)parser)->m_parseEndByteIndex) #define parseEndPtr (((Parser *)parser)->m_parseEndPtr) #define bufferLim (((Parser *)parser)->m_bufferLim) #define dataBuf (((Parser *)parser)->m_dataBuf) #define dataBufEnd (((Parser *)parser)->m_dataBufEnd) #define dtd (((Parser *)parser)->m_dtd) #define declEntity (((Parser *)parser)->m_declEntity) #define declNotationName (((Parser *)parser)->m_declNotationName) #define declNotationPublicId (((Parser *)parser)->m_declNotationPublicId) #define declElementType (((Parser *)parser)->m_declElementType) #define declAttributeId (((Parser *)parser)->m_declAttributeId) #define declAttributeIsCdata (((Parser *)parser)->m_declAttributeIsCdata) #define freeTagList (((Parser *)parser)->m_freeTagList) #define freeBindingList (((Parser *)parser)->m_freeBindingList) #define inheritedBindings (((Parser *)parser)->m_inheritedBindings) #define tagStack (((Parser *)parser)->m_tagStack) #define atts (((Parser *)parser)->m_atts) #define attsSize (((Parser *)parser)->m_attsSize) #define nSpecifiedAtts (((Parser *)parser)->m_nSpecifiedAtts) #define tempPool (((Parser *)parser)->m_tempPool) #define temp2Pool (((Parser *)parser)->m_temp2Pool) #define groupConnector (((Parser *)parser)->m_groupConnector) #define groupSize (((Parser *)parser)->m_groupSize) #define hadExternalDoctype (((Parser *)parser)->m_hadExternalDoctype) #define namespaceSeparator (((Parser *)parser)->m_namespaceSeparator) #ifdef _MSC_VER #ifdef _DEBUG Parser *asParser(XML_Parser parser) { return parser; } #endif #endif XML_Parser XML_ParserCreate(const XML_Char *encodingName) { XML_Parser parser = malloc(sizeof(Parser)); if (!parser) return parser; processor = prologInitProcessor; XmlPrologStateInit(&prologState); userData = 0; handlerArg = 0; startElementHandler = 0; endElementHandler = 0; characterDataHandler = 0; processingInstructionHandler = 0; commentHandler = 0; startCdataSectionHandler = 0; endCdataSectionHandler = 0; defaultHandler = 0; unparsedEntityDeclHandler = 0; notationDeclHandler = 0; startNamespaceDeclHandler = 0; endNamespaceDeclHandler = 0; notStandaloneHandler = 0; externalEntityRefHandler = 0; externalEntityRefHandlerArg = parser; unknownEncodingHandler = 0; buffer = 0; bufferPtr = 0; bufferEnd = 0; parseEndByteIndex = 0; parseEndPtr = 0; bufferLim = 0; declElementType = 0; declAttributeId = 0; declEntity = 0; declNotationName = 0; declNotationPublicId = 0; memset(&position, 0, sizeof(POSITION)); errorCode = XML_ERROR_NONE; eventPtr = 0; eventEndPtr = 0; positionPtr = 0; openInternalEntities = 0; tagLevel = 0; tagStack = 0; freeTagList = 0; freeBindingList = 0; inheritedBindings = 0; attsSize = INIT_ATTS_SIZE; atts = malloc(attsSize * sizeof(ATTRIBUTE)); nSpecifiedAtts = 0; dataBuf = malloc(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); groupSize = 0; groupConnector = 0; hadExternalDoctype = 0; unknownEncodingMem = 0; unknownEncodingRelease = 0; unknownEncodingData = 0; unknownEncodingHandlerData = 0; namespaceSeparator = '!'; ns = 0; poolInit(&tempPool); poolInit(&temp2Pool); protocolEncodingName = encodingName ? poolCopyString(&tempPool, encodingName) : 0; if (!dtdInit(&dtd) || !atts || !dataBuf || (encodingName && !protocolEncodingName)) { XML_ParserFree(parser); return 0; } dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; XmlInitEncoding(&initEncoding, &encoding, 0); return parser; } XML_Parser XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) { static const XML_Char implicitContext[] = { XML_T('x'), XML_T('m'), XML_T('l'), XML_T('='), XML_T('h'), XML_T('t'), XML_T('t'), XML_T('p'), XML_T(':'), XML_T('/'), XML_T('/'), XML_T('w'), XML_T('w'), XML_T('w'), XML_T('.'), XML_T('w'), XML_T('3'), XML_T('.'), XML_T('o'), XML_T('r'), XML_T('g'), XML_T('/'), XML_T('X'), XML_T('M'), XML_T('L'), XML_T('/'), XML_T('1'), XML_T('9'), XML_T('9'), XML_T('8'), XML_T('/'), XML_T('n'), XML_T('a'), XML_T('m'), XML_T('e'), XML_T('s'), XML_T('p'), XML_T('a'), XML_T('c'), XML_T('e'), XML_T('\0') }; XML_Parser parser = XML_ParserCreate(encodingName); if (parser) { XmlInitEncodingNS(&initEncoding, &encoding, 0); ns = 1; namespaceSeparator = nsSep; } if (!setContext(parser, implicitContext)) { XML_ParserFree(parser); return 0; } return parser; } int XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) { if (!encodingName) protocolEncodingName = 0; else { protocolEncodingName = poolCopyString(&tempPool, encodingName); if (!protocolEncodingName) return 0; } return 1; } XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context, const XML_Char *encodingName) { XML_Parser parser = oldParser; DTD *oldDtd = &dtd; XML_StartElementHandler oldStartElementHandler = startElementHandler; XML_EndElementHandler oldEndElementHandler = endElementHandler; XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; XML_ProcessingInstructionHandler oldProcessingInstructionHandler = processingInstructionHandler; XML_CommentHandler oldCommentHandler = commentHandler; XML_StartCdataSectionHandler oldStartCdataSectionHandler = startCdataSectionHandler; XML_EndCdataSectionHandler oldEndCdataSectionHandler = endCdataSectionHandler; XML_DefaultHandler oldDefaultHandler = defaultHandler; XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler = startNamespaceDeclHandler; XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler = endNamespaceDeclHandler; XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; XML_ExternalEntityRefHandler oldExternalEntityRefHandler = externalEntityRefHandler; XML_UnknownEncodingHandler oldUnknownEncodingHandler = unknownEncodingHandler; void *oldUserData = userData; void *oldHandlerArg = handlerArg; int oldDefaultExpandInternalEntities = defaultExpandInternalEntities; void *oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; parser = (ns ? XML_ParserCreateNS(encodingName, namespaceSeparator) : XML_ParserCreate(encodingName)); if (!parser) return 0; startElementHandler = oldStartElementHandler; endElementHandler = oldEndElementHandler; characterDataHandler = oldCharacterDataHandler; processingInstructionHandler = oldProcessingInstructionHandler; commentHandler = oldCommentHandler; startCdataSectionHandler = oldStartCdataSectionHandler; endCdataSectionHandler = oldEndCdataSectionHandler; defaultHandler = oldDefaultHandler; startNamespaceDeclHandler = oldStartNamespaceDeclHandler; endNamespaceDeclHandler = oldEndNamespaceDeclHandler; notStandaloneHandler = oldNotStandaloneHandler; externalEntityRefHandler = oldExternalEntityRefHandler; unknownEncodingHandler = oldUnknownEncodingHandler; userData = oldUserData; if (oldUserData == oldHandlerArg) handlerArg = userData; else handlerArg = parser; if (oldExternalEntityRefHandlerArg != oldParser) externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; defaultExpandInternalEntities = oldDefaultExpandInternalEntities; if (!dtdCopy(&dtd, oldDtd) || !setContext(parser, context)) { XML_ParserFree(parser); return 0; } processor = externalEntityInitProcessor; return parser; } static void destroyBindings(BINDING *bindings) { for (;;) { BINDING *b = bindings; if (!b) break; bindings = b->nextTagBinding; free(b->uri); free(b); } } void XML_ParserFree(XML_Parser parser) { for (;;) { TAG *p; if (tagStack == 0) { if (freeTagList == 0) break; tagStack = freeTagList; freeTagList = 0; } p = tagStack; tagStack = tagStack->parent; free(p->buf); destroyBindings(p->bindings); free(p); } destroyBindings(freeBindingList); destroyBindings(inheritedBindings); poolDestroy(&tempPool); poolDestroy(&temp2Pool); dtdDestroy(&dtd); free((void *)atts); free(groupConnector); free(buffer); free(dataBuf); free(unknownEncodingMem); if (unknownEncodingRelease) unknownEncodingRelease(unknownEncodingData); free(parser); } void XML_UseParserAsHandlerArg(XML_Parser parser) { handlerArg = parser; } void XML_SetUserData(XML_Parser parser, void *p) { if (handlerArg == userData) handlerArg = userData = p; else userData = p; } int XML_SetBase(XML_Parser parser, const XML_Char *p) { if (p) { p = poolCopyString(&dtd.pool, p); if (!p) return 0; dtd.base = p; } else dtd.base = 0; return 1; } const XML_Char *XML_GetBase(XML_Parser parser) { return dtd.base; } int XML_GetSpecifiedAttributeCount(XML_Parser parser) { return nSpecifiedAtts; } void XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end) { startElementHandler = start; endElementHandler = end; } void XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler) { characterDataHandler = handler; } void XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler) { processingInstructionHandler = handler; } void XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler) { commentHandler = handler; } void XML_SetCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start, XML_EndCdataSectionHandler end) { startCdataSectionHandler = start; endCdataSectionHandler = end; } void XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler) { defaultHandler = handler; defaultExpandInternalEntities = 0; } void XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler) { defaultHandler = handler; defaultExpandInternalEntities = 1; } void XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler) { unparsedEntityDeclHandler = handler; } void XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler) { notationDeclHandler = handler; } void XML_SetNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end) { startNamespaceDeclHandler = start; endNamespaceDeclHandler = end; } void XML_SetNotStandaloneHandler(XML_Parser parser, XML_NotStandaloneHandler handler) { notStandaloneHandler = handler; } void XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler handler) { externalEntityRefHandler = handler; } void XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) { if (arg) externalEntityRefHandlerArg = arg; else externalEntityRefHandlerArg = parser; } void XML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *data) { unknownEncodingHandler = handler; unknownEncodingHandlerData = data; } int XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) { if (len == 0) { if (!isFinal) return 1; positionPtr = bufferPtr; errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0); if (errorCode == XML_ERROR_NONE) return 1; eventEndPtr = eventPtr; return 0; } else if (bufferPtr == bufferEnd) { const char *end; int nLeftOver; parseEndByteIndex += len; positionPtr = s; if (isFinal) { errorCode = processor(parser, s, parseEndPtr = s + len, 0); if (errorCode == XML_ERROR_NONE) return 1; eventEndPtr = eventPtr; return 0; } errorCode = processor(parser, s, parseEndPtr = s + len, &end); if (errorCode != XML_ERROR_NONE) { eventEndPtr = eventPtr; return 0; } XmlUpdatePosition(encoding, positionPtr, end, &position); nLeftOver = s + len - end; if (nLeftOver) { if (buffer == 0 || nLeftOver > bufferLim - buffer) { /* FIXME avoid integer overflow */ buffer = buffer == 0 ? malloc(len * 2) : realloc(buffer, len * 2); if (!buffer) { errorCode = XML_ERROR_NO_MEMORY; eventPtr = eventEndPtr = 0; return 0; } bufferLim = buffer + len * 2; } memcpy(buffer, end, nLeftOver); bufferPtr = buffer; bufferEnd = buffer + nLeftOver; } return 1; } else { memcpy(XML_GetBuffer(parser, len), s, len); return XML_ParseBuffer(parser, len, isFinal); } } int XML_ParseBuffer(XML_Parser parser, int len, int isFinal) { const char *start = bufferPtr; positionPtr = start; bufferEnd += len; parseEndByteIndex += len; errorCode = processor(parser, start, parseEndPtr = bufferEnd, isFinal ? (const char **)0 : &bufferPtr); if (errorCode == XML_ERROR_NONE) { if (!isFinal) XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); return 1; } else { eventEndPtr = eventPtr; return 0; } } void *XML_GetBuffer(XML_Parser parser, int len) { if (len > bufferLim - bufferEnd) { /* FIXME avoid integer overflow */ int neededSize = len + (bufferEnd - bufferPtr); if (neededSize <= bufferLim - buffer) { memmove(buffer, bufferPtr, bufferEnd - bufferPtr); bufferEnd = buffer + (bufferEnd - bufferPtr); bufferPtr = buffer; } else { char *newBuf; int bufferSize = bufferLim - bufferPtr; if (bufferSize == 0) bufferSize = INIT_BUFFER_SIZE; do { bufferSize *= 2; } while (bufferSize < neededSize); newBuf = malloc(bufferSize); if (newBuf == 0) { errorCode = XML_ERROR_NO_MEMORY; return 0; } bufferLim = newBuf + bufferSize; if (bufferPtr) { memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); free(buffer); } bufferEnd = newBuf + (bufferEnd - bufferPtr); bufferPtr = buffer = newBuf; } } return bufferEnd; } enum XML_Error XML_GetErrorCode(XML_Parser parser) { return errorCode; } long XML_GetCurrentByteIndex(XML_Parser parser) { if (eventPtr) return parseEndByteIndex - (parseEndPtr - eventPtr); return -1; } int XML_GetCurrentByteCount(XML_Parser parser) { if (eventEndPtr && eventPtr) return eventEndPtr - eventPtr; return 0; } int XML_GetCurrentLineNumber(XML_Parser parser) { if (eventPtr) { XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); positionPtr = eventPtr; } return position.lineNumber + 1; } int XML_GetCurrentColumnNumber(XML_Parser parser) { if (eventPtr) { XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); positionPtr = eventPtr; } return position.columnNumber; } void XML_DefaultCurrent(XML_Parser parser) { if (defaultHandler) { if (openInternalEntities) reportDefault(parser, ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(), openInternalEntities->internalEventPtr, openInternalEntities->internalEventEndPtr); else reportDefault(parser, encoding, eventPtr, eventEndPtr); } } const XML_LChar *XML_ErrorString(int code) { static const XML_LChar *message[] = { 0, XML_T("out of memory"), XML_T("syntax error"), XML_T("no element found"), XML_T("not well-formed"), XML_T("unclosed token"), XML_T("unclosed token"), XML_T("mismatched tag"), XML_T("duplicate attribute"), XML_T("junk after document element"), XML_T("illegal parameter entity reference"), XML_T("undefined entity"), XML_T("recursive entity reference"), XML_T("asynchronous entity"), XML_T("reference to invalid character number"), XML_T("reference to binary entity"), XML_T("reference to external entity in attribute"), XML_T("xml processing instruction not at start of external entity"), XML_T("unknown encoding"), XML_T("encoding specified in XML declaration is incorrect"), XML_T("unclosed CDATA section"), XML_T("error in processing external entity reference"), XML_T("document is not standalone") }; if (code > 0 && code < sizeof(message)/sizeof(message[0])) return message[code]; return 0; } static enum XML_Error contentProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { return doContent(parser, 0, encoding, start, end, endPtr); } static enum XML_Error externalEntityInitProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { enum XML_Error result = initializeEncoding(parser); if (result != XML_ERROR_NONE) return result; processor = externalEntityInitProcessor2; return externalEntityInitProcessor2(parser, start, end, endPtr); } static enum XML_Error externalEntityInitProcessor2(XML_Parser parser, const char *start, const char *end, const char **endPtr) { const char *next; int tok = XmlContentTok(encoding, start, end, &next); switch (tok) { case XML_TOK_BOM: start = next; break; case XML_TOK_PARTIAL: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_PARTIAL_CHAR; } processor = externalEntityInitProcessor3; return externalEntityInitProcessor3(parser, start, end, endPtr); } static enum XML_Error externalEntityInitProcessor3(XML_Parser parser, const char *start, const char *end, const char **endPtr) { const char *next; int tok = XmlContentTok(encoding, start, end, &next); switch (tok) { case XML_TOK_XML_DECL: { enum XML_Error result = processXmlDecl(parser, 1, start, next); if (result != XML_ERROR_NONE) return result; start = next; } break; case XML_TOK_PARTIAL: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_PARTIAL_CHAR; } processor = externalEntityContentProcessor; tagLevel = 1; return doContent(parser, 1, encoding, start, end, endPtr); } static enum XML_Error externalEntityContentProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { return doContent(parser, 1, encoding, start, end, endPtr); } static enum XML_Error doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, const char *s, const char *end, const char **nextPtr) { const ENCODING *internalEnc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(); const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; eventEndPP = &eventEndPtr; } else { eventPP = &(openInternalEntities->internalEventPtr); eventEndPP = &(openInternalEntities->internalEventEndPtr); } *eventPP = s; for (;;) { const char *next = s; /* XmlContentTok doesn't always set the last arg */ int tok = XmlContentTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { case XML_TOK_TRAILING_CR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } *eventEndPP = end; if (characterDataHandler) { XML_Char c = 0xA; characterDataHandler(handlerArg, &c, 1); } else if (defaultHandler) reportDefault(parser, enc, s, end); if (startTagLevel == 0) return XML_ERROR_NO_ELEMENTS; if (tagLevel != startTagLevel) return XML_ERROR_ASYNC_ENTITY; return XML_ERROR_NONE; case XML_TOK_NONE: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } if (startTagLevel > 0) { if (tagLevel != startTagLevel) return XML_ERROR_ASYNC_ENTITY; return XML_ERROR_NONE; } return XML_ERROR_NO_ELEMENTS; case XML_TOK_INVALID: *eventPP = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; case XML_TOK_ENTITY_REF: { const XML_Char *name; ENTITY *entity; XML_Char ch = XmlPredefinedEntityName(enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (ch) { if (characterDataHandler) characterDataHandler(handlerArg, &ch, 1); else if (defaultHandler) reportDefault(parser, enc, s, next); break; } name = poolStoreString(&dtd.pool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!name) return XML_ERROR_NO_MEMORY; entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0); poolDiscard(&dtd.pool); if (!entity) { if (dtd.complete || dtd.standalone) return XML_ERROR_UNDEFINED_ENTITY; if (defaultHandler) reportDefault(parser, enc, s, next); break; } if (entity->open) return XML_ERROR_RECURSIVE_ENTITY_REF; if (entity->notation) return XML_ERROR_BINARY_ENTITY_REF; if (entity) { if (entity->textPtr) { enum XML_Error result; OPEN_INTERNAL_ENTITY openEntity; if (defaultHandler && !defaultExpandInternalEntities) { reportDefault(parser, enc, s, next); break; } entity->open = 1; openEntity.next = openInternalEntities; openInternalEntities = &openEntity; openEntity.entity = entity; openEntity.internalEventPtr = 0; openEntity.internalEventEndPtr = 0; result = doContent(parser, tagLevel, internalEnc, (char *)entity->textPtr, (char *)(entity->textPtr + entity->textLen), 0); entity->open = 0; openInternalEntities = openEntity.next; if (result) return result; } else if (externalEntityRefHandler) { const XML_Char *context; entity->open = 1; context = getContext(parser); entity->open = 0; if (!context) return XML_ERROR_NO_MEMORY; if (!externalEntityRefHandler(externalEntityRefHandlerArg, context, dtd.base, entity->systemId, entity->publicId)) return XML_ERROR_EXTERNAL_ENTITY_HANDLING; poolDiscard(&tempPool); } else if (defaultHandler) reportDefault(parser, enc, s, next); } break; } case XML_TOK_START_TAG_WITH_ATTS: if (!startElementHandler) { enum XML_Error result = storeAtts(parser, enc, s, 0, 0); if (result) return result; } /* fall through */ case XML_TOK_START_TAG_NO_ATTS: { TAG *tag; if (freeTagList) { tag = freeTagList; freeTagList = freeTagList->parent; } else { tag = malloc(sizeof(TAG)); if (!tag) return XML_ERROR_NO_MEMORY; tag->buf = malloc(INIT_TAG_BUF_SIZE); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; } tag->bindings = 0; tag->parent = tagStack; tagStack = tag; tag->name.localPart = 0; tag->rawName = s + enc->minBytesPerChar; tag->rawNameLength = XmlNameLength(enc, tag->rawName); if (nextPtr) { /* Need to guarantee that: tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)) <= tag->bufEnd - sizeof(XML_Char) */ if (tag->rawNameLength + (int)(sizeof(XML_Char) - 1) + (int)sizeof(XML_Char) > tag->bufEnd - tag->buf) { int bufSize = tag->rawNameLength * 4; bufSize = ROUND_UP(bufSize, sizeof(XML_Char)); tag->buf = realloc(tag->buf, bufSize); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + bufSize; } memcpy(tag->buf, tag->rawName, tag->rawNameLength); tag->rawName = tag->buf; } ++tagLevel; if (startElementHandler) { enum XML_Error result; XML_Char *toPtr; for (;;) { const char *rawNameEnd = tag->rawName + tag->rawNameLength; const char *fromPtr = tag->rawName; int bufSize; if (nextPtr) toPtr = (XML_Char *)(tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char))); else toPtr = (XML_Char *)tag->buf; tag->name.str = toPtr; XmlConvert(enc, &fromPtr, rawNameEnd, (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); if (fromPtr == rawNameEnd) break; bufSize = (tag->bufEnd - tag->buf) << 1; tag->buf = realloc(tag->buf, bufSize); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + bufSize; if (nextPtr) tag->rawName = tag->buf; } *toPtr = XML_T('\0'); result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); if (result) return result; startElementHandler(handlerArg, tag->name.str, (const XML_Char **)atts); poolClear(&tempPool); } else { tag->name.str = 0; if (defaultHandler) reportDefault(parser, enc, s, next); } break; } case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: if (!startElementHandler) { enum XML_Error result = storeAtts(parser, enc, s, 0, 0); if (result) return result; } /* fall through */ case XML_TOK_EMPTY_ELEMENT_NO_ATTS: if (startElementHandler || endElementHandler) { const char *rawName = s + enc->minBytesPerChar; enum XML_Error result; BINDING *bindings = 0; TAG_NAME name; name.str = poolStoreString(&tempPool, enc, rawName, rawName + XmlNameLength(enc, rawName)); if (!name.str) return XML_ERROR_NO_MEMORY; poolFinish(&tempPool); result = storeAtts(parser, enc, s, &name, &bindings); if (result) return result; poolFinish(&tempPool); if (startElementHandler) startElementHandler(handlerArg, name.str, (const XML_Char **)atts); if (endElementHandler) { if (startElementHandler) *eventPP = *eventEndPP; endElementHandler(handlerArg, name.str); } poolClear(&tempPool); while (bindings) { BINDING *b = bindings; if (endNamespaceDeclHandler) endNamespaceDeclHandler(handlerArg, b->prefix->name); bindings = bindings->nextTagBinding; b->nextTagBinding = freeBindingList; freeBindingList = b; b->prefix->binding = b->prevPrefixBinding; } } else if (defaultHandler) reportDefault(parser, enc, s, next); if (tagLevel == 0) return epilogProcessor(parser, next, end, nextPtr); break; case XML_TOK_END_TAG: if (tagLevel == startTagLevel) return XML_ERROR_ASYNC_ENTITY; else { int len; const char *rawName; TAG *tag = tagStack; tagStack = tag->parent; tag->parent = freeTagList; freeTagList = tag; rawName = s + enc->minBytesPerChar*2; len = XmlNameLength(enc, rawName); if (len != tag->rawNameLength || memcmp(tag->rawName, rawName, len) != 0) { *eventPP = rawName; return XML_ERROR_TAG_MISMATCH; } --tagLevel; if (endElementHandler && tag->name.str) { if (tag->name.localPart) { XML_Char *to = (XML_Char *)tag->name.str + tag->name.uriLen; const XML_Char *from = tag->name.localPart; while ((*to++ = *from++) != 0) ; } endElementHandler(handlerArg, tag->name.str); } else if (defaultHandler) reportDefault(parser, enc, s, next); while (tag->bindings) { BINDING *b = tag->bindings; if (endNamespaceDeclHandler) endNamespaceDeclHandler(handlerArg, b->prefix->name); tag->bindings = tag->bindings->nextTagBinding; b->nextTagBinding = freeBindingList; freeBindingList = b; b->prefix->binding = b->prevPrefixBinding; } if (tagLevel == 0) return epilogProcessor(parser, next, end, nextPtr); } break; case XML_TOK_CHAR_REF: { int n = XmlCharRefNumber(enc, s); if (n < 0) return XML_ERROR_BAD_CHAR_REF; if (characterDataHandler) { XML_Char buf[XML_ENCODE_MAX]; characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); } else if (defaultHandler) reportDefault(parser, enc, s, next); } break; case XML_TOK_XML_DECL: return XML_ERROR_MISPLACED_XML_PI; case XML_TOK_DATA_NEWLINE: if (characterDataHandler) { XML_Char c = 0xA; characterDataHandler(handlerArg, &c, 1); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_CDATA_SECT_OPEN: { enum XML_Error result; if (startCdataSectionHandler) startCdataSectionHandler(handlerArg); #if 0 /* Suppose you doing a transformation on a document that involves changing only the character data. You set up a defaultHandler and a characterDataHandler. The defaultHandler simply copies characters through. The characterDataHandler does the transformation and writes the characters out escaping them as necessary. This case will fail to work if we leave out the following two lines (because & and < inside CDATA sections will be incorrectly escaped). However, now we have a start/endCdataSectionHandler, so it seems easier to let the user deal with this. */ else if (characterDataHandler) characterDataHandler(handlerArg, dataBuf, 0); #endif else if (defaultHandler) reportDefault(parser, enc, s, next); result = doCdataSection(parser, enc, &next, end, nextPtr); if (!next) { processor = cdataSectionProcessor; return result; } } break; case XML_TOK_TRAILING_RSQB: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } if (characterDataHandler) { if (MUST_CONVERT(enc, s)) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); } else characterDataHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); } else if (defaultHandler) reportDefault(parser, enc, s, end); if (startTagLevel == 0) { *eventPP = end; return XML_ERROR_NO_ELEMENTS; } if (tagLevel != startTagLevel) { *eventPP = end; return XML_ERROR_ASYNC_ENTITY; } return XML_ERROR_NONE; case XML_TOK_DATA_CHARS: if (characterDataHandler) { if (MUST_CONVERT(enc, s)) { for (;;) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); *eventEndPP = s; characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); if (s == next) break; *eventPP = s; } } else characterDataHandler(handlerArg, (XML_Char *)s, (XML_Char *)next - (XML_Char *)s); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_PI: if (!reportProcessingInstruction(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_COMMENT: if (!reportComment(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; break; default: if (defaultHandler) reportDefault(parser, enc, s, next); break; } *eventPP = s = next; } /* not reached */ } /* If tagNamePtr is non-null, build a real list of attributes, otherwise just check the attributes for well-formedness. */ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc, const char *s, TAG_NAME *tagNamePtr, BINDING **bindingsPtr) { ELEMENT_TYPE *elementType = 0; int nDefaultAtts = 0; const XML_Char **appAtts; int attIndex = 0; int i; int n; int nPrefixes = 0; BINDING *binding; const XML_Char *localPart; if (tagNamePtr) { elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str, 0); if (!elementType) { tagNamePtr->str = poolCopyString(&dtd.pool, tagNamePtr->str); if (!tagNamePtr->str) return XML_ERROR_NO_MEMORY; elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str, sizeof(ELEMENT_TYPE)); if (!elementType) return XML_ERROR_NO_MEMORY; if (ns && !setElementTypePrefix(parser, elementType)) return XML_ERROR_NO_MEMORY; } nDefaultAtts = elementType->nDefaultAtts; } n = XmlGetAttributes(enc, s, attsSize, atts); if (n + nDefaultAtts > attsSize) { int oldAttsSize = attsSize; attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; atts = realloc((void *)atts, attsSize * sizeof(ATTRIBUTE)); if (!atts) return XML_ERROR_NO_MEMORY; if (n > oldAttsSize) XmlGetAttributes(enc, s, n, atts); } appAtts = (const XML_Char **)atts; for (i = 0; i < n; i++) { ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, atts[i].name + XmlNameLength(enc, atts[i].name)); if (!attId) return XML_ERROR_NO_MEMORY; if ((attId->name)[-1]) { if (enc == encoding) eventPtr = atts[i].name; return XML_ERROR_DUPLICATE_ATTRIBUTE; } (attId->name)[-1] = 1; appAtts[attIndex++] = attId->name; if (!atts[i].normalized) { enum XML_Error result; int isCdata = 1; if (attId->maybeTokenized) { int j; for (j = 0; j < nDefaultAtts; j++) { if (attId == elementType->defaultAtts[j].id) { isCdata = elementType->defaultAtts[j].isCdata; break; } } } result = storeAttributeValue(parser, enc, isCdata, atts[i].valuePtr, atts[i].valueEnd, &tempPool); if (result) return result; if (tagNamePtr) { appAtts[attIndex] = poolStart(&tempPool); poolFinish(&tempPool); } else poolDiscard(&tempPool); } else if (tagNamePtr) { appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, atts[i].valueEnd); if (appAtts[attIndex] == 0) return XML_ERROR_NO_MEMORY; poolFinish(&tempPool); } if (attId->prefix && tagNamePtr) { if (attId->xmlns) { if (!addBinding(parser, attId->prefix, attId, appAtts[attIndex], bindingsPtr)) return XML_ERROR_NO_MEMORY; --attIndex; } else { attIndex++; nPrefixes++; (attId->name)[-1] = 2; } } else attIndex++; } nSpecifiedAtts = attIndex; if (tagNamePtr) { int j; for (j = 0; j < nDefaultAtts; j++) { const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + j; if (!(da->id->name)[-1] && da->value) { if (da->id->prefix) { if (da->id->xmlns) { if (!addBinding(parser, da->id->prefix, da->id, da->value, bindingsPtr)) return XML_ERROR_NO_MEMORY; } else { (da->id->name)[-1] = 2; nPrefixes++; appAtts[attIndex++] = da->id->name; appAtts[attIndex++] = da->value; } } else { (da->id->name)[-1] = 1; appAtts[attIndex++] = da->id->name; appAtts[attIndex++] = da->value; } } } appAtts[attIndex] = 0; } i = 0; if (nPrefixes) { for (; i < attIndex; i += 2) { if (appAtts[i][-1] == 2) { ATTRIBUTE_ID *id; ((XML_Char *)(appAtts[i]))[-1] = 0; id = (ATTRIBUTE_ID *)lookup(&dtd.attributeIds, appAtts[i], 0); if (id->prefix->binding) { int j; const BINDING *b = id->prefix->binding; const XML_Char *s = appAtts[i]; for (j = 0; j < b->uriLen; j++) { if (!poolAppendChar(&tempPool, b->uri[j])) return XML_ERROR_NO_MEMORY; } while (*s++ != ':') ; do { if (!poolAppendChar(&tempPool, *s)) return XML_ERROR_NO_MEMORY; } while (*s++); appAtts[i] = poolStart(&tempPool); poolFinish(&tempPool); } if (!--nPrefixes) break; } else ((XML_Char *)(appAtts[i]))[-1] = 0; } } for (; i < attIndex; i += 2) ((XML_Char *)(appAtts[i]))[-1] = 0; if (!tagNamePtr) return XML_ERROR_NONE; for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) binding->attId->name[-1] = 0; if (elementType->prefix) { binding = elementType->prefix->binding; if (!binding) return XML_ERROR_NONE; localPart = tagNamePtr->str; while (*localPart++ != XML_T(':')) ; } else if (dtd.defaultPrefix.binding) { binding = dtd.defaultPrefix.binding; localPart = tagNamePtr->str; } else return XML_ERROR_NONE; tagNamePtr->localPart = localPart; tagNamePtr->uriLen = binding->uriLen; i = binding->uriLen; do { if (i == binding->uriAlloc) { binding->uri = realloc(binding->uri, binding->uriAlloc *= 2); if (!binding->uri) return XML_ERROR_NO_MEMORY; } binding->uri[i++] = *localPart; } while (*localPart++); tagNamePtr->str = binding->uri; return XML_ERROR_NONE; } static int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, const XML_Char *uri, BINDING **bindingsPtr) { BINDING *b; int len; for (len = 0; uri[len]; len++) ; if (namespaceSeparator) len++; if (freeBindingList) { b = freeBindingList; if (len > b->uriAlloc) { b->uri = realloc(b->uri, len + EXPAND_SPARE); if (!b->uri) return 0; b->uriAlloc = len + EXPAND_SPARE; } freeBindingList = b->nextTagBinding; } else { b = malloc(sizeof(BINDING)); if (!b) return 0; b->uri = malloc(sizeof(XML_Char) * len + EXPAND_SPARE); if (!b->uri) { free(b); return 0; } b->uriAlloc = len; } b->uriLen = len; memcpy(b->uri, uri, len * sizeof(XML_Char)); if (namespaceSeparator) b->uri[len - 1] = namespaceSeparator; b->prefix = prefix; b->attId = attId; b->prevPrefixBinding = prefix->binding; if (*uri == XML_T('\0') && prefix == &dtd.defaultPrefix) prefix->binding = 0; else prefix->binding = b; b->nextTagBinding = *bindingsPtr; *bindingsPtr = b; if (startNamespaceDeclHandler) startNamespaceDeclHandler(handlerArg, prefix->name, prefix->binding ? uri : 0); return 1; } /* The idea here is to avoid using stack for each CDATA section when the whole file is parsed with one call. */ static enum XML_Error cdataSectionProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { enum XML_Error result = doCdataSection(parser, encoding, &start, end, endPtr); if (start) { processor = contentProcessor; return contentProcessor(parser, start, end, endPtr); } return result; } /* startPtr gets set to non-null is the section is closed, and to null if the section is not yet closed. */ static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, const char *end, const char **nextPtr) { const char *s = *startPtr; const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; *eventPP = s; eventEndPP = &eventEndPtr; } else { eventPP = &(openInternalEntities->internalEventPtr); eventEndPP = &(openInternalEntities->internalEventEndPtr); } *eventPP = s; *startPtr = 0; for (;;) { const char *next; int tok = XmlCdataSectionTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { case XML_TOK_CDATA_SECT_CLOSE: if (endCdataSectionHandler) endCdataSectionHandler(handlerArg); #if 0 /* see comment under XML_TOK_CDATA_SECT_OPEN */ else if (characterDataHandler) characterDataHandler(handlerArg, dataBuf, 0); #endif else if (defaultHandler) reportDefault(parser, enc, s, next); *startPtr = next; return XML_ERROR_NONE; case XML_TOK_DATA_NEWLINE: if (characterDataHandler) { XML_Char c = 0xA; characterDataHandler(handlerArg, &c, 1); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_DATA_CHARS: if (characterDataHandler) { if (MUST_CONVERT(enc, s)) { for (;;) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); *eventEndPP = next; characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); if (s == next) break; *eventPP = s; } } else characterDataHandler(handlerArg, (XML_Char *)s, (XML_Char *)next - (XML_Char *)s); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_INVALID: *eventPP = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; case XML_TOK_PARTIAL: case XML_TOK_NONE: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_CDATA_SECTION; default: abort(); } *eventPP = s = next; } /* not reached */ } static enum XML_Error initializeEncoding(XML_Parser parser) { const char *s; #ifdef XML_UNICODE char encodingBuf[128]; if (!protocolEncodingName) s = 0; else { int i; for (i = 0; protocolEncodingName[i]; i++) { if (i == sizeof(encodingBuf) - 1 || protocolEncodingName[i] >= 0x80 || protocolEncodingName[i] < 0) { encodingBuf[0] = '\0'; break; } encodingBuf[i] = (char)protocolEncodingName[i]; } encodingBuf[i] = '\0'; s = encodingBuf; } #else s = protocolEncodingName; #endif if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) return XML_ERROR_NONE; return handleUnknownEncoding(parser, protocolEncodingName); } static enum XML_Error processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, const char *next) { const char *encodingName = 0; const ENCODING *newEncoding = 0; const char *version; int standalone = -1; if (!(ns ? XmlParseXmlDeclNS : XmlParseXmlDecl)(isGeneralTextEntity, encoding, s, next, &eventPtr, &version, &encodingName, &newEncoding, &standalone)) return XML_ERROR_SYNTAX; if (!isGeneralTextEntity && standalone == 1) dtd.standalone = 1; if (defaultHandler) reportDefault(parser, encoding, s, next); if (!protocolEncodingName) { if (newEncoding) { if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { eventPtr = encodingName; return XML_ERROR_INCORRECT_ENCODING; } encoding = newEncoding; } else if (encodingName) { enum XML_Error result; const XML_Char *s = poolStoreString(&tempPool, encoding, encodingName, encodingName + XmlNameLength(encoding, encodingName)); if (!s) return XML_ERROR_NO_MEMORY; result = handleUnknownEncoding(parser, s); poolDiscard(&tempPool); if (result == XML_ERROR_UNKNOWN_ENCODING) eventPtr = encodingName; return result; } } return XML_ERROR_NONE; } static enum XML_Error handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) { if (unknownEncodingHandler) { XML_Encoding info; int i; for (i = 0; i < 256; i++) info.map[i] = -1; info.convert = 0; info.data = 0; info.release = 0; if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, &info)) { ENCODING *enc; unknownEncodingMem = malloc(XmlSizeOfUnknownEncoding()); if (!unknownEncodingMem) { if (info.release) info.release(info.data); return XML_ERROR_NO_MEMORY; } enc = (ns ? XmlInitUnknownEncodingNS : XmlInitUnknownEncoding)(unknownEncodingMem, info.map, info.convert, info.data); if (enc) { unknownEncodingData = info.data; unknownEncodingRelease = info.release; encoding = enc; return XML_ERROR_NONE; } } if (info.release) info.release(info.data); } return XML_ERROR_UNKNOWN_ENCODING; } static enum XML_Error prologInitProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { enum XML_Error result = initializeEncoding(parser); if (result != XML_ERROR_NONE) return result; processor = prologProcessor; return prologProcessor(parser, s, end, nextPtr); } static enum XML_Error prologProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { for (;;) { const char *next; int tok = XmlPrologTok(encoding, s, end, &next); if (tok <= 0) { if (nextPtr != 0 && tok != XML_TOK_INVALID) { *nextPtr = s; return XML_ERROR_NONE; } switch (tok) { case XML_TOK_INVALID: eventPtr = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_NONE: return XML_ERROR_NO_ELEMENTS; case XML_TOK_PARTIAL: return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: return XML_ERROR_PARTIAL_CHAR; case XML_TOK_TRAILING_CR: eventPtr = s + encoding->minBytesPerChar; return XML_ERROR_NO_ELEMENTS; default: abort(); } } switch (XmlTokenRole(&prologState, tok, s, next, encoding)) { case XML_ROLE_XML_DECL: { enum XML_Error result = processXmlDecl(parser, 0, s, next); if (result != XML_ERROR_NONE) return result; } break; case XML_ROLE_DOCTYPE_SYSTEM_ID: if (!dtd.standalone && notStandaloneHandler && !notStandaloneHandler(handlerArg)) return XML_ERROR_NOT_STANDALONE; hadExternalDoctype = 1; break; case XML_ROLE_DOCTYPE_PUBLIC_ID: case XML_ROLE_ENTITY_PUBLIC_ID: if (!XmlIsPublicId(encoding, s, next, &eventPtr)) return XML_ERROR_SYNTAX; if (declEntity) { XML_Char *tem = poolStoreString(&dtd.pool, encoding, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar); if (!tem) return XML_ERROR_NO_MEMORY; normalizePublicId(tem); declEntity->publicId = tem; poolFinish(&dtd.pool); } break; case XML_ROLE_INSTANCE_START: processor = contentProcessor; if (hadExternalDoctype) dtd.complete = 0; return contentProcessor(parser, s, end, nextPtr); case XML_ROLE_ATTLIST_ELEMENT_NAME: { const XML_Char *name = poolStoreString(&dtd.pool, encoding, s, next); if (!name) return XML_ERROR_NO_MEMORY; declElementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, name, sizeof(ELEMENT_TYPE)); if (!declElementType) return XML_ERROR_NO_MEMORY; if (declElementType->name != name) poolDiscard(&dtd.pool); else { poolFinish(&dtd.pool); if (!setElementTypePrefix(parser, declElementType)) return XML_ERROR_NO_MEMORY; } break; } case XML_ROLE_ATTRIBUTE_NAME: declAttributeId = getAttributeId(parser, encoding, s, next); if (!declAttributeId) return XML_ERROR_NO_MEMORY; declAttributeIsCdata = 0; break; case XML_ROLE_ATTRIBUTE_TYPE_CDATA: declAttributeIsCdata = 1; break; case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: if (dtd.complete && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, 0)) return XML_ERROR_NO_MEMORY; break; case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: case XML_ROLE_FIXED_ATTRIBUTE_VALUE: { const XML_Char *attVal; enum XML_Error result = storeAttributeValue(parser, encoding, declAttributeIsCdata, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar, &dtd.pool); if (result) return result; attVal = poolStart(&dtd.pool); poolFinish(&dtd.pool); if (dtd.complete && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, attVal)) return XML_ERROR_NO_MEMORY; break; } case XML_ROLE_ENTITY_VALUE: { enum XML_Error result = storeEntityValue(parser, s, next); if (result != XML_ERROR_NONE) return result; } break; case XML_ROLE_ENTITY_SYSTEM_ID: if (declEntity) { declEntity->systemId = poolStoreString(&dtd.pool, encoding, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar); if (!declEntity->systemId) return XML_ERROR_NO_MEMORY; declEntity->base = dtd.base; poolFinish(&dtd.pool); } break; case XML_ROLE_ENTITY_NOTATION_NAME: if (declEntity) { declEntity->notation = poolStoreString(&dtd.pool, encoding, s, next); if (!declEntity->notation) return XML_ERROR_NO_MEMORY; poolFinish(&dtd.pool); if (unparsedEntityDeclHandler) { eventPtr = eventEndPtr = s; unparsedEntityDeclHandler(handlerArg, declEntity->name, declEntity->base, declEntity->systemId, declEntity->publicId, declEntity->notation); } } break; case XML_ROLE_GENERAL_ENTITY_NAME: { const XML_Char *name; if (XmlPredefinedEntityName(encoding, s, next)) { declEntity = 0; break; } name = poolStoreString(&dtd.pool, encoding, s, next); if (!name) return XML_ERROR_NO_MEMORY; if (dtd.complete) { declEntity = (ENTITY *)lookup(&dtd.generalEntities, name, sizeof(ENTITY)); if (!declEntity) return XML_ERROR_NO_MEMORY; if (declEntity->name != name) { poolDiscard(&dtd.pool); declEntity = 0; } else poolFinish(&dtd.pool); } else { poolDiscard(&dtd.pool); declEntity = 0; } } break; case XML_ROLE_PARAM_ENTITY_NAME: declEntity = 0; break; case XML_ROLE_NOTATION_NAME: declNotationPublicId = 0; declNotationName = 0; if (notationDeclHandler) { declNotationName = poolStoreString(&tempPool, encoding, s, next); if (!declNotationName) return XML_ERROR_NO_MEMORY; poolFinish(&tempPool); } break; case XML_ROLE_NOTATION_PUBLIC_ID: if (!XmlIsPublicId(encoding, s, next, &eventPtr)) return XML_ERROR_SYNTAX; if (declNotationName) { XML_Char *tem = poolStoreString(&tempPool, encoding, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar); if (!tem) return XML_ERROR_NO_MEMORY; normalizePublicId(tem); declNotationPublicId = tem; poolFinish(&tempPool); } break; case XML_ROLE_NOTATION_SYSTEM_ID: if (declNotationName && notationDeclHandler) { const XML_Char *systemId = poolStoreString(&tempPool, encoding, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar); if (!systemId) return XML_ERROR_NO_MEMORY; eventPtr = eventEndPtr = s; notationDeclHandler(handlerArg, declNotationName, dtd.base, systemId, declNotationPublicId); } poolClear(&tempPool); break; case XML_ROLE_NOTATION_NO_SYSTEM_ID: if (declNotationPublicId && notationDeclHandler) { eventPtr = eventEndPtr = s; notationDeclHandler(handlerArg, declNotationName, dtd.base, 0, declNotationPublicId); } poolClear(&tempPool); break; case XML_ROLE_ERROR: eventPtr = s; switch (tok) { case XML_TOK_PARAM_ENTITY_REF: return XML_ERROR_PARAM_ENTITY_REF; case XML_TOK_XML_DECL: return XML_ERROR_MISPLACED_XML_PI; default: return XML_ERROR_SYNTAX; } case XML_ROLE_GROUP_OPEN: if (prologState.level >= groupSize) { if (groupSize) groupConnector = realloc(groupConnector, groupSize *= 2); else groupConnector = malloc(groupSize = 32); if (!groupConnector) return XML_ERROR_NO_MEMORY; } groupConnector[prologState.level] = 0; break; case XML_ROLE_GROUP_SEQUENCE: if (groupConnector[prologState.level] == '|') { eventPtr = s; return XML_ERROR_SYNTAX; } groupConnector[prologState.level] = ','; break; case XML_ROLE_GROUP_CHOICE: if (groupConnector[prologState.level] == ',') { eventPtr = s; return XML_ERROR_SYNTAX; } groupConnector[prologState.level] = '|'; break; case XML_ROLE_PARAM_ENTITY_REF: if (!dtd.standalone && notStandaloneHandler && !notStandaloneHandler(handlerArg)) return XML_ERROR_NOT_STANDALONE; dtd.complete = 0; break; case XML_ROLE_NONE: switch (tok) { case XML_TOK_PI: eventPtr = s; eventEndPtr = next; if (!reportProcessingInstruction(parser, encoding, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_COMMENT: eventPtr = s; eventEndPtr = next; if (!reportComment(parser, encoding, s, next)) return XML_ERROR_NO_MEMORY; break; } break; } if (defaultHandler) { switch (tok) { case XML_TOK_PI: case XML_TOK_COMMENT: case XML_TOK_BOM: case XML_TOK_XML_DECL: break; default: eventPtr = s; eventEndPtr = next; reportDefault(parser, encoding, s, next); } } s = next; } /* not reached */ } static enum XML_Error epilogProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { processor = epilogProcessor; eventPtr = s; for (;;) { const char *next; int tok = XmlPrologTok(encoding, s, end, &next); eventEndPtr = next; switch (tok) { case XML_TOK_TRAILING_CR: if (defaultHandler) { eventEndPtr = end; reportDefault(parser, encoding, s, end); } /* fall through */ case XML_TOK_NONE: if (nextPtr) *nextPtr = end; return XML_ERROR_NONE; case XML_TOK_PROLOG_S: if (defaultHandler) reportDefault(parser, encoding, s, next); break; case XML_TOK_PI: if (!reportProcessingInstruction(parser, encoding, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_COMMENT: if (!reportComment(parser, encoding, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_INVALID: eventPtr = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; default: return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; } eventPtr = s = next; } } static enum XML_Error errorProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { return errorCode; } static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *enc, int isCdata, const char *ptr, const char *end, STRING_POOL *pool) { enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, end, pool); if (result) return result; if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) poolChop(pool); if (!poolAppendChar(pool, XML_T('\0'))) return XML_ERROR_NO_MEMORY; return XML_ERROR_NONE; } static enum XML_Error appendAttributeValue(XML_Parser parser, const ENCODING *enc, int isCdata, const char *ptr, const char *end, STRING_POOL *pool) { const ENCODING *internalEnc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(); for (;;) { const char *next; int tok = XmlAttributeValueTok(enc, ptr, end, &next); switch (tok) { case XML_TOK_NONE: return XML_ERROR_NONE; case XML_TOK_INVALID: if (enc == encoding) eventPtr = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: if (enc == encoding) eventPtr = ptr; return XML_ERROR_INVALID_TOKEN; case XML_TOK_CHAR_REF: { XML_Char buf[XML_ENCODE_MAX]; int i; int n = XmlCharRefNumber(enc, ptr); if (n < 0) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_BAD_CHAR_REF; } if (!isCdata && n == 0x20 /* space */ && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) break; n = XmlEncode(n, (ICHAR *)buf); if (!n) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_BAD_CHAR_REF; } for (i = 0; i < n; i++) { if (!poolAppendChar(pool, buf[i])) return XML_ERROR_NO_MEMORY; } } break; case XML_TOK_DATA_CHARS: if (!poolAppend(pool, enc, ptr, next)) return XML_ERROR_NO_MEMORY; break; break; case XML_TOK_TRAILING_CR: next = ptr + enc->minBytesPerChar; /* fall through */ case XML_TOK_ATTRIBUTE_VALUE_S: case XML_TOK_DATA_NEWLINE: if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) break; if (!poolAppendChar(pool, 0x20)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_ENTITY_REF: { const XML_Char *name; ENTITY *entity; XML_Char ch = XmlPredefinedEntityName(enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar); if (ch) { if (!poolAppendChar(pool, ch)) return XML_ERROR_NO_MEMORY; break; } name = poolStoreString(&temp2Pool, enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!name) return XML_ERROR_NO_MEMORY; entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0); poolDiscard(&temp2Pool); if (!entity) { if (dtd.complete) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_UNDEFINED_ENTITY; } } else if (entity->open) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_RECURSIVE_ENTITY_REF; } else if (entity->notation) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_BINARY_ENTITY_REF; } else if (!entity->textPtr) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; } else { enum XML_Error result; const XML_Char *textEnd = entity->textPtr + entity->textLen; entity->open = 1; result = appendAttributeValue(parser, internalEnc, isCdata, (char *)entity->textPtr, (char *)textEnd, pool); entity->open = 0; if (result) return result; } } break; default: abort(); } ptr = next; } /* not reached */ } static enum XML_Error storeEntityValue(XML_Parser parser, const char *entityTextPtr, const char *entityTextEnd) { const ENCODING *internalEnc = ns ? XmlGetInternalEncodingNS() : XmlGetInternalEncoding(); STRING_POOL *pool = &(dtd.pool); entityTextPtr += encoding->minBytesPerChar; entityTextEnd -= encoding->minBytesPerChar; for (;;) { const char *next; int tok = XmlEntityValueTok(encoding, entityTextPtr, entityTextEnd, &next); switch (tok) { case XML_TOK_PARAM_ENTITY_REF: eventPtr = entityTextPtr; return XML_ERROR_SYNTAX; case XML_TOK_NONE: if (declEntity) { declEntity->textPtr = pool->start; declEntity->textLen = pool->ptr - pool->start; poolFinish(pool); } else poolDiscard(pool); return XML_ERROR_NONE; case XML_TOK_ENTITY_REF: case XML_TOK_DATA_CHARS: if (!poolAppend(pool, encoding, entityTextPtr, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_TRAILING_CR: next = entityTextPtr + encoding->minBytesPerChar; /* fall through */ case XML_TOK_DATA_NEWLINE: if (pool->end == pool->ptr && !poolGrow(pool)) return XML_ERROR_NO_MEMORY; *(pool->ptr)++ = 0xA; break; case XML_TOK_CHAR_REF: { XML_Char buf[XML_ENCODE_MAX]; int i; int n = XmlCharRefNumber(encoding, entityTextPtr); if (n < 0) { eventPtr = entityTextPtr; return XML_ERROR_BAD_CHAR_REF; } n = XmlEncode(n, (ICHAR *)buf); if (!n) { eventPtr = entityTextPtr; return XML_ERROR_BAD_CHAR_REF; } for (i = 0; i < n; i++) { if (pool->end == pool->ptr && !poolGrow(pool)) return XML_ERROR_NO_MEMORY; *(pool->ptr)++ = buf[i]; } } break; case XML_TOK_PARTIAL: eventPtr = entityTextPtr; return XML_ERROR_INVALID_TOKEN; case XML_TOK_INVALID: eventPtr = next; return XML_ERROR_INVALID_TOKEN; default: abort(); } entityTextPtr = next; } /* not reached */ } static void normalizeLines(XML_Char *s) { XML_Char *p; for (;; s++) { if (*s == XML_T('\0')) return; if (*s == 0xD) break; } p = s; do { if (*s == 0xD) { *p++ = 0xA; if (*++s == 0xA) s++; } else *p++ = *s++; } while (*s); *p = XML_T('\0'); } static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end) { const XML_Char *target; XML_Char *data; const char *tem; if (!processingInstructionHandler) { if (defaultHandler) reportDefault(parser, enc, start, end); return 1; } start += enc->minBytesPerChar * 2; tem = start + XmlNameLength(enc, start); target = poolStoreString(&tempPool, enc, start, tem); if (!target) return 0; poolFinish(&tempPool); data = poolStoreString(&tempPool, enc, XmlSkipS(enc, tem), end - enc->minBytesPerChar*2); if (!data) return 0; normalizeLines(data); processingInstructionHandler(handlerArg, target, data); poolClear(&tempPool); return 1; } static int reportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end) { XML_Char *data; if (!commentHandler) { if (defaultHandler) reportDefault(parser, enc, start, end); return 1; } data = poolStoreString(&tempPool, enc, start + enc->minBytesPerChar * 4, end - enc->minBytesPerChar * 3); if (!data) return 0; normalizeLines(data); commentHandler(handlerArg, data); poolClear(&tempPool); return 1; } static void reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, const char *end) { if (MUST_CONVERT(enc, s)) { const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; eventEndPP = &eventEndPtr; } else { eventPP = &(openInternalEntities->internalEventPtr); eventEndPP = &(openInternalEntities->internalEventEndPtr); } do { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); *eventEndPP = s; defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); *eventPP = s; } while (s != end); } else defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); } static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, int isCdata, const XML_Char *value) { DEFAULT_ATTRIBUTE *att; if (type->nDefaultAtts == type->allocDefaultAtts) { if (type->allocDefaultAtts == 0) { type->allocDefaultAtts = 8; type->defaultAtts = malloc(type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE)); } else { type->allocDefaultAtts *= 2; type->defaultAtts = realloc(type->defaultAtts, type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE)); } if (!type->defaultAtts) return 0; } att = type->defaultAtts + type->nDefaultAtts; att->id = attId; att->value = value; att->isCdata = isCdata; if (!isCdata) attId->maybeTokenized = 1; type->nDefaultAtts += 1; return 1; } static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) { const XML_Char *name; for (name = elementType->name; *name; name++) { if (*name == XML_T(':')) { PREFIX *prefix; const XML_Char *s; for (s = elementType->name; s != name; s++) { if (!poolAppendChar(&dtd.pool, *s)) return 0; } if (!poolAppendChar(&dtd.pool, XML_T('\0'))) return 0; prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX)); if (!prefix) return 0; if (prefix->name == poolStart(&dtd.pool)) poolFinish(&dtd.pool); else poolDiscard(&dtd.pool); elementType->prefix = prefix; } } return 1; } static ATTRIBUTE_ID * getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end) { ATTRIBUTE_ID *id; const XML_Char *name; if (!poolAppendChar(&dtd.pool, XML_T('\0'))) return 0; name = poolStoreString(&dtd.pool, enc, start, end); if (!name) return 0; ++name; id = (ATTRIBUTE_ID *)lookup(&dtd.attributeIds, name, sizeof(ATTRIBUTE_ID)); if (!id) return 0; if (id->name != name) poolDiscard(&dtd.pool); else { poolFinish(&dtd.pool); if (!ns) ; else if (name[0] == 'x' && name[1] == 'm' && name[2] == 'l' && name[3] == 'n' && name[4] == 's' && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) { if (name[5] == '\0') id->prefix = &dtd.defaultPrefix; else id->prefix = (PREFIX *)lookup(&dtd.prefixes, name + 6, sizeof(PREFIX)); id->xmlns = 1; } else { int i; for (i = 0; name[i]; i++) { if (name[i] == XML_T(':')) { int j; for (j = 0; j < i; j++) { if (!poolAppendChar(&dtd.pool, name[j])) return 0; } if (!poolAppendChar(&dtd.pool, XML_T('\0'))) return 0; id->prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX)); if (id->prefix->name == poolStart(&dtd.pool)) poolFinish(&dtd.pool); else poolDiscard(&dtd.pool); break; } } } } return id; } #define CONTEXT_SEP XML_T('\f') static const XML_Char *getContext(XML_Parser parser) { HASH_TABLE_ITER iter; int needSep = 0; if (dtd.defaultPrefix.binding) { int i; int len; if (!poolAppendChar(&tempPool, XML_T('='))) return 0; len = dtd.defaultPrefix.binding->uriLen; if (namespaceSeparator != XML_T('\0')) len--; for (i = 0; i < len; i++) if (!poolAppendChar(&tempPool, dtd.defaultPrefix.binding->uri[i])) return 0; needSep = 1; } hashTableIterInit(&iter, &(dtd.prefixes)); for (;;) { int i; int len; const XML_Char *s; PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); if (!prefix) break; if (!prefix->binding) continue; if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) return 0; for (s = prefix->name; *s; s++) if (!poolAppendChar(&tempPool, *s)) return 0; if (!poolAppendChar(&tempPool, XML_T('='))) return 0; len = prefix->binding->uriLen; if (namespaceSeparator != XML_T('\0')) len--; for (i = 0; i < len; i++) if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) return 0; needSep = 1; } hashTableIterInit(&iter, &(dtd.generalEntities)); for (;;) { const XML_Char *s; ENTITY *e = (ENTITY *)hashTableIterNext(&iter); if (!e) break; if (!e->open) continue; if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) return 0; for (s = e->name; *s; s++) if (!poolAppendChar(&tempPool, *s)) return 0; needSep = 1; } if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; return tempPool.start; } static int setContext(XML_Parser parser, const XML_Char *context) { const XML_Char *s = context; while (*context != XML_T('\0')) { if (*s == CONTEXT_SEP || *s == XML_T('\0')) { ENTITY *e; if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; e = (ENTITY *)lookup(&dtd.generalEntities, poolStart(&tempPool), 0); if (e) e->open = 1; if (*s != XML_T('\0')) s++; context = s; poolDiscard(&tempPool); } else if (*s == '=') { PREFIX *prefix; if (poolLength(&tempPool) == 0) prefix = &dtd.defaultPrefix; else { if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&tempPool), sizeof(PREFIX)); if (!prefix) return 0; if (prefix->name == poolStart(&tempPool)) poolFinish(&tempPool); else poolDiscard(&tempPool); } for (context = s + 1; *context != CONTEXT_SEP && *context != XML_T('\0'); context++) if (!poolAppendChar(&tempPool, *context)) return 0; if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; if (!addBinding(parser, prefix, 0, poolStart(&tempPool), &inheritedBindings)) return 0; poolDiscard(&tempPool); if (*context != XML_T('\0')) ++context; s = context; } else { if (!poolAppendChar(&tempPool, *s)) return 0; s++; } } return 1; } static void normalizePublicId(XML_Char *publicId) { XML_Char *p = publicId; XML_Char *s; for (s = publicId; *s; s++) { switch (*s) { case 0x20: case 0xD: case 0xA: if (p != publicId && p[-1] != 0x20) *p++ = 0x20; break; default: *p++ = *s; } } if (p != publicId && p[-1] == 0x20) --p; *p = XML_T('\0'); } static int dtdInit(DTD *p) { poolInit(&(p->pool)); hashTableInit(&(p->generalEntities)); hashTableInit(&(p->elementTypes)); hashTableInit(&(p->attributeIds)); hashTableInit(&(p->prefixes)); p->complete = 1; p->standalone = 0; p->base = 0; p->defaultPrefix.name = 0; p->defaultPrefix.binding = 0; return 1; } static void dtdDestroy(DTD *p) { HASH_TABLE_ITER iter; hashTableIterInit(&iter, &(p->elementTypes)); for (;;) { ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); if (!e) break; if (e->allocDefaultAtts != 0) free(e->defaultAtts); } hashTableDestroy(&(p->generalEntities)); hashTableDestroy(&(p->elementTypes)); hashTableDestroy(&(p->attributeIds)); hashTableDestroy(&(p->prefixes)); poolDestroy(&(p->pool)); } /* Do a deep copy of the DTD. Return 0 for out of memory; non-zero otherwise. The new DTD has already been initialized. */ static int dtdCopy(DTD *newDtd, const DTD *oldDtd) { HASH_TABLE_ITER iter; if (oldDtd->base) { const XML_Char *tem = poolCopyString(&(newDtd->pool), oldDtd->base); if (!tem) return 0; newDtd->base = tem; } /* Copy the prefix table. */ hashTableIterInit(&iter, &(oldDtd->prefixes)); for (;;) { const XML_Char *name; const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); if (!oldP) break; name = poolCopyString(&(newDtd->pool), oldP->name); if (!name) return 0; if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) return 0; } hashTableIterInit(&iter, &(oldDtd->attributeIds)); /* Copy the attribute id table. */ for (;;) { ATTRIBUTE_ID *newA; const XML_Char *name; const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); if (!oldA) break; /* Remember to allocate the scratch byte before the name. */ if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) return 0; name = poolCopyString(&(newDtd->pool), oldA->name); if (!name) return 0; ++name; newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, sizeof(ATTRIBUTE_ID)); if (!newA) return 0; newA->maybeTokenized = oldA->maybeTokenized; if (oldA->prefix) { newA->xmlns = oldA->xmlns; if (oldA->prefix == &oldDtd->defaultPrefix) newA->prefix = &newDtd->defaultPrefix; else newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), oldA->prefix->name, 0); } } /* Copy the element type table. */ hashTableIterInit(&iter, &(oldDtd->elementTypes)); for (;;) { int i; ELEMENT_TYPE *newE; const XML_Char *name; const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); if (!oldE) break; name = poolCopyString(&(newDtd->pool), oldE->name); if (!name) return 0; newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, sizeof(ELEMENT_TYPE)); if (!newE) return 0; if (oldE->nDefaultAtts) { newE->defaultAtts = (DEFAULT_ATTRIBUTE *)malloc(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); if (!newE->defaultAtts) return 0; } newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; if (oldE->prefix) newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), oldE->prefix->name, 0); for (i = 0; i < newE->nDefaultAtts; i++) { newE->defaultAtts[i].id = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; if (oldE->defaultAtts[i].value) { newE->defaultAtts[i].value = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); if (!newE->defaultAtts[i].value) return 0; } else newE->defaultAtts[i].value = 0; } } /* Copy the entity table. */ hashTableIterInit(&iter, &(oldDtd->generalEntities)); for (;;) { ENTITY *newE; const XML_Char *name; const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); if (!oldE) break; name = poolCopyString(&(newDtd->pool), oldE->name); if (!name) return 0; newE = (ENTITY *)lookup(&(newDtd->generalEntities), name, sizeof(ENTITY)); if (!newE) return 0; if (oldE->systemId) { const XML_Char *tem = poolCopyString(&(newDtd->pool), oldE->systemId); if (!tem) return 0; newE->systemId = tem; if (oldE->base) { if (oldE->base == oldDtd->base) newE->base = newDtd->base; tem = poolCopyString(&(newDtd->pool), oldE->base); if (!tem) return 0; newE->base = tem; } } else { const XML_Char *tem = poolCopyStringN(&(newDtd->pool), oldE->textPtr, oldE->textLen); if (!tem) return 0; newE->textPtr = tem; newE->textLen = oldE->textLen; } if (oldE->notation) { const XML_Char *tem = poolCopyString(&(newDtd->pool), oldE->notation); if (!tem) return 0; newE->notation = tem; } } newDtd->complete = oldDtd->complete; newDtd->standalone = oldDtd->standalone; return 1; } static void poolInit(STRING_POOL *pool) { pool->blocks = 0; pool->freeBlocks = 0; pool->start = 0; pool->ptr = 0; pool->end = 0; } static void poolClear(STRING_POOL *pool) { if (!pool->freeBlocks) pool->freeBlocks = pool->blocks; else { BLOCK *p = pool->blocks; while (p) { BLOCK *tem = p->next; p->next = pool->freeBlocks; pool->freeBlocks = p; p = tem; } } pool->blocks = 0; pool->start = 0; pool->ptr = 0; pool->end = 0; } static void poolDestroy(STRING_POOL *pool) { BLOCK *p = pool->blocks; while (p) { BLOCK *tem = p->next; free(p); p = tem; } pool->blocks = 0; p = pool->freeBlocks; while (p) { BLOCK *tem = p->next; free(p); p = tem; } pool->freeBlocks = 0; pool->ptr = 0; pool->start = 0; pool->end = 0; } static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end) { if (!pool->ptr && !poolGrow(pool)) return 0; for (;;) { XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); if (ptr == end) break; if (!poolGrow(pool)) return 0; } return pool->start; } static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s) { do { if (!poolAppendChar(pool, *s)) return 0; } while (*s++); s = pool->start; poolFinish(pool); return s; } static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) { if (!pool->ptr && !poolGrow(pool)) return 0; for (; n > 0; --n, s++) { if (!poolAppendChar(pool, *s)) return 0; } s = pool->start; poolFinish(pool); return s; } static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end) { if (!poolAppend(pool, enc, ptr, end)) return 0; if (pool->ptr == pool->end && !poolGrow(pool)) return 0; *(pool->ptr)++ = 0; return pool->start; } static int poolGrow(STRING_POOL *pool) { if (pool->freeBlocks) { if (pool->start == 0) { pool->blocks = pool->freeBlocks; pool->freeBlocks = pool->freeBlocks->next; pool->blocks->next = 0; pool->start = pool->blocks->s; pool->end = pool->start + pool->blocks->size; pool->ptr = pool->start; return 1; } if (pool->end - pool->start < pool->freeBlocks->size) { BLOCK *tem = pool->freeBlocks->next; pool->freeBlocks->next = pool->blocks; pool->blocks = pool->freeBlocks; pool->freeBlocks = tem; memcpy(pool->blocks->s, pool->start, (pool->end - pool->start) * sizeof(XML_Char)); pool->ptr = pool->blocks->s + (pool->ptr - pool->start); pool->start = pool->blocks->s; pool->end = pool->start + pool->blocks->size; return 1; } } if (pool->blocks && pool->start == pool->blocks->s) { int blockSize = (pool->end - pool->start)*2; pool->blocks = realloc(pool->blocks, offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); if (!pool->blocks) return 0; pool->blocks->size = blockSize; pool->ptr = pool->blocks->s + (pool->ptr - pool->start); pool->start = pool->blocks->s; pool->end = pool->start + blockSize; } else { BLOCK *tem; int blockSize = pool->end - pool->start; if (blockSize < INIT_BLOCK_SIZE) blockSize = INIT_BLOCK_SIZE; else blockSize *= 2; tem = malloc(offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); if (!tem) return 0; tem->size = blockSize; tem->next = pool->blocks; pool->blocks = tem; memcpy(tem->s, pool->start, (pool->ptr - pool->start) * sizeof(XML_Char)); pool->ptr = tem->s + (pool->ptr - pool->start); pool->start = tem->s; pool->end = tem->s + blockSize; } return 1; } centerim-4.22.10/libmsn/0000755000175000001440000000000011473011456011751 500000000000000centerim-4.22.10/libmsn/INSTALL0000644000175000001440000000000011461606612012711 00000000000000centerim-4.22.10/libmsn/AUTHORS0000644000175000001440000000000011461606612012730 00000000000000centerim-4.22.10/libmsn/NEWS0000644000175000001440000000000011461606612012357 00000000000000centerim-4.22.10/libmsn/Makefile.in0000644000175000001440000004733711473011437013753 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libmsn DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ AUTHORS COPYING ChangeLog INSTALL NEWS mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru liblibmsn_a_AR = $(AR) $(ARFLAGS) liblibmsn_a_DEPENDENCIES = msn/authdata.o msn/buddy.o msn/connection.o \ msn/filetransfer.o msn/invitation.o msn/message.o \ msn/notificationserver.o msn/passport.o \ msn/switchboardserver.o msn/util.o am_liblibmsn_a_OBJECTS = liblibmsn_a_OBJECTS = $(am_liblibmsn_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(liblibmsn_a_SOURCES) DIST_SOURCES = $(liblibmsn_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = ChangeLog AUTHORS COPYING INSTALL NEWS README SUBDIRS = msn AM_CPPFLAGS = -I$(top_srcdir)/connwrap noinst_LIBRARIES = liblibmsn.a liblibmsn_a_SOURCES = liblibmsn_a_LIBADD = msn/authdata.o msn/buddy.o msn/connection.o msn/filetransfer.o msn/invitation.o msn/message.o msn/notificationserver.o msn/passport.o msn/switchboardserver.o msn/util.o all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libmsn/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu libmsn/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) liblibmsn.a: $(liblibmsn_a_OBJECTS) $(liblibmsn_a_DEPENDENCIES) -rm -f liblibmsn.a $(liblibmsn_a_AR) liblibmsn.a $(liblibmsn_a_OBJECTS) $(liblibmsn_a_LIBADD) $(RANLIB) liblibmsn.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/libmsn/COPYING0000644000175000001440000000000011461606612012713 00000000000000centerim-4.22.10/libmsn/Makefile.am0000644000175000001440000000054311461606612013730 00000000000000EXTRA_DIST = ChangeLog AUTHORS COPYING INSTALL NEWS README SUBDIRS = msn AM_CPPFLAGS = -I$(top_srcdir)/connwrap noinst_LIBRARIES = liblibmsn.a liblibmsn_a_SOURCES = liblibmsn_a_LIBADD = msn/authdata.o msn/buddy.o msn/connection.o msn/filetransfer.o msn/invitation.o msn/message.o msn/notificationserver.o msn/passport.o msn/switchboardserver.o msn/util.o centerim-4.22.10/libmsn/ChangeLog0000644000175000001440000000000011461606612013432 00000000000000centerim-4.22.10/libmsn/README0000644000175000001440000000000011461606612012540 00000000000000centerim-4.22.10/libmsn/msn/0000755000175000001440000000000011473011456012546 500000000000000centerim-4.22.10/libmsn/msn/util.cpp0000644000175000001440000001044411461606612014153 00000000000000/* * util.cpp * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include namespace MSN { std::pair splitServerAddress(const std::string & address, int default_port) { size_t pos; std::string host = address; int port = default_port; if ((pos = address.find(":")) != std::string::npos) { std::string port_s = address.substr(pos + 1); host = address.substr(0, pos); port = decimalFromString(port_s); } if (host == "" || port < 0) throw std::runtime_error("Invalid zero-length address or negative port number!"); return std::make_pair(host, port); } std::string decodeURL(const std::string & s) { std::string out; std::string::const_iterator i; for (i = s.begin(); i != s.end(); i++) { if (*i == '%') { char entity[3] = {*(++i), *(++i), 0}; int c = strtol(entity, NULL, 16); out += c; } else out += *i; } return out; } std::string encodeURL(const std::string & s) { std::string out; std::string::const_iterator i; for (i = s.begin(); i != s.end(); i++) { if(!(isalpha(*i) || isdigit(*i))) { unsigned char high_nibble = ((unsigned char) *i) >> 4; unsigned char low_nibble = ((unsigned char) *i) & 0x0F; out += '%'; out += (high_nibble < 0x0A ? '0' + high_nibble : 'a' + high_nibble - 0x0A); out += (low_nibble < 0x0A ? '0' + low_nibble : 'a' + low_nibble - 0x0A); continue; } out += *i; } return out; } std::vector splitString(const std::string & s, const std::string & sep, bool suppressBlanks) { std::vector array; size_t position, last_position; last_position = position = 0; while (position + sep.size() <= s.size()) { if (s[position] == sep[0] && s.substr(position, sep.size()) == sep) { if (!suppressBlanks || position - last_position > 0) array.push_back(s.substr(last_position, position - last_position)); last_position = position = position + sep.size(); } else position++; } if (!suppressBlanks || last_position - s.size()) array.push_back(s.substr(last_position)); return array; } int nocase_cmp(const std::string & s1, const std::string& s2) { std::string::const_iterator it1, it2; for (it1 = s1.begin(), it2 = s2.begin(); it1 != s1.end() && it2 != s2.end(); ++it1, ++it2) { if (std::toupper(*it1) != std::toupper(*it2)) return std::toupper(*it1) - std::toupper(*it2); } size_t size1 = s1.size(), size2 = s2.size(); return (int) (size1 - size2); } unsigned int decimalFromString(const std::string & s) throw (std::logic_error) { unsigned int result = strtol(s.c_str(), NULL, 10); errno = 0; if (result == 0 && errno != 0) throw std::logic_error(strerror(errno)); return result; } } centerim-4.22.10/libmsn/msn/switchboardserver.cpp0000644000175000001440000004437311461606612016746 00000000000000/* * switchboardserver.cpp * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #include #include #include #include namespace MSN { std::map &)> SwitchboardServerConnection::commandHandlers; SwitchboardServerConnection::SwitchboardServerConnection(AuthData & auth_, NotificationServerConnection & n) : Connection(), auth(auth_), _connectionState(SB_DISCONNECTED), notificationServer(n) { registerCommandHandlers(); } SwitchboardServerConnection::~SwitchboardServerConnection() { if (this->connectionState() != SB_DISCONNECTED) this->disconnect(); } Connection *SwitchboardServerConnection::connectionWithSocket(int fd) { this->assertConnectionStateIsAtLeast(SB_CONNECTING); std::list & list = _fileTransferConnections; std::list::iterator i = list.begin(); if (this->sock == fd) return this; for (; i != list.end(); i++) { if ((*i)->sock == fd) return *i; } return NULL; } void SwitchboardServerConnection::addFileTransferConnection(FileTransferConnection *c) { this->assertConnectionStateIsAtLeast(SB_CONNECTED); _fileTransferConnections.push_back(c); } void SwitchboardServerConnection::removeFileTransferConnection(FileTransferConnection *c) { this->assertConnectionStateIsAtLeast(SB_CONNECTED); _fileTransferConnections.remove(c); } void SwitchboardServerConnection::removeFileTransferConnection(FileTransferInvitation *inv) { this->assertConnectionStateIsAtLeast(SB_CONNECTED); std::list & list = _fileTransferConnections; std::list::iterator i = list.begin(); for (i = list.begin(); i != list.end(); i++) { if ((*i)->auth.inv == inv) break; } if (i != list.end()) (*i)->disconnect(); } template class hasCookieOf { const std::string & cookie; public: hasCookieOf(const std::string & __i) : cookie(__i) {}; bool operator()(const _Tp &__x) { return __x->cookie == cookie; } }; Invitation *SwitchboardServerConnection::invitationWithCookie(const std::string & cookie) { std::list & receivedList = this->invitationsReceived; std::list & sentList = this->invitationsSent; std::list::iterator i; i = std::find_if(receivedList.begin(), receivedList.end(), hasCookieOf(cookie)); if (i != receivedList.end()) return *i; i = std::find_if(sentList.begin(), sentList.end(), hasCookieOf(cookie)); if (i != sentList.end()) return *i; return NULL; } void SwitchboardServerConnection::addCallback(SwitchboardServerCallback callback, int trid, void *data) { this->assertConnectionStateIsAtLeast(SB_CONNECTING); this->callbacks[trid] = std::make_pair(callback, data); } void SwitchboardServerConnection::removeCallback(int trid) { this->assertConnectionStateIsAtLeast(SB_CONNECTING); this->callbacks.erase(trid); } void SwitchboardServerConnection::registerCommandHandlers() { if (commandHandlers.size() == 0) { commandHandlers["BYE"] = &SwitchboardServerConnection::handle_BYE; commandHandlers["JOI"] = &SwitchboardServerConnection::handle_JOI; commandHandlers["NAK"] = &SwitchboardServerConnection::handle_NAK; commandHandlers["MSG"] = &SwitchboardServerConnection::handle_MSG; } } void SwitchboardServerConnection::dispatchCommand(std::vector & args) { this->assertConnectionStateIsAtLeast(SB_CONNECTED); std::map &)>::iterator i = commandHandlers.find(args[0]); if (i != commandHandlers.end()) (this->*commandHandlers[args[0]])(args); } void SwitchboardServerConnection::sendMessage(const Message *msg) { this->assertConnectionStateIsAtLeast(SB_READY); std::string s = msg->asString(); std::ostringstream buf_; buf_ << "MSG " << this->trID++ << " A " << (int) s.size() << "\r\n" << s; this->write(buf_); } void SwitchboardServerConnection::sendMessage(const std::string & body) { Message msg(body, "MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\n"); this->sendMessage(&msg); } void SwitchboardServerConnection::handleInvite(Passport from, const std::string & friendly, const std::string & mime, const std::string & body) { this->assertConnectionStateIsAtLeast(SB_READY); Message::Headers headers = Message::Headers(body); std::string command = headers["Invitation-Command"]; std::string cookie = headers["Invitation-Cookie"]; std::string guid = headers["Application-GUID"]; Invitation * inv = this->invitationWithCookie(cookie); if (command == "INVITE" && guid == "{5D3E02AB-6190-11d3-BBBB-00C04F795683}") { this->handleNewInvite(from, friendly, mime, body); } else if (inv == NULL) { printf("Very odd - just got a %s out of mid-air...\n", command.c_str()); } else if (command == "ACCEPT") { inv->invitationWasAccepted(body); } else if (command == "CANCEL" || command == "REJECT") { inv->invitationWasCanceled(body); } else { printf("Argh, don't support %s yet!\n", command.c_str()); } } void SwitchboardServerConnection::handleNewInvite(Passport & from, const std::string & friendly, const std::string & mime, const std::string & body) { this->assertConnectionStateIsAtLeast(SB_READY); Message::Headers headers = Message::Headers(body); std::string appname; std::string filename; std::string filesize; appname = headers["Application-Name"]; Invitation *invg = NULL; if (!((filename = headers["Application-File"]).empty() || (filesize = headers["Application-FileSize"]).empty())) { invg = new FileTransferInvitation(Invitation::MSNFTP, headers["Invitation-Cookie"], from, this, filename, atol(filesize.c_str())); this->myNotificationServer()->externalCallbacks.gotFileTransferInvitation(this, from, friendly, static_cast(invg)); } if (invg == NULL) { this->myNotificationServer()->externalCallbacks.showError(this, "Unknown invitation type!"); return; } this->invitationsReceived.push_back(invg); } void SwitchboardServerConnection::handle_BYE(std::vector & args) { this->assertConnectionStateIsAtLeast(SB_CONNECTED); std::list & list = this->users; std::list::iterator i; this->myNotificationServer()->externalCallbacks.buddyLeftConversation(this, args[1]); for (i = list.begin(); i != list.end(); i++) { if (*i == args[1]) { list.remove(*i); break; } } if (this->users.empty() || (args.size() > 3 && args[3] == "1")) { this->disconnect(); } } void SwitchboardServerConnection::handle_JOI(std::vector & args) { this->assertConnectionStateIsAtLeast(SB_CONNECTED); if (args[1] == this->auth.username) return; if (this->auth.sessionID.empty() && this->connectionState() == SB_WAITING_FOR_USERS) this->setConnectionState(SB_READY); this->users.push_back(args[1]); this->myNotificationServer()->externalCallbacks.buddyJoinedConversation(this, args[1], decodeURL(args[2]), 0); } void SwitchboardServerConnection::handle_NAK(std::vector & args) { this->assertConnectionStateIsAtLeast(SB_CONNECTED); this->myNotificationServer()->externalCallbacks.failedSendingMessage(this); } void SwitchboardServerConnection::handle_MSG(std::vector & args) { this->assertConnectionStateIsAtLeast(SB_CONNECTED); Connection::handle_MSG(args); } void SwitchboardServerConnection::sendTypingNotification() { this->assertConnectionStateIsAtLeast(SB_READY); std::ostringstream buf_, msg_; msg_ << "MIME-Version: 1.0\r\n"; msg_ << "Content-Type: text/x-msmsgscontrol\r\n"; msg_ << "TypingUser: " << this->auth.username << "\r\n"; msg_ << "\r\n"; msg_ << "\r\n"; size_t msg_length = msg_.str().size(); buf_ << "MSG " << this->trID++ << " U " << (int) msg_length << "\r\n" << msg_.str(); write(buf_); } void SwitchboardServerConnection::inviteUser(Passport userName) { this->assertConnectionStateIsAtLeast(SB_WAITING_FOR_USERS); std::ostringstream buf_; buf_ << "CAL " << this->trID++ << " " << userName << "\r\n"; write(buf_); } void SwitchboardServerConnection::connect(const std::string & hostname, unsigned int port) { this->assertConnectionStateIs(SB_DISCONNECTED); if ((this->sock = this->myNotificationServer()->externalCallbacks.connectToServer(hostname, port, &this->connected)) == -1) { this->myNotificationServer()->externalCallbacks.showError(this, "Could not connect to switchboard server"); return; } this->myNotificationServer()->externalCallbacks.registerSocket(this->sock, 1, 1); this->setConnectionState(SB_CONNECTING); if (this->connected) this->socketConnectionCompleted(); std::ostringstream buf_; if (this->auth.sessionID.empty()) { buf_ << "USR " << this->trID << " " << this->auth.username << " " << this->auth.cookie << "\r\n"; if (this->write(buf_) != buf_.str().size()) return; this->addCallback(&SwitchboardServerConnection::callback_InviteUsers, this->trID, NULL); } else { buf_ << "ANS " << this->trID << " " << this->auth.username << " " << this->auth.cookie << " " << this->auth.sessionID << "\r\n"; if (this->write(buf_) != buf_.str().size()) return; this->myNotificationServer()->externalCallbacks.gotNewConnection(this); this->addCallback(&SwitchboardServerConnection::callback_AnsweredCall, this->trID, NULL); } this->trID++; } void SwitchboardServerConnection::disconnect() { this->assertConnectionStateIsNot(SB_DISCONNECTED); notificationServer.removeSwitchboardConnection(this); this->myNotificationServer()->externalCallbacks.closingConnection(this); std::list list = _fileTransferConnections; std::list::iterator i = list.begin(); for (; i != list.end(); i++) { removeFileTransferConnection(*i); } this->callbacks.clear(); Connection::disconnect(); this->setConnectionState(SB_DISCONNECTED); } void SwitchboardServerConnection::socketConnectionCompleted() { this->assertConnectionStateIs(SB_CONNECTING); Connection::socketConnectionCompleted(); this->myNotificationServer()->externalCallbacks.unregisterSocket(this->sock); this->myNotificationServer()->externalCallbacks.registerSocket(this->sock, 1, 0); this->setConnectionState(SB_WAITING_FOR_USERS); } void SwitchboardServerConnection::handleIncomingData() { this->assertConnectionStateIsAtLeast(SB_CONNECTED); while (this->isWholeLineAvailable()) { std::vector args = this->getLine(); if (args[0] == "MSG" || args[0] == "NOT") { int dataLength = decimalFromString(args[3]); if (this->readBuffer.find("\r\n") + 2 + dataLength > this->readBuffer.size()) return; } this->readBuffer = this->readBuffer.substr(this->readBuffer.find("\r\n") + 2); int trid = 0; if (args.size() > 1) { try { trid = decimalFromString(args[1]); } catch (...) { } } if (!this->callbacks.empty() && trid > 0) { if (this->callbacks.find(trid) != this->callbacks.end()) { (this->*(this->callbacks[trid].first))(args, trid, this->callbacks[trid].second); continue; } } if (isdigit(args[0][0])) this->showError(decimalFromString(args[0])); else this->dispatchCommand(args); } } void SwitchboardServerConnection::callback_InviteUsers(std::vector & args, int trid, void *) { this->assertConnectionStateIsAtLeast(SB_CONNECTED); this->removeCallback(trid); if (args[2] != "OK") { this->showError(decimalFromString(args[0])); this->disconnect(); return; } this->myNotificationServer()->externalCallbacks.gotSwitchboard(this, this->auth.tag); this->myNotificationServer()->externalCallbacks.gotNewConnection(this); } void SwitchboardServerConnection::callback_AnsweredCall(std::vector & args, int trid, void * data) { this->assertConnectionStateIs(SB_WAITING_FOR_USERS); if (args.size() >= 3 && args[0] == "ANS" && args[2] == "OK") return; if (isdigit(args[0][0])) { this->removeCallback(trid); this->showError(decimalFromString(args[0])); this->disconnect(); return; } if (args.size() >= 6 && args[0] == "IRO") { if (args[4] == this->auth.username) return; this->users.push_back(args[4]); this->myNotificationServer()->externalCallbacks.buddyJoinedConversation(this, args[4], decodeURL(args[5]), 1); if (args[2] == args[3]) { this->removeCallback(trid); this->setConnectionState(SB_READY); } } } FileTransferInvitation *SwitchboardServerConnection::sendFile(const std::string path) { this->assertConnectionStateIs(SB_READY); struct stat st_info; if (stat(path.c_str(), &st_info) < 0) { this->myNotificationServer()->externalCallbacks.showError(this, "Could not open file"); return NULL; } char tmp[64]; sprintf(tmp, "%d", rand()); FileTransferInvitation *inv = new FileTransferInvitation(Invitation::MSNFTP, std::string(tmp), *(users.begin()), this, path, st_info.st_size); std::string basename = inv->fileName; size_t forward_slash_pos = inv->fileName.rfind('/'); size_t backward_slash_pos = inv->fileName.rfind('\\'); size_t basename_pos = 0; if (forward_slash_pos != std::string::npos) basename_pos = forward_slash_pos + 1; if (backward_slash_pos != std::string::npos && backward_slash_pos > forward_slash_pos) basename_pos = backward_slash_pos + 1; basename = basename.substr(basename_pos); std::ostringstream buf_; buf_ << "Application-Name: File Transfer\r\n"; buf_ << "Application-GUID: {5D3E02AB-6190-11d3-BBBB-00C04F795683}\r\n"; buf_ << "Invitation-Command: INVITE\r\n"; buf_ << "Invitation-Cookie: " << inv->cookie << "\r\n"; buf_ << "Application-File: " << basename << "\r\n"; buf_ << "Application-FileSize: " << inv->fileSize << "\r\n"; buf_ << "\r\n"; Message *msg = new Message(buf_.str()); msg->setHeader("Content-Type", "text/x-msmsgsinvite; charset=UTF-8"); this->sendMessage(msg); this->invitationsSent.push_back(inv); delete msg; this->myNotificationServer()->externalCallbacks.fileTransferProgress(inv, "Negotiating connection", 0, 0); return inv; } } centerim-4.22.10/libmsn/msn/authdata.h0000644000175000001440000000217111461606612014434 00000000000000#ifndef __msn_authdata_h__ #define __msn_authdata_h__ /* * authdata.h * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include namespace MSN { class AuthData { public: Passport username; AuthData(Passport username_) : username(username_) {}; virtual ~AuthData() {}; }; } #endif centerim-4.22.10/libmsn/msn/filetransfer.h0000644000175000001440000001465411461606612015336 00000000000000#ifndef __msn_filetransfer_h__ #define __msn_filetransfer_h__ /* * filetransfer.h * libmsn * * Created by Mark Rowe on Wed Mar 17 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #include namespace MSN { /** Contains information about the invitation that was sent or received when * a file transfer was initiated. */ class FileTransferInvitation : public Invitation { public: /** The name of the file that is being transferred. */ std::string fileName; /** The size in bytes of the file that is being transferred. */ long unsigned fileSize; /** A pointer to user-specified data that can be used to identify this * transfer. */ void * userData; /** Create a new FileTransferInvitation. * * @todo Do all of these parameters really need to be in the constructor? */ FileTransferInvitation(Invitation::ApplicationType application_, std::string cookie_, Passport otherUser_, SwitchboardServerConnection * switchboardConnection_, std::string fileName_, long unsigned fileSize_, void *userData_ = NULL) : Invitation(application_, cookie_, otherUser_, switchboardConnection_), fileName(fileName_), fileSize(fileSize_), userData(userData_) {}; /** The remote side accepted our file transfer. Notify calling code. */ virtual void invitationWasAccepted(const std::string & body); /** The remote side canceled our file transfer. Notify calling code. */ virtual void invitationWasCanceled(const std::string & body); /** The user wishes to accept the file transfer, and have the file * written to @a destinationFile. * * @todo Should the received data be passed back to the user to store * in the file? This would remove some of the complexity in the * file transfer code. */ void acceptTransfer(const std::string & destinationFile); /** The user wishes to decline the file transfer. */ void rejectTransfer(); /** The user wishes to cancel the file transfer. */ void cancelTransfer(); private: void sendFile(const std::string & msg_body); void receiveFile(const std::string & msg_body); }; /** Represents a connection to another users computer for the purpose of * transferring a file. * * @todo Finish refactoring to store progress explicitly rather than in * a complex combination of member variables. */ class FileTransferConnection : public Connection { public: /** Are we sending or receiving the file? */ typedef enum { MSNFTP_SEND, MSNFTP_RECV } Direction; /** Are we being connected to or connecting to them? */ typedef enum { MSNFTP_SERVER, MSNFTP_CLIENT } Perspective; /** How far through the process are we? */ typedef enum { WAITING_FOR_CONNECTION, NEGOTIATING, TRANSFERRING } Progress; /** AuthData contains authentication information * relating to a FileTransferConnection. */ class AuthData : public ::MSN::AuthData { public: std::string cookie; Direction direction; Perspective perspective; FileTransferInvitation *inv; FILE *fd; bool connected; unsigned long bytes_done; int num_ignore; AuthData(Passport username_, std::string cookie_, Direction direction_, FileTransferInvitation *inv_=NULL, FILE *fd_=NULL, bool connected_=false, unsigned long bytes_done_=0) : ::MSN::AuthData(username_), cookie(cookie_), direction(direction_), perspective((direction == MSNFTP_RECV ? MSNFTP_CLIENT : MSNFTP_SERVER)), inv(inv_), fd(fd_), connected(connected_), bytes_done(bytes_done_), num_ignore(0) {}; virtual ~AuthData() { if (fd) fclose(fd); }; }; FileTransferConnection::AuthData auth; FileTransferConnection(AuthData & auth_) : Connection(), auth(auth_) {}; virtual ~FileTransferConnection(); /** @todo Should this really be an empty function? */ virtual void connect(const std::string & hostname, unsigned int port) {}; virtual void disconnect(); virtual void dispatchCommand(std::vector & args) {}; virtual void socketIsWritable(); virtual void socketConnectionCompleted(); virtual void dataArrivedOnSocket(); virtual NotificationServerConnection *myNotificationServer() { return switchboardConnection()->myNotificationServer(); }; protected: virtual void handleIncomingData(); private: void handleSend(); void handleReceive(); void handleSend_WaitingForConnection(); void handleSend_Negotiating(); void handleSend_Transferring(); void handleSend_Bye(); void handleReceive_Negotiating(); void handleReceive_Transferring(); SwitchboardServerConnection *switchboardConnection() { return this->auth.inv->switchboardConnection; }; }; } #endif centerim-4.22.10/libmsn/msn/message.h0000644000175000001440000001403511461606612014267 00000000000000#ifndef __msn_message_h__ #define __msn_message_h__ /* * message.h * libmsn * * Created by Mark Rowe on Wed Mar 17 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include namespace MSN { /** This class represents an MSN message * * It may or may not represent an @e instant @e message. * * @todo Complete read/write support for formatting messages. */ class Message { public: enum FontEffects { BOLD_FONT = 1, ITALIC_FONT = 2, UNDERLINE_FONT = 4, STRIKETHROUGH_FONT = 8 }; enum CharacterSet { ANSI_CHARSET = 0x00, DEFAULT_CHARSET = 0x01, SYMBOL_CHARSET = 0x02, MAC_CHARSET = 0x4d, SHIFTJIS_CHARSET = 0x80, HANGEUL_CHARSET = 0x81, JOHAB_CHARSET = 0x82, GB2312_CHARSET = 0x86, CHINESEBIG5_CHARSET = 0x88, GREEK_CHARSET = 0xa1, TURKISH_CHARSET = 0xa2, VIETNAMESE_CHARSET = 0xa3, HEBREW_CHARSET = 0xb1, ARABIC_CHARSET = 0xb2, BALTIC_CHARSET = 0xba, RUSSIAN_CHARSET_DEFAULT = 0xcc, THAI_CHARSET = 0xde, EASTEUROPE_CHARSET = 0xee, OEM_DEFAULT = 0xff }; enum FontFamily { FF_DONTCARE = 0, FF_ROMAN = 1, FF_SWISS = 2, FF_MODERN = 3, FF_SCRIPT = 4, FF_DECORATIVE = 5 }; enum FontPitch { DEFAULT_PITCH = 0, FIXED_PITCH = 1, VARIABLE_PITCH = 2 }; class Headers { public: Headers(const std::string & rawContents_) : rawContents(rawContents_) {}; Headers() : rawContents("") {}; std::string asString() const; std::string operator[](const std::string header) const; void setHeader(const std::string header, const std::string value); private: std::string rawContents; }; private: std::string body; Message::Headers header; public: /** Create a message with the specified @a body and @a mimeHeader. */ Message(std::string body, std::string mimeHeader="MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\n"); /** Convert the Message into a string. * * This returns a string containing the MIME headers separated from the * message body by a blank line. */ std::string asString() const; /** Return the value of the MIME header named @a header. * * @return The value of the MIME header if present, or "" if not found. */ std::string operator[](const std::string header) const; void setHeader(const std::string name, const std::string value) { header.setHeader(name, value); }; /** Return the body portion of this Message. */ const std::string & getBody() const { return body; }; /** Return the font name used in this Message. * * @return The font name used for this Message, or "" if none specified. */ const std::string getFontName() const; /** Set font name for use in this Message. */ void setFontName(const std::string & fontName); /** Get the color used in this Message. */ const std::vector getColor() const; const std::string getColorAsHTMLString() const; /** Set the color used in this Message. */ void setColor(std::vector color); void setColor(std::string color); void setColor(int red, int green, int blue); /** Return the font effects used in this Message. * * @return An integer that is a bitwise-or of Message::FontEffects members. */ const int getFontEffects() const; /** Set the font effects for use in this Message. * * @param fontEffects Bitwise-or of Message::FontEffects members. */ void setFontEffects(int fontEffects); /** Return the character set that the font uses in this Message. */ const CharacterSet getFontCharacterSet() const; /** Set the character set that the font should use for this Message. */ void setFontCharacterSet(CharacterSet cs); /** Return the font family used in this Message. */ const FontFamily getFontFamily() const; /** Return the font pitch used in this Message. */ const FontPitch getFontPitch() const; /** Set the font family and pitch to be used for this Message. */ void setFontFamilyAndPitch(Message::FontFamily fontFamily, Message::FontPitch fontPitch); /** Is the Message to be right-aligned? */ const bool isRightAligned() const; private: std::map getFormatInfo() const throw (std::runtime_error); void setFormatInfo(std::map & info); }; } #endif centerim-4.22.10/libmsn/msn/notificationserver.h0000644000175000001440000003154211461606612016562 00000000000000#ifndef __msn_notificationserver_h__ #define __msn_notificationserver_h__ /* * notificationserver.h * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #include #include namespace MSN { class SwitchboardServerConnection; /** Contains information about synchronising the contact list with the server. */ class ListSyncInfo { public: /** Constants specifying the status of the list synchronisation. */ enum SyncProgress { LST_FL = 1, /**< Forward list has been received. */ LST_AL = 2, /**< Allow list has been received. */ LST_BL = 4, /**< Block list has been received. */ LST_RL = 8, /**< Reverse list has been received. */ COMPLETE_BLP = 16, /**< @c BLP has been received. */ COMPLETE_GTC = 32 /**< @c GTC has been received. */ }; /** Treat unknown users as if appearing on this list when they attempt * to initiate a switchboard session. */ enum PrivacySetting { ALLOW = 'A', BLOCK = 'B' }; /** Action to take when a new user appears on our reverse list. */ enum NewReverseListEntryAction { PROMPT = 'A', DONT_PROMPT = 'N' }; /** A list of people who's statuses we are wish to be notified about. */ std::list forwardList; /** A list of people that are interested in our status. */ std::list reverseList; /** A list of people we allow to see our status. */ std::list allowList; /** A list of people we disallow from seeing our status. */ std::list blockList; std::map groups; /** The progress of the sync operation. */ unsigned int progress; unsigned int usersRemaining, groupsRemaining; /** The version of the contact list to request. */ unsigned int listVersion; /** Specifies the default list for non-buddies to be treated as * appearing in when attempting to invite you into a switchboard setting. * * This corresponds to the @c BLP command in the MSN protocol. */ char privacySetting; /** Specifies whether the user should be prompted when a new buddy * appears on their reverse list. * * This corresponds to the @c GTC command in the MSN protocol. */ char reverseListPrompting; ListSyncInfo(int listVersion_) : progress(0), listVersion(listVersion_), privacySetting(ListSyncInfo::ALLOW), reverseListPrompting(ListSyncInfo::PROMPT) {}; }; // Intermediate steps in connection: class connectinfo // : public callback_data { public: Passport username; std::string password; std::string cookie; connectinfo(const Passport & username_, const std::string & password_) : username(username_), password(password_), cookie("") {}; }; /** Represents a connection to a MSN notification server. * * The MSN notification server is responsible for dealing with the contact * list, online status, and dispatching message requests or invitations to * or from switchboard servers. */ class NotificationServerConnection : public Connection { private: typedef void (NotificationServerConnection::*NotificationServerCallback)(std::vector & args, int trid, void *); class AuthData : public ::MSN::AuthData { public: std::string password; AuthData(const Passport & passport_, const std::string & password_) : ::MSN::AuthData(passport_), password(password_) {} ; }; NotificationServerConnection::AuthData auth; int synctrid; public: /** Create a NotificationServerConnection with the specified authentication data */ NotificationServerConnection(AuthData & auth_, Callbacks & cb); /** Create a NotificationServerConnection with the specified @a username and * @a password. */ NotificationServerConnection(Passport username, std::string password, Callbacks & cb); /** Create a NotificationServerConnection with no specified username or password. */ NotificationServerConnection(Callbacks & cb); virtual ~NotificationServerConnection(); virtual void dispatchCommand(std::vector & args); /** Return a list of SwitchboardServerConnection's that have been started * from this NotificationServerConnection. */ const std::list & switchboardConnections(); /** Add a SwitchboardServerConnection to the list of connections that have * been started from this connection. */ void addSwitchboardConnection(SwitchboardServerConnection *); /** Remove a SwitchboardServerConnection from the list of connections that have * beep started from this connection. */ void removeSwitchboardConnection(SwitchboardServerConnection *); /** Return a connection that is associated with @a fd. * * If @a fd is equal to @p sock, @c this is returned. Otherwise * connectionWithSocket is sent to each SwitchboardServerConnection * until a match is found. * * @return The matching connection, if found. Otherwise, @c NULL. */ Connection *connectionWithSocket(int fd); /** Return a SwitchboardServerConnection that has exactly one user whose * username is @a username. * * @return The matching SwitchboardServerConnection, or @c NULL. */ SwitchboardServerConnection *switchboardWithOnlyUser(Passport username); /** @name Action Methods * * These methods all perform actions on the notification server. */ /** @{ */ /** Set our online state to @a state. */ void setState(BuddyStatus state); void setBLP(char setting); void setGTC(char setting); /** Set our friendly name to @a friendlyName. * * @param friendlyName Maximum allowed length is 387 characters after URL-encoding. */ void setFriendlyName(std::string friendlyName) throw (std::runtime_error); /** Add buddy named @a buddyName to the list named @a list. */ void addToList(std::string list, Passport buddyName); /** Remove buddy named @a budydName from the list named @a list. */ void removeFromList(std::string list, Passport buddyName); void addToGroup(Passport, int groupID); void removeFromGroup(Passport buddyName, int groupID); void addGroup(std::string groupName); void removeGroup(int groupId); void renameGroup(int groupId, std::string newGroupName); /** Request the server side buddy list. * * @param version if @a version is specified the server will respond with * the changes necessary to update the list to the latest * version. Otherwise the entire list will be sent. */ void synchronizeLists(int version=0); /** Send a 'keep-alive' ping to the server. */ void sendPing(); /** Request a switchboard connection with @a username. @a msg will be sent when * @a username joins the switchboard. */ // void requestSwitchboardConnection(Passport username, Message *msg, void *tag); /** Request a switchboard connection. */ void requestSwitchboardConnection(const void *tag); /** @} */ void checkReverseList(ListSyncInfo *); virtual void connect(const std::string & hostname, unsigned int port); virtual void connect(const std::string & hostname, unsigned int port, const Passport & username, const std::string & password); virtual void disconnect(); /** Add a callback of @a cb to this connection for response with ID of @a trid. * * @todo void * is bad. */ virtual void addCallback(NotificationServerCallback cb, int trid, void *data); /** Remove callbacks assocated with responses with ID of @a trid. */ virtual void removeCallback(int trid); virtual void socketConnectionCompleted(); enum NotificationServerState { NS_DISCONNECTED, NS_CONNECTING, NS_CONNECTED, NS_SYNCHRONISING, NS_ONLINE }; NotificationServerState connectionState() const { return this->_connectionState; }; unsigned int nextPing() { return this->_nextPing; }; Callbacks & externalCallbacks; virtual NotificationServerConnection *myNotificationServer() { return this; }; protected: virtual void handleIncomingData(); NotificationServerState _connectionState; unsigned int _nextPing; void setConnectionState(NotificationServerState s) { this->_connectionState = s; }; void assertConnectionStateIs(NotificationServerState s) { assert(this->_connectionState == s); }; void assertConnectionStateIsNot(NotificationServerState s) { assert(this->_connectionState != s); }; void assertConnectionStateIsAtLeast(NotificationServerState s) { assert(this->_connectionState >= s); }; private: std::list _switchboardConnections; std::map > callbacks; virtual void disconnectForTransfer(); std::map &)> commandHandlers; void registerCommandHandlers(); void handle_OUT(std::vector & args); void handle_ADD(std::vector & args); void handle_REM(std::vector & args); void handle_BLP(std::vector & args); void handle_GTC(std::vector & args); void handle_REA(std::vector & args); void handle_CHG(std::vector & args); void handle_CHL(std::vector & args); void handle_ILN(std::vector & args); void handle_NLN(std::vector & args); void handle_NOT(std::vector & args); void handle_FLN(std::vector & args); void handle_MSG(std::vector & args); void handle_RNG(std::vector & args); void handle_ADG(std::vector & args); void handle_RMG(std::vector & args); void handle_REG(std::vector & args); void callback_SyncData(std::vector & args, int trid, void *data) throw (std::runtime_error); void callback_NegotiateCVR(std::vector & args, int trid, void *data); void callback_TransferToSwitchboard(std::vector & args, int trid, void *data); void callback_RequestUSR(std::vector & args, int trid, void *data); void callback_PassportAuthentication(std::vector & args, int trid, void * data); void callback_AuthenticationComplete(std::vector & args, int trid, void * data); }; } #endif centerim-4.22.10/libmsn/msn/externals.h0000644000175000001440000001107211461606612014646 00000000000000#ifndef __msn_externals_h__ #define __msn_externals_h__ /* * externals.h * libmsn * * Created by Meredydd Luff. * Copyright (c) 2004 Meredydd Luff. All rights reserved. * * 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 namespace MSN { class ListSyncInfo; class Callbacks { public: virtual void registerSocket(int s, int read, int write) = 0; virtual void unregisterSocket(int s) = 0; virtual void showError(MSN::Connection * conn, std::string msg) = 0; virtual void buddyChangedStatus(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname, MSN::BuddyStatus state) = 0; virtual void buddyOffline(MSN::Connection * conn, MSN::Passport buddy) = 0; virtual void log(int writing, const char* buf) = 0; virtual void gotFriendlyName(MSN::Connection * conn, std::string friendlyname) = 0; virtual void gotBuddyListInfo(MSN::NotificationServerConnection * conn, MSN::ListSyncInfo * data) = 0; virtual void gotLatestListSerial(MSN::Connection * conn, int serial) = 0; virtual void gotGTC(MSN::Connection * conn, char c) = 0; virtual void gotBLP(MSN::Connection * conn, char c) = 0; virtual void gotNewReverseListEntry(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname) = 0; virtual void addedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID) = 0; virtual void removedListEntry(MSN::Connection * conn, std::string list, MSN::Passport buddy, int groupID) = 0; virtual void addedGroup(MSN::Connection * conn, std::string groupName, int groupID) = 0; virtual void removedGroup(MSN::Connection * conn, int groupID) = 0; virtual void renamedGroup(MSN::Connection * conn, int groupID, std::string newGroupName) = 0; virtual void gotSwitchboard(MSN::SwitchboardServerConnection * conn, const void * tag) = 0; virtual void buddyJoinedConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, int is_initial) = 0; virtual void buddyLeftConversation(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy) = 0; virtual void gotInstantMessage(MSN::SwitchboardServerConnection * conn, MSN::Passport buddy, std::string friendlyname, MSN::Message * msg) = 0; virtual void failedSendingMessage(MSN::Connection * conn) = 0; virtual void buddyTyping(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname) = 0; virtual void gotInitialEmailNotification(MSN::Connection * conn, int unread_inbox, int unread_folders) = 0; virtual void gotNewEmailNotification(MSN::Connection * conn, std::string from, std::string subject) = 0; virtual void gotFileTransferInvitation(MSN::Connection * conn, MSN::Passport buddy, std::string friendlyname, MSN::FileTransferInvitation * inv) = 0; virtual void fileTransferProgress(MSN::FileTransferInvitation * inv, std::string status, unsigned long recv, unsigned long total) = 0; virtual void fileTransferFailed(MSN::FileTransferInvitation * inv, int error, std::string message) = 0; virtual void fileTransferSucceeded(MSN::FileTransferInvitation * inv) = 0; virtual void gotNewConnection(MSN::Connection * conn) = 0; virtual void closingConnection(MSN::Connection * conn) = 0; virtual void changedStatus(MSN::Connection * conn, MSN::BuddyStatus state) = 0; virtual int connectToServer(std::string server, int port, bool *connected) = 0; virtual int listenOnPort(int port) = 0; virtual std::string getOurIP() = 0; virtual std::string getSecureHTTPProxy() = 0; }; } #endif centerim-4.22.10/libmsn/msn/authdata.cpp0000644000175000001440000000155611461606612014775 00000000000000/* * authdata.cpp * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 centerim-4.22.10/libmsn/msn/Makefile.in0000644000175000001440000004153311473011437014540 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libmsn/msn DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libmsn_a_AR = $(AR) $(ARFLAGS) @BUILD_MSN_FALSE@libmsn_a_DEPENDENCIES = dummy.o am__libmsn_a_SOURCES_DIST = authdata.cpp buddy.cpp connection.cpp \ filetransfer.cpp invitation.cpp message.cpp \ notificationserver.cpp passport.cpp switchboardserver.cpp \ util.cpp @BUILD_MSN_TRUE@am_libmsn_a_OBJECTS = authdata.$(OBJEXT) \ @BUILD_MSN_TRUE@ buddy.$(OBJEXT) connection.$(OBJEXT) \ @BUILD_MSN_TRUE@ filetransfer.$(OBJEXT) invitation.$(OBJEXT) \ @BUILD_MSN_TRUE@ message.$(OBJEXT) notificationserver.$(OBJEXT) \ @BUILD_MSN_TRUE@ passport.$(OBJEXT) switchboardserver.$(OBJEXT) \ @BUILD_MSN_TRUE@ util.$(OBJEXT) libmsn_a_OBJECTS = $(am_libmsn_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libmsn_a_SOURCES) DIST_SOURCES = $(am__libmsn_a_SOURCES_DIST) am__noinst_HEADERS_DIST = authdata.h buddy.h connection.h errorcodes.h \ externals.h filetransfer.h invitation.h md5.h message.h msn.h \ notificationserver.h passport.h sstream_fix.h \ switchboardserver.h util.h HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)//connwrap -I$(top_srcdir)/libmsn noinst_LIBRARIES = libmsn.a @BUILD_MSN_TRUE@noinst_HEADERS = authdata.h buddy.h connection.h errorcodes.h externals.h filetransfer.h invitation.h md5.h message.h msn.h notificationserver.h passport.h sstream_fix.h switchboardserver.h util.h @BUILD_MSN_TRUE@libmsn_a_SOURCES = authdata.cpp buddy.cpp connection.cpp filetransfer.cpp invitation.cpp message.cpp notificationserver.cpp passport.cpp switchboardserver.cpp util.cpp @BUILD_MSN_FALSE@libmsn_a_LIBADD = dummy.o all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libmsn/msn/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu libmsn/msn/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmsn.a: $(libmsn_a_OBJECTS) $(libmsn_a_DEPENDENCIES) -rm -f libmsn.a $(libmsn_a_AR) libmsn.a $(libmsn_a_OBJECTS) $(libmsn_a_LIBADD) $(RANLIB) libmsn.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authdata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buddy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filetransfer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invitation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/notificationserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/switchboardserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am @BUILD_MSN_FALSE@dummy.cpp: @BUILD_MSN_FALSE@ touch dummy.cpp # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/libmsn/msn/passport.cpp0000644000175000001440000000441011461606612015045 00000000000000/* * passport.cpp * libmsn * * Created by Mark Rowe on Thu May 20 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include namespace MSN { void Passport::validate() { if (email.find(" ") != std::string::npos) throw InvalidPassport("Passport must not contain any spaces!"); if (email.find("@") == std::string::npos || email.find("@") != email.rfind("@")) throw InvalidPassport("Passport must contain exactly one '@' character!"); if (email.find("@") == 0) throw InvalidPassport("Passport must have at least one character before the '@'!"); if (email.find(".", email.find("@")) == std::string::npos) throw InvalidPassport("Passport must have at least one '.' after the '@'!"); if (email.find(".", email.find("@")) - email.find("@") < 2) throw InvalidPassport("Passport must have at least one character between the '@' and the '.'!"); if (email[email.size() - 1] == '.') throw InvalidPassport("Passport must not end with a '.' character!"); if (email.size() < 5) throw InvalidPassport("Passport must contain at least 5 characters!"); } Passport::operator std::string() const { return email; } const char *Passport::c_str() const { return email.c_str(); } } std::ostream & operator <<(std::ostream & os, const MSN::Passport & passport) { return os << std::string(passport); } centerim-4.22.10/libmsn/msn/notificationserver.cpp0000644000175000001440000011646711461606612017127 00000000000000/* * notificationserver.cpp * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #include #include #include #include #ifndef WIN32 #include #else #include #endif #include #include #ifndef curl_free #define curl_free free #endif namespace MSN { static size_t msn_handle_curl_write(void *ptr, size_t size, size_t nmemb, void *stream); static size_t msn_handle_curl_header(void *ptr, size_t size, size_t nmemb, void *stream) ; NotificationServerConnection::NotificationServerConnection(NotificationServerConnection::AuthData & auth_, Callbacks & cb_) : Connection(), auth(auth_), externalCallbacks(cb_), _connectionState(NS_DISCONNECTED), _nextPing(50), commandHandlers() { registerCommandHandlers(); } NotificationServerConnection::NotificationServerConnection(Passport username_, std::string password_, Callbacks & cb_) : Connection(), auth(username_, password_), externalCallbacks(cb_), _connectionState(NS_DISCONNECTED), commandHandlers() { registerCommandHandlers(); } NotificationServerConnection::NotificationServerConnection(Callbacks & cb_) : Connection(), auth(Passport(), ""), externalCallbacks(cb_), _connectionState(NS_DISCONNECTED), commandHandlers() { registerCommandHandlers(); } NotificationServerConnection::~NotificationServerConnection() { if (this->connectionState() != NS_DISCONNECTED) this->disconnect(); } Connection *NotificationServerConnection::connectionWithSocket(int fd) { this->assertConnectionStateIsNot(NS_DISCONNECTED); std::list & list = _switchboardConnections; std::list::iterator i = list.begin(); if (this->sock == fd) return this; for (; i != list.end(); i++) { Connection *c = (*i)->connectionWithSocket(fd); if (c) return c; } return NULL; } SwitchboardServerConnection *NotificationServerConnection::switchboardWithOnlyUser(Passport username) { if (this->connectionState() >= NS_CONNECTED) { std::list & list = _switchboardConnections; std::list::iterator i = list.begin(); for (; i != list.end(); i++) { if ((*i)->users.size() == 1 && *((*i)->users.begin()) == username) return *i; } } return NULL; } const std::list & NotificationServerConnection::switchboardConnections() { this->assertConnectionStateIsAtLeast(NS_CONNECTED); return _switchboardConnections; } void NotificationServerConnection::addSwitchboardConnection(SwitchboardServerConnection *c) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); _switchboardConnections.push_back(c); } void NotificationServerConnection::removeSwitchboardConnection(SwitchboardServerConnection *c) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); _switchboardConnections.remove(c); } void NotificationServerConnection::addCallback(NotificationServerCallback callback, int trid, void *data) { this->assertConnectionStateIsAtLeast(NS_CONNECTING); this->callbacks[trid] = std::make_pair(callback, data); } void NotificationServerConnection::removeCallback(int trid) { this->assertConnectionStateIsAtLeast(NS_CONNECTING); this->callbacks.erase(trid); } void NotificationServerConnection::registerCommandHandlers() { if (commandHandlers.size() == 0) { commandHandlers["OUT"] = &NotificationServerConnection::handle_OUT; commandHandlers["ADD"] = &NotificationServerConnection::handle_ADD; commandHandlers["REM"] = &NotificationServerConnection::handle_REM; commandHandlers["BLP"] = &NotificationServerConnection::handle_BLP; commandHandlers["GTC"] = &NotificationServerConnection::handle_GTC; commandHandlers["REA"] = &NotificationServerConnection::handle_REA; commandHandlers["CHG"] = &NotificationServerConnection::handle_CHG; commandHandlers["CHL"] = &NotificationServerConnection::handle_CHL; commandHandlers["ILN"] = &NotificationServerConnection::handle_ILN; commandHandlers["NLN"] = &NotificationServerConnection::handle_NLN; commandHandlers["NOT"] = &NotificationServerConnection::handle_NOT; commandHandlers["FLN"] = &NotificationServerConnection::handle_FLN; commandHandlers["MSG"] = &NotificationServerConnection::handle_MSG; commandHandlers["ADG"] = &NotificationServerConnection::handle_ADG; commandHandlers["RMG"] = &NotificationServerConnection::handle_RMG; commandHandlers["REG"] = &NotificationServerConnection::handle_REG; } } void NotificationServerConnection::dispatchCommand(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::map &)>::iterator i = commandHandlers.find(args[0]); if (i != commandHandlers.end()) (this->*commandHandlers[args[0]])(args); } void NotificationServerConnection::handle_OUT(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); if (args.size() > 1) { if (args[1] == "OTH") { this->myNotificationServer()->externalCallbacks.showError(this, "You have logged onto MSN twice at once. Your MSN session will now terminate."); } else if (args[1] == "SSD") { this->myNotificationServer()->externalCallbacks.showError(this, "This MSN server is going down for maintenance. Your MSN session will now terminate."); } else { this->myNotificationServer()->externalCallbacks.showError(this, (std::string("The MSN server has terminated the connection with an unknown reason code. Please report this code: ") + args[1]).c_str()); } } this->disconnect(); } void NotificationServerConnection::handle_ADD(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); if (args[2] == "RL") { this->myNotificationServer()->externalCallbacks.gotNewReverseListEntry(this, args[4], decodeURL(args[5])); } else { int groupID = -1; if (args.size() > 5) groupID = decimalFromString(args[5]); this->myNotificationServer()->externalCallbacks.addedListEntry(this, args[2], args[4], groupID); } this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this, decimalFromString(args[3])); } void NotificationServerConnection::handle_REM(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); int groupID = -1; if (args.size() > 4) groupID = decimalFromString(args[4]); this->myNotificationServer()->externalCallbacks.removedListEntry(this, args[2], args[4], groupID); this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this, decimalFromString(args[3])); } void NotificationServerConnection::handle_BLP(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.gotBLP(this, args[3][0]); this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this, decimalFromString(args[3])); } void NotificationServerConnection::handle_GTC(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.gotGTC(this, args[3][0]); this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this, decimalFromString(args[3])); } void NotificationServerConnection::handle_REA(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.gotFriendlyName(this, decodeURL(args[4])); this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this, decimalFromString(args[2])); } void NotificationServerConnection::handle_CHG(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.changedStatus(this, buddyStatusFromString(args[2])); } void NotificationServerConnection::handle_CHL(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); md5_state_t state; md5_byte_t digest[16]; int a; md5_init(&state); md5_append(&state, (md5_byte_t *)(args[2].c_str()), (int) args[2].size()); md5_append(&state, (md5_byte_t *)"VT6PX?UQTM4WM%YR", 16); md5_finish(&state, digest); std::ostringstream buf_; buf_ << "QRY " << this->trID++ << " PROD0038W!61ZTF9 32\r\n"; if (write(buf_) != buf_.str().size()) return; char hexdigest[3]; for (a = 0; a < 16; a++) { sprintf(hexdigest, "%02x", digest[a]); write(std::string(hexdigest, 2), false); } } void NotificationServerConnection::handle_ILN(std::vector & args) { this->assertConnectionStateIs(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.buddyChangedStatus(this, args[3], "", buddyStatusFromString(args[2])); } void NotificationServerConnection::handle_NLN(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.buddyChangedStatus(this, args[2], "", buddyStatusFromString(args[1])); } void NotificationServerConnection::handle_NOT(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); int notlen = decimalFromString(args[1]); this->readBuffer = this->readBuffer.substr(notlen); } void NotificationServerConnection::handle_FLN(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.buddyOffline(this, args[1]); } void NotificationServerConnection::handle_MSG(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); Connection::handle_MSG(args); } void NotificationServerConnection::handle_RNG(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); SwitchboardServerConnection::AuthData auth = SwitchboardServerConnection::AuthData(this->auth.username, args[1], args[4]); SwitchboardServerConnection *newSBconn = new SwitchboardServerConnection(auth, *this); this->addSwitchboardConnection(newSBconn); std::pair server_address = splitServerAddress(args[2]); newSBconn->connect(server_address.first, server_address.second); } void NotificationServerConnection::handle_ADG(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.addedGroup(this, decodeURL(args[3]), decimalFromString(args[4])); this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this, decimalFromString(args[2])); } void NotificationServerConnection::handle_RMG(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.removedGroup(this, decimalFromString(args[3])); this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this, decimalFromString(args[2])); } void NotificationServerConnection::handle_REG(std::vector & args) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->myNotificationServer()->externalCallbacks.renamedGroup(this, decimalFromString(args[3]), decodeURL(args[4])); this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this, decimalFromString(args[2])); } void NotificationServerConnection::setState(BuddyStatus state) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "CHG " << this->trID++ << " " << buddyStatusToString(state) << " 0\r\n"; write(buf_); } void NotificationServerConnection::setBLP(char setting) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "BLP " << this->trID++ << " " << setting << "L\r\n"; write(buf_); } void NotificationServerConnection::setGTC(char setting) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "GTC " << this->trID++ << " " << setting << "\r\n"; write(buf_); } void NotificationServerConnection::setFriendlyName(std::string friendlyName) throw (std::runtime_error) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); if (friendlyName.size() > 387) throw std::runtime_error("Friendly name too long!"); std::ostringstream buf_; buf_ << "REA " << this->trID++ << " " << this->auth.username << " " << encodeURL(friendlyName) << "\r\n"; write(buf_); } void NotificationServerConnection::addToList(std::string list, Passport buddyName) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "ADD " << this->trID++ << " " << list << " " << buddyName << " " << buddyName << "\r\n"; write(buf_); } void NotificationServerConnection::removeFromList(std::string list, Passport buddyName) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "REM " << this->trID++ << " " << list << " " << buddyName << "\r\n"; write(buf_); } void NotificationServerConnection::addToGroup(Passport buddyName, int groupID) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "ADD " << this->trID++ << " " << "FL" << " " << buddyName << " " << buddyName << " " << groupID << "\r\n"; write(buf_); } void NotificationServerConnection::removeFromGroup(Passport buddyName, int groupID) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "REM " << this->trID++ << " " << "FL" << " " << buddyName; if( groupID > 0 ) { buf_ << " " << groupID; } buf_ << "\r\n"; write(buf_); } void NotificationServerConnection::addGroup(std::string groupName) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "ADG " << this->trID++ << " " << encodeURL(groupName) << " " << 0 << "\r\n"; write(buf_); } void NotificationServerConnection::removeGroup(int groupID) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "RMG " << this->trID++ << " " << groupID << "\r\n"; write(buf_); } void NotificationServerConnection::renameGroup(int groupID, std::string newGroupName) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); std::ostringstream buf_; buf_ << "REG " << this->trID++ << " " << groupID << " " << encodeURL(newGroupName) << " " << 0 << "\r\n"; write(buf_); } void NotificationServerConnection::synchronizeLists(int version) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); this->assertConnectionStateIsNot(NS_SYNCHRONISING); ListSyncInfo *info = new ListSyncInfo(version); std::ostringstream buf_; buf_ << "SYN " << this->trID << " " << version << "\r\n"; if (write(buf_) != buf_.str().size()) return; this->addCallback(&NotificationServerConnection::callback_SyncData, this->trID, (void *)info); this->synctrid = this->trID++; this->setConnectionState(NS_SYNCHRONISING); } void NotificationServerConnection::sendPing() { this->assertConnectionStateIsAtLeast(NS_CONNECTED); write("PNG\r\n"); } void NotificationServerConnection::requestSwitchboardConnection(const void *tag) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); SwitchboardServerConnection::AuthData *auth = new SwitchboardServerConnection::AuthData(this->auth.username, tag); std::ostringstream buf_; buf_ << "XFR " << this->trID << " SB\r\n"; if (write(buf_) != buf_.str().size()) return; this->addCallback(&NotificationServerConnection::callback_TransferToSwitchboard, this->trID++, (void *)auth); } template class _sameUserName { Buddy buddy; public: _sameUserName(const _Tp &__u) : buddy(__u) {}; bool operator()(const _Tp &__x) { return __x.userName == buddy.userName; } }; void NotificationServerConnection::checkReverseList(ListSyncInfo *info) { std::list & flist = info->reverseList; std::list & alist = info->allowList; std::list & blist = info->blockList; std::list::iterator flist_i; std::list::iterator alist_i; std::list::iterator blist_i; for (flist_i = flist.begin(); flist_i != flist.end(); flist_i++) { if (std::count_if(alist.begin(), alist.end(), _sameUserName(*flist_i)) == 0 && std::count_if(blist.begin(), blist.end(), _sameUserName(*flist_i)) == 0) { this->myNotificationServer()->externalCallbacks.gotNewReverseListEntry(this, (*flist_i).userName, (*flist_i).friendlyName); } } } void NotificationServerConnection::socketConnectionCompleted() { this->assertConnectionStateIs(NS_CONNECTING); this->setConnectionState(NS_CONNECTED); Connection::socketConnectionCompleted(); // If an error occurs in Connection::socketConnectionCompleted, we // will be disconnected before we get here. if (this->connectionState() != NS_DISCONNECTED) { this->myNotificationServer()->externalCallbacks.unregisterSocket(this->sock); this->myNotificationServer()->externalCallbacks.registerSocket(this->sock, 1, 0); } } void NotificationServerConnection::connect(const std::string & hostname, unsigned int port) { this->assertConnectionStateIs(NS_DISCONNECTED); connectinfo *info = new connectinfo(this->auth.username, this->auth.password); if ((this->sock = this->myNotificationServer()->externalCallbacks.connectToServer(hostname, port, &this->connected)) == -1) { this->myNotificationServer()->externalCallbacks.showError(this, "Could not connect to MSN server"); this->myNotificationServer()->externalCallbacks.closingConnection(this); return; } this->setConnectionState(NS_CONNECTING); this->myNotificationServer()->externalCallbacks.registerSocket(this->sock, 0, 1); if (this->connected) this->socketConnectionCompleted(); std::ostringstream buf_; buf_ << "VER " << this->trID << " MSNP8\r\n"; if (this->write(buf_) != buf_.str().size()) return; this->addCallback(&NotificationServerConnection::callback_NegotiateCVR, this->trID++, (void *)info); } void NotificationServerConnection::connect(const std::string & hostname, unsigned int port, const Passport & username, const std::string & password) { this->auth.username = username; this->auth.password = password; this->connect(hostname, port); } void NotificationServerConnection::disconnect() { this->assertConnectionStateIsNot(NS_DISCONNECTED); std::list list = _switchboardConnections; std::list::iterator i = list.begin(); for (; i != list.end(); i++) { delete *i; } this->callbacks.clear(); this->setConnectionState(NS_DISCONNECTED); this->myNotificationServer()->externalCallbacks.closingConnection(this); Connection::disconnect(); } void NotificationServerConnection::disconnectForTransfer() { this->assertConnectionStateIsNot(NS_DISCONNECTED); this->myNotificationServer()->externalCallbacks.unregisterSocket(this->sock); ::close(this->sock); this->setConnectionState(NS_DISCONNECTED); } void NotificationServerConnection::handleIncomingData() { this->assertConnectionStateIsAtLeast(NS_CONNECTED); while (this->isWholeLineAvailable()) { std::vector args = this->getLine(); if ((args.size() >= 4 && args[0] == "MSG") || (args.size() >= 2 && (args[0] == "NOT" || args[0] == "IPG"))) { int dataLength; if (args[0] == "MSG") dataLength = decimalFromString(args[3]); else dataLength = decimalFromString(args[1]); if (this->readBuffer.find("\r\n", 0) + 2 + dataLength > this->readBuffer.size()) { this->myNotificationServer()->externalCallbacks.showError(this, "Could not read buffer: too small"); return; } } this->readBuffer = this->readBuffer.substr(this->readBuffer.find("\r\n", 0) + 2); int trid = 0; if (args.size() >= 6 && args[0] == "XFR" && args[2] == "NS") { // XFR TrID NS NotificationServerIP:Port 0 ThisServerIP:Port // 0 1 2 3 4 5 this->callbacks.clear(); // delete the callback data this->disconnectForTransfer(); std::pair server_address = splitServerAddress(args[3]); this->connect(server_address.first, server_address.second); return; } if (args.size() >= 7 && args[0] == "RNG") { // RNG SessionID SwitchboardServerIP:Port CKI AuthString InvitingUser InvitingDisplayName // 0 1 2 3 4 5 6 this->handle_RNG(args); return; } if (args.size() >= 2 && args[0] == "QNG") { // QNG // 0 this->_nextPing = 50; return; } if ((args.size() >= 4 && (args[0] == "LST" || args[0] == "LSG")) || (args.size() >= 2 && (args[0] == "GTC" || args[0] == "BLP")) || (args.size() >= 3 && args[0] == "BPR") ) { // LST UserName FriendlyName UserLists [GroupNumbers] // 0 1 2 3 4 // // or // (GTC|BLP) [TrID] [ListVersion] Setting // 0 1 2 4 if (this->synctrid) { trid = this->synctrid; } else { trid = decimalFromString(args[1]); } } else if (args.size() > 1) { try { trid = decimalFromString(args[1]); } catch (...) { } } if (!this->callbacks.empty() && trid >= 0) { if (this->callbacks.find(trid) != this->callbacks.end()) { (this->*(this->callbacks[trid].first))(args, trid, this->callbacks[trid].second); continue; } } if (isdigit(args[0][0])) this->showError(decimalFromString(args[0])); else this->dispatchCommand(args); } } void NotificationServerConnection::callback_SyncData(std::vector & args, int trid, void *data) throw (std::runtime_error) { this->assertConnectionStateIs(NS_SYNCHRONISING); ListSyncInfo *info = static_cast(data); if (args[0] == "SYN") { if (info->listVersion == decimalFromString(args[2])) { delete info; info = NULL; this->removeCallback(trid); this->myNotificationServer()->externalCallbacks.gotBuddyListInfo(this, NULL); this->setConnectionState(NS_CONNECTED); return; } else { info->listVersion = decimalFromString(args[2]); info->usersRemaining = decimalFromString(args[3]); info->groupsRemaining = decimalFromString(args[4]); this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this, info->listVersion); } } else if (args[0] == "LST") { int list = decimalFromString(args[3]); if ((list & ListSyncInfo::LST_FL) == ListSyncInfo::LST_FL) { info->forwardList.push_back(Buddy(args[1], decodeURL(args[2]))); std::vector groups = splitString(args[4], ","); std::vector::iterator i = groups.begin(); for (; i != groups.end(); i++) { int group = atoi(i->c_str()); info->groups[group].buddies.push_back(&(info->forwardList.back())); info->forwardList.back().groups.push_back(&info->groups[group]); } } if ((list & ListSyncInfo::LST_RL) == ListSyncInfo::LST_RL) { info->reverseList.push_back(Buddy(args[1], decodeURL(args[2]))); } if ((list & ListSyncInfo::LST_AL) == ListSyncInfo::LST_AL) { info->allowList.push_back(Buddy(args[1], decodeURL(args[2]))); } if ((list & ListSyncInfo::LST_BL) == ListSyncInfo::LST_BL) { info->blockList.push_back(Buddy(args[1], decodeURL(args[2]))); } info->usersRemaining--; if (info->usersRemaining == 0) { info->progress |= ListSyncInfo::LST_FL | ListSyncInfo::LST_RL | ListSyncInfo::LST_AL | ListSyncInfo::LST_BL; } } else if (args[0] == "GTC") { info->reverseListPrompting = args[1][0]; info->progress |= ListSyncInfo::COMPLETE_GTC; this->myNotificationServer()->externalCallbacks.gotGTC(this, info->reverseListPrompting); } else if (args[0] == "BLP") { info->privacySetting = args[1][0]; info->progress |= ListSyncInfo::COMPLETE_BLP; this->myNotificationServer()->externalCallbacks.gotBLP(this, info->privacySetting); } else if (args[0] == "LSG") { int groupID = decimalFromString(args[1]); Group g(groupID, decodeURL(args[2])); info->groups[groupID] = g; info->groupsRemaining--; if (info->groupsRemaining == 0 && info->usersRemaining == 0) { info->progress |= ListSyncInfo::LST_FL | ListSyncInfo::LST_RL | ListSyncInfo::LST_AL | ListSyncInfo::LST_BL; } } else if (args[0] == "BPR") { bool enabled; if (decodeURL(args[2])[0] == 'Y') enabled = true; else enabled = false; info->forwardList.back().phoneNumbers.push_back(Buddy::PhoneNumber(args[1], decodeURL(args[2]), enabled)); } else throw std::runtime_error("Unexpected sync data"); if (info->progress == (ListSyncInfo::LST_FL | ListSyncInfo::LST_RL | ListSyncInfo::LST_AL | ListSyncInfo::LST_BL | ListSyncInfo::COMPLETE_BLP | ListSyncInfo::COMPLETE_GTC)) { this->removeCallback(trid); this->checkReverseList(info); this->myNotificationServer()->externalCallbacks.gotBuddyListInfo(this, info); this->synctrid = 0; delete info; this->setConnectionState(NS_CONNECTED); } else if (info->progress > 63 || info->progress < 0) throw std::runtime_error("Corrupt sync progress!"); } void NotificationServerConnection::callback_NegotiateCVR(std::vector & args, int trid, void *data) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); connectinfo * info = (connectinfo *) data; this->removeCallback(trid); if (args.size() >= 3 && args[0] != "VER" || args[2] != "MSNP8") // if either *differs*... { this->myNotificationServer()->externalCallbacks.showError(NULL, "Protocol negotiation failed"); delete info; this->disconnect(); return; } std::ostringstream buf_; buf_ << "CVR " << this->trID << " 0x0409 winnt 5.2 i386 MSNMSGR 7.5.0324 MSMSGS " << info->username << "\r\n"; if (this->write(buf_) != buf_.str().size()) return; this->addCallback(&NotificationServerConnection::callback_RequestUSR, this->trID++, (void *) data); } void NotificationServerConnection::callback_TransferToSwitchboard(std::vector & args, int trid, void *data) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); SwitchboardServerConnection::AuthData *auth = static_cast(data); this->removeCallback(trid); if (args[0] != "XFR") { this->showError(decimalFromString(args[0])); this->disconnect(); delete auth; return; } auth->cookie = args[5]; auth->sessionID = ""; SwitchboardServerConnection *newconn = new SwitchboardServerConnection(*auth, *this); this->addSwitchboardConnection(newconn); std::pair server_address = splitServerAddress(args[3]); newconn->connect(server_address.first, server_address.second); delete auth; } void NotificationServerConnection::callback_RequestUSR(std::vector & args, int trid, void *data) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); connectinfo *info = (connectinfo *)data; this->removeCallback(trid); if (args.size() > 1 && args[0] != "CVR") // if*differs*... { this->myNotificationServer()->externalCallbacks.showError(NULL, "Protocol negotiation failed"); delete info; this->disconnect(); return; } std::ostringstream buf_; buf_ << "USR " << this->trID << " TWN I " << info->username << "\r\n"; if (this->write(buf_) != buf_.str().size()) return; this->addCallback(&NotificationServerConnection::callback_PassportAuthentication, this->trID++, (void *) data); } void NotificationServerConnection::callback_PassportAuthentication(std::vector & args, int trid, void * data) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); connectinfo * info; CURL *curl; CURLcode ret; curl_slist *slist = NULL; std::string auth; char *uname, *pword; std::string proxy; info=(connectinfo *)data; this->removeCallback(trid); if (isdigit(args[0][0])) { this->showError(decimalFromString(args[0])); delete info; this->disconnect(); return; } if (args.size() >= 4 && args[4].empty()) { this->disconnect(); delete info; return; } /* Now to fire off some HTTPS login */ /* args[4] contains the most interesting part we need to send on */ curl = curl_easy_init(); if (curl == NULL) { this->disconnect(); delete info; return; } proxy = this->myNotificationServer()->externalCallbacks.getSecureHTTPProxy(); if (! proxy.empty()) ret = curl_easy_setopt(curl, CURLOPT_PROXY, proxy.c_str()); else ret = CURLE_OK; if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_URL, "https://login.passport.com/login2.srf"); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); uname = curl_escape(const_cast(info->username.c_str()), 0); pword = curl_escape(const_cast(info->password.c_str()), 0); auth = std::string("Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=") + uname + ",pwd=" + pword + ","+ args[4]; curl_free(uname); curl_free(pword); slist = curl_slist_append(slist, auth.c_str()); if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); /*if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1);*/ /* if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_USERAGENT, "msnlib/1.0 (Proteus)");*/ if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &msn_handle_curl_write); /*if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_WRITEDATA, info);*/ if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, &msn_handle_curl_header); if (ret == CURLE_OK) ret = curl_easy_setopt(curl, CURLOPT_WRITEHEADER, info); if (ret == CURLE_OK) ret = curl_easy_perform(curl); curl_easy_cleanup(curl); curl_slist_free_all(slist); /* ok, if auth succeeded info->cookie is now the cookie to pass back */ if (info->cookie.empty()) { // No authentication cookie /usually/ means that authentication failed. this->showError(911); this->disconnect(); delete info; return; } std::ostringstream buf_; buf_ << "USR " << this->trID << " TWN S " << info->cookie << "\r\n"; if (this->write(buf_) != buf_.str().size()) return; this->addCallback(&NotificationServerConnection::callback_AuthenticationComplete, this->trID++, (void *) data); } void NotificationServerConnection::callback_AuthenticationComplete(std::vector & args, int trid, void * data) { this->assertConnectionStateIsAtLeast(NS_CONNECTED); connectinfo * info = (connectinfo *) data; this->removeCallback(trid); if (isdigit(args[0][0])) { this->showError(decimalFromString(args[0])); delete info; this->disconnect(); return; } this->myNotificationServer()->externalCallbacks.gotFriendlyName(this, decodeURL(args[4])); delete info; this->myNotificationServer()->externalCallbacks.gotNewConnection(this); } static size_t msn_handle_curl_write(void *ptr, size_t size, size_t nmemb, void *stream) { return size * nmemb; } static size_t msn_handle_curl_header(void *ptr, size_t size, size_t nmemb, void *stream) { connectinfo * info; std::string cookiedata; info = (connectinfo *)stream; if ((size * nmemb) < strlen("Authentication-Info:")) return (size * nmemb); std::string headers_ = std::string((char *)ptr, size * nmemb); Message::Headers headers = Message::Headers(headers_); cookiedata = headers["Authentication-Info:"]; if (! cookiedata.empty()) { size_t pos = cookiedata.find(",from-PP='"); if (pos == std::string::npos) { info->cookie = ""; } else { info->cookie = cookiedata.substr(pos + strlen(",from-PP='")); pos = info->cookie.find("'"); if (pos != std::string::npos) info->cookie = info->cookie.substr(0, pos); } } return (size * nmemb); } } centerim-4.22.10/libmsn/msn/invitation.cpp0000644000175000001440000000346611461606612015370 00000000000000/* * invitation.cpp * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include namespace MSN { template class hasCookieOf { const std::string & cookie; public: hasCookieOf(const std::string & __i) : cookie(__i) {}; bool operator()(const _Tp &__x) { return __x->cookie == cookie; } }; bool Invitation::invitationWasSent() { std::list & in_list = this->switchboardConnection->invitationsReceived; std::list & out_list = this->switchboardConnection->invitationsSent; std::list::iterator i; i = std::find_if(in_list.begin(), in_list.end(), hasCookieOf(cookie)); if (i != in_list.end()) return false; i = std::find_if(out_list.begin(), out_list.end(), hasCookieOf(cookie)); if (i != out_list.end()) return true; return false; } } centerim-4.22.10/libmsn/msn/msn.h0000644000175000001440000000222611461606612013437 00000000000000#ifndef __msn_h__ #define __msn_h__ /* * msn.h * libmsn * * Created by Mark Rowe on Mon Apr 17 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #include #include #include #include #include #endif centerim-4.22.10/libmsn/msn/Makefile.am0000644000175000001440000000103411461606612014521 00000000000000AM_CPPFLAGS = -I$(top_srcdir)//connwrap -I$(top_srcdir)/libmsn noinst_LIBRARIES = libmsn.a if BUILD_MSN noinst_HEADERS =authdata.h buddy.h connection.h errorcodes.h externals.h filetransfer.h invitation.h md5.h message.h msn.h notificationserver.h passport.h sstream_fix.h switchboardserver.h util.h libmsn_a_SOURCES = authdata.cpp buddy.cpp connection.cpp filetransfer.cpp invitation.cpp message.cpp notificationserver.cpp passport.cpp switchboardserver.cpp util.cpp else libmsn_a_LIBADD = dummy.o dummy.cpp: touch dummy.cpp endif centerim-4.22.10/libmsn/msn/invitation.h0000644000175000001440000000347611461606612015036 00000000000000#ifndef __msn_invitation_h__ #define __msn_invitation_h__ /* * msn_invitation.h * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include namespace MSN { class SwitchboardServerConnection; class Invitation { public: enum ApplicationType { MSNFTP = 1 }; ApplicationType application; std::string cookie; Passport otherUser; SwitchboardServerConnection *switchboardConnection; Invitation(ApplicationType application_, const std::string & cookie_, Passport otherUser_, SwitchboardServerConnection * switchboardConnection_) : application(application_), cookie(cookie_), otherUser(otherUser_), switchboardConnection(switchboardConnection_) {}; virtual ~Invitation() {}; virtual void invitationWasAccepted(const std::string & body) = 0; virtual void invitationWasCanceled(const std::string & body) = 0; bool invitationWasSent(); }; } #endif centerim-4.22.10/libmsn/msn/passport.h0000644000175000001440000000462711461606612014524 00000000000000#ifndef __msn_passport_h__ #define __msn_passport_h__ /* * passport.h * libmsn * * Created by Mark Rowe on Thu May 20 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include namespace MSN { /** An InvalidPassport exception will be thrown whenever * a malformed passport is passed to a function that requires * a valid address. */ class InvalidPassport : public std::runtime_error { public: InvalidPassport(std::string err) : std::runtime_error(err) {}; }; /** A Passport represents a passport address. It is used to * validate these addresses for functions that require it. * * @todo Document validation rules. * @todo Investigate subclassing std::string to reduce code duplication. */ class Passport { public: Passport(std::string email_) : email(email_) { validate(); }; Passport(const char *email_) : email(std::string(email_)) { validate(); }; Passport() : email("") {}; operator std::string() const; const char *c_str() const; bool operator ==(const Passport & other) const { return this->email == other.email; }; friend bool operator ==(const Passport & p, const std::string & other) { return p.email == other; }; friend bool operator ==(const std::string & other, const Passport & p) { return p.email == other; }; friend std::istream& operator >>(std::istream & is, Passport & p) { is >> p.email; p.validate(); return is; } private: void validate(); std::string email; }; } std::ostream & operator << (std::ostream & os, const MSN::Passport& passport); #endif centerim-4.22.10/libmsn/msn/switchboardserver.h0000644000175000001440000001601111461606612016377 00000000000000#ifndef __msn_switchboardserver_h__ #define __msn_switchboardserver_h__ /* * switchboardserver.h * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #include namespace MSN { class NotificationServerConnection; class FileTransferConnection; class FileTransferInvitation; class Invitation; /** Represents a connection to a MSN switchboard. */ class SwitchboardServerConnection : public Connection { friend class FileTransferConnection; friend class FileTransferInvitation; private: typedef void (SwitchboardServerConnection::*SwitchboardServerCallback)(std::vector & args, int trid, void *); public: class AuthData : public ::MSN::AuthData { public: std::string sessionID; std::string cookie; const void *tag; AuthData(Passport & username_, const std::string & sessionID_, const std::string & cookie_, const void *tag_=NULL) : ::MSN::AuthData(username_), sessionID(sessionID_), cookie(cookie_), tag(tag_) {}; AuthData(Passport & username_, const void *tag_=NULL) : ::MSN::AuthData(username_), sessionID(""), cookie(""), tag(tag_) {}; }; SwitchboardServerConnection::AuthData auth; /** A list of the users in this switchboard session. */ std::list users; /** Invitations extended but not responded to. */ std::list invitationsSent; /** Invitations received but not responded to. */ std::list invitationsReceived; SwitchboardServerConnection(AuthData & auth_, NotificationServerConnection &); virtual ~SwitchboardServerConnection(); virtual void dispatchCommand(std::vector & args); /** Return a connection that is associated with @a fd. * * If @a fd is equal to @p sock, @c this is returned. Otherwise * connectionWithSocket is sent to each FileTransferConnection * until a match is found. * * @return The matching connection, if found. Otherwise, @c NULL. */ Connection *connectionWithSocket(int fd); /** Return a list of all FileTransferConnection's associated with this * connection. */ std::list & fileTransferConnections() const; /** Add a FileTransferConnection to the list of associated connections. */ void addFileTransferConnection(FileTransferConnection *); /** Remove a FileTransferConnection from the list of associated connections. */ void removeFileTransferConnection(FileTransferConnection *); /** Remove the FileTransferConnection that is associated with FileTransferInvitation * @a inv from the list of associated connections. */ void removeFileTransferConnection(FileTransferInvitation *inv); /** Send a typing notification to the switchboard server. */ void sendTypingNotification(); /** Invite @a userName into this conversation. */ void inviteUser(Passport userName); virtual void connect(const std::string & hostname, unsigned int port); virtual void disconnect(); virtual void sendMessage(const Message *msg); virtual void sendMessage(const std::string & s); FileTransferInvitation *sendFile(const std::string path); /** Add @a cb as a callback that will be called when a response is received * a transaction ID of @a trid. */ virtual void addCallback(SwitchboardServerCallback, int trid, void *data); /** Remove callbacks for transaction ID @a trid. */ virtual void removeCallback(int trid); Invitation *invitationWithCookie(const std::string & cookie); virtual void socketConnectionCompleted(); enum SwitchboardServerState { SB_DISCONNECTED, SB_CONNECTING, SB_CONNECTED, SB_WAITING_FOR_USERS, SB_READY }; SwitchboardServerState connectionState() const { return this->_connectionState; }; virtual NotificationServerConnection *myNotificationServer() { return ¬ificationServer; }; protected: virtual void handleIncomingData(); SwitchboardServerState _connectionState; void setConnectionState(SwitchboardServerState s) { this->_connectionState = s; }; void assertConnectionStateIs(SwitchboardServerState s) { assert(this->_connectionState == s); }; void assertConnectionStateIsNot(SwitchboardServerState s) { assert(this->_connectionState != s); }; void assertConnectionStateIsAtLeast(SwitchboardServerState s) { assert(this->_connectionState >= s); }; private: NotificationServerConnection & notificationServer; std::list _fileTransferConnections; std::map > callbacks; static std::map &)> commandHandlers; void registerCommandHandlers(); void handle_BYE(std::vector & args); void handle_JOI(std::vector & args); void handle_NAK(std::vector & args); void handle_MSG(std::vector & args); void callback_InviteUsers(std::vector & args, int trid, void * data); void callback_AnsweredCall(std::vector & args, int trid, void * data); void handleInvite(Passport from, const std::string & friendly, const std::string & mime, const std::string & body); void handleNewInvite(Passport & from, const std::string & friendly, const std::string & mime, const std::string & body); friend class Connection; }; } #endif centerim-4.22.10/libmsn/msn/buddy.h0000644000175000001440000000747511461606612013764 00000000000000#ifndef __msn_buddy_h__ #define __msn_buddy_h__ /* * buddy.h * libmsn * * Created by Mark Rowe on Mon Apr 19 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include namespace MSN { /** The online state of a buddy. */ enum BuddyStatus { STATUS_AVAILABLE, STATUS_BUSY, STATUS_IDLE, STATUS_BERIGHTBACK, STATUS_AWAY, STATUS_ONTHEPHONE, STATUS_OUTTOLUNCH, STATUS_INVISIBLE }; std::string buddyStatusToString(BuddyStatus s); BuddyStatus buddyStatusFromString(std::string s); class Group; /** The Buddy class contains information about a member of a buddy list. * * Each Buddy is made up of their passport address (@a userName), * user-visible display name (@a friendlyName), zero or more @a phoneNumbers, * and zero or more @a groups on the buddy list that they belong to. * * It is only currently used during MSN::ext::gotBuddyListInfo to * store contact information about a buddy that was retrieved during * the buddy list synchronisation process. */ class Buddy { /** @todo BPR's need to be handled at any time, not just when syncing. */ public: /** The PhoneNumber class contains information about a single phone number * that is retrieved during the buddy list synchronisation process. */ class PhoneNumber { public: /** The name of this phone number. * * @todo Should this be an enumeration containing the possible * types of phone number? */ std::string title; /** The phone number */ std::string number; /** @todo Document me! */ bool enabled; PhoneNumber(std::string title_, std::string number_, bool enabled_=true) : title(title_), number(number_), enabled(enabled_) {}; }; /** Their passport address */ Passport userName; /** Their friendly name */ std::string friendlyName; /** A list of phone numbers related to this buddy */ std::list phoneNumbers; /** A list of Group's that this buddy is a member of */ std::list groups; Buddy(Passport userName_, std::string friendlyName_) : userName(userName_), friendlyName(friendlyName_) {}; bool const operator==(const Buddy &other) { return userName == other.userName; } }; /** The Group class represents a group of contacts on the buddy list. * * Each group is represented by a @a groupID and has a user-visible * @a name. */ class Group { public: int groupID; std::string name; std::list buddies; Group(int groupID_, std::string name_) : groupID(groupID_), name(name_) {}; Group() : groupID(-1), name("INVALID") {}; }; } #endif centerim-4.22.10/libmsn/msn/connection.cpp0000644000175000001440000002637511461606612015347 00000000000000/* * connection.cpp * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #include #ifndef WIN32 #include #include #include #include #else #include #include #endif #include #include #include #include #include #include namespace MSN { static std::vector errors; Connection::Connection() : sock(0), connected(false), trID(1), user_data(NULL), messageHandlers() { srand((unsigned int) time(NULL)); if (errors.size() != 0) { assert(errors.size() == 1000); } else { errors.resize(1000); for (int a = 0; a < 1000; a++) { errors[a] = "Unknown error code"; } errors[200] = "Syntax error"; errors[201] = "Invalid parameter"; errors[205] = "Invalid user"; errors[206] = "Domain name missing from username"; errors[207] = "Already logged in"; errors[208] = "Invalid username"; errors[209] = "Invalid friendly name"; errors[210] = "List full"; errors[215] = "This user is already on this list or in this session"; errors[216] = "Not on list"; errors[218] = "Already in this mode"; errors[219] = "This user is already in the opposite list"; errors[280] = "Switchboard server failed"; errors[281] = "Transfer notification failed"; errors[300] = "Required fields missing"; errors[302] = "Not logged in"; errors[500] = "Internal server error"; errors[501] = "Database server error"; errors[510] = "File operation failed at server"; errors[520] = "Memory allocation failed on server"; errors[600] = "The server is too busy"; errors[601] = "The server is unavailable"; errors[602] = "A Peer Notification Server is down"; errors[603] = "Database connection failed"; errors[604] = "Server going down for maintenance"; errors[707] = "Server failed to create connection"; errors[711] = "Blocking write failed on server"; errors[712] = "Session overload on server"; errors[713] = "You have been too active recently. Slow down!"; errors[714] = "Too many sessions open"; errors[715] = "Not expected"; errors[717] = "Bad friend file on server"; errors[911] = "Authentication failed. Check that you typed your username and password correctly."; errors[913] = "This action is not allowed while you are offline"; errors[920] = "This server is not accepting new users"; } messageHandlers["text/plain"] = &Connection::message_plain; messageHandlers["text/x-msmsgsinitialemailnotification"] = &Connection::message_initial_email_notification; messageHandlers["text/x-msmsgsemailnotification"] = &Connection::message_email_notification; messageHandlers["text/x-msmsgsinvite"] = &Connection::message_invitation; messageHandlers["text/x-msmsgscontrol"] = &Connection::message_typing_user; } Connection::~Connection() {} void Connection::disconnect() { this->myNotificationServer()->externalCallbacks.unregisterSocket(this->sock); ::close(this->sock); this->sock = -1; this->writeBuffer.erase(); this->readBuffer.erase(); this->trID = 1; } std::vector Connection::getLine() { assert(this->isWholeLineAvailable()); std::string s = this->readBuffer.substr(0, this->readBuffer.find("\r\n")); this->myNotificationServer()->externalCallbacks.log(0, (s + "\n").c_str()); return splitString(s, " "); } bool Connection::isWholeLineAvailable() { return this->readBuffer.find("\r\n") != std::string::npos; } void Connection::errorOnSocket(int errno_) { this->myNotificationServer()->externalCallbacks.showError(this, strerror(errno_)); this->disconnect(); } void Connection::socketConnectionCompleted() { this->connected = true; // We know that we are connected, so this will try writing to the network. size_t writtenLength = this->write(this->writeBuffer, 1); this->writeBuffer = this->writeBuffer.substr(writtenLength); } size_t Connection::write(std::string s, bool log) throw (std::runtime_error) { if (! this->connected) this->writeBuffer.append(s); else { if (log) this->myNotificationServer()->externalCallbacks.log(1, s.c_str()); size_t written = 0; while (written < s.size()) { size_t newWritten = ::send(this->sock, s.substr(written).c_str(), (int) (s.size() - written), 0); if (newWritten <= 0) { if (errno == EAGAIN) continue; else break; } written += newWritten; } if (written != s.size()) { this->errorOnSocket(errno); return written; } } return s.size(); } size_t Connection::write(std::ostringstream & ss, bool log) throw (std::runtime_error) { std::string s = ss.str(); size_t result = write(s, log); return result; } void Connection::dataArrivedOnSocket() { char tempReadBuffer[8192]; int amountRead = ::recv(this->sock, &tempReadBuffer, 8192, 0); if (amountRead < 0) { if (errno == EAGAIN) return; // We shouldn't get EAGAIN here because dataArrivedOnSocket // is only called when select/poll etc has told us that // the socket is readable. // assert(errno != EAGAIN); this->myNotificationServer()->externalCallbacks.showError(this, strerror(errno)); this->disconnect(); } else if (amountRead == 0) { this->myNotificationServer()->externalCallbacks.showError(this, "Connection closed by remote endpoint."); this->disconnect(); } else { this->readBuffer += std::string(tempReadBuffer, amountRead); try { handleIncomingData(); } catch (std::exception & e) { this->myNotificationServer()->externalCallbacks.showError(this, e.what()); } } } void Connection::handle_MSG(std::vector & args) { int msglen; std::string msg; std::string mime; std::string body; size_t tmp; msglen = decimalFromString(args[3]); msg = this->readBuffer.substr(0, msglen); this->readBuffer = this->readBuffer.substr(msglen); body = msg.substr(msg.find("\r\n\r\n") + 4); mime = msg.substr(0, msg.size() - body.size()); std::string contentType; Message::Headers headers = Message::Headers(mime); contentType = headers["Content-Type"]; if ((tmp = contentType.find("; charset")) != std::string::npos) contentType = contentType.substr(0, tmp); std::map &, std::string, std::string)>::iterator i = messageHandlers.find(contentType); if (i != messageHandlers.end()) (this->*(messageHandlers[contentType]))(args, mime, body); } void Connection::message_plain(std::vector & args, std::string mime, std::string body) { Message msg = Message(body, mime); this->myNotificationServer()->externalCallbacks.gotInstantMessage(static_cast(this), args[1], decodeURL(args[2]), &msg); } void Connection::message_initial_email_notification(std::vector & args, std::string mime, std::string body) { std::string unreadInbox; std::string unreadFolder; int unreadInboxCount = 0, unreadFolderCount = 0; // Initial email notifications body is a set of MIME headers Message::Headers headers = Message::Headers(body); unreadInbox = headers["Inbox-Unread"]; unreadFolder = headers["Folders-Unread"]; if (! unreadInbox.empty()) unreadInboxCount = decimalFromString(unreadInbox); if (! unreadFolder.empty()) unreadFolderCount = decimalFromString(unreadFolder); this->myNotificationServer()->externalCallbacks.gotInitialEmailNotification(this, unreadInboxCount, unreadFolderCount); } void Connection::message_email_notification(std::vector & args, std::string mime, std::string body) { // New email notifications body is a set of MIME headers Message::Headers headers = Message::Headers(body); std::string from = headers["From-Addr"]; std::string subject = headers["Subject"]; this->myNotificationServer()->externalCallbacks.gotNewEmailNotification(this, from, subject); } void Connection::message_invitation(std::vector & args, std::string mime, std::string body) { static_cast(this)->handleInvite(args[1], decodeURL(args[2]), mime, body); } void Connection::message_typing_user(std::vector & args, std::string mime, std::string body) { this->myNotificationServer()->externalCallbacks.buddyTyping(this, args[1], decodeURL(args[2])); } void Connection::showError(int errorCode) { std::ostringstream buf_; buf_ << "Error code: " << errorCode << " (" << errors[errorCode] << ")"; this->myNotificationServer()->externalCallbacks.showError(this, buf_.str()); } } centerim-4.22.10/libmsn/msn/md5.h0000644000175000001440000000650011461606612013326 00000000000000/* Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. 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. L. Peter Deutsch ghost@aladdin.com */ /* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.h is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Removed support for non-ANSI compilers; removed references to Ghostscript; clarified derivation from RFC 1321; now handles byte order either statically or dynamically. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); added conditionalization for C++ compilation from Martin Purschke . 1999-05-03 lpd Original version. */ #ifndef md5_INCLUDED # define md5_INCLUDED /* * This package supports both compile-time and run-time determination of CPU * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is * defined as non-zero, the code will be compiled to run only on big-endian * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to * run on either big- or little-endian CPUs, but will run slightly less * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. */ typedef unsigned char md5_byte_t; /* 8-bit byte */ typedef unsigned int md5_word_t; /* 32-bit word */ /* Define the state of the MD5 Algorithm. */ typedef struct md5_state_s { md5_word_t count[2]; /* message length in bits, lsw first */ md5_word_t abcd[4]; /* digest buffer */ md5_byte_t buf[64]; /* accumulate block */ } md5_state_t; #ifdef __cplusplus extern "C" { #endif /* Initialize the algorithm. */ void md5_init(md5_state_t *pms); /* Append a string to the message. */ void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); /* Finish the message and return the digest. */ void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); #ifdef __cplusplus } /* end extern "C" */ #endif #endif /* md5_INCLUDED */ centerim-4.22.10/libmsn/msn/message.cpp0000644000175000001440000002422611461606612014625 00000000000000/* * message.cpp * libmsn * * Created by Mark Rowe on Wed Mar 17 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #include namespace MSN { Message::Message(std::string body_, std::string header_) : body(body_), header(header_) { } std::string Message::asString() const { return this->header.asString() + this->body; } std::string Message::operator[](const std::string header_) const { assert(header_ != ""); return this->header[header_]; } std::string Message::Headers::asString() const { return this->rawContents; } std::map Message::getFormatInfo() const throw (std::runtime_error) { std::map formatInfo; std::string formatHeader = (*this)["X-MMS-IM-Format"]; if (formatHeader.empty()) return formatInfo; std::vector parameters = splitString(formatHeader, "; "); std::vector::const_iterator i = parameters.begin(); for (; i != parameters.end(); i++) { std::vector pair = splitString(*i, "="); if (pair.size() == 2) formatInfo[decodeURL(pair[0])] = decodeURL(pair[1]); else if (pair.size() == 1) formatInfo[decodeURL(pair[0])] = ""; else throw std::runtime_error("Incorrectly specified message format!"); } return formatInfo; } void Message::setFormatInfo(std::map & info) { std::string value; std::map::iterator i = info.begin(); if (info.find("FN") != info.end()) { value += "FN="; value += encodeURL(info["FN"]); value += "; "; } for (; i != info.end(); i++) { if ((*i).first == "FN") continue; value += encodeURL((*i).first); value += "="; value += encodeURL((*i).second); value += "; "; } if (value == "") return; assert(value.size() >= 2); value = value.substr(0, value.size() - 2); this->header.setHeader("X-MMS-IM-Format", value); } const std::string Message::getFontName() const { return this->getFormatInfo()["FN"]; } void Message::setFontName(const std::string & fontName) { std::map info = this->getFormatInfo(); info["FN"] = fontName; this->setFormatInfo(info); } const std::vector Message::getColor() const { std::string color = this->getFormatInfo()["CO"]; assert(color.size() <= 6 && color.size() >= 0); color.insert(0U, 6 - color.size(), '0'); int r = 0, g = 0, b = 0; b = strtol(color.substr(0, 2).c_str(), NULL, 16); g = strtol(color.substr(2, 2).c_str(), NULL, 16); r = strtol(color.substr(4, 2).c_str(), NULL, 16); std::vector out; out.push_back(r); out.push_back(g); out.push_back(b); return out; } const std::string Message::getColorAsHTMLString() const { std::vector color = this->getColor(); std::ostringstream s; s << std::hex << std::setfill('0') << std::setw(2) << color[0]; s << std::hex << std::setfill('0') << std::setw(2) << color[1]; s << std::hex << std::setfill('0') << std::setw(2) << color[2]; assert(s.str().size() == 6); return s.str(); } void Message::setColor(std::vector color) { std::map info = this->getFormatInfo(); assert(color.size() == 3); std::ostringstream s; s << std::hex << std::setfill('0') << std::setw(2) << color[2]; s << std::hex << std::setfill('0') << std::setw(2) << color[1]; s << std::hex << std::setfill('0') << std::setw(2) << color[0]; assert(s.str().size() == 6); info["CO"] = s.str(); this->setFormatInfo(info); } void Message::setColor(std::string color) { color.insert(0U, 6 - color.size(), '0'); int r = 0, g = 0, b = 0; r = strtol(color.substr(0, 2).c_str(), NULL, 16); g = strtol(color.substr(2, 2).c_str(), NULL, 16); b = strtol(color.substr(4, 2).c_str(), NULL, 16); std::vector v; v.push_back(r); v.push_back(g); v.push_back(b); this->setColor(v); } void Message::setColor(int red, int green, int blue) { std::vector v; v.push_back(red); v.push_back(green); v.push_back(blue); this->setColor(v); } const int Message::getFontEffects() const { int retVal = 0; std::string fontEffects = this->getFormatInfo()["EF"]; if (fontEffects.find("B") != std::string::npos) retVal |= BOLD_FONT; if (fontEffects.find("I") != std::string::npos) retVal |= ITALIC_FONT; if (fontEffects.find("U") != std::string::npos) retVal |= UNDERLINE_FONT; if (fontEffects.find("S") != std::string::npos) retVal |= STRIKETHROUGH_FONT; return retVal; } void Message::setFontEffects(int fontEffects) { std::string effects; std::map info = this->getFormatInfo(); if (fontEffects & BOLD_FONT) effects += "B"; if (fontEffects & ITALIC_FONT) effects += "I"; if (fontEffects & UNDERLINE_FONT) effects += "U"; if (fontEffects & STRIKETHROUGH_FONT) effects += "S"; info["EF"] = effects; this->setFormatInfo(info); } const Message::CharacterSet Message::getFontCharacterSet() const { std::string fontCharacterSet = this->getFormatInfo()["CS"]; int c = strtol(fontCharacterSet.c_str(), NULL, 16); return (Message::CharacterSet) c; } void Message::setFontCharacterSet(CharacterSet cs) { std::map info = this->getFormatInfo(); std::ostringstream s; s << std::hex << (int) cs; info["CS"] = s.str(); this->setFormatInfo(info); } const Message::FontFamily Message::getFontFamily() const { std::string fontFamily = this->getFormatInfo()["PF"]; if (fontFamily.size() < 1) return (Message::FontFamily) 0; int family = decimalFromString(fontFamily.substr(0, 1)); return (Message::FontFamily) family; } const Message::FontPitch Message::getFontPitch() const { std::string fontPitch = this->getFormatInfo()["PF"]; if (fontPitch.size() < 2) return (Message::FontPitch) 0; int pitch = decimalFromString(fontPitch.substr(1, 1)); return (Message::FontPitch) pitch; } void Message::setFontFamilyAndPitch(Message::FontFamily fontFamily, Message::FontPitch fontPitch) { std::map info = this->getFormatInfo(); std::ostringstream s; s << fontFamily << fontPitch; info["PF"] = s.str(); this->setFormatInfo(info); } const bool Message::isRightAligned() const { return this->getFormatInfo()["RL"] == "1"; } void Message::Headers::setHeader(const std::string header, const std::string value) { if ((*this)[header] == "") { assert(this->rawContents.size() >= 2); this->rawContents.insert(this->rawContents.size() - 2, header + ": " + value + "\r\n"); } else { size_t position = this->rawContents.find(header + ": "); assert(position != std::string::npos); size_t eol = this->rawContents.find("\r\n", position); if (eol == std::string::npos) eol = this->rawContents.size(); this->rawContents.erase(position, eol - position + 2); this->rawContents.insert(position, header + ": " + value + "\r\n"); } } std::string Message::Headers::operator[](const std::string header_) const { std::string retval; std::string::iterator i; if (this->rawContents.substr(0U, header_.size()) == header_) { retval = this->rawContents; } else { std::string tmp = "\r\n" + header_; size_t position = this->rawContents.find(tmp); if (position == std::string::npos) return ""; retval = this->rawContents.substr(position + 2); } retval = retval.substr(retval.find(':') + 1); while (isspace(retval[0])) retval.erase(retval.begin()); for (i = retval.begin(); i != retval.end(); i++) { if (*i == '\r') { return retval.substr(0, std::distance(retval.begin(), i)); } } return ""; } } centerim-4.22.10/libmsn/msn/sstream_fix.h0000644000175000001440000000351111461606612015164 00000000000000/* * This file is one big nasty kludge because the older * libstdc++ libraries (before v3) have the old strstream * but I want to use the new, and much improved sstream. * - Barnaby * * Copyright (C) 2001 Barnaby Gray * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #ifdef HAVE_SSTREAM # include #elif HAVE_STRSTREAM # define USE_STRSTREAM_WRAPPERS #else # error "No sstream/strstream implementation" #endif #if defined(USE_STRSTREAM_WRAPPERS) && !defined(SSTREAM_FIX_H) #define SSTREAM_FIX_H #include #include namespace std { /* * Only limited functionality from ostringstream * is implemented */ class ostringstream : public ostrstream { public: string str() { char *cstr = ostrstream::str(); freeze(0); if (cstr == 0) return string(); return string(cstr,pcount()); } }; /* * Only limited functionality from istringstream * is implemented */ class istringstream : public istrstream { public: istringstream(const string& str) : istrstream(str.c_str()) { } }; } #endif centerim-4.22.10/libmsn/msn/connection.h0000644000175000001440000001421211461606612014777 00000000000000#ifndef __msn_connection_h__ #define __msn_connection_h__ /* * connection.h * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #include namespace MSN { class callback; class Message; class Passport; class NotificationServerConnection; /** An abstract base class that represents a connection to another computer. * * Connection provides an interface and some functionality that is common * to notification, switchboard and file transfer connections. * * @todo Connection should have a read buffer that stores all incoming data * that is waiting to be processed. Member functions should use that * for necessary data, and not call Connection::readExactly. */ class Connection { public: /** The socket which connects this Connection to another computer * * @deprecated In the future, this member will be made private. Any * functions that access this member should be converted to * member functions of a subclass. */ int sock; /** Indicates whether a connection has been established. * * @todo This is currently public only because FileTransferInvitation::receiveFile * accesses it. It should be made protected in the future, and * FileTransferInvitation refactored to remove it's dependency on * this attribute. */ bool connected; protected: /** The transaction ID of the next command to be sent. */ int trID; std::string readBuffer; public: void * user_data; Connection(); virtual ~Connection(); /** Dispatch a command to its appropriate handler routines based on @a args. * * @param args A vector of strings containing arguments, returned from readLine. */ virtual void dispatchCommand(std::vector & args) = 0; /** Read a line from the network and split it into its components. * * MSN commands and their arguments are separated by white space. */ std::vector getLine(); bool isWholeLineAvailable(); bool bytesAvailable(); /** Write a string to the connection. * */ virtual size_t write(std::string s, bool log=true) throw (std::runtime_error); /** Write the contents of a stringstream to the connection. * * @param s The stringstream to write. * @param log Should we log this output to the console. * * write will buffer the output if a connection has not yet been established. * In this case, the data will be written as soon as a connection is * established. */ virtual size_t write(std::ostringstream & s, bool log=true) throw (std::runtime_error); /** Connect ourself to @a hostname on @a port. */ virtual void connect(const std::string & hostname, unsigned int port) = 0; virtual void disconnect() = 0; /** @name External Socket Hooks * * These members should be called whenever an appropriate socket event * occurs. */ /** @{ */ /** New data is available on the connection. */ virtual void dataArrivedOnSocket(); /** The connection has been established. */ virtual void socketConnectionCompleted(); virtual void socketIsWritable() {}; /** An error has occurred on the socket. */ virtual void errorOnSocket(int errno_); /** @} */ /** Notify the calling library that an error with code @a errorCode has * occured. */ void showError(int errorCode); /** Is this Connection connected to a remote endpoint? */ bool isConnected() { return this->connected; }; virtual NotificationServerConnection *myNotificationServer() = 0; protected: /** Process a @c MSG command. * * This method will read the remaining message data from the network @ and then delegates to private @c message_* functions based on the * @c Content-Type header found in the message. */ void handle_MSG(std::vector & args); virtual void handleIncomingData() = 0; private: std::string writeBuffer; std::map &, std::string, std::string)> messageHandlers; void message_plain(std::vector & args, std::string mime, std::string body); void message_initial_email_notification(std::vector & args, std::string mime, std::string body); void message_email_notification(std::vector & args, std::string mime, std::string body); void message_invitation(std::vector & args, std::string mime, std::string body); void message_typing_user(std::vector & args, std::string mime, std::string body); }; } #endif centerim-4.22.10/libmsn/msn/buddy.cpp0000644000175000001440000000433011461606612014302 00000000000000/* * buddy.cpp * libmsn * * Created by Mark Rowe on Mon Apr 19 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include namespace MSN { std::string buddyStatusToString(BuddyStatus state) { switch (state) { case STATUS_AVAILABLE: return "NLN"; case STATUS_BUSY: return "BSY"; case STATUS_IDLE: return "IDL"; case STATUS_BERIGHTBACK: return "BRB"; case STATUS_AWAY: return "AWY"; case STATUS_ONTHEPHONE: return "PHN"; case STATUS_OUTTOLUNCH: return "LUN"; case STATUS_INVISIBLE: return "HDN"; default: assert(false); } } BuddyStatus buddyStatusFromString(std::string state) { if (state == "NLN") return STATUS_AVAILABLE; else if (state == "BSY") return STATUS_BUSY; else if (state == "IDL") return STATUS_IDLE; else if (state == "BRB") return STATUS_BERIGHTBACK; else if (state == "AWY") return STATUS_AWAY; else if (state == "PHN") return STATUS_ONTHEPHONE; else if (state == "LUN") return STATUS_OUTTOLUNCH; else if (state == "HDN") return STATUS_INVISIBLE; else throw std::runtime_error("Unknown status!"); } } centerim-4.22.10/libmsn/msn/filetransfer.cpp0000644000175000001440000005007411461606612015665 00000000000000/* * filetransfer.cpp * libmsn * * Created by Mark Rowe on Wed Mar 17 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include #include #ifndef WIN32 #include #include #include #include #include #else #include #include #endif #include #include #include #include namespace MSN { const unsigned int MAX_FTP_BLOCK_SIZE = 20000; void FileTransferInvitation::invitationWasAccepted(const std::string & body) { if (this->invitationWasSent()) { this->sendFile(body); } else { this->receiveFile(body); } } void FileTransferInvitation::invitationWasCanceled(const std::string & body) { this->switchboardConnection->myNotificationServer()->externalCallbacks.fileTransferFailed(this, 0, "Cancelled by remote user"); if (this->invitationWasSent()) { this->switchboardConnection->invitationsSent.remove(this); } else { this->switchboardConnection->invitationsReceived.remove(this); } this->switchboardConnection->removeFileTransferConnection(this); } void FileTransferInvitation::sendFile(const std::string & msg_body) { int port = 6891; char tmp[64]; sprintf(tmp, "%d", rand()); FileTransferConnection::AuthData auth = FileTransferConnection::AuthData(this->switchboardConnection->auth.username, std::string(tmp), FileTransferConnection::MSNFTP_SEND, this); FileTransferConnection * conn = new FileTransferConnection(auth); this->switchboardConnection->myNotificationServer()->externalCallbacks.fileTransferProgress(this, "Sending IP address", 0, 0); while((conn->sock = this->switchboardConnection->myNotificationServer()->externalCallbacks.listenOnPort(port)) < 0) { port++; if (port > 6911) { this->switchboardConnection->myNotificationServer()->externalCallbacks.fileTransferFailed(this, errno, strerror(errno)); this->switchboardConnection->invitationsSent.remove(this); conn->disconnect(); return; } } this->switchboardConnection->myNotificationServer()->externalCallbacks.registerSocket(conn->sock, 1, 0); this->switchboardConnection->addFileTransferConnection(conn); std::ostringstream buf_; buf_ << "Invitation-Command: ACCEPT\r\n"; buf_ << "Invitation-Cookie: " << this->cookie << "\r\n"; buf_ << "IP-Address: " << this->switchboardConnection->myNotificationServer()->externalCallbacks.getOurIP() << "\r\n"; buf_ << "Port: " << port << "\r\n"; buf_ << "AuthCookie: " << conn->auth.cookie << "\r\n"; buf_ << "Launch-Application: FALSE\r\n"; buf_ << "Request-Data: IP-Address:\r\n"; buf_ << "\r\n"; Message * msg = new Message(buf_.str()); msg->setHeader("Content-Type", "text/x-msmsgsinvite; charset=UTF-8"); this->switchboardConnection->sendMessage(msg); delete msg; } void FileTransferInvitation::receiveFile(const std::string & msg_body) { Message::Headers headers = Message::Headers(msg_body); std::string cookie = headers["AuthCookie"]; std::string remote = headers["IP-Address"]; std::string port_c = headers["Port"]; int port; if (cookie.empty() || remote.empty() || port_c.empty()) { this->switchboardConnection->myNotificationServer()->externalCallbacks.fileTransferFailed(this, 0, "Missing parameters"); this->switchboardConnection->invitationsReceived.remove(this); return; } port = decimalFromString(port_c); FileTransferConnection::AuthData auth = FileTransferConnection::AuthData(this->switchboardConnection->auth.username, cookie, FileTransferConnection::MSNFTP_RECV, this); FileTransferConnection * conn = new FileTransferConnection(auth); std::ostringstream buf_; buf_ << "Connecting to " << remote << ":" << port << "\n"; this->switchboardConnection->myNotificationServer()->externalCallbacks.fileTransferProgress(this, buf_.str(), 0, 0); conn->sock = this->switchboardConnection->myNotificationServer()->externalCallbacks.connectToServer(remote, port, &conn->connected); if (conn->sock < 0) { this->switchboardConnection->myNotificationServer()->externalCallbacks.fileTransferFailed(this, errno, strerror(errno)); this->switchboardConnection->invitationsReceived.remove(this); return; } if (! conn->isConnected()) this->switchboardConnection->myNotificationServer()->externalCallbacks.registerSocket(conn->sock, 0, 1); else this->switchboardConnection->myNotificationServer()->externalCallbacks.registerSocket(conn->sock, 1, 0); this->switchboardConnection->myNotificationServer()->externalCallbacks.fileTransferProgress(this, "Connected", 0, 0); this->switchboardConnection->addFileTransferConnection(conn); conn->write("VER MSNFTP\r\n"); } void FileTransferConnection::disconnect() { Connection::disconnect(); if (this->auth.fd) { fclose(this->auth.fd); this->auth.fd = NULL; } this->auth.inv->switchboardConnection->removeFileTransferConnection(this); delete this->auth.inv; this->auth.inv = NULL; } FileTransferConnection::~FileTransferConnection() { this->disconnect(); } void FileTransferConnection::socketConnectionCompleted() { Connection::socketConnectionCompleted(); this->myNotificationServer()->externalCallbacks.unregisterSocket(this->sock); this->myNotificationServer()->externalCallbacks.registerSocket(this->sock, 1, 0); } void FileTransferConnection::socketIsWritable() { if (this->auth.direction == MSNFTP_SEND) this->handleSend(); } void FileTransferConnection::dataArrivedOnSocket() { if (this->auth.direction == MSNFTP_SEND && ! this->auth.connected) this->handleSend(); else Connection::dataArrivedOnSocket(); } void FileTransferConnection::handleIncomingData() { if (this->auth.direction == MSNFTP_RECV) this->handleReceive(); else this->handleSend(); } void FileTransferConnection::handleSend() { if (! this->auth.connected) // we have not accept()ed yet, but the read/writability means there's one waiting { this->handleSend_WaitingForConnection(); } else if (this->auth.fd == NULL) { this->handleSend_Negotiating(); } else if (this->auth.inv->fileSize != this->auth.bytes_done) { this->handleSend_Transferring(); } else { this->handleSend_Bye(); } } void FileTransferConnection::handleSend_WaitingForConnection() { int s; if ((s = accept(this->sock, NULL, NULL)) < 0) { perror("Could not accept()\n"); this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, errno, strerror(errno)); this->auth.inv->switchboardConnection->invitationsSent.remove(this->auth.inv); return; } this->myNotificationServer()->externalCallbacks.unregisterSocket(this->sock); close(this->sock); this->sock = s; this->myNotificationServer()->externalCallbacks.registerSocket(this->sock, 1, 0); this->myNotificationServer()->externalCallbacks.fileTransferProgress(this->auth.inv, "Connected", 0, 0); this->auth.connected = 1; this->connected = true; } void FileTransferConnection::handleSend_Negotiating() { if (! this->isWholeLineAvailable()) return; std::vector args = this->getLine(); this->readBuffer = this->readBuffer.substr(this->readBuffer.find("\r\n") + 2); if (args[0] == "VER") { if (this->write("VER MSNFTP\r\n") != strlen("VER MSNFTP\r\n")) return; this->myNotificationServer()->externalCallbacks.fileTransferProgress(this->auth.inv, "Negotiating", 0, 0); } else if (args[0] == "USR") { if (args[2] != this->auth.cookie) // if they DIFFER { this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, errno, strerror(errno)); this->auth.inv->switchboardConnection->invitationsSent.remove(this->auth.inv); return; } std::ostringstream buf_; buf_ << "FIL " << this->auth.inv->fileSize << "\r\n"; this->write(buf_); } else if (args[0] == "TFR") { // you asked for it, go to data-dump mode this->auth.fd = fopen(this->auth.inv->fileName.c_str(), "r"); if (this->auth.fd == NULL) { perror("fopen() failed"); this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, errno, "Could not open file for reading"); this->auth.inv->switchboardConnection->invitationsSent.remove(this->auth.inv); return; } // OK, now we lose control, but the next round of the polling loop will // say that the socket is writable, and then the fun starts... this->myNotificationServer()->externalCallbacks.fileTransferProgress(this->auth.inv, "Sending data", 0, 0); this->myNotificationServer()->externalCallbacks.unregisterSocket(this->sock); this->myNotificationServer()->externalCallbacks.registerSocket(this->sock, 0, 1); } } void FileTransferConnection::handleSend_Transferring() { // just pumping data now fd_set writefd; FD_ZERO(&writefd); FD_SET(this->sock, &writefd); struct timeval tout={0, 0}; unsigned char *readBuffer = (unsigned char *) calloc(MAX_FTP_BLOCK_SIZE, sizeof(unsigned char)); if (select(this->sock + 1, NULL, &writefd, NULL, &tout) == 1) { int bytesWritten = 0; unsigned int blockLength; unsigned char blockHeader[3]; unsigned int bytesRemaining = this->auth.inv->fileSize - this->auth.bytes_done; blockLength = bytesRemaining > MAX_FTP_BLOCK_SIZE / 4 ? MAX_FTP_BLOCK_SIZE / 4 : bytesRemaining; if (blockLength == 0) blockHeader[0] = 1; else blockHeader[0] = 0; blockHeader[1] = (blockLength >> 0) & 0xff; blockHeader[2] = (blockLength >> 8) & 0xff; if (this->write(std::string((char *) &blockHeader[bytesWritten], 3 - bytesWritten), false) != 3) { this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, errno, strerror(errno)); goto cleanup; } if (fread(readBuffer, sizeof(unsigned char), blockLength, this->auth.fd) < 0) { this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, errno, strerror(errno)); goto cleanup; } if ((blockLength = this->write(std::string((char *) readBuffer, blockLength), false)) < 0) { this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, errno, strerror(errno)); goto cleanup; } this->auth.bytes_done += blockLength; } free(readBuffer); this->myNotificationServer()->externalCallbacks.fileTransferProgress(this->auth.inv, "Sending file", this->auth.bytes_done, this->auth.inv->fileSize); return; cleanup: ; this->auth.inv->switchboardConnection->invitationsSent.remove(this->auth.inv); if (readBuffer) free(readBuffer); if (this->auth.fd) { fclose(this->auth.fd); this->auth.fd = NULL; } } void FileTransferConnection::handleSend_Bye() { this->myNotificationServer()->externalCallbacks.fileTransferSucceeded(this->auth.inv); this->auth.inv->switchboardConnection->invitationsSent.remove(this->auth.inv); this->disconnect(); } void FileTransferConnection::handleReceive() { if (this->auth.fd == NULL) this->handleReceive_Negotiating(); else this->handleReceive_Transferring(); } void FileTransferConnection::handleReceive_Negotiating() { if (! this->isWholeLineAvailable()) return; std::vector args = this->getLine(); this->readBuffer = this->readBuffer.substr(this->readBuffer.find("\r\n") + 2); if (args[0] == "VER") { std::ostringstream buf_; buf_ << "USR " << this->auth.username << " " << this->auth.cookie << "\r\n"; this->write(buf_); this->myNotificationServer()->externalCallbacks.fileTransferProgress(this->auth.inv, "Negotiating", 0, 0); return; } else if (args[0] == "FIL") { this->auth.fd = fopen(this->auth.inv->fileName.c_str(), "w"); if (this->auth.fd == NULL) goto error; this->write("TFR\r\n"); } return; error: ; this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, errno, strerror(errno)); this->switchboardConnection()->invitationsReceived.remove(this->auth.inv); } void FileTransferConnection::handleReceive_Transferring() { // Each block has a 3-byte header // 0: either 1 or 0. 0 means data block, 1 means transfer completed. // 1: Low byte of block length // 2: High byte of block length unsigned int blockLength; std::string blockHeader; while (1) { if (this->readBuffer.size() < 3) return; // read the three byte header blockHeader = this->readBuffer.substr(0, 3); if (blockHeader[0] == 1U) { // Transfer completed block if (blockHeader[1] != 0 || blockHeader[2] != 0) { this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, 0, "Invalid block header.\n"); goto cleanup; } this->write("BYE 16777989\r\n"); this->myNotificationServer()->externalCallbacks.fileTransferSucceeded(this->auth.inv); goto cleanup; } else if (blockHeader[0] != 0U) { this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, 0, "Invalid block header."); goto cleanup; } // Read the entire block blockLength = ((unsigned char) blockHeader[1]) | ((unsigned char) blockHeader[2]) << 8; if (blockLength > MAX_FTP_BLOCK_SIZE) { this->myNotificationServer()->externalCallbacks.fileTransferFailed(this->auth.inv, 0, "Block size greater than largest expected block size."); goto cleanup; } if (this->readBuffer.size() < 3 + blockLength) return; std::string block = this->readBuffer.substr(3, blockLength); this->readBuffer = this->readBuffer.substr(3 + blockLength); fwrite(block.c_str(), sizeof(unsigned char), block.size(), this->auth.fd); this->auth.bytes_done += blockLength; if (this->auth.bytes_done == this->auth.inv->fileSize) { // It appears that sometimes the 1,0,0 block header // that indicates success isnt sent... this->write("BYE 16777989\r\n"); this->myNotificationServer()->externalCallbacks.fileTransferSucceeded(this->auth.inv); goto cleanup; } this->myNotificationServer()->externalCallbacks.fileTransferProgress(this->auth.inv, "Receiving file", this->auth.bytes_done, this->auth.inv->fileSize); } return; cleanup: ; this->auth.inv->switchboardConnection->invitationsReceived.remove(this->auth.inv); if (this->auth.fd) { fclose(this->auth.fd); this->auth.fd = NULL; } } void FileTransferInvitation::rejectTransfer() { std::ostringstream buf_; buf_ << "Invitation-Command: CANCEL\r\n"; buf_ << "Invitation-Cookie: " << this->cookie << "\r\n"; buf_ << "Cancel-Code: REJECT\r\n"; Message *msg = new Message(buf_.str()); msg->setHeader("Content-Type", "text/x-msmsgsinvite; charset=UTF-8"); this->switchboardConnection->sendMessage(msg); delete msg; this->switchboardConnection->invitationsReceived.remove(this); } void FileTransferInvitation::acceptTransfer(const std::string & dest) { std::ostringstream buf_; buf_ << "Invitation-Command: ACCEPT\r\n"; buf_ << "Invitation-Cookie: " << (this->cookie.empty() ? "" : this->cookie) << "\r\n"; buf_ << "Launch-Application: FALSE\r\n"; buf_ << "Request-Data: IP-Address\r\n"; buf_ << "\r\n"; this->fileName = dest; Message *msg = new Message(buf_.str()); msg->setHeader("Content-Type", "text/x-msmsgsinvite; charset=UTF-8"); this->switchboardConnection->sendMessage(msg); delete msg; } void FileTransferInvitation::cancelTransfer() { std::ostringstream buf_; buf_ << "Invitation-Command: CANCEL\r\n"; buf_ << "Invitation-Cookie: " << this->cookie << "\r\n"; buf_ << "Cancel-Code: OUTBANDCANCEL\r\n"; Message *msg = new Message(buf_.str()); msg->setHeader("Content-Type", "text/x-msmsgsinvite; charset=UTF-8"); this->switchboardConnection->sendMessage(msg); delete msg; // one of the two below will fail, but it will do so safely and quietly this->switchboardConnection->invitationsReceived.remove(this); this->switchboardConnection->invitationsSent.remove(this); this->switchboardConnection->removeFileTransferConnection(this); } } centerim-4.22.10/libmsn/msn/util.h0000644000175000001440000000467611461606612013632 00000000000000#ifndef __msn_util_h__ #define __msn_util_h__ /* * util.h * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include #include namespace MSN { /** URL-encode a string * * @param s The string to encode. * @return A string with all non-alphanumeric characters replaced by their * URL-encoded equivalent. */ std::string encodeURL(const std::string & s); /** URL-decode a string * * @param s The URL-encoded string to decode. * @return A string with all URL-encoded sequences replaced by their * @c ASCII equivalent. */ std::string decodeURL(const std::string & s); /** Split a string containing a hostname and port number into its respective parts. * * @param address A string in the form "hostname:port". * @param default_port A port number to return in the event that ":port" is omitted from @a address. * @return A pair containing the hostname and port number. */ std::pair splitServerAddress(const std::string & address, int default_port=1863); /** Compare two strings in a case insensitive fashion */ int nocase_cmp(const std::string & s1, const std::string & s2); /** Split @a string at each occurence of @a separator. */ std::vector splitString(const std::string & string, const std::string & separator, bool suppressBlanks=true); /** Convert a string, @a s, that contains decimal digits into an unsigned int. */ unsigned int decimalFromString(const std::string & s) throw (std::logic_error); } #endif centerim-4.22.10/libmsn/msn/errorcodes.h0000644000175000001440000000611111461606612015006 00000000000000#ifndef __msn_errorcodes_h__ #define __msn_errorcodes_h__ /* * errorcodes.h * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Copyright (c) 2004 Mark Rowe. All rights reserved. * * 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 #include #include /** \mainpage libmsn 3.2 Reference * * libmsn is a C++ library for Microsoft's MSN Messenger service. It * provides a high-level interface that allows an application to access instant * messaging features with ease. For more information, please visit the * libmsn homepage. * * It is recommended that you read the * library overview * before reading the reference documentation. The library overview will * familiarise you with the architecture and core data-types of libmsn, * and will make the reference documentation much more understandable. */ /** Contains all of the functionality provided by libmsn. */ namespace MSN { /** Error codes that the MSN servers may return in response to commands. */ typedef enum { ERR_SYNTAX_ERROR = 200, ERR_INVALID_PARAMETER, ERR_INVALID_USER = 205, ERR_FQDN_MISSING, ERR_ALREADY_LOGIN, ERR_INVALID_USERNAME, ERR_INVALID_FRIENDLY_NAME, ERR_LIST_FULL, ERR_ALREADY_THERE = 215, ERR_NOT_ON_LIST, ERR_ALREADY_IN_THE_MODE = 218, ERR_ALREADY_IN_OPPOSITE_LIST, ERR_SWITCHBOARD_FAILED = 280, ERR_NOTIFY_XFR_FAILED, ERR_REQUIRED_FIELDS_MISSING = 300, ERR_NOT_LOGGED_IN = 302, ERR_INTERNAL_SERVER = 500, ERR_DB_SERVER = 501, ERR_FILE_OPERATION = 510, ERR_MEMORY_ALLOC = 520, ERR_SERVER_BUSY = 600, ERR_SERVER_UNAVAILABLE, ERR_PEER_NS_DOWN, ERR_DB_CONNECT, ERR_SERVER_GOING_DOWN, ERR_CREATE_CONNECTION = 707, ERR_BLOCKING_WRITE = 711, ERR_SESSION_OVERLOAD, ERR_USER_TOO_ACTIVE, ERR_TOO_MANY_SESSIONS, ERR_NOT_EXPECTED, ERR_BAD_FRIEND_FILE = 717, ERR_AUTHENTICATION_FAILED = 911, ERR_NOT_ALLOWED_WHEN_OFFLINE = 913, ERR_NOT_ACCEPTING_NEW_USERS = 920 } ErrorCodes; } #endif centerim-4.22.10/libmsn/mkinstalldirs0000755000175000001440000000132311461606612014477 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1 2004/06/10 10:17:18 konst Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here centerim-4.22.10/misc/0000755000175000001440000000000011473011460011413 500000000000000centerim-4.22.10/misc/cimconv.10000644000175000001440000000105011461606612013055 00000000000000.TH cimconv 1 "August 19, 2003" .SH NAME \fBcimconv\fP .SH SYNOPSIS .B "cimconv " [ .B client ] ... .SH DESCRIPTION This manual page documents briefly the .B cimconv command. .PP \fBcimconv\fP is a tool for the centerim instant messaging client. It can be used to convert contact lists and history from other IM clients. So far the .B client parameter can be one of these: licq, kxicq2, gnomeicu, micq, trillian. .SH AUTHOR centerim as well as the cimconv tool were written by Konstantin Klyagin . .SH WEB http://www.centerim.org/ centerim-4.22.10/misc/cimformathistory0000755000175000001440000000140511473007750014673 00000000000000#!/bin/gawk -f # 2008-06-04 # initial script by Ilya Sukhanov # http://dotcommie.net/?id=155 # # 2010-07-31 # Documentation and formating by Boris Petersen # # Usage: cimformathistory history # where is the history file in ~/.centerim//history BEGIN \ { FS="\n"; RS="\f\n"; # change this to the nick of the buddy from="foo"; # change this to your nick to="bar"; } { if (match ($2,"MSG")) { if (match($1,"IN")) a=from; else a=to; # you can modify the format of the timestamp # here. please refer to `man 3 strftime` # this example will look like: # 2010/07/27 [16:31:36] printf("%s %s: %s", strftime("%Y/%m/%d [%H:%M:%S]", $4), a, $5); for (i=6; i<=NF;i++) printf("\t\t%s\n", $i); } } centerim-4.22.10/misc/Makefile.in0000644000175000001440000004051011473011437013404 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = misc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_with_curses.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc2.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/gpgme.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \ $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" SCRIPTS = $(bin_SCRIPTS) SOURCES = DIST_SOURCES = man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CXXFLAGS = @CURL_CXXFLAGS@ CURL_LIBS = @CURL_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ FRIBIDI_PC = @FRIBIDI_PC@ GENCAT = @GENCAT@ GLIBC2 = @GLIBC2@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_CXXFLAGS = @GNUTLS_CXXFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GPGME_CFLAGS = @GPGME_CFLAGS@ GPGME_CONFIG = @GPGME_CONFIG@ GPGME_CXXFLAGS = @GPGME_CXXFLAGS@ GPGME_LIBS = @GPGME_LIBS@ GREP = @GREP@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LDFLAGS = @LDFLAGS@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ NSS_CFLAGS = @NSS_CFLAGS@ NSS_LIBS = @NSS_LIBS@ OBJEXT = @OBJEXT@ ORDER_ONLY = @ORDER_ONLY@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = cimconv cimconv.1 git-version-gen CenterIMLog2HTML.py cimformathistory cimextracthistory.pl bin_SCRIPTS = cimconv CenterIMLog2HTML.py cimformathistory cimextracthistory.pl man_MANS = cimconv.1 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu misc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu misc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-binSCRIPTS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am uninstall-binSCRIPTS \ uninstall-man uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: centerim-4.22.10/misc/CenterIMLog2HTML.py0000755000175000001440000000754111473007750014605 00000000000000#!/usr/bin/env python #Copyright (C) 2008 Luar Roji #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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # #For full license view COPYRIGHT file or go to: #http://www.fsf.org/licensing/licenses/info/GPLv2.html from datetime import * import sys print "CenterIM Log2HTML - $Rev: 25$" print "Luar Roji - http://roji.net\n" def usage(): print "Usage: " + sys.argv[0] + " [logFileName] {outFileName}" print "" print " If outFileName is not specified, logFileName+.html is assumed." print "" sys.exit() def getLine(f): s = f.readline() s = s.rstrip('\n\r') return s def out(s): outfile.write(s + "\n") # print s def outtd(msg, field): data = msg[field] if (field=="timestamp1" or field=="timestamp2"): if (data!=""): floatData = float(data) dateTimeObj = datetime.fromtimestamp(floatData) data = dateTimeObj.strftime(DATEFORMAT) out(" "+data+"") msglist = [] x=0 DATEFORMAT = "%d/%b/%Y %H:%M:%S" now = datetime.now().strftime(DATEFORMAT) HTMLHEADER = "\n" + \ " \n" + \ " CenterIM Conversation\n" + \ " \n" + \ " \n" + \ " \n" + \ " \n" + \ " " HTMLFOOTER = "
\n" + \ " \n" + \ "\n" if len(sys.argv)<2: usage() infilename = sys.argv[1] if len(sys.argv)>2: outfilename = sys.argv[2] else: outfilename = infilename + ".html" print "Opening input file..", infile = open(infilename,"r") print "Ok" print "Opening output file..", outfile = open(outfilename,"w") print "Ok" print "Processing..." lineCount = 0 while infile: s = infile.readline() lineCount = lineCount+1 if (lineCount%500==0): print str(lineCount) + " lines readed" if (len(s)==0): break; if (s=="\x0c\n"): msg = {'direction' : getLine(infile), 'type' : getLine(infile), 'timestamp1' : getLine(infile), 'timestamp2' : getLine(infile), 'message' : getLine(infile)} msglist.append(msg) print "File reading done. " + str(lineCount) +" lines readed." print "Generating HTML output..", out(HTMLHEADER) for msg in msglist: if (msg["type"]!="MSG"): continue x=x+1 if (x%2==0): trClass = "par" else: trClass = "impar" out(" ") outtd(msg,"timestamp1") # outtd(msg,"timestamp2") -- Don't understand the difference between those outtd(msg,"direction") # outtd(msg,"type") -- Redundant with the above if outtd(msg,"message") out(" ") out(HTMLFOOTER) print "Done." infile.close() outfile.close() centerim-4.22.10/misc/Makefile.am0000644000175000001440000000031611473007750013376 00000000000000EXTRA_DIST = cimconv cimconv.1 git-version-gen CenterIMLog2HTML.py cimformathistory cimextracthistory.pl bin_SCRIPTS = cimconv CenterIMLog2HTML.py cimformathistory cimextracthistory.pl man_MANS = cimconv.1 centerim-4.22.10/misc/git-version-gen0000755000175000001440000001303711473007750014311 00000000000000#!/bin/sh # Print a version string. scriptversion=2010-02-24.17; # UTC # Copyright (C) 2007-2010 Free Software Foundation, Inc. # # 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 3 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, see . # This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/. # It may be run two ways: # - from a git repository in which the "git describe" command below # produces useful output (thus requiring at least one signed tag) # - from a non-git-repo directory containing a .tarball-version file, which # presumes this script is invoked like "./git-version-gen .tarball-version". # In order to use intra-version strings in your project, you will need two # separate generated version string files: # # .tarball-version - present only in a distribution tarball, and not in # a checked-out repository. Created with contents that were learned at # the last time autoconf was run, and used by git-version-gen. Must not # be present in either $(srcdir) or $(builddir) for git-version-gen to # give accurate answers during normal development with a checked out tree, # but must be present in a tarball when there is no version control system. # Therefore, it cannot be used in any dependencies. GNUmakefile has # hooks to force a reconfigure at distribution time to get the value # correct, without penalizing normal development with extra reconfigures. # # .version - present in a checked-out repository and in a distribution # tarball. Usable in dependencies, particularly for files that don't # want to depend on config.h but do want to track version changes. # Delete this file prior to any autoconf run where you want to rebuild # files to pick up a version string change; and leave it stale to # minimize rebuild time after unrelated changes to configure sources. # # It is probably wise to add these two files to .gitignore, so that you # don't accidentally commit either generated file. # # Use the following line in your configure.ac, so that $(VERSION) will # automatically be up-to-date each time configure is run (and note that # since configure.ac no longer includes a version string, Makefile rules # should not depend on configure.ac for version updates). # # AC_INIT([GNU project], # m4_esyscmd([build-aux/git-version-gen .tarball-version]), # [bug-project@example]) # # Then use the following lines in your Makefile.am, so that .version # will be present for dependencies, and so that .tarball-version will # exist in distribution tarballs. # # BUILT_SOURCES = $(top_srcdir)/.version # $(top_srcdir)/.version: # echo $(VERSION) > $@-t && mv $@-t $@ # dist-hook: # echo $(VERSION) > $(distdir)/.tarball-version case $# in 1) ;; *) echo 1>&2 "Usage: $0 \$srcdir/.tarball-version"; exit 1;; esac tarball_version_file=$1 nl=' ' # First see if there is a tarball-only version file. # then try "git describe", then default. if test -f $tarball_version_file then v=`cat $tarball_version_file` || exit 1 case $v in *$nl*) v= ;; # reject multi-line output [0-9]*) ;; *) v= ;; esac test -z "$v" \ && echo "$0: WARNING: $tarball_version_file seems to be damaged" 1>&2 fi if test -n "$v" then : # use $v elif test -d .git \ && v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \ || git describe --abbrev=4 HEAD 2>/dev/null` \ && case $v in v[0-9]*) ;; *) (exit 1) ;; esac then # Is this a new git that lists number of commits since the last # tag or the previous older version that did not? # Newer: v6.10-77-g0f8faeb # Older: v6.10-g0f8faeb case $v in *-*-*) : git describe is okay three part flavor ;; *-*) : git describe is older two part flavor # Recreate the number of commits and rewrite such that the # result is the same as if we were using the newer version # of git describe. vtag=`echo "$v" | sed 's/-.*//'` numcommits=`git rev-list "$vtag"..HEAD | wc -l` v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`; ;; esac # Change the first '-' to a '.', so version-comparing tools work properly. # Remove the "g" in git describe's output string, to save a byte. v=`echo "$v" | sed 's/-/./;s/-\(.*\)//'`; else v=UNKNOWN fi v=`echo "$v" |sed 's/^v//'` # Don't declare a version "dirty" merely because a time stamp has changed. git update-index --refresh > /dev/null 2>&1 # Run update-index. In some cases, on some filesystems the index is not clean # and even a stat change can result in a dirty version git update-index -q --refresh dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty= case "$dirty" in '') ;; *) # Append the suffix only if there isn't one already. case $v in *-dirty) ;; *) v="$v-dirty" ;; esac ;; esac # Omit the trailing newline, so that m4_esyscmd can use the result directly. echo "$v" | tr -d '\012' # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: centerim-4.22.10/misc/cimconv0000755000175000001440000001526711461606612012740 00000000000000#!/usr/bin/env perl # # Contact list, history and other stuff conversion script from # various flavours of icq client software to centerim format. # # by Konstantin Klyagin # trillian support by Vassilios Karakoidas # # $Id: cimconv,v 1.9 2003/09/26 07:13:21 konst Exp $ # use Time::Local; my $ourUIN = 0; # # cicq_adduser # # Adds a user to contact list. # One arguments: user's UIN. # sub cicq_adduser { local ($uin) = @_; system("mkdir -p $ENV{HOME}/.centerim/$uin"); } # # cicq_addhistoryitem # # Adds a message to a user's events history. # Requires the following parameters to be passed: # # to_UIN # Uin of the receiver. # from_UIN # Sender's uin. # timestamp # UNIX timestamp (seconds since 1980). # text # Message text. # sub cicq_addhistoryitem { local ($touin, $fromuin, $timestamp, $text) = @_; if($ourUIN) { $histuin = ($touin == $ourUIN) ? $fromuin : $touin; if(open(UF, ">>$ENV{HOME}/.centerim/$histuin/history")) { print UF "\f\n"; print UF ($touin == $ourUIN) ? "IN" : "OUT", "\nMSG\n"; print UF "$timestamp\n$timestamp\n"; print UF "$text\n\n"; close UF; } if(open(UF, ">$ENV{HOME}/.centerim/$histuin/lastread")) { print UF "$timestamp\n"; close UF; } } } # # LICQ specific functions # sub licq_conv_history { local ($uin) = @_; local $uto = 0; local $ufrom = 0; local $utimestamp = 0; local $text = ""; if(open(HF, "<$ENV{HOME}/.licq/history/$uin.history")) { while() { chomp; $buf = $_; if($buf =~ m/\[ (.?) .+ ([0-9]+) \]$/) { if($text ne "") { cicq_addhistoryitem($uto, $ufrom, $timestamp, $text); $text = ""; } $timestamp = $2; if($1 eq "R") { $ufrom = $uin; $uto = $ourUIN; } elsif($1 eq "S") { $ufrom = $ourUIN; $uto = $uin; } } else { $buf = substr($buf, 1) if substr($buf, 0, 1) eq ":"; $text .= $buf; } } cicq_addhistoryitem($uto, $ufrom, $timestamp, $text) if $text ne ""; close HF; } } sub licq { if(open(F, "<$ENV{HOME}/.licq/owner.uin")) { while() { chomp; $buf = $_; if($buf =~ m/^Uin = ([0-9]+)$/) { $ourUIN = $1; last; } } close F; } open(F, "<$ENV{HOME}/.licq/users.conf") or die "cannot find licq users file $ENV{HOME}/.licq/users.conf"; while() { chomp; $buf = $_; if($buf =~ m/^User[0-9]+ = ([0-9]+)$/) { cicq_adduser($1); licq_conv_history($1); } } close F; } # # micq specific functions # sub micq { $contsection = 0; $fname = "$ENV{HOME}/.micq/micqrc"; open(F, "<$fname") or die "cannot find micq config file $fname"; while() { chomp; s/#.*//; s/^\s+//; next unless length; $buf = $_; if($contsection) { if($buf =~ m/^([0-9]+)\s.+$/) { cicq_adduser($1); } } else { $contsection = $buf =~ m/^\[Contacts\]$/; } } close F; } # # GnomeICU specific functions # sub gnomeicu { $contsection = 0; $fname = "$ENV{HOME}/.gnome/GnomeICU"; open(F, "<$fname") or die "cannot find GnomeICU config file $fname"; while() { chomp; $buf = $_; if($contsection) { if($buf =~ m/^([0-9]+)=.+$/) { cicq_adduser($1); } } else { $contsection = $buf =~ m/^\[NewContacts\]$/; } } close F; } # # KXicq2 specific functions # sub kxicq2 { if(open(F, "<$ENV{HOME}/.kde/share/config/kxicq2rc")) { while() { chomp; $buf = $_; if($buf =~ m/^UIN=([0-9]+)$/) { $ourUIN = $1; last; } } close F; } $fname = "$ENV{HOME}/.kde/share/apps/kxicq2/contacts.kxicq"; open(F, "<$fname") or die "cannot find kxicq2 contacts file $fname"; while() { chomp; $buf = $_; if($buf =~ m/^UIN=([0-9]+)$/) { cicq_adduser($1); } } close F; # # Now convert messages history # $fname = "$ENV{HOME}/.kde/share/apps/kxicq2/messages.kxicq2"; local $uto = 0; local $ufrom = 0; local $utimestamp = 0; local $text = ""; local $msgmode = "R"; if(open(F, "<$fname")) { while() { chomp; $buf = $_; if($buf =~ m/^\[Message [0-9]+\]$/) { cicq_addhistoryitem($uto, $ufrom, $timestamp, $text) if $text ne ""; $text = ""; } elsif($buf =~ m/Options=[0-9]+ [0-9]+ ([0-9]+) [0-9]+$/) { $msgmode = $1 ? "S" : "R"; } elsif($buf =~ m/Uin=([0-9]+)$/) { if($msgmode eq "R") { $ufrom = $1; $uto = $ourUIN; } else { $ufrom = $ourUIN; $uto = $1; } } elsif($buf =~ m/DateTime=([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+)$/) { $timestamp = timelocal(0, $5, $4, $1, $2, $3); } elsif($buf =~ m/Message=(.+)$/) { $text = $1; $text =~ s/\\r//g; $text =~ s/\\n/\n/g; } } cicq_addhistoryitem($uto, $ufrom, $timestamp, $text) if $text ne ""; close F; } } # Trillian specific functions sub create_account_irc { local $OUTPUT_DIR = "$ENV{HOME}/.centerim/"; local $buddy_dir = $OUTPUT_DIR."i".$_[0]; mkdir($buddy_dir); } sub create_account_msn { local $OUTPUT_DIR = "$ENV{HOME}/.centerim/"; local @buddy_mail = split("@",$_[0]); local $buddy_dir = $OUTPUT_DIR."m".$buddy_mail[0]; mkdir($buddy_dir); open(INFO_FP,">".$buddy_dir."/info"); print INFO_FP $buddy_mail[0]."\n\n\n".$_[0]."\n"; close(INFO_FP); } sub trillian { open(TRILLIAN_XML,"Buddies.xml") or die "Can not open Buddies.xml"; @lines = ; close(TRILLIAN_XML); foreach(@lines){ if($_ =~ /\(.*)\<\/buddy\>/) { @buddy_icq_array = split("%3A",$1); cicq_adduser($buddy_icq_array[0]); } elsif($_ =~ /\(.*)\<\/buddy\>/) { @buddy_msn_array = split("%3A",$1); $buddy_msn_array[0] =~ s/%([0-9A-Za-z]{2})/pack("H2",$1)/ge; create_account_msn($buddy_msn_array[0]); } elsif($_ =~ /\(.*)\<\/buddy\>/) { $buddy_irc = $2; $buddy_irc =~ s/%([0-9A-Za-z]{2})/pack("H2",$1)/ge; create_account_irc($buddy_irc); } } } sub usage { print < Where is the name of program you can to convert from. Can be: licq, kxicq2, gnomeicu, micq, trillian. EOF } my $flavour = $ARGV[0]; if($flavour eq "licq") { print "Converting from $flavour.. "; licq; print "done.\n"; } elsif($flavour eq "kxicq2") { print "Converting from $flavour.. "; kxicq2; print "done.\n"; } elsif($flavour eq "gnomeicu") { print "Converting from $flavour.. "; gnomeicu; print "done.\n"; } elsif($flavour eq "micq") { print "Converting from $flavour.. "; micq; print "done.\n"; } elsif($flavour eq "trillian") { print "Converting from $flavour.. "; trillian; print "done.\n"; } else { usage; } centerim-4.22.10/misc/cimextracthistory.pl0000755000175000001440000001031211473007750015464 00000000000000#!/usr/bin/perl use warnings; use strict; use Getopt::Std; use File::Spec::Functions; use Time::ParseDate; use POSIX; use Data::Dumper; # Default values my %defaults = ( format => '%Y/%m/%d [%H:%M:%S]', basedir => catfile($ENV{HOME}, '.centerim'), ); # Helper functions sub usage { # print error message if one is provided print STDERR $_[0] . "\n" if $_[0]; print STDERR <<"EOT"; Usage: $0 [options] Options: \t-u User name to print history from. This must be an account \t name under the CenterIM basedir. This parameter is required. \t * ICQ: 123456789 \t * MSN: mmsnuser \t * Jab: jjabberuser \t * Yah: yyahoouser \t * ... \t-s Timestamp to start from. This parameter is required. \t You can use timestamps or strings like '3 hours ago'. \t-e Timestamp to end with. This parameter is required. \t Format: see -f. \t-f Format to print timestamps in. Must be a strftime compatible \t string. This parameter is optional. \t-b CenterIM basedir to use. This parameter is optional. \t Defaults to $defaults{basedir}. \t-h This help message. Example: \t$0 -u mfriendofmine -s "yesterday" -e "2 hours ago" EOT exit; } my %options; sub init { # get command line parameters and display usage if neccessary my %params; usage("Unrecognized parameter found.") unless getopt('u:s:e:f:b:h', \%params); usage() if $params{h}; # put param$ters in %options hash and display usage if necessary # required parameters if ($params{u}) { $options{username} = $params{u} } else { usage("Required parameter -u not found.") }; if ($params{s}) { $options{start} = $params{s} } else { usage("Required parameter -s not found.") }; if ($params{e}) { $options{end} = $params{e} } else { usage("Required parameter -e not found.") }; # optional parameters $options{format} = $params{f} ? $params{f} : $defaults{format}; $options{basedir} = $params{b} ? $params{b} : $defaults{basedir}; $options{userdir} = catfile($options{basedir}, $options{username}); # sanity checking of parameters $options{start} = parsedate($options{start}) || usage("Illegal date format for parameter -s."); $options{end} = parsedate($options{end}) || usage("Illegal date format for parameter -e."); ($options{start}, $options{end}) = ($options{end}, $options{start}) if $options{start} > $options{end}; -d $options{basedir} || usage("Basedir '" . $options{basedir} . "' is not a directory."); -d $options{userdir} || usage("User dir '" . $options{userdir} . "' is not a directory."); } sub extract_history { my $histfile = catfile($options{userdir}, "history"); my $histarray; open my $HISTORY, '<', $histfile; { local $/ = "\f\n"; while (my $msg_struct = <$HISTORY>) { my ($msg_dir, $ts_sent, $ts_rcvd, $msg_text) = $msg_struct =~ m{ ^(IN|OUT)$ \n # direction of message ^MSG$ \n # message marker ^(\d+)$ \n # timestamp of sending ^(\d+)$ \n # timestamp of arriving ^(.*) # message content }xmso; next if !defined $msg_dir; # no match, not a message next if $ts_sent < $options{start}; last if $ts_sent > $options{end}; # UNIXize newlines and remove end-of-record marker $msg_text =~ s/\r\n/\n/go; $msg_text =~ s/(?:\f|\n)+$//go; push @$histarray, { direction => $msg_dir, ts_sent => $ts_sent, ts_arrived => $ts_rcvd, message => $msg_text }; } } return $histarray; } sub prettyprint_history { my ($history) = @_; for my $hist_item (@$history) { my $timestamp = strftime $options{format}, localtime $hist_item->{ts_sent}; $timestamp .= " {rcv @ " . stftime($options{format}, localtime $hist_item->{ts_arrived}) . " }" if ($hist_item->{ts_sent} != $hist_item->{ts_arrived}); my $direction = ($hist_item->{direction} eq 'IN') ? '<<<' : '>>>'; my $message = $hist_item->{message}; # properly indent multiple lines my $indent = ' ' x (length($timestamp) + 1 + length($direction) + 1); $message =~ s/\n/\n$indent/g; print "$timestamp $direction $message\n"; } } # Main program init(); my $history = extract_history(); prettyprint_history($history);